O cenário de testes é são duas maquinas virtuais usando Oracle Linux 7.7 (atualizadas em 02/02/2020), mas como a origem da distribuição é a mesma, se aplica ao CentOS e ao Red Hat
Nome | IP | OS |
ol77-ldap1.prego.eti.br | 192.168.0.53 | Oracle Linux 7.7 |
ol77-ldap2.prego.eti.br | 192.168.0.54 | Oracle Linux 7.7 |
Inclua os nomes nos dois servidores, se você estiver usando um usuário com poderes de sudo:
$ sudo su -c "echo '192.168.0.53 ol77-ldap1.prego.eti.br' >> /etc/hosts"
$ sudo su -c "echo '192.168.0.54 ol77-ldap2.prego.eti.br' >> /etc/hosts"
Caso esteja como root, é só executar o echo direto, trocando os IPs e nomes conforme a sua configuração
$ sudo yum install -y openldap-servers openldap-clients
Gere uma senha com o slappasswd (hash Salted SHA-512):
$ slappasswd -h "{SSHA512}" -o module-load=pw-sha2.la -o module-path=/usr/lib64/openldap/
New password:
Re-enter new password:
{SSHA512}BHSt64+Rd+Ujy3yYhFVxI/1ESYXM/hRppd3BjSpGk+hlZmTrQx7NCn+S0MV0zK9+nshkhSXg/0FHy7kTKJBKFVqvTulSIjB/
O pacote de instalação do LDAP do Oracle Linux 7 vem por padrão com um ldif para gerar uma base em hdb, a recomendação dos desenvolvedores do OpenLDAP é usar MDB, vamos alterar isso antes de iniciar o serviço, pois uma vez criado o banco não pode ter seu tipo alterado:
$ sudo mv /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif /etc/openldap/slapd.d/cn\=config/olcDatabase={2}mdb.ldif
Vamos aproveitar e já alterar o dominio e incluir a senha do usuário Admin ou Master (padrão):
dn: olcDatabase={2}hdb <== altere para mdb objectClass: olcDatabaseConfig objectClass: olcHdbConfig <== altere para Mdb olcDatabase: {2}hdb <== altere para mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=prego,dc=eti,dc=br <== altere para o seu dominio olcRootDN: cn=Admin,dc=prego,dc=eti,dc=br <== altere para o seu dominio e nome de usuario de preferência olcRootPW: {SSHA512}BHSt64+Rd+Ujy3yYhFVxI/1ESYXM/hRppd3BjSpGk+hlZmTrQx7NCn+S0MV0zK9+nshkhSXg/0FHy7kTKJBKFVqvTulSIjB/ <== Inclua essa linha com a senha gerada no passo anterior olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub olcDbMaxSize: 31457280 <== Inclua essa linha com o tamanho do arquivo (30MB armazenam até 10000 entradas) structuralObjectClass: olcHdbConfig <== altere para Mdb entryUUID: de245f08-db80-1039-90a1-51312546408f creatorsName: cn=config createTimestamp: 20200204100007Z entryCSN: 20200204100007.672968Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20200204100007Z
O serviço do servidor LDAP no Oracle linux chama slapd, para ativar o serviço e fazer com que ele seja iniciado automáticamente no reboot, utilize:
$ sudo systemctl start slapd
$ sudo systemctl enable slapd
Crie um arquivo incluisenharoot.ldif (o mesmo nos dois servidores) com o conteúdo abaixo:
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW:{SSHA512}BHSt64+Rd+Ujy3yYhFVxI/1ESYXM/hRppd3BjSpGk+hlZmTrQx7NCn+S0MV0zK9+nshkhSXg/0FHy7kTKJBKFVqvTulSIjB/
Obs.: Em caso de precisar reiniciar a senha root, altere o "add:" por "replace:" na terceira linha acima
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f incluisenharoot.ldif
Após definir a senha root o próximo passo é a carga de definições de dados do LDAP, os schemas:
Schema | Uso | Depende de |
core | definições iniciais (sn, cn, etc) | Nenhum schema (Já esta no LDAP) |
cosine | Atributos gerais (documentos, pessoas, etc.) | core.schema |
nis | Informações sobre usuários e grupos posix (UNIX/Linux) | cosine.schema |
inetorgperson | Informações de nome preferido, foto e lingua da pessoa | cosine.schema |
sudo | Regras de sudo centralizadas |
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif $ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif $ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
Em 3 de fevereiro de 2020 a versão do sudo era a 1.8.23:
$ sudo cp /usr/share/doc/sudo-1.8.23/schema.OpenLDAP /etc/openldap/schema/sudo.schema $ cat > ./conv_sudo.conf << EOL include /etc/openldap/schema/sudo.schema EOL $ mkdir ldif $ slaptest -f conv_sudo.conf -F ldif/ $ sudo cp ldif/cn\=config/cn\=schema/cn\=\{0\}sudo.ldif /etc/openldap/schema/sudo.ldif
No arquivo sudo.ldif altere as linhas abaixo:
dn: cn={0}sudo
para
dn: cn=sudo,cn=schema,cn=config
e
cn: {0}sudo
para:
cn: sudo
e remova as linhas abaixo do fim do arquivo:
structuralObjectClass: olcSchemaConfig
entryUUID: 77f4eaf8-db36-1039-9215-0d960f602724
creatorsName: cn=config
createTimestamp: 20200204010733Z
entryCSN: 20200204010733.345744Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20200204010733Z
O arquivo deve ficar assim:
dn: cn=sudo,cn=schema,cn=config objectClass: olcSchemaConfig cn: sudo olcAttributeTypes: {0}( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s ) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5Substrin gsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: {1}( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s ) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5Substring sMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: {2}( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Com mand(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4 .1.1466.115.121.1.26 ) olcAttributeTypes: {3}( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User( s) impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3 .6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: {4}( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Opti ons(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466 .115.121.1.26 ) olcAttributeTypes: {5}( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'U ser(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1. 1466.115.121.1.26 ) olcAttributeTypes: {6}( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC ' Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4. 1.1466.115.121.1.26 ) olcAttributeTypes: {7}( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'S tart of time interval for which the entry is valid' EQUALITY generalizedTim eMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.12 1.1.24 ) olcAttributeTypes: {8}( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'En d of time interval for which the entry is valid' EQUALITY generalizedTimeMa tch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1 .24 ) olcAttributeTypes: {9}( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an i nteger to order the sudoRole entries' EQUALITY integerMatch ORDERING intege rOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) olcObjectClasses: {0}( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' DESC 'Sudoer Entries' SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoOrder $ su doNotBefore $ sudoNotAfter $ description ) )
Finalize incluindo-o no LDAP:
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/sudo.ldif
Veja abaixo um ldif para criar a base do domínio prego.eti.br, troque de acordo com seu sistema/ambiente.
Ainda no ldif abaixo, note que o tipo de base usada é o mdb (recomendação dos desenvolvedores do OpenLDAP) e o tamanho 31457280 (30MB) e é equivalente a 10000 entradas. O tamanho da base MDB não pode ser aumentada após a criação, dimensione de acordo com o esperado, acompanhe regulamermente o crescimento e reconstrua a base se necessário.
dn: olcDatabase=mdb,cn=config changetype: add objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: mdb olcSuffix: dc=prego,dc=eti,dc=br olcRootDN: cn=admin,dc=prego,dc=eti,dc=br olcRootPW: {SSHA512}BHSt64+Rd+Ujy3yYhFVxI/1ESYXM/hRppd3BjSpGk+hlZmTrQx7NCn+S0MV0zK9+nshkhSXg/0FHy7kTKJBKFVqvTulSIjB/ olcDbDirectory: /var/lib/ldap olcDbIndex: objectClass,uid,uidNumber,gidNumber eq olcDbMaxSize: 31457280 olcAccess: to attrs=userPassword by self write by anonymous auth by dn.subtree="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none olcAccess: to attrs=shadowLastChange by self write by dn.subtree="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by dn.subtree="ou=sistema,dc=prego,dc=eti,dc=br" read by * none olcAccess: to dn.subtree="ou=sistema,dc=prego,dc=eti,dc=br" by dn.subtree="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none olcAccess: to dn.subtree="dc=prego,dc=eti,dc=br" by dn.subtree="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by users read by * none
Adicione o domínio:
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f prego.eti.br.ldif
Para a sincronia entre os servidores funcionar bem, o horário é primordial, ative o serviço de atualização de horário dos servidores:
$ sudo systemctl start ntpdate $ sudo systemctl enable ntpdate
Para conferir se o serviço esta ativo e atualizando, use:
$ sudo systemctl -l status ntpdate
● ntpdate.service - Set time via NTP Loaded: loaded (/usr/lib/systemd/system/ntpdate.service; enabled; vendor preset: disabled) Active: active (exited) since Seg 2020-02-03 18:21:44 -03; 3min 12s ago Main PID: 6107 (code=exited, status=0/SUCCESS) Fev 03 16:34:24 ol77-ldap2.prego.eti.br systemd[1]: Starting Set time via NTP... Fev 03 18:21:44 ol77-ldap2.prego.eti.br systemd[1]: Started Set time via NTP.