Fichero nsswitch.conf; qué es y para qué sirve

Publicado el 12 abril 2016 por Drassill
En el día de hoy os vengo a hablar de un fichero bastante poco conocido por el usuario "medio"; un fichero que, aunque no es un fichero indispensable, realiza tareas bastante relevantes que podemos querer analizar y/o modificar. Dicho fichero se llama nsswitch.conf, un fichero almacenado en /etc que generalmente pasa desapercibido pero que puede sernos útil, ya sea para conocer su función o para modificarlo a nuestro antojo. Dicho fichero, llamado también Name Service Switch configuration file, tiene como objetivo especificar de donde obtienen la información ciertos valores especiales, también llamados categorías, relacionados con GNU C Library, y en caso de obtener la información de varios orígenes, en qué orden consultar éstos con el fin de saber qué fuente tiene más prioridad. Estas categorías son referenciadas con un nombre único que ya está previamente establecido en el sistema, con lo que no es necesario crear ningún tipo de categoría "extra".

Esto puede parecer un poco lioso, pero el concepto es mucho más simple de lo que parece... Lo mejor para entender adecuadamente este fichero, y los conceptos relacionadas con éste, es observar el contenido de este; he aquí un fichero de ejemplo que puede servir como una buena referencia:
  1. passwd:         compat
  2. group:          compat
  3. shadow:         compat
  4. gshadow:        files
  5. hosts:          files mdns4_minimal [NOTFOUND=return] dns
  6. networks:       files
  7. protocols:      db files
  8. services:       db files
  9. ethers:         db files
  10. rpc:            db files
  11. netgroup:       nis

Probablemente os hayáis quedado igual que antes; pero en seguida veréis que el fichero está perfectamente estructurado, pues tiene la siguiente composición:
  • Columna 1: El nombre de la categoría a la que se quiere hacer referencia.
  • Columna 2 o más: Fuentes de donde obtener la información. El valor más a la izquierda sería el primer lugar donde "buscaría" la información, luego el siguiente y así sucesivamente.
  • Valores entre [ ]: Son parámetros opcionales que se pueden introducir; especifican qué hacer en caso de haber obtenido un resultado en concreto del anterior fichero; Por ejemplo en la 5 línea de este fichero vemos que en caso de haber encontrado mdns4_minimal, pero no haber encontrado lo que se buscaba, el fichero dejaría de buscar fuentes de donde obtener la información e informaría de la carencia del fichero en cuestión.

Obviamente lo más importante sería conocer qué categorías podemos manejar... El abanico de posibilidades es bastante amplio, pero los más usados serían los siguientes:
  • aliases: Esta categoría contiene los alias usados para el envío y recepción de mails dentro del sistema. 
  • ethers: Número de interfaces ethernet.
  • groups: Esta categoría hace referencia a los grupos de usuarios del sistema; grupos que generalmente podemos consultar mediante el comando con el mismo nombre consultando el fichero /etc/groups.
  • hosts: Esta categoría hace referencia a la resolución de nombres, el cual envuelve diferentes aspectos, tales como los hosts "estáticos" y la resolución de nombres vía DNS.
  • networks: Especifica el nombre de algunas redes junto con sus respectivas ips; por ejemplo, gracias a esto el sistema es capaz de reconocer que la ip 127.0.0.1 es "loopback".
  • passwd: Categoría que contiene la información relativa a las contraseñas de los usuarios almacenadas /etc/passwd.
  • protocols: Esta categoría contiene el nombre de un gran número de protocolos.
  • services: En mi opinión, una de las categorías más importantes; contiene la información de los servicios usados. Información que relacionada con el nombre de cada servicio y el puerto de red que usa cada uno.
  • shadow: Contiene toda la información relativa a las contraseñas del usuario almacenadas en /etc/shadow.

Si bien ya conocemos las categorías, faltaría conocer a qué fuentes podemos apuntar. Tenemos la posibilidad de apuntar a ciertas fuentes concretas como puede ser mdns4_minimal... pero lo más común es hacer referencia a una librería o a un fichero en concreto... El mencionar estas librerías o ficheros manualmente diciendo exactamente a qué referencias puede ser una locura, con lo que existen métodos abreviados que pueden facilitarnos la vida. En concreto 4:
  • db: Esto busca en /lib/libnss_db.so toda la información relacionada con la categoría que buscamos. El problema está que la información almacenada allí no se puede leer con facilidad. Además la librería en cuestión no está instalada por defecto, no lo que si queremos usarla necesitariamos instalarla mediante:
apt-get install libnss-db
  • nis: Esto busca en /lib/libnss_nis.so toda la información relacionada con la categoría que buscamos; tiene las mismas desventajas que db, así que si queremos usar esa librería tenemos que hacer:
apt-get install libnss-nis
  • files: La referencia más útil de todas ya que esta está relacionada con ficheros claramente legibles y modificables. Cada vez que pongamos que la fuente de una categoría es files; nsswitch buscará en /etc un fichero con el mismo nombre que la categoría; en caso exitoso leería la información almacenada en este, información que podemos haber modificado con anterioridad a nuestro antojo.
  • compat: Es exactamente lo mismo que files, con la diferencia de en caso de poner compat, estaríamos otorgando al usuario que esté ejecutando nsswitch los permisos suficientes para acceder al sistema; es por ello que es necesario usar compat en vez files para passwd, groups y shadow. Esta referencia también es denominada "Compatibility Mode".

Por último estarían los parámetros opcionales, que ayudarían a "hilar más fino" en las consultas de las diferentes fuentes. Estos en sí no suponen una gran diferencia a la hora de realizar las consultas pero podemos hacer que se realicen determinadas acciones en caso de cumplirse o incumplirse ciertas condiciones o eventos. Los eventos serían nada menos que 4:
  • SUCCESS: Este evento significaría que la consulta de la anterior fuente ha sido exitosa; es decir que no sólo ha realizado la búsqueda, sino que además se ha encontrado lo que se buscaba. 
  • NOTFOUND: El texto en cuestión no es tan informativo que uno pensaría a primera vista. Este evento significaría que se ha encontrado la fuente especificada (ya sea un fichero lo que uno desee) pero que no se ha encontrado la información que se buscaba dentro de dicha fuente.
  • UNAVAIL: Esto significaría que la fuente en cuestión, ya sea un fichero o una librería, no existe o no es legible. 
  • TRYAGAIN: Esta es la situación es la menos común de todas. Esto significaría que el fichero estaría disponible pero que no podría ser leído debido a que está siendo ya leido por otro recurso o porque no se tienen los permisos adecuados.

Con estos 4 eventos podemos hacer dos cosas; la primera sería detener la ejecución y la segunda sería decirle a nsswitch que continue (cosa que generalmente hace por defecto). Esto se haría especificando return para detenerse y continue para continuar adelante, independientemente del resultado.Además podemos poner el simbolo ! antes del evento para decir que queremos que esa condición o evento en concreto no se cumpla. He aquí dos ejemplos prácticos:
[SUCCESS= return] --> En caso de haber ocurrido el evento SUCCESS, nsswitch se detendrá y devolverá el resultado.
[!SUCCESS = continue] --> En caso de NO haber ocurrido el evento SUCCESS, nsswitch continuará leyendo el resto de fuentes disponibles (en caso de haberlas).
Con estos conceptos ya seríamos capaces de entender e incluso modificar el comportamiento de nsswiwtch, pudiendo especificar y alterar las fuentes de donde se obtienen ciertos nombres, y el orden de lectura de dichas fuentes.
Espero que con esto os haya quedado un poco más claro el abstracto mundo de nsswitch.
Saludos.