Nsswitch.conf

Nsswitch.conf es un fichero que podemos encontrar a partir de la versión 2 de funciones de GNU y nos sirve para configurar diferentes bases de datos y en que orden se van a leer.

Para ceñirnos al tema que nos interesa, que es el de DNS, hablaremos de sólo una parte de las bases de datos como son la de hosts y la de networks

nsswitch

Como se puede observar primero se declara la base de datos correspondiente, hosts es la que se encarga de la resolución de nombres de hosts y networks es la que se usa para resolver nombres de redes en direcciones de redes.

server-ldap server-ldap2

Tras la base de datos se especifican una serie de opciones, las más habituales son:

  • Dns: el cual indica que se va a usar el servicio DNS para resolver la dirección de los nodos ( no de las redes, para ello se encarga /etc/resolv.conf)
  • Files: realiza la búsqueda en un fichero local. /etc/hosts si es un nodo o /etc/network si se trata de una red
  • NisNis+: usa el sistema de información en red (NIS) para resolver los nodos o redes.

El orden en el que se escriben estas opciones es el orden en el que luego van a ser leídos por el sistema a la hora de resolver un nombre.

Viendo de nuevo el ejemplo de arriba podemos ver que el sistema primero va a buscar los nodos en /etc/hosts y luego en DNS si no se encuentra.

Podemos ser más precisos añadiendo una serie de acciones a llevar a cabo tras el último intento de búsqueda. Estas acciones van encerradas entre corchetes con la sintaxis [ [!] estado = accion … ] y son 2:

  • return: hace que el control vuelva al programa que hizo la petición, devolviendo la información si tuvo éxito o 0 si no lo tuvo.
  • continue: El sistema sigue buscando usando el siguiente servicio de la lista.

La ! nos indica de que el valor de estado debe considerarse como not.

Los valores de estado posibles son:

success: La petición se encontró sin errores. La acción por defecto es return.

notfound: No hubo error en la búsqueda pero no se encuentra el nodo o red. Suele ir con la acción continue

unavail: El servicio no está disponible, porque no responde o el archivo no está en la ruta que debe. Suele ir con la acción continue

tryagain: El servicio no estaba disponible temporalmente. Acción predeterminada continue.

cliente-ldap

En este ejemplo primero buscará en el archivo /etc/hosts, luego utilizará mdns4_minimal que es una opción para DNS multicast. En caso de que sea un DNS multicast y no lo encuentre en mdns4_minimal devolverá un ‘Host not found’ o ‘Host no encontrado’.

Si no lo encuentra en /etc/hosts y no es un dns multicast, el siguiente lugar donde lo buscará es en el DNS configurado, y por último utilizará otro servicio para dominios multicast.

 

Fuentes: Linux Network Administrator’s Guide

Sentencias alternativas y ciclos en PHP

Alternativa simple y doble

La alternativa simple o if, nos realiza una comprobación de una condición y si se cumple realiza una sentencia, y si no se cumple la condición, el programa sigue su ejecución:

<?php
  error_reporting(0);
  echo "<form method='post'>
  Dame un número: $numero
   <input id='numero' name='numero' value=''/>
   <input type='submit' name='Enviar' value='Enviar'/>
 </form>";

  $numero = $_POST['numero']; //declaración de variable y recogida de datos
  if ($numero == 4) //si se cumple la condición nos imprimirá un mensaje por pantalla
  {
   echo "El numero es 4";
  }
?>

En este ejemplo podemos ver como el programa nos pide un número, comprueba el número introducido por el usuario y si es 4, nos avisa por pantalla, en caso contrario sigue adelante.

La alternativa doble o if…else… divide nuestro programa en dos caminos, en caso de que se produzca la condición del if, ejecutará una sentencia, en caso contrario ejecutara otra.

 

