"Después del juego es antes del juego"
Sepp Herberger

miércoles, 23 de septiembre de 2015

Uso de getent para consultar los netgroup


El comando getent es una forma cómoda y sencilla de consultar nuestras bases de datos de usuarios, grupos, máquinas, etc. Por ejemplo, si hacemos:
root@exmachina:~# getent passwd
Nos mostrará todos los usuarios del sistema. En principio diremos: "vaya tonteria, es como un cat  /etc/passwd". Pues no: si los usuarios están además en una BD ldap getent nos mostrará los que hay allí, sin tener que tirar de esotéricas consultas mediante ldadsearch.

Para saber donde están los datos que debe mostrar getent éste consulta el fichero /etc/nsswitch.conf:
root@exmachina:~# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

automount:         files ldap

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       files ldap
root@exmachina:~#
Como se ve, passwd está en "compat ldap", eso quiere decir que el sistema buscará los usuarios en /etc/passwd y en el servidor ldap de nuestra red. Si al llamar a getent además añadimos un parámetro nos filtrará por dicho usuario, mostrando solamente sus datos:
root@exmachina:~# getent passwd aasanchezl01
aasanchezl01:x:12568:12568:Alberto Antonio Sanchez Lara:/home/alumnos/aasanchezl01:/bin/bash
root@exmachina:~# 
Igual que passwd, con getent podemos consultar varias bases de datos mas: la de grupos de usuarios, la de hosts, etc. La que nos interesa ahora es la de netgroup. Esta base de datos permite hacer grupos de máquinas para aplicarles determinadas directivas. Por ejemplo, podemos definir un grupo de hosts llamado workstation-hosts y luego exportar mediante NFS una carpeta sólo a dicho grupo:
root@servidor-nfs:~# cat /etc/exports 
# /etc/exports: the access control list for filesystems which may be exported
..........
..........
/data/folder    @workstation-hosts(rw,async,no_subtree_check,insecure)
..........
..........
De esta manera solo las máquinas miembros de workstation-hosts pueden montar servidor-nfs:/home/folder.

La definición de los netgroups puede realizarse en el fichero /etc/netgroup (sintaxis aquí) y en el árbol ldap. En este último caso queda con este aspecto:


Si queremos consultar los netgroup definidos la orden sería "getent netgroup", pero puesta así sola da un error diciendo que esa base de datos no soporta enumeración. Eso traducido quiere decir que hay que especificar además que netgroup estamos consultando (es decir, no podemos preguntar por todos los netgroups a ciegas, debemos saber sus nombres), por ejemplo:
root@exmachina:~# getent netgroup workstation-hosts
workstation-hosts     (a01-pro, -, -) (a13-o01, -, -) (...................
root@exmachina:~#
Si hacemos la prueba veremos que saca todas las máquinas del grupo en una sola línea, en la forma de tuplas "(nombre, -, -)" que lo hacen bastante ilegible. Si queremos que saque las máquinas en líneas separadas y adicionalmente filtrar por algún valor tendremos que usar una combinacion de sed y grep. Por ejemplo:
root@exmachina:~# getent netgroup workstation-hosts |  sed 's/-)/-)\n/g' | grep a2
  (a20-pro, -, -)
  (a21-pro, -, -)
root@exmachina:~#
Se enumeran los hosts, pero en lineas separadas con el sed que convertirá "-)" en "-)\n", insertando un retorno de carro. Después se filtra para que solo salgan los hosts cuyo nombre contenga "a2". De esta forma consultamos de una forma rápida si un host está o no en un netgroup.

Este uso de sed permite dividir en líneas separadas sentencias muy largas. Por ejemplo, otro uso si tenemos un fichero de insert sql todo en una línea y queremos dividirlo en un registro por línea:
root@exmachina:~# cat aminno_member_email.dump 
INSERT INTO `member_details` VALUES (9,0,0,'1953-11-24','Speak',1,65772,173,2,1,1,5), (10,0,0,'1971-10-11','Fine',1,47628,163,1,1,1,3), (11,0,0,'1968-02-11','Help',1,38556,152,1,1,2,0), (12,0......
root@exmachina:~#
El comando sed haria una sustitución de  ",)" por ",)\n":
root@exmachina:~# sed 's/,(/,\n(/g' aminno_member_email.dump > mail.dump
Bueno, pues hasta la siguiente, :-).

1 comentario:

  1. Buenas, no se si podrás responder este mensaje, tengo un servidor ldap, y desde el cliente si puedo hacer getent y me muestra los usuarios y los grupos, pero en el servidor no, sabrías a que se debe?

    ResponderEliminar