Menu Principal

terça-feira, 17 de abril de 2012

LDAP

Fonte: http://sites.google.com/site/brenosobral/linux/ldap


- slapd: este é daemon isolado do LDAP. Ele escuta por conexões LDAP na porta 389 (636 para SSL)
- slurpd: este prorroga as alterações de um banco de dados LDAP para outra topologia mestre/escrava em uso.

Arquivo de configuração
/etc/openldap/slapd.conf ou /etc/ldap/sldapd.conf

LDAP significa Lightweight Directory Access Protocol, ou seja, Protocolo de Leve Acesso a Diretórios. Como o nome sugere, é um protocolo leve para acessar serviços de diretório. O LDAP roda em cima do protocolo TCP/IP ou outras conexões de transferência de serviços.
A forma de armazenamento dos dados em um servidor de Diretórios segue a hierarquia dos objetos a que pertence a entrada. No exemplo abaixo, para identificarmos o usuário, teremos algo como:
cn=Joao Maria,ou=People,o=empresa,st=para,c=br
Este tipo de entrada é chamada de DN (Distinguished Name) ou nome único. O DN deve sempre indicar todos os ramos da árvore LDAP, desde a base (dc=br) até a parte final, a identificação do usuário propriamente dita.

OBS: o DN deve ser único em todo o Diretório LDAP.
OBS: DIT é o topo da árvore de direorio (exemplo: dc=exemplo,dc=com,dc=br)
OBS: o serviço de LDAP pode ser acesso via LDAP URL's. Exemplo: ldap(s)://host:port/dn?attributes?scope?filter?extensions.

Uma outra forma de construir sua árvore de Diretórios é utilizando componentes de dominio Internet (dc).  Desta forma o LDAP fica que nem o DNS, exemplo:
uid=joao.maria,ou=People,dc=exemplo,dc=com,dc=br

ObjectClass
O LDAP permiti que você controle quais atributos são necessários ou quais são permitidos para uma entrada, por meio de um atributo especial chamado objectClass. Por exemplo, para cadastrarmos o topo da árvore do Diretório (dc=exemplo,dc=com,dc=br), devemos utilizar uma objectClass do tipo dcObject (Objetos Componentes de Dominios); cara criação de uma unidade organizacional (ou=People,dc=exemplo,dc=com,dc=br), utilizamos organizationaUnit; e de modo geral, para usuários, utilizamos inetOrgPerson.

Criação de arquivo LDIF

Criando o DIT
#arquivo empresa.ldif
dn: dc=exemplo,dc=com,dc=br
objectClass: dcObject
objectClass: organization
o: Exemplo Ltda
dc: exemplo

# ldapadd -x -h servidor -D "cn=admin,dc=exemplo,dc=com,dc=br" -f empresa.ldif –W
Onde:
-x : autenticação simples
-h : servidor ldap
-D : usuário que fará a operação
-f : indica o nome do arquivo ldif
-W : solicita a senha para ser executa (poderia usar -w <senha>)


Criando as Unidades  Organizacionais
#arquivo unidades.ldif
dn: ou=People,dc=exemplo,dc=com,dc=br
objectClass: top
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=exemplo,dc=com,dc=br
objectClass: top
objectClass: organizationalUnit
ou: Group

# ldapadd -x -h servidor -D "cn=admin,dc=exemplo,dc=com,dc=br" -f unidades.ldif –W


Criando um Usuário
#arquivo usuario.ldif
dn: uid=joa.maria,ou=People,dc=exemplo,dc=com,dc=br
cn: Joao Maria
sn: Silva
givenName: Joao
uid: joao.maria
uidNumber: 10000
gidNumber: 1000
homeDirectory: /home/joao.maria
loginShell: /bin/bash
gecos: Joao Maria
mail: joao.maria@exemplo.com.br
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword: dsdsadasdasdasdsa

# ldapadd -x -h servidor -D "cn=admin,dc=exemplo,dc=com,dc=br" -f unidades.ldif –W



Removendo um DN de uma Base de LDAP
Exemplo, neste caso vamos remover o DN uid=joa.maria,ou=People,dc=exemplo,dc=com,dc=br

# ldapdelete -x -D "cn=admin,dc=exemplo,dc=com,dc=br" -W -v "uid=joa.maria,ou=People,dc=exemplo,dc=com,dc=br"



