domingo, 31 de julho de 2016

Servidor OpenLDAP (cn=config) no CentOS 7

Introdução

Neste post irei mostrar passo a passo como configurar um servidor OpenLDAP utilizando a base de dados de configuração cn=config. Ao final do post iremos ver como configurar um servidor Linux para se autenticar utilizando os usuários e grupos cadastrados em nossa base de dados.

Vamos aos requisitos:
  • 1 servidor Linux CentOS 7
  • 1 CPU
  • 1 GB de RAM
  • 20GB de Disco
  • FIREWALLD desligado
  • SELINUX desligado
A instalação do sistema operacional vai além do escopo deste post. Partirei do principio que você já possui um servidor Linux CentOS 7 instalado e funcionando na rede e com os serviços FIREWALLD e SELINUX desabilitados.

Vamos as configurações do servidor:

Hostname: ldap01.example.com
SO: CentOS 7
IP: 192.168.206.200
Netmask: 255.255.255.0
Gateway: 192.168.206.1
DNS: 192.168.206.1

Instalamos os pacotes do OpenLDAP servidor e cliente no servidor ldap01

# yum install openldap-servers openldap-clients

Editamos o arquivo /etc/sysconfig/slapd e alteramos a variável SLAPD_URLS para conter ldap://ldap01/

# OpenLDAP server configuration
# see 'man slapd' for additional information

# Where the server will run (-h option)
# - ldapi:/// is required for on-the-fly configuration using client tools
# (use SASL with EXTERNAL mechanism for authentication)
# - default: ldapi:/// ldap:///
# - example: ldapi:/// ldap://127.0.0.1/ ldap://10.0.0.1:1389/ ldaps:///
SLAPD_URLS="ldapi:/// ldap://ldap01/"

# Any custom options
#SLAPD_OPTIONS=""

# Keytab location for GSSAPI Kerberos authentication
#KRB5_KTNAME="FILE:/etc/openldap/ldap.keytab"

Se o servidor slapd estiver rodando, pare-o.

# systemctl stop slapd.service

Copie o arquivo DB_CONFIG de exemplo da documentação do pacote openldap-servers.

# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

Ajuste a permissão para o usuário ldap grupo ldap

# chown -R ldap:ldap /var/lib/ldap

Antes de iniciar a base de dados precisamos alterar alguns parâmetros na base cn=config. Utilizando o comando slapcat podemos ver as configurações padrões.

# slapcat -b cn=config

Começamos importando os principais schemas que vamos utilizar. Os esquemas estão disponíveis em formato ldif no diretório /etc/openldap/schema. Utilizamos o comando slapadd para importar os schemas

# slapadd -v -l /etc/openldap/schema/core.ldif -b cn=config
# slapadd -v -l /etc/openldap/schema/nis.ldif -b cn=config
# slapadd -v -l /etc/openldap/schema/cosine.ldif -b cn=config
# slapadd -v -l /etc/openldap/schema/inetorgperson.ldif -b cn=config

O schema core já vem na configuração padrão. O primeiro comando acima provavelmente irá retornar um erro dizendo que não foi possível incluir o schema na base de dados, você pode ignorar o erro e fazer os demais. Eu deixei o comando acima para referencia, caso você esteja criando uma base de dados do zero a ordem de importação dos schemas é importante e devem seguir esta ordem.

Ao executar os comandos acima será criado novos diretórios em /etc/openldap/slapd.d/cn=config/cn=schema.

# ls -ltr /etc/openldap/slapd.d/cn\=config/cn\=schema
total 32

-rw------- 1 ldap ldap 15578 Jul 31 11:00 cn={0}core.ldif
-rw------- 1 root root 11363 Jul 31 11:20 cn={1}nis.ldif
-rw------- 1 root root 11363 Jul 31 11:20 cn={1}cosine.ldif
-rw------- 1 root root  2857 Jul 31 11:20 cn={2}inetorgperson.ldif

Se você está pensando agora que a base de dados cn=config na verdade é uma estrutura de diretórios em /etc/openldap/slapd.d você está corretíssimo. Não altere esses arquivos diretamente na estrutura de diretórios, pois o servidor slapd irá reclamar. Sempre utilize os comandos do OpenLDAP client. Veja que ao executar o comando slapadd como root os arquivos foram criados com o usuário root. Precisamos então ajustar a permissão para que o servidor slapd possa ler os arquivos.

