Série RHCSA: Configurando Autenticação Baseada em LDAP no RHEL 7 – Parte 14

Vamos começar este artigo delineando alguns conceitos básicos do LDAP (o que é, onde é usado e porquê) e mostrar como configurar um servidor LDAP e configurar um cliente para autenticar-se contra ele usando sistemas Red Hat Enterprise Linux 7.

RHCSA Series: Setup LDAP Server and Client Authentication – Part 14

Como veremos, existem vários outros cenários de aplicação possíveis, mas neste guia vamos focar exclusivamente na autenticação baseada em LDAP. Além disso, por favor, tenha em mente que devido à vastidão do assunto, vamos cobrir apenas o básico aqui, mas você pode consultar a documentação detalhada no resumo para mais detalhes.

Por essa mesma razão, você notará que decidi deixar de fora várias referências às páginas de manual das ferramentas LDAP por uma questão de brevidade, mas as explicações correspondentes estão a um clique de distância (man ldapadd, por exemplo).

Dito isso, vamos começar.

Nosso Ambiente de Teste

Nosso ambiente de teste consiste em duas máquinas RHEL 7:

Server: 192.168.0.18. FQDN: rhel7.mydomain.com
Client: 192.168.0.20. FQDN: ldapclient.mydomain.com

Se desejar, você pode usar a máquina instalada na Parte 12: Automatizar instalações RHEL 7 usando Kickstart como cliente.

O que é o LDAP?

LDAP significa Protocolo de Acesso a Diretórios Leves e consiste em um conjunto de protocolos que permite a um cliente acessar, através de uma rede, informações armazenadas centralmente (como um diretório de shells de login, caminhos absolutos para diretórios pessoais e outras informações típicas de usuários do sistema, por exemplo) que devem ser acessíveis de diferentes lugares ou disponíveis para um grande número de usuários finais (outro exemplo seria um diretório de endereços residenciais e números de telefone de todos os funcionários de uma empresa).

Manter tais informações (e mais) centralmente significa que elas podem ser mais facilmente mantidas e acessadas por todos que receberam permissão para utilizá-las.

O diagrama a seguir oferece um diagrama simplificado do LDAP, e é descrito abaixo com mais detalhes:

LDAP Diagram

Explicação do diagrama acima em detalhes.

  1. Uma entrada em um diretório LDAP representa uma única unidade de informação e é identificada de forma única pelo que é chamado de Nome Distinto.
  2. Um atributo é uma informação associada a uma entrada (por exemplo, endereços, números de telefone de contato disponíveis e endereços de e-mail).
  3. Cada atributo é atribuído a um ou mais valores que consistem em uma lista separada por espaços. Um valor que é único por entrada é chamado de Nome Distinto Relativo.

Dito isso, vamos prosseguir com as instalações do servidor e do cliente.

Instalando e Configurando um Servidor e Cliente LDAP

Em RHEL 7, o LDAP é implementado pelo OpenLDAP. Para instalar o servidor e o cliente, use os seguintes comandos, respectivamente:

# yum update && yum install openldap openldap-clients openldap-servers
# yum update && yum install openldap openldap-clients nss-pam-ldapd

Uma vez que a instalação estiver completa, há algumas coisas que devemos observar. Os seguintes passos devem ser realizados apenas no servidor, a menos que explicitamente indicado:

1. Certifique-se de que o SELinux não atrapalhe, habilitando os seguintes booleans persistentemente, tanto no servidor quanto no cliente:

# setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0

Onde allow_ypbind é necessário para autenticação baseada em LDAP, e authlogin_nsswitch_use_ldap pode ser necessário por algumas aplicações.

2. Habilite e inicie o serviço:

# systemctl enable slapd.service
# systemctl start slapd.service

Tenha em mente que você também pode desabilitar, reiniciar ou parar o serviço com systemctl também:

# systemctl disable slapd.service
# systemctl restart slapd.service
# systemctl stop slapd.service

3. Como o serviço slapd é executado como o usuário ldap (o que você pode verificar com ps -e -o pid,uname,comm | grep slapd), esse usuário deve ser o proprietário do diretório /var/lib/ldap para que o servidor possa modificar entradas criadas por ferramentas administrativas que só podem ser executadas como root (mais sobre isso em um minuto).

Antes de alterar a propriedade deste diretório recursivamente, copie o arquivo de configuração do banco de dados de exemplo para o slapd nele:

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

4. Configure um usuário administrativo do OpenLDAP e atribua uma senha:

# slappasswd

como mostrado na próxima imagem:

Set LDAP Admin Password

e crie um arquivo LDIF (ldaprootpasswd.ldif) com o seguinte conteúdo:

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}PASSWORD

