Servidor Samba
Segundo a Wikipédia “Samba é um programa de computador, utilizado em sistemas operacionais do tipo Unix, que simula um servidor Windows, permitindo que seja feito gerenciamento e compartilhamento de arquivos em uma rede Microsoft.”
Conceituação sobre o Samba e seu modo de autenticação
Uma das características mais controversas do Samba é sua exigência de ter dois usuários: um no sistema operacional e outro do próprio “Samba”. Mas por que são necessários os dois usuários?
O primeiro motivo se refere ao fato do usuário Windows possuir mais atributos que um usuário Unix/Gnu/Linux tradicional.
O segundo motivo é que a base de senhas do SAMBA usa técnicas distintas de criptografia e armazenamento de senhas.
Outro grande motivo é que nem sempre queremos que exista a possibilidade de usuários SAMBA terem permissão de login em máquinas Gnu/Linux e vice-versa. (por exemplo, os usuários criados apenas para executar serviços como www, cramd).
Resumindo: O usuário SAMBA é sempre usado pelo servidor para autenticar alguém. O usuário Gnu/Linux correspondente é usado pelo servidor para fornecer credenciais de acesso a um recurso ou autorizar o usuário a acessar.
O SAMBA poderia optar por usar apenas um usuário especial no Gnu/Linux e controlar totalmente o acesso a arquivos e pastas usando recursos internos. Mas isso não é feito dessa forma. Uma das desvantagens claras dessa abordagem é que a segurança das pastas pessoais em uma rede mista não poderia ser facilmente administrada. Com apenas um dono, existiriam grandes problemas.
Além disso a abordagem de uso dos usuários registrados no Sistema Operacional em uso tem uma grande vantagem. Torna o SAMBA mais adaptável para uso em múltiplas plataformas.
Em ambientes onde não se deseja ter nenhum usuário local para validação no SAMBA, pode-se configurar o Gnu/Linux para espelhar todos os usuários locais em uma base LDAP. Isso é feito através da configuração dos módulos de autenticação PAM. Dessa forma os usuários do SAMBA e do sistema operacional passam a ser um só, ou seja, não há a necessidade de ter dois usuários, um do SAMBA e um do sistema operacional.
Apesar de ter um único usuário, nesse modelo, o SAMBA continua entendendo que são dois diferentes. A configuração do PAM será vista em um capítulo mais adiante.
Outro aspecto importante é a autenticação. O cliente envia um par usuário/senha. O servidor SAMBA usa este par para verificar se o usuário existe na base de usuários e se a senha está correta. Caso ocorra sucesso, o cliente é considerado como autenticado e suas credenciais serão usadas para as rotinas de Autorização.
Essa etapa corresponde ao “logon” em uma estação Windows ou o “logon” em um cliente SAMBA em Gnu/Linux.
Nessa etapa é possível ao cliente saber quais são os recursos que teoricamente estariam disponíveis a ele. Teoricamente por que o fato de um recurso ser visível e até mesmo reservado para uso para determinado usuário não significa que o usuário está autorizado a acessá-lo, as autorizações serão testadas no momento de acesso ao recurso. Assim, no ambiente de rede pode ser possível ver um compartilhamento e ainda assim a tentativa de acesso pode resultar em Acesso Negado.
O cliente autenticado tem seu status armazenado e quando necessita de um recurso da Rede, o servidor SAMBA verifica se esse cliente tem os direitos correspondentes ao recurso.
O controle de acesso ao recurso pode ser feito em dois locais:
No servidor SAMBA: Usando cláusulas de permissão e negação explícitas aos recursos como “valid users” e “invalid users” ou liberando acesso público e anônimo com “guest ok”;
No Sistema Operacional onde o SAMBA foi instalado: Esse é o método preferencial. O Samba respeita e usa os recursos de permissão e direitos do sistema operacional em uso. Assim no caso do Gnu/Linux, as permissões de arquivos serão respeitadas pelo SAMBA.
Dessa forma, como regras de ouro: O primeiro lugar onde deve-se procurar por problemas nas permissões de recursos é no próprio sistema de arquivos usando comandos como “ls -la” e “getfacl”. Mantenha o smb.conf limpo e trabalhe as permissões no sistema de arquivos. NÃO use “valid users” ou “invalid users”.
Com o recurso de ACL corretamente configurado, use o “Windows Explorer” para o trabalho de manutenção de permissões.
Caso não seja possível deixar de usar “invalid users” e “valid users”, nunca ofereça compartilhamentos totalmente abertos no sistema de arquivos e controlados por cláusulas SAMBA sem garantir que não há possibilidade de uso desses recursos por outro caminho (um login remoto diretamente no servidor).
A necessidade das etapas de Autenticação e de Autorização, junto com os mecanismos de troca e forma de senhas do protocolo CIFS/SMB, explicam a necessidade da adição de usuários ser feita tanto no Samba como no Gnu/Linux.
Instalando o Samba
O comando abaixo instala os pacotes SAMBA necessários:
Pacote de administração SAMBA +OpenLDAP (smbldap-tools); Pacote de autenticação Gnu/Linux na base OpenLDAP(libnss-ldap); Documentação SAMBA (samba-doc); Utilitários de configuração de listas de controle de acesso no sistema de arquivos(acl).
Não é necessário se preocupar em responder corretamente as questões que serão apresentadas nesta etapa. Os servidores serão configurados manualmente, desta forma, os princípios de configuração podem ser melhor adaptados a outras distribuições.
Para instalar o Samba execute o comando abaixo:
aptitude install samba smbclient smbldap-tools samba-doc acl
Samba como PDC
O Samba pode armazenar sua base de usuários em um servidor de serviços de diretórios OpenLDAP. A grande vantagem é que com a solução integrada SAMBA + OpenLDAP a tarefa de administração de usuários é bastante facilitada, pois o mapeamento de grupos e usuários é automático e a adição de usuários ao Gnu/Linux e à base de usuários SAMBA é feita simultaneamente, com sincronização de senhas.
Além disso, atualmente, a integração Samba + OpenLDAP é a única maneira prática para implementação de uma solução com vários servidores entre matriz e filiais que compartilham a mesma base de usuários.
Nesta solução, tanto os usuários do Gnu/Linux quanto os usuários SAMBA serão armazenados em uma base OpenLDAP.
A distribuição de exemplo é Debian Etch, contudo os princípios são os mesmos para todas as distribuições, com eventuais mudanças nos nomes de arquivos e/ou locais de armazenamento.
Instalando o schema do Samba no OpenLDAP
Será necessário ativar o “schema” do samba para que o OpenLDAP seja capaz de utilizar seus atributos e portanto armazenar usuários que sirvam para validação em uma rede Microsoft.
1. Copie o arquivo samba.schema, disponível no pacote samba-doc, com o comando abaixo:
zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
2. Edite o arquivo de configuração do OpenLDAP, “slapd.conf” e insira a linha abaixo logo depois das opções “include” já existentes:
include /etc/ldap/schema/samba.schema
3. Procure pela opção ”index” e adicione logo abaixo dela:
index memberUID,mail,givenname eq index sambaSID,sambaPrimaryGroupSID,sambaDomainName eq
4. Procure pela opção “access to attrs=userPassword” e na mesma linha, adicione à lista de atributos o seguinte:
,sambaLMPassword,sambaNTPassword
O resultado final dessa linha deve ser:
access to attrs=userPassword,shadowLastChange,sambaLMPassword,sambaNTPassword
5. Pare o OpenLDAP com o comando:
/etc/init.d/slapd stop
6. Indexe a base com o comando:
slapindex -v
7. Corrija possíveis erros de permissionamento com o comando:
chown openldap: /var/lib/ldap/*
8. Inicie o OpenLDAP com o comando abaixo:
/etc/init.d/slapd start
Configurando o Samba para usar LDAP
As linhas de automação com uso do smbldap-tools são essenciais para o processo de adição de usuários por ferramentas Windows como o User Manager for Domains. Além disso, o processo de adição de máquinas ao domínio é automatizado.
Para facilitar vamos oferecer aqui um smb.conf pronto para o funcionamento. Estes parâmetros devem ser copiados no smb.conf original que estiver em produção respeitando as possíveis diferenças.
1. Crie uma cópia de segurança do arquivo de configuração original do Samba com o comando:
mv /etc/samba/smb.conf /etc/samba/smb.conf.original
2. Crie um arquivo de configuração novo, chamado /etc/samba/smb.conf e adicione o seguinte conteúdo:
[global] workgroup = labopenldap netbios name = LABSRV username map = /etc/samba/smbusers add user script = /usr/sbin/smbldap-useradd -m -a "%u" delete user script = /usr/sbin/smbldap-userdel "%u" add group script = /usr/sbin/smbldap-groupadd -p "%g" delete group script = /usr/sbin/smbldap-groupdel "%g" add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g" delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g" set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u" add machine script = /usr/sbin/smbldap-useradd -a -w "%u" domain logons = Yes preferred master = Yes wins support = Yes passdb backend = ldapsam:ldap://ldap__.kyapanel.com.br ldap suffix = dc=kyapanel,dc=com,dc=br ldap machine suffix = ou=Usuarios ldap user suffix = ou=Usuarios ldap group suffix = ou=Grupos ldap admin dn = cn=admin,dc=kyapanel,dc=com,dc=br
3. Informe ao Samba a senha do usuário “admin” do OpenLDAP com o comando:
smbpasswd -w senha
4. Crie um arquivo de usuários do samba com o comando abaixo:
> /etc/samba/smbusers
5. Reinicie o Samba com o comando:
/etc/init.d/samba restart
6. Anote a identificação do domínio. Ela será necessária para configurar o “smbldap-tools”. Para ver a identificação do domínio execute o seguinte comando:
net getlocalsid
Configurando o smbldap-tools
Para que as ferramentas do “smbldap-tools” funcionem como o esperado, se faz necessário configurá-las. Veja a seguir:
1. Copie os arquivos smbldap_bind.conf e smbldap.conf
zcat /usr/share/doc/smbldap-tools/examples/smbldap.conf.gz >/etc/smbldap-tools/smbldap.conf cp /usr/share/doc/smbldap-tools/examples/smbldap_bind.conf /etc/smbldap-tools/smbldap_bind.conf
2. Edite o arquivo /etc/smbldap-tools/smbldap_bind.conf e altere-o para que fique com as opções abaixo:
slaveDN="cn=admin,dc=kyapanel,dc=com,dc=br" slavePw="senha" masterDN="cn=admin,dc=kyapanel,dc=com,dc=br" masterPw="senha"
3. Edite o arquivo /etc/smbldap-tools/smbldap.conf, modificando apenas as linhas citadas abaixo:
credencial do domínio
SID="S-1-5-21-3420362730-2273518020-356174992"
# Nome do domínio do SAMBA
sambaDomain=”LABOPENLDAP”
#A raiz do servdor OpenLDAP
suffix="dc=kyapanel,dc=com,dc=br"
#Onde armazenar
usersdn="ou=Usuarios,${suffix}"
computersdn="ou=Usuarios,${suffix}"
groupsdn="ou=Grupos,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=labopenldap,${suffix}"
#Configuração padrão para pastas, mapeamento e script de logon
userSmbHome="\\%L\homes\%U"
userProfile="\\%L\profiles\%U"
userHomeDrive="P:"
userScript="%U.bat"
mailDomain="kyapanel.com.br"
#Configurando o suporte a TLS
cafile="/etc/ldap/tls/cacert.pem"
clientcert="/etc/ldap/tls/srvcert.pem"
clientkey="/etc/ldap/tls/srvkey.pem"
4. O smbldap-tools se encarrega de criar a base LDAP necessária para execução da solução. Para tanto, execute o comando:
smbldap-populate -u 2000 -g 2000
OBSERVAÇÃO: Se o SID (o identificador do domínio) não estiver devidamente configurado, os recursos adicionados não serão válidos para o domínio em uso. Os parâmetros -u e -g servem para indicar o uid e gid mínimos usados pelas ferramentas smbldap-tools.
O smbldap-adduser faz parte do conjunto de ferramentas smbldap-tools. Sem essas ferramentas, as vantagens no processo de administração de uma Solução SAMBA+OpenLDAP seriam muito menores. Por exemplo, a criação prévia de um usuário Gnu/Linux antes da adição de um usuário ou estação seria necessária, usando ferramentas distintas para cada etapa.
Testes de funcionamento
Usar o comando “smbldap-populate” é eficiente, somente se o objetivo for migrar os usuários existentes no Sistema Operacional para a base LDAP É claro que ele também ajuda na criação dos grupos. Entretanto se o objetivo for validar os usuários já existentes na base LDAP ele não será efetivo.
Isso se deve a falta dos atributos necessários nos usuários existentes para poder realizar essa validação. O que deve ser feito neste caso é adicionar os atributos exigidos pelo Samba aos usuários existentes na base LDAP.
Para adicionar a habilidade de validar no Samba aos usuários “posix” existentes teremos que realizar algumas etapas:
1. Adicionar o usuário e o seu grupo ao Sistema Operacional:
useradd -s /bin/false fulano1 groupadd fulano1
2. Adicionar os atributos necessários ao usuário e grupo “fulano1” para que ele possa se autenticar no Samba:
smbldap-usermod -a fulano1 smbldap-groupmod -a fulano1
3. Também será necessário redefinir sua senha. Como estamos usando a senha igual ao uid, então:
(echo fulano1 ; echo fulano1) | smbldap-passwd fulano1
Um pequeno truque para não ter que digitar a senha duas vezes
4. Agora sim podemos testar nossa validação. Para isso basta usar o comando abaixo:
smbclient -L localhost -U fulano1%fulano1
Este comando faz uma busca pelos compartilhamentos no servidor indicado pela opção “-L”. Já a opção “-U” define usuário%senha
Se a validação acontecer com sucesso então lhe será mostrado algo parecido com isto:
Domain=[LABOPENLDAP] OS=[Unix] Server=[Samba 3.0.24]
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (Samba 3.0.24)
Domain=[LABOPENLDAP] OS=[Unix] Server=[Samba 3.0.24]
Server Comment
--------- -------
LABSRV Samba 3.0.24
Workgroup Master
--------- -------
LABOPENLDAP LABSRV
Caso contrário a mensagem de retorno será:
session setup failed: NT_STATUS_LOGON_FAILURE
Script
Visando facilitar o processo de alteração de diversos usuários, que tal fazer um script?
1. Crie um arquivo chamado “para_smb.sh” e insira o seguinte conteúdo:
#! /bin/bash
ROOTDN="cn=admin,dc=kyapanel,dc=com,dc=br"
ROOTPW="senha"
SUFFIX="dc=kyapanel,dc=com,dc=br"
ALL_USERS=`ldapsearch -x -b "ou=Usuarios,$SUFFIX" -LLL uid | grep uid: |
cut -d" " -f2`
for EACH in $ALL_USERS ; do
SMB_PASS="$EACH"
# Adiciona usuários locaiss
useradd -s /bin/false $EACH
groupadd $EACH
# Adiciona os atributos necessários nas contas unix para que elas sejam,
# também contas do Samba
smbldap-usermod -a $EACH
smbldap-groupmod -a $EACH
# Altera a senha nos atributos do samba e do unix
(echo $SMB_PASS ; echo $SMB_PASS) | smbldap-passwd $EACH
done
2. Agora basta executar o script com o comando:
sh para_smb.sh
Licença
Copyright 2007 Anahuac de Paula Gil e Francisco Kem Iti Saito
Permite-se distribuição, publicação e cópia literal da íntegra deste documento, sem pagamento de royalties, desde que sejam preservadas a nota de copyright, a URL oficial do documento e esta nota de permissão.
Permite-se também distribuição, publicação e cópia literal de seções individuais deste documento, sem pagamento de royalties, desde que sejam preservadas a nota de copyright e a nota de permissão acima, e que a URL oficial do documento seja preservada ou substituída pela URL oficial da seção individual.