# chown -R ldap:ldap /etc/openldap/slapd.d

Também podemos verificar os schemas importados utilizando o comando slapcat

# slapcat -b cn=config -s cn=schema,cn=config | grep 'dn: cn={'
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}inetorgperson,cn=schema,cn=config

Habilite e inicie o servidor slapd

# systemctl enable slapd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/slapd.service to /usr/lib/systemd/system/slapd.service.
# systemctl start slapd.service

Agora vamos configurar a nossa base de dados. O cn=config por padrão vem com o domínio dc=my-domain,dc=com configurado.

# slapcat -b cn=config -s olcDatabase={2}hdb,cn=config
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 361014fe-eb7b-1035-8651-eb93d04be7e8
creatorsName: cn=config
createTimestamp: 20160731150006Z
entryCSN: 20160731150006.119309Z#000000#000#000000
modifiersName: cn=config

modifyTimestamp: 20160731150006Z

Precisamos alterar esses valores para a nossa base de dados. Para isso precisamos utilizar o comando ldapmodify com um arquivo ldif informando que vamos incluir um parametro olcRootPW e alterar os parametros olcSuffix e olcRootDN da entrada dn: olcDatabase={2}hdb,cn=config. Criamos então o arquivo configsuffix.ldif com o seguinte conteúdo:

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
-
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com
-
add: olcRootPW
olcRootPW: {SSHA}Sb6Z5tJi8u8BHFSNJt2J/ii6DsEFlf09

O parâmetro olcRootPW é a senha para o usuário cn=Manager,dc=example,dc=com. A senha é gerada pelo comando slappasswd. Utilizei a senha secret gerada pelo comando abaixo.  

# slappasswd -s secret
{SSHA}Sb6Z5tJi8u8BHFSNJt2J/ii6DsEFlf09

Executamos então o comando ldapmodify da seguinte forma:

# ldapmodify -Y EXTERNAL -H ldapi:/// -f configsuffix.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"

Rodando o comando slapcat novamente iremos ver que os parâmetros foram alterados. Veja que a senha no parâmetro olcRootPW aparece criptografado, portando não espere ver o mesmo hash informado no arquivo ldif.

# slapcat -b cn=config -s olcDatabase={2}hdb,cn=config
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 361014fe-eb7b-1035-8651-eb93d04be7e8
creatorsName: cn=config
createTimestamp: 20160731150006Z
olcSuffix: dc=example,dc=com
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW:: e1NTSEF9U2I2WjV0Smk4dThCSEZTTkp0MkovaWk2RHNFRmxmMDk=
entryCSN: 20160731154804.140139Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20160731154804Z

Vamos dar uma olhada nas configurações da base cn=config agora usando o comando ldapsearch:

# ldapsearch -Y EXTERNAL -H ldapi:/// -b olcDatabase={0}config,cn=config -LLL
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,
cn=auth" manage by * none

Veja que uma vez o servidor slapd no ar podemos utilizar o comando ldapsearch para consultar a base cn=config. Vamos agora criar uma senha para a base cn=config. No servidor ldap01 crie o arquivo cnconfigpw.ldif com o seguinte conteúdo:

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}Sb6Z5tJi8u8BHFSNJt2J/ii6DsEFlf09

Executamos então o comando ldapmodify para fazer as modificações:

# ldapmodify -Y EXTERNAL -H ldapi:/// -f cnconfigpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

Agora execute o comando ldapsearch para verificar

# ldapsearch -H ldap://ldap01/ -D cn=config -w secret -b olcDatabase={0}config,cn=config -LLL
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" manage by * none
olcRootPW: {SSHA}Sb6Z5tJi8u8BHFSNJt2J/ii6DsEFlf09

Agora estamos prontos para popular a nossa base de dados LDAP com usuários e grupos. Crie o arquivo rootdomain.ldif com o seguinte conteúdo:

dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: Dominio example.com
dc: example

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
description: Administrador da base LDAP

dn: ou=Usuarios,dc=example,dc=com
objectClass: organizationalUnit
ou: Usuarios

