Autenticação com OpenLdap e Samba
Introdução
%ATENCAOon%
Disponibilizei um tutorial personalizado em
LdapSambaPessoal. Neste você informa seus dados e tem suas configurações personalizadas.
%ATENCAOoff%
Um dos principais requisitos exigidos de um sistema é segurança. Um sistema seguro é aquele que permite que as informações possuam integridade, e que os acessos às informações sejam feitos por pessoas autorizadas, permitindo protegê-las contra acessos indesejáveis.
É importante frisar que não existe um sistema que possa ser completamente seguro. Tudo que se pode fazer é aumentar a dificuldade de invasões no sistema. Neste contexto está o conceito de
autenticar. Autenticação é o processo de reconhecimento dos dados que são recebidos, comparando-os com os dados que foram enviados, e verificando se o transmissor que fez a requisição é, na verdade, o transmissor real.
Autenticação utiliza o modelo
cliente-servidor. Um cliente faz uma requisição para o servidor, que verifica se o cliente tem permissão para acessar o servidor. Este também verifica quais são estas permissões, ou seja, quais as informações que o cliente poderá acessar. Após isso, retorna a requisição para o cliente.
O que é OpenLdap
LDAP (
Lighweight Directory Access Protocol) padroniza o Protocolo de Acesso a Diretório Leve. Baseado no X.500 ele contém a maioria das funções primárias, mas complementa as mais esotéricas funções que o X.500 tem. Agora o que é X.500 e porque ele é um LDAP?
X.500 é um modelo de Serviço de Diretório no conceito OSI. Ele contém definições de nomes e protocolos para pesquisa e atualização de diretório. Entretanto, X.500 se mostrou muito pesado em muitas situações. Aí apareceu o LDAP. Como o X.500 ele provê um modelo de dados/nomes para o diretório e um também um protocolo. Entretanto, LDAP foi projetado para rodar diretamente sobre a pilha TCP/IP. Então LDAP é uma versão mais leve do X.500.
Atualmente vem se tornando um padrão, diversos programas já têm suporte a LDAP. Livros de endereços, autenticação, armazenamento de certificados digitais (S/MIME) e de chaves públicas (PGP) são alguns dos exemplos onde o LDAP já é amplamente utilizado.
Talvez muitos não saibam mas o DNS (Domain Name Service) é um tipo de serviço de diretório, embora bastante especializado.
O que é um diretório
Um diretório é como um banco de dados, mas tende a conter mais informações descritivas, baseadas em atributo e é organizado em forma de árvore, não de tabela. A informação de um diretório é geralmente mais lida do que é escrita. Como consequência, diretórios não são usados para implementar transações complexas, ou esquemas de consultas regulares em banco de dados, transações estas que são usadas para fazer um grande volume de atualizações complexas. Atualizações em diretórios são tipicamente simples ou nem são feitas.
Diretórios são preparados para dar uma resposta rápida a um grande volume de consultas ou operações de busca. Eles também podem ter a habilidade de replicar informações existentes extensamente; isto é usado para acrescentar disponibilidade e confiabilidade, enquanto reduzem o tempo de resposta.
Como é estruturada a informação
Toda informação dentro do diretório é estruturada hierarquicamente. Ainda mais, se você desejar entrar com dados num diretório, o diretório também deve conseguir armazenar estes dados numa forma de árvore.
Ex.: Sabendo que o
Jarbas é uma das
pessoas do estado de
go que trabalha na
previdência, podemos apresentar as seguintes figuras para permitir uma melhor visualização deste conhecimento.
%TERMINALon%
dc: previdencia
|
dc: go (O - Organização)
|
+---+---+
ou: Usuarios Maquinas (OU - Unidade Organizacional)
|
+----+-----+
uid: .. Jarbas .. (OU-específico - Dados ou Folhas)
%TERMINALoff%
%TERMINALon%
dc=go,dc=previdencia
|
'--- ou=Usuarios
| '--- uid=Jarbas
|
'--- ou=Grupos
|
'--- ou=Maquinas
%TERMINALoff%
Instalando SERVIDOR OpenLdap
Antes de mais nada devemos ter um sevidor com GNU/Linux instalado. Pode ser um Fedora, Conectiva, Debian ou Mandrake (hoje Mandriva). Este material baseia-se num Mandriva GNU/Linux utilzado. Porquê? Porque é mais simples de instalar e tem todos os pacotes necessários para uma instalação simples. Porque tem um grande quantidade de repositórios espelhos para manter o sistema atualizado. Porque tem uma grande documentação disponível no site desta. Porque o conhecimento da Conectiva no mercado brasileiro com toda a certeza será utilizado para melhorar o suporte para o
pt_BR.
As primeiras coisas que necessitamos fazer e ter certeza que o OpenLdap está instalado corretamente. Isso pode ser realizado através da instalação de alguns pacotes. Obviamente, o primeiro passo é instalar o OpenLdap. Os pacotes que nós precisamos ter instalados são:
Pacotes Necessários
OpenLdap
%TERMINALon%
[root@lxgod001 ~]# urpmi openldap openldap-server openldap-clients openldap-migration nss_ldap pam_ldap libldap2
%TERMINALoff%
Os pacotes
openldap-servers e
openldap-migration são necessários
apenas no computador que irá ser o
servidor de autenticação. Eles não são necessários nas máquinas clientes, isto é, nas estações que irão se autenticar no servidor.
Samba
Pacotes samba necessários para permitir a integração com o ldap.
%TERMINALon%
[root@lxgod001 ~]# urpmi samba-common samba-server samba-client smbldap-tools
%TERMINALoff%
Os pacotes que temos realmente instalado no servidor são:
%TERMINALon%
[root@lxgod001 ~]# rpm -qa | grep ldap
libldap2.2_7-2.2.23-5mdk
nss_ldap-220-5mdk
openldap-servers-2.2.23-5mdk
openldap-migration-2.2.23-5mdk
perl-ldap-0.31-2mdk
openldap-clients-2.2.23-5mdk
php-ldap-4.3.10-6mdk
pam_ldap-170-5mdk
smbldap-tools-0.8.8-1
openldap-2.2.23-5mdk
[root@lxgod001 ~]# rpm -qa | grep samba
samba-common-3.0.13-2mdk
samba-server-3.0.13-2mdk
samba-client-3.0.13-2mdk
%TERMINALoff%
O
perl-ldap e
php-ldap são necessários apenas para a instalação do
phpldapadmin. Isso é apenas para facilitar a administração do ldap via interface web. O
openldap-migration não será necessário, mas é interessante para podermos dar uma olhada no código dos scripts e aprender um pouco