Modificando um DN de uma Base de LDAP
changetype - indica o tipo de ação a ser realizada que é modificar um registro existente, sendo as ações possíveis:
  -add: um atributo será acrescentado à entrada; caso este atributo já exista, será acrescentado mais um valor ao atributo.
  -delete: remove o valor daquele atributo e, caso este valor seja único, remove o atributo.
  -replace: substitui o valor do atributo pelo valor indicado.

Exemplo (changetype add)
#arquivo mudanca.ldif
dn: cn=Internet,ou=Group,dc=exemplo,dc=com,dc=br
changetype: modify                    ---> Estou dizendo que vou modificar o atributo do DN
add: memberUid                        ---> Estou dizendo que irei acrescentar um atributo
memberUid: joa.maria                    ---> O atributo que estou adicionando

OBS: Nesta entrada (DN), existe vários atributos memberUid, os quais seriam os usuários que pertencem ao grupo Internet.

# ldapmodify -x -D "cn=admin,dc=exemplo,dc=com,dc=br" -W -f mudanca.ldif

Exemplo (changetype replace)
#arquivo mudanca.ldif
dn: uid=joa.maria,ou=People,dc=exemplo,dc=com,dc=br"   
changetype: modify                    --> Estou dizendo que vou modificar o atributo do DN
replace: userPassword                    ---> Estou dizendo que irei alterar o valor de um atributo
userPassword: senhanova                    --> O atributo que estou alterando

# ldapmodify -x -D "cn=admin,dc=exemplo,dc=com,dc=br" -W -f mudanca.ldif

Exemplo (changetype delete)
#arquivo mudanca.ldif
dn: cn=Internet,ou=Group,dc=exemplo,dc=com,dc=br
changetype: modify                    ---> Estou dizendo que vou modificar o atributo do DN
delete: memberUid                    ---> Estou dizendo que irei deletar um atributo
memberUid: joao.maria                    ---> O atributo que estou deletando

OBS: Nesta entrada (DN), existe vários atributos memberUid, os quais seriam os usuários que pertencem ao grupo Internet.

# ldapmodify -x -D "cn=admin,dc=exemplo,dc=com,dc=br" -W -f mudanca.ldif


Pesquisando uma Base Ldap
Sintaxe
ldasearch [opções] [filtros] [atributos ...]
-x :        autenticação simples
-h :        servidor ldap
-b :        base de pesquisa
-L :        formato da saída do LDIF. Se omitido é utilizado o formato estendido, pode ser -LL (suprime comentários) e -LLL (suprime versão)
[filtros] :    condição de pesquisa, se omitido assume '(objectClass)'
[atributos] :    atributos que devem ser retornados na pesquisa

Exemplos:
# ldapsearch -x '(objectClass)'
# ldapsearch -x '(cn=br*)'
# ldapsearch -x -LLL



Comandos úteis
* Para criar uma copia de segurança da base do servidor OpenLDAP execute:
# slapcat -l copia.ldif

* Para restaurar uma copia de segurança da base do servidor OpenLDAP execute:
# slapadd -l copia.ldif

* Para reindexar a base do servidor OpenLDAP execute:
# slapindex

* Testa os arquivos de configurações
# slaptest

* ara alterar a senha de uma entrada LDAP
# ldappasswd

* Gerar um senha SSHA
# slappasswd -h {SSHA}

* Para recuperar a base do servidor OpenLDAP, dentro da pasta /var/lib/ldap execute:
# db4.2_recover


PAM - LDAP
OBS:  To control the ldap based authentication through the PAM, Auth is not a required test.

[root@caete pam.d]# cat login
#%PAM-1.0
auth       required    pam_securetty.so
auth       required    pam_stack.so service=system-auth
auth       required    pam_nologin.so
account    required    pam_stack.so service=system-auth
password   required    pam_stack.so service=system-auth
session    required    pam_stack.so service=system-auth
session    optional    pam_console.so
[root@caete pam.d]# cat system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok        ---> Local autenticação
auth        sufficient    /lib/security/$ISA/pam_ldap.so use_first_pass            ---> LDAP autenticação
auth        required      /lib/security/$ISA/pam_deny.so

account     required      /lib/security/$ISA/pam_unix.so
account     sufficient    /lib/security/$ISA/pam_localuser.so