dn: ou=Grupos,dc=example,dc=com
objectClass: organizationalUnit
ou: Grupos

NOTA: os valores em negrito precisão ser os mesmos valores.

Utilizamos então o comando ldapadd para adicionar as entradas em nossa base de dados:

# ldapadd -D cn=Manager,dc=example,dc=com -w secret -H ldapi:/// -f rootdomain.ldif
adding new entry "dc=example,dc=com"

adding new entry "cn=Manager,dc=example,dc=com"

adding new entry "ou=Usuarios,dc=example,dc=com"

adding new entry "ou=Grupos,dc=example,dc=com"

Podemos validar a criação dos objetos na base com o comando ldapsearch:

# ldapsearch -D cn=Manager,dc=example,dc=com -w secret -H ldapi:/// -b dc=example,dc=com -LLL
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Dominio example.com
dc: example

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
description: Administrador da base LDAP

dn: ou=Usuarios,dc=example,dc=com
objectClass: organizationalUnit
ou: Usuarios

dn: ou=Grupos,dc=example,dc=com
objectClass: organizationalUnit
ou: Grupos

Agora vamos criar o grupo Usuarios e o usuário Angus McGyver incluindo-o no grupo Usuarios. Crie uma senha para o usuário utilizando o comando slappasswd

# slappasswd -s P@ssw0rd
{SSHA}A7WQ+zMFlrMrIBwFwJx+PCvyQ7UYb4pm

Edite o arquivo usuario.ldif com o seguinte conteúdo:

dn: cn=Angus McGyver,ou=Usuarios,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Angus McGyver
sn: McGyver
givenName: Angus
uid: angus.mcgyver
userPassword: {SSHA}A7WQ+zMFlrMrIBwFwJx+PCvyQ7UYb4pm
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/angus.mcgyver

dn: cn=Usuarios,ou=Grupos,dc=example,dc=com
objectClass: posixGroup
cn: Usuarios
gidNumber: 1000
memberUid: angus.mcgyver

Utilizamos o comando ldapadd para criar o usuário na base:

# ldapadd -D cn=Manager,dc=example,dc=com -w secret -H ldapi:/// -f usuario.ldif 
adding new entry "cn=Angus McGyver,ou=Usuarios,dc=example,dc=com"

adding new entry "cn=Usuarios,ou=Grupos,dc=example,dc=com"


Podemos consultar a base com o comando ldapsearch para validar a criação dos objetos:

# ldapsearch -D cn=Manager,dc=example,dc=com -w secret -H ldapi:/// -b dc=example,dc=com -LLL '(|(objectClass=person)(objectClass=posixGroup))'
dn: cn=Usuarios,ou=Grupos,dc=example,dc=com
objectClass: posixGroup
cn: Usuarios
gidNumber: 1000
memberUid: angus.mcgyver

dn: cn=Angus McGyver,ou=Usuarios,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Angus McGyver
sn: McGyver
givenName: Angus
uid: angus.mcgyver
userPassword:: e1NTSEF9QTdXUSt6TUZsck1ySUJ3RndKeCtQQ3Z5UTdVWWI0cG0=
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/angus.mcgyver

Agora que temos o nosso servidor OpenLDAP funcionando e populado com usuários e grupos. Vamos configurar um servidor Linux para se autenticar utilizando o nosso servidor. Em um servidor Linux CentOS 7 execute o seguinte comando:

# authconfig --enableldap --enableldapauth --ldapserver=192.168.206.200 --ldapbasedn="dc=example,dc=com" --enablemkhomedir --updateall
getsebool:  SELinux is disabled
getsebool:  SELinux is disabled

Agora tente efetuar login no servidor Linux com o usuário angus.mcgyver e senha P@ssw0rd e parabéns! Seu servidor OpenLDAP com base de dados em cn=config está configurado.

Você pode aprimorar essa solução criando ACLs, desabilitando autenticação simples e anônima, habilitando replicação e autenticação via SSL/TLS para criptografar os dados. Mais adiante irei abortar um pouco mais sobre o assunto OpenLDAP mostrando como ativar uma replicação N-Way multimaster e como ativar certificados SSL para autenticação com criptografia.

Referencias:

  
Até a próxima!
-
Rafael Baena
 
Postar um comentário