Antes de iniciarmos a parte prática, alguns avisos são necessários:
NÃO realize testes de aprendizado sobre PAM em sua máquina de uso primário. Utilize uma máquina virtual ou alguma que não seja de uso necessário, pois, caso o PAM fique mal configurado, você terá muito trabalho para reverter a situação. Experiência própria rsrs :-)
SEMPRE mantenha uma conexão de root reservada. Dessa forma será possível alterar as configurações caso haja algum erro impossibilitando realizar autenticação.
Vamos criar um usuário para realizar os testes da nossa configuração:
# useradd placebo
Lembre-se de atribuir uma senha qualquer para o usuário placebo.
Como prática do nosso artigo, consideraremos a utilização do diretório /etc/pam.d/, do arquivo /etc/pam.d/system-auth e outros arquivos de configuração utilizados pelos módulos descritos no /etc/pam.d/system-auth.
O objetivo deste arquivo é fornecer uma configuração comum para diversos serviços e daemons que utilizam o PAM. Normalmente, outros arquivos do PAM incluem o conteúdo do /etc/pam.d/system-auth.
O arquivo
/etc/pam.d/system-auth terá o seguinte conteúdo:
auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_unix.so try_first_pass likeauth nullok
auth required /lib/security/pam_deny.so
auth required /lib/security/pam_tally.so deny=5 unlock_time=216000
account required /lib/security/pam_unix.so
account required /lib/security/pam_access.so
account required /lib/security/pam_tally.so deny=5 unlock_time=21600
password required /lib/security/pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3
password sufficient /lib/security/pam_unix.so try_first_pass use_authtok md5 shadow
password required /lib/security/pam_deny.so
session required /lib/security/pam_limits.so
session required /lib/security/pam_env.so
session required /lib/security/pam_unix.so
O módulo
pam_cracklib, do tipo password, é responsável por fazer uma checagem mínima de segurança e tamanho da uma senha sendo trocada. Ele utiliza a biblioteca CrackLib, uma versão resumida do Crack, um programa para ataques de dicionários.
Ao usar essa biblioteca, o pam_cracklib dificulta a escolha de senhas baseadas em senhas de dicionários. O módulo pam_cracklib permite ainda que se defina o tamanho mínimo de uma senha e incentivar, por mecanismos de crédito, o uso de maiúsculas e minúsculas, bem como símbolos e números.
O argumento
retry=3 especifica que serão realizadas 3 tentativas antes de retorna um erro.
O
minlen=8 estipula o tamanho mínimo de 8 caracteres para a senha.
O
difok=2 estipula o mínimo de caracteres diferentes da senha antiga para a nova.
O módulo
pam_access é do tipo account e providencia controle de acesso ao login do usuário. É possível realizar o controle considerando os nomes de login, nomes de hosts ou domínios, endereços de internet ou rede, ou linhas de terminais. Por padrão, o arquivo
/etc/security/access.conf é utilizado para armazenar as regras de gerenciamento.
O código abaixo apresenta um exemplo auto-instrutivo de configuração do arquivo
/etc/security/access.conf utilizado pelo pam_access.so. Os sinais '+' e '-' garantem e negam acesso, respectivamente.
Obs.: Os arquivos estão inteiramente comentados para que os testes sejam realizados por demanda. Desta forma, tem-se um melhor entendimento do que cada comando realiza e diminui a possibilidade de confusão no uso dos mesmos.
# início arquivo access.conf
# sintaxe é dada por "permissão : usuários : origens"
#
# não queremos ninguém acessando de hell.com ou spam.net
#- : ALL : .hell.com .spam.net
# não queremos login no terminal, exceto do usuário root
#- : ALL EXCEPT root : tty1
# negar acesso de root vindo da rede interna
#- : root: 192.168.
# placebo pode acessar da máquina london
#+ : placebo : london
# membros do grupo musicians podem acessar de qualquer local
#+ : musicians : ALL
# ninguém mais pode acessar
#- : ALL : ALL
# fim arquivo access.conf
IMPORTANTE: Observe que, com esta configuração, estamos impedindo do usuário root acessar a partir da rede interna. Logo, caso você esteja realizando as configurações da rede interna, NÃO FECHE A CONEXÃO, pois ela não poderá ser restabelecida pelo root. Para evitar possíveis problemas com o PAM, sempre mantenha uma conexão de root reservada. Dessa forma será possível alterar as configurações caso haja algum erro impossibilitando realizar autenticação.
O módulo pam_limits, do tipo session, é usado para limitar o uso de recursos da máquina. O módulo PAM configura um limite aos recursos do sistema que podem ser obtidos em uma seção de usuário. Por padrão, as informações necessárias ao módulo são carregadas a partir do arquivo /etc/security/limits.conf.
No arquivo de configuração limits.conf, o campo domain pode ser um usuário, nomes de grupos (indicados por @) ou coringas (*, %). O campo type é usado como grau de flexibilidade de limite de recursos. O item especifica qual recurso está sendo limitado, abrangendo número máximo de arquivos abertos (nofile), tempo máximo de uso da CPU (cpu), número máximo de processos (nproc), número máximo de logins (maxlogins), prioridade com a qual são executadas as aplicações (priority), dentre outros.
Um exemplo do arquivo de configuração
/etc/security/limits.conf é listado abaixo:
# início arquivo limits.conf
# sintaxe é dada por: "domain type item value"
#
# limita uso da memória em 10Mb
#* hard rss 10000
# limita número de processos do usuário root
#placebo hard nproc 0
# limita o número de logins do grupo musicians
#@musicians soft maxlogins 4
# limita o tempo de uso da cpu para qualquer
# usuário em 8 horas (480 minutos)
#* hard cpu 480
# fim arquivo limits.conf
Outro módulo bem interessante é o
pam_tally, do tipo auth e account. Ele mantém um contador de tentativas de acesso ao sistema. Pode ser reiniciado ao se obter sucesso na operação ou negar acesso se muitas tentativas falharem.
O argumento
deny=5 bloqueia o acesso se o contador de tentativas atingir 5.
O
unlock_time=21600 especifica que o acesso só será permitido novamente após 6 horas (21600 segundos). Por padrão, as informações de contadores de login ficam registradas no arquivo /var/log/faillog.
Outro módulo importante, que também deve ser adicionado ao /etc/pam.d/system-auth é o
pam_deny. Este módulo nega o acesso ao usuário, sendo utilizado para garantir que o usuário não consiga autenticar-se em caso de falha nos módulos anteriores. Dessa maneira, ele imprime uma segurança extra no esquema de autenticação.
Além dos anteriores, o módulo pam_unix também deve ser adicionado ao system-auth. É o módulo padrão de autenticação Unix. Usualmente irá obter as informações dos arquivos /etc/passwd e /etc/shadow.
O parâmetro nullok é usado para sobrescrever o comportamento padrão de bloquear usuários com password em branco. O parâmetro try_firs_pass faz com que o módulo tente usar a senha usada anteriormente em algum outro módulo. use_authtok indica ao pam_unix para utilizar o password configurado pelos módulos do tipo password da pilha de módulos. O parâmetro md5 é o algoritmo usado para criptografia do password.
Para configurar adequadamente as variáveis de ambiente do usuário, deve ser adicionado o módulo pam_env.
As variáveis de ambiente devem ser configuradas no arquivo
/etc/security/pam_env.conf.
O arquivo
/etc/security/access.conf foi alterado conforme descrito anteriormente. Assim como os arquivos
/etc/security/time.conf e
/etc/security/limits.conf. Altere-os em sua máquina para que os testes funcionem perfeitamente.