<?php
 error_reporting(0);
 echo "<form method='post'>
 Dame un número: $numero
  <input id='numero' name='numero' value=''/>
  <input type='submit' name='Enviar' value='Enviar'/>
 </form>";

 $numero = $_POST['numero']; //declaración de variable y recogida de datos
 if ($numero == 4) //si se cumple la condición nos imprimirá por pantalla un mensaje
 {
  echo "El numero es 4";
 }
 else  //en caso contrario nos imprimirá otro
 {
  echo "El numero dado no es 4";
 }
?>

En este ejemplo, nos vuelve a comprobar si el número introducido por el usuario es el 4, en ese caso, nos lo hace saber por pantalla. En caso contrario, nos hará saber que no lo es, al cumplirse la otra condición.

 

Alternativa múltiple

En el caso de alternativa múltiple estamos hablando del if…elseif…, el cual comprobará si se producen una serie de condiciones y ejecutará la sentencia de aquella que se cumpla. En caso de que ninguna condición se cumpla, se ejecutará la condición de por defecto, si la condición por defecto no ejecuta ninguna sentencia, no hace falta escribirla.

<?php
 error_reporting(0);
 echo "<form method='post'>
 Dame un número: $numero
  <input id='numero' name='numero' value=''/>
  <input type='submit' name='Enviar' value='Enviar'/>
 </form>";

 $numero = $_POST['numero'];     //declaración de variable y recogida de datos
 if ($numero == 1)   //Comprobación de cada uno de las distintas condiciones a cumplir
 {
  echo "El numero es 1";
 }
 elseif ($numero == 2)
 {
  echo "El numero es 2";
 }
 elseif ($numero == 3)
 {
  echo "El numero es 3";
 }
 elseif ($numero == 4)
 {
  echo "El numero es 4";
 }
?>

En este ejemplo, comprueba el número dado y según sea nos mostrará por pantalla un resultado u otro. Asimismo, este ejemplo se puede realizar con switch y case:

<?php
 error_reporting(0);
 echo "<form method='post'>
 Dame un número: $numero
  <input id='numero' name='numero' value=''/>
  <input type='submit' name='Enviar' value='Enviar'/>
 </form>";

 $numero = $_POST['numero'];    //declaración de variable y recogida de datos
 switch ($numero) {  //comprobación de la opción que se cumple.
  case '1':
   echo "El valor dado es 1";
  break;

  case '2':
   echo "El valor dado es 2";
  break;

  case '3':
   echo "El valor dado es 3";
  break;

  case '4':
   echo "El valor dado es 1";
  break;
  default:
  break;
 }
?>

Ciclo Precondición

Pasamos ahora a hablar de la sentencia while… la cual nos comprobará una condición, si se cumple y mientras se cumpla dicha condición nos ejecutará una parte del programa

<?php
 $numero = 0; //inicializa variable a 0
 while ($numero <10){ //mientras se cumpla condición de ser menor a 10 se repite
  echo "$numero, ";
  $numero ++; //incrementa la variable
 }
?>

Ciclo For

El ciclo For nos va a realizar de forma reiterada una serie de sentencias mientras se cumple una condición. La diferencia con el ciclo while, es que en la propia instrucción, junto con la condición, hay que declarar una variable, la cual se va a incrementar/decrementar de forma automática.

<?php

 for($numero=0; $numero<=10; $numero++){ //Se declara variable, se introduce condición y se incrementa la variable
  echo "$numero, ";
 }
?>

En este caso, nos imprimirá por pantalla la variable $numero mientras su valor inicial de 0, no sea mayor que 10.

El programa comprobará la condición cada vez que termine de ejecutar la iteración, en caso de que ya no se cumpla, el programa seguirá ejecutándose normalmente.

 

Ciclo Postcondición

El ciclo do…while es muy similar a la de while… excepto que la condición y por lo tanto la verificación viene al final. Esto nos asegura que como mínimo el ciclo se ejecutará una vez, en comparación con el ciclo while.