password    required      /lib/security/$ISA/pam_cracklib.so retry=3
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password    sufficient    /lib/security/$ISA/pam_ldap.so use_authtok
password    required      /lib/security/$ISA/pam_deny.so

session optional /lib/security/$ISA/pam_mkhomedir.so silent umask=0027
session     required      /lib/security/$ISA/pam_limits.so
session     required      /lib/security/$ISA/pam_unix.so
session     optional      /lib/security/$ISA/pam_ldap.so




Exemplo de LDAP com SAMBA
/etc/ldap/slapd.conf

#######################################################################
# Secção Global
#######################################################################

# Permite LDAPv2
allow bind_v2

# Definições de Schema e objectClass
include        /etc/ldap/schema/core.schema
include        /etc/ldap/schema/cosine.schema
include        /etc/ldap/schema/nis.schema
include        /etc/ldap/schema/misc.schema
include        /etc/ldap/schema/inetorgperson.schema
include        /etc/ldap/schema/samba.schema

# Permite a checagem dos "schemas" forçando entradas serem verificadas
# através de seus respectivos objectclass
schemacheck    on

# Onde o arquivo .pid está. O script /e/tc/init.d/slapd
# não conseguirá parar o serviço se você alterar isso.
pidfile        /var/run/slapd/slapd.pid

# Lista dos argumentos que são passados ao servidor
argsfile        /var/run/slapd/slapd.args

# ===== Habilita a geracao de log's =====
# Quando em producao colocar 0 se nao precisar de log
loglevel    256

# Diretorio dos modulos dinamicos
modulepath    /usr/lib/ldap
moduleload    back_bdb

#======================================================================
# Descomente as seguintes linhas para habilitar o SSL e usar o 
# certificado default snakeoil.
#TLSCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
#TLSCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
#======================================================================


########################################################################
## Secção Específica para Backend,
##                 do tipo bdb:
########################################################################
backend        bdb

########################################################################
### Secção Específica para:
###             Database #1 dc=teste:
#########################################################################
database    bdb

## A base de diretório
suffix        "dc=teste"

## Usuario LDAP_ROOT_DN
rootdn        cn=admin,dc=teste

## Senha do LDAP_ROOT_DN criptografada com
##  slappasswd -h {SSHA} -s testesenha
rootpw        {SSHA}jHhKoD6nS4yHSkJyS9qkoyPYuSMzsZwS

## Checkpoint do dtabase bdb após 256kb escritos ou 5 minutos terem passado
## desde o último checkpoint
checkpoint 256 5

## Onde os arquivos do database são fisicamente armazenados
directory    "/var/lib/ldap"

## Estruturas de Indices
index    cn,sn,uid,displayName                pres,sub,eq
index    memberUID,mail,givenname            eq,subinitial
index    objectClass,uidNumber,gidNumber            eq
index    sambaSID,sambaPrimaryGroupSID,sambaDomainName    eq
index    uniqueMember,entryCSN,entryUUID            eq

## Armazenar a data/hora que os registros forem modificados
lastmod on

## Os campos sambaLMPassword,sambaNTPassword,userPassword,
## sambaPasswordHistory e sambaPwdLastSet podem ser alterados
## pelos prórios usuários - se iverem se autenticado.
## Outros usuários não podem Ver estes campos.
access to attrs=sambaLMPassword,sambaNTPassword,userPassword,sambaPasswordHistory,sambaPwdLastSet
    by dn="cn=admin,dc=teste" write
    by anonymous auth
    by self write
    by * none


## Note that this is covered by the 'access to *'
## ACL below too but if you change that as people
## are wont to do you'll still need this if you
## want SASL (and possible other things) to work 
## happily.
access to dn.base="" by * read

## O dn administrador tem acesso completo, o restante 
## podem apenas Ler.
access to *
    by dn="cn=admin,dc=teste" write
    by * read



Exemplo do LDAP SLAVE:
/etc/ldap/slapd.conf

# This is the main slapd configuration file. See slapd.conf(5) for more
# info on the configuration options.

#######################################################################
# Global Directives:

# Features to permit
#allow bind_v2

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile         /var/run/slapd/slapd.pid

# List of arguments that were passed to the server
argsfile        /var/run/slapd/slapd.args

