Pular para o conteúdo principal

Centralização de informações com LDAP


OpenLDAP - Servidor de diretórios


Introdução


Servidor de diretórios, similar a um Banco de Dados, mas só que voltado a leitura utilizando base de dados mais simples como bdb e entre outros, com uma estrutura que lembra um sistema de diretório.

A principal utilização é centralizar informações onde podemos usar para autenticação, agenda e entre outros de forma que irá integrar e facilitará o gerenciamento de usuários e recursos.

Antes disso uma breve descrição


Atributo → Atributos são valores que iremos armazenar, exemplo uid=rafael ( uid é atributo onde o valor é rafael ).

ObjectClass → É um conjunto de atributos onde terá uma organização definida, exemplo PosixAccount ( objeto que tem como atributos uid, mail e entre outros ).

Schema → São um conjunto de ObjectClass onde que é uma estrutura inteira para utilização de qual forma você irá configurar.

Estrutura


Máquina virtual Debian 7.5 com 256MB que poderá disponibilizar recursos para mais de 300 usuários.

Instalação


Openssl → Integração segura utilizando criptografia.
Sasl → Autenticação simples.
Ldap-utils → Ferramentas para gerenciamento e consulta da base ldap.
Slapd → Serviço LDAP.

# apt-get install openssl db5.1-util sasl2-bin slapd ldap-utils

Iremos deparar com a definição da senha para o usuário administrador da base:




























Com essa senha utilizaremos para adicionar informações a nossa base de dados a partir do usuário admin administrador serviço.

Estrutura


A nossa base ldap será constituida no padrão DN ( Distinguished Name ).

Essa estrutura DN comporta como um domínio, como assim? Terá um domínio principal que será o nosso DN como newphonesevoip.com.br que dentro dessa base principal conterá nossa estrutura de diretórios.

DN componente de domínio

Em nossa base de diretório terá o domínio subdividido em DC ( Domain Componente ), ficando dessa forma:

dominio:      newphonesevoip.com.br 

E nosso DN ficaria dessa forma:

dn: dc=newphonesevoip,dc=com,dc=br

Então até aqui sabemos DN e DC e veremos que essa estrutura armazena informações de forma estruturada em diretório ( atributos ) e dentro desse diretório contem informações ( valores ).

Unidade Organizacional


Unidade de organização dentro da estrutura. Como por exemplo adicionamos usuários novos em nossa base, mas eles são de São Paulo então criamos uma unidade organizacional ( OU ) chamada SP, dentro dessa mesma OU conterá todos os usuários referente a esse estado.

Em nosso casso mais simples mostraremos a OU que conterá todos os usuários.
ou=usuario, dc=newphonesevoip, dc=com, dc=br

UID ou CN ?


Dentro dessa estrutura alguns conjunto de informações precisão ter uma identificação unica, hoje se utiliza muito um atributo mail, mas em outras bases de dados muito administradores utiliza uid que é o login que o usuário utiliza.

uid=rafael, ou=usuarios, dc=newphonesevoip, dc=com, dc=br

Atributos


As informações dentro do LDAP constitui de atributos que são variaveis que contem dados que está armazenado na base.

userPassword=[SENHA], uid=rafael, ou=usuarios, dc=newphonesevoip, dc=com, dc=br

Senha é o conteúdo ( dados ) do atributo userPassword, resalto que toda nossa base é constituida de atributos e valores.

LDIF


Para adicionar informações informações em nossa base precisamos estruturar essas informações em um arquivo texto comum, esse arquivo conterá um mapa de informações para que seja adicionado, seguinte arquivo:

dn: cn=admin,dc=newphonesevoip,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: 9aTVXNnpYOTBYd1llUmx5eldWUW9tZzM2cXFYWjZhMXQ=
entryCSN: 20140611004506.164787Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20140611004506Z
...

Esse arquivo é só um exemplo.

Configuração


