O Samba é um servidor SMB open-source para ambientes Linux/Unix. Com o Samba é possível participar de um domínio Windows, tanto como membro quanto como PDC (Primary Domain Controller). Isso significa que o Samba pode ser usado para autenticar os usuários e computadores de um domínio Windows.
A seguir vamos explicar o procedimento de instalação e configuração do Samba em um servidor que irá atuar como PDC, com o propósito de realizar a autenticação dos usuários e máquinas do domínio Windows, de forma integrada com o nosso diretório LDAP. Dessa forma, os usuários que estão armazenados no diretório LDAP poderão utilizar tanto os terminais Linux/Unix da rede quanto as estações de trabalho Windows, e o gerenciamento desses dois ambientes ficará centralizado.
Será possível garantir permissão de acesso a um usuário apenas aos terminais Linux/Unix ou apenas às estações Windows também, se necessário. E também será possível manter as senhas de acesso sincronizadas, de tal forma que se um usuário mudar sua senha na linha de comando do Linux ela também será alterada para a autenticação no Windows e vice-versa.
Essa automação no gerenciamento dos registros que estão no diretório LDAP por parte do Samba é feita através de scripts auxiliares que vamos instalar e configurar.
Procedimento 3.5. Instalação
Execute o seguinte comando para instalar os pacotes necessários no servidor que disponibilizará o Samba:
usuario
@sambaserver
:~$
sudo aptitude install samba smbldap-tools
Procedimento 3.6. Configuração
Vamos agora configurar o Samba para atuar como um PDC pronto para autenticar os usuários armazenados no diretório LDAP a partir das estações Windows. Não vamos entrar nos detalhes dos parâmetros de configuração do Samba pois além de serem muito numerosos isso foge do escopo deste documento. Para obter mais informações a respeito dos parâmetros de configuração do samba, consulte a manpage do smb.conf
ou acesse o site The Official Samba-3 HOWTO and Reference Guide. Um exemplo do arquivo /etc/samba/smb.conf
apropriado para realizar a função de autenticação dos usuários Windows é apresentado abaixo:
Exemplo 3.6. Arquivo de configuração /etc/ldap/ldap.conf
# # Sample configuration file for the Samba suite for Debian GNU/Linux. # # # This is the main Samba configuration file. You should read the # smb.conf(5) manual page in order to understand the options listed # here. Samba has a huge number of configurable options most of which # are not shown in this example # # Any line which starts with a ; (semi-colon) or a # (hash) # is a comment and is ignored. In this example we will use a # # for commentary and a ; for parts of the config file that you # may wish to enable # # NOTE: Whenever you modify this file you should run the command # "testparm" to check that you have not made any basic syntactic # errors. # #======================= Global Settings ======================= [global] ## Browsing/Identification ### # Change this to the workgroup/NT-domain name your Samba server will # part of # Não precisa ser igual á raiz do diretório LDAP workgroup =ldap.ime.usp.br
# server string is the equivalent of the NT Description field server string =Servidor SAMBA
netbios name =sambaserver
# Windows Internet Name Serving Support Section: # WINS Support - Tells the NMBD component of Samba to enable its WINS # Server wins support = yes # This will prevent nmbd to search for NetBIOS names through DNS. dns proxy = no #### Debugging/Accounting #### # This tells Samba to use a separate log file for each machine # that connects log level = 2 log file = /var/log/samba/log.%m # Put a capping on the size of the log files (in Kb). max log size = 1000 # We want Samba to log a minimum amount of information to syslog. # Everything should go to /var/log/samba/log.{smbd,nmbd} instead. # If you want to log through syslog you should set the following # parameter to something higher. syslog = 0 # Do something sensible when Samba crashes: mail the admin a backtrace panic action = /usr/share/samba/panic-action %d ####### Authentication ####### # "security = user" is always a good idea. This will require a Unix # account in this server for every user accessing the server. See # /usr/share/doc/samba-doc/htmldocs/Samba-HOWTO-Collection/ServerType. # html # in the samba-doc package for details. security = user admin users = root # You may wish to use password encryption. See the section on # 'encrypt passwords' in the smb.conf(5) manpage before enabling. encrypt passwords = true # If you are using encrypted passwords, Samba will need to know what # password database type you are using. passdb backend = ldapsam:ldap://ldapserver
.ime.usp.br/ passdb expand explicit = no obey pam restrictions = no # Script para alterar e sincronizar as senhas dos usuarios ldap passwd sync = Yes passwd program = /usr/sbin/smbldap-passwd %u passwd chat = *New*password* %n\n *Retype*new*password* %n\n *all*authentication*tokens*updated* ldap ssl = start_tls ldap admin dn = cn=admin,dc=ime,dc=usp,dc=br ldap suffix = dc=ime,dc=usp,dc=br ldap group suffix = ou=Groups ldap user suffix = ou=Users ldap machine suffix = ou=Computers ldap idmap suffix = ou=Idmap ldap delete dn = Yes # Configurações dos scripts do pacote smbldap-tools add user script = /usr/sbin/smbldap-useradd -m "%u" add machine script = /usr/sbin/smbldap-useradd -t 0 -w "%u" add group script = /usr/sbin/smbldap-groupadd -p "%g" add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g" delete user script = /usr/sbin/smbldap-userdel "%u" delete group script = /usr/sbin/smbldap-groupdel "%g" delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g" set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u" ########## Domains ########### # Is this machine able to authenticate users. Both PDC and BDC # must have this setting enabled. If you are the BDC you must # change the 'domain master' setting to no # domain logons = yes enable privileges = yes ############ Misc ############ # Most people will find that this option gives better performance. # See smb.conf(5) and /usr/share/doc/samba-doc/htmldocs/speed.html # for details # You may want to add the following on a Linux system: socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 # Domain Master specifies Samba to be the Domain Master Browser. If this # machine will be configured as a BDC (a secondary logon server), you # must set this to 'no'; otherwise, the default behavior is recommended. domain master = auto # Some defaults for winbind (make sure you're not using the ranges # for something else.) idmap uid = 10000-20000 idmap gid = 10000-20000
Não se esqueça de ajustar as permissões do arquivo /etc/samba/smb.conf
para 644 e certifique-se de que o seu proprietário seja o usuário root.
Ao finalizar a configuração do seu arquivo /etc/samba/smb.conf
, execute o comando testparm para verificar se está tudo certo:
usuario
@sambaserver
:~$
sudo testparm
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions
…
Agora teremos que adicionar o schema do Samba no arquivo /etc/ldap/slapd.conf
para que os atributos das entradas do domínio Windows sejam reconhecidos pelo serviço de diretório. Para isso, primeiro teremos que obter esse arquivo, que está contido no pacote samba-doc. Execute o seguinte comando no servidor que está rodando o serviço slapd para instalar o pacote necessário:
usuario
@ldapserver
:~$
sudo aptitude install samba-doc
Depois execute o comando abaixo para extrair o arquivo necessário para o local correto:
usuario
@ldapserver
:~$
sudo zcat /usr/share/doc/samba-doc/examples
/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
A seção schema's do arquivo /etc/ldap/slapd.conf
ficará assim:
… # schema's include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/samba.schema schemacheck on …
Vamos alterar a seção base de dados também para que fique de acordo com as nossas alterações. Primeiro precisamos indexar a instância de base de dados que contém o diretório de maneira diferente para obter um desempenho adequado ao buscar registros do Samba:
… ## base de dados no. 1 … index objectClass eq index uid,uidNumber,gidNumber,memberUid eq index cn,mail,surname,givenname eq,subinitial index sambaSID eq index sambaPrimaryGroupSID eq index sambaDomainName eq …
Também vamos precisar alterar as ACL's dessa instância para proteger os dados confidenciais desses registros:
… ## ACL's para a base de dados no. 1 access to attrs=userPassword,sambaNTPassword,sambaLMPassword by dn.base="cn=admin,dc=ime,dc=usp,dc=br" write by anonymous auth by self write by * none …
Como alteramos as configurações dos índices da base de dados, teremos que reconstruí-los. Para isso, primeiro pare o serviço slapd:
usuario
@ldapserver
:~$
sudo /etc/init.d/slapd stop
Em seguida reconstrua os índices com o comando slapindex:
usuario
@ldapserver
:~$
sudo slapindex
Agora reinicie o serviço:
usuario
@ldapserver
:~$
sudo /etc/init.d/slapd start
Starting OpenLDAP: running BDB recovery, slapd.
Precisamos armazenar a senha do usuário que será usado para administrar o diretório LDAP no arquivo /var/lib/samba/secrets.tdb
. Para isso, execute o seguinte comando no servidor em que o Samba foi instalado:
sudo /usr/bin/smbpasswd -w
usuario
@sambaserver
:~$secret
Setting stored password for "cn=admin,dc=ime,dc=usp,dc=br" in secrets.tdb
Finalmente, reinicie o servidor Samba:
usuario
@sambaserver
:~$
sudo /etc/init.d/samba restart
* Stopping Samba daemons... [ ok ]
* Starting Samba daemons... [ ok ]
Como dissemos anteriormente, a automação do gerenciamento dos registros do diretório LDAP por parte do Samba é feita com o auxílio de scripts. Esses scripts foram instalados pelo pacote smbldap-tools, e já os incluímos no /etc/samba/smb.conf
, agora precisamos configurá-los.
Os arquivos de configuração do smbldap-tools residem em /etc/smbldap-tools
, mas eles não são instalados por padrão. O pacote vem apenas com exemplos de configuração no diretório /usr/share/doc/smbldap-tools/examples
. Digite os seguintes comandos para fazer uma cópia dos arquivos necessários para o local correto:
sudo zcat /usr/share/doc/smbldap-tools/exa mples/smbldap.conf.gz > /etc/smbldap-tools/smbldap.conf
usuario
@sambaserver
:~$sudo cp /usr/share/doc/smbldap-tools/examp les/smbldap_bind.conf /etc/smbldap-tools
usuario
@sambaserver
:~$
Agora precisamos ajustá-los para as permissões adeqüadas:
sudo chmod 644 /etc/smbldap-tools/smbldap. conf
usuario
@sambaserver
:~$sudo chmod 600 /etc/smbldap-tools/smbldap_ bind.conf
usuario
@sambaserver
:~$sudo chown root:root /etc/smbldap-tools/sm bldap.conf
usuario
@sambaserver
:~$sudo chown root:root /etc/smbldap-tools/sm bldap_bind.conf
usuario
@sambaserver
:~$
O arquivo /etc/smbldap-tools/smbldap_bind.conf
contém as informações de autenticação ao diretório, por isso suas permissões devem estar mais restritas. A seguir apresentamos um exemplo desse arquivo com os parâmetros ajustados para o acesso ao diretório:
Exemplo 3.7. Arquivo de configuração /etc/smbldap-tools/smbldap_bind.conf
############################ # 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=admin,dc=ime,dc=usp,dc=br" slavePw="secret
" masterDN="cn=admin,dc=ime,dc=usp,dc=br" masterPw="secret
"
O arquivo /etc/smbldap-tools/smbldap.conf
contém as informações de configuração dos scripts que serão usados pelo Samba. O primeiro parâmetro que iremos configurar é o Security Identifier (SID) do domínio Samba. Esse número é uma hash utilizada pelos domínios Windows para identificar os recursos presentes na rede. Para obter esse número, digite o seguinte comando:
sudo net getlocalsid SID for domain SAMBASERVER is:
usuario
@sambaserver
:~$S-1-5-21-2244078416- 1265281458-506834435
Copie essa hash para que possamos colocá-la no arquivo de configuração do smbldap-tools. Não se esqueça de que se o Samba tiver sido instalado em um servidor diferente do que está rodando o LDAP, precisaremos configurar o suporte a TLS para os scripts do smbldap-tools, e também vamos precisar de uma cópia do certificado do servidor LDAP em /etc/ssl/certs
.
Um exemplo do arquivo /etc/smbldap-tools/smbldap.conf
configurado com suporte a TLS é exibido a seguir:
Exemplo 3.8. Arquivo de configuração /etc/smbldap-tools/smbldap.conf
###################################################################### # # General Configuration # ###################################################################### # Put your own SID. To obtain this number do: "net getlocalsid". # If not defined, parameter is taking from "net getlocalsid" return SID="S-1-5-21-2244078416-1265281458-506834435
" # Domain name the Samba server is in charged. # If not defined, parameter is taking from smb.conf configuration file # Ex: sambaDomain="IDEALX-NT" sambaDomain="LDAP.IME.USP.BR" ###################################################################### # # 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) # Slave LDAP server # Ex: slaveLDAP=127.0.0.1 # If not defined, parameter is set to "127.0.0.1" slaveLDAP="ldapserver
.ime.usp.br" # Slave LDAP port # If not defined, parameter is set to "389" slavePort="389" # Master LDAP server: needed for write operations # Ex: masterLDAP=127.0.0.1 # If not defined, parameter is set to "127.0.0.1" masterLDAP="ldapserver
.ime.usp.br" # Master LDAP port # If not defined, parameter is set to "389" 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) # If not defined, parameter is set to "1" ldapTLS="1" # 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/ssl/certs/ssl-cert-ldapserver
.pem" # certificate to use to connect to the ldap server # see "man Net::LDAP" in start_tls section for more details # clientcert="/etc/opt/IDEALX/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/opt/IDEALX/smbldap-tools/smbldap-tools.key" # LDAP Suffix # Ex: suffix=dc=IDEALX,dc=ORG suffix="dc=ime,dc=usp,dc=br" # Where are stored Users # Ex: usersdn="ou=Users,dc=IDEALX,dc=ORG" # Warning: if 'suffix' is not set here, you must set the full dn for # usersdn usersdn="ou=Users,${suffix}" # Where are stored Computers # Ex: computersdn="ou=Computers,dc=IDEALX,dc=ORG" # Warning: if 'suffix' is not set here, you must set the full dn for # computersdn computersdn="ou=Computers,${suffix}" # Where are stored Groups # Ex: groupsdn="ou=Groups,dc=IDEALX,dc=ORG" # Warning: if 'suffix' is not set here, you must set the full dn for # groupsdn groupsdn="ou=Groups,${suffix}" # Where are stored Idmap entries (used if samba is a domain member # server) # Ex: groupsdn="ou=Idmap,dc=IDEALX,dc=ORG" # Warning: if 'suffix' is not set here, you must set the full dn for # idmapdn idmapdn="ou=Idmap,${suffix}" # Where to store next uidNumber and gidNumber available for new users # and groups # If not defined, entries are stored in sambaDomainName object. # Ex: sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}" # Ex: sambaUnixIdPooldn="cn=NextFreeUnixId,${suffix}" sambaUnixIdPooldn="sambaDomainName=LDAP.IME.USP.BR,${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/%U" # Default mode used for user homeDirectory userHomeDirectoryMode="700" # 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="45" ###################################################################### # # SAMBA Configuration # ###################################################################### # The UNC path to home drives location (%U username substitution) # Just set it to a null string if you want to use the smb.conf 'logon # home' directive and/or disable roaming profiles # Ex: userSmbHome="\\PDC-SMB3\%U" userSmbHome="" # The UNC path to profiles locations (%U username substitution) # Just set it to a null string if you want to use the smb.conf 'logon # path' directive and/or disable roaming profiles # Ex: userProfile="\\PDC-SMB3\profiles\%U" userProfile="" # The default Home Drive Letter mapping # (will be automatically mapped at logon time if home directory exist) # Ex: userHomeDrive="H:" userHomeDrive="H:" # The default user netlogon script name (%U username substitution) # if not used, will be automatically username.cmd # make sure script file is edited under dos # Ex: userScript="startup.cmd" # make sure script file is edited under # dos userScript="logon.bat" # Domain appended to the users "mail"-attribute # when smbldap-useradd -M is used # Ex: mailDomain="idealx.com" mailDomain="ime.usp.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" # comment out the following line to get rid of the default banner # no_banner="1"
Com os scripts devidamente configurados, podemos inserir as entradas necessárias ao funcionamento do domínio do Samba no diretório LDAP através do script smbldap-populate:
sudo /usr/sbin/smbldap-populate Populating LDAP directory for domain LDAP.IME.USP.BR (S-1-5-21-22440 78416-1265281458-506834435) (using builtin directory structure) entry dc=ime,dc=usp,dc=br already exist. adding new entry: ou=Users,dc=ime,dc=usp,dc=br adding new entry: ou=Groups,dc=ime,dc=usp,dc=br adding new entry: ou=Computers,dc=ime,dc=usp,dc=br adding new entry: ou=Idmap,dc=ime,dc=usp,dc=br adding new entry: uid=root,ou=Users,dc=ime,dc=usp,dc=br adding new entry: uid=nobody,ou=Users,dc=ime,dc=usp,dc=br adding new entry: cn=Domain Admins,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Domain Users,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Domain Guests,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Domain Computers,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Administrators,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Account Operators,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Print Operators,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Backup Operators,ou=Groups,dc=ime,dc=usp,dc=br adding new entry: cn=Replicators,ou=Groups,dc=ime,dc=usp,dc=br entry sambaDomainName=LDAP.IME.USP.BR,dc=ime,dc=usp,dc=br already exist. Updating it... Please provide a password for the domain root: Changing UNIX and samba passwords for root New password:
usuario
@sambaserver
:~$secret
Retype new password:secret
Ele pedirá a senha do super-usuário do domínio Samba. Essa senha não precisa ser igual à senha do administrador LDAP. Essa senha é da conta root do domínio, que será usada para incluir as estações Windows ao mesmo.