.
%ATENCAOon%
O sucesso da configuração necessita que tenhamos os serviços
ldap e
smb parados. Algumas distribuições possuem o recurso de
startar o serviço logo após sua instalação. Para garantir que os serviços estejam parados devemos fazer:
%ATENCAOoff%
%TERMINALon%
[root@lxgod001 ~]# service ldap stop
[root@lxgod001 ~]# service smb stop
%TERMINALoff%
Configurando o Servidor OpenLdap
O primeiro passo para configurar o servidor é editar o arquivo
/etc/openlda/slapd.conf. Há apenas alguns campos que serão necessários configurar. No exemplo abaixo assumiremos que o nome de domínio (domain name) a ser utilizado na REDE é
"dc=go,dc=previdencia".
Abaixo mostramos o conteúdo do
/etc/openldap/slapd.conf utilizado por nós.
%TERMINALon%
## Modificação: Jarbas - 12-04-2005
## Baseado na documentação do IDEALX.ORG
#
= Bibliotecas SCHEMA que o LDAP irá utilizar
=
include /usr/share/openldap/schema/core.schema
include /usr/share/openldap/schema/cosine.schema
include /usr/share/openldap/schema/inetorgperson.schema
include /usr/share/openldap/schema/nis.schema
include /usr/share/openldap/schema/samba.schema
schemacheck on
#
= Habilita a versão 2 do protocolo LDAP
=
# É necessário para algumas versões do mozilla poder acessar o catálogo de endereços ldap
allow bind_v2
# To allow TLS-enabled connections, create /etc/ssl/openldap/ldap.pem
# and uncomment the following lines.
/dev/random
HIGH:MEDIUM:+SSLv2
TLSCertificateFile? /etc/ssl/openldap/ldap.pem
TLSCertificateKeyFile? /etc/ssl/openldap/ldap.pem
/etc/ssl/openldap/
/etc/ssl/cacert.pem
TLSCACertificateFile? /etc/ssl/openldap/ldap.pem
never # ([never]|allow|try|demand)
#
= Estrutura da Base
=
database bdb
suffix "dc=go,dc=previdencia"
rootdn "cn=Manager,dc=go,dc=previdencia"
# Quanto mais eu aprendo, Mais tenho que aprender. ( gerado com slappasswd -h {SSHA} -s SENHA_TEXTO )
rootpw {SSHA}YujfX93n9jCyLyqTB08N+0QfXdLTyi/+
# The database directory MUST exist prior to running slapd AND
# should only be accessable by the slapd/tools. Mode 700 recommended.
directory /var/lib/ldap
#
= Ajustes para melhorar performance
=
# Tuning settings, please see the man page for slapd-bdb for more information
# as well as the DB_CONFIG file in the database directory
# commented entries are at their defaults
# In-memory cache size in entries
cachesize 10000
# Checkpoint the bdb database after 256kb of writes or 5 minutes have passed
# since the last checkpoint
checkpoint 1024 5
#
= Habilita a geracao de log's
=
# Quando em producao colocar 0 se nao precisar de log
loglevel 256
#
= Estruturas de Índices
=
index objectClass,uidNumber,gidNumber eq
index cn,sn,uid,displayName pres,sub,eq
index memberUID,mail,givenname eq,subinitial
index sambaSID,sambaPrimaryGroupSID,sambaDomainName eq
#
= ACLs - Lista de Controle de Acesso
=
# Users can authenticate and change their password
access to attr=userPassword,sambaLMPassword,sambaNTPassword
by self write
by anonymous auth
by * none
# All other attributes are readable to everybody
access to *
by * read
%TERMINALoff%
Testando o serviço "ldap"
Em primeiro lugar
starte o serviço
ldap com o comando abaixo:
%TERMINALon%
[root@lxgod001 ~]# service ldap start
Iniciando slapd (ldap + ldaps): [ OK ]
%TERMINALoff%
Depois de
startado o servidor ldap, você pode testá-lo com a seguinte consulta:
%TERMINALon%[root@lxgod001 ~]# ldapsearch -x -b '' -s base "(
ObjectClass?=*)"
# extended LDIF
#
# LDAPv3
# base <> with scope base
# filter: (
ObjectClass?=*)
# requesting: ALL
#
#
dn:
objectClass: top
objectClass:
OpenLDAProotDSE?
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
%TERMINALoff%
Se você ver algo semelhante ao mostrado acima, ldap está instalado e funcionando corretamente. Se não, então volte e tenha certeza que você não cometeu algum erro.
Bom, agora temos o servidor LDAP
rodando mas não temos nada cadastrado (ainda

). Para termos certeza que o serviço ldap estará sendo iniciado a cada boot, faça:
%TERMINALon%
[root@lxgod001 ~]# chkconfig ldap on
%TERMINALoff%
Configurando os Clientes LDAP
O que foi feito anteriormente é apenas a configuraçao do servidor OpenLdap. Agora mostraremos como configurar os clientes, isto é, máquinas que irão se autenticar no servidor.
Configurando o ldap.conf
O arquivo
/etc/ldap.conf é a configuração principal do
Cliente.
%TERMINALon%
# Your LDAP server. Must be resolvable without using LDAP.
host 127.0.0.1
# The distinguished name of the search base.
base dc=go,dc=previdencia
# The sintinguished name to bind to the server with if the
# efective user ID is root. Password must be stored in
# /etc/ldap.secret (mode 600)
rootbinddn cn=Manager,dc=go,dc=previdencia
# RFC2307bis naming contexts
# we use ?sub (an not the default ?one) because we separated
# sambaAccounts on ou=Computer,dc=IDEALX,dc=ORG
# and ou=Users,dc=IDEALX,dc=ORG
nss_base_passwd dc=go,dc=previdencia?sub
nss_base_shadow dc=go,dc=previdencia?sub
nss_base_group ou=Grupos,dc=go,dc=previdencia?one
# Security options
ssl no
pam_password crypt
# - The End
%TERMINALoff%
Configurando o NSS para usar o LDAP
Necessitamos agora configurar o NSS (Name Service Swith) para usar LDAP através do arquivo
/etc/nsswitch.conf
%TERMINALon%
#
# /etc/nsswitch.conf
#
# An example Name Service Switch config file. This file should be
# sorted with the most-used services at the beginning.
#
# The entry '[NOTFOUND=return]' means that the search for an
# entry should stop if the search in the previous entry turned
# up nothing. Note that if the search failed due to some other reason
# (like no NIS server responding) then the search continues with the
# next entry.
#
# Legal entries are:
#
# nisplus or nis+ Use NIS+ (NIS version 3)
# nis or yp Use NIS (NIS version 2), also called YP
# dns Use DNS (Domain Name Service)
# files Use the local files
# db Use the local database (.db) files
# compat Use NIS on compat mode
# hesiod Use Hesiod for user lookups
# [NOTFOUND=return] Stop searching if not found so far
#
# To use db, put the "db" in front of "files" for entries you want to be
# looked up first in the databases
#
# Example:
#passwd: db files nisplus nis
#shadow: db files nisplus nis
#group: db files nisplus nis
passwd: files ldap
shadow: files ldap
group: files ldap
#hosts: db files nisplus nis dns
hosts: files nisplus nis dns
# Example - obey only what nisplus tells us...
#services: nisplus [NOTFOUND=return] files
#networks: nisplus [NOTFOUND=return] files
#protocols: nisplus [NOTFOUND=return] files
#rpc: nisplus [NOTFOUND=return] files
#ethers: nisplus [NOTFOUND=return] files
#netmasks: nisplus [NOTFOUND=return] files
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
netgroup: nisplus
publickey: nisplus
automount: files nisplus
aliases: files nisplus
%TERMINALoff%
Teste com a ferramenta
getent da seguinte forma:
%TERMINALon%
[root@lxgod001 ~]# getent passwd
[root@lxgod001 ~]# getent shadow
[root@lxgod001 ~]# getent group
%TERMINALoff%
Se você ver o conteúdo igual aos arquivos locais (
/etc/passwd,
/etc/shadow,
/etc/group) é porque não há nenhuma informação extra no ldap, ou seja, o ldap não possui a base de dados migrada.
Configurando o PAM para usar LDAP
Necessitamos agora configurar o PAM (Plugabe Autentication Module) para usar LDAP através do arquivo
/etc/pam.d/system-auth
%TERMINALon%
#%PAM-1.0
# Módulo "pam_ldap.so" para conecções pelo ldap
# Isso não afeta se os usuários existem localmente em /etc/passwd
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_ldap.so
account required pam_deny.so
password required pam_cracklib.so retry=3 type= minlen=2 dcredit=0 ucredit=0
password sufficient pam_unix.so nullok use_authtok md5 shadow
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
# Criar diretório local no momento em que o usuário se loga no Desktop
session required pam_mkhomedir.so skel=/etc/skel umask=0022
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
%TERMINALoff%
Até este ponto, qualquer programa que utilize o
system-auth irá também utilizar o LDAP. Isso inclui serviços como SSH, possivelmente FTP, e outros em que a autenticação seja feita baseada em PAM.
Configurando o SERVIDOR samba
A configuração do samba para funcionar integrado com o
ldap é talvez a parte mais
trabalhosa de ser feita, pois envolve algumas alterações profundas no
/etc/samba/smb.conf.
Vamos ao conteúdo do
/etc/samba/smb.conf
%TERMINALon%
# Parâmetros Globais
[global]
# Dominio, Nome e Descricao
workgroup = PREV-GO
netbios name = PSGOD001
server string = PREVIDENCIA SOCIAL-GO-DATAPREV - GNU/Linux SMB
# Nao disponibilizar impressora no Linux para Windows
printcap name = cups
load printers = yes
printing = cups
# printcap cache time, so samba will automatically load new cups printers
printcap cache time = 60
# Nao mostrar no servidor o Wizard "Adicionar Impressora"
show add printer wizard = No
# Quais interfaces de rede utilizar
interfaces = lo, eth0
bind interfaces only = Yes
# Nivel de Mensagens
log level = 3
log file = /var/log/samba/%m.log
max log size = 100000
debug level = 0
syslog = 0
# Atuar como um PDC
security = user
domain logons = yes
preferred master = yes
domain master = yes
os level = 65
# Tratamento das senhas
encrypt passwords = yes
# Equivalencia de usuarios Windows X Linux
username map = /etc/samba/smbusers
# Evitar o perfil ambulante do Windows NT/XP
# logon path = \\%L\profiles\%U
logon path =
logon drive =
logon home =
# Script de logon em rede (deve ficar no compartilhamento netlogon - em formato DOS)
logon script = STARTUP.BAT
# Configuracoes para o LDAP
passdb backend = ldapsam:ldap://127.0.0.1
ldap passwd sync = yes
ldap delete dn = Yes
ldap admin dn = cn=Manager,dc=go,dc=previdencia
ldap suffix = dc=go,dc=previdencia
ldap machine suffix = ou=Computadores
ldap user suffix = ou=Usuarios
ldap group suffix = ou=Grupos
ldap idmap suffix = ou=Idmap
idmap backend = ldap:ldap://127.0.0.1
idmap uid = 10000-20000
idmap gid = 10000-20000
# Permitir que usuarios do grupo "Administradores do Dominio" possam ingressar maquinas
#
WinXP?/Win2000 ao dominio samba
# to the domain
enable privileges = yes
# Scrips utilizados para Gerenciar Usuários da M$
# adiconar/remover Usuarios
add user script = /opt/IDEALX/sbin/smbldap-useradd -m "%u"
delete user script = /opt/IDEALX/sbin/smbldap-userdel "%u"
# adiconar/remover Grupos
add group script = /opt/IDEALX/sbin/smbldap-groupadd -p "%g"
delete group script = /opt/IDEALX/sbin/smbldap-groupdel "%g"
# Scripts para adiconar/remover Usuarios nos Grupos
add user to group script = /opt/IDEALX/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /opt/IDEALX/sbin/smbldap-groupmod -x "%u" "%g"
# Script para definir o grupo primario do usuario
set primary group script = /opt/IDEALX/sbin/smbldap-usermod -g "%g" "%u"
# Script par adicionar maquina Win NT/XP ingressar no Dominio
add machine script = /opt/IDEALX/sbin/smbldap-useradd -w "%u"
# Otimizacoes recomendadas em
#
http://us4.samba.org/samba/docs/man/Samba-Guide/secure.html#promisnet
smb ports = 139 445
name resolve order = wins bcast hosts
utmp = Yes
time server = Yes
template shell = /bin/false
winbind use default domain = no
map acl inherit = Yes
strict locking = Yes
# Como o cliente ira' se comunicar com o servidor
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
# Servidor Wins da Rede
wins server = 10.0.134.223
# Ativar a internacionalizacao: permitir caracteres acentuados pelo Windows
dos charset = CP850
unix charset = ISO8859-1
# Nao tentar fazer um lock nestes arquivos
veto files = /*.eml/*.nws/*.{*}/
veto oplock files = /*.doc/*.xls/*.mdb/
# Tratar os arquivos que comecam com "." como ocultos para maquinas Windows
hidedotfiles = yes
# Simular a Lixeira do Windows
recycle:repository = .lixeira
recycle:keeptree = True
recycle:touch = True
recycle:versions = True
recycle:exclude =
.tmp|.temp|*.o|*.obj|~$*|*.$$$
recycle:excludedir = /tmp|/temp|/trash
recycle:noversions = .doc|.xls|.ppt|.dbf|.nsx|.idx|.dbt
recycle:maxsize = 0
#=============================
#===== Compartilhamentos
=
#=============================
[netlogon]
comment = Servico de Logon em Rede [ startup.bat ]
path = /home/samba/netlogon
# guest ok = yes
browseable = No
read only = Yes
[home]
comment = Diretorio Pessoal de Cada Usuario [ U:\ ]
path = /home/usr/%u
browseable = no
writeable = Yes
create mask = 0600
directory mask = 0700
vfs objects = recycle
[dados]
comment = Sistemas e Dados de Usuarios [ F:\ ]
path = /home/samba/dados
writeable = Yes
force create mode = 0660
force directory mode = 02770
vfs objects = recycle
[temp]
comment = Dados Temporarios [ T:\ ]
path = /home/samba/temp
writeable = Yes
force create mode = 0666
force directory mode = 02777
[doc]
comment = Documentacoes de Linux /usr/share/doc [ L:\ ]
path = /usr/share/doc
public = Yes
writeable = No
guest ok = Yes
# Un-comment the following to provide a specific roving profile share
# the default is to use the user's home directory
;[Profiles]
; comment = Compartilhamento Profile
; path = /home/usr/%U/profiles
; browseable = No
; guest ok = yes
; profile acls = Yes
[printers]
comment = Spool de Impressao SMB
path = /var/spool/samba
browseable = No
guest ok = Yes
writeable = No
printable = Yes
create mode = 0700
use client driver = yes
# This share is used for Windows NT-style point-and-print support.
# To be able to install drivers, you need to be either root, or listed
# in the printer admin parameter above. Note that you also need write access
# to the directory and share definition to be able to upload the drivers.
# For more information on this, please see the Printing Support Section of
# /usr/share/doc/samba-
/docs/Samba-HOWTO-Collection.pdf
#
# A special case is using the CUPS Windows Postscript driver, which allows
# all features available via CUPS on the client, by publishing the ppd file
# and the cups driver by using the 'cupsaddsmb' tool. This requires the
# installation of the CUPS driver (http://www.cups.org/windows.php)
# on the server, but doesn't require you to use Windows at all :-).
[print$]
path = /var/lib/samba/printers
browseable = yes
write list = @"Operadores de Impressao" root
guest ok = yes
inherit permissions = yes
%TERMINALoff%
Com o samba configurado, agora é hora de levantar o serviço smb.
Para certificarmos que não há nenhuma informação armazenada no samba devemos fazer:
%TERMINALon%
[root@lxgod001 ~]# rm -rf /etc/samba/secrets.tdb /var/log/samba/*
%TERMINALoff%
%ATENCAOon%
O samba agora necessita da senha definida no /etc/openldap/slapd.conf. Sem essa senha o samba fica indefinidamente tentando startar e não levanta. Esse procedimento deve ser realizado apenas uma única vez, pois a senha fica armazenada no arquivo /etc/samba/secrets.tdb.
%ATENCAOoff%
O procedimento para definirmos a senha que o samba irá utilizar é:
%TERMINALon%
[root@lxgod001 ~]# smbpasswd -w SENHA-TEXTO
Setting stored password for "cn=Manager,dc=go,dc=previdencia" in secrets.tdb
%TERMINALoff%
Agora sim podemos levantar o samba normalmente com:
%TERMINALon%
[root@lxgod001 ~]# service smb start
Iniciando os servigos SMB: [ OK ]
Iniciando os servigos NMB: [ OK ]
%TERMINALoff%
Para certificarmos que o samba está rodando normalmente podemos checar através do seguint comando:
%TERMINALon%
[root@lxgod001 ~]# smbclient -L 127.0.0.1 -U%
Domain=[PREV-GO] OS=[Unix] Server=[Samba 3.0.13]
Sharename Type Comment
--------- ---- -------
dados Disk Sistemas e Dados de Usuarios [ F:\ ]
temp Disk Dados Temporarios [ T:\ ]
doc Disk Documentacoes de Linux /usr/share/doc [ L:\ ]
print$ Disk
IPC$ IPC IPC Service (PREVIDENCIA SOCIAL-GO-DATAPREV - GNU/Linux SMB)
ADMIN$ IPC IPC Service (PREVIDENCIA SOCIAL-GO-DATAPREV - GNU/Linux SMB)
HP-LaserJet Printer HP LaserJet? 4P
HP-GALENO Printer HP DeskJet? 680C
Domain=[PREV-GO] OS=[Unix] Server=[Samba 3.0.13]
Server Comment
--------- -------
PSGOD001 PREVIDENCIA SOCIAL-GO-DATAPREV - GNU/Linux SMB
Workgroup Master
--------- -------
PREV-GO PSGOD001
%TERMINALoff%
Como o samba está atuando como um PDC devemos ter um SID utilizado pela Microsoft. Esse SID é o equivalente ao ID do Unix, porém deve ser único para cada domínio. Como podemos ver nosso SID? Simples. Digite o comando baixo:
%TERMINALon%
[root@lxgod001 ~]# net getlocalsid
[2005/04/14 10:03:10, 0] lib/smbldap.c:smbldap_search_suffix(1176)
smbldap_search_suffix: Problem during the LDAP search: (No such object)
SID for domain PSGOD001 is: S-1-5-21-3605816189-1598215328-2250501690
%TERMINALoff%
O erro mostrado acima é apenas informativo pois o ldap ainda está vazio. Isso será sanado quando criarmos as entidades do domínio dentro do LDAP.
Migrando os dados
Certamente a migração dos dados armazenados noutros formatos e/ou plataformas para o LDAP é o que dá mais trabalho. Isso porque normalmente não dispomos de todos os dados numa única máquina. Algumas vezes temos mesmo é uma "salada mista" onde até mesmo a troca de uma senha de usuário é uma tarefa árdua.
Bom, existem diversos scripts que nos auxiliam na tarefa de migração. Os mais conhecidos são:
- samba-migration - muito referenciado em listas de discussão sobre ldap
- smbldap-tools - IDEALX - mais recente e menos explorado (porém mais limpo)
- outros
Vamos concentrar nossos esforços no IDEALX por apresentar melhores resultados para uma base LDAP casada com SAMBA.
Configurando os scripts IDEALX
Os scripts IDEALX são voltados para o gerenciamento do samba com autenticação pelo ldap, ou seja, uma mão na roda. O pacote é o smbldap-tools. Basicamente são dois arquivos: /etc/smbldap-tools/smbldap.conf e /etc/smbldap-tools/smbldap_bind.conf que devem podem ser alterados/configurados através da ferramenta abaixo:
%TERMINALon%
[root@lxgod001 ~]# /opt/IDEALX/sbin/configure.pl
%TERMINALoff%
Uma série de informações devem ser fornecidas corretamente com o objetivo de se criar os arquivos de configuração abaixo.
Primeiramente vamos ao conteúdo do /etc/opt/IDEALX/smbldap-tools/smbldap.conf
%TERMINALon%
# $Source: /home/twiki/data/PSLGO/SmbLdapConf.txt,v $
# $Id: SmbLdapConf.txt,v 1.1 2005/04/14 22:40:02 JarbasJunior Exp www-data $
#
# smbldap-tools.conf : Q & D configuration file for smbldap-tools
# This code was developped by IDEALX (http://IDEALX.org/) and
# contributors (their names can be found in the CONTRIBUTORS file).
#
# Copyright (C) 2001-2002 IDEALX
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
# USA.
# Purpose :
# . be the configuration file for all smbldap-tools scripts
##############################################################################
#
# General Configuration
#
##############################################################################
# Put your own SID
# to obtain this number do: net getlocalsid
SID="S-1-5-21-3605816189-1598215328-2250501690"
##############################################################################
#
# LDAP Configuration
#
##############################################################################
# Notes: to use to dual ldap servers backend for Samba, you must patch
# Samba with the dual-head patch from IDEALX. If not using this patch
# just use the same server for slaveLDAP and masterLDAP.
# Those two servers declarations can also be used when you have
# . one master LDAP server where all writing operations must be done
# . one slave LDAP server where all reading operations must be done
# (typically a replication directory)
# Ex: slaveLDAP=127.0.0.1
slaveLDAP="127.0.0.1"
slavePort="389"
# Master LDAP : needed for write operations
# Ex: masterLDAP=127.0.0.1
masterLDAP="127.0.0.1"
masterPort="389"
# Use TLS for LDAP
# If set to 1, this option will use start_tls for connection
# (you should also used the port 389)
ldapTLS="0"
# How to verify the server's certificate (none, optional or require)
# see "man Net::LDAP" in start_tls section for more details
verify="require"
# CA certificate
# see "man Net::LDAP" in start_tls section for more details
cafile="/etc/smbldap-tools/ca.pem"
# certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
clientcert="/etc/smbldap-tools/smbldap-tools.pem"
# key certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
clientkey="/etc/smbldap-tools/smbldap-tools.key"
# LDAP Suffix
# Ex: suffix=dc=IDEALX,dc=ORG
suffix="dc=go,dc=previdencia"
# Where are stored Users
# Ex: usersdn="ou=Users,dc=IDEALX,dc=ORG"
usersdn="ou=Usuarios,${suffix}"
# Where are stored Computers
# Ex: computersdn="ou=Computers,dc=IDEALX,dc=ORG"
computersdn="ou=Computadores,${suffix}"
# Where are stored Groups
# Ex groupsdn="ou=Groups,dc=IDEALX,dc=ORG"
groupsdn="ou=Grupos,${suffix}"
# Where are stored Idmap entries (used if samba is a domain member server)
# Ex groupsdn="ou=Idmap,dc=IDEALX,dc=ORG"
idmapdn="ou=Idmap,${suffix}"
# Where to store next uidNumber and gidNumber available
sambaUnixIdPooldn="sambaDomainName=PREV-GO,${suffix}"
# Default scope Used
scope="sub"
# Unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT)
hash_encrypt="SSHA"
# if hash_encrypt is set to CRYPT, you may set a salt format.
# default is "%s", but many systems will generate MD5 hashed
# passwords if you use "$1$%.8s". This parameter is optional!
crypt_salt_format="%s"
##############################################################################
#
# Unix Accounts Configuration
#
##############################################################################
# Login defs
# Default Login Shell
# Ex: userLoginShell="/bin/bash"
userLoginShell="/bin/bash"
# Home directory
# Ex: userHome="/home/%U"
userHome="/home/usr/%U"
# Gecos
userGecos="System User"
# Default User (POSIX and Samba) GID
defaultUserGid="513"
# Default Computer (Samba) GID
defaultComputerGid="515"
# Skel dir
skeletonDir="/etc/skel"
# Default password validation time (time in days) Comment the next line if
# you don't want password to be enable for defaultMaxPasswordAge days (be
# careful to the sambaPwdMustChange attribute's value)
defaultMaxPasswordAge="99"
##############################################################################
#
# SAMBA Configuration
#
##############################################################################
# The UNC path to home drives location (%U username substitution)
# Ex: \\My-PDC-netbios-name\homes\%U
# Just set it to a null string if you want to use the smb.conf 'logon home'
# directive and/or disable roaming profiles
#userSmbHome="\\PDC-SRV\homes\%U"
userSmbHome=""
# The UNC path to profiles locations (%U username substitution)
# Ex: \\My-PDC-netbios-name\profiles\%U
# Just set it to a null string if you want to use the smb.conf 'logon path'
# directive and/or disable roaming profiles
#userProfile="\\PDC-SRV\profiles\%U"
userProfile=""
# The default Home Drive Letter mapping
# (will be automatically mapped at logon time if home directory exist)
# Ex: H: for H:
userHomeDrive="U:"
# The default user netlogon script name (%U username substitution)
# if not used, will be automatically username.cmd
# Ex: %U.cmd
# userScript="startup.cmd" # make sure script file is edited under dos
userScript="%STARTUP.BAT"
# Domain appended to the users "mail"-attribute
# when smbldap-useradd -M is used
mailDomain="previdencia.gov.br"
##############################################################################
#
# SMBLDAP-TOOLS Configuration (default are ok for a RedHat?)
#
##############################################################################
# Allows not to use smbpasswd (if with_smbpasswd == 0 in smbldap_conf.pm) but
# prefer Crypt::SmbHash library
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
# Allows not to use slappasswd (if with_slappasswd == 0 in smbldap_conf.pm)
# but prefer Crypt:: libraries
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"
%TERMINALoff%
e depois ao /etc/opt/IDEALX/smbldap-tools/smbldap_bind.conf
%TERMINALon%
############################
# Credential Configuration #
############################
# Notes: you can specify two differents configuration if you use a
# master ldap for writing access and a slave ldap server for reading access
# By default, we will use the same DN (so it will work for standard Samba
# release)
slaveDN="cn=Manager,dc=go,dc=previdencia"
slavePw="SENHA-TEXTO"
masterDN="cn=Manager,dc=go,dc=previdencia"
masterPw="SENHA-TEXTO"
%TERMINALoff%
Adicionando estrutura ao LDAP
A estrutura necessária para nosso LDAP é conseguida através do smbldap-populate.
Por default os usuários/grupos criados tem nomes em inglês como: Domain Admins, Print Operators. Mas como estamos no Brasil podemos alterar para o pt_BR através do script simplista que fiz.
%TERMINALon%
#!/bin/bash
#
# Objetivo: trocar as informações do smbldap-populate do ingles para o portugues brasileiro
#
# Autor: Jarbas, 14-04-2005
# Licença: GPL
if [ $# -ne 1 ]; then
echo "Sintaxe errada"
echo "O correto eh $0 CAMINHO-COMPLETO-DO-smbldap-populate a ser traduzido"
exit 1
fi
sed -e "s/Administrators/Administradores/g" \
-e "s/Domain Guest/Convidados do Dominio/g" \
-e "s/Domain Admins/Administradores do Dominio/g" \
-e "s/Domain Users/Usuarios do Dominio/g" \
-e "s/Domain Computers/Computadores do Dominio/g" \
-e "s/Print Operators/Operadores de Impressao/g" \
-e "s/Backup Operators/Operadores de Backup/g" \
-e "s/Replicators/Duplicadores/g" $1 > $1.pt_BR
chmod +x $1.pt_BR
echo "Arquivo $1 traduzido em $1.pt_BR"
%TERMINALoff%
Caso deseje ter os usuários/grupos em pt_BR Execute este script:
%TERMINALon%
[root@lxgod001 ldap]# ./smbldap-populate-pt_BR.sh /opt/IDEALX/sbin/smbldap-populate
Arquivo /opt/IDEALX/sbin/smbldap-populate traduzido em /opt/IDEALX/sbin/smbldap-populate.pt_BR
%TERMINALoff%
Agora execute o smbldap-populate para criarmos a estrutura base do ldap+samba.
%TERMINALon%
[root@lxgod001 ~]# /opt/IDEALX/sbin/smbldap-populate.pt_BR
Populating LDAP directory for domain PREV-GO (S-1-5-21-3605816189-1598215328-2250501690)
(using builtin directory structure)
adding new entry: dc=go,dc=previdencia
adding new entry: ou=Usuarios,dc=go,dc=previdencia
adding new entry: ou=Grupos,dc=go,dc=previdencia
adding new entry: ou=Computadores,dc=go,dc=previdencia
adding new entry: uid=root,ou=Usuarios,dc=go,dc=previdencia
adding new entry: uid=nobody,ou=Usuarios,dc=go,dc=previdencia
adding new entry: cn=Administradores do Dominio,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Usuarios do Dominio,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Convidados do Dominios,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Computadores do Dominio,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Administradores,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Account Operators,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Operadores de Impressao,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Operadores de Backup,ou=Grupos,dc=go,dc=previdencia
adding new entry: cn=Duplicadores,ou=Grupos,dc=go,dc=previdencia
adding new entry: sambaDomainName=PREV-GO,dc=go,dc=previdencia
Please provide a password for the domain root:
Changing password for root
New password :
Retype new password :
%TERMINALoff%
Gerando um DUMP da base LDAP
Um bom teste para verificar se está tudo funcionando até agora é gerar um dump da base de dados LDAP, ou seja, exportar todo o conteúdo previamente armazenado no LDAP+SAMBA através do comando abaixo:
%TERMINALon%
[root@lxgod001 ~]# ldapsearch -x -b "dc=go,dc=previdencia" "(ObjectClass?=*)"
%TERMINALoff%
Outro teste interessante neste momento é a ferramenta getent da seguinte forma:
%TERMINALon%
[root@lxgod001 ~]# getent passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/sh
daemon:x:2:2:daemon:/sbin:/bin/sh
adm:x:3:4:adm:/var/adm:/bin/sh
lp:x:4:7:lp:/var/spool/lpd:/bin/sh
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/bin/sh
news:x:9:13:news:/var/spool/news:/bin/sh
uucp:x:10:14:uucp:/var/spool/uucp:/bin/sh
operator:x:11:0:operator:/var:/bin/sh
games:x:12:100:games:/usr/games:/bin/sh
nobody:x:65534:65534:Nobody:/:/bin/sh
rpm:x:13:101:system user for rpm:/var/lib/rpm:/bin/false
postfix:x:14:102:system user for postfix:/var/spool/postfix:/bin/false
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
messagebus:x:70:70:system user for dbus:/:/sbin/nologin
xfs:x:71:71:system user for xorg-x11:/etc/X11/fs:/bin/false
haldaemon:x:72:72:system user for hal:/:/sbin/nologin
rpc:x:73:73:system user for portmap:/:/bin/false
apache:x:74:74:system user for apache2:/var/www:/bin/sh
rpcuser:x:75:75:system user for nfs-utils:/var/lib/nfs:/bin/false
sshd:x:76:76:system user for openssh:/var/empty:/bin/true
ftp:x:77:77:system user for proftpd:/var/ftp:/bin/false
ldap:x:78:78:system user for openldap:/var/lib/ldap:/bin/false
d323209:x:1000:100:Jarbas Peixoto Júnior:/home/usr/d323209:/bin/bash
d239305:x:1001:100:Carlos Natal da Silva:/home/usr/d239305:/bin/bash
Administrator:x:998:512:Netbios Domain Administrator:/home/usr/Administrator:/bin/false
nobody:x:999:514:nobody:/dev/null:/bin/false
%TERMINALoff%
Note que agora há dois usuários novos que foram cadastrados via ldap Administrador e nobody. Note que o nobody já existia localmente, e o último da lista é o que foi cadastrado via smbldap-populate.
Criação e manutenção de usuários/grupos
O gerenciamento gráfico para manutenção de usuários/grupos pode ser realizada com o auxílio da ferramenta phpldapadmin (http://phpldapadmin.sourceforge.net/) que pode ser instalada no servidor ldap, mas isso não é o alvo desse documento.
Mas se tivermos uma grande quantidade de usuários/grupos a serem migrados essa ferramenta irá requerer que nós migremos um-a-um, ou seja, um verdadeiro pesadelo para o administrador da rede. Para essas necessidades entram os scrips disponibibilizados pelo pacote smbldap-tools. Onde estão eles?
%TERMINALon%
[root@lxgod001 ~]# ls /usr/sbin/smbldap*
/usr/sbin/smbldap-groupadd* /usr/sbin/smbldap-passwd* /usr/sbin/smbldap-useradd* /usr/sbin/smbldap-usershow*
/usr/sbin/smbldap-groupdel* /usr/sbin/smbldap-populate* /usr/sbin/smbldap-userdel*
/usr/sbin/smbldap-groupmod* /usr/sbin/smbldap-populate.orig* /usr/sbin/smbldap-userinfo*
/usr/sbin/smbldap-groupshow* /usr/sbin/smbldap_tools.pm* /usr/sbin/smbldap-usermod*
%TERMINALoff%
Informações adicionais sobre estes scripts podem ser obtidas em http://www.idealx.com ou com o parâmetro --help de cada um deles. Ex.:
%TERMINALon%
[root@lxgod001 ~]# smbldap-passwd --help
(c) IDEALX 2004 (http://www.idealx.com)- Licenced under GPL
Usage: /usr/sbin/smbldap-passwd [username]
-u update only unix password (userPasswd)
-?, --help show this help message
%TERMINALoff%
Criando grupos
Suponha que tenhamos apenas dois grupos locais: Dataprev e INSS. Como cadastrar estes grupos no LDAP? Simples:
%TERMINALon%
[root@lxgod001 ~]# smbldap-groupadd -a DATAPREV
[root@lxgod001 ~]# smbldap-groupadd -a INSS
%TERMINALoff%
Criando usuários
Os usuários são divididos em três categoria para o LDAP:
- Linux - são os usuários que poderão logar no servidor linux através da console ou ssh - não é desejável que usuários Windows (Samba) estejam nesta categoria.
- Samba - são os usuários que irão logar no Domínio administrado pelo Samba+Ldap. Praticamente todos os usuários estão nesta categoria.
- Máquinas - são as máquinas que ingressaram no domínio, seja manualmente ou automaticamente através do Windows 2000 ou XP - é claro que pedindo o usuário e senha com permissões para ingressar (neste material o root é o único capaz disso).
Para criarmos o usuário Linux linux a sintaxe resumida do smbldap-useradd é a seguinte:
%TERMINALon%
[root@lxgod001 ~]# smbldap-useradd -m -c "Teste Linux" linux
[root@lxgod001 ~]# smbldap-passwd linux
Changing password for linux
New password :
Retype new password :
%TERMINALoff%
Para criarmos o usuário Samba sambix a sintaxe resumida do smbldap-useradd é a seguinte:
%TERMINALon%
[root@lxgod001 ~]# smbldap-useradd -a -m -c "Teste Samba" sambix
[root@lxgod001 ~]# smbldap-passwd sambix
Changing password for linux
New password :
Retype new password :
%TERMINALoff%
Para criarmos o usuário Máquina winlinux a sintaxe resumida do smbldap-useradd é a seguinte:
%TERMINALon%
[root@lxgod001 ~]# smbldap-useradd -w winlinux
%TERMINALoff%
Para conferir os usuários criados:
%TERMINALon%
[root@lxgod001 ~]# getent passwd
...
root:x:0:0:Netbios Domain Administrator:/home/usr/root:/bin/false
nobody:x:999:514:nobody:/dev/null:/bin/false
d323209:x:1000:513:Jarbas Peixoto Junior:/home/usr/d323209:/bin/bash
wtgos005$:x:1001:515:Computer:/dev/null:/bin/false
d239305:x:1002:513:Carlos Natal da Silva:/home/usr/d239305:/bin/bash
linux:x:1013:513:Teste Linux:/home/usr/linux:/bin/bash
sambix:x:1014:513:Teste Samba:/home/usr/sambix:/bin/bash
winlinux$:x:1015:515:Computer:/dev/null:/bin/false
%TERMINALoff%
Para conferir os grupos criados:
%TERMINALon%
[root@lxgod001 ~]# getent group
...
Administradores do Dominio:x:512:root
Usuarios do Dominio:x:513:d323209,d239305,linux,sambix
Convidados do Dominios:x:514:
Computadores do Dominio:x:515:
Administradores:x:544:
Account Operators:x:548:
Operadores de Impressao:x:550:
Operadores de Backup:x:551:
Duplicadores:x:552:
DATAPREV:x:1000:
INSS:x:1001:
%TERMINALoff%
Note que os grupos dos usuários Linux e Samba pertencem por default ao grupo 513 (Usuários do Domínio). A diferença é que somente o usuário Linux podem efetuar login no servidor. Isso também significa que usuários Linux podem acessar também o Samba via Windows normalmente.
Referências
-- JarbasJunior - 14 Apr 2005