Revista Do Linux
 
EDIÇÃO DO MÊS
 CD do Mês

 Capa
 Serviço Público
 Estudo de Caso
 Corporativo
 Negócios
 Software
 Tutorial
 Seguranca
 Comandos Avançados
 Internet
 Entrevista
 Hardware
 Portateis
 
 
 
<IMG> Segurança
<IMG> Autenticação no Linux (continuação)
 
<IMG> O PAM permite a configuração de vários níveis de acesso. Veja como funcionam os seus módulos
 
<IMG> Nesta segunda parte do artigo sobre o PAM mostraremos como funcionam alguns dos módulos usados por padrão no sistema e também alguns outros bem interessantes, mas talvez não tão conhecidos.
 
<IMG> pam_securetty
<IMG> Este é o primeiro módulo a ser usado e ele simplesmente verifica o terminal no qual 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:
 
<IMG> pts/0
 
<IMG> Perceba que só o pseudoter-minal pts/0 é liberado. Uma segunda conexão telnet receberá outro pseu-do-terminal e não deixará o root entrar direto, pois apenas o pts/0 está listado no arquivo de configuração. Note que pseudoterminais também são alocados para, por exemplo, o xterm.
<IMG> O objetivo primordial deste mó-dulo é evitar o login do root em terminais inseguros. Este conceito de terminais foi estendido ao login remoto (através dos pseudo-ter-minais), e o objetivo permanece o mesmo.
 
<IMG> pam_pwdb
<IMG> O módulo pam_pwdb é o mó-dulo principal da autenticação do programa login. Ele pede o nome de usuário e a senha e verifica se estão corretos. Como tal, o módulo utiliza a função de conversação para interrogar o usuário e receber as informações desejadas.
<IMG> Conforme seu uso (auth, account, etc.), este módulo aceita alguns parâmetros:
<IMG> shadow: se estiverem sendo usadas senhas shadow ou convencionais (mais informações logo a seguir).
<IMG> nullok: permite o uso de senhas em branco. Note que, mesmo que a senha esteja em branco (nula), o usuário não conseguirá fazer login se não existir nullok na linha auth para este módulo.
<IMG> md5: usa criptografia (hash) md5 em vez do crypt padrão. Pode ser usado na linha password.
<IMG> use_authtok: indica que o módulo deve usar a autenticação já fornecida para os módulos anteriores, para não interrogar o usuário novamente. Alguns outros módulos suportam o parâmetro use_first_pass, que funciona da mesma forma. Existe ainda o try_first_pass, que primeiro tenta as mesmas credenciais: se houver falha, pede novamente ao usuário. O use_first_pass não faz esse novo pedido caso ocorra uma falha.
<IMG> Este módulo também possui seu próprio arquivo de configuração: /etc/pwdb.conf. Não entraremos em detalhes quanto à sintaxe deste arquivo, pois o módulo pam_pwdb não é muito extensível. Na verdade, o pam_unix é bem mais genérico por usar as funções da GLIBC e, portanto, suporta NIS, LDAP, arquivos texto, arquivos binários e qualquer outra coisa que a glibc vier a suportar (através de NSS).
<IMG> No caso de uso com a classe session, o módulo pam_pwdb apenas faz o log do usuário que entrou no sistema.
<IMG> Sendo usado com a classe account, o módulo vai verificar se a senha do usuário expirou, há quanto tempo a senha não é tro-cada, etc.
 
<IMG> pam_nologin
<IMG> O módulo pam_nologin é bastante simples, mas também 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.
<IMG> Isto pode ser útil quando se quer fazer alguma manutenção no sistema, por exemplo, numa 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.
<IMG> 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.
 