# Read slapd.conf(5) for possible values
loglevel        none

# Where the dynamically loaded modules are stored
modulepath      /usr/lib/ldap
moduleload      back_hdb

# The maximum number of entries that is returned for a search operation
sizelimit 500

# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
tool-threads 1

#######################################################################
# Specific Backend Directives for hdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend         hdb

#######################################################################
# Specific Backend Directives for 'other':
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
#backend                <other>

#######################################################################
# Specific Directives for database #1, of type hdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        hdb

# The base of your directory in database #1
#suffix          "dc=dg,dc=teste"
suffix          "dc=teste"
rootdn          "uid=admin,ou=Usuarios,dc=teste"
rootpw          {SSHA}V+UUol0tJnPQdnRMinAwYxaoB/kVaD8u



# rootdn directive for specifying a superuser on the database. This is needed
# for syncrepl.
# rootdn          "uid=admin,ou=Usuarios,dc=teste"

# Where the database file are physically stored for database #1
directory       "/var/lib/ldap"

# The dbconfig settings are used to generate a DB_CONFIG file the first
# time slapd starts.  They do NOT override existing an existing DB_CONFIG
# file.  You should therefore change these settings in DB_CONFIG directly
# or remove DB_CONFIG and restart slapd for changes to take effect.

# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM
dbconfig set_cachesize 0 2097152 0

# Sven Hartge reported that he had to set this value incredibly high
# to get slapd running at all. See http://bugs.debian.org/303057 for more
# information.

# Number of objects that can be locked at the same time.
dbconfig set_lk_max_objects 1500
# Number of locks (both requested and granted)
dbconfig set_lk_max_locks 1500
# Number of lockers
dbconfig set_lk_max_lockers 1500

# Indexing options for database #1
index           objectClass eq
index           cn,sn eq
###########
index           entryCSN eq
index           entryUUID eq
##########
syncrepl        rid=001
                provider=ldap://10.10.48.2
                binddn="uid=admin,ou=Usuarios,dc=teste"
                bindmethod=simple
                credentials=@testesenha
                searchbase="dc=teste"
                filter="(objectClass=*)"
                attrs="*,+"
                type=refreshOnly
                interval=00:00:05:00
                retry="60 10 300 3"
                scope=sub
updateref ldap://10.10.48.2
############
###########
#index   cn,sn,uid,displayName                           pres,sub,eq
#index   memberUID,mail,givenname                        eq,subinitial
#index   objectClass,uidNumber,gidNumber                 eq
##########

# Save the time that the entry gets modified, for database #1
lastmod         on

# Checkpoint the BerkeleyDB database periodically in case of system
# failure and to speed slapd shutdown.
checkpoint      512 30

# Where to store the replica logs for database #1
# replogfile    /var/lib/ldap/replog

# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
access to attrs=userPassword,shadowLastChange
        by dn="uid=admin,ou=Usuarios,dc=teste" write
        by anonymous auth
        by self write
        by * none

# Ensure read access to the base for things like
# supportedSASLMechanisms.  Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.
# Note that this is covered by the 'access to *'
# ACL below too but if you change that as people
# are wont to do you'll still need this if you
# want SASL (and possible other things) to work
# happily.
access to dn.base="" by * read

# The admin dn has full write access, everyone else
# can read everything.
access to *
        by dn="uid=admin,ou=Usuarios,dc=teste" write
        by * read

# For Netscape Roaming support, each user gets a roaming
# profile for which they have write access to
#access to dn=".*,ou=Roaming,o=morsnet"
#        by dn="uid=admin,ou=Usuarios,dc=teste" write
#        by dnattr=owner write

#######################################################################
# Specific Directives for database #2, of type 'other' (can be hdb too):
# Database specific directives apply to this databasse until another
# 'database' directive occurs
#database        <other>

# The base of your directory for database #2
#suffix         "dc=debian,dc=org"



OBS:

No servidor master acrescente as seguintes linhas no /etc/ldap/slapd.conf

moduleload syncprov
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
#mais os indexes
index           entryCSN eq
index           entryUUID eq

Como estamos acrescentando novos índices:
# /etc/init.d/slapd stop
# slapindex -v
# chown openldap: /var/lib/ldap/*
# /etc/init.d/slapd start

Nenhum comentário:

Postar um comentário