O arquivo de configuração do ldap é de certe forma completo, contendo flags simples de configuração e estrutura de ACL flexivel.

ACL


Podemos utilizar ACL ( Access Control List ) para que nossa base sejá segura evitando que uma consulta simples haja informações como hash da senha de usuário e entre outros, isso é apenas um dos exemplos que já vem por padrão configurado.

INDEX


Essa flag irá definir os atributos a serem indexados para que futuras consultas sejão realizadas de maneira muito rápida para que nossa base sejá mais robusta em consultas frequentes.

Arquivo de configuração


Podemos começar pelo arquivo de configuração do serviço SLAPD, mostrando alguns dos parametros básico para nossa administração.

root@serv-ldap:/etc/ldap# cat slapd.conf
# Versão do protocolo V2 - compativel com todos dispositivos
allow bind_v2

# Schemas e definiçoes de classes de objetos
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema

# Arquivo de controle do processo
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args

# Modulos
modulepath /usr/lib/ldap
moduleload back_bdb

# Tipo da base
backend bdb

# Base de dados
database bdb

# Estrutura de diretorio e administrador
suffix "dc=newphonesevoip,dc=com,dc=br"
rootdn "cn=admin,dc=newphonesevoip,dc=com,dc=br"
rootpw {SSHA}l8BdZ+3NKUOB8YdKIU0hToBpCT8Z5ZC9

# Local de armazenamento da base
directory /var/lib/ldap