<IMG> pam_cracklib
<IMG> Este módulo é especialmente importante para a segurança pró-ativa. Colocado apenas na classe password, o módulo vai checar 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 checagens que o módulo faz atualmente são:
<IMG> palíndromo: a nova senha é um palíndromo?
<IMG> caixa: a senha nova é a antiga apenas com mudanças de maiúsculas/minúsculas?
<IMG> similar: a nova senha é muito similar à antiga? Esta checagem pode ser controlada por um parâmetro que indica o número mínimo de carac-teres diferentes que a senha nova deve ter em relação à antiga. O valor padrão é 10 ou metade do tamanho da senha atual, o que for menor.
<IMG> Senha repetida: se existir o arquivo /etc/security/opasswd com as senhas anteriores do usuário, o módulo pam_cracklib vai também verificar se a senha nova já não foi usada antes. Esse arquivo de senhas antigas é atualmente gerado apenas pelo módulo pam_unix, embora exista uma discussão para se criar um módulo específico para esta tarefa (algo como pam_saveoldpass) e remover esta funcionalidade do módulo pam_unix.
<IMG> Os parâmetros normalmente utilizados com o módulo cracklib são:
<IMG> retry=N: “N” é o número de tentativas que o usuário pode fazer para fornecer uma senha considerada boa;
<IMG> difok=N: “N” é o número de letras diferentes que a senha nova deve ter em relação à antiga. Este parâmetro controla o comportamento da checagem do tipo “similar”, vista há pouco. O valor padrão é 10 (e este é o valor alterado por “N” ou metade do tamanho da senha atual, o que for menor);
<IMG> minlen=N: tamanho mínimo da nova senha mais um. Além de contar a quantidade de caracteres da senha nova, também podem ser conferidos créditos fornecidos com base na quantidade de algarismos, caracteres maiúsculos/minúsculos e símbolos. Ou seja, se o valor de minlen for 10, o usuário pode usar uma senha com menos de 10 caracteres, desde que, a soma do número de caracteres mais os créditos, dê um valor final 10. Por exemplo:
 
<IMG> password required /lib/security/pam_cracklib.so retry=3 minlen=10
 
<IMG> Especificamos um tamanho mínimo de 9 para a senha nova. Portan-to, uma senha igual a “senharuim” vai funcionar (possui nove carac-te-res). Mas uma senha igual a am0Bb$ também funcionará, apesar de possuir apenas 6 caracteres. Como? Por causa dos créditos.
 
<IMG> am0Bb$ -> 6 + 1(B, maiúscula) + 1(0, dígito) + 1($, símbolo) = 9 -> OK, passará.
 
<IMG> Por outro lado:
 
<IMG> am0Bbd -> 6 + 1(B, maiúscula) + 1(0, dígito) = 8 -> não passará.
 
<IMG> Por padrão, cada um dos tipos de variação da senha (minúsculo, maiúsculo, algarismo e símbolo) conta no máximo um crédito. Ou seja:
 
<IMG> am0b9$ -> 6 + 1(0, dígito) + 1 ($, símbolo) = 8 -> não passa
 
 
<IMG> Outros módulos interessantes
<IMG> Existem 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.
<IMG> Todos estes módulos estão bem descritos na documentação. Veja em /usr/share/doc/pam-versão para vários formatos dessa documentação.
 
<IMG> pam_access
<IMG> O 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.
<IMG> O arquivo de configuração do módulo pam_access é /etc/security/access.conf e contém alguns exemplos. A sintaxe é bastante simples.
<IMG> A linha abaixo, por exemplo, 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:
 
<IMG> - : perigo : ALL EXCEPT tty3 tty4
 
<IMG> 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:
 
<IMG> account required /lib/security/pam_access.so
 
<IMG> Mesmo que o serviço esteja explicitamente permitindo o login de um dado usuário, se o pam_access estiver sendo usado e este mesmo usuário estiver bloqueado no access.conf, o login não será permitido.
 
<IMG> pam_limits
<IMG> Este 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. A configuração de recursos por usuários ainda não está disponível para o kernel da série 2.2.x nem para os primeiros da série 2.4.x.
<IMG> Este módulo entra apenas na categoria session e seu arquivo de configuração, /etc/security/limits.conf, contém vários detalhes. Mostraremos aqui alguns.
<IMG> As entradas do arquivo de configuração do módulo pam_limits são definidas da seguinte forma:
 
<IMG> <domínio> <tipo> <item> <valor>
 
