Servidor Samba "Autoservice"
Buscamos, no presente arquivo, apresentar um programa em linguagem shell script e interface em modo texto destinado a configurar um Servidor de Domínio Samba. Utilizamos os módulos do PAM para implementar uma política de acesso e exportação de compartilhamentos.
Parte 4: Verificando o perfil srv
O Servidor de Arquivos necessita de contas para usuários e máquinas que o acessam, e pode operar com usuários locais ou usuários do Domínio. A forma mais segura de tê-lo em funcionamento consiste em ter um cadastro local dos usuários que necessitam acessar os serviços no servidor. Cabe ao administrador avaliar se o Servidor de Arquivos deve ser standalone ou um membro do Domínio considerado.
O código referente ao perfil srv é o seguinte:
A função cria_samba constrói o Servidor propriamente dito e a função cria_base deve ser utilizada para estabelecer o diretório a ser criado com a função de aceitar a criação dos demais compartilhamentos como subdiretórios. Somente depois que são criados os grupos no servidor é que devemos incluir os usuários e os demais compartilhamentos.
Observamos a função que cria o Servidor de Arquivos:
A base dos compartilhamentos recebe sgid a fim de possibilitar a criação de outros compartilhamentos:
O acréscimo de novos compartilhamentos é exportado pelo Servidor através do módulo de configuração do pam_mount, como se vê no compartilhamento público e na criação de grupos:
As configurações podem ser editadas e adaptadas às necessidades específicas da organização considerada.
O código referente ao perfil srv é o seguinte:
srv(){
tput cup 0 19;
trap ' ' 1 2 3 9 15;
tput cup 10 12;echo "
######################################################################
PROGRAMA DE CONFIGURAÇÃO DE SERVIDOR DE ARQUIVOS LINUX - Versão 0.3.7
Autor: LOURIVAL ARAÚJO DA SILVA - 5º CTA - RECIFE - PE
Liberado sob GPL em 02 de novembro de 2008
######################################################################
1 - Criar SERVIDOR DE ARQUIVOS SAMBA
2 - Criar o Diretório dos Compartilhamentos no SERVIDOR
3 - Criar Grupos e Compartilhamentos Restritos
4 - Criar Compartilhamento Publico
5 - Incluir usuário nos Grupos do Servidor de Arquivos
6 - Excluir usuário do Servidor de Arquivos
7 - Bloquear senha de usuário do Servidor de Arquivos
8 - Desbloquear senha de Usuário no Servidor de Arquivos
9 - Sair do programa de configuração
#####################################################################
#####################################################################
"
echo -n " Digite a opcao de configuração desejada: "
read opcao
case $opcao in
1) cria_samba
;;
2) cria_base
;;
3) cria_grupo
;;
4) cria_publico
;;
5) inclui_usuario
;;
6) exclui_usuario
;;
7) bloqueia_usuario
;;
8) desbloqueia_usuario
;;
9)
clear
continue
;;
*) valor_invalido;
;;
esac
}
tput cup 0 19;
trap ' ' 1 2 3 9 15;
tput cup 10 12;echo "
######################################################################
PROGRAMA DE CONFIGURAÇÃO DE SERVIDOR DE ARQUIVOS LINUX - Versão 0.3.7
Autor: LOURIVAL ARAÚJO DA SILVA - 5º CTA - RECIFE - PE
Liberado sob GPL em 02 de novembro de 2008
######################################################################
1 - Criar SERVIDOR DE ARQUIVOS SAMBA
2 - Criar o Diretório dos Compartilhamentos no SERVIDOR
3 - Criar Grupos e Compartilhamentos Restritos
4 - Criar Compartilhamento Publico
5 - Incluir usuário nos Grupos do Servidor de Arquivos
6 - Excluir usuário do Servidor de Arquivos
7 - Bloquear senha de usuário do Servidor de Arquivos
8 - Desbloquear senha de Usuário no Servidor de Arquivos
9 - Sair do programa de configuração
#####################################################################
#####################################################################
"
echo -n " Digite a opcao de configuração desejada: "
read opcao
case $opcao in
1) cria_samba
;;
2) cria_base
;;
3) cria_grupo
;;
4) cria_publico
;;
5) inclui_usuario
;;
6) exclui_usuario
;;
7) bloqueia_usuario
;;
8) desbloqueia_usuario
;;
9)
clear
continue
;;
*) valor_invalido;
;;
esac
}
A função cria_samba constrói o Servidor propriamente dito e a função cria_base deve ser utilizada para estabelecer o diretório a ser criado com a função de aceitar a criação dos demais compartilhamentos como subdiretórios. Somente depois que são criados os grupos no servidor é que devemos incluir os usuários e os demais compartilhamentos.
Observamos a função que cria o Servidor de Arquivos:
cria_samba(){
echo -n "Digite um nome do seu Domínio ou Grupo de Trabalho: "
read dominio
echo -n "Digite o nome desse Servidor Samba: "
read servidor
echo -n "Digite o nome da conta do Administrador desse Servidor Samba (admin): "
read admin
echo -n "Digite a Rede desse Servidor (192.168.0.0/16): "
read rede
sudo smbpasswd -a $admin
echo -n "Deseja juntar o Servidor Samba a um Domínio ? [sim|nao] "
read resp
if [ $resp == sim ];then
echo -n "Digite o nome do Domínio: "
read ndominio
echo -n "Digite o nome do Servidor de Domínio: "
read nservidor
echo -n "Digite o nome do administrador do Domínio [admin]: "
read nadmin
sudo net rpc join -W $ndominio -S $servidor -U $nadmin
continue
else
clear
continue
fi
echo "
[globals]
workgroup = $dominio
netbios name = $servidor
domain master = no
security = user
encrypt passwords = yes
os level = 30
log file = /var/log/samba/log.%m
max log size = 1000
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
hosts allow = 127.0.0.0/8 $rede
obey pam restrictions = Yes
passwdb backend = /etc/samba/smbpasswd
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n*password\supdated\ssuccessfully* .
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
idmap uid = 10000-20000
idmap gid = 10000-20000
template homedir = /home/%U
template shell = /bin/bash
[home]
path = /home
browseable = no" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo mv /tmp/smb.conf /etc/samba/smb.conf
echo "Configurando o horário de acesso ao Servidor..."
echo "
login;*;*;Wd0800-1800 & !SaSu0000-2359
ssh;*;*;Wd0800-1800 & !SaSu0000-2359
">/tmp/time.conf
sudo cat /tmp/time.conf >>/etc/security/time.conf
}
echo -n "Digite um nome do seu Domínio ou Grupo de Trabalho: "
read dominio
echo -n "Digite o nome desse Servidor Samba: "
read servidor
echo -n "Digite o nome da conta do Administrador desse Servidor Samba (admin): "
read admin
echo -n "Digite a Rede desse Servidor (192.168.0.0/16): "
read rede
sudo smbpasswd -a $admin
echo -n "Deseja juntar o Servidor Samba a um Domínio ? [sim|nao] "
read resp
if [ $resp == sim ];then
echo -n "Digite o nome do Domínio: "
read ndominio
echo -n "Digite o nome do Servidor de Domínio: "
read nservidor
echo -n "Digite o nome do administrador do Domínio [admin]: "
read nadmin
sudo net rpc join -W $ndominio -S $servidor -U $nadmin
continue
else
clear
continue
fi
echo "
[globals]
workgroup = $dominio
netbios name = $servidor
domain master = no
security = user
encrypt passwords = yes
os level = 30
log file = /var/log/samba/log.%m
max log size = 1000
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
hosts allow = 127.0.0.0/8 $rede
obey pam restrictions = Yes
passwdb backend = /etc/samba/smbpasswd
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n*password\supdated\ssuccessfully* .
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
idmap uid = 10000-20000
idmap gid = 10000-20000
template homedir = /home/%U
template shell = /bin/bash
[home]
path = /home
browseable = no" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo mv /tmp/smb.conf /etc/samba/smb.conf
echo "Configurando o horário de acesso ao Servidor..."
echo "
login;*;*;Wd0800-1800 & !SaSu0000-2359
ssh;*;*;Wd0800-1800 & !SaSu0000-2359
">/tmp/time.conf
sudo cat /tmp/time.conf >>/etc/security/time.conf
}
A base dos compartilhamentos recebe sgid a fim de possibilitar a criação de outros compartilhamentos:
cria_base(){
echo -n "Indique a localização do Diretório dos compartilhamentos (/dados): " # Criar o diretorio-base
read base
sudo mkdir -p $base
sudo chmod -R 2777 $base/
echo -n "Diretorio-Base criado em $base"
}
echo -n "Indique a localização do Diretório dos compartilhamentos (/dados): " # Criar o diretorio-base
read base
sudo mkdir -p $base
sudo chmod -R 2777 $base/
echo -n "Diretorio-Base criado em $base"
}
O acréscimo de novos compartilhamentos é exportado pelo Servidor através do módulo de configuração do pam_mount, como se vê no compartilhamento público e na criação de grupos:
cria_publico(){
echo -n "Digite o nome do Diretório [publico]: " # Criar compartilhamento de leitura/escrita para todos
read compart
echo -n "Indique o diretório de compartilhamento (/dados): "
read base
echo "Criando compartilhamento publico... "
sudo mkdir -p $base/$compart
if( ! (grep nobody /etc/passwd ) );then
sudo useradd -s /bin/bash -d /dev/null -g nogroup nobody 2>/dev/null
sudo passwd -l nobody 2>/dev/null
sudo smbpasswd -a nobody
fi
sudo chown -R nobody.nogroup $base/$grupo
sudo chmod 2777 $base/$compart
echo "
[$compart]
path = $base/$compart
writable = yes
browseable = yes
public = yes
guest ok = yes" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo cat /tmp/smb.conf >>/etc/samba/smb.conf
echo "Compartilhamento publico criado em $base... "
sleep 2
echo "Exportando compartilhamento publico criado no Servidor..."
echo "
volume * smbfs $servidor $compart ~/$compart uid=&,gid=&,dmask=0750 - -
">/tmp/pam_mount.conf
sudo cat /tmp/pam_mount.conf >>/etc/security/pam_mount.conf
sleep 3
}
cria_grupo(){
echo -n "Digite o nome do Grupo: " # Incluir grupos no Servidor de domínio
read grupo
echo -n "Digite o caminho do Diretório dos compartilhamentos no Servidor (/dados): "
read base
echo "Criando compartilhamento no Servidor... "
echo -n "Deseja criar o diretório do grupo somente para leitura ? [sim/nao] "
read resp
if [ $resp == sim ];then
sudo groupadd $grupo
echo "Criando compartilhamento somente para leitura... " # Compartilhar somente leitura para
sudo mkdir -p $base/$grupo # os membros do grupo
sudo chgrp -R $grupo $base/$grupo
sudo chmod -R 2750 $base/$grupo
echo "
[$grupo]
path = $base/$grupo
writable = no
browseable = yes
read list = @$grupo
write list = @$grupo
admin users = @$grupo @secinfo" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo cat /tmp/smb.conf >>/etc/samba/smb.conf
echo "Criando compartilhamento sem escrita em $base... "
sleep 2
echo "Exportando compartilhamento sem escrita criado no Servidor..."
echo "
volume * smbfs $servidor $compart ~/$compart uid=&,gid=&,dmask=2750, - -
">/tmp/pam_mount.conf
sudo cat /tmp/pam_mount.conf >>/etc/security/pam_mount.conf
sleep 3
else
sudo groupadd $grupo
echo "Criando compartilhamento para leitura e escrita do grupo... " # Compartilhar leitura/escrita
sudo mkdir -p $base/$grupo # somente para os membros do grupo
sudo chgrp -R $grupo $base/$grupo
sudo chmod -R 2770 $base/$grupo
sudo echo "
[$grupo]
path = $base/$grupo
writable = yes
browseable = yes
read list = @$grupo
write list = @$grupo
admin users = @$grupo @secinfo" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo cat /tmp/smb.conf >>/etc/samba/smb.conf
echo "Criando compartilhamento com escrita em $base... "
sleep 2
echo "Exportando compartilhamento com escrita criado no Servidor..."
echo "
volume * smbfs $servidor $compart ~/$compart uid=&,gid=&,dmask=2770 - -
">/tmp/pam_mount.conf
sudo cat /tmp/pam_mount.conf >>/etc/security/pam_mount.conf
sleep 3
fi
echo -n " Grupo $grupo criado em $base."
sleep 2
}
echo -n "Digite o nome do Diretório [publico]: " # Criar compartilhamento de leitura/escrita para todos
read compart
echo -n "Indique o diretório de compartilhamento (/dados): "
read base
echo "Criando compartilhamento publico... "
sudo mkdir -p $base/$compart
if( ! (grep nobody /etc/passwd ) );then
sudo useradd -s /bin/bash -d /dev/null -g nogroup nobody 2>/dev/null
sudo passwd -l nobody 2>/dev/null
sudo smbpasswd -a nobody
fi
sudo chown -R nobody.nogroup $base/$grupo
sudo chmod 2777 $base/$compart
echo "
[$compart]
path = $base/$compart
writable = yes
browseable = yes
public = yes
guest ok = yes" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo cat /tmp/smb.conf >>/etc/samba/smb.conf
echo "Compartilhamento publico criado em $base... "
sleep 2
echo "Exportando compartilhamento publico criado no Servidor..."
echo "
volume * smbfs $servidor $compart ~/$compart uid=&,gid=&,dmask=0750 - -
">/tmp/pam_mount.conf
sudo cat /tmp/pam_mount.conf >>/etc/security/pam_mount.conf
sleep 3
}
cria_grupo(){
echo -n "Digite o nome do Grupo: " # Incluir grupos no Servidor de domínio
read grupo
echo -n "Digite o caminho do Diretório dos compartilhamentos no Servidor (/dados): "
read base
echo "Criando compartilhamento no Servidor... "
echo -n "Deseja criar o diretório do grupo somente para leitura ? [sim/nao] "
read resp
if [ $resp == sim ];then
sudo groupadd $grupo
echo "Criando compartilhamento somente para leitura... " # Compartilhar somente leitura para
sudo mkdir -p $base/$grupo # os membros do grupo
sudo chgrp -R $grupo $base/$grupo
sudo chmod -R 2750 $base/$grupo
echo "
[$grupo]
path = $base/$grupo
writable = no
browseable = yes
read list = @$grupo
write list = @$grupo
admin users = @$grupo @secinfo" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo cat /tmp/smb.conf >>/etc/samba/smb.conf
echo "Criando compartilhamento sem escrita em $base... "
sleep 2
echo "Exportando compartilhamento sem escrita criado no Servidor..."
echo "
volume * smbfs $servidor $compart ~/$compart uid=&,gid=&,dmask=2750, - -
">/tmp/pam_mount.conf
sudo cat /tmp/pam_mount.conf >>/etc/security/pam_mount.conf
sleep 3
else
sudo groupadd $grupo
echo "Criando compartilhamento para leitura e escrita do grupo... " # Compartilhar leitura/escrita
sudo mkdir -p $base/$grupo # somente para os membros do grupo
sudo chgrp -R $grupo $base/$grupo
sudo chmod -R 2770 $base/$grupo
sudo echo "
[$grupo]
path = $base/$grupo
writable = yes
browseable = yes
read list = @$grupo
write list = @$grupo
admin users = @$grupo @secinfo" >>/tmp/smb.conf
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo cat /tmp/smb.conf >>/etc/samba/smb.conf
echo "Criando compartilhamento com escrita em $base... "
sleep 2
echo "Exportando compartilhamento com escrita criado no Servidor..."
echo "
volume * smbfs $servidor $compart ~/$compart uid=&,gid=&,dmask=2770 - -
">/tmp/pam_mount.conf
sudo cat /tmp/pam_mount.conf >>/etc/security/pam_mount.conf
sleep 3
fi
echo -n " Grupo $grupo criado em $base."
sleep 2
}
As configurações podem ser editadas e adaptadas às necessidades específicas da organização considerada.