O módulo
cracklib tem suporte para uso de mais de trinta dicionários, que podem ser instalados e servir de referência para análise e bloqueio de senhas a serem utilizadas na rede (por serem dedutíveis). Iniciaremos pela instalação e configuração do módulo cracklib, com as especificações de padrões mínimos de segurança nas senhas dos usuários.
# apt-cache search cracklib
cracklib-runtime - runtime support for password checker library cracklib2
cracklib2 - pro-active password checker library
cracklib2-dev - pro-active password checker library - development
libpam-cracklib - PAM module to enable cracklib support
# apt-get install libpam-cracklib cracklib2 cracklib2-dev cracklib-runtime
A instalação inicial permite algumas verificações básicas, que podem ser estendidas por meio de ajustes, os quais veremos em seguida. Comecemos pelas verificações básicas habilitadas pelo módulo, que são as seguintes:
- Impede o uso de senha reversa: password => drowssap;
- Não autoriza atualização de senha que comporte somente mudança no case da senha anterior: password => Password; e,
- Define a quantidade aceitável de diferença mínima entre os caracteres da senha anterior e da senha atual. Definida na variável 'difok=n';
Essas configurações mínimas podem ser estendidas por meio do incremento de funcionalidades, tais como: dicionário de senhas não-autorizadas, histórico de senhas anteriores, tamanho mínimo/máximo de cada senha, e prazo de expiração de senhas. Dessa forma, conforme o nível de paranoia estabelecido, poderemos estabelecer uma política de uso aceitável referente à utilização de senhas na nossa rede interna.
A habilitação do uso do módulo cracklib se dá por meio dos arquivos de gerenciamento de mudança senhas, existente no diretório de administração dos módulos PAM (/etc/pam.d), e ajustamos as configurações de mudanças de senha nos arquivos 'common-password' ou 'system-auth', conforme estejamos em distribuições baseadas no Debian ou no Red Hat.
Contudo, essas alterações poderão ser efetuadas diretamente no arquivo de gerenciamento do programa login (/etc/pam.d/login) ou no arquivo de gerenciamento do ambiente gráfico (/etc/pam.d/kdm ou /etc/pam.d/gdm), se não desejarmos habilitá-las para outros programas do sistema (ssh, mysql, vsftp, postfix).
Por isso, se alterarmos os arquivos 'common-password'ou 'system-auth', as modificações aplicam-se a todos os programas e usuários, e se alterarmos nos arquivos 'login', 'kdm' ou 'gdm', as modificações aplicam-se somente a estes programas.
Utilizaremos o modelo de alteração geral, a fim de reforçar a política de segurança em todas as aplicações e usuários, e por isso, editaremos o arquivo correspondente ao gerenciamento geral de trocas de senhas, em distribuição debian-like (/etc/pam.d/common-password):
# vi /etc/pam.d/common-password
password required pam_cracklib.so retry=3 minlen=6 difok=3
password required pam_unix.so md5 remember=10 use_authtok
As linhas estabelecem os critérios a serem utilizados, quando for solicitada a modificação da senha pelos usuários, ou aplicações com suporte ao PAM, da seguinte forma:
- retry=3 # admite-se somente três tentativas de login incorretas antes de impedir o acesso ao terminal
- minlen=6 # somente senhas com tamanho mínimo de seis caracteres serão aceitas
- difok=3 # tem que haver, pelo menos, três caracteres de diferença entre a senha anterior e a senha atual
- md5 # hash utilizado pelas senhas em /etc/shadow
- remember=10 # quantidade de senhas memorizadas, e que não podem ser reutilizadas
- use_authtok # utiliza a senha digitada anteriormente, desde que não tenha havido falha na autenticação
Assim, poderemos ter a autenticação concentrada no arquivo comum e herdada pelos demais aplicativos, e editarmos o arquivo de login, a fim de que herde essas configurações:
# vi /etc/pam.d/login
@include common-auth
@include common-session
@include common-account
@include common-password
Habilitaremos a memorização de senhas através de operações complementares, destinadas criar o arquivo para histórico das mesmas:
# touch /etc/security/opasswd
# chown root.root /etc/security/opasswd
# chmod 600 /etc/security/opasswd
# passwd
Changing password for aquaman
(current) UNIX password:
New UNIX password:
BAD PASSWORD: has been already used
New UNIX password:
A ferramenta 'chage' nos permite verificar e alterar as configurações de contas do sistema. Utilizaremos essa ferramenta para definir a expiração de contas, mantendo a consistência da nossa política de uso aceitável:
# chage -h
Uso: chage [opções] usuário
-d, --lastday ÚLTIMO_DIA
# define última mudança de senha para ULTIMO_DIA
-E, --expiredate DATA_EXPIRAÇÃO
# define data de expiração de senha para DATA_EXPIRAÇÃO
-h, --help
# exibe esta mensagem de ajuda e finaliza
-I, --inactive INATIVO
# define senha inativa após expiração para INATIVO
-l, --list
# exibe informação sobre idade da conta
-m, --mindays MIN_DIAS
# define números mínimo de dias antes da troca de senha para MIN_DIAS
-M, --maxdays MAX_DIAS
# define números máximo de dias antes da troca de senha para MAX_DIAS
-W, --warndays AVISO_DIAS
# define dias para aviso de expiração para AVISO_DIAS
# chage -l aquaman
Última mudança de senha : Out 04, 2009
Senha expira em : Nov 03, 2009
Senha inativa : nunca
Conta expira em : nunca
Número mínimo de dias entre a mudança de senhas : 8
Número máximo de dias entre a mudança de senha : 30
Número de dias de aviso antes da senha expirar : 7
Definiremos 90 dias como o tempo de vida da conta, 30 dias como o tempo de renovação de senha e 7 dias como o tempo para aviso de vencimento da senha:
# chage -E 12/24/2009 -I 12/24/2009 -M 30 -W 7 aquaman
# chage -l aquaman
Última mudança de senha : Out 04, 2009
Senha expira em : Nov 03, 2009
Senha inativa : Nov 15, 2009
Conta expira em : Dez 24, 2009
Número mínimo de dias entre a mudança de senhas : 8
Número máximo de dias entre a mudança de senha : 30
Número de dias de aviso antes da senha expirar : 7
Temos portanto um sistema gerenciável de contas. Podemos agora gerenciar o uso das senhas.