onde:

  1. SENHA é a string hash obtida anteriormente.
  2. cn=config indica opções de configuração global.
  3. olcDatabase indica um nome de instância de banco de dados específico e geralmente pode ser encontrado dentro de /etc/openldap/slapd.d/cn=config.

Referindo-se ao fundo teórico fornecido anteriormente, o arquivo ldaprootpasswd.ldif adicionará uma entrada ao diretório LDAP. Nessa entrada, cada linha representa um par de atributo: valor (onde dn, changetype, add e olcRootPW são os atributos e as strings à direita de cada dois pontos são seus valores correspondentes).

Você pode querer ter isso em mente enquanto avançamos, e observe que estamos usando os mesmos Nomes Comuns (cn=) ao longo do restante deste artigo, onde cada etapa depende da anterior.

5. Agora, adicione a entrada LDAP correspondente especificando o URI referente ao servidor ldap, onde apenas os campos protocolo/host/porta são permitidos.

# ldapadd -H ldapi:/// -f ldaprootpasswd.ldif 

A saída deve ser semelhante a:

LDAP Configuration

e importe algumas definições básicas do LDAP do diretório /etc/openldap/schema:

# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -H ldapi:/// -f /etc/openldap/schema/$def; done
LDAP Definitions

6. Faça com que o LDAP use seu domínio em seu banco de dados.

Crie outro arquivo LDIF, que chamaremos de ldapdomain.ldif, com o seguinte conteúdo, substituindo seu domínio (no Componente de Domínio dc=) e senha conforme apropriado:

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=mydomain,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=mydomain,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=mydomain,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}PASSWORD

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=Manager,dc=mydomain,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=mydomain,dc=com" write by * read

# ldapmodify -H ldapi:/// -f ldapdomain.ldif
LDAP Domain Configuration

7. Agora é hora de adicionar algumas entradas ao nosso diretório LDAP. Atributos e valores são separados por dois pontos (:) no arquivo a seguir, que chamaremos de baseldapdomain.ldif:

dn: dc=mydomain,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: mydomain com
dc: mydomain

dn: cn=Manager,dc=mydomain,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=People,dc=mydomain,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=mydomain,dc=com
objectClass: organizationalUnit
ou: Group

Adicione as entradas ao diretório LDAP:

# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f baseldapdomain.ldif
Add LDAP Domain Attributes and Values

8. Crie um usuário LDAP chamado ldapuser (adduser ldapuser), em seguida, crie as definições para um grupo LDAP em ldapgroup.ldif.

# adduser ldapuser
# vi ldapgroup.ldif

Adicione o seguinte conteúdo.

dn: cn=Manager,ou=Group,dc=mydomain,dc=com
objectClass: top
objectClass: posixGroup
gidNumber: 1004

onde gidNumber é o GID em /etc/group para ldapuser) e carregue-o:

# ldapadd -x -W -D "cn=Manager,dc=mydomain,dc=com" -f ldapgroup.ldif

9. Adicione um arquivo LDIF com as definições para o usuário ldapuser (ldapuser.ldif):

dn: uid=ldapuser,ou=People,dc=mydomain,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: ldapuser
uid: ldapuser
uidNumber: 1004
gidNumber: 1004
homeDirectory: /home/ldapuser
userPassword: {SSHA}fiN0YqzbDuDI0Fpqq9UudWmjZQY28S3M
loginShell: /bin/bash
gecos: ldapuser
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0

e carregue-o:

# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f ldapuser.ldif
LDAP User Configuration

Da mesma forma, você pode excluir a entrada do usuário que acabou de criar:

# ldapdelete -x -W -D cn=Manager,dc=mydomain,dc=com "uid=ldapuser,ou=People,dc=mydomain,dc=com"

10. Permita a comunicação através do firewall:

# firewall-cmd --add-service=ldap

11. Por último, mas não menos importante, habilite o cliente para autenticar usando o LDAP.

Para nos ajudar neste último passo, usaremos o utilitário authconfig (uma interface para configurar recursos de autenticação do sistema).

Usando o seguinte comando, o diretório home para o usuário solicitado é criado se não existir após a autenticação contra o servidor LDAP ter sucesso:

# authconfig --enableldap --enableldapauth --ldapserver=rhel7.mydomain.com --ldapbasedn="dc=mydomain,dc=com" --enablemkhomedir --update
LDAP Client Configuration

Resumo

Neste artigo, explicamos como configurar a autenticação básica contra um servidor LDAP. Para configurar ainda mais o setup descrito no guia atual, consulte o Capítulo 13 – Configuração LDAP no guia do administrador de sistema do RHEL 7, prestando especial atenção às configurações de segurança usando TLS.

Sinta-se à vontade para deixar quaisquer perguntas que possa ter usando o formulário de comentários abaixo.

Source:
https://www.tecmint.com/setup-ldap-server-and-configure-client-authentication/