<IMG> domínio: pode ser um nome de usuário, um nome de grupo (usando a sintaxe @grupo) ou um asterisco (*), indicando qualquer domínio.
<IMG> tipo: pode ter somente dois valores: hard e soft. Limites do tipo hard são aqueles definidos pelo superusuário e impostos pelo kernel do Linux. O usuário não pode aumentar estes limites. Por outro lado, limites do tipo soft são aqueles que o usuário pode alterar, desde que não ultrapasse o que foi definido como um limite hard. Pode-se pensar neste último tipo de limites como sendo valores padrão para o usuário, ou seja, ele começa com estes valores.
<IMG> item: pode ser um dos seguintes:
<IMG> core: tamanho máximo para arquivos core (KB)
<IMG> data: tamanho máximo do segmento de dados de um processo na memória (KB)
<IMG> fsize: tamanho máximo para arquivos que forem criados
<IMG> memlock: tamanho máximo de memória que um processo pode bloquear na memória física (KB)
<IMG> nofile: quantidade máxima de arquivos abertos de cada vez
<IMG> rss: tamanho máximo de memória que um processo pode manter na memória física (KB)
<IMG> stack: tamanho máximo da pilha (KB)
<IMG> cpu: tempo máximo de uso de CPU (em minutos)
<IMG> nproc: quantidade máxima de processos disponíveis para um único usuário
<IMG> as: limite para o espaço de en-de-re-çamento
<IMG> maxlogins: quantidade máxima de logins para este usuário
<IMG> priority: a prioridade com que os processos deste usuário serão executados
<IMG> valor: aqui deve ser colocado o valor para o “item” da coluna anterior
<IMG> É 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.
<IMG> 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:
<IMG> O módulo aceita dois parâ-metros:
 
<IMG> session required /lib/security/pam_limits.so
 
<IMG> debug: aumenta a quantidade de mensagens que vão para o log do sistema;
 
<IMG> conf=/caminho/para/arquivo.conf
 
<IMG> indica um arquivo de configuração alternativo.
<IMG> A seguir mostraremos alguns exemplos.
<IMG> Número máximo de logins simultâneos para o grupo coitados:
 
<IMG> @coitados - maxlogins 1
 
<IMG> Ultrapassando este limite, o usuário receberá uma mensagem na tela informando que excedeu o número máximo de logins e o log mostrará:
 
<IMG> Jul 19 16:39:52 pandora pam_limits[14659]: Too many logins (max 1) for andreas
<IMG> Jul 19 16:39:54 pandora login[14659]: Permission denied
 
<IMG> Isto vale também para logins remotos? Desde que se use PAM, sim. Por exemplo, vale direto para o telnet, pois ele usa o programa login.
 
<IMG> [teste@pandora teste]$ telnet localhost
<IMG> Trying 127.0.0.1...
<IMG> Connected to localhost.
<IMG> Escape character is ‘^]’.
<IMG> Conectiva Linux 5.1
<IMG> Kernel 2.2.16-13cl
 
<IMG> login: teste
<IMG> Password:
 
<IMG> Too many logins for ‘teste’
 
<IMG> Permission denied
<IMG> Connection closed by foreign host.
 
<IMG> Número máximo de processos para usuários do grupo conectiva:
 
<IMG> @conectiva - nproc 2
 
<IMG> Exemplo:
<IMG> pandora login: conectiva
<IMG> Password:
<IMG> Last login: Wed Jul 19 16:47:41 on tty3
<IMG> [conectiva@pandora conectiva]$ bash
<IMG> [conectiva@pandora conectiva]$ bash
<IMG> bash: fork: Recurso temporariamente indisponível
<IMG> [conectiva@pandora conectiva]$ ls
<IMG> bash: fork: Recurso temporariamente indisponível
<IMG> [conectiva@pandora conectiva]$ exit
<IMG> [conectiva@pandora conectiva]$ ls
<IMG> Desktop GNUstep
<IMG> [conectiva@pandora conectiva]$
 
<IMG> Este recurso de se limitar o número de processos é bastante interessante, pois evita uma fork bomb se usado em conjunto com os outros parâmetros, como tempo máximo de uso de CPU por processo, número de logins simultâneos e com os parâ-metros relacionados ao uso de memória. Note porém que é um limite aplicado por login, ou seja, um usuário com no máximo 3 logins simultâneos e um limite de 10 processos poderá executar, na verdade, 30 processos.
 
 
<IMG> O objetivo do pam-security é evitar o login do root em terminais inseguros
 
 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux