Integração entre Samba e Active Directory com Shell Script
CAPA
Esse AD dá samba
O Samba foi feito, em parte, para “conversar” adequadamente com o Active
Directory. Veja como usar scripts shell para fazer essa conversa fluir.
por Miguel Mucio Santos Moreira
Gabriel Negreiros – www.sxc.hu
E
m artigos recentes na Linux
Magazine, vimos como integrar o Linux ao Active Directory de duas formas: a primeira via
Samba, Kerberos e Winbind [1], e
a outra via Likewise Open [2], uma
interface gráfica que facilita a configuração dessa integração.
Esses artigos contemplaram o Linux como uma estação de trabalho.
Para implementar essa integração
num servidor de arquivos Samba, a
situação se torna mais complicada;
afinal, se criarmos usuários e grupos
no AD e utilizarmos um servidor
de arquivos Samba, como faremos
Listagem 1: Arquivo smb.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
[global]
workgroup = NETTEO
server string = Servidor de Arquivos
netbios name = center
security = ads
password server = server.netteo.com.br
realm = NETTEO.COM.BR
encrypt passwords = yes
wins server = server.netteo.com.br
idmap uid = 10000-20000
idmap gid = 10000-20000
template shell = /bin/false
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
winbind separator = +
directory mask = 0770
create mask = 0660
42
para que as pastas, permissões e
compartilhamentos sejam gerados
de forma automática?
Este artigo possui o intuito de
mostrar, em sua grande maioria, a
parte prática dessa integração que
será executada por meio do Samba,
do Winbind, do Kerberos e uma boa
dose de scripts shell.
A distribuição utilizada para escrevê-lo foi Red Hat Enterprise Linux, mas a solução deve funcionar
sem problema algum no Fedora e
no CentOS.
Mão na massa
Primeiramente, precisamos configurar o sistema para que ele consiga
resolver o nome DNS do servidor
Kerberos Windows 2003, seja por
meio do servidor DNS da rede, seja
com auxílio do arquivo /etc/hosts.
Em seguida, devemos configurar o
Samba, que é um conjunto de ferramentas incluindo um daemon que
permite que máquinas Windows e
Linux se comuniquem por meio dos
protocolos SMB (Server Message
Block) e CIFS (Commom Internet
File System), sendo o principal responsável pela integração proposta.
Vamos à listagem 1, que mostra
o arquivo smb.conf e seus principais
parâmetros.
O parâmetro workgroup deve receber o valor do nome do domínio
– no caso, NETTEO. O item security
= ads faz com que o Linux repasse a
senha para o controlador de domínio
do AD. O valor de wins server deve
receber o nome do servidor do AD,
e os parâmetros idmap uid e idmap gid
se referem aos IDs que serão atribuídos aos usuários e grupos presentes
no Active Directory.
Após a configuração do Samba,
devemos configurar o Kerberos e o
NSS (Name Service Switch).
O Kerberos é um protocolo de
autenticação de rede projetado para
prover autenticação robusta para aplicações cliente/servidor por meio de
chaves criptografadas. Ele trabalha
com uma área denominada realm
ou domínio, área essa que possui os
clientes Kerberos e o Centro de Distribuição de Chaves, composto por
um servidor de autenticação (AS) e
um servidor de tíquetes (TS).
Como o nosso servidor exercerá a
função de cliente Kerberos, precisaremos configurar somente o arquivo
/etc/krb5.conf. Para isso, modifique o
arquivo de acordo com a listagem 2.
A seção logging contém a relação
de locais onde os componentes do
Kerberos irão gerar seus logs. Na seção libdefaults, o principal parâme-
http://www.linuxmagazine.com.br
Samba e AD | CAPA
tro é default_realm, responsável por
identificar qual será o realm padrão
utilizado pelo cliente Kerberos. A
seção realms é onde devemos especificar quais são os realms existentes
em nossa rede. A seção domain_realm
faz o mapeamento entre domínios
DNS e domínios Kerberos. Por fim,
a seção appdefaults contém os valores
padrão que podem ser utilizados por
aplicações do Kerberos.
Feita essa configuração, devemos
testar a conexão com algum usuário
do domínio:
kinit usuário do domínio
Se o comando não retornar nenhum dado na tela, poderemos executar o comando klist para verificar
se o tíquete foi realmente emitido. A
saída do comando mostrará algumas
informações, tais como o usuário que
solicitou o tíquete e a sua validade.
O NSS é o responsável pelo controle de como um cliente ou aplicativo obtém informações relacionadas
a usuários pela rede. Devemos configurá-lo no arquivo /etc/nsswitch.
conf, definindo o parâmetro winbind
nos bancos de dados passwd e group,e
fazendo com que o NSS, juntamente
com o winbind, mapeie os usuários e
grupos do Windows, definindo UIDs
e GIDs válidos no ambiente Linux.
Por isso devemos ter a certeza de
que, se criarmos usuários e grupos
localmente no Linux por algum
motivo – por exemplo, um usuário
de FTP–, devemos fazer com que o
Linux não use os mesmos IDs que
estão sendo usados pelo Winbind/
NSS e que foram configurados no
Samba. Por essa razão, vamos editar
o arquivo /etc/login.defs (listagem
3), responsável pelo padrão usado
pelos comandos useradd e groupadd,
e alterar os valores necessários.
Como os IDs que foram definidos
no Samba para uso do Winbind estão no intervalo de 10.000 a 20.000,
podemos usar qualquer faixa dife-
Linux Magazine #56 | Julho de 2009
rente desta para usuários locais.
Vale ressaltar que o
winbind trabalha com
um sistema de cache
para os usuários e grupos. Sendo assim, caso
haja necessidade de que
toda alteração feita no
Active Directory seja
refletida imediatamente
no servidor de arquivos,
devemos alterar a execução do serviço para que
ele possa ser executado
sem cache. Para isso
vamos editar o arquivo
/etc/init.d/winbind na
seção start e modificar
a linha daemon winbind
“$WINBINDOPTIONS”, definindo o parâmetro -n,
como na listagem 4.
O arquivo de controle dos IDs dos usuários
Windows que estão sendo mapeados no Linux
é /var/cache/samba/winbind.tdb. Esse arquivo
deve possuir uma rotina
de becape, pois se ele for
corrompido poderemos
ter problemas com os
IDs, uma vez que a criação de um novo arquivo
pode ocasionar em IDs
diferentes daqueles definidos anteriormente.
Para realizar esse becape, lançaremos mão
de um utilitário do pró-
Listagem 2: Arquivo /etc/krb5.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = NETTEO.COM.BR
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
NETTEO.COM.BR = {
kdc = 10.15.0.2
admin_server = 10.15.0.2
default_domain = netteo.com.br
}
[domain_realm]
.netteo.com.br = NETTEO.COM.BR
netteo.com.br = NETTEO.COM.BR
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
Exemplo 3: Arquivo /etc/login.defs
# Min/max values for automatic
# uid selection in useradd
#
UID_MIN 500
UID_MAX 1000
#
# Min/max values for automatic
# gid selection in groupadd
#
GID_MIN 500
GID_MAX 1000
Exemplo 4: Trecho do arquivo /etc/init.d/winbind
start() {
KIND=”Winbind”
echo -n $”Starting $KIND services: “
daemon winbindd -n “$WINBINDOPTIONS”
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/winbindd || RETVAL=1
return $RETVAL
}
43
CAPA | Samba e AD
Figura 1O authconfig permite ativar o uso do Winbind para autenticação.
Figura 2Ainda no authconfig, é fácil configurar os demais parâmetros de
autenticação via Winbind.
prio Samba, chamado tdbbackup,
específico para essa solução. Além
disso, ele possui a vantagem de tentar recuperar um arquivo caso este
esteja corrompido. Sua sintaxe é
bem simples:
44
membro do domínio NETTEO, por
isso devemos inseri-lo no domínio.
net ads join –U Administrator
tdbbackup -s sufixobecape arquivo
tdbbackup -v arquivocorrompido
Reinicie os serviços do Samba e
do Winbind. Em seguida, vamos listar os usuários e grupos do domínio
para verificar se está tudo em ordem.
Apesar de toda essa configuração,
nosso servidor Samba ainda não é
wbinfo –u
wbinfo –g
Mesmo que os comandos acima
retornem os usuários e grupos do
AD, o Linux ainda não está preparado para autenticar os usuários que
acessarão os compartilhamentos.
Por isso, devemos configurar o PAM
(Pluggable Authentication Modules),
modificando-o para que consiga validar os usuários e seus respectivos
grupos por meio do Winbind. No
caso da distribuição utilizada no
ambiente proposto, basta executar
o comando authconfig e habilitar
os parâmetros Utilizar Winbind e
Utilizar Autenticação Winbind (figura 1). Na próxima tela (figura 2),
basta confirmar a opção OK, pois o
restante da configuração já está efetivado. Caso seja desejável habilitar
manualmente esses parâmetros, basta
editar o arquivo /etc/pam.d/systemauth e alterá-lo conforme as linhas 6,
10 e 14 da listagem 5.
Vale ressaltar que nos comentários
da descrição do arquivo system-auth,
ele recomenda que se utilize o authconfig em vez de se editar manualmente o arquivo.
Para verificar se a configuração citada anteriormente foi efetivada, basta
executar o comando getent passwd. Se
o comando retornar os usuários cadastrados no Active Directory, significa
que a configuração foi bem sucedida.
Poderoso shell
Agora sim vamos para a parte interessante e que é o coração de toda a
automatização da nossa integração:
os scripts que controlam a criação
das pastas, dos compartilhamentos
e também das permissões dos nossos
grupos e usuários.
Três scripts e alguns arquivos são
responsáveis por toda essa automatização e possuem um diretório padrão já predeterminado. Caso haja
necessidade de alterar o caminho,
basta alterar o arquivo parametros.
Os scripts supõem que cada usuário e grupo no AD deve ter uma pasta
e um compartilhamento no servidor
http://www.linuxmagazine.com.br
Samba e AD | CAPA
Listagem 5: Arquivo /etc/pam.d/system-auth
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
#%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
auth
sufficient /lib/security/$ISA/pam_winbind.so use_first_pass
auth
required
/lib/security/$ISA/pam_deny.so
account
account
account
account
required
/lib/security/$ISA/pam_unix.so broken_shadow
sufficient /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet
[default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_winbind.so
required
/lib/security/$ISA/pam_permit.so
password
password
password
password
requisite
sufficient
sufficient
required
/lib/security/$ISA/pam_cracklib.so retry=3
/lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
/lib/security/$ISA/pam_winbind.so use_authtok
/lib/security/$ISA/pam_deny.so
session
session
required
required
/lib/security/$ISA/pam_limits.so
/lib/security/$ISA/pam_unix.so
de arquivos. Se for necessário criar
grupos e usuários sem compartilhamentos, basta editar alguns arquivos
de controle que serão detalhados
posteriormente.
Após todo o processo de integração e após obter a devida cópia dos
arquivos nos respectivos diretórios
que estão definidos no arquivo parametros, devemos executar o script
scriptAD.sh (listagem 6, disponível
em [3]), responsável pela criação
das pastas e dos compartilhamentos
iniciais do servidor Samba. Porém,
como sabemos, o AD possui alguns
usuários que executam determinadas
tarefas do Windows, como a conta
krbtgt, que contém as chaves para
o serviço Centro de Distribuição de
Chaves, e alguns grupos como o
domain users, que é o grupo padrão
dos usuários do domínio, sendo que
estes não necessitam de compartilhamentos no nosso servidor Samba.
Sendo assim, nessa primeira execução deveremos inserir esses usuários
e grupos diretamente em scriptAD.
sh, na linha 26, que é a parte responsável por esse controle.
Na listagem 6 vemos a inclusão dos
grupos e dos usuários no servidor de
arquivos, sendo que para a inclusão
dos usuários o script cria as pastas no
Linux Magazine #56 | Julho de 2009
sistema de arquivos, define as permissões necessárias e gera a mensagem
de inclusão do usuário.
Na inclusão dos grupos, após criar
as pastas e definir as permissões necessárias no sistema de arquivos, o script
cria também uma seção de compartilhamento do grupo no arquivo smb.
conf. Podemos observar também que
o script gera um arquivo de becape
do smb.conf no diretório /etc/samba/
smbold/, que deve ser criado manualmente antes da execução do script.
A execução da inclusão dos usuários não necessita da criação de uma
seção do compartilhamento para
Listagem 6: Criação de usuários em scriptAD.sh
13 until [ $SN == “sim” -o $SN == “nao” ]; 14 do
15 read -p “Primeira execuçao do Script?(sim/
nao):” SN
16 done
17 if [ $SN == “sim” ]; then
18 pidof winbindd > /dev/null && pidof smbd > /
dev/null
19 if [ $? -eq 0 ]; then
20 echo $MSG02
21 wbinfo -u >&- 2> /dev/null
22 if [ $? -eq 0 ]; then 23 echo $MSG03
24 echo $MSG04 25 # Gerando arquivos de usuarios/grupos
26 wbinfo -u | grep “\(administrator\|guest
\|support_388945a0\|krbtgt\)” > $SCRIPTUSER/users_bultin && wbinfo
-g | grep “\(BUILTIN+users\|BUILTIN+administrators\|domain*\|schema
admins\|enterprise admins\|group policy creator
owners\|dnsupdateproxy\)” > $SCRIPTGROUP/groups_bultin
27 if [ $? -eq 0 ]; then
28 echo $MSG05 29 wbinfo
-u | grep -v $\$ | grep -v -f $SCRIPTUSER/users_
bultin > $SCRIPTUSER/users && wbinfo -g | grep -v -f $SCRIPTGROUP/
groups_bultin > $SCRIPTGROUP/groups
45
CAPA | Samba e AD
Listagem 7: Trecho de userscript.sh para controle de usuários
43 for linedelnovo in `cat $SCRIPTUSER/usersnew`
44 do
45 if [ $linedelatual = $linedelnovo ]; then
46 user=0
47 break
48 else
49 user=1
50 fi
51 done
52 if [ $user -ne 0 ]; then
53 excluiusuario
54 fi
55 done
56
57 mv $SCRIPTUSER/usersnew $SCRIPTUSER/users
58
...
110 echo $MSG16 $linedelatual >> $LOGPATH/scriptuser
111 tar czvf $BKPPATH/$linedelatual.tar.gz $HOMEDIR/$linedelatual
112 if [ “$?” -eq 0 ]; then
113 echo “Backup usuario $linedelatual executado COM sucesso” >> $LOGPATH/scriptuser
114 rm -rf $HOMEDIR/$linedelatual 115 else 116 echo “Backup usuario $linedelatual executado SEM sucesso favor verificar” >> $LOGPATH/
scriptuser
117 fi 118 }
119
120 adicionausuario() {
121 echo $MSG07 $lineaddnovo >> $LOGPATH/scriptuser
Listagem 8: Trecho de groupscript.sh para controle de grupos
26 for lineaddnovogroup in `cat
$SCRIPTGROUP/groupsnew` 27 do 28 for lineaddatualgroup in `cat
$SCRIPTGROUP/groups`
29 do
30 if
[ $lineaddnovogroup = $lineaddatualgroup ]; then
31 group=0
32 break
33 else
34 group=1 35 fi
36 done 37 if [ $group -ne 0 ]; then 38 adicionagrupo
39 fi
40 done
41 # Validacao exclusao grupo
42
...
109
110 # Gerando backup smb.conf
111 cat /etc/samba/smb.conf > “/etc/samba/smbold/smb.
conf.`date | awk -F” “ ‘{print $1”-”$3”-”$2”-”$6””$4}’`”
46
112 mkdir $GRUPODIR/$lineaddnovogroup
113 chmod 770 $GRUPODIR/$lineaddnovogroup
114 chown :$lineaddnovogroup
$GRUPODIR/$lineaddnovogroup
115 echo $MSG08 $lineaddnovogroup >> $LOGPATH/
scriptgroup
116 echo “# Compartilhamento $lineaddnovogroup gerado
por script `date`” >> /etc/samba/smb.conf
117 echo [$lineaddnovogroup] >> /etc/samba/smb.conf
118 echo “ “valid users =
+$DOMINIO+$lineaddnovogroup >>/etc/samba/smb.conf
119 echo “ “read only = no >> /etc/samba/smb.conf
120 echo “ “force group = $lineaddnovogroup >>
/etc/samba/smb.conf
121 echo “ “browseable = yes >> /etc/samba/smb.conf
122 echo “ “path = $GRUPODIR/$lineaddnovogroup >> /etc/samba/smb.conf
123 echo “ “comment = diretorio grupo
$lineaddnovogroup >> /etc/samba/smb.conf
124 }
125
126 excluigrupo() {
127
http://www.linuxmagazine.com.br
Samba e AD | CAPA
cada usuário, pois o Samba trata os
compartilhamentos de todos os usuários por meio do compartilhamento
especial homes.
O script scriptAD.sh só deve ser executado uma vez após isso. Os scripts
userscript.sh (listagem 7, também
disponível em [3]) e groupscript.
sh (listagem 8, idem), responsáveis
pelo controle dos usuários e dos
grupos, respectivamente, devem ser
agendados no crontab. Esses scripts
controlam as contas que não devem
possuir compartilhamentos por meio
dos arquivos users_builtin (listagem
9) e groups_builtin (listagem 10), por
isso devemos adicionar essas contas
manualmente, linha a linha, nos
arquivos.
A listagem 7 ilustra a criação da
lista de usuários atuais do Active
Directory no arquivo usersnew. Em
seguida, deve-se comparar linha a linha o arquivo usersnew com o arquivo
users, que é o arquivo de controle
do servidor Samba. Se a comparação
for verdadeira, significa que o usuário já possui compartilhamento no
servidor Samba e não deve ser adicionado, e então o script passa para
um novo usuário na lista usersnew. Se
o usuário ainda não possuir compartilhamento no servidor, é executada
a função adicionausuario, que cria a
pasta do usuário, define as permissões necessárias e gera um log da
inclusão do usuário.
Para excluir o usuário, o script lê
o arquivo users e compara linha a
linha com o arquivo usersnew. Se
a comparação for verdadeira, significa que o usuário existe no Active
Directory e que por isso não deve
ser excluído, então ele passa para
um novo usuário na lista users. Se
a comparação não for verdadeira,
significa que o usuário não existe
no Active Directory e que por isso
deve ser excluído, então é executada a função excluiusuario, que cria
um becape dos arquivos do usuário
numa área de becape definida no
Linux Magazine #56 | Julho de 2009
arquivo parametros. Após o becape,
seu diretório home é excluído, gerando
também um log da exclusão.
No fim da inclusão e da exclusão
dos usuários, o script renomeia o arquivo usersnew para users.
A inclusão e a exclusão dos grupos
(listagem 8) no servidor de arquivos
seguem a mesma lógica da inclusão
e exclusão dos usuários, com as ressalvas de que o arquivo de controle
é o arquivo groups, e na criação e
exclusão dos grupos o script cria ou
remove a seção do compartilhamento
do grupo em smb.conf.
Para saber a periodicidade da execução dos scripts, podemos utilizar
o comando time seguido do nome
do script para medir o tempo das
execuções dos scripts. Logicamente,
essa medição é apenas uma forma de
tentar aproximar a execução da real
necessidade, pois, em determinados
momentos, quando a inclusão e a
exclusão de grupos e usuários forem
maiores ou menores, esse tempo variará muito, mas numa situação em
que as inclusões e exclusões sejam
constantes e regulares, essa medição
será muito útil. Sua sintaxe é:
time script
Após essa estimativa de tempo, podemos incluir os scripts para execução pelo crontab e fazer novos testes
incluindo e excluindo contas no AD.
Listagem 9:
Arquivo users_builtin
administrator
guest
support_388945a0
krbtgt
Listagem 10:
Arquivo groups_builtin
BUILTIN+administrators
BUILTIN+users
domain computers
domain controllers
schema admins
enterprise admins
domain admins
domain users
domain guests
group policy creator owners
dnsupdateproxy
Conclusão
O shell script é uma poderosa ferramenta que nos proporciona uma
enorme flexibilidade para automatizar
diversas tarefas, das mais complexas
às mais simples, e que, em cooperação com o Samba e com outros
serviços aqui mencionados, fazem
com que a integração desses dois
ambientes tão heterogêneos seja a
mais transparente possível. Dessa
maneira, leva o slogan do projeto
Samba a parecer ainda mais verdadeiro: “Opening Windows to a wider
world” – interprete como quiser. n
Mais informações
[1]Walter Neu, “Domando os cães do inferno”:
http://lnm.com.br/article/2424
[2]Walter Neu, “Na ativa”: http://lnm.com.br/article/2534
[3]Scripts deste artigo: http://lnm.com.br/arquivos/LM/56/samba_ad/
Sobre o autor
Miguel Mucio Santos Moreira ([email protected]) é graduado em Gestão de Software Livre, possui certificação LPIC 1 e é Analista de Suporte na Prodemge – Companhia de Tecnologia
da Informação do Estado de Minas Gerais.
47
Download

Esse AD dá samba - Linux Magazine Online