Instalación servidor LDAP, ldap-utils: ldapsearch
Introdución
- Neste apartado aparte de instalar os paquetes necesarios e tamén imos pararnos un pouco en revisar os ficheiros de LDAP para familiarizarnos un pouco máis coa súa estrutura.
- A imaxe amosa o escenario 1.E
- IMPORTANTE: para manter a compatibilidade na parte V con SAMBA o nome de dominio non debe exceder os 15 caracteres (Neste caso iescalquera ten 11).
Instalar os paquetes necesarios
- En primeiro lugar, teremos que instalar no servidor os paquetes necesarios para a execución do servidor LDAP (slapd (Standalone LDAP Daemon)) .
- Logo instalaremos as utilidades básicas para manexar a súa información. O comando que usaremos será este:
</source>
Agregar os esquemas básicos
- Como xa indicamos na parte introdutoria ao instalar o servizo LDAP en Debian (slapd), este xa instala por defecto os catro esquemas que se indicaron anteriormente: core, COSINE, NIS, inetOrgPerson.
- Pronto o comprobaremos.
- Se non estiveran instalados, ou quixeramos instalar algún outro debemos executar:
ldapadd -Y EXTERNAL -H ldapi:/// -f /ruta ao esquema/esquema.ldif
- O comando ldapadd instalarémolo máis adiante, este atópase no paquete ldap-utils que non instalamos por agora.
- Se observásemos a saída da execución dese comando, veriamos que se produce un erro se intentamos engadir un esquema que xa existe, por exemplo core, debido a que xa está engadido:
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=core,cn=schema,cn=config" ldap_add: Other (e.g., implementation specific) error (80) additional info: olcAttributeTypes: Duplicate attributeType: "2.5.4.2"
Se se engade un esquema que non existe o resultado sería semellante a, por exemplo o esquema openldap:
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=openldap,cn=schema,cn=config"
Instalar e configurar slapd
- A continuación imos instalar slapd, examinar os ficheiros de ldap e configurar o paquete para o noso dominio iescalquera.local.
Instalación do paquete
Ficheiros de ldap
- Unha vez instalado o paquete imos ver un pouco os ficheiros que que xestiona o servizo slapd. Estes atópanse en:
- /etc/ldap/*: ficheiros de configuración do directorio ldap.
- /etc/default/sldap: ficheiro de configuración do servizo slapd.
- /var/lib/ldap/*: onde están as bases de datos que usa slapd.
- /usr/lib/ldap/*: contén módulos que pode usar slapd.
- Instalamos o paquete tree para axudarnos coa estrutura de ficheiros:
apt-get install tree
- Imos ver por arriba a estrutura da seguinte imaxe
En /etc/slapd/slapd.d temos o ficheiro da rama de configuración cn=config. Para manexarse con estes ficheiros con símbolos como =, {, etc, aconséllase usar a tecla TAB para completar as instrucións (Premer 1 vez, ou 2 veces se hai directorios/ficheiros que teñen o mesmo comezo) ou poñer escribir os nomes completos dos ficheiros/directorios entre " ".
Observar: o dn, e o objectClass. Como vemos calquera rama da árbore DIT (Digital Information Tree, que vimos na teoría) debe ser introducida no directorio LDAP. Con este ficheiro foi co que se cargou a rama cn=config por parte do proceso de instalación de slapd.
Dentro do mesmo directorio está o directorio cn=config.Os ficheiros .../cn=config/olcDatabase* conteñen directivas sobre as bases de datos. A numeración úsase para distinguir distintas BBDD do mesmo tipo. Neste caso, a que ten o ordinal 1, amosa, entre outras cousas, quen pode acceder á rama nodomain.com, tanto en modo escritura como en modo lectura. Tan pronto configuremos slapd veremos como cambia o contido dese ficheiro.
Xa noutro directorio, o ficheiro /etc/default/slapd permítenos, entre outras cousas indicar cales son os protocolos polos que se pode conectar un cliente ao demo slpad. Neste caso son:
-ldap: que usa o protocolo TCP e escoita no porto 389, podemos conectarnos dende calquera sitio coa sintaxe: ldap://ip_do_servidor
-ldapi: que se usa para conectarse co cliente dentro do mesmo servidor ao demo slapd usando Sockets de Unix (http://es.wikipedia.org/wiki/Socket_Unix) e non a pila de protocolos TCP/IP. Para conectarse só precisamos poñer o nome do protocolo: ldapi://.
- ldaps: non está habilitado por defecto e permite realizar conexións cifradas (seguras) entre os clientes e o servidor como veremos no escenario 1.F. Usa tamén o protocolo TCP e escoita no porto 636. Para conectarse: ldaps://ip_servidor:636 (porto opcional).
Configuración de slapd
- Trala lectura do punto anterior, que tal se lle damos unha segunda volta? e logo imos configurar por fin o servidor.
- A continuación imos personalizar a configuración do directorio ldap para o noso dominio iescalquera.local.
- O que imos facer a continuación con pantallas de configuración vai xerar uns ficheiros ldif, que poderíamos xerar nós á man, e logo cargar.
- Podemos realizar a configuración tantas veces como precisemos, por se nos trabucamos, usando o comando dpkg-reconfigure que se usa para a reconfiguración dos paquetes unha vez instalados:
dpkg-reconfigure slapd
- Pero precisamos algo máis para ler e escribir na BD pois agora toca traballar con ficheiros LDIF, para iso instalaremos ldap-utils.
Utilidades ldap: paquete ldap-utils
- A continuación imos instalar o paquete ldap-utils que nos vai proporcionar utilidades:
- para consultar o directorio de LDAP
- engadir/modificar/eliminar obxectos
- poder cambiar o contrasinal dun usuario, etc.
Instalación de ldap-utils
Agora temos un conxunto de comandos que comezan por ldap para: engadir, modificar, borrar elementos na BD de ldap e tamén para consultalos.
Lembrar que se pode escribir parte dun comando ou directorio/ficheiro e premer a tecla TAB (1 vez ou 2 se hai varios comandos/ficheiros que comparte comezo do nome) para completar o seu nome.
Consultar a BD: ldapsearch
- A continuación imos testar que todo funciona e para iso usaremos o comando ldapsearch.
- No seguinte enlace pódese consultar o manual de ldapsearch: http://linux.die.net/man/1/ldapsearch
- A continuación amosamos algúns dos parámetros que imos usar nesta primeira aproximación ao comando:
- -x: usar autenticación simple.
- -Y EXTERNAL: usa autenticación SASL (Simple Authentication and Security Layer - capa de seguridade e autenticación simple)
- O mecanismo de SASL que usamos neste caso é EXTERNAL, onde a autenticación está implícita no contexto, isto é, o cliente e servidor teñen instalados uns certificados para autenticarse un contra o outro. Neste caso o cliente (ldapsearch) e o servizo (slapd) están no mesmo equipo en dserver00, co cal eses certificados xa están no equipo.
- Nos seguintes enlaces hai máis información sobre este tipo de autenticación:
- -D dn: dn para conectarse ao LDAP indicando o nome de usuario co que nos imos conectar.
- -w contrasinal: Indicar o contrasinal para conectarse ao LDAP.
- -W: Obrigamos a que o comando pide o contrasinal para conectarse ao LDAP en lugar de recibilo como parámetro.
- -H ldapuri: Especificar a URI coa que nos imos conectar ao servidor ldap. Por exemplo ldap://localhost ou ldapi://
- filtro indica que nos devolva as entradas que coincidan cos valores dos atributos que indicamos no filtro.
- -b base de busca: para indicar en que obxecto da árbore comezar a buscar
- -s base|one|sub: indica se queremos que nos devolva os atributos e valores:
- base: só do obxecto que estamos consultando
- one: só dos obxectos que están un nivel por debaixo do obxecto consultado.
- sub: do obxecto consultado e de toda a súa subárbore. É o valor por defecto.
- O formato do comando é (non precisamente nesa orde):
ldapsearh método_autenticación base ldapuri filtros
- Os valores que indicamos para os parámetros poden ir ou non entre comiñas simples ('valores') se vemos que se poden confundir cos parámetros, pero non é obrigatorio.
Consultar o dominio creado
- Indicamos como base o tope da xerarquía e como filtros calquera clase de obxecto.
- Observar que o propio comando nas liñas 4-7 amosa que é o que pretendemos consultar.
- O que nos interesa está na liña 12.
root@dserver00:~# ldapsearch -x -b '' -s base objectclass=* namingcontexts
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: objectclass=*
# requesting: namingcontexts
#
#
dn:
namingContexts: dc=iescalquera,dc=local
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
Consultar obxectos da rama dc=iescalquera,dc=local
- Imos agora facer unha serie de consultas na nosa rama de interese. Por agora non temos moito nesa rama, faltan usuarios, grupos, etc, que crearemos no seguinte apartado.
- Sen autenticación:
- Observar as liñas marcadas (En formato PDF non se poden observar as liñas marcadas).
root@dserver00:~# ldapsearch -x -b 'dc=iescalquera,dc=local'
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# iescalquera.local
dn: dc=iescalquera,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: iescalquera
dc: iescalquera
# admin, iescalquera.local
dn: cn=admin,dc=iescalquera,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
- Con autenticación SASL implícita:
- precisamos indicar o servidor, neste caso con -H ldapi://
- Obtemos a mesma información que no caso anterior
root@dserver00:~# ldapsearch -Y EXTERNAL -H ldapi:// -b 'dc=iescalquera,dc=local'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# iescalquera.local
dn: dc=iescalquera,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: iescalquera
dc: iescalquera
# admin, iescalquera.local
dn: cn=admin,dc=iescalquera,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
- Indicando o usuario e contrasinal co que nos conectamos
- Observar a liña 24, pois como somos o usuario admin ensínanos o hash asociado ao seu contrasinal.
- Observar como con -D indicamos o usuario e con -w o contrasinal.
- Nesta ocasión como uri usamos ldap://localhost, pero podería ser ldap://dserver00, ldap://dserver00.iescalquera.local (consultaríase o DNS), etc.
root@dserver00:~# ldapsearch -D cn=admin,dc=iescalquera,dc=local -w abc123. -H ldap://localhost -b 'dc=iescalquera,dc=local'
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# iescalquera.local
dn: dc=iescalquera,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: iescalquera
dc: iescalquera
# admin, iescalquera.local
dn: cn=admin,dc=iescalquera,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9Qm5mRG9QTWVSUnUyalNpZUNXMEhWbnhvMlBnUWNrK1o=
# search result
search: 2
result: 0 Success
- Indicando o usuario co que nos conectamos, pero non o contrasinal
- Observar a liña 2, como pide o contrasinal de admin.
- Nesta ocasión como uri usamos ldap://dserver00,
root@dserver00:~# ldapsearch -D cn=admin,dc=iescalquera,dc=local -W -H ldap://dserver00 -b 'dc=iescalquera,dc=local'
Enter LDAP Password:
- Indicando que so queremos consultar os valores do obxecto base, non os fillos
- Para iso usamos o parámetro -s base
- Observar a liña 5
root@dserver00:~# ldapsearch -x -b 'dc=iescalquera,dc=local' -s base
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope baseObject
# filter: (objectclass=*)
# requesting: ALL
#
# iescalquera.local
dn: dc=iescalquera,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: iescalquera
dc: iescalquera
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
- Indicando que só queremos consultar os valores dos obxectos fillos do base, non os do obxecto base
- Para iso usamos o parámetro: -s one
- Lembrar que por defecto o valor do parámetro é: -s sub
- Pero só temos un fillo.
- Observar a liña 5.
root@dserver00:~# ldapsearch -x -b 'dc=iescalquera,dc=local' -s one
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope oneLevel
# filter: (objectclass=*)
# requesting: ALL
#
# admin, iescalquera.local
dn: cn=admin,dc=iescalquera,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
- Poñemos un filtro no que indicamos que desexamos consultar os obxectos que teñan o atributo objectClass independentemente do valor que teña ese atributo
- Para iso poñemos un filtro cos atributos e os valores buscados.
- Obviamente o atributo objectClass teno todo obxecto.
- Observar que non é sensible ás maiúsculas.
- Observar a liña 6
root@dserver00:~# ldapsearch -x -b 'dc=iescalquera,dc=local' obJecTcLass=*
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope subtree
# filter: obJecTcLass=*
# requesting: ALL
#
# iescalquera.local
dn: dc=iescalquera,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: iescalquera
dc: iescalquera
# admin, iescalquera.local
dn: cn=admin,dc=iescalquera,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
- Poñemos un filtro no que indicamos que desexamos consultar os obxectos que teñan o atributo objectClass co valor dcObject
- Para iso poñemos un filtro co atributo e o valor desexado.
- Agora só obtemos os obxectos que cumpren coa condición.
- Observar a liña 6
root@dserver00:~# ldapsearch -x -b 'dc=iescalquera,dc=local' objectclass=dcobject
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope subtree
# filter: objectclass=dcobject
# requesting: ALL
#
# iescalquera.local
dn: dc=iescalquera,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: iescalquera
dc: iescalquera
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
- Outros exemplos sobre o mesmo.
- Poñemos un filtro no que indicamos que desexamos consultar os obxectos que teñan o atributo 'cn' independentemente do valor que teña ese atributo
- Temos un só obxecto que cumpre co filtro.
- Observar a liña 6
root@dserver00:~# ldapsearch -x -b 'dc=iescalquera,dc=local' cn=*
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope subtree
# filter: cn=*
# requesting: ALL
#
# admin, iescalquera.local
dn: cn=admin,dc=iescalquera,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
- Poñemos un filtro no que indicamos que desexamos consultar os obxectos que teñan o atributo cn co valor admin
- Temos o mesmo obxecto anterior que cumpre co filtro.
- Observar a liña 6
root@dserver00:~# ldapsearch -x -b 'dc=iescalquera,dc=local' cn=admin
# extended LDIF
#
# LDAPv3
# base <dc=iescalquera,dc=local> with scope subtree
# filter: cn=admin
# requesting: ALL
#
# admin, iescalquera.local
dn: cn=admin,dc=iescalquera,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1