| PAM é a parte principal da autenticação em um sistema Linux. |
|
|
|
| Escrito por cristhian | ||||||||||||||||||||||||||||||||||||||||||||||
| Sex, 24 de Dezembro de 2010 03:29 | ||||||||||||||||||||||||||||||||||||||||||||||
PAMPAM é a parte principal da autenticação em um sistema Linux. PAM significa Pluggable Authentication Modules, ou Módulos de Autenticação Plugáveis/Modulares. Originalmente a autenticação no Linux era apenas via senhas criptografadas armazenadas em um arquivo local chamado /etc/passwd. Um programa como o login pedia o nome do usuário e a senha, criptografava a senha e comparava o resultado com o armazenado naquele arquivo. Se fossem iguais, garantia o acesso à máquina. Caso contrário, retornava erro de autenticação. Isto até funciona muito bem para o programa login, mas, digamos que agora eu queira usar isso também para autenticação remota. Ou seja, a base de usuários não está mais na mesma máquina, mas sim em alguma outra máquina da rede, o chamado servidor de autenticação. Teremos que mudar o programa login para que ele também suporte esse tipo de autenticação remota. Surgiu um novo algoritmo de criptografia, muito mais avançado, mais rápido, criptografa melhor, etc. Queremos usar esse novo algoritmo. Claro que teremos que mudar novamente o programa login para que ele suporte este novo algoritmo também. No Linux, muitos programas utilizam algum tipo de autenticação de usuários. Imagine se todos eles tivessem que ser reescritos cada vez que se mudasse algum dos critérios de autenticação. Para resolver este tipo de problema, a Sun® criou o PAM há alguns anos e liberou as especificações em forma de RFC. O Linux derivou sua implementação do PAM a partir deste documento. Com PAM, o aplicativo login deste exemplo teria que ser reescrito apenas uma vez, justamente para suportar PAM. A partir de então, o aplicativo delega a responsabilidade da autenticação para o PAM e não se envolve mais com isso. Voltando ao exemplo anterior, no caso de se querer utilizar um outro algoritmo de criptografia para as senhas, basta que o módulo PAM seja modificado para que todos os aplicativos automaticamente e de forma transparente passem a usufruir desta nova forma de autenticação. PAM possui uma outra vantagem: é possível configurar a autenticação de forma individual para cada aplicativo. Com isto é possível fazer com que, por exemplo, um usuário comum possa usar os dispositivos de áudio do computador desde que tenha se logado na máquina através do console. Se o login não tiver sido feito no console (por exemplo, é um login remoto via ssh), este tipo de acesso ao hardware será negado. Será que os programas login ou ssh sabem alguma coisa sobre o dispositivo de áudio da máquina? É claro que não. Eles não precisam. Os módulos PAM se encarregam disso. Na verdade, PAM vai um pouco além da autenticação. Os módulos podem ser divididos em quatro tipos:
Um módulo PAM pode ou não conter todas estas funções. O módulo pam_pwdb, por exemplo, pode ser usado nestes quatro tipos e possui ações diferentes em cada uma das situações, enquanto que pam_console é normalmente usado apenas como session. 7.3.1.1. InstalaçãoOs módulos PAM já vêm instalados por padrão no Conectiva Linux. Você pode verificar procurando, na lista de pacotes instalados do synaptic, pelo pacote pam. 7.3.1.2. PAM no LinuxPraticamente todos os aplicativos do Linux que requerem algum tipo de autenticação suportam PAM. Na verdade, não funcionam sem PAM. Toda a configuração está localizada no diretório /etc/pam.d. Quando um aplicativo suporta PAM, ele necessita de um arquivo de configuração neste diretório. A Figura 7-1 ilustra como funciona a autenticação com PAM usando o programa login como exemplo: Um programa com suporte a PAM possui duas interfaces com a biblioteca: a de autenticação e a de conversação. A interface de autenticação é por onde a aplicação pede que o PAM valide o usuário. A de conversação é usada pelos módulos que, por exemplo, precisem passar alguma informação para o usuário, como um prompt, ou um aviso de que a senha expirou. Isso é tudo o que a aplicação sabe sobre o processo de autenticação feito pelo PAM. A conversação está ilustrada na figura no módulo pam_pwdb (b). A biblioteca PAM vai procurar o arquivo de configuração da aplicação login. Este arquivo é /etc/pam.d/login e vai dizer quais módulos devem ser usados e com que parâmetros. Este arquivo está reproduzido a seguir:
A primeira coluna em um arquivo de configuração PAM representa o tipo de módulo: auth, account, password ou session. Neste exemplo, todos estão presentes, mas isto não é obrigatório. Se um programa não tiver suporte à troca de senha, o tipo "password" não é usado. A segunda coluna define a flag de controle para o seu respectivo módulo. O resultado de cada módulo pode influenciar de diversas formas o resultado do processo de autenticação geral. Há algumas categorias:
Por fim, a terceira coluna define o nome do módulo que será usado e seus parâmetros. Todos os módulos estão documentados em /usr/doc/pam-versão. Vamos aqui apenas ilustrar como funcionam os usados no programa login. Em primeiro lugar, observamos que todos os módulos são required, ou seja, não podem falhar. Com exceção do pam_console. 7.3.1.2.1. pam_securettyEste é o primeiro módulo a ser usado e ele simplesmente verifica o terminal de onde o login está ocorrendo. Este módulo não usa parâmetros, mas possui um arquivo de configuração: /etc/securetty. Neste arquivo listamos os terminais a partir dos quais o usuário root pode fazer login. Ou seja, são os terminais considerados seguros. Apesar do nome terminais, conexões remotas também são controladas por aqui, pois elas alocam pseudoterminais (telnet, etc). O módulo retorna sucesso para qualquer usuário diferente de root e, se for root, somente se o terminal de onde está vindo o login estiver listado no arquivo /etc/securetty. Na série 2.2.x do kernel, os pseudoterminais são alocados dinamicamente em um sistema de arquivos virtual, o /dev/pts. Para permitir o login de root via telnet, por exemplo, basta acrescentar ao /etc/securetty: pts/0. Note que isto somente liberará o pseudoterminal pts/0. Veja no exemplo seguir:
A primeira conexão telnet ganhou o pseudoterminal pts/0. Já a segunda teve o pts/1 alocada para si, e este pseudoterminal não estava listado no arquivo /etc/securetty. Portanto, o acesso não foi autorizado. Por que isto não funciona com ssh, por exemplo? Se olharmos o arquivo de configuração PAM para o ssh, veremos que o módulo pam_securetty não está presente ali. SSH possui seu próprio mecanismo de acesso para o usuário root, mas nada impede que pam_securetty seja acrescentado no arquivo PAM. O módulo pam_securetty também pode ser usado para controlar o login a partir do ambiente gráfico, por exemplo. Basta acrescentar o módulo ao arquivo /etc/pam.d/kde (se o kdm estiver sendo usado para login gráfico). A linha a ser acrescentada ao arquivo /etc/securetty (além de se acrescentar pam_securetty aos respectivos arquivos PAM, é claro) é: :0. Isto para o display zero. Para permitir o login de root em outros displays, a sintaxe é: :DISPLAY . O objetivo original deste módulo é o de evitar o login do root em terminais inseguros. Este conceito de terminais foi estendido ao login remoto (através dos pseudoterminais). 7.3.1.2.2. pam_pwdbO módulo pam_pwdb é o módulo principal da autenticação do programa login. Ele vai pedir um nome de usuário e uma senha e verificar se estão corretos. Como tal, o módulo utiliza a função de conversação para interrogar o usuário e pegar as informações desejadas. Este módulo aceita alguns parâmetros, conforme seu uso (auth, account, etc.):
7.3.1.2.3. pam_nologinO módulo pam_nologin é bastante simples, e muito útil. É uma forma rápida de desabilitar o login de qualquer usuário que não seja o root. Para isto, basta criar o arquivo /etc/nologin. Existindo este arquivo, o módulo pam_nologin vai sempre retornar ERRO para usuários diferentes de root e exibir o conteúdo de /etc/nologin (onde se deve colocar o motivo da proibição), ou seja, só o usuário root consegue se logar na máquina. Quando o arquivo for removido, a operação voltará ao normal, com usuários comuns podendo se logar novamente. Isto pode ser útil quando se quer fazer alguma manutenção no sistema, por exemplo, situação em que logins de usuários são indesejáveis. Alguns aplicativos do próprio Linux também podem criar este arquivo e depois removê-lo quando alguma operação crítica for concluída. Note que os usuários que já estiverem logados na máquina não são afetados pela criação ou remoção do arquivo /etc/nologin. 7.3.1.2.4. pam_cracklibEste módulo é especialmente importante para a segurança pró-ativa. Colocado apenas na classe password, o módulo vai verificar a senha do usuário antes que ela seja trocada. Se for uma senha considerada fraca, ela será rejeitada e o usuário não conseguirá trocar a senha. As verificações que o módulo faz atualmente são:
Os parâmetros normalmente utilizados com o módulo cracklib são:
7.3.1.2.5. pam_consoleO objetivo do módulo pam_console é permitir ao usuário local (ou seja, no console, fisicamente na máquina) o acesso a diversos dispositivos normalmente restritos ao superusuário, como placa de som, dispositivo de disquete e também permitir ao usuário comum (local) executar certas tarefas, como desligar o computador, entrar no ambiente gráfico ou mesmo instalar pacotes RPM. Essa capacidade adicional é fornecida ao usuário no seu primeiro login e removida após o último logout, e se dá através da modificação das permissões de alguns dispositivos e também através de autenticação. Diz-se que o primeiro usuário que fizer login no console "ganha" o console e as permissões definidas no arquivo de configuração /etc/security/console.perms. Quando um usuário possui o console, um arquivo de lock é criado em /var/lock com o nome console.lock. O conteúdo do arquivo é o nome do usuário que possui o console. Se um outro usuário local fizer um login, ele não receberá o console, pois já existe um lock indicando que o console pertence a outro usuário. Quando o usuário do console fizer logout, o arquivo de lock será removido e o console novamente ficará à disposição do primeiro usuário (não root) que fizer o login. Quando um usuário recebe o console, várias permissões são alteradas no sistema de arquivos, conforme indicado no arquivo de configuração deste módulo PAM. Note que este módulo está como optional, ou seja, não é usado para o sucesso ou não da autenticação do usuário. Isso é necessário, pois ele pode falhar (um outro usuário já possui o console, por exemplo). A seguir, um arquivo de configuração típico (sem os comentários maiores):
Em primeiro lugar, esta configuração define classes de arquivos e classes de dispositivos. Por fim, especifica como devem ser as permissões quando o usuário ganhou o console e quando faz logout. Por exemplo, os dispositivos do tipo floppy devem ter permissão 0660 com o dono sendo o usuário (o grupo não é alterado), e 0660 com donos root.floppy após o logout do usuário. Este tipo de esquema de permissões permite, por exemplo, que o usuário formate um disquete sem que seja necessário obter direitos de root na máquina. 7.3.1.3. Usando LDAP juntamente com PAMAqui mostraremos um exemplo rápido de como modificar o arquivo de configuração PAM para o programa login passar a suportar LDAP também. Note que isto não é suficiente para se ter um sistema completamente dependente do LDAP, para isso ainda é necessário o módulo nss_ldap, que nada tem a ver com PAM. O arquivo modificado fica da seguinte forma:
O módulo pam_securetty fica inalterado, pois ainda queremos controlar os terminais por onde o usuário root pode fazer login. Na verdade, o usuário root nem estará no banco de dados LDAP (usuários de sistema devem sempre ser locais). O mesmo para o módulo pam_nologin: permanece inalterado. A situação fica um pouco diferente quando chegamos nos módulos que fazem a autenticação propriamente dita. Por motivos diversos, o módulo pam_pwdb não deve ser usado em conjunto com o módulo pam_ldap[1]. OK, temos dois módulos responsáveis pela autenticação, pam_unix e pam_ldap; como vamos usá-los simultaneamente? Lembrem-se, queremos que usuários locais e remotos possam se autenticar nesta máquina. Vamos usar as flags de controle. Colocamos em primeiro lugar o módulo pam_unix. Por quê? Bom, se o usuário for local, poupamos uma consulta ao servidor LDAP. Mas marcamos este módulo como sufficient. Ou seja, se ele for bem-sucedido (= se o usuário for local e a senha estiver correta) então nenhum outro módulo desta classe (auth) será executado. Se o resultado não for OK (o usuário só existe no LDAP, ou então ele errou a senha mesmo...) então o próximo módulo será tentado. O módulo seguinte é justamente o pam_ldap. Mas aqui nós o colocamos como required, ou seja, se ele falhar, a autenticação como um todo falha também. Para não pedir a senha novamente para o usuário, nós aproveitamos a senha já fornecida antes e usamos o parâmetro use_first_pass. Este parâmetro diz para o módulo pam_ldap para pegar a senha fornecida anteriormente. Se ela estiver incorreta, o módulo falha. Se usássemos, por exemplo, o parâmetro try_first_pass em seu lugar, no caso de haver falha o módulo pam_ldap novamente pediria a senha para o usuário. O mesmo truque do sufficient e required nós aplicamos às outras classes: account, password e session. A classe session possui ainda uma pequena alteração no posicionamento do módulo pam_console. Como nada mais é executado após um módulo marcado como sufficient ter sido bem-sucedido, o pam_console não seria chamado se ficasse no fim do arquivo como na configuração original para o programa login. Assim, nós o colocamos na frente mesmo. 7.3.1.4. Outros módulos interessantesExistem diversos módulos PAM em uma distribuição Linux. Nem todos são usados, muitos são desconhecidos. Mostraremos aqui alguns dos mais interessantes do ponto de vista de segurança. Todos estes módulos estão bem descritos na documentação. Veja em /usr/share/doc/pam-doc-versão para vários formatos dessa documentação. 7.3.1.4.1. pam_deny, pam_warnEstes dois módulos são úteis para se adotar o que é chamado de fail-safe. Como já vimos, cada programa que suporta PAM deve ter seu respectivo arquivo de configuração no diretório /etc/pam.d. Se o arquivo não existir, o PAM vai abrir o arquivo other. É interessante que este arquivo esteja da seguinte forma:
Para gerar este log, removi o arquivo /etc/pam.d/su e, como usuário comum, tentei executar o comando su:
7.3.1.4.2. pam_accessO módulo pam_access pode ser usado para controlar quais usuários podem fazer login de qual local (terminal, remoto, domínio, etc.). Alguns servidores, como o openssh, já possuem um controle parecido embutido, mas também podem usufruir deste módulo. O arquivo de configuração do módulo pam_access é /etc/security/access.conf e contém alguns exemplos. A sintaxe é bastante simples. Por exemplo, a linha abaixo permite o login do usuário perigo (ou de usuários do grupo perigo) apenas a partir dos terminais tty3 e tty4. O resto (inclusive logins remotos) fica negado:
Note que somente alterar o arquivo /etc/security/access.conf não é o suficiente, o módulo pam_access precisa ser usado! Este módulo entra na categoria account e deve ser usado da seguinte forma:
7.3.1.4.3. pam_limitsEste módulo é muito importante quando se tem usuários com shell em um servidor. Basicamente, ele configura limites para os recursos do sistema disponíveis para o usuário: uso de CPU, memória e outros que veremos a seguir. Note que estes limites são aplicados por processo, e não por usuário[2]. Este módulo entra apenas na categoria session e seu arquivo de configuração, /etc/security/limits.conf, contém vários detalhes. As entradas do arquivo de configuração do módulo pam_limits são da seguinte forma:
É importante notar que se tivermos limites para um usuário e para o seu grupo, os limites para o usuário terão preferência sobre os limites especificados para o seu grupo. E, mais uma vez, não basta alterar o arquivo de configuração se o módulo não for usado. Este é um módulo da categoria session, e deve ser utilizado da seguinte forma:
A seguir mostraremos alguns exemplos. Número máximo de logins simultâneos para o grupo coitados:
Note que alguns processos possuem seu próprio controle do uso de recursos, como sendmail ou mesmo apache, e se recusam a criar mais subprocessos em conseqüência de certas condições de carga da máquina. 7.3.1.4.4. pam_timeO módulo pam_time pode ser usado para controlar o acesso a um serviço baseado no horário e dia da semana. A sintaxe para o uso do módulo é:
7.3.1.5. ReferênciasVocê poderá encontrar mais informações em: Site do PAM . |
||||||||||||||||||||||||||||||||||||||||||||||
| Última atualização em Sáb, 05 de Fevereiro de 2011 03:33 |