<?php
 $numero = 0; //se declara la variable
 do{
  echo "$numero, ";
  $numero ++; //se incrementa la variable
 }while($numero<=10); //La condición a cumplir
?>

En este ejemplo, como en el anterior, nos imprimirá por pantalla el valor de la variable $numero, hasta que éste sea 10. La diferencia es que le estamos diciendo que primeramente la ejecute obligatoriamente aunque no se cumpla la condición, tras lo cual verificará si es necesario que se vuelva a repetir el ciclo o no.

Ciclo Iterar

En este caso, se trate de un ciclo normal como los explicados anteriormente, pero tiene una condición en su interior que si se cumple, se rompe el ciclo para continuar con el resto del programa.

<?php
 $total=65536; //Se declara la variable total
 $i=1; //se declara la variable que va a hacer de contador. (opcional)
 $limite=4; //Una variable que nos limitará el número de veces que se va a repetir el ciclo
 while (true) { //condición a cumplir
  $raiz=sqrt($total);
  echo "La raiz cuadrada de $total es $raiz.<BR>";
  $total=$raiz; //Se actualiza el valor de la variable
  $i++; //se incrementa el contador
   if ($i>$limite) //condición para romper el ciclo
   break;
 }
 $bucle=$i-1; //Numero de veces que se repite el ciclo.
 echo "Este bucle se ha repetido $bucle veces.";
?>

Contadores y Acumuladores

Los contadores o acumuladores son una serie de sentencias usadas precisamente para lo que su nombre indica: contar o acumular.

Para ello se usa de una variable, la cual suele ir introducida dentro de un bucle o ciclo y mientras se ejecuta dicho ciclo, va a ir almacenando información de forma actualizada, es decir, va a ir reemplazando su antiguo valor por uno nuevo cada vez que se realiza la iteración.

<?php
 $n = 1; //se declara variable
 for($numero=1; $numero<=5; $numero++) //Se declara la variable i, se da la condición para el ciclo y se incrementa la variable
 {
  $n= $n * $numero; //Se actualiza el valor de la variable
 }
 echo "El factorial de 5 es: $n";
?>

Este es un claro ejemplo, donde calculamos el factorial de 5. Se declara la variable que va a hacer de acumulador. Se pone el ciclo con la condición y dentro del mismo se declara que el valor del acumulador se vaya actualizando cada vez que se ejecuta el ciclo.

Otro ejemplo muy sencillo de contador en este caso:

<?php
 $n = 0; //se declara la variable
 for($producto=1; $producto<=5; $producto++) //Declaración de variable, condición e incremento de la variable
 {
  echo "Se ha introducido un nuevo producto <br/>";
  $n++; //incremento del contador
 }
 echo "Hay $n productos";
?>

En este caso nos va ir introduciendo el programa nuevos productos y cada vez que lo hace se incrementa la variable que hace de contador, una vez terminado el ciclo, nos imprimirá cuantas veces se ha actualizado el valor de dicha variable.

Autentificación en Kerberos

Kerberos es un protocolo de autenticación que permite a dos ordenadores en una red insegura demostrar su identidad mutuamente de manera segura.

Usa clave simétrica y requiere un tercero de confianza, denominado «centro de distribución de claves» (KDC), y que consta de dos partes: un «servidor de autenticación» (AS) y un «servidor emisor de tickets» (TGS).

Kerberos tiene una base de datos de claves secretas; cada entidad en la red —cliente o servidor— comparte una clave secreta conocida únicamente por él y Kerberos. El conocimiento de esta clave sirve para probar la identidad de la entidad. Para una comunicación entre dos entidades, Kerberos genera una clave de sesión, la cual pueden usar para asegurar sus problemas.

Es multiplataforma.

Para llevar a cabo su instalación en Linux, primero hay que tener configurado un servidor DNS y tener instalado NTP, para sincronizar el servidor con los clientes.

Para instalar NTP:

1

Tras lo cual editamos el fichero ntp.conf:

2

Una vez hecho esto, nos vamos al cliente, instalamos ntpdate y editamos su archivo de configuración:

3

Ahora, vamos a sincronizar con el cliente:

4

Para no tener que llevar a cabo una sincronización de forma constante, vamos a escribir un script para que se automitice el proceso cada hora. Para ello creamos un archivo en cron.hourly:

5

Con esto ya hemos acabado con los requisitos previos. Ahora instalamos kerberos con apt-get install krb5-kdc krb5-admin-server, y nos vamos al archivo de configuración krb5.conf para introducir nuestro dominio:

6

Luego, escribimos krb5_newrealm:

7

Una inicializado un nuevo reino, nos conectamos a la base de datos mediante el comando kadmin.local para añadir usuarios a la misma:

8

A continuación, editamos kadm5.acl para que todos los usuarios que sean admin se puedan conectar a la base de datos y creamos un usuario que tenga permisos de admin:

9

10

 

Reiniciamos el servicio con /init.d/krb5-admin-server restart o service krb5-admin-server restart y nos vamos al cliente de nuevo.

En él, vamos a instalar las utilidades de cliente:

apt-get install krb5-user

11

 

12

 

Editamos su fichero de configuración:

13

Y por último pedimos un ticket, el cual tiene una duración aprox de 10h.

14

Una vez hecho todos estos pasos, vamos a comprobar la autenticación en kerberos, para ello nos vamos al cliente y creamos un usuario con adduser llamado kerberos:

15

Una vez creado en el cliente, lo creamos en el servidor kerberos:

16

Para comprobar que la autenticación funciona, a la hora de crearlo en el servidor, lo hemos hecho con una contraseña distinta a la del cliente.

Ahora instalamos el paquete libpam-krb5, el cual autoconfigura PAM para que autentique por kerberos:

17

Por último, para autenticarnos hacemos un su kerberos, usando la contraseña introducida en el servidor, si nos deja autenticarnos, significa que está usando kerberos, ya que se está usando una contraseña que no se encuentra en el cliente.

Como podemos ver en log mediante un tail /var/log/auth.log, se produce el proceso de autenticación18

 

Para terminar, vemos como nos deja iniciar sesión con el usuario Kerberos, introduciendo la contraseña del servidor (distinta de la del cliente):

19

 

 

 

Fuentes: Wikipedia

Modelo Entidad-Relación

¿Qué es un modelo entidad-interrelación?

Consiste en un modelo de datos propuesto por Peter Chen y basado en una abstracción del mundo real donde se representan problemas a través de entidades, sus atributos y las relaciones entre ellos en el nivel conceptual del diseño de la base de datos.

Para esta representación se usan los diagramas de Chen.

Elementos fundamentales:

  • Entidad:

Una entidad es un objeto que existe y se distingue de otros objetos de acuerdo a sus características llamadas Atributos. Representa una “cosa” u «objeto» del mundo real con existencia independiente, es decir, se diferencia inequívocamente de cualquier otro objeto o cosa, incluso siendo del mismo tipo, o una misma entidad.

entidad

Podemos diferenciar dos tipos de entidades:

  • Fuertes: aquellas que existen por si mismas y no dependen de la existencia de otra entidad.
  • Débiles: son aquellas entidades cuya existencia depende de la existencia de otra entidad. Las débiles a su vez se pueden dividir en 2 tipos:
    • De existencia: La entidad débil no puede existir sin la fuerte de la que depende.
    • De identificación: Cuando además de por existencia, la entidad débil no es capaz de identificarse por si misma y depende del identificador de la entidad fuerte.
    • Las relaciones débiles de existencia e identificación se representan de la siguiente forma:

fuertedebil

 

Ejemplos:

  • Se desea almacenar información sobre empresas y sucursales de empresas. Una empresa puede tener varias sucursales repartidas geográficamente. Una sucursal determinada debe pertenecer a una y solo una empresa. Las sucursales se numeran correlativamente para cada empresa.
  • Se desea almacenar información sobre personas y sus viviendas en propiedad. Supondremos que una vivienda tan solo puede pertenecer a una persona y que no toda persona debe ser obligatoriamente propietaria de al menos una vivienda.

 

  • Atributos:

Todos los atributos tienen un dominio que representa los tipos de valores y restricciones que admiten dichos atributos.Hay uno atributo o conjunto de atributos que tiene la función de identificar de forma única cada entidad y que se denominan clave primaria (PK). Si existen más de un identificador dentro de la entidad, a estos se les conoce como clave candidata. Los atributos y las claves primarias se suelen representar de la siguiente manera:

atributo

  • Cuando no recibe un valor determinado, el atributo recibe el valor nulo, porque no se conoce o no existe.
  • Propiedades o características que conforman cada entidad. Cada entidad de diferencia de otras por el valor de sus atributos.
  • La clave foránea o FK es la clave primaria de otra entidad que se puede heredar mediante una relación existente.

 

 

  • Relación:

Representa una asociación entre varias entidades. Cada entidad interviene en una relación con una determinada cardinalidad.

relacion

  • Cardinalidades:

Es el número de entidades con las que otra entidad puede asociar mediante una relación, considerando una relacción binaria entre el juego de entidades A y B, las cardinalidades pueden ser:

  • Uno a Uno (1:1): Una entidad en A se relaciona con una sola entidad B y la entidad B sólo se relaciona con dicha entidad de A. Ejemplo: nación y capital.1
  • Uno a Varios (1:N): Un registro en una entidad en A se relaciona con cero o muchos registros en una entidad B. Pero los registros de B solamente se relacionan con un registro en A. Ejemplo: cliente y pedidos.

4

  • Varios a Uno (N:1): Una entidad en A se relaciona exclusivamente con una entidad en B. Pero una entidad en B se puede relacionar con 0 o muchas entidades en A.

2

  • Varios a Varios (N:M): Una entidad en A se puede relacionar con 0 o con muchas entidades en B y viceversa. Ejemplo: personas y viviendas.

3

  • Restricciones especiales:
    • Relación reflexiva o recursiva. Relaciona una entidad consigo misma. Ejemplo: persona que se encuentra casado con otra persona.reflex
    • Dos relaciones entre las mismas dos entidades. Muy útil en el caso de necesitar almacenar información histórica completa. Ejemplo: proyectos en los que trabaja actualmente un empleado y proyectos en los que ha trabajado anteriormente.
    • Relación ternaria. Asociación de tres entidades.
    • Relación de especialización: Se produce cuando hay una relación jerárquica y una entidad se tipifica en subtipos. Puede clasificarse de dos formas.
      • Inclusiva o solapada: Si un elemento de la entidad puede ser de más de un subtipo a la vez.
      • Exclusiva: Si la entidad sólo puede relacionarse con un subtipo.

La segunda clasificación se base en la obligatoriedad de que cada elemento deba pertenecer a un subtipo o pueden existir elementos que no pertenezcan a ningún subtipo:

Total: Si cada elemento pertenece a un subtipo.

Parcial: Cuando puede no pertenecer a ninguno de los subtipos.

Tipos de jerarquia

  • Ejemplo: Una empresa desea almacenar información sobre sus clientes y los pedidos que éstos realizan. Un pedido consta de un número variable de artículos deseados en una determinada cantidad. La empresa guarda un determinado número de unidades de cada artículo en su almacén. Puede ser que la cantidad realmente servida de un artículo en un pedido sea inferior a la cantidad pedida si no hay suficiente stock. Los pedidos pueden ser urgentes, en cuyo caso se especifica además un número máximo de días que el cliente está dispuesto a esperar el servicio del pedido.

 

TRABAJO REALIZADO POR: Fernando Velázquez Gómez, Mario Navarro Madrid, Manuel Monzón Pérez, Moisés Pedrajas Olmo, Lucas Márquez Muñoz