(PDC)
Um PDC é um ...
INSTALACÃO DO OPENLDAP SERVER E UTILITÁRIOS
# apt-get update ; apt-get install slapd ldap-utils (o pacote "slapd" é o "OpenLDAP Server" em si, ou seja, é o daemon junto com os arquivos de configuração. Já o "ldap-utils" é um conjunto de ferramentas usadas para ler, modificar e configurar o "OpenLDAP Server". Será asolicitada uma senha especifica para uso do administrador do OpenLDAP)
# dpkg-reconfigure slapd (ajuda o configurar os parâmentros do servidor LDAP via dialog. Veja a observação a seguir)
Obs: ao se instalar o OpenLDAP varias informacoes precisam ser passadas como: Omit OpenLDAP Server configuration (NO), o DNS Domain Name (nome do dominio - ex: matrinux.local), Organization Name (nome da organização - ex: MATRINUX - esse é o topo da árvore de diretórios do OpenLDAP - o=MATRINUX - no AD o top é o "dc" em vez do "o"), senha do usuário "admin", Database Backend (HDB), LDAP Version (3) etc. Caso se tenha necessidade de rever/refazer todas essas telas/dialogs, execute novamente "dpkg-reconfigure slapd".
ARQUIVOS DE CONFIGURACAO
# vi /etc/ldap/ldap.conf (o “ldapsearch” só funcionará se esse arquivo for configurado corretamente. Caso contrário terá que informa a BASE "-b" no comando. O “ldapsearch -x” é um comando muito utilizado e será mostrado mais a frente. Ao alterar esse arquivo não há necessidade de restart/reload no daemon do OpenLDAP)
BASE dc=example,dc=com,dc=br (se deve colocar aqui o seu dominio. Ex: "BASE dc=matrix,dc=com,dc=br")
URI ldap://openldap_address/ (se deve colocar aqui o IP ou hostname desse servidor OpenLDAP. Ex: "URI ldap://127.0.0.1/")
PROCURAR OBJETOS (USUÁRIOS/GRUPOS/ETC) DENTRO DA BASE LDAP
# ldapsearch -xLLL (mostra todos os objetos do LDAP. Caso apareçam informações sobre os dados digitados durante a instalação e configuração do LDAP é porque até agora está tudo ok)
# ldapsearch -xLLL -b dc=example,dc=com,dc=br (idem, só que especifica a BASE de procura do LDAP)
# ldapsearch -xLLL -b dc=example,dc=com,dc=br -D cn=admin,dc=matrinux,dc=local -W (idem, só que especifica o usuário "admin" para procurar objetos no LDAP. Será solicitada uma senha. Como esse usuário será possível ver o atributo "userPassword")
(OPENLDAP SERVER SENDO CLIENTE DELE MESMO)
PAM
# apt-get install libpam-ldap libnss-ldap
Obs: aparecerão algumas perguntas. Informe o endereço do LDAP (ldap://127.0.0.1/), o Distinguished Name (dc=example,dc=com,dc=br), versão do LDAP (versão 3), a conta de root do LDAP (cn=admin,dc=example,dc=com,dc=br), a senha de root do LDAP, permitir que o admin/root do LDAP se comporte como um root local (YES), a database do LDAP requer login (NO), conta administrativa do LDAP (cn=admin,dc=example,dc=com,dc=br) e senha da conta administrativa do LDAP.
Conferir arquivos de configuração do NSS-LDAP e PAM-LDAP
# vi /etc/libnss-ldap.conf (confira se os dados estão OK de acordo com o dialog anterior)
# vi /etc/libnss-ldap.secret (a senha do "admin" em texto claro :-()
# vi /etc/pam_ldap.conf (confira se os dados estão OK de acordo com o dialog anterior)
# vi /etc/pam_ldap.secret (a senha do "admin" em texto claro :-()
ARQUIVO DE CONFIGURAÇÃO NAME SERVICE SWITCH
# vi /etc/nsswitch.conf
passwd: compat ldap
group: compat ldap
shadow: compat ldap
ARQUIVOS DE CONFIGURAÇÃO DO PAM
# vi /etc/pam.d/common-account (esse arquivo deve conter somente as linhas a seguir)
account sufficient pam_ldap.so
account required pam_unix.so
# vi /etc/pam.d/common-auth (esse arquivo deve conter somente as linhas a seguir)
auth sufficient pam_ldap.so
auth required pam_unix.so nullok_secure
# vi /etc/pam.d/common-password (esse arquivo deve conter somente as linhas a seguir)
password sufficient pam_ldap.so
password required pam_unix.so nullok obscure min=4 max=8 md5
# vi /etc/pam.d/common-session (esse arquivo deve conter somente as linhas a seguir)
session sufficient pam_ldap.so
session required pam_unix.so
Arquivo de configuração
# /etc/init.d/nscd stop
DEBUG DE PROBLEMA DE AUTENTICAÇÃO
# tail -f /var/log/auth.log
(CONTINUA)
SCHEMA DO SAMBA PARA O OPENLDAP
# apt-get install samba-doc (prove alguns docs e esquemas necessário para a integração do OpenLDAP com o SAMBA)
# zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema (esse esquema é provido pelo pacote "samba-doc")
# ls /etc/ldap/schema/samba.schema
ARQUIVO DE CONFIGURAÇÃO DO OPENLDAP SERVER
# mv /etc/ldap/slapd.d/ /root/
# vi /etc/ldap/slapd.conf
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/ppolicy.schema
include /etc/ldap/schema/samba.schema
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel none
modulepath /usr/lib/ldap
moduleload back_hdb
sizelimit 500
tool-threads 1
backend hdb
database hdb
suffix "dc=example,dc=com,dc=br"
rootdn "cn=admin,dc=example,dc=com,dc=br"
rootpw {SSHA}MxxK8b7rYU2LPels2edXzIntI68wthke (gere esse hash com esse comando "slappasswd -h {SSHA} -s password")
directory "/var/lib/ldap"
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
index objectClass eq,pres
index ou,cn,sn,mail,givenname eq,pres,sub
index uidNumber,gidNumber,memberUid eq,pres
index loginShell eq,pres
index uid pres,sub,eq
index displayName pres,sub,eq
index nisMapName,nisMapEntry eq,pres,sub
index sambaSID eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq
index default sub
index uniqueMember eq
index sambaGroupType eq
index sambaSIDList eq
lastmod on
checkpoint 512 30
access to attrs=userPassword,sambaNTPassword,sambaLMPassword,sambaPwdMustChange,sambaPwdLastSet (os parâmentros que ficam abaixo do "access" precisam estar indentados com espaço ou tab)
    by self write
    by anonymous auth
    by * none
access to attrs=shadowLastChange,shadowMax
    by self write
    by * read
access to *
    by * read
GERAR HASH DE SENHAS (PARA CONHECIMENTO)
# slappasswd -h {MD5} -s qweqwe (hash MD5)
# slappasswd -h {SHA} -s qweqwe (hash SHA)
# slappasswd -h {SSHA} -s qweqwe (hash SHA com SEED)
# slappasswd (o padrão é SSHA)
# slappasswd -h {MD5} (idem, mas mudando o algoritmo de hash)
INDEXAR
# /etc/init.d/slapd stop
# chown -R openldap.openldap /var/lib/ldap/
# su - openldap -s /bin/bash
$ /usr/sbin/slapindex
$ exit
# /etc/init.d/slapd start
# apt-get install samba smbldap-tools (o Samba Server e algumas ferramentas para integração com o LDAP. Será perguntado qual será o "Workgroup/Domain", digite "EXAMPLE.COM.BR" em letras maiúsculas)
CONFIGURAR O SAMBA
# cp /etc/samba/smb.conf /etc/samba/smb.conf.default
# vi /etc/samba/smb.conf
dos charset = CP1251
unix charset = UTF8
display charset = UTF8
workgroup = EXAMPLE.COM.BR (domínio em letras maiúsculas. Já existe por padrão - foi configurado durante a instalação do Samba)
netbios name = EXAMPLE.COM.BR (adicione essa linha. Muda/influência na saída do comando "net getlocalsid")
realm = EXAMPLE.COM.BR (domínio em letras maiúsculas)
server string = %h server (já existe por padrão)
map to guest = Bad User
passdb backend = ldapsam:ldap://127.0.0.1/ (o padrão é "tdbsam", mas mude para "ldapsam:ldap://127.0.0.1/")
pam password change = Yes (já existe por padrão)
passwd program = /usr/sbin/smbldap-passwd -u %u (o padrão é "/usr/bin/passwd %u", mas mude para "/usr/sbin/smbldap-passwd -u %u")
passwd chat = *New*password* %n\n *Retype*new*password* %n\n *all*authentication*tokens*updated* (o padrão é "*Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .")
syslog = 0 (já existe por padrão)
log file = /var/log/samba/log.%m (já existe por padrão)
max log size = 1000 (já existe por padrão)
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
add user script = /usr/sbin/smbldap-useradd -m %u -d /domain/home/%u %u (adicione essa linha)
delete user script = /usr/sbin/smbldap-userdel %u -r %u (adicione essa linha)
add group script = /usr/sbin/smbldap-groupadd -p %g (adicione essa linha)
delete group script = /usr/sbin/smbldap-groupdel %g (adicione essa linha)
add user to group script = /usr/sbin/smbldap-groupmod -m %u %g (adicione essa linha)
delete user from group script = /usr/sbin/smbldap-groupmod -x %u %g (adicione essa linha)
set primary group script = /usr/sbin/smbldap-usermod -g %g %u (adicione essa linha)
add machine script = /usr/sbin/smbldap-useradd -w %u (adicione essa linha)
logon path =
domain logons = Yes (comentada por padrão. Descomente essa linha)
os level = 60
preferred master = Yes
domain master = Yes (adicione essa linha)
dns proxy = No (já existe por padrão)
wins support = No
wins server = 10.1.1.177
ldap admin dn = cn=admin,dc=example,dc=com,dc=br (adicione essa linha)
ldap delete dn = Yes (adicione essa linha)
ldap group suffix = ou=group (adicione essa linha)
ldap idmap suffix = ou=idmap (adicione essa linha)
ldap machine suffix = ou=computer (adicione essa linha)
ldap suffix = dc=example,dc=com,dc=br (adicione essa linha)
ldap ssl = no (adicione essa linha)
ldap user suffix = ou=people (adicione essa linha)
panic action = /usr/share/samba/panic-action %d (já existe por padrão)
map acl inherit = Yes
case sensitive = No
hide unreadable = Yes
level2 oplocks = no
client NTLMv2 auth = Yes
ntlm auth = YES
lanman auth = YES
[netlogon]
path = /var/cache/netlogon
browseable = No
# mkdir /var/cache/netlogon
# smbpasswd -W (define a senha do usuário "admin" [cn=admin,dc=example,dc=local] do LDAP no Samba)
# testparm (testa o arquivo de configuração do Samba "smb.conf"
# /etc/init.d/samba restart
# net rpc getsid
# net getlocalsid (esse comando é guiado pelo "netbios name" no arquivo "smb.conf")
# gunzip /usr/share/doc/smbldap-tools/configure.pl.gz -c > /usr/share/doc/smbldap-tools/configure.pl (esse script é disponibilizado pelo pacote "smbldap-tools")
# perl /usr/share/doc/smbldap-tools/configure.pl (só execute esse comando se os dois anteriores funcionarem)
# vi /etc/smbldap-tools/smbldap.conf (arquivo criado pelo script perl anterior. Não é necessário por causa do script perl, mas caso precise de um exemplo desse arquivo acesse "/usr/share/doc/smbldap-tools/examples/smbldap.conf.gz")
# vi /etc/smbldap-tools/smbldap_bind.conf (arquivo criado pelo script perl anterior. Não é necessário por causa do script perl, mas caso precise de um exemplo desse arquivo acesse "/usr/share/doc/smbldap-tools/examples/smbldap_bind.conf")
# smbldap-populate
# ldapsearch -xLLL (verificar se os objetos do Samba foram criados dentro da base do LDAP)
# getent passwd
# getent group
# net rpc info
# net rpc join
# net rpc testjoin
# /etc/init.d/nscd restart
# smbldap-useradd -a hugo (cria um usuário chamado "hugo". Como o "-a" o usuário vai ter uma conta samba também)
# smbldap-useradd -a -m hugo (cria um usuário chamado "hugo". Como o "-m" diretório home é criado caso ele não exista. Também se pode usar "smbldap-useradd -F '' -C '' -a -m username", assim que o usuário ao logar crie um perfil local, evitando-se tentatar o uso de um perfil remoto)
# smbldap-passwd username (muda a senha de um usuário)
# smbldap-useradd -a -s /bin/false -c "Hugo Azevedo" hugo (adiciona um usuário "hugo", com gecos "Hugo Azevedo" e shell "/bin/false". Quando o shell é "/bin/false" significa que esse usuário não conseguirá logar via TTY ou PTS em sistemas que estão no PAM/LDAP/SAMBA, contudo vai conseguir acessar compartilhamentos e autenticar via PDC)
# smbldap-usermod hugo -G +administradores (adiciona o usuário "hugo" no grupo "administradores")
# smbldap-usermod hugo -r hugoazevedo (muda o "dn" de "hugo" para "hugoazevedo")
# smbldap-usermod hugo -N hugoazevedo (muda o "givenName" de "hugo" para "hugoazevedo")
# smbldap-groupadd -a group_name (adiciona um grupo)
# smbldap-groupshow group_name (mostra informações de um grupo)
# getent group group_name (mostra informações de um grupo)
#
Obs: ao inserir um cliente (ex: MS-Windows XP) no domínio são enviados pacotes UDP/138 em broadcast na rede. O domínio (servidor que tem o domíno configurado) responderá. Quando o cliente digita o usuário e senha, pacotes UDP/138, TCP/139 e TCP/445 serão trocados.

Referências Bibliográgicas
man Net::LDAP