Arquivos de configuração
O propósito do do projeto PAM é separar a concessão de privilégios nos aplicativos do desenvolvimento de esquemas de autenticação apropriados e seguros. Isto é realizado fornecendo-se uma biblioteca de funções utilizada pelas aplicações para solicitar a autenticação de usuários.
As bibliotecas PAM são configuradas no arquivo /etc/pam.conf ou no diretório/etc/pam.d/. Vale ressaltar que não é possível utilizar as duas formas de configuração do LinuxPAM. O administrador deve usar o arquivo /etc/pam.conf ou o diretório /etc/pam.d/, não os dois ao mesmo tempo.
Os arquivos de configuração utilizam módulos normalmente localizados no diretório /lib/security/ ou /lib64/security/ e se comportam como objetos carregáveis dinamicamente.
A configuração do arquivo /etc/pam.conf deve seguir o seguinte formato:
service-name module-type control-flag module-path args
Onde:
-
service-name: indica o nome do serviço associado à configuração (login, ftpd, su etc)
-
module-type: informa ao Linux-PAM qual o tipo de módulo utilizado, havendo um módulo para cada tipo de tarefa. Pode ser auth, account, session e password.
-
control-flag: indica à biblioteca PAM como reagir em caso de sucesso ou falha. Como os módulos podem ser empilhados e executados em série, um após o outro, este parâmetro informa a importância relativa de cada módulo, garantindo que todas as restrições para uma dada autenticação sejam satisfeitas.
-
module-path: indica o caminho da biblioteca PAM, o arquivo de módulo a ser utilizado.
-
args: são informações úteis ao módulo PAM durante o processo de negociação com a aplicação. Consiste de uma lista de argumentos a ser enviada ao módulo quando este for invocado.
Após a versão 0.56, o Linux-PAM permite uma forma mais flexível de configuração do sistema, através de arquivos dispostos no diretório /etc/pam.d/. Neste caso, cada serviço possuir um arquivo de mesmo nome no diretório. Assim, o serviço smtp será configurado via arquivo /etc/pam.d/smtp.
Os arquivos no diretório /etc/pam.d/ são configurados de forma similar à configuração do /etc/pam.conf. Entretanto, como o nome do serviço já é o nome do arquivo, o parâmetro service-name não é utilizado. Dessa forma, cada entrada em um arquivo no /etc/pam.d/ possui a seguinte forma:
module-type control-flag module-path args
Algumas vantagens da utilização desta configuração simplificada do PAM são: facilidade de manutenção, possibilidade de fazer links simbólicos de um arquivo a outro, restrição de leitura do arquivo de configuração de uma dada aplicação e gerenciamento de instalações facilitado.
Sintaxe dos arquivos de configuração
O parâmetromodule-type está relacionado com o tipo de gerenciamento de tarefa realizado peloLinux-PAM, podendo ser: gerenciamento de autenticação (auth), gerenciamento de conta (account), gerenciamento de sessão (session) e gerenciamento de senha (password).
account: realiza o gerenciamento não-autenticado contas. É tipicamente usado para permitir ou negar acesso a serviços de um usuário em uma data ou máquina específica, além de permitir controles diversos, como expiração de senha.
auth: fornece dois aspectos para autenticação de usuário. Primeiramente, verifica se o usuário realmente é quem ele diz ser, instruindo a aplicação a solicitar a senha ou outra forma de identificação. Além disso ele pode configurar credenciais ou privilégios do usuário, como estabelecer a quais grupos o usuário pertence.
password: é utilizado para alterar a senha (ou outro mecanismo de autenticação do usuário). Em geral é utilizado após o módulo auth, para exigir a senha antiga antes da nova.
session: providencia o controle das ações realizadas antes e depois da conexão do usuário ao serviço disponibilizado pela aplicação PAM. Isso inclui informações relacionadas a montagens de diretórios, configuração de variáveis de ambiente, registro de atividades etc.
O parâmetro control-flag indica o comportamento da API PAM no caso de sucesso ou falha no processo de autenticação. Há dois tipos de sintaxe para este campo, uma mais simples (amplamente usada) e outra mais complexa envolvendo pares de valor-ação. Neste artigo, usaremos a mais simples, que consiste da seguintes palavras-chave:
- required: indica que o sucesso do módulo é necessário ao sucesso da tarefa especificada pelo parâmetro module-type. A falha desse módulo não interromperá a checagem dos outros módulos de mesmo tipo.
- requisite: funciona de maneira similar à opção required. No entanto, em caso de falha, o controle é retornada automaticamente para a aplicação desconsiderando-se os outros módulos do mesmo tipo.
- sufficient: o sucesso de um módulo com a opção sufficient é suficiente para satisfazer a pilha de módulos destinada ao tipo de módulo onde é usado. O Linux-PAM retorna imediatamente o controle para a aplicação desconsiderando os demais módulos do mesmo tipo. A falha nesse módulo, entretanto, não implica em falha da pilha, a menos que seja o único.
- optional: o sucesso ou falha deste módulo somente é importante se ele é o único módulo na pilha associada com o serviço especificado.É utilizado em módulos que oferecem algum serviço ao usuário, mas que não são críticos ao processo de autenticação como um todo.
O parâmetro module-path, se iniciado com o caractere ‘/’, é o caminho completo do módulo que será carregado pelo PAM, caso contrário, o Linux-PAM considera o caminho relativo ao diretório /lib/security/ ou /lib64/security/.
O parâmetro args consiste de uma lista de argumentos separados por espaço usados para modificar o comportamento de um dado módulo PAM. É específico de cada módulo
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=216000account 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
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=216000account 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
# 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
# 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