Nessa configuração básica iremos ver que é bem simples. E com isso após restarta o serviço veremos no log:
Jun 10 22:53:39 serv-ldap slapd[10093]: daemon: shutdown requested and initiated.
Jun 10 22:53:39 serv-ldap slapd[10093]: slapd shutdown: waiting for 0 operations/tasks to finish
Jun 10 22:53:39 serv-ldap slapd[10093]: slapd stopped.
Jun 10 22:53:39 serv-ldap slapd[10157]: @(#) $OpenLDAP: slapd (Apr 23 2013 12:16:04) $#012#011root@lupin:/tmp/buildd/openldap-2.4.31/debian/build/servers/slapd
Jun 10 22:53:39 serv-ldap slapd[10158]: slapd starting

E o serviço esta ativo e rodando normalmente:
root@serv-ldap:/etc/ldap# netstat -nltp
Conexões Internet Ativas (sem os servidores)
Proto Recv-Q Send-Q Endereço Local Endereço Remoto Estado PID/Program name
tcp 0 0 0.0.0.0:389 0.0.0.0:* OUÇA 10158/slapd
tcp6 0 0 :::389 :::* OUÇA 10158/slapd


Cadastrando informação

Nosso primeiro LDIF conterá a informação base do nosso LDAP e com isso adicionaremos nosso DN e dentro dele dois OU ( diretórios ) e dentro dele cadastrar nosso grupo, usuários e outras informações.

Criaremos um diretório para organizar nosso ldif
root@serv-ldap:/etc/ldap# mkdir -p /root/slapd/newphones

E dentro dele criaremos nosso registro começando com a base:
root@serv-ldap:/etc/ldap# cd /root/slapd/newphones

root@serv-ldap:~/slapd/newphones# vi DN.ldif

dn: dc=newphonesevoip,dc=com,dc=br
dc: newphonesevoip
o: NewPhoneseVoip
objectClass: top
objectClass: domain

Logo no conteúdo temos o dominio principal da forma como DN e os objectClass que são como um dicionario que contem atributos para nosso registro.

Iremos criar as unidades organizacional OU que conterá os nosso registro dentro da nossa base conforme o conteúdo a seguir:
root@serv-ldap:~/slapd/newphones# vi OU.ldif
dn: ou=Grupos,dc=newphonesevoip,dc=com,dc=br
ou: Grupos
objectClass: top
objectClass: organizationalUnit


dn: ou=Usuarios,dc=newphonesevoip,dc=com,dc=br
ou: Usuarios
objectClass: top
objectClass: organizationalUnit

Duas unidade organizacional que irá conter nossos registro, atentando-se ao objectClass novo que é o organizationUnit que diz que os atributos necessários terão dentro desse objeto, como “ou”.

Adicionaremos nosso registro dentro da OU grupos conforme o exemplo abaixo:
root@serv-ldap:~/slapd/newphones# cat grupos.ldif
dn: cn=root,ou=Grupos,dc=newphonesvoip,dc=com,dc=br
objectClass: posixGroup
objectClass: top
cn: root
userPassword: {crypt}x
gidNumber: 0


dn: cn=administrador,ou=Grupos,dc=newphonesevoip,dc=com,dc=br
objectClass: posixGroup
objectClass: top
cn: administrador
userPassword: {crypt}x
gidNumber: 1600


dn: cn=usuarios,ou=Grupos,dc=newphonesevoip,dc=com,dc=br
objectClass: posixGroup
objectClass: top
cn: administrador
userPassword: {crypt}x
gidNumber: 1601

Nessa saida conseguimos vizualizar nossos registros dentro da OU que são respectivamente o grupo “root” e “administrador”. Dentro desse grupo contem informações como a senha do grupo e a identificação do grupo que iremos amarrar gid nos nossos usuarios.

E por último adicionaremos os nosso usuarios principais:
root@serv-ldap:~/slapd/newphones# cat usuario.ldif

# Usuario Root, ID = 0
dn: uid=root,ou=Usuarios,dc=newphonesevoip,dc=com,dc=br
uid: root
cn: root
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$6$LoP5FlPE$tjzaioZU87XSqw3CahRyrbPynvF1KGJbnD6Zx4e1UGnmRPim4HDHgm7xTX/Cy3blspeXNH2Y42L6XWnqJoBdz0
shadowLastChange: 16209
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
homeDirectory: /root
gecos: root

# Usuario Root, ID = 1600
dn: uid=suporte,ou=Usuarios,dc=newphonesevoip,dc=com,dc=br
uid: suporte
cn: Suporte
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {SSHA}q3XD6lJSuOKFgkT43ypDkAtsRbtOXq3Y
shadowLastChange: 16209
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1600
gidNumber: 1600
homeDirectory: /home/suporte
gecos: suporte
...

Esses registro serão adicionados dentro da OU usuários.

Adicionando na base com comando “ldapadd”:
root@serv-ldap:~/slapd/newphones# ls
DN.ldif grupos.ldif OU.ldif usuario.ldif


root@serv-ldap:~/slapd/newphones# ldapadd \
-D ”cn=admin,dc=newphonesevoip,dc=com,dc=br" -W -f DN.ldif -x


Enter LDAP Password:
adding new entry "dc=newphonesevoip,dc=com,dc=br"

Simples assim, nosso ldif funcionou corretamente e podemos ver que no final docomando ldapadd a entreda do registro.

Para verificarmos podemos ver com o comando:
root@serv-ldap:~/slapd/newphones# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <dc=newphonesevoip,dc=com,dc=br> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# newphonesevoip.com.br
dn: dc=newphonesevoip,dc=com,dc=br
dc: newphonesevoip
o: NewPhoneseVoip
objectClass: top
objectClass: domain

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Estamos quase lá após isso adicionamos o OU, grupos e usuarios, logo após consultaremos a base:
root@serv-ldap:~/slapd/newphones# ldapsearch -x -LLL dn
dn: dc=newphonesevoip,dc=com,dc=br

dn: ou=Grupos,dc=newphonesevoip,dc=com,dc=br

dn: ou=Usuarios,dc=newphonesevoip,dc=com,dc=br

dn: uid=root,ou=Usuarios,dc=newphonesevoip,dc=com,dc=br

dn: uid=suporte,ou=Usuarios,dc=newphonesevoip,dc=com,dc=br

dn: cn=root,ou=Grupos,dc=newphonesevoip,dc=com,dc=br

dn: cn=administrador,ou=Grupos,dc=newphonesevoip,dc=com,dc=br  

dn: cn=usuarios,ou=Grupos,dc=newphonesevoip,dc=com,dc=br
...

Dessa forma não conseguimos ver de uma maneira estruturada e compreensível. Mas consultaremos utilizando o Apache Directory.

Integração


Iremos integrar a autenticação do sistema no ldap, com isso precisamos instalar algumas dependência que fará com que o sistema se autentique através de PAM ( Módulo de autenticação plugavel ).

Para instalação digitamos:
root@serv-ldap:~# apt-get install libpam-ldap libnss-ldap

Editamos o aruivo de configuração:
root@serv-ldap:~# vim /etc/libnss-ldap.conf

# Base DN
base dc=newphonesevoip,dc=com,dc=br

# Servidor LDAP
uri ldap://ldap.newphonesevoip.com.br

# Admin
rootbinddn cn=admin,dc=newphonesevoip,dc=com,dc=br

Habilitando no sistema no nsswitch.conf:
root@serv-ldap:~# vi /etc/nsswitch.conf

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

Nessa regra ele dará preferencia a autenticação dos usuários do sistema ( /etc/passwd ) e depois do ldap que é no servidor de diretórios.

Pronto agora o sistema esta integrado em nosso LDAP interno.

Conclusão

Servidor de diretório é um excelente aliando para centralização de informações. Podemos manipular e adiquirir diversos recursos como alguns citados aqui.

Bibliografia




Comentários

Postagens mais visitadas deste blog

QOS Intermediário - Implantação em cliente real

Implantação de QOS - Intermediário Introdução Nessa etapa seguiremos novamente o caminho do controle de tráfego, mas com uma pitada mais avançada delimitando por classes e em tempo real. Nessa video aula trará um pouco de shell-script junto com controle de tráfego e passando um pouco que vai ser um dos próximos tópicos que é o ZABBIX. O video realmente ficou extenso, porque tentei documentar ao máximo cada parte e explicar o porque da utilização de cada função.

Zabbix - Entendendo Agentes

Zabbix Agente - Instalação e configuração Introdução O Zabbix trabalha em sua estrutura basicamente duas funções como: Gerente - Zabbix que armazena informações e entre outras, agindo como Servidor ) Agente - Zabbix instalado em hosts que coleta informações para serem enviadas ao gerente.  O que iremos entender nesse tutorial é os modos como os agentes trabalha ativo e passivo. Ativo - Ele envia os dados para o servidor ( gerente ), muito utilizado quando o host está em outras redes através de firewall. Passivo - Ele aguarda solicitação do servidor ( gerente ) para a entrega dos dados. A configuração do agente e de acordo com as nossas necessidades no momento.

IDS Sistema detecção de intrusão - FAIL2BAN

IDS com FAIL2BAN Introdução IDS é um sistema de detecção de intrusos que podemos implementar em dois segmentos em rede e sistema. Iremos abordar o fail2ban, uma poderosa ferramenta contra tentativas de força bruta ( meio de ataque através de diversas tentativas de acesso ), esse serviço é muito utilizado em servidores que respondem diretamente a internet, a configuração acaba sendo muito útil para bloqueio sendo sua principal vantagem a velocidade. Funcionamento Partindo de analises rigorosas de log como tentativas repetitivas de falhas como por exemplo em uma tentativa de acesso via SSH em nosso firewall: Jun 28 20:24:13 serv-firewall unix_chkpwd[1491]: password check failed for user (root) Jun 28 20:24:13 serv-firewall sshd[1489]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost= 192.168.122.1 user= root Jun 28 20:24:15 serv-firewall sshd[1489]: Failed password for root from 192.168.122.1 port