Copyright © 2008 Red Hat, Inc.
Copyright © 2008 Red Hat, Inc. This material may only be distributed subject to the terms and conditions set forth in the Open Publication License, V1.0 or later with the restrictions noted below (the latest version of the OPL is presently available at http://www.opencontent.org/openpub/).
Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.
Distribution of the work or derivative of the work in any standard (paper) book form for commercial purposes is prohibited unless prior permission is obtained from the copyright holder.
Red Hat and the Red Hat "Shadow Man" logo are registered trademarks of Red Hat, Inc. in the United States and other countries.
All other trademarks referenced herein are the property of their respective owners.
The GPG fingerprint of the security@redhat.com key is:
CA 20 86 86 2B D6 9D FC 65 F6 EC C4 21 91 80 CD DB 42 A6 0E
1801 Varsity Drive Raleigh, NC 27606-2072 USA Phone: +1 919 754 3700 Phone: 888 733 4281 Fax: +1 919 754 3701 PO Box 13588 Research Triangle Park, NC 27709 USA
January 2008
Histórico de Revisões | ||||
---|---|---|---|---|
Revisão 5.2-11 | Wed May 21 2008 |
Jeff Fearn <jfern@redhat.com>
|
||
|
This Deployment Guide documents relevant information regarding the deployment, configuration and administration of Red Hat Enterprise Linux 5.2.
Bem-vindo ao Guia de Implementação do Red Hat Enterprise Linux .
O Guia de Implementação do Red Hat Enterprise Linux contém informações sobre como padronizar seu sistema do Red Hat Enterprise Linux para melhor se adequar às suas necessidades. Se você estiver à procura de um guia compreensivo e prático para configurar e padronizar seu sistema, este manual se adequa perfeitamente à você.
Este guia presume que você possui um entendimento básico de seu sistema Red Hat Enterprise Linux. Se você precisar de ajuda para instalar o Red Hat Enterprise Linux, consulte o Guia de Instalação do Red Hat Enterprise Linux .
Neste manual, certas palavras são representadas em fontes diferentes, tipo de letras, tamanhos e pesos. Este realce é sistemático pois palavras diferentes são representadas no mesmo estilo para indicar sua inclusão em uma categoria específica. Os tipos de palavras que são representados desta forma incluem o seguinte:
comando
Os comandos Linux (e outros comandos de sistema de operação, quando usados) são representados desta forma. Este estilo deve lhe indicar que você pode digitar a palavra ou frase na linha de comando e pressionar Enter para invocar um comando. As vezes, um comando contém palavras isoladas que poderiam aparecer com um estilo diferente (como nomes de arquivos). Nestes casos, eles são considerados como parte do comando, portanto a frase inteira é apresentada como um comando. Por exemplo:
Use o comando cat testfile
para visualizar o conteúdo de um arquivo, chamado testfile
, no diretório de trabalho atual.
nome do arquivo
Nomes de arquivos, nomes de diretórios, caminhos e nomes de pacotes RPM são representados desta forma. Este estilo indica que um arquivo em particular ou diretório existem com aquele nome no seu sistema. Exemplos:
O arquivo .bashrc
em seu diretório home contém definições de janelas bash e aliases para seu próprio uso.
O arquivo /etc/fstab
contém informações sobre diferentes dispositivos de sistemas e sistemas de arquivo.
Instale o RPM webalizer
se você deseja usar um programa de análise de arquivo de registro de um servidor da Web.
Este estilo indica que o programa é um aplicativo de usuário final (oposto ao software de sistemas). Por exemplo:
Use Mozilla para navegar na Web.
Uma tecla do teclado é apresentada neste estilo. Por exemplo:
Para usar a conclusão Tab, para listar arquivos específicos em um diretório, digite ls
seguido de umcaractere e finalmente pressione a tecla Tab. Seu terminal mostrará a lista de arquivos no diretório que começar com esta letra.
A combinação de teclas é representada da seguinte forma:
A combinação das teclas Ctrl-Alt-Backspace sai da sessão gráfica e retorna para sua tela de registro gráfico ou para o console.
Um título, palavra ou frase, encontrada em uma tela ou janela de interface GUI são exibidos neste estilo. O texto exibido neste estilo indica uma tela ou um elemento GUI em específico em uma tela GUI (tal como o texto associado à caixa de seleção ou campo). Exemplo:
Selecione o ítem Requer Senha se você quiser que seu descanso de tela requeira uma senha antes de parar.
Uma palavra neste estilo indica que a palavra é o nível mais alto de um menu suspenso. Se você clicar em uma palavra na tela GUI, deverá aparecer o restante do menu.
Dentro de um Arquivo em um terminal GNOME, a opção Nova Aba permite que você abra múltiplas janelas de comando, na mesma janela.
As instruções para inserir uma sequência de comandos a partir do menu GUI, se parecem com o exemplo a seguir:
Vá para Applicativos (o menu principal no painel) > Programação => Editor de Texto Emacs para iniciar o editor de texto Emacs
Este estilo indica que um texto pode ser encontrado em um botão clicável em uma tela GUI. Por exemplo:
Clique no botão Retornar para retornar à última página da web vista.
saída de computador
O texto neste estilo indica o texto exibido para uma janela de comando, tais como mensagens de erro e respostas à comandos. Por exemplo:
O comando ls
exibe o conteúdo de um diretório. Por exemplo:
Desktop about.html logs paulwesterberg.png Mail backupfiles mail reports
A saída retornou em resposta ao comando (neste caso, o conteúdo do diretório) é apresentado neste estilo.
prompt
Um prompt, ou seja, uma forma do computador indicar que está pronto para você inserir algo, é apresentado neste estilo. Exemplos:
$
#
[stephen@maturin stephen]$
leopard login:
entrada do usuário
O texto que o usuário digita, tanto na linha de comando quanto na caixa de texto em uma tela GUI, é exibida neste estilo. No seguinte exemplo, text
é exibido neste estilo:
Para inicializar seu sistema no texto baseado no programa de instalação, você deve digitar no comando text
no prompt boot:
<replaceable>
O texto utilizado em exemplos que precise ser substituído com dados fornecidos pelo usuário é apresentado neste estilo. No seguinte exemplo, <version-number>
é apresentado neste estilo:
O diretório para a fonte kernel é /usr/src/kernels/
, onde <version-number>
/<version-number>
é a versão e o tipo de kernel instalado neste sistema.
Além disso, utilizamos de diferentes estratégias para chamar sua atenção sobre algumas informações específicas. Em ordem de urgência, estes ítens são marcados como uma nota, dica, importante, atenção ou aviso. Por exemplo:
Lembre-se que o Linux diferencia entre maiúsculas e minúsculas. Em outras palavras, uma rosa não é uma ROSA e nem uma rOsA.
O diretório /usr/share/doc/
contém documentação adicional para pacotes instalados em seu sistema.
Se você modificar o arquivo de configuração DHCP, as mudanças não surtem efeito até que você reinicie o daemon DHCP.
Não realize as tarefas de rotina com uma conta de usuário root —, use uma conta de usuário regular, a não ser que você precise usar a conta root para realizar tarefas de administração de sistemas.
Tenha cuidado para remover somente partições necessárias. A remoção de outras partições poderia resultar em perda de dados ou um ambiente de sistemas corrompido.
Se você encontrar um erro de digitação no Guia de Implementação do Red Hat Enterprise Linux ou se pensou em algo que possa melhorar este manual, nós adoraríamos saber! Por favor submeta um relatório no Bugzilla (http://bugzilla.redhat.com/bugzilla/
) sobre o componente Deployment_Guide
.
Se você tiver alguma sugestão para melhorar a documentação, tente ser o mais específico possível. Se encontrou um erro, por favor inclua o número da seção e alguns trechos do texto próximo ao erro para que possamos encontrá-lo facilmente.
A Red Hat Enterprise Linux oferece uma variedade de ferramentas e métodos para servir como parte de uma estratégia de segurança compreensiva, não importando se os administradores de sistema precisam assegurar seus sistemas de missão crítica, serviços ou dados.
Este capítulo oferece uma apresentação geral da segurança e especificamente a partir do ponto de vista do Red Hat Enterprise Linux. Ele oferece informação conceitual nas áreas de avaliação de segurança, exploits comuns e resposta à intrusão e incidentes. Também oferece informação sobre configuração específica e conceitual para incrementar a segurança de implementações Workstation, Server, VPN, firewall, dentre outras, utilizando o SELinux.
Este capítulo presume que os usuários já possuam um conhecimento básico de segurança de TI e conseqüentemente oferece somente cobertura mínima de práticas de segurança comum, tais como, controle de acesso físico, políticas e procedimentos profundos de contabilidade, auditoria, etc. Quando apropriado, a consulta é realizada nos recursos externos para esta e qualquer outra informação relacionada.
Índice
Indústrias de segurança de computadores pessoais e de rede formaram-se devido ao aumento na dependência de computadores potentes, em rede, para auxiliar na administração de negócios e manter controle sobre informações pessoais. Empresas angariaram o conhecimento e a perícia de especialistas em segurança para conduzir a auditoria de sistemas de forma adequada e fornecer soluções sob medida para as exigências operacionais da organização. Devido à natureza dinâmica da maioria das organizações, com funcionários acessando recursos de TI, tanto dentro da empresa quanto remotamente, houve uma maior demanda de ambientes seguros de computação.
Infelizmente, a maioria das organizações (assim como indivíduos) consideram aspectos de segurança tarde demais, ignorando este processo em favor de máquinas mais velozes, e por questões de produtividade e orçamentárias. Protocolos de segurança adequados são normalmente efetivados postmortem — após a ocorrência de uma intrusão não autorizada. Especialistas em segurança concordam que a tomada de medidas corretas antes de conectar um site à uma rede não confiável, como a internet, é uma forma eficiente de frustrar a maioria das tentativas de intrusão.
Dados o tempo, os recursos e a motivação necessários, um cracker pode violar praticamente qualquer sistema. No final das contas, todos os procedimentos e tecnologias de segurança atualmente disponíveis não podem garantir que quaisquer sistemas estejam protegidos contra intrusos. Roteadores ajudam a proteger suas portas de comunicação (gateways) com a Internet. Firewalls ajudam a proteger os limites da rede. Redes Privadas Virtuais podem transferir dados com segurança através de informações criptografadas. Sistemas de detecção de intrusão podem alertá-lo sobre atividades maléficas. No entanto, o sucesso de cada uma destas tecnologias depende de diversas variáveis, incluindo:
A perícia dos funcionários responsáveis pela configuração, monitoração e manutenção das tecnologias
A habilidade em consertar e atualizar serviços e kernels eficiente e rapidamente
A habilidade dos responsáveis em manter vigília constante sobre a rede
Dado o dinamismo de sistemas e tecnologias de dados, proteger recursos corporativos pode ser bastante complexo. Devido à essa complexidade, geralmente é difícil encontrar peritos para todos os seus sistemas. Enquanto é possível ter pessoal com conhecimento em muitas áreas de segurança da informação em um alto nível, é difícil reter funcionários que são peritos em mais do que algumas áreas. Isto ocorre principalmente porque cada área de segurança da informação requer constante atenção e foco. A segurança da informação não para.
Suponha que você administre uma rede corporativa. Essas redes são normalmente compostas de sistemas operacionais, aplicativos, servidores, monitores de rede, firewalls, sistemas de detecção de intrusão e outros. Agora imagine tentar manter-se atualizado com cada um destes. Dada a complexidade dos programas e ambientes de rede atuais, exploits e defeitos são uma certeza. Manter-se informado sobre consertos e atualizações para uma rede inteira pode ser uma tarefa perturbadora em uma grande empresa com sistemas heterogêneos.
Com a combinação da necessidade de contar com peritos e a tarefa de manter-se sempre atualizado, torna-se inevitável que incidentes adversos ocorram, sistemas sejam violados, dados corrompidos e serviços interrompidos.
Para aprimorar as tecnologias de segurança e auxiliar na proteção de sistemas, redes e dados, você deve pensar como um cracker e medir a segurança de seus sistemas verificando suas fraquezas. Avaliações preventivas de vulnerabilidades em seus próprios sistemas e recursos de rede podem revelar questões potenciais a serem consideradas antes de um cracker explorá-las.
Se tivesse que executar uma avaliação de vulnerabilidade da sua casa, você provavelmente verificaria cada uma das portas para certificar-se de que elas estão fechadas e trancadas. Você também checaria cada janela, assegurando que estão completamente fechadas e corretamente travadas. O mesmo conceito se aplica aos sistemas, redes e dados eletrônicos. Usuários maldosos são os ladrões e vândalos de seus dados. Foque em suas ferramentas, mentalidade e motivações, e você poderá reagir rapidamente às suas ações.
As avaliações de vulnerabilidade podem ser divididas em dois tipos: De fora olhando para dentro e de dentro olhando ao redor.
Ao executar uma avaliação de vulnerabilidade de fora olhando para dentro, você está tentando comprometer seus sistemas partindo do lado de fora. Quando você está fora de sua empresa você analisa a partir do ponto de vista de um cracker. Você vê o que o cracker vê — endereços IP publicamente roteáveis, sistemas em sua DMZ, interfaces externas de seu firewall e mais. DMZ significa "demilitarized zone" (zona desmilitarizada), que corresponde a um computador ou à uma pequena sub-rede situados na rede interna, tal como uma LAN privada corporativa, e uma rede externa não-confiável, como a Internet pública. Tipicamente, a DMZ contém dispositivos acessíveis ao tráfego da Internet, como servidores web (HTTP), servidores FTP, servidores SMTP (e-mail) e servidores DNS.
Ao executar uma avaliação de vulnerabilidade de dentro olhando ao redor, você está, de certa maneira, em vantagem já que você é interno e seu status é elevado a confiável. Esse é o ponto de vista que você e seus colegas de trabalho têm ao se autenticarem em seus sistemas. Você vê servidores de impressão, servidores de arquivos, bancos de dados e outros recursos.
Há diferenças notáveis entre estes dois tipos de avaliação de vulnerabilidade. Quando você está dentro de sua empresa, você possui privilégios mais elevados que qualquer entidade externa. Ainda hoje em algumas empresas, a segurança é configurada de modo a manter os intrusos fora. Muito pouco é feito para proteger os internos da empresa (tais como firewalls departamentais, controles de acesso no nível de usuário, procedimentos de autenticação para recursos internos e outros). Geralmente, há muito mais recursos quando estamos dentro olhando ao redor dado que a maioria dos sistemas são internos à uma empresa. Uma vez que você se coloca fora da empresa, imediatamente terá o status não confiável. Os sistemas e recursos disponíveis a você externamente são freqüentemente muito limitados.
Considere a diferença entre as avaliações de vulnerabilidade e testes de penetração. Pense em uma avaliação de vulnerabilidade como o primeiro passo de um teste de penetração. As informações obtidas na avaliação serão utilizadas nos testes. Enquanto a avaliação verifica deficiências e vulnerabilidades potenciais, os testes de penetração tentam explorar os resultados.
O processo de avaliação da infra-estrutura de rede é dinâmico. A segurança de ambos, da informação e física, é dinâmica. Executar uma avaliação traz uma visão geral, que pode incluir falsos positivos e falsos negativos.
Administradores de segurança são tão bons quanto as ferramentas que usam e o conhecimento que possuem. Pegue qualquer uma das ferramentas de avaliação disponíveis, execute-as em seu sistema, e é quase certo que haja pelo menos alguns falsos positivos. O resultado é o mesmo, seja por erro do programa ou do usuário. A ferramenta pode encontrar vulnerabilidades que na realidade não existem (falsos positivos) ou, pior ainda, ela pode não detectar vulnerabilidades que realmente existem (falsos negativos).
Agora que a diferença entre avaliação de vulnerabilidade e teste de penetração está definida, é recomendável revisar os resultados da avaliação cuidadosamente antes de conduzir um teste de penetração como parte de sua nova tática para as melhores práticas.
Tentar explorar vulnerabilidades em recursos de produção pode resultar em efeitos adversos na produtividade e eficiência de seus sistemas e rede.
A lista a seguir examina alguns dos benefícios em executar avaliações de vulnerabilidade.
Cria foco pró-ativo na segurança da informação
Encontra exploits potenciais antes que os crackers os encontrem
Resulta em sistemas sendo mantidos atualizados e consertados
Promove o crescimento e ajuda a desenvolver as habilidades dos funcionários
Reduz perdas financeiras e publicidade negativa
Para auxiliar na seleção de ferramentas para a avaliação de vulnerabilidade, é útil estabelecer uma metodologia de avaliação de vulnerabilidade. Infelizmente, não há nenhuma metodologia pré-definida ou aprovada pelo setor no momento, porém bom senso e as melhores práticas podem agir suficientemente como guias.
Qual é o alvo? Nós estamos verificando um servidor, ou verificando nossa rede inteira e tudo que há nesta rede? Somos internos ou externos à empresa? As respostas à estas questões são importantes, pois ajudam a determinar não apenas quais ferramentas selecionar, mas também a maneira como são utilizadas.
Para aprender mais sobre o estabelecimento de metodologias, consulte os seguintes sites:
http://www.isecom.org/projects/osstmm.htm — The Open Source Security Testing Methodology Manual (O Manual de Metodologia de Testes de Segurança Open Source)
http://www.owasp.org/The Open Web Application Security Project (O Projeto Livre de Segurança de Aplicações Web)
Uma avaliação pode começar com o uso de alguma forma de ferramenta de coleta de informações. Ao avaliar a rede inteira, primeiramente mapeie o layout para encontrar máquinas que estejam rodando. Após localizá-las, examine cada máquina separadamente. O exame de cada uma destas máquinas requer um outro conjunto de ferramentas. Saber quais ferramentas utilizar pode ser o passo crucial para encontrar vulnerabilidades.
Assim como em qualquer aspecto do cotidiano, há muitas ferramentas diferentes que desempenham a mesma função. Este conceito também se aplica à execução das avaliações de vulnerabilidade. Há ferramentas específicas para sistemas operacionais, para aplicações e até mesmo para redes (baseadas nos protocolos utilizados). Algumas ferramentas são gratuitas e outras não. Algumas ferramentas são intuitivas e fáceis de utilizar, enquanto outras são enigmáticas e mal documentadas, mas possuem funcionalidades que outras não possuem.
Encontrar as ferramentas corretas pode ser uma tarefa desalentadora, e no final das contas, a experiência conta. Se possível, monte um laboratório de testes e experimente quantas ferramentas puder, anotando os pontos fortes e fracos de cada uma. Examine o arquivo README ou a página man da ferramenta. Além disso, procure na Internet por mais informações, como artigos, manuais passo-a-passo ou até mesmo listas de discussão específicas da ferramenta.
As ferramentas explanadas abaixo são apenas uma pequena amostra das ferramentas disponíveis.
Nmap é uma ferramenta popular incluída no Red Hat Enterprise Linux que pode ser usada para determinar o layout de uma rede. O Nmap já existe há muitos anos e é provavelmente a ferramenta mais utilizada na coleta de informações. Há uma página man excelente que oferece uma descrição detalhada de suas opções e usos. Administradores podem usar o Nmap em uma rede para encontrar sistemas host e portas abertas nestes sistemas.
O Nmap é um primeiro passo eficaz na avaliação de vulnerabilidade. Você pode mapear todas as máquinas dentro de sua rede, e inclusive passar uma opção que permite ao Nmap tentar identificar o sistema operacional rodando numa determinada máquina. O Nmap é uma boa base para estabelecer normas de uso de serviços seguros e para parar serviços não usados.
O Nmap pode ser executado a partir de um prompt do shell, digitando nmap
seguido do nome ou endereço IP da máquina que você deseja escanear.
nmap foo.example.com
Os resultados do scan (que podem levar até alguns minutos, dependendo de onde o host está localizado) devem se parecer com o seguinte:
Starting nmap V. 3.50 ( www.insecure.org/nmap/ ) Interesting ports on localhost.localdomain (127.0.0.1): (The 1591 ports scanned but not shown below are in state: closed) Port State Service 22/tcp open ssh 25/tcp open smtp 111/tcp open sunrpc 443/tcp open https 515/tcp open printer 950/tcp open oftep-rpc 6000/tcp open X11 Nmap run completed -- 1 IP address (1 host up) scanned in 71.825 seconds
O Nmap testa as portas de comunicação mais comuns numa rede por serviços de escuta ou de espera. Esse conhecimento pode ser útil a um administrador que deseja encerrar serviços desnecessários ou não usados.
Para mais informações sobre o uso do Nmap, consulte o site oficial no seguinte endereço:
O Nessus é um scanner de segurança 'full-service'. Sua arquitetura plug-in permite que usuários o personalizem para seus sistemas e redes. Assim como qualquer scanner, o Nessus é tão bom quanto o banco de dados de assinaturas com o qual ele conta. Felizmente, o Nessus é freqüentemente atualizado e conta com relatório completo, escaneamento do host e buscas de vulnerabilidades em tempo real. Lembre-se que podem haver falsos positivos e falsos negativos, mesmo numa ferramenta tão poderosa e freqüentemente atualizada como o Nessus.
O Nessus não está incluído no Red Hat Enterprise Linux e não é suportado. Foi incluído neste documento como uma referência para usuários que possam se interessar por esta aplicação tão conhecida.
Para mais informações sobre o Nessus, consulte o site oficial no endereço:
O Nikto é um excelente scanner de scripts CGI. O Nikto não tem apenas a capacidade de verificar vulnerabilidades CGI, mas também de fazê-lo de maneira evasiva, para enganar sistemas de detecção de intrusão. Acompanha uma documentação excelente que deve ser revisada cuidadosamente antes de executar o programa. Se você tem servidores Web servindo scripts CGI, o Nikto pode ser um excelente recurso para checar a segurança destes servidores.
O Nikto não está incluído no Red Hat Enterprise Linux e não é suportado. Foi incluído neste documento como uma referência para usuários que possam se interessar por esta aplicação tão conhecida.
Mais informações sobre o Nikto podem ser encontradas no seguinte endereço:
O VLAD é um scanner de vulnerabilidades desenvolvido pela equipe RAZOR na Bindview, Inc., que verifica a lista das dez questões mais comuns de segurança da SANS (questões do SNMP, compartilhamento de arquivos, etc.). Vale a pena investigar o VLAD, apesar de não ter tantas funcionalidades quanto o Nessus.
O VLAD não está incluído no Red Hat Enterprise Linux e não é suportado. Foi incluído neste documento como uma referência para usuários que possam se interessar por esta aplicação tão conhecida.
Mais informações sobre o VLAD podem ser encontradas no site da equipe RAZOR no seguinte endereço:
Dependendo do seu objetivo e recursos, existe uma grande disponilidade de ferramentas. Há ferramentas para redes sem fio, redes Novell, sistemas Windows, sistemas Linux entre outros. Outra parte essencial ao executar avaliações é incluir uma revisão de segurança física, controle de pessoal ou avaliação da rede de voz/PBX. Conceitos novos como o escaneamento war walking no perímetro das estruturas físicas de sua empresa para encontrar vulnerabilidades da rede sem fio são conceitos emergentes que você pode considerar e, se necessário, incorporá-los às suas avaliações. Imaginação e exposição são os únicos limites para planejar e conduzir avaliações de vulnerabilidade.
Para planejar e implementar uma boa estratégia de segurança, comece entendendo algumas das questões que atacantes determinados e motivados exploram para comprometer sistemas. Mas antes de detalhar estas questões, precisamos definir a terminologia utilizada ao identificar um atacante.
O significado moderno da palavra hacker tem origem nos anos 60 no Tech Model Railroad Club do Instituto de Tecnologia de Massachusetts (MIT), que desenvolveu modelos de trens de alta fidelidade e com detalhes complexos. Hacker era o nome usado para os membros do clube que vinham a descobrir um novo truque ou uma nova forma de resolver um problema.
Desde então o termo hacker descreve de tudo, desde entusiastas a programadores talentosos. Um aspecto comum dentre a maioria dos hackers é a vontade de explorar detalhadamente as funções dos sistemas e redes de computador com pouco ou nenhum estímulo exterior. Desenvolvedores de software de código aberto geralmente consideram-se hackers e utilizam esta palavra como um termo respeitável.
Tipicamente, os hackers seguem uma espécie de ética hacker, que dita que a missão por conhecimento e informação é essencial, e compartilhar este conhecimento é o dever dos hackers para com a comunidade. Durante esta missão em busca do conhecimento, alguns hackers entretem-se com desafios acadêmicos, como driblar controles de segurança em sistemas de computadores. Por esta razão, a imprensa freqüentemente usa o termo hacker para descrever aqueles que acessam sistemas e redes ilicitamente com intenções inescrupulosas, maldosas ou criminosas. O termo mais correto para este tipo de hacker é cracker — um termo criado por hackers em meados dos anos 80 para diferenciar as duas comunidades.
Há diversos grupos distintos de indivíduos que encontram e exploram vulnerabilidades em redes e sistemas. Estes grupos são normalmente descritos de acordo com a tonalidade do chapéu que "vestem" ao realizar suas investigações de segurança, e essa tonalidade indica suas intenções.
O hacker de chapéu branco é aquele que testa redes e sistemas para examinar a performance e a vulnerabilidade à potenciais intrusões. Geralmente, hackers de chapéu branco violam seus próprios sistemas ou sistemas de um cliente que os empregou especificamente para executar uma auditoria de segurança. Pesquisadores acadêmicos e profissionais da área de consultoria de segurança são dois exemplos de hackers de chapéu branco.
Um hacker de chapéu preto é sinônimo de um cracker. Em geral, crackers são menos focados em programação e no aspecto acadêmico de violar sistemas. Eles geralmente contam com programas de quebra de segurança e exploram vulnerabilidades conhecidas em sistemas para descobrir informações importantes para ganho pessoal ou para danificar o sistema ou rede alvos.
O hacker de chapéu cinza, por outro lado, tem as habilidades e intenções de um hacker de chapéu branco na maioria dos casos, mas por vezes utiliza seu conhecimento para propósitos menos nobres. Um hacker de chapéu cinza pode ser descrito como um hacker de chapéu branco que às vezes veste um chapéu preto para atingir seus próprios objetivos.
Hackers de chapéu cinza tipicamente se enquadram em outro tipo de ética, que diz ser aceitável violar sistemas desde que o hacker não cometa roubo ou viole a privacidade. Alguns argumentam, no entanto, que o ato de invadir um sistema por si só já é anti-ético.
Independentemente da intenção do intruso, é importante saber quais as fraquezas que um cracker geralmente tentará explorar. O resto do capítulo concentra-se nestas questões.
Desatenção ao configurar os seguintes aspectos de uma rede podem aumentar os riscos de um ataque.
Uma rede mal configurada é um ponto de entrada básico para usuários não autorizados. Deixar uma rede local baseada na confiança aberta e vulnerável à uma rede altamente insegura como a Internet, é o mesmo que deixar uma porta entreaberta em uma vizinhança perigosa — talvez nada aconteça por um período, mas eventualmente alguém explorará a oportunidade.
Administradores de sistemas freqüentemente não percebem a importância do hardware de rede em seus esquemas de segurança. Simples componentes de hardware como concentradores e roteadores baseiam-se no princípio da difusão ou não-comutação, ou seja, sempre que um nó transmitir dados através da rede para um nó receptor, o concentrador ou roteador difunde os pacotes de dados até que o nó receptor os receba e processe. Este método é o mais vulnerável à falsificação (spoofing) de endereços ARP (Address Resolution Protocol - Protocolo de Resolução de Endereço) e MAC (Media Access Control - Controle de Acesso a Mídia), tanto por parte de intrusos externos quanto por parte de usuários não autorizados em hosts locais.
Outra potencial armadilha na rede é o uso da computação centralizada. Uma forma comum de corte de gastos em muitas empresas é consolidar todos os serviços em apenas uma máquina potente. Isto pode ser conveniente, pois é mais fácil e bem mais barato gerenciar uma única máquina do que configurações em servidores múltiplos. Entretanto, um servidor centralizado também significa um ponto único de falha na rede. Se o servidor central for comprometido, pode danificar a rede ou inutilizá-la, ou pior ainda, torná-la vulnerável à manipulação ou roubo de dados. Nestas situações, um servidor central torna-se uma porta aberta permitindo acesso à toda a rede.
A segurança dos servidores é tão importante quanto a segurança da rede porque os servidores freqüentemente armazenam grande parte das informações vitais de uma organização. Se um servidor for comprometido, todo o seu conteúdo pode ficar disponível para o cracker roubar ou manipular como quiser. As seções a seguir detalham algumas das principais questões neste sentido.
Uma instalação completa do Red Hat Enterprise Linux contém mais de mil pacotes de aplicações e bibliotecas. No entanto, a maioria dos administradores de servidor optam por não instalar todos os pacotes da distribuição; preferindo ao invés disso instalar os pacotes básicos, incluindo diversas aplicações para servidor.
A maioria das aplicações de servidor inclusas em uma instalação padrão são sólidas unidades de software testadas exaustivamente. Tendo sido utilizadas em ambientes de produção por muitos anos, seus códigos vem tendo sido constantemente refinados e muitos dos erros (bugs) foram encontrados e consertados.
Entretanto, não existe software perfeito e sempre há espaço para mais aprimoramento. Além disso, programas mais novos freqüentemente não são rigorosamente testados como se espera, porque chegaram recentemente a ambientes de produção ou porque talvez não sejam tão populares quanto outros programas de servidor.
Desenvolvedores e administradores de sistemas freqüentemente encontram erros exploráveis em aplicações de servidor e publicam a informação em sites de rastreamento de erros e relacionados à segurança, como a lista de discussão 'Bugtraq' (http://www.securityfocus.com) ou o site do CERT, 'Computer Emergency Response Team' (http://www.cert.org). Apesar destes mecanismos serem maneiras efetivas de alertar a comunidade sobre vulnerabilidades de segurança, é responsabilidade dos administradores atualizarem seus sistemas prontamente. Isto porque os crackers têm acesso aos mesmos serviços de rastreamento de vulnerabilidades e utilizarão estas informações para violar sistemas desatualizados sempre que puderem. Uma boa administração de sistemas requer vigilância, constante rastreamento de erros, e manutenção apropriada para assegurar um ambiente computacional mais seguro.
Consulte a Seção 1.4, “Atualizações de Segurança” para mais informações sobre como manter um sistema atualizado.
Administradores que não atualizam seus sistemas representam uma das grandes ameaças à segurança de servidores. De acordo com o System Administration Network and Security Institute (SANS), a causa principal da vulnerabilidade na segurança de computadores é "delegar a manutenção de segurança à pessoas não treinadas e não prover nem treinamento nem tempo para que o trabalho seja executado."[1] Isto se aplica tanto a administradores inexperientes quanto a administradores super-confiantes ou desmotivados.
Alguns administradores não atualizam seus servidores e estações de trabalho, enquanto outros não monitoram as mensagens de registro do kernel do sistema ou tráfego de rede. Outro erro comum é deixar senhas ou chaves padrão de serviços inalteradas. Por exemplo, alguns bancos de dados têm senhas de administração padrão porque seus desenvolvedores assumem que o administrador de sistemas irá alterá-las imediatamente após a instalação. Se um administrador de banco de dados deixar de alterar esta senha, até mesmo um cracker inexperiente pode utilizar uma senha padrão conhecida para obter privilégios administrativos ao banco de dados. Estes são apenas alguns dos exemplos de como uma administração desatenta pode levar ao comprometimento de servidores.
Até a empresa mais atenta pode ser vítima de vulnerabilidades se os serviços de rede que elas optarem por usar forem essencialmente inseguros. Por exemplo, há muitos serviços desenvolvidos sob a suposição de que serão utilizados através de redes confiáveis, mas essa suposição deixa de ser verdadeira a partir do momento em que o serviço for disponibilizado através da Internet — que por si só é essencialmente não confiável.
Uma categoria de serviços de rede inseguros e composta por aqueles serviços que requerem nomes de usuário e senha não criptografados para autenticação. Telnet e FTP são dois exemplos deste tipo de serviço. Se um software de farejamento de pacotes está monitorando o tráfego entre o usuário remoto e um destes tipos de serviço, dados como nomes de usuário e senhas podem ser interceptados facilmente.
Tais serviços também podem mais facilmente tornarem-se vítimas do que o setor de segurança chama de ataque man-in-the-middle. Neste tipo de ataque um cracker redireciona o tráfego de rede, levando um servidor de nomes crackeado a apontar para sua máquina ao invés do servidor genuíno. Quando alguém abrir uma sessão remota para este servidor genuíno, a máquina do atacante age como um túnel invisível capturando as informações entre o serviço remoto e o crédulo usuário. Desta maneira um cracker consegue obter senhas administrativas e dados sem que o servidor ou o usuário percebam.
Outra categoria de serviços inseguros são sistemas de arquivos de rede e serviços de informação, como NFS ou NIS, desenvolvidos explicitamente para uso em redes locais mas que, infelizmente, têm seu uso estendido também para redes geograficamente distribuídas (para usuários remotos). O NFS não tem, de acordo com sua configuração padrão, nenhuma autenticação ou quaisquer mecanismos de segurança configurados para prevenir um cracker de montar o modo de compartilhamento e acessar qualquer coisa contida nele. O NIS também tem informações vitais que devem ser conhecidas por cada computador em uma rede, incluindo senhas e permissões de arquivo, em um banco de dados no formato somente-texto ASCII ou DBM (derivado do ASCII). Um cracker que obtém acesso a este banco de dados pode então acessar todas as contas de usuário de uma rede, inclusive a conta do administrador.
Estações de trabalho e PCs podem não ser tão propensos a ataques quanto redes ou servidores, mas já que estes normalmente contém informações delicadas, tais como dados de cartões de crédito, também são alvos de crackers de sistemas. Atacantes também podem tomar posse de de estações de trabalho sem o conhecimento do usuário, e utilizadas como máquinas "escravas" em ataques coordenados. Por estas razões, saber das vulnerabilidades de uma estação de trabalho pode poupar os usuários da dor de cabeça de reinstalar o sistema operacional, ou pior, de terem que se recuperar do roubo de dados.
Embora um administrador possa ter um servidor completamente seguro e atualizado, não significa que usuários remotos estejam seguros ao acessá-lo. Por exemplo, se o servidor oferece os serviços Telnet e FTP através de uma rede pública, um atacante pode capturar os caracteres de nomes de usuário e senhas enquanto estes são movimentados através da rede, e então usar as informações da conta para acessar a estação de trabalho do usuário remoto.
Mesmo ao utilizar protocolos seguros, como o SSH, um usuário remoto pode estar vulnerável a determinados ataques se ele não mantiver suas aplicações cliente atualizadas. Por exemplo, clientes SSH v.1 (versão 1) são vulneráveis a um ataque X-forwarding de servidores SSH maléficos. Uma vez conectado ao servidor, o atacante pode capturar, sem ser percebido, quaisquer teclas pressionadas e cliques de mouse efetuados pelo cliente através da rede. Este problema foi consertado na versão SSH v.2, mas ainda assim depende do usuário monitorar aplicações com tais vulnerabilidades e atualizá-las quando necessário.
Tabela 1.1, “Exploits Freqüentes” detalha alguns dos exploits e pontos de entrada mais comuns usados por intrusos para acessar recursos de redes organizacionais. As explicações de como estes exploits são executados e como administradores podem proteger suas redes apropriadamente são muito importantes contra tais ataques.
Exploit | Descrição | Notas | |||
---|---|---|---|---|---|
Senhas em Branco ou Padrão | Deixar senhas administrativas em branco ou usar a senha padrão provida pelo fabricante. Isto é mais comum em hardware, como roteadores e firewalls, porém alguns dos serviços que rodam no Linux podem conter senhas padrão de administrador (apesar do Red Hat Enterprise Linux 5 não incluí-las). |
|
|||
Chaves Compartilhadas Padrão | Serviços seguros às vezes incluem chaves de segurança padrão com a finalidade de facilitar o exercício de desenvolvimento ou testes de avaliação. Se estas chaves permanecerem inalteradas e estiverem localizadas em um ambiente de produção na Internet, quaisquer usuários com as mesmas chaves padrão tem acesso àquele recurso de chave compartilhada assim como a quaisquer informações importantes lá contidas. |
|
|||
Falsificação (Spoofing) do IP | Uma máquina remota age como um nó na sua rede local, encontra vulnerabilidades em seus servidores, e instala um programa do tipo backdoor ou cavalo de tróia para obter o controle dos seus recursos de rede. |
|
|||
Eavesdropping | Coleta não autorizada de dados que trafegam entre dois nós ativos em uma rede através da prática do eavesdropping na conexão entre estes dois nós. |
|
|||
Vulnerabilidades em Serviços | Um atacante encontra uma falha ou uma deficiência em um serviço executado através da Internet; através desta vulnerabilidade, o atacante compromete o sistema inteiro e quaisquer dados que este possa conter; e pode possivelmente comprometer outros sistemas na rede. |
|
|||
Vulnerabilidades em Aplicações | Atacantes encontram falhas em aplicações de computadores pessoais e estações de trabalho (como clientes de e-mail) e executam código arbitrário, implantam cavalos de tróia para comprometimento futuro, ou causam a pane de sistemas. Explorações adicionais podem ocorrer se a estação de trabalho comprometida tiver privilégios administrativos sobre o restante da rede. |
|
|||
Ataques de Negação de Serviço (DoS) | Um atacante ou grupo de atacantes executam uma ação coordenada contra os recursos de rede ou de servidores de uma organização através do envio de pacotes não autorizados para o host alvo (servidor, roteador, ou estação de trabalho). Isto força o recurso a tornar-se indisponível a usuários legítimos. |
|
Conforme as vulnerabilidades de segurança são descobertas, o software afetado deve ser atualizado para limitar quaisquer potenciais riscos de segurança. Se o software é parte de um pacote de uma distribuição da Red Hat Enterprise Linux atualmente suportada, a Red Hat, Inc. compromete-se a lançar, assim que possível, pacotes atualizados que consertem as vulnerabilidades. Freqüentemente, comunicados referentes a um exploit de segurança são acompanhados de um conserto (ou código-fonte que conserte o problema). Este conserto é então aplicado ao pacote Red Hat Enterprise Linux, testado pela equipe de controle de qualidade da Red Hat e lançado como uma atualização de errata. Entretanto, se um comunicado não inclui um conserto, um desenvolvedor da Red Hat trabalha junto com o mantedor do software para resolver o problema. Após o problema ser resolvido, o pacote é testado e lançado como uma atualização de errata.
Se for lançada uma atualização de errata para um software utilizado em seu sistema, é altamente recomendável que você atualize os pacotes afetados assim que possível para minimizar o tempo durante o qual o seu sistema fique potencialmente vulnerável.
Ao atualizar o software de um sistema, é importante fazer o download da atualização de uma fonte confiável. Um atacante pode facilmente reconstruir um pacote com o mesmo número de versão daquele que deveria resolver o problema, mas com um exploit de segurança diferente no pacote, e depois lançá-lo na Internet. Se isto acontecer, o uso de medidas de segurança como checar os arquivos contra o RPM original não servem para detectar o exploit. Portanto, é muito importante que se use apenas fontes confiáveis, como a Red Hat, para downloads de RPMs, e que se cheque a assinatura do pacote para verificar sua integridade.
A Red Hat oferece duas maneiras de encontrar informações sobre as atualizações de errata:
Listadas e disponíveis para download no Red Hat Network
Listadas mas sem link no site de Erratas da Red Hat
A partir da linha de produtos Red Hat Enterprise Linux, os pacotes atualizados podem ser baixados somente do Red Hat Network. Embora o site de Erratas da Red Hat contenha informações atualizadas, ele não contém os pacotes para download.
O Red Hat Network permite que a maior parte do processo de atualização seja automatizado. Ele determina quais pacotes RPM são necessários para o sistema, faz o download destes a partir de um repositório seguro, verifica-lhes a assinatura para assegurar que os mesmos não foram corrompidos, e os atualiza. A instalação de pacotes pode ser feita imediatamente ou pode ser agendada durante um determinado período de tempo.
O Red Hat Network requer um Perfil do Sistema para cada máquina a ser atualizada. O Perfil do Sistema contém informação sobre o hardware e o software do sistema. Essa informação é mantida confidencialmente, sendo usada somente para determinar quais atualizações de errata são aplicáveis a cada sistema. Sem o perfil, o Red Hat Network não pode determinar se um sistema precisa de atualizações. Quando uma errata de segurança (ou qualquer tipo de errata) é lançada, o RHN envia um email com a descrição da errata assim como uma lista de sistemas afetados por ela. Para aplicar a atualização, use o Agente de Atualizações Red Hat ou agende a atualização do pacote pelo site http://rhn.redhat.com.
O Red Hat Enterprise Linux inclui a Ferramenta de Notificação de Alertas Red Hat Network, um ícone conveniente no painel que exibe alertas quando há uma atualização para um sistema Red Hat Enterprise Linux registrado. Consulte a seguinte URL para mais informações sobre este applet:https://rhn.redhat.com/rhn/help/quickstart.jsp
Antes de instalar uma errata de segurança, certifique-se de ler quaisquer instruções especiais contidas no relatório da errata e executá-las de acordo. Consulte a Seção 1.4.1.5, “Aplicando as Alterações” para instruções gerais sobre como aplicar as alterações feitas por uma atualização de errata.
Quando relatórios de erratas de segurança são lançados, são publicados no site de Erratas da Red Hat disponível em http://www.redhat.com/security/. A partir desta página, selecione o produto e a versão de seu sistema, e então selecione segurança no topo da página para exibir apenas os Relatórios de Segurança do Red Hat Enterprise Linux. Se a sinopse de um dos relatórios descreve um pacote usado em seu sistema, clique na sinopse para ver mais detalhes.
A página de detalhes descreve o exploit de segurança e quaisquer instruções especiais a serem executadas para atualizar o pacote e consertar a brecha na segurança.
Para fazer o download do(s) pacote(s) atualizado(s), clique no link para se logar no Red Hat Network, clique no(s) nome(s) do(s) pacote(s) e salve-os no disco rígido. É altamente recomendável que você crie um novo diretório como /tmp/updates
e salve ali todos os pacotes baixados.
Todos os pacotes do Red Hat Enterprise Linux são assinados com a chave GPG da Red Hat, Inc. GPG significa GNU Privacy Guard, ou GnuPG, um pacote de software livre usado para garantir a autenticidade de arquivos distribuídos. Por exemplo, uma chave privada (chave secreta) mantida pela Red Hat chaveia o pacote enquanto a chave pública abre e verifica. Se a chave pública distribuída pela Red Hat não confere com a chave privada durante a verificação do RPM, o pacote pode ter sido alterado e, portanto, não é confiável.
O utilitário RPM do Red Hat Enterprise Linux tenta automaticamente verificar a assinatura GPG de um pacote RPM antes de instalá-lo. Se a chave GPG da Red Hat não estiver instalada, instale-a a partir de uma localidade segura e estática, como o CD-ROM de instalação do Red Hat Enterprise Linux.
Assumindo que o CD-ROM esteja montado em /mnt/cdrom
use o seguinte comando para importá-la para o chaveiro (um banco de dados do sistema com chaves confiáveis):
rpm --import /mnt/cdrom/RPM-GPG-KEY
Para exibir uma lista com todas as chaves instaladas para verificação de RPMs, execute o seguinte comando:
rpm -qa gpg-pubkey*
Para a chave da Red Hat, o resultado na tela inclui o seguinte:
gpg-pubkey-db42a60e-37ea5438
Para exibir detalhes sobre uma chave específica, use o comando rpm -qi
seguido do output do comando anterior, conforme este exemplo:
rpm -qi gpg-pubkey-db42a60e-37ea5438
É extremamente importante verificar a assinatura dos arquivos RPM antes de instalá-los para ter certeza de que eles não foram alterados depois do lançamento dos pacotes pela Red Hat, Inc. Para verificar todos os pacotes baixados de uma só vez, submeta o seguinte comando:
rpm -K /tmp/updates/*.rpm
Para cada pacote, se a chave GPG for verificada com sucesso, o comando retorna gpg OK
. Caso contrário, certifique-se de usar a chave pública correta da Red Hat, assim como verificar a fonte do conteúdo. Os pacotes que não passarem na verificação GPG não devem ser instalados, pois podem ter sido alterados por terceiros.
Após verificar as chaves GPG e fazer o download de todos os pacotes associados ao relatório da errata, instale os pacotes como root em uma janela de comandos.
A instalação da maioria dos pacotes pode ser feita com segurança (exceto pacotes do kernel) através do seguinte comando:
rpm -Uvh /tmp/updates/*.rpm
Para pacotes do kernel, use o seguinte comando:
rpm -ivh /tmp/updates/<pacote-de-kernel>
No exemplo anterior, substitua <pacote-de-kernel>
pelo nome do RPM do kernel.
Após reinicializar a máquina com sucesso usando o novo kernel, o kernel antigo deve ser removido usando o seguinte comando:
rpm -e <pacote-de-kernel-antigo>
No exemplo anterior, substitua <pacote-de-kernel-antigo>
pelo nome do RPM do kernel antigo.
Não é necessário remover o kernel antigo. O gerenciador de inicialização padrão, GRUB, permite que múltiplos kernels sejam instalados e depois escolhidos através de um menu durante a inicialização da máquina.
Antes de instalar uma errata de segurança, certifique-se de ler quaisquer instruções especiais contidas no relatório da errata e executá-las de acordo. Consulte a Seção 1.4.1.5, “Aplicando as Alterações” para instruções gerais sobre como aplicar as alterações feitas por uma atualização de errata.
Após fazer o download e instalar as erratas de segurança através da Red Hat Network ou do site de erratas da Red Hat, é importante parar de usar o software antigo e passar a usar o novo. O modo como isso é feito depende do tipo de software que foi atualizado. A lista a seguir aponta as categorias gerais de software e oferece instruções para usar as versões atualizadas após uma atualização de pacotes.
Em geral, reinicializar o sistema é a maneira mais certa de garantir que a versão mais recente de um pacote de software seja usada; entretanto, esta opção nem sempre está disponível ao administrador do sistema.
Aplicativos em espaço de usuário são quaisquer programas que possam ser iniciados por um usuário do sistema. Geralmente, estes aplicativos são usados somente quando um usuário, um script ou um utilitário de tarefas automatizadas os lança, e não persistem por longos períodos.
Após tal aplicação em espaço de usuário ser atualizada, pare todas as instâncias da aplicação no sistema e lance o programa novamente a fim de usar a versão atualizada.
O kernel é o componente central do software do sistema operacional Red Hat Enterprise Linux. Ele gerencia o acesso à memória, ao processador, e a periféricos, e também agenda todas as tarefas.
Devido à sua função central, o kernel não pode ser reiniciado sem também parar o computador. Portanto, uma versão atualizada do kernel não pode ser usada até que o sistema seja reinicializado.
Bibliotecas compartilhadas são unidades de código, como a glibc
, que são usadas por diversos aplicativos e serviços. Os aplicativos que utilizam uma biblioteca compartilhada geralmente carregam o código compartilhado quando o aplicativo é iniciado, portanto todos os aplicativos que usam a biblioteca compartilhada devem ser parados e relançados.
Para determinar quais aplicativos estão relacionados a uma determinada biblioteca, use o comando lsof
, conforme o exemplo a seguir:
lsof /usr/lib/libwrap.so*
Este comando retorna uma lista de todos os programas sendo executados que usam TCP wrappers para controle de acesso ao host. Portanto, quaisquer programas listados devem ser parados e relançados se o pacote tcp_wrappers
for atualizado.
Serviços SysV são programas persistentes de servidor lançados durante o processo de inicialização. Exemplos de serviços SysV incluem sshd
, vsftpd
e xinetd
.
Como estes programas geralmente persistem na memória enquanto a máquina é inicializada, cada serviço SysV atualizado deve ser parado e relançado após a atualização do pacote. Isto pode ser feito usando a Ferramenta de Configuração de Serviços ou se logando a uma janela de comandos root e submetendo o comando /sbin/service
como no exemplo seguinte:
/sbin/service <nome-do-serviço>
restart
No exemplo anterior, substitua <nome-do-serviço>
pelo nome do serviço, como sshd
.
xinetd
Os serviços controlados pelo super serviço xinetd
rodam somente quando há uma conexão ativa. Exemplos de serviços controlados pelo xinetd
incluem Telnet, IMAP e POP3.
Como novas instâncias destes serviços são lançadas pelo xinetd
cada vez que um novo pedido é recebido, as conexões que ocorrem depois de uma atualização são feitas pelo software atualizado. Entretanto, se houverem conexões ativas no momento em que o serviço controlado xinetd
é atualizado, elas são feitas pela versão antiga do software.
Para terminar instâncias antigas de um serviço em particular controlado pelo xinetd
, faça a atualização do pacote do serviço e então pare todos os processos sendo executados. Primeiro, determine se o processo está rodando, usando o comando ps
e então use o comando kill
ou killall
para parar as instâncias atuais do serviço.
Por exemplo: se os pacotes da errata de segurança imap
são lançados, faça a atualização dos pacotes e então digite o seguinte comando como root em uma janela de comandos:
ps -aux | grep imap
Este comando retorna todas as sessões IMAP ativas. Sessões individuais podem então ser terminadas com o seguinte comando:
kill <PID>
Se este comando falhar em terminar a sessão, use o seguinte comando em seu lugar:
kill -9 <PID>
No exemplo anterior, substitua <PID>
pelo número de identificação do processo (encontrado na segunda coluna do resultado do comando ps
) de uma sessão IMAP.
Para terminar todas as sessões IMAP ativas, submeta o seguinte comando:
killall imapd
A segurança de um ambiente Linux começa pela estação de trabalho. Na proteção de sua máquina pessoal ou sistema corporativo, uma boa política de segurança começa pelo computador individual. Afinal de contas, uma rede de computadores é tão segura quanto seu nó mais vulnerável.
Ao avaliar a segurança de uma estação de trabalho do Red Hat Enterprise Linux, considere os seguintes fatores:
Segurança do BIOS e do Carregador de Inicialização — Um usuário não autorizado pode acessar fisicamente a máquina e inicializá-la como um usuário simples ou no modo de recuperação sem uma senha?
Segurança de Senhas — Até que ponto as senhas de conta de usuário na máquina estão seguras?
Controles Administrativos — Quem possui uma conta no sistema e qual o controle administrativo que estas contas possuem?
Serviços de Rede Disponíveis — Quais os serviços disponíveis para solicitações advindas da rede? Eles deveriam mesmo estar ativos?
Firewalls Pessoais — Caso seja necessário, que tipo de firewall devo escolher?
Ferramentas de Comunicação com Segurança Aprimorada — Quais ferramentas devem ser utilizadas para a comunicação entre estações de trabalho e quais devem ser evitadas?
A proteção de senhas para o BIOS (ou componente equivalente) e para o carregador de inicialização, pode evitar que usuários não autorizados, sem acesso físico a sistemas, inicializem a máquina com mídia removível ou obtenham privilégios root através do modo de usuário simples. As medidas de segurança a serem tomadas para proteger o sistema contra ataques deste tipo, dependem da confidencialidade das informações que a estação de trabalho armazena e da localização da mesma.
Por exemplo, se uma máquina é usada numa exposição ou feira e não contém informações confidenciais, talvez não seja crucial prevenir tais ataques. Entretanto, caso durante essa mesma feira, um funcionário descuidar de um laptop que contenha chaves SSH privadas não criptografadas da rede corporativa, poderá ocorrer uma trágica violação de segurança com conseqüências para a empresa inteira.
Por outro lado, se a estação de trabalho estiver localizada em um lugar onde somente pessoas confiáveis e autorizadas possuem acesso, então proteger o BIOS ou o carregador de inicialização pode não ser necessário.
As duas razões principais para proteger o BIOS de um computador através do uso de uma senha são [2]:
Impedir Alterações na Configuração do BIOS — Se um intruso tem acesso ao BIOS, o mesmo pode configurá-lo para ser iniciado por um disquete ou CD-ROM. Isto possibilita que ele entre no modo de recuperação ou de usuário simples, o que por sua vez permite que ele inicie programas arbitrariamente no sistema ou copie informações confidenciais.
Impedir a Inicialização do Sistema — Alguns BIOS permitem que você proteja o processo de inicialização da máquina com uma senha. Quando ativado, um atacante é forçado a inserir uma senha antes do BIOS executar o carregador de inicialização.
Como os métodos para definir uma senha para o BIOS variam de acordo com o fabricante do computador, consulte o manual do seu computador para obter instruções específicas.
Se você esquecer a senha do BIOS, ela pode ser restaurada com jumpers na placa-mãe ou desligando a bateria do CMOS. Por esta razão, é aconselhável prevenir (por exemplo, chavear) o acesso aos componentes internos do computador, se possível. Entretanto, consulte o manual do computador ou da placa-mãe antes de tentar desligar a bateria do CMOS.
Outras arquiteturas usam programas diferentes para executar tarefas de nível baixo, mais ou menos equivalentes àquelas do BIOS em sistemas x86. Por exemplo, computadores baseados na Intel®Itanium™ usam o shell EFI (Interface de Firmware Extensivo).
Para instruções sobre a senha para a proteção de programas como BIOS em outras arquiteturas, consulte as instruções do fabricante.
Veja a seguir as principais razões para proteger um carregador de inicialização Linux com senha:
Impedir Acesso ao Modo de Usuário Simples — Se os atacantes puderem inicializar o sistema no modo de usuário simples, eles serão autenticados automaticamente como o usuário root sem que precisem digitar a senha root.
Impedir Acesso ao Console do GRUB — Se uma máquina utilizar o GRUB como um carregador de inicialização, um atacante poderá usar a interface do editor para mudanças de configuração ou para obter informações através do comando cat
.
Impedir Acesso à Sistemas Operacionais Não-Seguros — Em sistemas de inicialização dupla, um atacante pode selecionar um sistema operacional na hora da inicialização (como o DOS, por exemplo), que ignora controles de acesso e permissões de arquivo.
O Red Hat Enterprise Linux para a plataforma x86 vem com o carregador de inicialização GRUB. Para informações detalhadas sobre o GRUB, consulte o Guia de Instalação Red Hat.
Você pode configurar o GRUB para se dirigir às duas primeiras questões listadas na Seção 2.1.2.2, “Senhas do Carregador de Inicialização” adicionando uma diretiva de senha ao seu arquivo de configuração. Para fazer isto, primeiro escolha uma senha segura, abra uma janela de comandos, e então digite o seguinte comando:
/sbin/grub-md5-crypt
Quando solicitado, digite a senha do GRUB e pressione Enter. Isto retornará um hash MD5 da senha.
Em seguida, edite o arquivo de configuração do GRUB /boot/grub/grub.conf
. Abra o arquivo e, abaixo da linha de comando timeout
na seção principal do documento, adicione a seguinte linha:
password --md5 <hash-da-senha>
Substitua <hash-da-senha>
pelo valor retornado do /sbin/grub-md5-crypt
[3].
De agora em diante, durante a inicialização do sistema, o menu do GRUB não permitirá acesso ao editor ou à interface de comandos sem que primeiro a tecla p seja pressionada, seguida da senha do GRUB.
Infelizmente, esta solução não impede que um atacante inicialize um sistema operacional não seguro em um ambiente de inicialização dupla. Para lidar com este cenário, outra parte do arquivo /boot/grub/grub.conf
deve ser editada.
Procure a linha title
do sistema operacional ao qual você deseja adicionar segurança, e adicione abaixo desta uma linha contendo a diretiva lock
.
Para um sistema DOS, a estrofe deve começar da seguinte forma:
title DOS lock
Para que este método funcione adequadamente, uma linha password
deve constar na seção principal do arquivo /boot/grub/grub.conf
. Do contrário, um atacante poderá acessar a interface de edição do GRUB e remover a linha lock.
Para criar uma senha diferente para um kernel ou sistema operacional específico, adicione uma linha lock
na estrofe, seguida de uma linha para a senha.
Cada estrofe que você proteger com uma senha única deve começar com linhas similares ao exemplo seguinte:
title DOS lock password --md5 <hash-da-senha>
O uso de senhas é o método principal utilizado pelo Red Hat Enterprise Linux para verificar a identidade de um usuário. Por isto, a segurança de senhas é tão importante para a proteção do usuário, da estação de trabalho, e da rede.
Por motivos de segurança, o programa de instalação configura o sistema para usar o Algoritmo Message-Digest (MD5) e senhas shadow. É altamente recomendável que você não altere estas configurações.
Se durante a instalação, as senhas MD5 forem desativadas, será usado o formato Data Encryption Standard (DES). Este formato limita as senhas em até oito caracteres alfanuméricos (não permitindo caracteres especiais como pontuação e outros), e oferece um nível de criptografia modesto, de 56 bits.
Se você não selecionar as senhas shadow durante a instalação, todas as senhas serão armazenadas como hashing unidirecional em um arquivo /etc/passwd
legível por todos, o que torna o sistema vulnerável a ataques offline de cracking de senhas. Se um intruso puder obter acesso a uma máquina como um usuário comum, ele pode copiar o arquivo /etc/passwd
para sua própria máquina e rodar inúmeros programas de cracking neste arquivo. Se houver uma senha desprotegida no arquivo, é apenas uma questão de tempo até que o cracker a descubra.
Senhas shadow eliminam a ameaça deste tipo de ataque, armazenando as senhas em um arquivo /etc/shadow
, legível somente pelo usuário root.
Isto força um atacante potencial a tentar quebrar a senha remotamente se autenticando em um serviço de rede na máquina, como SSH ou FTP. Este tipo de ataque de força bruta é bem mais lento e deixa rastros óbvios, já que centenas de tentativas de autenticação mal-sucedidas são registradas nos arquivos do sistema. Claro que, se o cracker começar um ataque no meio da noite em um sistema com senhas fracas, ele pode obter acesso e editar os arquivos de registro para apagar seus rastros antes da luz do dia.
Além das questões de formato e armazenamento, há também a questão de conteúdo. A coisa mais importante que um usuário pode fazer para proteger sua conta contra o cracking de senha é criar uma senha robusta.
Ao criar uma senha robusta, é uma boa idéia seguir estas instruções:
Não Use Apenas Palavras ou Números — Nunca use somente palavras ou números em uma senha.
Alguns exemplos de senhas inseguras:
8675309
juan
hackme
Não Use Palavras Reconhecíveis — Palavras como nomes próprios, palavras de dicionário ou até termos de programas de televisão ou novelas devem ser evitados, mesmo que sejam finalizados com números.
Alguns exemplos de senhas inseguras:
john1
DS-9
mentat123
Não Use Palavras em Idiomas Estrangeiros — Programas de quebra de senhas freqüentemente checam listas de palavras que incluem dicionários de muitos idiomas. Confiar em idiomas estrangeiros para proteger senhas não é seguro.
Alguns exemplos de senhas inseguras:
cheguevara
bienvenido1
1dumbKopf
Não Use Terminologia de Hacker — Se você se acha parte de uma elite por utilizar terminologia de hacker — também chamada de linguajar l337 (LEET) — em sua senha, repense. Muitas listas de palavras incluem palavras do linguajar LEET.
Alguns exemplos de senhas inseguras:
H4X0R
1337
Não Use Informações Pessoais — Não use informações pessoais em suas senhas. Se o atacante souber quem você é, ele terá mais facilidade em descobrir sua senha. A seguir, veja uma lista de tipos de informação a evitar na criação de uma senha:
Alguns exemplos de senhas inseguras:
Seu nome
Nomes de animais de estimação
Nomes de familiares
Quaisquer datas de aniversário
Seu número de telefone ou código postal
Não Inverta Palavras Reconhecíveis — Bons verificadores de senha sempre revertem palavras comuns, portanto reverter uma senha ruim não a torna mais segura.
Alguns exemplos de senhas inseguras:
R0X4H
nauj
9-DS
Não Anote Sua Senha — Nunca guarde uma senha em papel. É bem mais seguro memorizá-la.
Não Use a Mesma Senha Para Todas as Máquinas — É importante criar senhas separadas para cada máquina. Desta maneira, se um sistema for comprometido, todas as outras máquinas não estarão em risco imediato.
As seguintes diretrizes lhe ajudarão a criar uma senha robusta:
Crie uma Senha de no Mínimo Oito Caracteres — Quanto mais longa a senha, melhor. Se você estiver usando senhas MD5, as mesmas devem ter 15 ou mais caracteres. Para senhas DES, use o tamanho máximo (oito caracteres).
Misture Letras Maiúsculas e Minúsculas — O Red Hat Enterprise Linuxdiferencia entre maiúsculas e minúsculas, portanto misture-as para criar uma senha mais robusta.
Misture Letras e Números — Adicionar números a senhas, especialmente no meio delas (não apenas no começo e fim), pode aumentar a robustez da senha.
Inclua Caracteres Não Alfa-numéricos — Caracteres especiais como &, $, e > podem aumentar bastante a robustez de uma senha (isto não é possível se senhas DES forem usadas).
Escolha uma Senha que Você Possa Lembrar — A melhor senha do mundo de nada adianta se você não conseguir lembrá-la. Então, use acrônimos ou outros dispositivos mnemônicos para ajudá-lo a memorizar senhas.
Com todas estas regras, parece difícil criar uma senha que siga todos os critérios e evitar as características de uma senha ruim. Felizmente, existem alguns passos simples que podem ser seguidos para gerar uma senha fácil de lembrar e segura.
Há muitos métodos usados para criar senhas seguras. Um dos mais conhecidos envolve acrônimos. Por exemplo:
Pense em uma frase que seja fácil de lembrar, como:
"e o sol da liberdade em raios fúlgidos, brilhou no céu da pátria neste instante."
Em seguida, transforme-a num acrônimo (incluindo a pontuação).
eosdlerf,bncdpni.
Adicione complexidade substituindo letras por números e símbolos no acrônimo. Por exemplo: substitua n
por 9
e a letra d
pelo símbolo arroba (@
):
eos@lerf,b9cdp9i.
Adicione mais complexidade colocando pelo menos uma das letras em maiúscula, como F
.
eos@lerF,b9cdp9i.
Finalmente, nunca use o exemplo acima em um de seus sistemas.
Criar senhas seguras é imperativo, mas gerenciá-las apropriadamente também é importante, especialmente para administradores de sistemas em grandes organizações. A próxima seção detalha boas práticas para criar e gerenciar senhas de usuários em uma organização.
Se houver um número significativo de usuários em uma organização, os administradores de sistemas têm duas opções básicas para forçar o uso de boas senhas. Eles podem criar senhas para os usuários, ou podem deixar que os usuários criem suas próprias senhas, enquanto verificam se as senhas têm qualidade aceitável.
Criar senhas para os usuários garante que as senhas sejam boas, mas torna-se uma tarefa complicada conforme a empresa cresce. Também aumenta o risco dos usuários anotarem suas senhas.
Por estas razões, a maioria dos administradores de sistema prefere que os usuários criem suas próprias senhas, mas ativamente verificam se as senhas são boas e, em alguns casos, forçam os usuários a trocarem suas senhas periodicamente conforme as senhas vão envelhecendo.
Para proteger a rede contra intrusos, é aconselhável que administradores de sistemas certifiquem-se que as senhas usadas dentro de uma organização sejam robustas. Usuários podem usar o comando passwd
para criar ou modificar suas senhas. Uma vez que este comando pode fazer uso de PAMs, o mesmo pode verificar, por exemplo, se a senha é muito curta ou vulnerável à quebra de segurança. Tal verificação é efetuada através do uso do módulo PAM chamado pam_cracklib.so
. Uma vez que o PAM é personalizável, é possível adicionar mais verificadores de integridade de senhas, como pam_passwdqc
(disponível em http://www.openwall.com/passwdqc/) ou escrever um novo módulo. Para acessar uma lista de módulos PAM disponíveis, consulte http://www.kernel.org/pub/linux/libs/pam/modules.html. Para maiores informações sobre o PAM, consulte a Seção 2.4, “Módulos de Autenticação Plugáveis (Pluggable Authentication Modules - PAM)”.
A verificação de senhas executada durante sua criação não descobre senhas fracas tão efetivamente quanto a verificação através da execução de um programa de quebra de senhas contra as mesmas.
Há muitos programas de quebra de senhas que rodam no Red Hat Enterprise Linux, embora nenhum seja distribuído junto com o sistema operacional. Abaixo há uma breve lista de alguns dos programas de cracking de senhas mais conhecidos:
Nenhuma destas ferramentas é fornecida com o Red Hat Enterprise Linux, e portanto não são suportadas pela Red Hat, Inc. de maneira nenhuma.
John The Ripper — Um programa de quebra de senhas rápido e flexível. Permite o uso de listas de palavras múltiplas e é capaz de quebrar senhas usando força bruta. Está disponível online em http://www.openwall.com/john/.
Crack — Talvez o programa de quebra de senhas mais conhecido, o Crack também seja muito rápido, embora não tão fácil de usar quanto o John The Ripper. Ele pode ser encontrado online em http://www.crypticide.com/users/alecm/.
Slurpie — O Slurpie é similar ao John The Ripper e ao Crack, mas foi criado para rodar em vários computadores simultaneamente, criando um ataque de quebra de senhas distribuído. Pode ser encontrado online, juntamente à outras ferramentas de avaliação de segurança contra ataques distribuídos, em http://www.ussrback.com/distributed.htm.
Sempre obtenha autorizações por escrito antes de tentar quebrar senhas dentro de uma empresa.
O vencimento de senhas é uma outra técnica usada por administradores de sistema para se combater o uso de senhas fracas dentro de uma empresa. O vencimento de senhas significa que após um determinado tempo (geralmente 90 dias), o usuário é obrigado a criar uma nova senha. Na teoria, se o usuário é forçado a trocar sua senha periodicamente, uma quebra de senha será útil para um intruso somente por um tempo limitado. A desvantagem desta técnica, no entanto, é que usuários tendem a anotar suas senhas.
Existem dois programas principais usados para efetivar o uso do vencimento de senhas no Red Hat Enterprise Linux: o comando chage
ou o aplicativo gráfico Gerenciador de Usuários (system-config-users
).
A opção -M
do comando chage
especifica a validade máxima de uma senha (em número de dias). Por exemplo, para fazer com que a senha de um usuário vença em 90 dias, use o seguinte comando:
chage -M 90 <nome-de-usuário>
No comando acima, substitua <nome-de-usuário>
pelo nome de usuário correspondente. Para fazer com que a senha nunca vença, é comum usar o valor 99999
após a opção -M
(isto equivale a um pouco mais do que 273 anos).
Você também pode usar o comando chage
em modo interativo para modificar o vencimento e detalhes de várias senhas ao mesmo tempo. Use o seguinte comando para entrar em modo interativo:
chage <nome-de-usuário>
O trecho a seguir é um exemplo de uma sessão interativa usando este comando:
[root@interch-dev1 ~]# chage davido Changing the aging information for davido Enter the new value, or press ENTER for the default Minimum Password Age [0]: 10 Maximum Password Age [99999]: 90 Last Password Change (YYYY-MM-DD) [2006-08-18]: Password Expiration Warning [7]: Password Inactive [-1]: Account Expiration Date (YYYY-MM-DD) [1969-12-31]: [root@interch-dev1 ~]#
Consulte a página man do chage para maiores informações sobre as opções disponíveis.
Você também pode usar o gráfico do aplicativo Gerente de Usuário para criar uma política de vencimento de senha, como se segue. Note: você precisará dos privilégios do Administrador para aplicar este procedimento.
Clique no menu Sistema no Painel, escolha Administração e clique em Usuários e Grupos para mostrar o Gerente de Usuário. Como outra alternativa, digite o comando system-config-users
na janela de comandos.
Clique na aba Usuários, e selecione o usuário requerido na lista de usuários.
Clique em Propriedades na barra de ferramentas para mostrar a caixa de diálogo das Propriedades do Usuário ( ou escolha Propriedades no menu Arquivo).
Em seguida, clique na aba Informações de Senhas e insira o número de dias antes da senha vencer, conforme mostra a Figura 2.1, “Especificando as opções de vencimento da senha”.
Insira o valor solicitado no campo Dias antes da solicitação de mudança e clique em OK.
Durante a administração de máquinas de uso pessoal, o usuário precisa executar certas tarefas como usuário root, ou após obter privilégios pertinentes ao usuário root através de um programa setuid como o sudo
ou o su
. Um programa setuid roda com o ID (UID) do proprietário do programa, ao invés de usar o ID do usuário executando o programa. Tais programas são identificados por um s
na seção do proprietário em uma listagem, como no exemplo seguinte:
-rwsr-xr-x 1 root root 47324 May 1 08:09 /bin/su
O s
pode ser maiúsculo ou minúsculo. Se for maiúsculo, significa que o bit de permissão adjacente não foi definido.
Entretanto, administradores de sistemas de uma organização devem decidir o que os usuários poderão acessar. Através de um módulo PAM chamado pam_console.so
, algumas atividades normalmente reservadas somente ao usuário root, como reinicialização e montagem de mídias removíveis, são permitidas ao primeiro usuário a se autenticar no sistema através de um console físico (consulte a Seção 2.4, “Módulos de Autenticação Plugáveis (Pluggable Authentication Modules - PAM)” para maiores informações sobre o módulo pam_console.so
). Entretanto, outras tarefas importantes relativas à administração de sistemas, tais como a alteração de configurações de rede, configuração de um novo mouse, ou montagem de dispositivos de rede, não são possíveis sem privilégios administrativos. Porisso, os administradores de sistemas precisam decidir o que os usuários poderão acessar em suas redes.
Se os usuários de uma organização são de confiança e bem treinados em relação ao uso de computadores, permitir que eles gozem de acesso root talvez não seja uma preocupação. Permitir que usuários tenham acesso root significa que atividades corriqueiras, como a adição de dispositivos ou configuração de interfaces de rede, sejam administradas por cada usuário, deixando administradores de sistemas livres para lidar com a segurança de rede e outras questões importantes.
Por outro lado, a permissão de acesso root à usuários individuais pode levantar as seguintes questões:
Má Configuração da Máquina — Usuários com acesso root podem configurar suas máquinas incorretamente e precisar de assistência para resolver problemas, ou pior, abrir buracos na segurança sem saber.
Execução de Serviços Inseguros — Usuários com acesso root podem rodar serviços inseguros, como FTP ou Telnet, em suas máquinas, potencialmente colocando em risco nomes de usuários e senhas. Estes serviços transmitem informação através da rede usando modo texto sem formatação.
Execução de Anexos de E-mails como Root — Apesar de raros, existem vírus de e-mail que afetam o Linux. A única hora em que eles representam uma ameaça, no entanto, é quando são executados pelo usuário root.
Se um administrador não confia em deixar que usuários autentiquem-se como root por essas ou outras razões, a senha root deve ser mantida em segredo, e acesso aos modos runlevel one ou usuário individual deve ser desabilitado através da proteção do carregador de inicialização por senha (consulte a Seção 2.1.2.2, “Senhas do Carregador de Inicialização” para maiores informações sobre este tópico).
Tabela 2.1, “Métodos para Desativar a Conta Root” descreve outras iniciativas que um administrador pode usar para ter certeza de que logins como root não são permitidos:
Método | Descrição | Efeitos | Não Afeta | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Alterando o shell do root. |
Edite o arquivo /etc/passwd e altere o shell de /bin/bash para /sbin/nologin .
|
|
|
|||||||||||||||
Desativando acesso root através de qualquer dispositivo de console (tty). |
Um arquivo /etc/securetty vazio impede a autenticação como root a quaisquer dispositivos conectados ao computador.
|
|
|
|||||||||||||||
Desativando autenticações root SSH. |
Edite o arquivo /etc/ssh/sshd_config e defina o parâmetro PermitRootLogin para no .
|
|
|
|||||||||||||||
Utilizar o PAM para limitar o acesso root aos serviços. |
Edite o arquivo para o serviço alvo no diretório /etc/pam.d/ . Certifique-se de que pam_listfile.so é necessário para autenticação.[a]
|
|
|
|||||||||||||||
[a] Consulte a Seção 2.1.4.2.4, “Desabilitando o Acesso do Root ao PAM” para maiores detalhes. |
Para impedir que os usuários autentiquem-se diretamente como root, o administrador do sistema pode configurar o shell da conta root para /sbin/nologin
no arquivo /etc/passwd
. Isto impede o acesso à conta root através de comandos que requerem um shell, como os comandos su
e ssh
.
Programas que não requerem acesso ao shell, como clientes de e-mail ou o comando sudo
, ainda podem acessar a conta root.
Para limitar acesso à conta root, os administradores podem desabilitar autenticações root no console editando o arquivo /etc/securetty
. Este arquivo lista todos os dispositivos nos quais o usuário root pode se autenticar. Se o arquivo não existir, o usuário root pode se autenticar através de qualquer dispositivo de comunicação no sistema, seja através do console ou de uma interface de rede. Isto é perigoso pois um usuário pode acessar o Telnet em sua máquina como root, enviando sua senha em formato texto através da rede. De acordo com a configuração padrão, o arquivo /etc/securetty
do Red Hat Enterprise Linux permite que somente o usuário root se autentique no console fisicamente conectado à máquina. Para impedir que o root autentique-se, remova o conteúdo deste arquivo digitando o seguinte comando:
echo > /etc/securetty
Um arquivo /etc/securetty
em branco não impede que o usuário root autentique-se remotamente usando o conjunto de ferramentas OpenSSH porque o console só é aberto após a autenticação.
Para impedir autenticações do root através do protocolo SSH, edite o arquivo de configuração do daemon do SSH (/etc/ssh/sshd_config
). Altere a seguinte linha:
# PermitRootLogin yes
para o seguinte:
PermitRootLogin no
O PAM permite grande flexibilidade para recusar contas específicas através do módulo /lib/security/pam_listfile.so
. O administrador pode usar este módulo para listar os usuários que não têm permissão para autenticação. Abaixo está um exemplo de como o módulo é usado para o servidor FTP vsftpd
no arquivo /etc/pam.d/vsftpd
de configuração do PAM (o caractere \
no final da primeira linha no seguinte exemplo não é necessário se o comando ocupar apenas uma linha):
auth required /lib/security/pam_listfile.so item=user \ sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
Isto diz ao PAM para consultar o arquivo /etc/vsftpd.ftpusers
e recusar a qualquer usuário lá listado o acesso ao serviço. O administrador pode alterar o nome deste arquivo e pode manter listas separadas para cada serviço ou usar uma lista central para recusar o acesso a múltiplos serviços.
Se o administrador quiser recusar o acesso a múltiplos serviços, pode-se adicionar uma linha similar aos arquivos de configuração do PAM, como /etc/pam.d/pop
e /etc/pam.d/imap
para clientes de e-mail ou /etc/pam.d/ssh
para clientes SSH.
Para maiores informações sobre o PAM, consulte a Seção 2.4, “Módulos de Autenticação Plugáveis (Pluggable Authentication Modules - PAM)”.
Ao invés de recusar completamente o acesso ao usuário root, o administrador pode permitir o acesso apenas através de programas setuid, como o su
ou o sudo
.
Quando um usuário executa o comando su
, o mesmo precisa entrar com a senha root e, após a autenticação, recebe uma solicitação de janela da root.
Uma vez autenticado através do comando su
, o usuário é o usuário root e tem acesso administrativo total ao sistema[4]. Além disso, ao se tornar um usuário root, é possível que ele use o comando su
para assumir a identidade de qualquer outro usuário no sistema sem precisar entrar com a respectiva senha.
Como este programa é tão poderoso, administradores dentro de uma empresa talvez queiram limitar quem pode acessá-lo.
Uma das maneiras mais simples de fazer isso é adicionar usuários ao grupo administrativo especial chamado wheel. Para fazer isso, digite o seguinte comando como root:
usermod -G wheel <nome-de-usuário>
No comando anterior, substitua <nome-de-usuário>
pelo nome do usuário sendo adicionado ao grupo wheel
.
Você também pode usar o Gerente de Usuário para modificar os membros do grupo, como se segue. Note: você precisará dos privilégios do Administrador para aplicar este procedimento.
Clique no menu Sistema no Painel, escolha Administração e clique em Usuários e Grupos para mostrar o Gerente de Usuário. Como outra alternativa, digite o comando system-config-users
na janela de comandos.
Clique na aba Usuários, e selecione o usuário requerido na lista de usuários.
Clique em Propriedades na barra de ferramentas para mostrar a caixa de diálogo das Propriedades do Usuário ( ou escolha Propriedades no menu Arquivo).
A seguir, selecione a aba Grupos e clique no grupo wheel, conforme a Figura 2.2, “Adicionando usuários ao grupo "wheel".”.
Em seguida, abra o arquivo de configuração do PAM para o su
(/etc/pam.d/su
) em um editor de texto e remova o comentário # da seguinte linha:
auth required /lib/security/$ISA/pam_wheel.so use_uid
Isso permitirá que somente membros do grupo administrativo wheel
usem o programa.
O usuário root é parte do grupo wheel
de acordo com a configuração padrão.
O comando sudo
oferece outra abordagem para permitir que usuários tenham acesso administrativo. Quando um usuário confiável precede um comando administrativo com sudo
, o sistema pede que o usuário entre a sua própria senha. Então, após a autenticação, e assumindo que seja permitido, o comando administrativo é executado como se o usuário fosse o root.
O formato básico do comando sudo
é o seguinte:
sudo <comando>
No exemplo acima, <comando>
seria substituído por um comando normalmente reservado apenas ao usuário root, como, por exemplo, mount
.
Usuários do comando sudo
devem tomar cuidado extra para fazer o logout antes de deixarem suas máquinas, já que é possível usar o comando novamente sem precisar indicar a senha, por um período de cinco minutos. Esta configuração pode ser alterada através do arquivo de configuração /etc/sudoers
.
O comando sudo
permite um grau de flexibilidade maior. Por exemplo, somente os usuários listados no arquivo de configuração /etc/sudoers
podem usar o comando sudo
e o comando é executado no shell do usuário, e não em um shell do root. Isto significa que o shell do root pode ser completamente desabilitado, conforme demonstrado na Seção 2.1.4.2.1, “Desativando o Shell do Root”.
O comando sudo
também oferece um registro detalhado da seqüência de eventos. Cada autenticação bem-sucedida é registrada no arquivo /var/log/messages
e os comandos submetidos são registrados com o nome do usuário no arquivo /var/log/secure
.
Outra vantagem do comando sudo
é que um administrador pode permitir que usuários acessem diferentes comandos específicos de acordo com suas necessidades.
Administradores que queiram editar o arquivo de configuração do sudo
, o /etc/sudoers
, devem usar o comando visudo
.
Para que alguém tenha todos os privilégios administrativos, digite visudo
e adicione uma linha similar na seguinte na seção de especificação de privilégios do usuário:
juan ALL=(ALL) ALL
Este exemplo estabelece que o usuário juan
pode usar o sudo
em qualquer máquina e executar qualquer comando.
O exemplo abaixo ilustra a granularidade possível ao configurar o sudo
:
%users localhost=/sbin/shutdown -h now
Este exemplo estabelece que qualquer usuário pode submeter o comando /sbin/shutdown -h now
desde que o faça pelo console.
A página man do sudoers
tem uma lista detalhada das opções para este arquivo.
O controle administrativo de acesso dos usuários é uma questão séria para administradores de sistemas dentro de uma empresa. No entanto, o controle de quais serviços de rede estão ativos é de suma importância para qualquer administrador e operador do sistema Linux.
Muitos serviços comportam-se como servidores de rede sob o Red Hat Enterprise Linux. Se um serviço de rede estiver rodando em uma máquina, então consequentemente um aplicativo de servidor (ou daemon) estará ouvindo conexões em uma ou mais portas de rede. Cada um destes servidores deve ser tratado como uma potencial via de ataque.
Serviços de rede podem representar muitos riscos aos sistemas Linux. Veja abaixo uma lista dos principais problemas:
Ataques de Negação de Serviço (Denial of Service, ou DoS) — Ao inundar um serviço com pedidos, um ataque de negação de serviço pode inutilizar um sistema enquanto este tenta registrar e responder à cada solicitação.
Ataques de Vulnerabilidade de Script — Se um servidor estiver usando scripts para executar ações no lado do servidor, como servidores Web geralmente fazem, um cracker pode montar um ataque contra scripts escritos inapropriadamente. Estes ataques de vulnerabilidade de script podem levar à condição de estouro de buffer ou permitir que o atacante altere arquivos no sistema.
Ataques de Estouro de Buffer — Serviços que se conectam à portas numeradas de 0 a 1023 devem ser executados por um usuário administrativo. Se o aplicativo tiver uma vulnerabilidade de estouro de buffer, um atacante pode obter acesso ao sistema como o usuário rodando o daemon. Devido à existência de vulnerabilidades de estouro de buffer, os crackers usam ferramentas automatizadas para identificar sistemas com vulnerabilidades, e após obterem acesso ao sistema, utilizam rootkits automatizados para mantê-lo.
A ameaça das vulnerabilidades de estouro de buffer é amenizada no Red Hat Enterprise Linux pelo ExecShield, uma tecnologia de segmentação e proteção da memória executável suportada pelos kernels de mono ou multi-processadores x86. O ExecShield reduz o risco de estouro de buffer dividindo a memória virtual em segmentos executáveis e não-executáveis. Qualquer código de programa que tentar executar fora do segmento executável (como código maléfico de um exploit baseado em estouro de buffer) aciona uma falha de segmentação e é terminado.
O Execshield também inclui suporte para a tecnologia No eXecute (NX) nas plataformas AMD64 e para a tecnologia eXecute Disable (XD) em sistemas Itanium e Intel® 64. Estas tecnologias trabalham em conjunto com o ExecShield para impedir que código maldoso rode na porção executável da memória virtual com uma granularidade de 4KB de código executável, diminuindo o risco de ataques exploits furtivos de estouro de buffer.
Para limitar a exposição a ataques através da rede, todos os serviços que não estiverem sendo usados, devem ser desligados.
Para aumentar a segurança, a maioria dos serviços de rede instalados com o Red Hat Enterprise Linux são desligados por meio da configuração padrão. No entanto, há algumas exceções notáveis:
cupsd
— O servidor de impressão padrão do Red Hat Enterprise Linux.
lpd
— Um servidor de impressão alternativo.
xinetd
— Um super servidor que controla conexões à uma gama de servidores subordinados, como gssftp
e telnet
.
sendmail
— O Agente de Transporte de Correio (Mail Transport Agent ou MTA) Sendmail é habilitado pela configuração padrão, mas somente escuta por conexões a partir do localhost.
sshd
— O servidor OpenSSH, um substituto seguro para o Telnet.
Ao determinar se estes serviços devem ou não ser deixados rodando, é melhor usar o bom senso e pecar pela precaução. Por exemplo, se uma impressora não está disponível, não deixe o cupsd
rodando. O mesmo vale para o portmap
. Se você não monta volumes NFSv3 ou não usa o NIS (o serviço ypbind
), então o portmap
deve ser desabilitado.
Ilustração da Ferramenta de Configuração de Serviços
Se você não tiver certeza se um serviço é necessário ou não, a Ferramenta de Configuração de Serviços oferece um campo de descrição, ilustrado na Figura 2.3, “Ferramenta de Configuração de Serviços”, que oferece informações adicionais sobre cada serviço.
Mas verificar quais serviços de rede estão disponíveis durante a inicialização não é suficiente. Você também deve verificar quais portas estão abertas e em escuta. Consulte a Seção 2.2.8, “Verificando Quais Portas estão Escutando” para maiores informações.
Alguns protocolos de rede são essencialmente mais inseguros que outros. Estes incluem quaisquer serviços que:
Transmitam Nomes de Usuário e Senhas Não Criptografados através de uma Rede — Muitos protocolos antigos, como Telnet e FTP, não criptografam a seção de autenticação e devem ser evitados sempre que possível.
Passem Dados Confidenciais por uma Rede Não-Criptografada — Muitos protocolos passam dados não-criptografados através da rede. Estes protocolos incluem o Telnet, FTP, HTTP e o SMTP. Muitos sistemas de arquivos de rede, como o NFS e o SMB, também passam informações não-criptografadas através da rede. É responsabilidade do usuário limitar o tipo de dados transmitidos ao utilizar estes protocolos.
Serviços remotos de despejo de memória, como o netdump
, passam o conteúdo da memória não criptografado através da rede. Despejos de memória podem conter senhas ou, pior ainda, informações de bancos de dados ou outras informações confidenciais.
Outros serviços como finger
e rwhod
revelam informações sobre os usuários do sistema.
Entre os exemplos de serviços inseguros herdados, incluem rlogin
, rsh
, telnet
, and vsftpd
.
Todos os programas remotos de autenticação e shell (rlogin
, rsh
, e telnet
) devem ser evitados em favor do SSH. Consulte a Seção 2.1.7, “Ferramentas de Comunicação com Segurança Aprimorada” para maiores informações a respeito do sshd
.
O FTP não é essencialmente tão perigoso à segurança do sistema quanto shells remotos, mas os servidores FTP devem ser configurados e monitorados cuidadosamente para evitar problemas. Consulte a Seção 2.2.6, “Protegendo o FTP” para maiores informações sobre a implementação de medidas de segurança em servidores FTP.
Os seguintes serviços devem ser cuidadosamente implementados e colocados atrás de um firewall:
finger
authd
(chamado de identd
em lançamentos anteriores do Red Hat Enterprise Linux)
netdump
netdump-server
nfs
rwhod
sendmail
smb
(Samba)
yppasswdd
ypserv
ypxfrd
Maiores informações sobre como implementar medidas de segurança para serviços de rede podem ser encontradas na Seção 2.2, “Segurança do Servidor”.
A próxima seção aborda as ferramentas disponíveis para a configuração de um firewall simples.
Após o término da configuração de serviços de rede necessários, é importante que se implemente um firewall.
Você deve configurar os serviços necessários e implementar um firewall antes de se conectar à Internet ou qualquer outra rede não confiável.
Firewalls evitam que pacotes de rede acessem a interface de rede do sistema. Se uma solicitação for feita à uma porta que estiver bloqueada pelo firewall, tal solicitação será ignorada. Se um serviço estiver escutando em uma destas portas bloqueadas, o mesmo não receberá os pacotes e será efetivamente desabilitado. Por este motivo, ao configurar um firewall, certifique-se de bloquear o acesso à portas que não estejam sendo usadas e liberar o acesso à portas usadas por serviços configurados.
For most users, the best tool for configuring a simple firewall is the graphical firewall configuration tool which ships with Red Hat Enterprise Linux: the Ferramenta de Configuração do Nível de Segurança (system-config-securitylevel
). This tool creates broad iptables
rules for a general-purpose firewall using a control panel interface.
Na mesma proporção em que cresceu o tamanho e a popularidade da Internet, cresceu também a ameaça da interceptação de comunicações. Através dos anos, ferramentas foram desenvolvidas para criptografar comunicações durante sua transmissão através de redes de comunicação.
O Red Hat Enterprise Linux é distribuído com duas ferramentas básicas que usam algoritmos de alto nível e baseados em criptografia de chave pública para proteger dados enquanto estes trafegam pela rede.
OpenSSH — Uma versão gratuita do protocolo SSH para criptografar comunicações de rede.
GNU Privacy Guard (GPG) — Uma implementação gratuita de aplicativo de criptografia PGP (Pretty Good Privacy) para criptografar dados.
OpenSSh é uma maneira mais segura de acessar uma máquina remota e substitui serviços não criptografados como telnet
e rsh
. OpenSSH inclui um serviço de rede chamado sshd
, e três aplicações cliente de linha de comandos:
ssh
— Um cliente de acesso seguro a consoles remotos.
scp
— Um comando seguro de cópia remota.
sftp
— Um cliente pseudo-ftp seguro que permite seções interativas de transferência de arquivos.
GPG é uma maneira de garantir a privacidade da comunicação por e-mail. Pode ser usado tanto para enviar e-mail com dados privativos através de redes públicas como para proteger dados confidenciais em discos rígidos.
Quando um sistema é usado como um servidor em um rede pública, torna-se um alvo de ataques. Por esta razão solidificar e trancar os serviços é de suma importância para o administrador de sistemas.
Antes de aprofundar em questões específicas, você deve revisar as seguintes dicas gerais para aumentar a segurança do servidor:
Mantenha todos os serviços atualizados para protegê-los contra as ameaças recentes.
Use protocolos seguros sempre que possível.
Ofereça apenas um tipo de serviço de rede por máquina sempre que possível.
Monitore todos os servidores cuidadosamente e atente para atividades suspeitas.
TCP wrappers oferecem controle de acesso a vários serviços. A maioria dos serviços de rede modernos, como SSH, Telnet e FTP, utilizam TCP wrappers, que ficam de guarda entre a entrada de um pedido e o serviço requisitado.
Os benefícios oferecidos por TCP wrappers aumentam quando este é usado junto ao xinetd
, um super servidor que oferece acesso adicional, registro, vinculação, redirecionamento e controle de utilização de recursos.
As sub-seções seguintes assumem um conhecimento básico de cada tópico e concentram-se nas opções de segurança específicas.
Os TCP wrappers são capazes de fazer muitas outras coisas além de simplesmente negar acesso aos serviços. Esta seção ilustra como eles podem ser utilizados para enviar banners de conexão, alertar ataques em hosts específicos e aprimorar a funcionalidade de autenticação. Consulte a página man hosts_options
para obter uma lista completa das funcionalidades e linguagem de controle do TCP Wrapper.
Enviar um banner apropriado quando os usuários se conectarem a um serviço é uma boa forma de informar atacantes em potencial que o administrador de sistemas está sob vigília. Você também pode controlar se as informações sobre o sistema estão sendo disponibilizadas aos usuários.Para implementar um banner do TCP Wrappers para um serviço, use a opção banner
.
Este exemplo implementa um banner para o vsftpd
. Para começar, crie um arquivo de banner. Pode estar em qualquer lugar do sistema, mas deve levar o mesmo nome que o daemon. Neste exemplo, o arquivo é chamado /etc/banners/vsftpd
e contém as seguintes linhas:
220-Hello, %c 220-All activity on ftp.example.com is logged. 220-Inappropriate use will result in your access privileges being removed.
A expressão %c
oferece uma gama de informações do cliente, tais como nome de usuário e nome de host ou nome de usuário e endereço IP, para intimidar ainda mais a conexão.
Para que este banner seja apresentado em futuras conexões, adicione a seguinte linha ao arquivo /etc/hosts.allow
:
vsftpd : ALL : banners /etc/banners/
Se um determinado host ou rede for flagrado atacando o servidor, o TCP wrappers pode ser usado para alertar o administrador sobre ataques subseqüentes deste host ou rede através da diretiva spawn
.
Neste exemplo, assuma que um cracker da rede 206.182.68.0/24 foi pego tentando atacar o servidor. Ao inserir a seguinte linha no arquivo /etc/hosts.deny
, a tentativa de conexão a partir daquela rede é negada e registrada em um arquivo especial:
ALL : 206.182.68.0 : spawn /bin/ 'date' %c %d >> /var/log/intruder_alert
A expressão %d
traz o nome do serviço que o atacante estava tentando acessar.
Para permitir a conexão e registrá-la, insira diretiva spawn
no arquivo /etc/hosts.allow
.
Já que a diretiva spawn
executa qualquer comando de linha, crie um script especial para notificar o administrador ou para executar uma série de comandos quando um determinado cliente tentar conectar ao servidor.
Se determinados tipos de conexões são mais preocupantes que outras, o nível de registro pode ser elevado para estes serviços através da opção severity
.
Neste exemplo, considere que qualquer um tentando conectar à porta 23 (a porta do Telnet) em um servidor FTP é um cracker. Para denotar isso, insira um sinal emerg
nos arquivos de registro ao invés do sinal padrão, info
, e negue a conexão.
Para fazer isso, insira a seguinte linha no arquivo /etc/hosts.deny
:
in.telnetd : ALL : severity emerg
Isto usa a facilidade de registro authpriv
padrão, mas eleva a prioridade do valor padrão info
para emerg
, o que envia mensagens de registro diretamente ao console.
Esta seção concentra-se no uso do xinetd
para configurar um serviço armadilha e usá-lo para controlar níveis de recursos disponíveis para quaisquer serviços xinetd
. Estabelecer limites de recursos para serviços pode ajudar a frustrar ataques de Negação de Serviço (Denial of Service, ou DoS). Consulte as páginas man para o xinetd
e o xinetd.conf
para uma lista de opções disponíveis.
Uma importante característica do xinetd
é sua habilidade em adicionar hosts à uma lista global no_access
. Aos hosts desta lista são negadas as conexões subseqüentes aos serviços gerenciados pelo xinetd
por um determinado período ou até o xinetd
ser reiniciado. Isto é feito usando o atributo SENSOR
. Esta técnica é uma maneira fácil de bloquear hosts que tentarem scanear o servidor.
O primeiro passo para definir um SENSOR
é escolher um serviço que você não planeja utilizar. Neste exemplo, usamos o Telnet.
Edite o arquivo /etc/xinetd.d/telnet
e altere a linha flags
para:
flags = SENSOR
Adicione a seguinte linha:
deny_time = 30
Isto nega a conexão do host que tentou conectar à porta por 30 minutos. Outros valores aceitáveis para o atributo deny_time
são FOREVER (sempre), que mantém o banimento efetivo até que o xinetd
seja reiniciado, e NEVER (nunca), que permite a conexão e a registra.
Finalmente, a última linha deve ser:
disable = no
Isto habilita a armadilha.
Apesar do uso do SENSOR
ser uma boa maneira de detectar e parar conexões de hosts perigosos, há duas desvantagens:
Não funciona contra scans secretos.
Um atacante ciente de que você está rodando o SENSOR
pode montar um ataque de Negação de Serviço contra determinados hosts forjando seus endereços IP e conectando à porta proibida.
Outra característica importante do xinetd
é sua habilidade em controlar a quantidade de recursos que os serviços sob seu controle podem utilizar.
Ele o faz através das seguintes diretivas:
cps = <number_of_connections> <wait_period>
— Limita a taxa de conexões de entrada. Esta diretiva leva dois argumentos:
<number_of_connections>
— O número de conexões por segundo a serem manuseadas. Se a taxa de conexões de entrada for mais alta que isto, o serviço torna-se temporariamente desabilitado. O valor padrão é cinqüenta (50).
<wait_period>
— O número de segundos a esperar antes de reabilitar o serviço após o mesmo tenha sido desabilitado. O intervalo padrão é dez (10) segundos.
instances = <number_of_connections>
— Determina o número total de conexões permitidas a um serviço. Esta diretiva aceita tanto um valor inteiro como UNLIMITED
.
per_source = <number_of_connections>
— Determina as conexões permitidas a um serviço por cada host. Esta diretiva aceita tanto um valor inteiro como UNLIMITED
.
rlimit_as = <number[K|M]>
— Determina a quantidade de espaço de endereço de memória que o serviço pode ocupar em kilobytes ou megabytes. Esta diretiva aceita tanto um valor inteiro como UNLIMITED
.
rlimit_cpu = <number_of_seconds>
— Determina o tempo em segundos durante o qual um serviço pode ocupar a CPU. Esta diretiva aceita tanto um valor inteiro como UNLIMITED
.
O uso destas diretivas pode ajudar a prevenir que qualquer serviço xinetd
sobrecarregue o sistema, resultando em negação de serviço.
O serviço portmap
é um daemon de atribuição dinâmica de portas para serviços RPC, como o NIS e o NFS. Tem mecanismos de autenticação fracos e tem habilidade para delegar uma vasta gama de portas para os serviços que controla. Por estas razões, é difícil de proteger.
Proteger o portmap
afeta somente as implementações do NFSv2 e NFSv3, já que o NFSv4 não o requer mais. Se você planeja implementar um servidor NFSv2 ou NFSv3, o portmap
é necessário e a seção seguinte é válida.
Se você está rodando serviços RPC, siga estas regras básicas.
É importante usar TCP Wrappers para limitar quais redes ou hosts têm acesso ao serviço portmap
já que este não possui uma forma de autenticação própria.
Além disso, use somente endereços IP ao limitar acesso para o serviço. Evite usar estes nomes de host, já que eles podem ser forjados através da adulteração do DNS e outros métodos.
Para restringir ainda mais o acesso ao serviço portmap
, é uma boa idéia adicionar regras do iptables ao servidor e restringir o acesso à redes específicas.
Abaixo encontram-se dois exemplos de comandos do iptables. O primeiro permite conexões TCP à porta 111 (usada pelo serviço portmap
) a partir da rede 192.168.0.0/24. O segundo permite conexões TCP à mesma porta a partir do host local. Isto é necessário para o serviço sgi_fam
usado pelo Nautilus. Todos os outros pacotes são descartados.
iptables -A INPUT -p tcp -s! 192.168.0.0/24 --dport 111 -j DROP iptables -A INPUT -p tcp -s 127.0.0.1 --dport 111 -j ACCEPT
Para limitar o tráfego UDP similarmente, use o seguinte comando.
iptables -A INPUT -p udp -s! 192.168.0.0/24 --dport 111 -j DROP
O Network Information Service (NIS) é um serviço RPC, chamado ypserv
,--> o qual é usado junto com o portmap
e outros serviços afins para distribuir mapas de nomes de usuários, senhas e outras informações sensitivas para qualquer computador afirmando estar no seu domínio.
Um servidor NIS é composto de diversas aplicações. Elas incluem as seguintes:
/usr/sbin/rpc.yppasswdd
— Também chamado de serviço yppasswdd
, esse daemon permite que os usuários alterem suas senhas NIS.
/usr/sbin/rpc.ypxfrd
— Também chamado de serviço ypxfrd
, esse daemon é responsável pelas transferências de mapa do NIS através da rede.
/usr/sbin/yppush
— Essa aplicação propaga bancos de dados NIS alterados para servidores NIS múltiplos.
/usr/sbin/ypserv
— Este é o servidor daemon do NIS.
O NIS é não é nada seguro para os padrões de hoje. Não possui mecanismos de autenticação de host e passa toda a sua informação sem criptografia através da rede, incluindo o hash de senhas. Como resultado, tenha muito cuidado ao configurar uma rede que usa o NIS. Para complicar ainda mais, a configuração padrão do NIS é essencialmente insegura.
É recomendado a qualquer um que esteja planejando implementar um servidor NIS, primeiro proteger o serviço portmap
conforme descrito na Seção 2.2.2, “Protegendo o Portmap”, e então resolver os seguintes problemas, como um planejamento da rede.
Como o NIS passa informações confidenciais sem criptografia através da rede, é importante que o serviço seja executado por trás de uma firewall e numa rede segmentada e segura. Toda vez que informações do NIS são passadas através de uma rede insegura, há o risco de serem interceptadas. O design cuidadoso da rede neste aspecto pode ajudar a prevenir sérias violações à segurança.
Qualquer máquina com um domínio NIS pode usar comandos para extrair informações do servidor sem autenticação, desde que o usuário saiba o nome do host DNS e o nome de domínio NIS do servidor.
Por exemplo, se alguém conectar um laptop a uma rede ou violar a rede por fora (e conseguir falsificar um endereço IP interno), o seguinte comando revela o mapa de /etc/passwd
:
ypcat -d<NIS_domain>
-h<DNS_hostname>
passwd
Se este atacante for um usuário root, poderá obter o arquivo /etc/shadow
digitando o seguinte comando:
ypcat -d<NIS_domain>
-h<DNS_hostname>
shadow
Se o Kerberos for usado, o arquivo /etc/shadow
não estará armazenado em um mapa NIS.
Para dificultar o acesso aos mapas NIS a um atacante, crie uma série randômica de caracteres para o nome de host DNS, tal como o7hfawtgmhwg.domain.com
. Similarmente, crie um nome diferente de domínio NIS randomizado . Isto dificulta bastante o acesso de um atacante ao servidor NIS.
Se o arquivo /var/yp/securenets
estiver vazio, ou não existir (como é o caso logo após uma instalação padrão), o NIS escuta à todas as redes. Uma das primeiras coisas a serem feitas é colocar pares de rede/máscara de rede no arquivo para que o ypserv
apenas responda à pedidos de redes apropriadas.
Veja abaixo um exemplo de entrada de um arquivo /var/yp/securenets
:
255.255.255.0 192.168.0.0
Nunca inicie um servidor NIS pela primeira vez sem criar o arquivo /var/yp/securenets
.
Essa técnica não oferece proteção contra ataque de spoofing de IP, mas pelo menos impõe limites a quais redes o servidor NIS serve.
Todos os servidores relacionados ao NIS podem ter portas específicas, exceto o rpc.yppasswdd
— o daemon que permite a usuários alterarem suas senhas de autenticação. Atribuir portas para os outros dois daemons do servidor NIS, rpc.ypxfrd
e ypserv
, permite criar regras de firewall para proteger futuramente os daemons do servidor NIS contra intrusos.
Para fazer isto, adicione as seguintes linhas a /etc/sysconfig/network
:
YPSERV_ARGS="-p 834" YPXFRD_ARGS="-p 835"
As seguintes regras do iptables podem ser determinadas para reforçar a qual rede o servidor escuta para estas portas:
iptables -A INPUT -p ALL -s! 192.168.0.0/24 --dport 834 -j DROP iptables -A INPUT -p ALL -s! 192.168.0.0/24 --dport 835 -j DROP
Isto significa que o servidor apenas permite conexões às portas 834 e 835 casos os pedidos venham da rede 192.168.0.0/24, independentemente do protocolo.
Uma das desvantagens mais gritantes ao usar NIS para autenticação é que sempre que um usuário se autentica numa máquina, um hash de senha é enviado do mapa /etc/shadow
através da rede. Se um intruso obtiver acesso a um domínio NIS e bisbilhotar o tráfego de rede, os hashes de senha e nomes de usuários podem ser discretamente coletados. Com tempo suficiente, um programa de quebra de senhas pode adivinhar senhas fáceis e um atacante pode obter acesso a uma conta válida na rede.
Como o Kerberos usa criptografia de chave secreta, os hashes de senhas nunca são enviados através da rede, tornando o sistema bem mais seguro. Para saber mais sobre o Kerberos, consulte o Seção 2.6, “Kerberos”.
A versão do NFS inclusa no Red Hat Enterprise Linux, NFSv4, não requer mais o serviço portmap
, conforme abordado na Seção 2.2.2, “Protegendo o Portmap”. O tráfego do NFS agora utiliza TCP em todas as versões (ao invés do UDP) e o requer no uso do NFSv4. O NFSv4 agora inclui a autenticação do Kerberos para usuário e grupo, como parte do módulo de kernel RPCSEC_GSS
. As informações sobre o portmap
ainda são inclusas, já que o Red Hat Enterprise Linux suporta o NFSv2 e NFSv3, que o utilizam.
Agora que o NFSv4 tem a habilidade de passar todas as informações criptografadas usando o Kerberos através da rede, é importante que o serviço seja configurado corretamente se estiver atrás de um firewall ou numa rede segmentada. O NFSv2 e NFSv3 ainda passam dados de forma insegura e seus riscos devem ser considerados. Um planejamento cuidadoso da rede neste aspecto pode ajudar a prevenir violações à segurança.
O servidor NFS determina quais sistemas de arquivo e quais hosts exportar para estes diretórios através do arquivo /etc/exports
. Cuidado para não adicionar espaços extras ao editar este arquivo.
Por exemplo, a linha a seguir no arquivo /etc/exports
compartilha o diretório /tmp/nfs/
com o host bob.example.com
com permissões de leitura e escrita.
/tmp/nfs/ bob.example.com(rw)
Por outro lado, esta linha do arquivo /etc/exports
compartilha o mesmo diretório com o host bob.example.com
com permissão somente-leitura, e o compartilha com o mundo com permissões leitura e escrita devido um único caractere de espaço após o nome de host.
/tmp/nfs/ bob.example.com (rw)
É bom praticar a verificação de quaisquer compartilhamentos NFS usando o comando showmount
para checar o que está sendo compartilhado:
showmount -e <nome-de-host>
Por padrão, compartilhamentos NFS alteram o usuário root para o usuário nfsnobody
, uma conta de usuário sem privilégios. Isto muda o proprietário de todos os arquivos criados pelo root para nfsnobody
, que previne o carregamento de programas com o setuid definido.
Se no_root_squash
é usado, os usuários root remotos poderão alterar qualquer arquivo do sistema de arquivo compartilhado e deixar aplicativos infectados por trojans, para que outros usuários os executem inadvertidamente.
O Servidor HTTP Apache é um dos serviços mais estáveis e seguros distribuídos com o Red Hat Enterprise Linux. Há um número exorbitante de opções e técnicas disponíveis para proteger o Servidor HTTP Apache — muito numerosos para serem explorados em detalhes aqui.
Administradores de Sistemas devem ter cuidado ao utilizar as seguintes opções:
Esta diretiva é habilitada por padrão, portanto tenha cuidado ao criar links simbólicos para a raiz dos documentos do servidor Web. Por exemplo, é uma má idéia prover um link simbólico para /
.
Esta diretiva é habilitada por padrão, mas pode não ser desejável. Para prevenir que visitantes naveguem pelos arquivos no servidor, remova esta diretiva.
A diretiva UserDir
é desabilitada por padrão porque esta pode confirmar a presença de uma conta de usuário no sistema. Para possibilitar a navegação pelos diretórios do usuário no servidor, use as seguintes diretivas:
UserDir enabled UserDir disabled root
Estas diretivas ativam a navegação em todos os diretórios de usuário, exceto no /root/
. Para adicionar usuários à lista de contas desativadas, adicione uma lista de usuários delimitada por espaço na linha UserDir disabled
.
Por padrão, o módulo Server-Side Includes (SSI) não pode executar comandos. Não é recomendado alterar esta configuração a não ser que seja absolutamente necessário, já que pode, potencialmente, possibilitar que um atacante execute comandos no sistema.
Certifique-se de conceder permissões de gravação (write) apenas para o usuário root em todos os diretórios contendo scripts ou CGIs. Isto pode ser feito digitando os seguintes comandos:
chown root<nome-do-diretório>
chmod 755<nome-do-diretório>
Também verifique sempre se todos os scripts rodando no sistema funcionam como planejado antes de colocá-los em produção.
O Protocolo de Transporte de Arquivo (File Transport Protocol ou FTP) é um protocolo TCP antigo desenvolvido para transferir arquivos pela rede. Já que todas as transações com o servidor (inclusive a autenticação de usuário) não são criptografadas, o FTP é considerado um protocolo inseguro e deve ser configurado cuidadosamente.
O Red Hat Enterprise Linux oferece três servidores FTP.
gssftpd
— Um FTP daemon kerberizado baseado no xinetd
que não passa informações de autenticação através da rede.
Red Hat Content Accelerator (tux
) — Um servidor Web de espaço de kernel com capacidades de FTP.
vsftpd
— Uma implementação auto-suficiente do serviço FTP orientada à segurança.
As orientações de segurança a seguir referem-se à configuração do serviço FTP vsftpd
.
Antes de submeter um nome de usuário e senha, é apresentado um banner de saudação a todos os usuários. Por padrão, este banner inclui informações da versão úteis para crackers tentando identificar fraquezas num sistema.
Para alterar o banner de saudação do vsftpd
, adicione a seguinte diretiva ao arquivo /etc/vsftpd/vsftpd.conf
:
ftpd_banner=<insira_saudação_aqui>
Substitua <insira_saudação_aqui>
na diretiva acima pelo texto de sua mensagem de saudação.
Para banners com muitas linhas, é melhor usar um arquivo de banner. Para simplificar o gerenciamento de banners múltiplos, coloque todos os banners em um novo diretório chamado /etc/banners/
. O arquivo de banners para conexões FTP, neste exemplo, é /etc/banners/ftp.msg
. O exemplo abaixo mostra como este arquivo se parece:
########## Hello, all activity on ftp.example.com is logged. #########
Não é necessário começar cada linha do arquivo com 220
, conforme especificado na Seção 2.2.1.1.1, “TCP Wrappers e Banners de Conexão”.
Para referenciar este arquivo de banners de saudação do vsftpd
, adicione a seguinte diretiva ao arquivo /etc/vsftpd/vsftpd.conf
:
banner_file=/etc/banners/ftp.msg
Também é possível enviar banners adicionais para conexões de entrada usando TCP wrappers conforme descrito na Seção 2.2.1.1.1, “TCP Wrappers e Banners de Conexão”.
A presença do diretório /var/ftp/
ativa a conta anônima.
A maneira mais fácil de criar este diretório é instalar o pacote vsftpd
. Este pacote define uma árvore de diretório para usuários anônimos e configura as permissões dos diretórios para somente-leitura para usuários anônimos.
Por padrão, a conta do usuário anônimo não pode escrever em nenhum diretório.
Se você possibilitar o acesso anônimo a um servidor FTP, tome cuidado onde armazena os dados importantes.
Para permitir que usuários anônimos façam upload, é recomendado criar um diretório somente-gravação (write-only) em /var/ftp/pub/
.
Para fazê-lo, use o seguinte comando:
mkdir /var/ftp/pub/upload
A seguir, modifique as permissões para que usuários anônimos não possam visualizar o conteúdo do diretório:
chmod 730 /var/ftp/pub/upload
Uma lista do diretório em formato longo deve se parecer com o seguinte:
drwx-wx--- 2 root ftp 4096 Feb 13 20:05 upload
Administradores que permitem a usuários anônimos ler e gravar em diretórios, freqüentemente percebem que seu servidor se torna um depósito de software roubado.
Adicionalmente, abaixo de vsftpd
, adicione a seguinte linha ao arquivo /etc/vsftpd/vsftpd.conf
:
anon_upload_enable=YES
Já que o FTP passa nomes de usuário e senhas não criptografados através de redes inseguras para autenticação, é uma boa idéia proibir usuários do sistema acessarem o servidor através de suas contas de usuário.
Para desativar contas de usuário em vsftpd
, adicione a seguinte diretiva a /etc/vsftpd/vsftpd.conf
:
local_enable=NO
Use TCP Wrappers para controlar o acesso a qualquer daemon do FTP, conforme descrito na Seção 2.2.1.1, “Aumentando a Segurança com TCP Wrappers”.
O Sendmail é um Agente de Transporte de Correspondência (Mail Transport Agent - MTA) que utiliza o Protocolo de Transporte de Correspondência Simples (Simple Mail Transport Protocol - SMTP) para entregar mensagens eletrônicas entre outros MTAs e para enviar e-mails a clientes ou agentes de entrega. Apesar de muitos MTAs serem capazes de criptografar tráfego entre eles, a maioria não o faz, portanto enviar e-mail através de qualquer rede pública é considerado uma forma de comunicação essencialmente insegura.
É recomendado a qualquer um planejando implementar um servidor Sendmail, resolver as seguintes questões.
Devido à natureza de e-mails, um determinado atacante pode facilmente mandar uma enxurrada de correspondência para o servidor e causar um ataque de negação de serviço. Ao determinar limites para as diretivas a seguir em /etc/mail/sendmail.mc
, a efetividade de ataques deste tipo é limitada.
confCONNECTION_RATE_THROTTLE
— O número de conexões que o servidor pode receber por segundo. Por padrão, o Sendmail não limita o número de conexões. Se um limite for definido e alcançado, conexões subseqüentes terão que esperar.
confMAX_DAEMON_CHILDREN
— O número máximo de processos filho que podem ser gerados pelo servidor. Por padrão, o Sendmail não determina um número limite de processos filho. Se um limite for definido e alcançado, conexões futuras terão que esperar.
confMIN_FREE_BLOCKS
— O número mínimo de blocos livres que devem estar disponíveis para que o servidor aceite correspondência. O valor padrão é 100 blocos.
confMAX_HEADERS_LENGTH
— O tamanho máximo aceitável (em bytes) para o cabeçalho de uma mensagem.
confMAX_MESSAGE_SIZE
— O tamanho máximo aceitável (em bytes) para qualquer mensagem.
Nunca coloque o diretório spool de correspondência, /var/spool/mail/
, em um volume NFS compartilhado.
Como o NFSv2 e o NFSv3 não mantém controle sobre IDs de usuário e grupo, dois ou mais usuários podem ter o mesmo UID, e portanto receber e ler a correspondência do outro.
Isso não ocorre com o NFSv4 usando Kerberos, já que o módulo de kernel SECRPC_GSS
não utiliza a autenticação baseada no UID. Entretanto, é uma boa idéia não colocar o diretório spool de correspondência em volumes NFS compartilhados.
Para ajudar a prevenir exploits locais no servidor Sendmail, é melhor que usuários de mail acessem o Sendmail usando apenas um programa de email. Contas shell não devem ser permitidas no servidor de correspondência e todos os usuários shell do arquivo /etc/passwd
devem ser definidos para /sbin/nologin
(com a possível exceção do usuário root).
Após configurar os serviços de rede, é importante atentar para quais portas estão escutando as interfaces de rede do sistema. Quaisquer portas abertas podem ser evidências de uma intrusão.
Há duas formas básicas de listar as portas que estão escutando a rede. A menos confiável é questionar a lista da rede ao digitar comandos como netstat -an
ou lsof -i
. Este método é menos confiável já que estes programas não conectam à máquina pela rede, mas checam o que está sendo executado no sistema. Por esta razão, estas aplicações são alvos freqüentes de substituição por atacantes. Desta maneira, os crackers tentam cobrir seus passos se abrirem portas de rede não autorizadas através da substituição do netstat
e do lsof
pelas suas próprias versões modificadas.
Uma forma mais confiável de listar quais portas estão escutando a rede é usar um scanner de portas como o nmap
.
O comando a seguir, submetido em um console, determina quais portas estão escutando conexões FTP pela rede:
nmap -sT -O localhost
O output deste comando se parece com o seguinte:
Starting nmap 3.55 ( http://www.insecure.org/nmap/ ) at 2004-09-24 13:49 EDT Interesting ports on localhost.localdomain (127.0.0.1): (The 1653 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 111/tcp open rpcbind 113/tcp open auth 631/tcp open ipp 834/tcp open unknown 2601/tcp open zebra 32774/tcp open sometimes-rpc11 Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7) Uptime 12.857 days (since Sat Sep 11 17:16:20 2004) Nmap run completed -- 1 IP address (1 host up) scanned in 5.190 seconds
Este output mostra que o sistema está rodando o portmap
devido à presença do serviço sunrpc
. No entanto, também há um serviço misterioso na porta 834. Para verificar se a porta está associada à lista oficial de serviços conhecidos, digite:
cat /etc/services | grep 834
Este comando não retorna nenhum output. Isto indica que enquanto a porta está no intervalo reservado (de 0 a 1023) e requer acesso root para abrir, não está associada a um serviço conhecido.
Em seguida, verifique as informações sobre a porta usando netstat
ou lsof
. Para verificar a porta 834 usando netstat
, use o seguinte comando:
netstat -anp | grep 834
O comando retorna o seguinte output:
tcp 0 0 0.0.0.0:834 0.0.0.0:* LISTEN 653/ypbind
A presença da porta aberta em netstat
afirma que um cracker que abrir clandestinamente uma porta num sistema violado provavelmente não permitirá que esta seja revelada através deste comando. A opção [p]
também revela o id do processo (PID) do serviço que abriu a porta. Neste caso, a porta aberta pertence ao ypbind
(NIS), que é um serviço RPC administrado juntamente ao serviço portmap
.
O comando lsof
revela informações similares ao netstat
já que é capaz de ligar portas abertas a serviços:
lsof -i | grep 834
Veja abaixo a parte relevante do output deste comando:
ypbind 653 0 7u IPv4 1319 TCP *:834 (LISTEN) ypbind 655 0 7u IPv4 1319 TCP *:834 (LISTEN) ypbind 656 0 7u IPv4 1319 TCP *:834 (LISTEN) ypbind 657 0 7u IPv4 1319 TCP *:834 (LISTEN)
Estas ferramentas podem revelar muitas informações sobre o estado dos serviços rodando em uma máquina. Estas ferramentas são flexíveis e podem prover uma riqueza de informações sobre os serviços e configurações da rede. Consulte as páginas man do lsof
, do netstat
, do nmap
, e do services
para maiores informações.
A funcionalidade SSO de Red Hat Enterprise Linux, reduz a quantidade de vezes que os usuários de desktop Red Hat Enterprise Linux precisam inserir suas senhas. Muitos aplicativos aproveitam a mesma autenticação adjacente e mecanismos de autorização para os usuários se registrarem no Red Hat Enterprise Linux a partir da tela de registro, assim não precisarão reinserir suas senhas. Estes aplicativos estão detalhados abaixo:
Além disso, os usuários podem se registrar em suas máquinas até quando não houver rede de trabalho (módulo offline) ou onde a conectividade da rede de trabalho não for confiável, por exemplo, no acesso wireless. Nos casos mais recentes, os serviços irão degradar vagarosamente.
Os aplicativos seguintes são suportados atualmente pelo esquema de registro unificado em Red Hat Enterprise Linux:
Registro
Proteção de tela
Firefox e Thunderbird
Red Hat Enterprise Linux atualmente suporta os seguintes mecanismos de autenticação:
Nome de Kerberos/registro de senha
Cartão Inteligente/ Registro de PIN
Red Hat Enterprise Linux foi testado com o cartão e leitor e-gate Cyberflex, mas qualquer cartão que seja compatível ao cartão Java 2.1.1 e especificações de Plataforma Global 2.0.1, devem operar corretamente, como qualquer outro leitor que seja suportado pelo PCSC-lite.
Red Hat Enterprise Linux também foi testado com Cartões de Acesso Comuns (CAC). O leitor suportado para CAC é o Leitor SCM SCR 331 USB.
As of Red Hat Enterprise Linux 5.2, Gemalto smart cards (Cyberflex Access 64k v2, standard with DER SHA1 value configured as in PKCSI v2.1) are now supported. These smart cards now use readers compliant with Chip/Smart Card Interface Devices (CCID).
Diversos mecanismos de segurança que existem atualmente, utilizam um grande número de protocolos e armazenamentos credenciais. Alguns exemplos incluem: SSL, SSH, IPsec e Kerberos. O SSO do Red Hat Enterprise Linux enfoca a unificação destes esquemas para suportar os requerimentos listados acima. Isto não significa substituir os Kerberos por certificados X.509v3, e sim uni-los para reduzir a carga, tanto dos usuários de sistemas e administradores como daqueles que os gerenciam.
Para atingir este objetivo , Red Hat Enterprise Linux
Oferece uma instância única compartilhada das bibliotecas criptográficas NSS em cada sistema operacional .
Distribui o Certificado Cliente de Segurança Empresarial de Sistemas (ESC) com o sistema operacional base. Os aplicativos ESC, monitoram os eventos de inserção do cartão inteligente. Caso seja detectado que o usuário inseriu um cartão inteligente, criado para ser usado com o produto de servidor do Certificado de Sistemas Red Hat Enterprise Linux, ele mostrará uma interface de usuário instruindo o usuário a como registrar este cartão inteligente.
Unifica o Kerberos e NSS, para os usuários que se registrarem no sistema operacional usando o cartão inteligente também obtenham uma credencial Kerberos (que permite que se registrem nos servidores de arquivo, etc.)
Ante que você utilize seu cartão inteligente para se registrar em seu sistema e se beneficiar com as diversas opções de segurança que esta tecnologia oferece, você precisará fazer algumas instalações básicas e passos de configuração, como descrito abaixo:
Esta seção oferece uma ampla visão de como utilizar seu cartão inteligente. Maiores informações detalhadas estão disponíveis no Guia de Segurança do Cliente da Red Hat Certificate System Enterprise.
Registre-se com seu nome e senha do Kerberos
Tenha a certeza de que os pacotes nss-tools
estão carregados.
Faça o download e instalação dos certificados root específicos para empresas. Utilize o seguinte comando para instalar o certificado root CA:
certutil -A -d /etc/pki/nssdb -n "root ca cert" -t "CT,C,C" -i ./ca_cert_in_base64_format.crt
Verifique se você possui os seguintes RPMs instalados em seu sistema: esc, pam_pkcs11, coolkey, ifd-egate, ccid, gdm, authconfig, and authconfig-gtk.
Habilite o Suporte de Registro do Cartão Inteligente
Na Barra de Títulos do Gnome, selecione Sistema->Administração->Autenticação.
Digite a senha root de sua máquina se necessário.
No diálogo de Configuração de Autenticação, clique na aba Autenticação.
Selecione o Habilitar o Suporte ao Cartão Inteligente
Clique no botão Configurar o Cartão Inteligente... para obter o diálogo da Configuração do Cartão Inteligente e especifique as configurações solicitadas:
Solicitar um cartão inteligente para efetuar o registro— Desabilite a opção. Depois que você se registrar com seu cartão inteligente você pode selecionar esta opção para evitar que usuários se registrem sem um cartão inteligente.
Ação de Remoção do Cartão— Esta opção controla o que acontece quando você remove um cartão inteligente depois de ter se registrado. As opções disponíveis são as seguintes:
Bloquear — A remoção do cartão inteligente pode bloquear a tela X.
Ignorar — A remoção do cartão inteligente não tem efeito.
Se você precisar habilitar o Protocolo de Status do Certificado Online (OCSP), abra o arquivo /etc/pam_pkcs11/pam_pkcs11.conf
e procure pela seguinte linha:
enable_ocsp = false;
Mude este valor para verdadeiro, como segue abaixo:
enable_ocsp = true;
Registre seu cartão inteligente
Se você estiver usando um cartão CAC, você também precisará aplicar estes passos a seguir:
Mude para a conta root e crie um arquivo chamado /etc/pam_pkcs11/cn_map
.
Adicione a seguinte entrada ao arquivo cn_map
:
MY.CAC_CN.123454
-> myloginid
onde o MY.CAC_CN.123454
é o Nome Comum em seu CAC e myloginid
é seu ID de registro UNIX
Sair
Se você tiver problemas para colocar seu cartão inteligente em funcionamento, tente usar o seguinte comando para localizar a fonte do problema:
pklogin_finder debug
Se você executar a ferramenta pklogin_finder
no modo depurador, enquanto um cartão inteligente registrado estiver conectado, ela tentará enviar informações sobre a validade dos certificados. Se a tarefa for bem sucedida, ela tentará mapear um ID de registro dos certificados que estiverem no cartão.
Cartões inteligentes são registrados ao receberem um certificado apropriado, assinado por uma Autoridade de Certificado válida (CA). Isto envolve diversos passos que estão descritos a seguir.
O usuário insere seus cartões inteligentes no leitor de cartão inteligente na estação de trabalho. Este evento é reconhecido pelo Cliente de Segurança Empresarial (ESC).
A página de registro está disposta na área de trabalho do usuário. O usuário completa os detalhes requeridos e então, o sistema do usuário se conecta ao Sistema de Processamento de Token (TPS) e ao CA.
O TPS registra o cartão inteligente usando um certificado assinado pelo CA.
Como Funciona o Registro do Cartão Inteligente
Esta seção oferece uma visão geral breve do processo de autenticação ao utilizar um cartão inteligente.
Quando o usuário inserir seu cartão inteligente no leitor de cartão inteligente, será reconhecido pela facilidade PAM, que solicita o PIN do usuário.
O sistema então procura os certificados atuais do usuário e verifica suas validades. O certificado é então mapeado para o UID do usuário.
Ele é validado pelo KDC e pelas autenticações adquiridas.
Como Funciona a Autenticação do Cartão Inteligente
Você não pode se autenticar com um cartão que não tenha sido registrado, mesmo que já tenha sido formatado. Você precisa se autenticar com um cartão registrado e formatado, ou então sem um cartão inteligente até que possa registrar um novo cartão.
Consulte o Seção 2.6, “Kerberos” e Seção 2.4, “Módulos de Autenticação Plugáveis (Pluggable Authentication Modules - PAM)” para maiores informações em Kerberos e PAM.
Você pode configurar o Firefox para usar Kerberos para um Single Sign-on. Para que funcione corretamente, você precisa configurar seu navegador da web para enviar suas credenciais Kerberos para o KDC apropriado. A seção a seguir, descreve as mudanças de configuração e outros requerimentos para obter este resultado.
Nesta barra de endereços do Firefox, digite about:config
para exibir a lista de opções de configuração atual.
No campo Filtro, digite negociate
para restringir a lista de opções.
Clique duas vezes na entrada network.negotiate-auth.trusted-uris para exibir a caixa de diálogo Digite o valor da faixa
Digite o nome do domínio pelo qual queira autenticar, por exemplo, .exemplo.com
.
Repita o procedimento acima para a entrada network.negotiate-auth.delegation-uris usando o mesmo domínio.
Você pode deixar este valor em branco, pois permite a passagem do ticket do Kerberos, a qual não é requerida.
Se você não puder visualizar estas duas opções de configuração listadas, a versão do Firefox que você possui pode ser muito antiga para suportar a autenticação Negotiate, e você deve considerar uma atualização.
Configurando Firefox para utilizar Kerberos para SSO.
Você agora precisa assegurar-se de que você possui os tickets do Kerberos. Em uma janela de comando, digite kinit
para recuperar os tickets do Kerberos. Para obter a lista de permissões disponíveis, digite klist
. A seguir veja um exemplo do resultado destes comandos:
[user@host ~] $ kinit Password for user@EXAMPLE.COM: [user@host ~] $ klist Ticket cache: FILE:/tmp/krb5cc_10920 Default principal: user@EXAMPLE.COM Valid starting Expires Service principal 10/26/06 23:47:54 10/27/06 09:47:54 krbtgt/USER.COM@USER.COM renew until 10/26/06 23:47:54 Kerberos 4 ticket cache: /tmp/tkt10920 klist: You have no tickets cached
Se você tiver seguido os passos de configuração acima mencionados e a autenticação Negotiate ainda não estiver funcionando, você pode habilitar o login verbal do processo de autenticação. Isto pode ajudá-lo a encontrar a causa do problema. Para habilitá-lo, utilize o seguinte procedimento:
Feche todas as instâncias do Firefox
Abra uma janela de comando, e insira os seguintes comandos:
export NSPR_LOG_MODULES=negotiateauth:5 export NSPR_LOG_FILE=/tmp/moz.log
Reinicie o Firefox a partir desta janela, e visite o website que você não conseguiu autenticar anteriormente. As informações serão registradas no arquivo /tmp/moz.log
, e poderão lhe dar algumas pistas para a solução do problema. Por exemplo:
-1208550944[90039d0]: entering nsNegotiateAuth::GetNextToken() -1208550944[90039d0]: gss_init_sec_context() failed: Miscellaneous failure Não foram encontrados cache de credenciais
Isto indica que você não possui os tickets do Kerberos, e precisa executá-las kinit
.
Se você conseguir executar o kinit
com êxito a partir de sua máquina mas não conseguir autenticá-lo, procure por algo como isto no arquivo de registro:
-1208994096[8d683d8]: entering nsAuthGSSAPI::GetNextToken() -1208994096[8d683d8]: gss_init_sec_context() failed: Miscellaneous failure Server not found in Kerberos database
Isto geralmente indica um problema de configuração no Kerberos. Esteja certo de que você possui as entradas corretas na seção [domain_realm] do arquivo /etc/krb5.conf
. Por exemplo:
.example.com = EXAMPLE.COM example.com = EXAMPLE.COM
Se não aparecer nada no registro, é possível que você esteja atrás de um proxy e que o mesmo esteja apagando os cabeçalhos HTTP requeridos pela autenticação Negotiate. Para driblar este problema, você pode tentar conectar ao servidor usando o HTTPS, o que permitirá que as solicitações permaneçam intactas. Então proceda a depuração, utilizando o arquivo de registro, como descrito acima.
Programas que concedem acesso de usuários à um sistema usam autenticação para verificação de identidade (ou seja, para determinar se um usuário é realmente quem ele diz ser).
Historicamente, cada programa possuía a sua própria maneira de autenticar usuários. No Red Hat Enterprise Linux, vários programas são configurados para usar um mecanismo de autenticação centralizado chamado Módulos de Autenticação Plugáveis (Pluggable Authentication Modules - PAM).
O PAM usa uma arquitetura modular plugável que permite que o administrador do sistemas tenha máxima flexibilidade ao estabelecer políticas de autenticação para o sistema.
Na maioria dos casos, o arquivo de configuração padrão do PAM de um aplicativo que use o PAM já é suficiente. Às vezes, entretanto, é preciso editar um arquivo de configuração do PAM. Uma vez que a má configuração do PAM pode vir a comprometer a segurança do sistema, é importante entender a estrutura destes arquivos antes de fazer quaisquer modificações. Consulte a Seção 2.4.3, “Formato do Arquivo de Configuração do PAM” para maiores informações.
O PAM oferece as seguintes vantagens:
um esquema de autenticação comum que pode ser usado com uma variada gama de aplicativos.
flexibilidade e controle significativos da autenticação tanto para administradores de sistemas como para desenvolvedores de aplicativos.
uma biblioteca única e bem documentada que permite que desenvolvedores escrevam programas sem ter que criar seus próprios esquemas de autenticação.
O diretório /etc/pam.d/
contém os arquivos de configuração do PAM para cada aplicativo que use o PAM. Em versões mais antigas do PAM, o /etc/pam.conf
era usado, mas este arquivo agora está obsoleto e é usado apenas se o diretório /etc/pam.d/
não existir.
Cada aplicativo, ou serviço que use o PAM possui um arquivo no diretório /etc/pam.d/
. Cada arquivo neste diretório tem o mesmo nome que o serviço ao qual ele controla o acesso.
O programa que usa o PAM é responsável por definir o seu nome de serviço e instalar o seu próprio arquivo de configuração do PAM no diretório /etc/pam.d/
. Por exemplo, o programa login
define o seu nome de serviço como login
e instala o arquivo de configuração do PAM /etc/pam.d/login
.
Cada arquivo de configuração do PAM contém um grupo de diretivas no seguinte formato:
<interface de módulo>
<sinalizador de controle>
<nome do módulo>
<argumentos do módulo>
Cada um destes elementos será explanado nas próximas seções.
Existem atualmente quatro tipos de interfaces de módulo PAM. Cada uma destas corresponde a um aspecto diferente do processo de autorização:
auth
— Esta interface de módulo autentica usuários. Por exemplo, ela pede por uma senha e então verifica a sua validade. Módulos com essa interface também podem estabelecer credenciais, tais como a associação à grupos, ou tickets do Kerberos.
account
— Esta interface de módulo verifica se o acesso é permitido. Por exemplo, ela pode verificar se uma conta de usuário venceu ou se um usuário tem permissão para se autenticar durante um determinado período do dia.
password
— Esta interface de módulo é usada para mudar as senhas dos usuários.
session
— Esta interface de módulo configura e gerencia sessões de usuários. Módulos com esta interface também podem desempenhar tarefas adicionais que são necessárias para permitir acesso, como montar o diretório pessoal e disponibilizar a caixa de correio de um usuário.
Um módulo individual pode fornecer qualquer uma ou todas as interfaces de módulo. Por exemplo, pam_unix.so
fornece todas as quatro interfaces de módulo.
Em um arquivo de configuração do PAM, o campo da interface de módulo é o primeiro a ser definido. Por exemplo, uma linha típica em uma configuração pode se parecer com o seguinte:
auth required pam_unix.so
Isto instrui o PAM a usar a interface auth
do módulo pam_unix.so
.
Diretivas de interfaces de módulo podem ser agregadas, permitindo que múltiplos módulos sejam usados ao mesmo tempo com um único objetivo. Se o sinalizador de controle de um módulo usa o valor "sufficient" ou "requisite" (consulte a Seção 2.4.3.2, “Sinalizador de Controle” para mais informações sobre estes sinalizadores), a ordem de listagem dos módulos é relevante para o processo de autenticação.
A agregação permite que um administrador exija a existência de certas condições antes de permitir que um usuário se autentique. Por exemplo, o comando reboot
normalmente usa vários módulos agregados, o que pode ser verificado no seu arquivo de configuração do PAM:
[root@MyServer ~]# cat /etc/pam.d/reboot #%PAM-1.0 auth sufficient pam_rootok.so auth required pam_console.so #auth include system-auth account required pam_permit.so
A primeira linha é apenas um comentário e não é processada.
auth sufficient pam_rootok.so
— Esta linha usa o módulo pam_rootok.so
para determinar se o usuário atual é o root, verificando se a UID do usuário é 0. Se este teste for bem sucedido, nenhum outro módulo é consultado e o comando é executado. Se este teste falhar, o próximo módulo é consultado.
auth required pam_console.so
— Esta linha usa o módulo pam_console.so
para tentar autenticar o usuário. Se este usuário já estiver autenticado no console, o pam_console.so
verifica se existe um arquivo no diretório /etc/security/console.apps/
com o mesmo nome do serviço em si (reboot). Se tal arquivo existir, a autenticação é efetuada com sucesso e o controle é passado ao próximo módulo.
#auth include system-auth
— Esta linha é apenas um comentário e não é processada.
account required pam_permit.so
— Esta linha usa o módulo pam_permit.so
para permitir que o usuário root ou qualquer um que esteja conectado ao console possa reinicializar o sistema.
Todos os módulos PAM geram um resultado de sucesso ou falha ao serem chamados. Sinalizadores de controle dizem ao PAM o que fazer com o resultado. Módulos podem ser agregados em uma certa ordem, e os sinalizadores de controle determinam a importância do sucesso ou da falha de um módulo específico em relação ao objetivo maior de efetuar a autenticação do usuário ao serviço.
Existem quatro sinalizadores de controle pré-definidos:
required
— O resultado do módulo deve ser bem sucedido para que a autenticação continue. Se o teste falhar à esta altura, o usuário não é notificado até que os resultados dos testes de todos os módulos, que façam referência àquela interface, estejam completos.
requisite
— O resultado do módulo deve ser bem sucedido para que a autenticação continue. Entretanto, se um teste falhar à esta altura, o usuário é notificado imediatamente com uma mensagem refletindo o primeiro teste de módulo required
ourequisite
que tenha falhado.
sufficient
— O resultado do módulo é ignorado se falhar. Entretanto, se o resultado de um módulo sinalizado como sufficient
é de sucesso e nenhum módulo prévio sinalizado como required
falhou, então nenhum outro resultado é necessário e o usuário é autenticado ao servidor.
optional
— O resultado do módulo é ignorado. Um módulo sinalizado como optional
torna-se necessário à autenticação bem sucedida apenas quando nenhum outro módulo faz referência à interface.
A ordem na qual módulos required
são chamados não é crítica. Apenas os sinalizadores de controle sufficient
e requisite
fazem com que a ordem torne-se importante.
Uma nova sintaxe para sinalizadores de controle que permite controle de maior precisão é agora disponível ao PAM.
A man page pam.d
e a documentação do PAM, disponível no diretório /usr/share/doc/pam-
, onde <número-da-versão>
/<número-da-versão>
é o número da versão do PAM no seu sistema, descrevem esta nova sintaxe em detalhes.
O nome do módulo fornece ao PAM o nome do módulo plugável contendo a interface de módulo específica. Em versões mais antigas do Red Hat Enterprise Linux, o caminho completo para o módulo era fornecido no arquivo de configuração do PAM. Entretanto, desde a chegada dos sistemas multilib, os quais armazenam módulos PAM de 64 bits no diretório /lib64/security/
, o nome do diretório é omitido porque o aplicativo é vinculado à versão certa do libpam
, o qual é capaz de encontrar a versão correta do módulo.
O PAM usa argumentos para passar informações a um módulo plugável durante a autenticação para alguns módulos.
Por exemplo, o módulo pam_userdb.so
usa informações armazenadas em um arquivo Berkeley DB para autenticar o usuário. O Berkeley DB é um sistema banco de dados de código aberto incorporado a vários aplicativos. O módulo leva um argumento db
de forma que o Berkeley DB saiba qual banco de dados usar para o serviço requisitado.
Veja a seguir uma linha pam_userdb.so
típica em uma configuração PAM. O <caminho-para-o-arquivo>
é o caminho completo para o arquivo de banco de dados Berkeley DB:
auth required pam_userdb.so db=<caminho-para-o-arquivo>
Argumentos inválidos são geralmente ignorados e não afetam de maneira nenhuma o sucesso ou a falha do módulo PAM. Alguns módulos, entretanto, podem falhar ao encontrarem argumentos inválidos. A maioria dos módulos relatam erros no arquivo /var/log/secure
.
Veja a seguir um exemplo de arquivo de configuração do PAM para um aplicativo:
#%PAM-1.0 auth required pam_securetty.so auth required pam_unix.so nullok auth required pam_nologin.so account required pam_unix.so password required pam_cracklib.so retry=3 password required pam_unix.so shadow nullok use_authtok session required pam_unix.so
A primeira linha é um comentário, conforme indicado pela cerquilha (#
) no início da linha.
As linhas 2 à 4 agregam três módulos para a autenticação do login.
auth required pam_securetty.so
— Este módulo garante que se o usuário está tentando se autenticar como root, o tty ao qual o usuário está tentando se autenticar, está listado no arquivo /etc/securetty
, se tal arquivo existir.
Se o tty não estiver listado no arquivo, qualquer tentativa de autenticação como root, irá falhar com uma mensagem Autenticação Incorreta
.
auth required pam_unix.so nullok
— Este módulo solicita que o usuário forneça uma senha e então verifica a senha, se ela existir, no /etc/shadow
, usando a informação contida no /etc/passwd
..
auth required pam_nologin.so
— Este é o último passo da autenticação, e verifica se o arquivo /etc/nologin
existe. Se existir, e o usuário não for o root, a autenticação iráfalhar.
Neste exemplo, todos os três módulos auth
são verificados, mesmo se o primeiro módulo auth
falhe. Isto impede que o usuário fique sabendo em qual estágio a sua autenticação falhou. Tal informação nas mãos de um atacante pode permitir que ele deduza mais facilmente como violar a segurança do sistema.
account required pam_unix.so
— Este módulo executa quaisquer verificações de conta necessárias. Por exemplo, se senhas shadow foram habilitadas, a interface account
do módulo pam_unix.so
verifica se a conta venceu ou se o usuário não mudou sua senha dentro do período de carência permitido.
password required pam_cracklib.so retry=3
— Se uma senha estiver vencida, o componente de senha do módulo pam_cracklib.so
solicita o fornecimento de uma nova senha. Logo após, testa a nova senha para ver se a mesma pode ser facilmente determinada por um programa de quebra de senhas baseado em um dicionário.
O argumento retry=3
especifica que se o teste falhar na primeira vez, o usuário tem mais duas chances para criar uma senha mais robusta.
password required pam_unix.so shadow nullok use_authtok
— Esta linha especifica que se o programa mudar a senha do usuário, deve fazê-lo usando a interface password
do módulo pam_unix.so
.
O argumento shadow
faz com que o módulo crie senhas shadow ao atualizar a senha de um usuário.
O argumento nullok
faz com que o módulo permita que o usuário mude a sua senha a partir de uma senha em branco, caso contrário, uma senha em branco é tratada como um bloqueio para a conta.
O último argumento desta linha , use_authtok
, fornece um bom exemplo da importância da ordem ao agregar módulos PAM. Este argumento faz com que o módulo não solicite que o usuário forneça uma nova senha. Ao invés disto, aceita qualquer senha que tenha sido registrada anteriormente por um módulo de senha. Desta forma, todas as novas senhas devem passar o teste pam_cracklib.so
para senhas seguras antes de serem aceitas.
session required pam_unix.so
— A última linha faz com que a interface session
do módulo pam_unix.so
gerencie a sessão. Este módulo registra o nome de usuário e o tipo de serviço em /var/log/secure
no início e no fim de cada sessão. Este módulo pode ser suplementado com funcionalidades adicionais ao ser agregado a outros módulos de sessão.
Você pode criar ou adicionar novos módulos PAM a qualquer momento para serem usados por aplicativos que utilizem o PAM.
Por exemplo, um desenvolvedor pode criar um método de criação de senhas de uso único e escrever um módulo PAM para suportá-lo. Programas que usem o PAM podem usar o módulo e método de senha novos imediatamente, sem serem recompilados ou modificados de qualquer maneira.
Isto permite que desenvolvedores e administradores de sistema usem e testem combinações de métodos de autenticação para programas diferentes sem precisar recompilá-los.
A documentação sobre como escrever módulos encontra-se no diretório /usr/share/doc/pam-
, onde <número-da-versão>
/<número-da-versão>
é o número da versão do PAM instalado no seu sistema.
Uma série de ferramentas administrativas gráficas do Red Hat Enterprise Linux permitem que usuários tenham privilégios elevados por até cinco minutos usando o módulo pam_timestamp.so
. É importante entender como este mecanismo funciona, uma vez que se um usuário abandona um terminal enquanto o pam_timestamp.so
estiver em funcionamento, deixa a máquina vulnerável à manipulação por parte de qualquer um que tenha acesso físico ao console.
No esquema de carimbo de data e hora (timestamp) do PAM, a interface gráfica do aplicativo administrativo solicita que o usuário forneça a senha do root ao ser lançado. Uma vez que o usuário tenha sido autenticado, o módulo pam_timestamp.so
cria um arquivo de carimbo de data e hora. Por padrão, este arquivo é criado no diretório /var/run/sudo/
. Se o arquivo de carimbo de data e hora já existir, programas administrativos gráficos não solicitam uma senha. Ao invés disto, o módulo pam_timestamp.so
atualiza o arquivo de carimbo de data e hora, reservando mais cinco minutos de acesso administrativo inquestionável ao usuário.
Você pode verificar o estado atual do arquivo de carimbo de data e hora inspecionando o arquivo /var/run/sudo/<user>
. Para a área de trabalho, o arquivo relevante é o unknown:root
. Se o mesmo estiver presente e o seu carimbo de data e hora tiver sido feito há menos do que cinco minutos, as credencias são válidas.
A existência do arquivo de carimbo de data e hora é indicada através de um ícone de autenticação, o qual aparece na área de notificação do painel.
Antes de abandonar um console onde um carimbo de data e hora do PAM esteja ativo, é recomendável que o arquivo de carimbo de data e hora seja destruído. Para fazer isto em um ambiente gráfico, clique no ícone de autenticação no painel. Isto faz com que uma caixa de diálogo apareça. Clique no botão Desistir da Autorização para destruir o arquivo de carimbo de data e hora ativo.
Ilustração da caixa de diálogo de cancelamento de autenticação.
Note o seguinte em relação ao arquivo de carimbo de data e hora do PAM:
Se você estiver autenticado no sistema remotamente usando o ssh
, use o comando /sbin/pam_timestamp_check -k root
para destruir o arquivo de carimbo de data e hora.
Você precisa executar o comando /sbin/pam_timestamp_check -k root
da mesma janela de terminal de onde o aplicativo com privilégios foi lançado.
Você deve estar autenticado como o usuário que originalmente invocou o módulo pam_timestamp.so
para poder usar o comando /sbin/pam_timestamp_check -k
. Não autentique-se como root para usar este comando.
Se você quiser terminar com as credencias na área de trabalho (sem usar o botão Desistir da Autorização), use o seguinte comando:
/sbin/pam_timestamp_check -k root </dev/null >/dev/null 2>/dev/null
Se este comando não for executado, apenas as credenciais (se existirem) do pty onde você rodar o comando serão removidas.
Consulte a página man do pam_timestamp_check
para maiores informações sobre a destruição de um arquivo de carimbo de data e hora usando o pam_timestamp_check
.
O módulo pam_timestamp.so
aceita várias diretivas. Veja a seguir as duas opções mais utilizadas:
timestamp_timeout
— Especifica o período (em segundos) durante o qual o arquivo de carimbo de data e hora é válido. O valor padrão é 300 (cinco minutos).
timestampdir
— Especifica o diretório no qual o arquivo de carimbo de data e hora é armazenado. O valor padrão é /var/run/sudo/
.
Consulte a Seção 2.4.8.1, “Documentação Instalada” para mais informações sobre como controlar o módulo pam_timestamp.so
.
No Red Hat Enterprise Linux, o primeiro usuário que se autenticar no console físico da máquina pode manipular certos dispositivos e executar certas tarefas normalmente reservadas ao usuário root. Isto é controlado por um módulo PAM chamado pam_console.so
.
Quando um usuário se autentica em um sistema Red Hat Enterprise Linux, o módulo pam_console.so
é invocado pelos programas login
ou pelos programas gráficos de autenticação, gdm, kdm, e xdm. Se este usuário for o primeiro a se autenticar no console físico — também chamado de usuário do console — o módulo dá ao usuário a propriedade sobre uma gama de dispositivos normalmente de propriedade do root. O usuário do console torna-se o dono destes dispositivos até que a última sessão local para aquele usuário termine. Após este usuário ter feito o logoff, a propriedade dos dispositivos reverte novamente para o usuário root.
Os dispositivos afetados incluem, entre outros, placas de som, e drives de disquete e de CD-ROM.
Esta facilidade permite que um usuário local manipule estes dispositivos sem obter acesso root, simplificando assim tarefas comuns para o usuário do console.
Você pode modificar a lista de dispositivos controlados pelo pam_console.so
editando os seguintes arquivos:
/etc/security/console.perms
/etc/security/console.perms.d/50-default.perms
Você pode mudar a permissão de dispositivos que não estejam listados nos arquivos acima, ou sobrescrever os padrões especificados. Ao invés de modificar o arquivo 50-default.perms
, você deve criar um novo arquivo (por exemplo,
) e introduzir as modificações necessárias. O nome do novo arquivo padrão deve iniciar com um número maior do que 50 (por exemplo, xx
-name.perms51-default.perms
). Isto sobrescreverá os valores padrão no arquivo 50-default.perms
.
Se o arquivo de configuração do gerenciador de tela gdm, kdm, ou xdm foi alterado para permitir que usuários remotos se autentiquem e o host estiver configurado para rodar em nível de execução 5, é recomendável mudar as diretivas <console>
e <xconsole>
no /etc/security/console.perms
para os seguintes valores:
<console>=tty[0-9][0-9]* vc/[0-9][0-9]* :0\.[0-9] :0 <xconsole>=:0\.[0-9] :0
Isto previne que usuários remotos ganhem acesso a dispositivos e aplicativos restritos na máquina.
Se o arquivo de configuração do gerenciador de tela gdm, kdm, ou xdm foi alterado para permitir que usuários remotos se autentiquem e o host estiver configurado para rodar em um nível de execução diferente de 5, é recomendável remover a diretiva <xconsole>
e mudar a diretiva <console>
para o seguinte valor:
<console>=tty[0-9][0-9]* vc/[0-9][0-9]*
O usuário do console também tem acesso a certos programas configurados no diretório /etc/security/console.apps/
.
Este diretório contém arquivos de configuração que possibilitam que o usuário do console possa rodar certos aplicativos em /sbin
e /usr/sbin
.
Estes arquivos de configuração têm o mesmo nome dos aplicativos que eles configuram.
Um notável grupo de aplicativos aos quais o usuário do console tem acesso são três programas usados para desligar ou reinicializar o sistema:
/sbin/halt
/sbin/reboot
/sbin/poweroff
Uma vez que estes aplicativos usam o PAM, eles fazem com que uma chamada ao módulo pam_console.so
seja obrigatória para o seu uso.
Consulte a Seção 2.4.8.1, “Documentação Instalada” para maiores informações.
Os seguintes recursos contém informações adicionais sobre a utilização do PAM. Além destes recursos, leia os arquivos de configuração do PAM do sistema para entender melhor a maneira como são estruturados.
Páginas man relacionadas ao PAM — Existem várias páginas man para os diversos aplicativos e arquivos de configuração envolvidos com o PAM. Veja a seguir uma lista contendo algumas das páginas man mais importantes.
pam
— Boas informações introdutórias sobre o PAM, incluindo a estrutura e a finalidade dos arquivos de configuração do PAM.
Note que esta página man discute ambos tanto o /etc/pam.conf
como arquivos de configuração individuais no diretório /etc/pam.d/
. Por padrão, o Red Hat Enterprise Linux usa os arquivos de configuração individuais no diretório /etc/pam.d/
, ignorando o /etc/pam.conf
, caso exista.
pam_console
— Descreve a finalidade do módulo pam_console.so
, assim como a sintaxe adequada para uma entrada num arquivo de configuração do PAM.
console.apps
— Descreve o formato e as opções disponíveis para o arquivo de configuração /etc/security/console.apps
, o qual define quais aplicativos são acessíveis pelo usuário do console atribuído pelo PAM.
console.perms
— Descreve o formato e as opções disponíveis par o arquivo de configuração /etc/security/console.perms
, o qual especifica as permissões do usuário do console atribuídas pelo PAM.
pam_timestamp
— Descreve o módulo pam_timestamp.so
.
/usr/share/doc/pam-
— Contém um System Administrator's Guide (Guia do Administrador de Sistemas), um Module Writer's Manual (Manual do Autor de Módulos), e o Application Developer's Manual (Manual do Desenvolvedor de Aplicativos), assim como uma cópia da norma DCE-RFC 86.0 do PAM, onde <número-da-versão>
<número-da-versão>
é o número da versão do PAM.
/usr/share/doc/pam-
— Contém informações sobre o módulo PAM <número-da-versão>
/txts/README.pam_timestamppam_timestamp.so
, onde <número-da-versão>
é o número da versão do PAM.
http://www.kernel.org/pub/linux/libs/pam/ — O site de distribuição principal para o projeto Linux-PAM, contendo informações sobre vários módulos PAM, uma FAQ, e documentações adicionais do PAM.
A documentação do site acima aplica-se ao último lançamento do PAM e pode não ser 100% precisa em relação à versão do PAM incluída no Red Hat Enterprise Linux.
O controle de acesso a serviços de rede é uma das tarefas de segurança mais importantes para um administrador de servidor. O Red Hat Enterprise Linux oferece várias ferramentas para esta finalidade. Por exemplo, um firewall baseado no iptables
filtra pacotes de rede não desejáveis na stack de rede do kernel. O TCP Wrappers adiciona uma camada de proteção adicional aos serviços de rede que o utilizam, definindo quais hosts tem ou não têm a permissão para conectar a serviços de rede "embrulhados" (wrapped). Um exemplo de tal serviço de rede embrulhado é o super servidorxinetd
. Este serviço é chamado de super servidor porque ele controla conexões a um subconjunto de serviços de rede e refina ainda mais o controle de acesso.
Figura 2.9, “Controle de Acesso a Serviços de Rede” é uma ilustração básica sobre como estas ferramentas funcionam em conjunto para proteger os serviços de rede.
Figura A: Fluxograma do Controle de Acesso a Serviços de Rede
O pacote TCP Wrappers (tcp_wrappers
) faz parte da instalação padrão e oferece controle de de acesso a serviços de rede baseado no host. O componente mais importante do pacote é a biblioteca /usr/lib/libwrap.a
. Em termos gerais, um serviço que use o TCP Wrappers é um que foi compilado com vinculação à biblioteca libwrap.a
.
Quando uma tentativa de conexão é feita a um serviço que use o TCP Wrappers, o serviço primeiro examina os arquivos de acesso do host (/etc/hosts.allow
e /etc/hosts.deny
) para determinar se um cliente tem permissão para conectar. Na maioria dos casos, o serviço então usa o daemon syslog (syslogd
) para escrever o nome do cliente fazendo o pedido e o serviço requisitado em /var/log/secure
ou /var/log/messages
.
Se um cliente tiver permissão para conectar, o TCP Wrappers passa o controle da conexão ao serviço que fez o pedido e não participa mais na comunicação entre o cliente e o servidor.
Além de controle de acesso e registro, o TCP Wrappers pode executar comandos para interagir com o cliente antes de negar ou passar o controle da conexão ao serviço de rede requisitado.
A maioria dos serviços de rede do Red Hat Enterprise Linux são vinculados à biblioteca libwrap.a
porque o TCP Wrappers é uma adição valiosa ao arsenal de segurança de qualquer administrador de sistemas. Algumas destas aplicações incluem o /usr/sbin/sshd
, o /usr/sbin/sendmail
, e o /usr/sbin/xinetd
.
Para determinar se um binário de serviço de rede está vinculado à libwrap.a
, digite o seguinte comando como usuário root.
ldd <nome-do-binário> | grep libwrap
Substitua <nome-do-binário>
pelo nome do binário de serviço de rede.
Se o comando não retornar nenhuma saída, o serviço de rede não está vinculado à libwrap.a
.
O exemplo a seguir indica que o /usr/sbin/sshd
está vinculado à libwrap.a
:
[root@myserver ~]# ldd /usr/sbin/sshd | grep libwrap libwrap.so.0 = > /usr/lib/libwrap.so.0 (0x00655000) [root@myserver ~]#
O TCP Wrappers oferece as seguintes vantagens em relação à outras técnicas de controle de serviços de rede:
Transparência tanto para o cliente como para o serviço de rede embrulhado — O cliente que está conectando e o serviço de rede embrulhado não estão cientes de que o TCP Wrappers está sendo usado. Usuários legítimos são autenticados e conectados ao serviço requisitado, enquanto conexões a partir de clientes banidos falham.
Gerenciamento centralizado de vários protocolos — O TCP Wrappers opera independentemente dos serviços de rede que protege, permitindo que vários aplicativos de servidor compartilhem um grupo comum de arquivos de configuração de controle de acesso, conseqüentemente facilitando o gerenciamento.
Para determinar se um cliente tem permissão para se conectar à um serviço, o TCP Wrappers consulta os dois arquivos seguintes, os quais são normalmente chamados de arquivos de acesso hosts:
/etc/hosts.allow
/etc/hosts.deny
Um serviço que use o TCP Wrappers executa os seguintes passos ao receber um pedido de um cliente:
Consulta o /etc/hosts.allow
. — O serviço usuário do TCP Wrappers analisa o arquivo /etc/hosts.allow
seqüencialmente e aplica a primeira regra especificada para aquele serviço. Se encontra uma regra correspondente, permite a conexão. Caso contrário, continua com o próximo passo.
Consulta o /etc/hosts.deny
. — O serviço TCP Wrappers analisa o arquivo /etc/hosts.deny
seqüencialmente. Se encontra uma regra correspondente, nega a conexão. Caso contrário, permite acesso ao serviço.
É importante considerar os seguintes pontos importantes ao contemplar o uso do TCP Wrappers para proteger serviços de rede:
As regras de acesso em hosts.allow
tem precedência sobre as regras especificadas em hosts.deny
porque elas são aplicadas primeiro. Conseqüentemente, se o acesso a um serviço for permitido em hosts.allow
, uma regra negando o acesso aquele mesmo serviço em hosts.deny
é ignorada.
As regras de cada arquivo são lidas de cima para baixo, e a primeira regra correspondente a um serviço é a única a ser aplicada. A ordem das regras é extremamente importante.
O acesso ao serviço é permitido se nenhuma regra para o serviço for encontrada em qualquer um dos dois arquivos, ou se nenhum dos dois arquivos existir.
Serviços usuários do TCP Wrappers não fazem o cache das regras dos arquivos de acesso hosts, portanto quaisquer mudanças ao hosts.allow
ou hosts.deny
tem efeito imediato sem precisar reiniciar serviços de rede.
Se a última linha de um arquivo de acesso hosts não é um caractere de mudança de linha (criado pela tecla Enter), a última regra do arquivo falha e uma mensagem de erro é registrada em /var/log/messages
ou /var/log/secure
. Isto também aplica-se à regras que usem mais de uma linha sem usar o caractere de barra invertida. O seguinte exemplo ilustra a parte relevante de uma mensagem de registro para a falha de uma regra devido a qualquer uma destas circunstâncias.
warning: /etc/hosts.allow, line 20: missing newline or line too long
O formato do /etc/hosts.allow
e do /etc/hosts.deny
é idêntico. Cada regra deve ser especificada na sua própria linha. Linhas em branco ou que comecem com uma cerquilha (#) são ignoradas.
Cada regra usa o seguinte formato básico para controlar o acesso aos serviços de rede:
<lista-de-daemons>
:<lista-de-clientes>
[:<opção>
:<opção>
: ...]
<lista-de-daemons>
— Uma lista de nomes de processos (não de nomes de serviços) separados por vírgulas, ou o curinga ALL
. A lista de daemons também aceita operadores (consulte a Seção 2.5.2.1.4, “Operadores”) para oferecer maior flexibilidade.
<lista-de-clientes>
— Uma lista de nomes de hosts, endereços IP de hosts, padrões especiais, ou curingas, separados por vírgulas, que identificam os hosts afetados pela regra. A lista de clientes também aceita os operadores listados na Seção 2.5.2.1.4, “Operadores” para permitir maior flexibilidade.
<opção>
— Uma ação opcional, ou lista de ações opcionais separadas por vírgulas, executadas quando a regra é invocada. Campos de opção suportam a expansão, lançam comandos shell, permitem ou negam o acesso, e alteram o comportamento da autenticação.
Mais informações sobre os termos específicos discutidos acima podem ser encontradas neste guia nas seguintes localizações:
Veja a seguir uma regra básica de acesso a hosts:
vsftpd : .example.com
Esta regra faz com que o TCP Wrappers procure por conexões ao daemon do FTP (vsftpd
) a partir de qualquer host no domínio example.com
. Se esta regra aparece no hosts.allow
, a conexão é aceita. Se esta regra aparece no hosts.deny
, a conexão é rejeitada.
A próxima regra de acesso a hosts é mais complexa e usa dois campos de opção:
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log \ : deny
Note que cada campo de opção é precedido pela barra invertida (\). O uso da barra invertida previne a falha da regra devido ao comprimento.
Este exemplo de regra estabelece que se uma conexão ao daemon do SSH (sshd
) for tentada a partir de um host no domínio example.com
, o comando echo
é executado para adicionar a tentativa a um arquivo de registro especial e negar a conexão. Devido ao uso da diretiva opcional deny
, esta linha nega o acesso até mesmo se aparecer no arquivo hosts.allow
. Consulte a Seção 2.5.2.2, “Campos de Opção” para informações mais detalhadas sobre as opções disponíveis.
Curingas permitem que o TCP Wrappers faça a correspondência de grupos de daemons ou hosts mais facilmente. Eles são usados mais freqüentemente no campo da lista de clientes de regras de acesso.
Os seguintes curingas estão disponíveis:
ALL
— Corresponde a tudo. Pode ser usado tanto com a lista de daemons como com a lista de clientes.
LOCAL
— Faz a correspondência de qualquer host que não contenha um ponto (.), como, por exemplo, localhost.
KNOWN
— Faz a correspondência de qualquer host onde o nome e endereço do host ou o usuário são conhecidos.
UNKNOWN
— Faz a correspondência de qualquer host onde o nome ou endereço do host são desconhecidos, ou o usuário é desconhecido.
PARANOID
— Faz a correspondência de qualquer host onde o nome de host não corresponde ao endereço do host.
Os curingas KNOWN
, UNKNOWN
, e PARANOID
devem ser usados com cuidado porque eles baseiam-se na operação correta de um servidor DNS para operar corretamente. Qualquer interrupção à resolução de nomes pode impedir que usuários legítimos ganhem acesso a um serviço.
Padrões podem ser usados no campo de clientes de regras de acesso para especificar grupos de hosts clientes mais precisamente.
Veja a seguir uma lista de padrões normalmente usados no campo de clientes:
Nome de host começando com um ponto (.) — Um ponto no começo de um nome de host faz a correspondência de todos os hosts compartilhando os componentes listados do nome. O seguinte exemplo aplica-se a qualquer host no domínio example.com
:
ALL : .example.com
Endereço IP terminando com um ponto (.) — Um ponto no fim de um endereço IP faz a correspondência de todos os hosts compartilhando os grupos numéricos iniciais de um endereço IP. O seguinte exemplo aplica-se a qualquer host dentro da rede 192.168.x.x
:
ALL : 192.168.
Um par endereço IP/máscara de rede — Expressões de máscara de rede também podem ser usadas como um padrão para controlar o acesso grupo específico de endereços IP. O seguinte exemplo aplica-se a qualquer host num intervalo de endereço de 192.168.0.0
a 192.168.1.255
:
ALL : 192.168.0.0/255.255.254.0
As declarações de endereço/comprimento de prefixo (prefixlen), (notação CIDR) não são suportadas no espaço de endereços IPv4. Apenas regras IPv6 podem usar este formato.
Um par [IPv6 address]/prefixlen — Pares [net]/prefixlen também podem ser usados como um padrão para controlar o acesso a um grupo específico de endereços IPv6. O seguinte exemplo aplica-se a qualquer host num intervalo de endereço de 3ffe:505:2:1::
a 3ffe:505:2:1:ffff:ffff:ffff:ffff
:
ALL : [3ffe:505:2:1::]/64
O asterisco (*) — Asteriscos podem ser usados para a correspondência de grupos inteiros de nomes de hosts ou endereços IP, sob a condição de que eles não sejam misturados em uma lista de clientes contendo outros tipos de padrões. O seguinte exemplo aplica-se a qualquer host dentro do domínio example.com
:
ALL : *.example.com
A barra (/) — Se uma lista de clientes começa com uma barra, é tratada como um nome de arquivo. Isto é útil se for necessário usar regras especificando um grande número de hosts. O seguinte exemplo encaminha o TCP Wrappers ao arquivo /etc/telnet.hosts
para todas as conexões Telnet:
in.telnetd : /etc/telnet.hosts
Outros padrões menos usados também são aceitos pelo TCP Wrappers. Consulte a página man do hosts_access
(5) para maiores informações.
Tenha muito cuidado ao usar nomes de host e nomes de domínio. Atacantes podem usar uma variedade de truques para driblar a resolução de nomes precisa. Além disso, a interrupção ao serviço de DNS previne que mesmo cliente autorizados possam usar serviços de rede. Por estas razões, é melhor usar endereços IP sempre que for possível.
A implementação do TCP Wrappers pelo portmap
não suporta a busca por hosts, o que significa que o portmap
não pode usar nomes de hosts para identificar hosts. Conseqüentemente, regras de controle de acesso para o portmap no hosts.allow
ou no hosts.deny
devem usar endereços IP, ou a palavra-chave ALL
para a especificação de hosts.
Mudanças às regras de controle de acesso do portmap
podem não entrar em vigor imediatamente. Talvez você precise reiniciar o serviço portmap
.
Serviços amplamente utilizados, como o NIS e o NFS, dependem do portmap
para operar. Portanto, esteja ciente destas limitações.
No momento, regras de controle de acesso aceitam um operador, EXCEPT
. Este operador pode ser usado tanto na lista de daemons como na lista de clientes de uma regra.
O operador EXCEPT
permite exceções específicas para correspondências mais genéricas na mesma regra.
No seguinte exemplo de um arquivo hosts.allow
, todos os hosts example.com
, exceto cracker.example.com
, têm permissão para se conectar a todos os serviços:
ALL: .example.com EXCEPT cracker.example.com
Em outro exemplo de um arquivo hosts.allow
, clientes da rede 192.168.0.
podem usar todos os serviços, exceto o FTP:
x
ALL EXCEPT vsftpd: 192.168.0.
Em termos organizacionais, é normalmente mais fácil evitar o uso de operadores EXCEPT
. Isto permite que outros administradores inspecionem os arquivos apropriados para determinar quais hosts tem ou não permissão para acessar serviços sem ter que lidar com operadores EXCEPT
.
Além das regras básicas que permitem e negam acesso, a implementação do TCP Wrappers no Red Hat Enterprise Linux suporta extensões à linguagem de controle de acesso através de campos de opção. O uso de campos de opção em regras de acesso de hosts permite que administradores de sistemas executem uma variedade de tarefas, como alterar o comportamento dos registros, consolidar o controle de acesso, e lançar comandos do shell.
Campos de opção permitem que os administradores alterem com facilidade o alvo de registro e o nível de prioridade de uma regra usando a diretiva severity
.
No exemplo a seguir, conexões ao daemon do SSH a partir de qualquer host no domínio example.com
são registradas no alvo padrão authpriv
syslog
(uma vez que nenhum valor de alvo é especificado) com prioridade emerg
:
sshd : .example.com : severity emerg
Também é possível especificar um alvo usando a opção severity
. O seguinte exemplo registra qualquer tentativa de conexão SSH a partir de hosts no domínio example.com
no alvo local0
com prioridade alert
:
sshd : .example.com : severity local0.alert
Na prática, este exemplo não funciona até que o daemon syslog syslogd
) seja configurado para registrar no alvo local0
. Consulte a página man syslog.conf
para informações sobre configuração de alvos de registro personalizados.
Campos de opção também permitem que administradores permitam ou neguem hosts explicitamente em uma única regra através da adição das diretivas allow
ou deny
como opção final.
Por exemplo, as duas regras seguintes permitem conexões SSH a partir de client-1.example.com
, mas negam conexões a partir de client-2.example.com
:
sshd : client-1.example.com : allow sshd : client-2.example.com : deny
Ao possibilitar o controle de acesso regra por regra, o campo de opção permite que administradores consolidem todas as regras de acesso em um único arquivo: ou hosts.allow
ou hosts.deny
. Alguns administradores consideram isto uma maneira mais fácil de organizar regras de acesso.
Campos de opção permitem que regras de acesso lancem comandos do shell através das seguintes duas diretivas:
spawn
— Lança um comando do shell como um processo filho. Esta diretiva pode executar tarefas como usar o /usr/sbin/safe_finger
para obter mais informações sobre o cliente fazendo o pedido ou criar arquivos de registro especiais usando o comando echo
.
No seguinte exemplo, clientes tentando acessar serviços Telnet a partir do domínio example.com
são silenciosamente registrados em um arquivo especial:
in.telnetd : .example.com \ : spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log \ : allow
twist
— Substitui o serviço requisitado por um comando específico. Esta diretiva é normalmente usada para estabelecer armadilhas para invasores (também chamadas de "potes de mel"), e também pode ser usada para enviar mensagens a clientes que estejam se conectando. A diretiva twist
deve aparecer no final da linha da regra.
No exemplo a seguir, clientes tentando acessar serviços de FTP a partir do domínio example.com
recebem mensagens criadas com o comando echo
:
vsftpd : .example.com \ : twist /bin/echo "421 This domain has been black-listed. Access denied!"
Para maiores informações sobre opções de comandos do shell, consulte a página man hosts_options
.
Expansões. quando usadas com as diretivas spawn
e twist
, oferecem informações sobre o cliente, o servidor, e os processos envolvidos.
A lista a seguir apresenta as expansões suportadas:
%a
— Retorna o endereço IP do cliente.
%A
— Retorna o endereço IP do servidor.
%c
— Retorna uma variedade de informações sobre clientes, como o nome de usuário e o nome de host, ou o nome de usuário e o endereço IP.
%d
— Retorna o nome do processo do daemon.
%h
— Retorna o nome de host do cliente (ou endereço IP, caso o nome de host não esteja disponível).
%H
— Retorna o nome de host do servidor (ou endereço IP, caso o nome de host não esteja disponível).
%n
— Retorna o nome de host do cliente. Caso não esteja disponível, retorna unknown
. Se o nome e endereço de host do cliente não corresponderem, retorna paranoid
.
%N
— Retorna o nome de host do servidor. Caso não esteja disponível, retorna unknown
. Se o nome e endereço de host do servidor não corresponderem, retorna paranoid
.
%p
— Retorna o ID do processo do daemon.
%s
— Retorna vários tipos de informações sobre o servidor, como o processo do daemon e o host ou endereço IP do servidor.
%u
— Retorna o nome de usuário do cliente. Caso não esteja disponível, retorna unknown
.
No exemplo a seguir, a regra usa uma expansão junto com o comando spawn
para identificar o host cliente em um arquivo personalizado.
Quando conexões ao daemon do SSH (sshd
) são tentadas a partir de um host no domínio example.com
, o comando echo
é executado para registrar a tentativa, incluindo o nome de host (obtido através do uso da expansão %h
), em um arquivo especial:
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log \ : deny
De maneira semelhante, expansões podem ser usadas para personalizar mensagens enviadas de volta ao cliente. No exemplo seguinte, clientes que estejam tentando acessar serviços de FTP a partir do domínio example.com
são informados que eles foram banidos do servidor.
vsftpd : .example.com \ : twist /bin/echo "421 %h has been banned from this server!"
Para uma explicação completa sobre todos as expansões disponíveis, bem como opções adicionais de controle de acesso, consulte a seção 5 das páginas man do hosts_access
(man 5 hosts_access
) e a página man do hosts_options
.
Consulte a Seção 2.5.5, “Recursos Adicionais” para maiores informações sobre o TCP Wrappers.
O daemon xinetd
é um super serviço usuário do TCP Wrappers que controla o acesso a um subconjunto de serviços de rede populares, incluindo o FTP, o IMAP, e o Telnet. O xinetd
também oferece opções de configuração específicas a serviços para o controle de acesso, registro aprimorado, vinculação, redirecionamento, e controle de utilização de recursos.
Quando um cliente tenta conectar a um serviço de rede controlado pelo xinetd
, o super serviço recebe o pedido e verifica a existência de quaisquer regras de controle de acesso do TCP Wrappers .
Se o acesso é permitido, o xinetd
verifica se a conexão é permitida sob as suas próprias regras de acesso para o serviço em questão. O xinetd
também verifica se o serviço pode ter mais recursos alocados e certifica-se de que o serviço não está violando nenhuma regra definida.
Se todas estas condições forem satisfeitas (ou seja, o acesso é permitido ao serviço, o serviço não atingiu seus limites de recursos, e o serviço não está violando nenhuma regra definida), o xinetd
então inicia uma instância do serviço e passa o controle da conexão para o mesmo. Após a conexão ter sido estabelecida, o xinetd
não participa mais da comunicação entre o cliente e o servidor.
Os arquivos de configuração do xinetd
são os seguintes:
/etc/xinetd.conf
— O arquivo de configuração global do xinetd
.
/etc/xinetd.d/
— O diretório contendo todos os arquivos de serviços específicos.
O arquivo /etc/xinetd.conf
contém opções de configuração gerais que afetam todos os serviços sob o controle do xinetd
. É lido quando o serviço xinetd
é iniciado pela primeira vez, portanto, para que configurações entrem em vigor, você precisa reiniciar o serviço xinetd
. Veja a seguir um exemplo de arquivo /etc/xinetd.conf
:
defaults { instances = 60 log_type = SYSLOG authpriv log_on_success = HOST PID log_on_failure = HOST cps = 25 30 } includedir /etc/xinetd.d
Estas linhas controlam os seguintes aspectos do xinetd
:
instances
— Especifica o número máximo de pedidos simultâneos que o xinetd
pode processar.
log_type
— Configura xinetd
para que use o alvo de registro authpriv
, o qual escreve entradas de registro no arquivo /var/log/secure
. A inclusão de uma diretiva como FILE /var/log/xinetdlog
criaria um arquivo de registro personalizado chamado xinetdlog
no diretório /var/log/
.
log_on_success
— Configura o xinetd
para que registre tentativas de conexão bem-sucedidas. Por padrão, o endereço IP do host remoto e o ID do processo do servidor processando o pedido são registrados.
log_on_failure
— Configura o xinetd
para que registre tentativas de conexão mal-sucedidas ou recusadas.
cps
— Configura o xinetd
para que permita não mais do que 25 por segundo para qualquer serviço. Se este limite for excedido, o serviço é aposentado por 30 seconds.
includedir
/etc/xinetd.d/
— Inclui as opções declaradas nos arquivos de configuração de serviço específicos armazenados no diretório /etc/xinetd.d/
. Consulte a Seção 2.5.4.2, “O Diretório /etc/xinetd.d/” para maiores informações.
Freqüentemente, as diretivas log_on_success
e log_on_failure
no /etc/xinetd.conf
também são modificadas nos arquivos de configuração de serviço específicos. Mais informações podem portanto aparecer no arquivo de registro de um determinado serviço do que o arquivo /etc/xinetd.conf
possa indicar. Consulte a Seção 2.5.4.3.1, “Opções de Registro” para mais informações.
O diretório /etc/xinetd.d/
contém os arquivos de configuração para cada serviço gerenciado pelo xinetd
, e os nomes dos arquivos relacionados ao serviço. Assim como o xinetd.conf
, este diretório é lido apenas quando o serviço xinetd
é iniciado. Para que quaisquer alterações sejam efetivadas, o administrador deve reiniciar o serviço xinetd
.
O formato dos arquivos no diretório /etc/xinetd.d/
usa a mesma convenção do que o /etc/xinetd.conf
. A razão principal pela qual a configuração de cada serviço é armazenada em uma arquivo separado é para facilitar a personalização e reduzir o risco de interferência na configuração de outros serviços.
Para entender como estes arquivos são estruturados, considere o arquivo /etc/xinetd.d/krb5-telnet
:
service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/kerberos/sbin/telnetd log_on_failure += USERID disable = yes }
Estas linhas controlam vários aspectos do serviço telnet
:
service
— Especifica o nome do serviço, normalmente um dos nomes listados no arquivo /etc/services
.
flags
— Estabelece uma série de atributos para a conexão. O REUSE
informa ao xinetd
para reutilizar o soquete para uma conexão Telnet.
O sinalizador REUSE
é obsoleto, uma vez que todos os serviços agora o usam implicitamente..
socket_type
— Estabelece o tipo de soquete de rede para stream
.
wait
— Especfica se o serviço é single-thread (yes
) ou multi-thread (no
).
user
— Especifica o ID do usuário sob o qual o processo está rodando.
server
— Especifica qual executável binário deve ser lançado.
log_on_failure
— Especifica os parâmetros de registro para log_on_failure
além daquela já definidos em xinetd.conf
.
disable
— Especifica se o serviço está desabilitado (yes
) ou habilitado (no
).
Consulte a página man do xinetd.conf
para mais informações sobre o uso destas opções.
Uma série de diretivas está disponível para os serviços protegidos pelo xinetd
. Esta seção destaca algumas das opções mais usadas.
As seguintes opções de registro estão disponíveis para o /etc/xinetd.conf
e para os arquivos de configuração de serviço específicos no diretório /etc/xinetd.d/
.
Veja a seguir a lista de algumas das opções de registro mais usadas:
ATTEMPT
— Registra o fato de que uma tentativa mal-sucedida foi feita (log_on_failure
).
DURATION
— Registra a duração do uso do serviço é usado por um sistema remoto (log_on_success
).
EXIT
— Registra o estado de saída ou sinal de término do serviço (log_on_success
).
HOST
— Registra o endereço IP do host remoto (log_on_failure
e log_on_success
).
PID
— Registra o ID do processo do servidor recebendo o pedido (log_on_success
).
USERID
— Registra o usuário remoto usando o método definido no RFC 1413 para serviços multi-thread de fluxo (log_on_failure
andlog_on_success
).
Para uma lista completa de opções de registro, consulte a página man do xinetd.conf
.
Usuários do serviço xinetd
podem escolher usar as regras de acesso a hosts do TCP Wrappers, fornecer controle de acesso através dos arquivos de configuração do xinetd
, ou ambos. Consulte a Seção 2.5.2, “Arquivos de Configuração do TCP Wrappers” para maiores informações sobre os arquivos de controle de acesso hosts do TCP Wrappers.
Esta seção discute o uso do xinetd
para controlar o acesso a serviços.
Ao contrário do TCP Wrappers, mudanças ao controle de acesso entram em vigor apenas se o administrador do xinetd
reiniciar o serviço.
Além disso, ao contrário do TCP Wrappers, controle de acesso através do xinetd
afeta apenas os serviços controlados pelo xinetd
.
O controle de acesso a hosts do xinetd
difere do método usado pelo TCP Wrappers. Enquanto o TCP Wrappers organiza toda a configuração de acesso em dois arquivos, /etc/hosts.allow
e /etc/hosts.deny
, o controle de acesso do xinetd
é encontrado no arquivo de configuração de cada serviço no diretório /etc/xinetd.d/
.
As seguintes opções de acesso a hosts são suportadas pelo xinetd
:
only_from
— Permite que apenas os hosts especificados usem o serviço.
no_access
— Não permite que os hosts listados usem o serviço
access_times
— Especifica o intervalo de tempo durante o qual um determinado serviço pode ser usado. O intervalo de tempo deve ser especificado no formato 24 horas, HH:MM-HH:MM.
As opções only_from
e no_access
podem usar uma lista de endereços IP ou nomes de host, ou podem especificar um rede inteira. Assim como o TCP Wrappers, a combinação do controle de acesso através do xinetd
com a configuração aprimorada de registros pode aumentar a segurança através do bloqueio de pedidos a partir de hosts e do registro detalhado de cada tentativa de conexão.
Por exemplo, o seguinte arquivo /etc/xinetd.d/telnet
pode ser usado para bloquear acesso ao Telnet a partir de um determinado grupo de rede e para restringir o intervalo de tempo total que até mesmo usuários com permissão podem permanecer conectados:
service telnet { disable = no flags = REUSE socket_type = stream wait = no user = root server = /usr/kerberos/sbin/telnetd log_on_failure += USERID no_access = 172.16.45.0/24 log_on_success += PID HOST EXIT access_times = 09:45-16:15 }
Neste exemplo, quando um sistema cliente da rede 10.0.1.0/24
, como 10.0.1.2
tenta o acesso ao serviço Telnet, recebe a seguinte mensagem:
Conexão fechada pelo host remoto.
Além disso, as tentativas de autenticação do cliente são registradas no /var/log/messages
da seguinte maneira:
Sep 7 14:58:33 localhost xinetd[5285]: FAIL: telnet address from=172.16.45.107 Sep 7 14:58:33 localhost xinetd[5283]: START: telnet pid=5285 from=172.16.45.107 Sep 7 14:58:33 localhost xinetd[5283]: EXIT: telnet status=0 pid=5285 duration=0(sec)
Ao usar o TCP Wrappers junto com os controles de acesso do xinetd
, é importante entender a relação entre os dois mecanismos de controle de acesso.
Veja a seguir a seqüência de eventos seguida pelo xinetd
quando um cliente solicita uma conexão:
O daemon xinetd
acessa as regras de acesso a hosts o TCP Wrappers usando uma chamada da biblioteca libwrap.a
. Se uma regra de negação (deny rule) corresponde ao cliente, a conexão é abandonada. Se um regra de permissão (allow rule) corresponde ao cliente, a conexão é passada para o xinetd
.
O daemon xinetd
verifica as suas próprias regras de controle de acesso tanto para o serviço xinetd
como para o serviço requisitado. Se uma regra de negação corresponder ao cliente, a conexão é abandonada. Caso contrário, o xinetd
inicia uma instância do serviço requisitado e passa o controle da conexão para aquele serviço.
Deve-se tomar cuidado ao usar os controles de acesso do TCP Wrappers junto com os controles de acesso do xinetd
. A má configuração pode causar efeitos indesejáveis.
Os arquivos de configuração de serviços para o xinetd
oferecem suporte à vinculação do serviço a um endereço IP e o redirecionamento de pedidos de entrada para aquele serviço para outro endereço IP, nome de host, ou porta.
A vinculação é controlada com a opção bind
nos arquivos de configuração de serviço específicos e liga o serviço a um endereço IP no sistema. Quando configurado, a opção bind
permite apenas que pedidos ao endereço IP correto acessem o serviço. Você pode usar este método para vincular vários serviços à várias interfaces de rede conforme for necessário.
Isto é especialmente útil para sistemas com vários adaptadores de rede ou com vários endereços IP. Em tais sistemas, serviços inseguros (por exemplo, o Telnet), podem ser configurados para que escutem somente na interface conectada à rede privativa e não na interface conectada à Internet.
A opção redirect
aceita um endereço IP ou nome de host seguido por um número de porta. A opção configura o serviço para que redirecione quaisquer pedidos por este serviço para host e número de porta especificados. Esta funcionalidade pode ser usada para fazer o redirecionamento para outra porta no sistema, para redirecionar o pedido para um endereço IP diferente na mesma máquina, mandar o pedido para um sistema e um número de porta totalmente diferentes, ou qualquer combinação destas opções. Um usuário que esteja conectando a um sistema pode portanto ser redirecionado para outro sistema sem interrupção.
O daemon xinetd
pode realizar este redirecionamento através da geração de um processo que mantém-se vivo por toda a duração da conexão entre a máquina cliente que fez o pedido e o host oferecendo o serviço, transferindo dados entre os dois sistemas.
As vantagens das opções bind
e redirect
são mais evidentes quando usadas ao mesmo tempo. Ao vincular um serviço a um endereço IP específico em um sistema, e então redirecionar pedidos por este serviço para uma segunda máquina que apenas a primeira máquina saiba que exista, um sistema interno pode ser usado para oferecer serviços para uma rede totalmente diferente. Alternativamente, estas opções podem ser usadas para limitar a exposição de um serviço específico em uma máquina com diversas bases a um endereço IP conhecido, bem como para redirecionar quaisquer pedidos por aquele serviço para outra máquina configurada especialmente para esta finalidade.
Por exemplo, considere um sistema que seja usado como um firewall com esta configuração para o serviço Telnet:
service telnet { socket_type = stream wait = no server = /usr/kerberos/sbin/telnetd log_on_success += DURATION USERID log_on_failure += USERID bind = 123.123.123.123 redirect = 10.0.1.13 23 }
As opções bind
e redirect
neste arquivo garantem que o serviço Telnet na máquina é vinculado ao endereço IP externo (123.123.123.123
), o qual faz a interface com a Internet. Além disso, quaisquer pedidos por serviços Telnet enviados ao 123.123.123.123
são redirecionados através de um segundo adaptador de rede para um endereço IP interno (10.0.1.13
) que apenas o firewall e sistemas internos podem acessar. O firewall então envia a conexão entre os dois sistemas, e o sistema que está se conectando pensa que está conectado ao 123.123.123.123
, quando na verdade está conectado à uma máquina diferente.
Esta funcionalidade é útil especialmente para usuários com conexões de banda larga mas somente um endereço IP fixo. Ao usar a Conversão de Endereços de Rede (Network Address Translation - NAT), os sistemas atrás do firewall, os quais estão usando endereços IP de uso apenas interno, não ficam disponíveis no exterior do sistema de gateway. Entretanto, quando certos serviços controlados pelo xinetd
são configurados com as opções bind
e redirect
, o gateway pode fazer o papel de proxy entre sistemas externos e uma máquina interna específica configurada para oferecer o serviço. Além disso, as várias opções de controle de acesso e registro do xinetd
também estão disponíveis para proteção adicional.
O daemon xinetd
pode adicionar um nível de proteção básico contra ataques de Negação de Serviço (Denial of Service - DoS). Veja a seguir uma lista de diretivas que podem ajudar a limitar a efetividade de tais ataques:
per_source
— Define o número máximo de instâncias para um serviço por endereço IP fonte. Aceita apenas valores inteiros como argumento e pode ser usado tanto no xinetd.conf
como nos arquivos de configuração de serviço específicos no diretório xinetd.d/
.
cps
— Define o número máximo de conexões por segundo. esta diretiva usa dois argumentos (valores inteiros), separados por um espaço. O primeiro argumento é o número máximo de conexões por segundo permitidas ao serviço. O segundo argumento é o número de segundos que o xinetd
deve deixar passar antes de reabilitar o serviço. A diretiva aceita apenas valores inteiros como argumento, e pode ser usada tanto no arquivo xinetd.conf
como nos arquivos de configuração de serviço específicos no diretório xinetd.d/
.
max_load
— Define o uso da CPU ou o limiar de carga média para um serviço. A diretiva aceita um número de ponto flutuante como argumento.
A carga média é uma medida aproximada de quantos processos estão ativos em um determinado momento. Consulte as páginas man dos comandos uptime
, who
, e procinfo
para mais informações sobre a carga média (load average).
Existem ainda mais opções de gerenciamento de recursos disponíveis ao xinetd
. Consulte a página man do xinetd.conf
para mais informações.
Mais informações sobre o TCP Wrappers e o xinetd
estão disponíveis na documentação do sistema e na Internet.
A documentação do seu sistema é um bom lugar para começar a procurar por opções de configuração adicionais para o TCP Wrappers, xinetd
, xinetd
, controle de acesso.
/usr/share/doc/tcp_wrappers-
— este diretório contém o arquivo <version>
/README
que discute como o TCP Wrappers funciona e os vários riscos existentes em relação à falsificação de nomes e endereços de host .
/usr/share/doc/xinetd-
— Este diretório contém um arquivo <versão>
/README
que discute aspectos de controle de acesso e uma amostra de arquivo de configuração sample.conf
com várias idéias sobre como modificar arquivos de configuração de serviço específicos no diretório /etc/xinetd.d/
.
Páginas man relacionadas ao TCP Wrappers e ao xinetd
— Uma série de páginas man existem para os vários aplicativos e arquivos de configuração relacionados ao TCP Wrappers e ao xinetd
. Veja a seguir algumas das páginas man mais importantes:
man xinetd
— A página man para o xinetd
.
man 5 hosts_access
— A página man dos arquivos de controle de acesso hosts do TCP Wrappers.
man hosts_options
— A página man para os campos de opções do TCP Wrappers.
man xinetd.conf
— A página man com a listagem das opções de configuração do xinetd
.
http://www.xinetd.org/ — O lar do xinetd
, contendo amostras de arquivos de configuração, uma lista completa de funcionalidades, e uma FAQ bem útil.
http://www.macsecurity.org/resources/xinetd/tutorial.shtml — Um tutorial minucioso que discute várias formas diferentes sobre como otimizar os arquivos de configuração do xinetd
para atingir metas de segurança específicas.
A segurança e a integridade de sistemas dentro de uma rede podem ser difíceis de administrar. Acompanhar os serviços sendo executados em uma rede, assim como a maneira como os mesmos estejam sendo usados pode ocupar o tempo de vários administradores.
Além disso, a autenticação de usuários a serviços de rede pode representar um perigo quando o método usado pelo protocolo é inerentemente inseguro, conforme evidenciado pela transferência de senhas não criptografadas através de uma rede usando os protocolos FTP ou Telnet.
O Kerberos é uma maneira de eliminar a necessidade de usar protocolos que permitam métodos de autenticação inseguros, melhorando assim a segurança geral da rede.
O Kerberos é um protocolo de autenticação de rede criado pelo MIT, que utiliza criptografia de chave simétrica [5] para autenticar usuários a serviços de rede, o que significa que as senhas em si nunca são enviadas através da rede.
Conseqüentemente, quando usuários se autenticam em serviços de rede usando o Kerberos, os usuários não autorizados, que estão tentando obter senhas através da monitoração do tráfego de rede, são impedidos de forma efetiva.
A maioria dos serviços de rede convencionais usa esquemas de autenticação de senhas. Estes esquemas requerem que o usuário se autentique em uma rede fornecendo seu nome de usuário e senha. Infelizmente, o envio de informações de autenticação para diversos serviços, é realizado sem criptografia. Para que um esquema destes seja seguro, a rede deve estar inacessível para pessoas de fora, assim como todos os computadores e usuários da rede devem ser confiáveis.
Mesmo se este for o caso, uma vez que a rede está conectada à Internet, não pode mais ser considerada segura. Qualquer atacante que obtiver acesso à rede pode usar um simples analisador de pacotes (também conhecido como 'packet sniffer') para interceptar nomes de usuários e senhas enviados desta maneira, assim comprometendo as contas de usuários e a integridade de toda a infraestrutura de segurança.
O objetivo principal do design do Kerberos é a eliminação da transmissão de senhas não criptografadas através da rede. Se for usado adequadamente, o Kerberos elimina efetivamente a ameaça que programas tipo packet sniffers representariam à rede caso o Kerberos não fosse usado.
Apesar do Kerberos eliminar uma ameaça severa e comum, pode ser de difícil implementação devido à uma gama de motivos:
Migrar senhas de usuário de um banco de dados UNIX padrão, como o /etc/passwd
ou o /etc/shadow
, para um banco de dados de senhas Kerberos pode ser entediante, pois não há um mecanismo automatizado para executar esta tarefa. Para mais informações, consulte a Questão 2.23 no FAQ online do Kerberos:
O Kerberos tem apenas compatibilidade parcial com os Módulos de Autenticação Plugáveis (PAM), sistema usado pela maioria dos servidores Red Hat Enterprise Linux. Consulte a Seção 2.6.4, “Kerberos e PAM” para mais informações sobre esta questão.
O Kerberos presume que cada usuário é confiável e está usando uma máquina não confiável em uma rede não confiável. Seu objetivo principal é evitar que senhas não criptografadas sejam enviadas pela rede. No entanto, se alguém além do usuário legítimo tiver acesso à máquina que emite tickets usados para autenticação — chamada de centro de distribuição de chave (KDC) — o sistema de autenticação inteiro do Kerberos estará em risco.
Para que um aplicativo use o Kerberos, sua fonte deve ser alterada para fazer as chamadas apropriadas às bibliotecas do Kerberos. Os aplicativos modificados desta maneira são considerados kerberizados. Para alguns aplicativos, isto pode ser bastante problemático devido ao tamanho ou design do aplicativo. Para outros aplicativos incompatíveis, as alterações devem ser feitas na maneira como o lado servidor e cliente se comunicam. Vale frisar que isto pode requerer uma programação extensiva. Aplicativos de código fechado que não têm suporte ao Kerberos por padrão são geralmente os mais problemáticos.
O Kerberos é uma solução 'tudo ou nada'. Se ele for utilizado na rede, quaisquer senhas não criptografadas transferidas a um serviço não-kerberizado estão em risco. Portanto, a rede não se beneficia do uso do Kerberos. Para proteger uma rede com o Kerberos, deve-se utilizar versões kerberizadas de todos os aplicativos cliente/servidor que enviam senhas não criptografadas ou não usar nenhum aplicativo do tipo cliente/servidor.
O Kerberos tem sua própria terminologia para definir os diversos aspectos do serviço. Antes de aprender como o Kerberos funciona, é importante aprender os seguintes termos.
Um servidor que emite os tickets para um serviço desejado, que por sua vez são dados para usuários acessarem o serviço. O AS responde aos pedidos de clientes que não têm ou não enviam as credenciais com um pedido. É usado geralmente para obter acesso ao serviço Servidor de Concessão de Ticket (Ticket-Granting Server), ou simplesmente TGS, emitindo um Ticket de Concessão de Tickets (Ticket-Granting Ticket), ou TGT. O AS geralmente roda no mesmo host que o Centro de Distribuição de Chaves (Key Distribution Center), ou KDC.
Dados criptografados.
Uma entidade na rede (um usuário, uma máquina ou um aplicativo) que pode receber um ticket do Kerberos.
Um conjunto temporário de credenciais eletrônicas que verificam a identidade de um cliente para um determinado serviço. Também chamadas de tickets.
Um arquivo que contém as chaves para criptografar as comunicações entre um usuário e vários serviços de rede. O Kerberos 5 suporta uma estrutura de trabalho para usar outros tipos de cache, como memória compartilhada, mas os arquivos são melhor suportados.
Um hash de mão única usado para autenticar usuários. Estes são mais seguros do que usar dados não criptografados, mas para um cracker experiente eles ainda são relativamente fáceis de decifrar. (AS) -
'The Generic Security Service Application Program Interface' (definida na RFC-2743 publicada pela The Internet Engineering Task Force) é um conjunto de funções, que oferece serviços de segurança usados por clientes para se autenticarem nos serviços. Esta API também é usada pelos clientes e serviços para autenticação mútua sem a necessidade de que os mesmos tenham conhecimento específico sobre o mecanismo subjacente de cada um. Se um serviço de rede (como o cyrus-IMAP) usa a GSS-API, o mesmo pode autenticar usando o Kerberos.
Também chamado de valor de hash. Um valor gerado passando uma faixa por uma função de hash. Estes valores são tipicamente usados para garantir que os dados transmitidos não tenham sido adulterados.
Uma forma de gerar uma "impressão digital" a partir de dados de entrada. Estas funções reorganizam, transpõem, ou de alguma outra forma alteram dados para produzir um valor de hash.
Informação usada ao criptografar ou descriptografar outros dados. Dados criptografados não podem ser descriptografados sem a chave apropriada ou através de muita sorte por parte do cracker.
Um serviço que emite tickets do Kerberos e geralmente roda no mesmo host que o servidor de concessão de ticket (TGS).
Um arquivo que contém uma lista não criptografada de principais e suas chaves. Servidores obtém as chaves necessárias dos arquivos keytab ao invés de usar o kinit
. O arquivo keytab padrão é o /etc/krb5.keytab
. O servidor de administração do KDC, /usr/kerberos/sbin/kadmind
, é o único serviço que usa qualquer outro arquivo (usa o /var/kerberos/krb5kdc/kadm5.keytab
).
O comando kinit
permite que um principal que já tenha se conectado obtenha o ticket de concessão de ticket (TGT) inicial e armazene-o no cache. Para mais informações sobre o uso do comando kinit
, consulte sua página man.
O principal é o nome único de um usuário ou serviço com permissão para autenticar usando o Kerberos. Um principal segue o formato root[/instance]@REALM
. Para um usuário típico, a raiz (root) é a mesmo que seu ID de autenticação. A instance
(instância) é opcional. Se o principal tiver uma instância, a mesma será separada da raiz por uma barra ("/"). Uma faixa vazia ("") é considerada uma instância válida (a qual difere da instância padrão NULL
), mas usá-la pode ser confuso. Todos os principais em um território (realm) têm suas próprias chaves que, para os usuários, são derivadas de uma senha, ou são definidas randomicamente para os serviços.
Uma rede que usa o Kerberos, composta de um ou mais servidores - chamados KDCs - e um número potencialmente grande de clientes.
Um programa acessado através da rede.
Um conjunto temporário de credenciais eletrônicas que verificam a identidade de um cliente para um determinado serviço. Também chamado de credenciais.
Um servidor que emite tickets para um serviço desejado, que por sua vez são dados aos usuários para acessarem um serviço. O TGS geralmente roda na mesma máquina que o KDC.
Um ticket especial que permite ao cliente obter tickets adicionais sem requisitá-los pelo KDC.
Uma senha em formato de texto simples, legível.
O Kerberos difere dos métodos de autenticação nome do usuário/senha porque, ao invés de autenticar cada usuário para cada serviço de rede, o Kerberos utiliza criptografia simétrica e um terceiro elemento confiável (um KDC) para autenticar usuários a um conjunto de serviços de rede. Quando um usuário autenticar no KDC, este envia um ticket específico para esta sessão de volta para a máquina do usuário, e quaisquer serviços kerberizados procuram o ticket na máquina do usuário ao invés de pedir que o usuário se autentique usando uma senha.
Quando um usuário de uma rede kerberizada se autentica em sua estação de trabalho, seu principal é enviado ao KDC como parte de um pedido de TGT ao Servidor de Autenticação (AS). Este pedido pode ser enviado pelo programa de login, sendo assim transparente para o usuário, ou pode ser enviado pelo programa kinit
após o usuário se logar.
O KDC então verifica o principal em seu banco de dados. Se o principal é encontrado, o KDC cria um TGT, que é criptografado usando a chave do usuário, e retornado para o usuário.
O programa de autenticação ou kinit
no cliente,descriptografa então o TGT usando a chave do usuário, computada a partir da senha do usuário. A chave do usuário é usada somente na máquina cliente e não é enviada através da rede.
O TGT é configurado para expirar após um período de tempo determinado (geralmente dez horas) e armazenado no cache de credenciais da máquina cliente. A expiração é definida para que um TGT comprometido seja útil para um atacante por somente um curto período de tempo. Após o TGT ter sido emitido, o usuário não precisa fornecer a sua senha até que o TGT expire ou até efetuar o logoff e então efetuar o login novamente.
Sempre que um usuário precisar de acesso a um serviço de rede, o software cliente usa o TGT para pedir um novo ticket para este serviço específico ao TGS. O ticket do serviço é então usado para autenticar o usuário de forma transparente a este serviço.
O sistema do Kerberos pode ser comprometido se um usuário da rede se autenticar em um serviço não-kerberizado enviando a senha em formato texto. O uso de serviços não-kerberizados é altamente desestimulado. Tais serviços incluem Telnet e FTP. Porém, o uso de outros protocolos criptografados, como os serviços protegidos SSH ou SSL, é aceitável apesar de não ser ideal.
Esta é somente uma visão geral de como a autenticação do Kerberos funciona. A Seção 2.6.10, “Recursos Adicionais” contém links para informações mais detalhadas.
O Kerberos depende dos seguintes serviços de rede para funcionar corretamente.
Sincronização aproximada de relógio, entre as máquinas da rede.
Um programa de sincronização de relógio deve ser configurado para a rede, como o ntpd
. Consulte /usr/share/doc/ntp-
para detalhes sobre como configurar servidores Protocolo de Horário de Rede (NTP), onde <version-number>
/index.html<version-number>
é o número da versão do pacote ntp
instalado no seu sistema.
Serviço de Nome do Domínio (DNS).
Certifique-se de que as entradas de DNS e os hosts na rede estão todos configurados apropriadamente. Consulte o Guia do Administrador de Sistemas do Kerberos V5 em /usr/share/doc/krb5-server-
para mais informações (onde <version-number>
<version-number>
é o número da versão do pacote krb5-server
instalado no seu sistema).
Atualmente, os serviços kerberizados não utilizam Módulos de Autenticação Plugáveis (PAM) — os serviços kerberizados ignoram completamente o PAM. Entretanto, os aplicativos que usam PAM podem usar o Kerberos para autenticação se o módulo pam_krb5
(oferecido no pacote pam_krb5
) está instalado. O pacote pam_krb5
contém arquivos de amostra de configuração que permitem a serviços como o login
e o gdm
autenticarem usuários e obterem as credenciais iniciais usando suas senhas. Se o acesso a serviços de rede é sempre executado usando serviços kerberizados ou serviços que usam GSS-API, como o IMAP, a rede pode ser considerada razoavelmente segura.
Os administradores devem ter cuidado para não permitir que usuários se autentiquem na maioria dos serviços de rede usando senhas do Kerberos. Muitos protocolos usados por estes serviços não criptografam a senha antes de enviá-la através da rede, destruindo os benefícios do sistema Kerberos. Por exemplo: usuários não devem ter a permissão de se autenticar no Telnet usando a mesma senha usada para o Kerberos.
Antes de configurar o Kerberos, instale o KDC. Se for preciso configurar servidores escravos (secundários), instale primeiro um mestre (primários).
Para configurar um servidor Kerberos básico, siga estes passos:
Certifique-se de que a sincronização do relógio e DNS estejam funcionando em todas as máquinas cliente e servidor antes de configurar o Kerberos. Preste atenção especial à sincronização do horário entre o servidor Kerberos e seus clientes. Se a diferença entre os relógios do servidor e do cliente for maior que cinco minutos (essa quantidade padrão é configurável no Kerberos 5), os clientes do Kerberos não poderão se autenticar no servidor. Essa sincronização do relógio se faz necessária para evitar que um atacante use um ticket antigo do Kerberos para se mascarar como um usuário válido.
É aconselhável configurar um Protocolo de Horário de Rede (Network Time Protocol - NTP) compatível com a rede cliente/servidor mesmo se o Kerberos não estiver sendo usado. O Red Hat Enterprise Linux inclui o pacote ntp
para este propósito. Consulte o /usr/share/doc/ntp-
(onde <version-number>
/index.html<version-number>
é o número da versão do pacote ntp
instalado no seu sistema) para obter detalhes sobre a configuração de servidores de Protocolo de Horário de Rede e http://www.ntp.org para informações adicionais sobre NTP.
Instale os pacotes krb5-libs
, krb5-server
, e krb5-workstation
na máquina dedicada que executa o KDC. Essa máquina precisa ser muito segura — se possível, não deve executar nenhum outro serviço além do KDC.
Edite os arquivos de configuração /etc/krb5.conf
e /var/kerberos/krb5kdc/kdc.conf
para refletir o nome do território e o mapeamento de domínio-território. Um território simples pode ser construído substituindo as instâncias de EXEMPLO.COM
e exemplo.com
pelo nome de domínio correto — certificando de manter os nomes em caixas alta e baixa no formato correto — e alterando o KDC de kerberos.exemplo.com
para o nome do servidor do Kerberos. Por convenção, todos os nomes de território são escritos em caixa alta e todos os nomes DNS de máquinas e de domínio são escritos em caixa baixa. Para uma explanação completa sobre os formatos destes arquivos, consulte as respectivas páginas man.
Crie o banco de dados usando o utilitário kdb5_util
em uma janela de comandos:
/usr/kerberos/sbin/kdb5_util create -s
O comando create
cria o banco de dados usado para armazenar as chaves para o território do Kerberos. A opção -s
força a criação de um arquivo stash no qual a chave do servidor mestre está armazenada. Se não houver nenhum arquivo stash a partir do qual pode-se ler a chave, o servidor do Kerberos (krb5kdc
) pede ao usuário a senha do servidor mestre (que pode ser usada para recriar a chave) toda vez que este iniciar.
Edite o arquivo /var/kerberos/krb5kdc/kadm5.acl
. Este arquivo é usado pelo kadmind
para determinar quais principais têm acesso administrativo ao banco de dados do Kerberos e seus níveis de acesso. A maioria das empresas podem fazer isso com uma única linha:
*/admin@EXAMPLE.COM *
A maioria dos usuários é representada no banco de dados por um único principal (com uma instância NULA ou vazia, como joe@EXEMPLO.COM). Com esta configuração, usuários com um segundo principal com a instância admin (joe/admin@EXEMPLO.COM, por exemplo) são capazes de exercer controle total sobre o banco de dados Kerberos do território.
Uma vez iniciado o kadmind
no servidor, qualquer usuário pode acessar seus serviços, executando kadmin
em quaisquer clientes ou servidores no território. Entretanto, somente os usuários listados no arquivo kadm5.acl
podem modificar o banco de dados de qualquer maneira, exceto alterar suas próprias senhas.
O utilitário kadmin
se comunica com o servidor kadmind
através da rede e usa o Kerberos para autenticação. Por este motivo, o primeiro principal já deve existir antes de conectar ao servidor através da rede para administrá-lo. Crie o primeiro principal com o comando kadmin.local
, que é especificamente desenvolvido para ser usado na mesma máquina que o KDC e não utiliza o Kerberos para autenticação.
Digite o seguinte comando kadmin.local
no terminal do KDC para criar o primeiro principal:
/usr/kerberos/sbin/kadmin.local -q "addprinc nome-de-usuário
/admin"
Inicie o Kerberos usando os seguintes comandos:
/sbin/service krb5kdc start /sbin/service kadmin start /sbin/service krb524 start
Adicione principais para os usuários com o comando addprinc
do kadmin
. O kadmin
e o kadmin.local
são interfaces de linha de comando do KDC. Conseqüentemente, muitos comandos — como o addprinc
— tornam-se disponíveis após o lançamento do programa kadmin
. Consulte a página man do kadmin
para mais informações.
Verifique se o KDC está emitindo tickets. Primeiro, execute kinit
para obter um ticket e armazená-lo em um arquivo cache de credenciais. Em seguida, use o klist
para visualizar a lista de credenciais no cache e use o kdestroy
para destruir o cache e as credenciais ali contidas.
Por padrão, o kinit
tenta autenticar usando o nome de login da conta usada ao logar no sistema (não no servidor do Kerberos). Se este nome não corresponde a um principal no banco de dados do Kerberos, o kinit
emite uma mensagem de erro. Se isto ocorrer, forneça ao kinit
o nome correto do principal como um argumento na linha de comando (kinit
).
<principal>
Uma vez que estes passos estejam completos, o servidor do Kerberos deve estar pronto e funcionando.
Configurar um cliente Kerberos 5 é menos complexo que um servidor. No mínimo, deve-se instalar os pacotes de cliente e prover um arquivo de configuração krb5.conf
válido para cada cliente. Apesar de se preferir os métodos de instalação remota ssh
e slogin
para sistemas de clientes, as versões kerberizadas de rsh
e rlogin
também requerem algumas alterações de configuração.
Ajuste a sincronização de horário entre o cliente Kerberos e o KDC. Consulte a Seção 2.6.5, “Configurando o Servidor Kerberos 5” para mais informações. Além disso, verifique se o DNS está funcionando corretamente no cliente Kerberos antes de configurar os programas do cliente.
Instale os pacotes krb5-libs
e krb5-workstation
em todas as máquinas cliente. Forneça um arquivo /etc/krb5.conf
válido para cada cliente (geralmente este pode ser o mesmo arquivo krb5.conf
usado pelo KDC).
Antes que uma estação de trabalho no território possa usar Kerberos para autenticar a conexão de usuários usando ssh
ou rsh
e rlogin
kerberizados, ela deve ter seu principal da host no banco de dados de Kerberos. Os programas de servidores sshd
,kshd
e klogind
também precisam de acesso às chaves para o principal dos serviços da host. Além disso, para usar os serviços rsh
e rlogin
, esta estação de trabalho deve ter um pacote xinetd
instalado.
Usar kadmin
adiciona um principal para a estação de trabalho no KDC. Neste caso, a instância é o nome da máquina (estação de trabalho). Use a opção -randkey
para o comando addprinc
do kadmin
para criar o principal e atribuí-lo com uma chave randômica:
addprinc -randkey host/blah.example.com
Agora que o principal foi criado, as chaves podem ser extraídas para a estação de trabalho executando o kadmin
na própria estação de trabalho, e usando o comando ktadd
no kadmin
:
ktadd -k /etc/krb5.keytab host/blah.example.com
Para usar outros serviços de rede kerberizados é necessário iniciá-los. Veja abaixo uma lista com alguns dos serviços kerberizados mais comuns e instruções para habilitá-los:
O comando OpenSSH ssh
— usa a GSS-API para autenticar usuários aos servidores, caso a configuração do client e server tenham o GSSAPIAuthentication
habilitado. Se o client também possuir um GSSAPIDelegateCredentials
habilitado, as credenciais do usuário serão disponibilizadas no sistema remoto.
rsh
e rlogin
— Para usar as versões kerberizadas do rsh
e do rlogin
, habilite klogin
, eklogin
, e kshell
.
Telnet — Para usar o Telnet kerberizado, o krb5-telnet
deve estar habilitado.
FTP — Para prover acesso ao FTP, crie e extraia uma chave para o principal com uma raiz de ftp
. Certifique-se de definir a instância para o nome da máquina do servidor FTP, e então habilite o gssftp
.
IMAP — Para usar um servidor IMAP kerberizado, o pacote cyrus-imap
usa o Kerberos 5 se o pacote cyrus-sasl-gssapi
também estiver instalado. O pacote cyrus-sasl-gssapi
contém os plugins do Cyrus SASL os quais oferecem suporte à autenticação usando a GSS-API. O Cyrus IMAP deve funcionar adequadamente com o Kerberos conquanto o usuário cyrus
possa encontrar a chave apropriada em /etc/krb5.keytab
, e a root (raiz) para o principal esteja configurada para imap
(criada com kadmin
).
Uma alternativa para o cyrus-imap
pode ser o pacote dovecot
, o qual também é incluído no Red Hat Enterprise Linux. Este pacote contém um servidor IMAP mas até o momento não suporta a GSS-API e o Kerberos.
CVS — Para usar um servidor CVS kerberizado, o gserver
usa um principal com uma raiz (root) cvs
e é idêntico ao CVS pserver
em todos os outros aspectos.
Quando um client tenta acessar um serviço que esteja rodando em um server específico, ele sabe o nome do serviço (host) e o nome do server (foo.example.com), mas como é possível que mais de um território seja implementado na sua rede de trabalho, ele precisa adivinhar o nome do território, no qual o serviço se encontra.
Por padrão, o nome do território é o mesmo do domínio DNS do server, com letras maiúsculas.
foo.example.org → EXAMPLE.ORG
foo.example.com → EXAMPLE.COM
foo.hq.example.com → HQ.EXAMPLE.COM
Em algumas configurações, isto será suficiente. No entanto, em outras, o nome do território de origem será o nome de um território não existente. Nesses casos, desde o mapeamento do nome de domínio DNS do server até o mapeamento do nome de seu território, deve ser especificado na seção domain_realm do krb5.conf
do sistema do client. Como por exemplo:
[domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM
A configuração acima, especifica dois mapeamentos. O primeiro, especifica que qualquer sistema no domínio DNS "example.com" pertence ao território EXAMPLE.COM. O segundo, especifica que um sistema com um nome exato de "exemplo.com", também é um território. (A distinção entre o domínio e uma host específica é a presença ou falta de um"." inicial). O mapeamento também pode ser armazenado diretamente no DNS.
Por inúmeras razões, você pode preferir rodar KDCs múltiplos para um dado território. Nesse caso, um KDC (o master KDC) mantém uma cópia escrita do banco de dados do território e roda o kadmind
( também é o servidor administrativo do território), e um ou mais KDCs (KDCs escravos) mantém cópias de somente leitura do banco de dados e roda o kpropd
.
O procedimento de propagação do mestre-escravo, faz com que o KDC mestre despeje seu banco de dados em um arquivo de despejo temporário e então transfira este arquivo para cada um de seus escravos, que irão por conseqüência sobrescrever suas cópias de somente leitura, previamente recebidas, do banco de dados com o conteúdo do arquivo de despejo.
Antes de mais nada, para configurar um KDC escravo, assegure-se que os arquivos krb5.conf
e kdc.conf
de KDC mestre sejam copiados para o KDC escravo.
Inicie o kadmin.local
a partir de uma janela root no KDC mestre e use seu comando add_principal
para criar uma entrada nova para o serviço host do KDC mestre. Depois disso, use seu comando ktadd
para ajustar simultaneamente uma chave aleatória para o serviço e armazene a chave aleatória no arquivo keytab padrão do mestre. Esta chave será usada pelo comando kprop
para autenticar servidores de escravo. Você precisará fazer isto somente uma vez, não importanto quantos servidores de escravos você instalar.
#
kadmin.local -r EXAMPLE.COM
Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin:
add_principal -randkey host/masterkdc.example.com
Principal "host/host/masterkdc.example.com@EXAMPLE.COM" created. kadmin:
ktadd host/masterkdc.example.com
Entry for principal host/masterkdc.example.com with kvno 3, encryption type Triple DES cbc mode with \ HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/masterkdc.example.com with kvno 3, encryption type ArcFour with HMAC/md5 \ added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/masterkdc.example.com with kvno 3, encryption type DES with HMAC/sha1 added \ to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/masterkdc.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 \ added to keytab WRFILE:/etc/krb5.keytab. kadmin:
quit
Inicie o kadmin.local
a partir de uma janela root no KDC escravo e use seu comando add_principal
para criar uma entrada nova para o serviço host do KDC escravo. Depois disso, use o comando ktadd
do kadmin
para ajustar simultaneamente uma chave aleatória para o serviço e armazenar a chave aleatória no arquivo keytab padrão do escravo. Esta chave será usada pelo comando kprop
para autenticar clients.
#
kadmin -p jimbo/admin@EXAMPLE.COM -r EXAMPLE.COM
Authenticating as principal jimbo/admin@EXAMPLE.COM with password. Password for jimbo/admin@EXAMPLE.COM:
kadmin:
add_principal -randkey host/slavekdc.example.com
Principal "host/slavekdc.example.com@EXAMPLE.COM" created. kadmin:
ktadd host/slavekdc.example.com@EXAMPLE.COM
Entry for principal host/slavekdc.example.com with kvno 3, encryption type Triple DES cbc mode with \ HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/slavekdc.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added \ to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/slavekdc.example.com with kvno 3, encryption type DES with HMAC/sha1 added \ to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/slavekdc.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added \ to keytab WRFILE:/etc/krb5.keytab. kadmin:
quit
Com a chave de serviço do KDC escravo, é possível autenticar qualquer client que se conectar a ele. É claro que nem todos eles têm a permissão para oferecer o serviço kprop
do escravo com um banco de dados de território novo. Para restringir acesso, o serviço kprop
no KDC escravo somente aceitará atualizações de clients que tiverem nomes principais listados no /var/kerberos/krb5kdc/kpropd.acl
. Adicione o nome de serviço host do KDC mestre a este arquivo.
#
echo host/masterkdc.example.com@EXAMPLE.COM > /var/kerberos/krb5kdc/kpropd.acl
Quando o escravo obtiver uma cópia do banco de dados, ele também precisará da chave mestre, que foi utilizada para criptografá-lo. Se a chave mestre do banco de dados do KDC estiver armazenada em um arquivo stash no KDC mestre (geralmente chamado de /var/kerberos/krb5kdc/.k5.REALM
), copie para o KDC escravo usando qualquer método seguro disponível, ou crie um banco de dados fictício e um arquivo stash no KDC escravo executando o kdb5_util create -s
(o banco de dados fictíco será sobrescrito pela primeira propagação de banco de dados com sucesso) e fornecendo a mesma senha.
Assegure-se de que o firewall do KDC escravo permite que o KDC mestre o contate usando TCP na porta 754 (krb5_prop), e inicie o serviço kprop
. Depois, verifique novamente se o serviço kadmin
está desabilitado.
Agora faça um teste manual de propagação de banco de dados, despejando o banco de dados do território, dentro do KDC mestre, para o arquivo de dados padrão que será lido pelo comando kprop
(/var/kerberos/krb5kdc/slave_datatrans
) e use o comando kprop
para transferir seu conteúdo para o KDC escravo.
#
/usr/kerberos/sbin/kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
#
kprop slavekdc.example.com
Usando o kinit
, certifique-se que um sistema cliente contendo um krb5.conf
que liste apenas o KDC escravo na sua lista de KDCs para o seu território, pode obter, corretamente, credenciais iniciais a partir do KDC escravo.
Concluindo isto, simplesmente crie um script que despeja o banco de dados do território e executa o comando kprop
para transferir o banco de dados para cada KDC escravo, um de cada vez, e configure o serviço cron
para executar o script periodicamente.
Autenticação cross-realm é um termo utilizado para descrever situações em que os clientes (usuários comuns) de um território usam o Kerberos para autenticar serviços (geralmente processos de server rodando um um sistema server específico) que pertencem a um outro território.
No caso mais simples, para que um cliente de um território A.EXAMPLE.COM
possa acessar um serviço no território B.EXAMPLE.COM
, ambos devem ter uma chave de um principal krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM
e ambas as chaves devem possuir o mesmo número de versão da chave associado a eles.
Para concluir esta tarefa, selecione uma senha segura e uma frase secreta, e crie uma entrada para o principal em ambos os territórios, usando o kadmin.
#
kadmin -r A.EXAMPLE.COM
kadmin:
add_principal krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM
Enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Re-enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM" created.
quit
#
kadmin -r B.EXAMPLE.COM
kadmin:
add_principal krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM
Enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Re-enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM" created.
quit
Use o comando get_principal
para se certificar que ambas as entradas possuem números de versões de chaves que combinem (valores kvno
) e tipos de criptografia.
Os administradores preocupados com a segurança podem tentar usar a opção -randkey
do comando add_principal
para atribuir uma chave aleatória ao invés de uma senha, despejar uma nova entrada a partir do banco de dados do primeiro território e importá-la para o segundo. Isto não irá funcionar, a não ser que as chaves mestras dos bancos de dados do território sejam idênticas, pois as chaves contidas em um despejo de banco de dados são criptografadas por si só, usando a chave mestra.
Clientes do território A.EXAMPLE.COM
podem agora autenticar serviços no território B.EXAMPLE.COM
. Ou seja, o território B.EXAMPLE.COM
pode agora confiar no território A.EXAMPLE.COM
ou ainda em outras palavras, B.EXAMPLE.COM
agora confia no A.EXAMPLE.COM
.
Isto nos leva a um ponto crucial: a confiança cross-realm é unidirecional por padrão. O KDC do território B.EXAMPLE.COM
pode confiar em clientes do A.EXAMPLE.COM
para se autenticarem em serviços no território B.EXAMPLE.COM
, mas na verdade não importa se os clientes no território B.EXAMPLE.COM
são confiáveis para se autenticarem em serviços no território A.EXAMPLE.COM
ou não. Para estabelecer confiança no inverso, ambos os territórios deveriam precisar compartilhar chaves para o serviço krbtgt/A.EXAMPLE.COM@B.EXAMPLE.COM
(observe a ordem inversa dos dois territórios comparado ao exemplo acima).
Se o relacionamento de confiança fosse somente um método para oferecer confiança aos dois territórios, seria muito difícil configurar as redes de trabalho que contém territórios múltiplos. Felizmente, a confiança cross-realm é transitiva. Se clientes de um A.EXAMPLE.COM
puderem autenticar serviços no B.EXAMPLE.COM
, e clientes do B.EXAMPLE.COM
puderem autenticar serviços no C.EXAMPLE.COM
, então os clientes do A.EXAMPLE.COM
também podem autenticar serviços em C.EXAMPLE.COM
, até mesmo se C.EXAMPLE.COM
não confiar em A.EXAMPLE.COM
. Isto significa que, em uma rede de trabalho com territórios múltiplos que precisem confiar uns nos outros, fazendo boas escolhas sobre quais relacionamentos confiar para configurar, podem reduzir relativamente os esforços requeridos.
Agora, você tratará dos problemas mais convencionais: o sistema do cliente deve ser configurado para que deduza melhor o território que pertence a um serviço específico, assim como precisa ser capaz de determinar como obter credenciais para serviços neste território.
Antes de mais nada: o nome principal para um serviço fornecido por um sistema de servidor específico em um território se parece com este a seguir:
service/server.example.com@EXAMPLE.COM
Neste exemplo, o serviço é o nome do protocolo em uso (outros valores comums incluem ldap, imap, cvs e HTTP), que pode ser substituído por host. O server.example.com é o nome do domínio do sistema totalmente qualificado, que executa o serviço e EXAMPLE.COM
é o nome do território.
Para deduzir o território do serviço ao qual ele pertence, os clientes irão consultar o DNS ou a seção domain_realm
do /etc/krb5.conf
para mapear tanto um hostname (server.example.com) quanto um nome de domínio DNS (.example.com) para o nome de um território (EXAMPLE.COM).
Após determinar a que território o serviço pertence, um cliente precisa então determinar o conjunto de territórios que ele precisa para contatar, e em qual ordem ele deve fazê-lo para obter credenciais para o uso ao autenticar o serviço.
Isto pode ser feito de duas maneiras.
O método padrão, que não requer configuração explícita, deve nomear os territórios dentro de uma hierarquia compartilhada. Por exemplo, suponha que se tenha territórios chamados A.EXAMPLE.COM
, B.EXAMPLE.COM
e EXAMPLE.COM
. Quando um cliente no território A.EXAMPLE.COM
, tentar autenticar o serviço em B.EXAMPLE.COM
, ele irá, por padrão, primeiro tentar obter credenciais para o território EXAMPLE.COM
, e depois usar estas credenciais para obter outras, para usar no territórioB.EXAMPLE.COM
.
O cliente nesta situação, trata o nome do território como se estivesse tratando de um nome DNS. Ele retira os componentes do seu próprio nome de território para gerar nomes de territórios que estejam "acima" dele na hierarquia até que alcance um ponto que também esteja "acima " do território dos serviços. Neste momento, ele começa a passar os componentes do nome do território do serviço na frente até que ele alcance o território do serviço. Cada território envolvido no processo é um outro "salto".
Por exemplo, usando credenciais em A.EXAMPLE.COM
, autenticando um serviço em B.EXAMPLE.COM
:
A.EXAMPLE.COM → EXAMPLE.COM → B.EXAMPLE.COM
A.EXAMPLE.COM
e EXAMPLE.COM
compartilha chave para krbtgt/EXAMPLE.COM@A.EXAMPLE.COM
EXAMPLE.COM
e B.EXAMPLE.COM
compartilha uma chave para krbtgt/B.EXAMPLE.COM@EXAMPLE.COM
Outro exemplo usando credenciais em SITE1.SALES.EXAMPLE.COM
, autenticando um serviço em EVERYWHERE.EXAMPLE.COM
:
SITE1.SALES.EXAMPLE.COM → SALES.EXAMPLE.COM → EXAMPLE.COM → EVERYWHERE.EXAMPLE.COM
SITE1.SALES.EXAMPLE.COM
e SALES.EXAMPLE.COM
compartilham uma chave para krbtgt/SALES.EXAMPLE.COM@SITE1.SALES.EXAMPLE.COM
SALES.EXAMPLE.COM
e EXAMPLE.COM
compartilham uma chave para krbtgt/EXAMPLE.COM@SALES.EXAMPLE.COM
EXAMPLE.COM
e EVERYWHERE.EXAMPLE.COM
compartilham uma chave para krbtgt/EVERYWHERE.EXAMPLE.COM@EXAMPLE.COM
Outro exemplo, desta vez usando nomes de territórios que não compartilham de um sufixo em comum (DEVEL.EXAMPLE.COM
e PROD.EXAMPLE.ORG
):
DEVEL.EXAMPLE.COM → EXAMPLE.COM → COM → ORG → EXAMPLE.ORG → PROD.EXAMPLE.ORG
DEVEL.EXAMPLE.COM
e EXAMPLE.COM
compartilham uma chave para krbtgt/EXAMPLE.COM@DEVEL.EXAMPLE.COM
EXAMPLE.COM
e COM
compartilham uma chave para krbtgt/COM@EXAMPLE.COM
COM
e ORG
compartilham uma chave para krbtgt/ORG@COM
ORG
e EXAMPLE.ORG
compartilham uma chave para krbtgt/EXAMPLE.ORG@ORG
EXAMPLE.ORG
e PROD.EXAMPLE.ORG
compartilham uma chave para krbtgt/PROD.EXAMPLE.ORG@EXAMPLE.ORG
O método mais complicado, porém mais flexível, envolve a configuração da seção capaths
do /etc/krb5.conf
, para que os clientes que tiverem credenciais para um território, possam procurar qual território é o próximo na corrente que irá finalmente levar à autenticação dos servidores.
O formato da seção capaths
é relativamente direta: cada entrada na seção é nomeada com o nome de um território com cliente. Dentro desta subseção, o conjunto de territórios intermediários do qual o cliente deve obter credenciais, está listado como valores de chaves que corresponde a um território que possui um serviço. se não existir territórios intermediários, utiliza-se o valor "."
Segue abaixo um exemplo:
[capaths]
A.EXAMPLE.COM = {
B.EXAMPLE.COM = .
C.EXAMPLE.COM = B.EXAMPLE.COM
D.EXAMPLE.COM = B.EXAMPLE.COM
D.EXAMPLE.COM = C.EXAMPLE.COM
}
Neste exemplo, clientes no território A.EXAMPLE.COM
podem obter credenciais cross-realm para B.EXAMPLE.COM
diretamente do KDC A.EXAMPLE.COM
.
Se estes clientes desejarem contatar um serviço no território C.EXAMPLE.COM
, eles precisarão obter credenciais do território B.EXAMPLE.COM
(a existência de um krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM
é crucial) e então usar estas
credenciais para obter credenciais a serem usadas no território C.EXAMPLE.COM
(usando krbtgt/C.EXAMPLE.COM@B.EXAMPLE.COM
).
Se estes clientes desejarem contatar um serviço no território D.EXAMPLE.COM
eles primeiro precisarão obter credenciais do território B.EXAMPLE.COM
, e então credenciais do território C.EXAMPLE.COM
, antes de finalmente obter as credenciais para uso no território D.EXAMPLE.COM
.
Sem uma entrada capath indicando o oposto, o Kerberos presume que os relacionamentos de confiança do cross-realm formam uma hierarquia.
Clientes no território A.EXAMPLE.COM
podem obter credenciais cross-realm diretamente de um território B.EXAMPLE.COM
. Sem o "." indicando isto, o cliente tentaria usar um caminho hierárquico, neste caso:
A.EXAMPLE.COM → EXAMPLE.COM → B.EXAMPLE.COM
Para mais informações sobre o Kerberos, consulte os seguintes recursos.
O Guia de Instalação Kerberos V5 e o Guia do Administrador de Sistemas Kerberos V5 S nos formatos PostScript e HTML. Os mesmos podem ser encontrados no diretório /usr/share/doc/krb5-server-
(onde <version-number>
/<version-number>
é o número da versão do pacote krb5-server
instalado no seu sistema.
O Guia do Usuário Kerberos V5 UNIX em formatos PostScript e HTML podem ser encontrados em/usr/share/doc/krb5-workstation-
(onde <version-number>
/<version-number>
é o número da versão do pacote krb5-workstation
instaladono seu sistema).
Páginas man do Kerberos — Há diversas páginas man para os diversos aplicativos e arquivos de configuração envolvidos na implementação do Kerberos. A seguir uma lista com algumas das páginas man mais importantes.
man kerberos
— Uma introdução ao sistema Kerberos que descreve o funcionamento das credenciais e fornece recomendações para obter e destruir tickets do Kerberos. O final da página man referencia diversas páginas man relacionadas.
man kinit
— Descreve como usar este comando para obter e criar o cache de um ticket-granting ticket.
man kdestroy
— Descreve como usar este comando para destruir credenciais do Kerberos.
man klist
— Descreve como usar este comando para listar credenciais cacheadas do Kerberos.
man kadmin
— Descreve como usar este comando para administrar o banco de dados do Kerberos V5.
man kdb5_util
— Descreve como usar este comando para criar e executar funções administrativas de nível baixo no banco de dados do Kerberos V5.
man krb5kdc
— Descreve as opções de linha de comando disponíveis para o Kerberos V5 KDC.
man kadmind
— Descreve as opções de linha de comando do servidor de administração do Kerberos V5.
man krb5.conf
— Descreve o formato e as opções do arquivo de configuração da biblioteca do Kerberos V5.
man kdc.conf
— Descreve o formato e as opções disponíveis do arquivo de configuração do AS e do KDC do Kerberos V5.
A página da web do MIT http://web.mit.edu/kerberos/www/ — Kerberos:The Network Authentication Protocol.
http://www.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html — As Perguntas Mais Freqüentes do Kerberos (FAQ).
ftp://athena-dist.mit.edu/pub/kerberos/doc/usenix.PS — A versão PostScript de Kerberos: An Authentication Service for Open Network Systems de Jennifer G. Steiner, Clifford Neuman e Jeffrey I. Schiller. Este é o documento original que descreve o Kerberos.
http://web.mit.edu/kerberos/www/dialogue.html — Designing an Authentication System: a Dialogue in Four Scenes original de Bill Bryant em 1988, modificado por Theodore Ts'o em 1997. Este documento é uma conversa entre dois desenvolvedores que pensam na criação de um sistema de autenticação no estilo do Kerberos. O aspecto informal da discussão faz deste um ponto de partida ideal para pessoas que não são familiares ao Kerberos.
http://www.ornl.gov/~jar/HowToKerb.html — How to Kerberize your site é uma boa referência para kerberizar uma rede.
http://www.networkcomputing.com/netdesign/kerb1.html — Kerberos Network Design Manual é uma visão geral completa do sistema Kerberos.
Empresas com vários escritórios satélite freqüentemente conectam-se com linhas dedicadas por razões de eficiência e de proteção de dados privativos em trânsito. Por exemplo, várias empresas usam linhas frame relay ou Asynchronous Transfer Mode (ATM) como uma solução de rede de ponta-a-ponta para interligar escritórios. Isto pode ser uma alternativa cara, especialmente para pequenas e médias empresas que queiram expandir sem arcar com os altos custos associados a circuitos digitais dedicados, de nível corporativo.
Para atender à esta necessidade, foram desenvolvidas as Redes Privadas Virtuais (Virtual Private Networks - VPNs). Seguindo os mesmos princípios funcionais dos circuitos dedicados, as VPNs permitem a comunicação digital protegida entre duas partes (ou redes), criando uma Rede Geograficamente Distribuída (Wide Area Network - WAN) a partir de Redes de Áreas Locais (LANs) existentes. Ela difere do frame relay ou do ATM em seu meio de transporte. As VPNs transmitem através de IP usando datagramas como a camada de transporte, tornando-o um condutor seguro através da Internet, para um determinado destino. A maioria das implementações VPN de software livre incorporam métodos de criptografia de padrão aberto para mascarar ainda mais os dados em trânsito.
Algumas empresas aplicam soluções VPN de hardware para aumentar a segurança, enquanto outras usam software ou implementações baseadas em protocolos. Há diversos fabricantes de soluções VPNde hardware como Cisco, Nortel, IBM e Checkpoint. Existe uma solução VPN baseada em software livre para Linux chamada FreeS/Wan, que utiliza uma implementação Internet Protocol Security (IPSec). Estas soluções VPN, independentemente de serem baseadas em hardware ou software, atuam como roteadores especializados situados entre as conexões IP de dois escritórios.
Quando um pacote é transmitido a partir de um cliente, é enviado através do roteador ou gateway VPN, o qual adiciona um Cabeçalho de Autenticação (Authentication Header - AH) para o roteamento e autenticação. Os dados são então criptografados e, finalmente, fechados com um Encapsulating Security Payload (ESP). Este último estabelece as instruções de descriptografia e manuseio.
O roteador VPN receptor depura as informações de cabeçalho, descriptografa os dados e os roteia ao destino pretendido (uma estação de trabalho ou um nó em uma rede). Usando uma conexão rede-a-rede, o nó receptor da rede local recebe os pacotes descriptografados e prontos para processar. O processo de criptografia/descriptografia numa conexão VPN rede-a-rede é transparente para o nó local.
Com um nível tão elevado de segurança, não basta ao cracker interceptar o pacote, mas também descriptografar o pacote. Intrusos que aplicarem um ataque man-in-the-middle entre um servidor e o cliente também devem ter acesso à pelo menos uma das chaves privadas para sessões de autenticação. Como aplicam diversas camadas de autenticação e criptografia, as VPNs são um meio seguro e efetivo para conectar múltiplos nós remotos para atuar como uma intranet unificada.
Os usuários do Red Hat Enterprise Linux têm várias opções em termos de implementação de uma solução de software para conectar à sua WAN com segurança. A Segurança do Protocolo de Internet, ou IPsec, é a implementação VPN suportada pelo Red Hat Enterprise Linux que atende às necessidades de usabilidade de empresas com filiais ou usuários remotos.
O Red Hat Enterprise Linux suporta o IPsec para conectar hosts e redes remotos entre si usando um túnel seguro em uma rede de transporte comum, como a Internet. O IPsec pode ser implementado usando uma configuração host-a-host (uma estação de trabalho conectada a outra) ou rede-a-rede (uma LAN/WAN conectada à outra).
A implementação do IPsec no Red Hat Enterprise Linux usa Troca de Chave de Internet (Internet Key Exchange, IKE), um protocolo implementado pelo IETF (Internet Engineering Task Force) para ser usado em autenticação mútua e proteger associações entre sistemas conectados.
Uma conexão IPsec é dividida em duas fases lógicas. Na fase 1, um nó do IPsec inicia a conexão com o nó ou rede remota. O nó/rede remota verifica as credenciais do nó solicitante e ambas partes negociam o método de autenticação da conexão.
Nos sistemas Red Hat Enterprise Linux, uma conexão IPsec usa o método de chave pré-compartilhada (pre-shared key) para autenticação do nó IPsec. Numa conexão IPsec com chave pré-compartilhada, ambos hosts devem usar a mesma chave para prosseguir à segunda fase da conexão IPsec.
Durante a fase 2 de uma conexão IPsec é criada uma associação de segurança (security association, SA) entre os nós IPsec. Essa fase estabelece um banco de dados de SAs com informações de configuração, como o método de criptografia, parâmetros de troca de chaves de sessões secretas, dentre outras. Essa fase administra a conexão IPsec entre nós e redes remotas.
A implementação do IPsec no Red Hat Enterprise Linux usa IKE para compartilhar chaves entre hosts ao longo da Internet. O daemon do chaveiro racoon
é responsável pela distribuição e troca de chaves IKE. Consulte a página man do racoon
para maiores informações sobre este daemon.
A implementação do IPsec requer a instalação do pacote RPM ipsec-tools
em todas os hosts IPsec (se usar uma configuração host-a-host) ou roteadores IPsec (se usar uma configuração rede-a-rede). O pacote RPM contém bibliotecas, daemons e arquivos de configuração essenciais para auxiliar na configuração da conexão IPsec , incluindo:
/sbin/setkey
— manipula o gerenciamento da chave e atributos de segurança do IPsec no kernel. Este executável é controlado pelo daemon de gerenciamento da chave racoon
. Para mais informações, consulte a página man (8) do setkey
.
/sbin/racoon
— O daemon de gerenciamento do IKE, usado para gerenciar e controlar a segurança de associações e compartilhamento de chave entre sistemas conectados através do IPsec.
/etc/racoon/racoon.conf
— o arquivo de configuração do daemon do racoon
usado para configurar vários aspectos da conexão IPsec, incluindo métodos de autenticação e algoritmos de criptografia usados na conexão. Para uma lista completa das diretivas disponíveis, consulte a página man (5) do racoon.conf
.
Para configurar o IPsec no Red Hat Enterprise Linux, você pode usar a Ferramenta de Administração de Rede, ou editar manualmente os arquivos de configuração de rede e do IPsec.
Para conectar dois hosts em rede através do IPsec, consulte a Seção 2.7.6, “Configuração Host-a-Host do IPsec”.
Para conectar uma LAN/WAN à outra através do IPsec, consulte a Seção 2.7.7, “Configuração Rede-a-Rede do IPsec”.
O IPsec pode ser configurado para conectar um computador pessoal ou estação de trabalho a outra através de uma conexão host-a-HOST. Este tipo de conexão utiliza a rede à qual cada host está conectado para criar um túnel seguro entre eles. Os requisitos de uma conexão host-a-host são mínimos, assim como a configuração do IPsec em cada host. Os hosts precisam somente de uma conexão dedicada a uma rede de transporte (como a Internet) e do Red Hat Enterprise Linux para criar a conexão do IPsec.
Uma conexão host-a-host do IPsec é uma conexão criptografada entre dois sistemas ambos rodando o IPsec com a mesma chave de autenticação. Enquanto a conexão do IPsec estiver ativa, qualquer tráfego na rede entre os dois hosts é criptografado.
Para configurar um conexão host-a-host do IPsec, use os seguintes passos em cada host:
Você deve executar os seguintes procedimentos na máquina que você estiver configurando. Evite a tentar configurar e estabelecer conexões IPsec remotamente.
Em uma janela de comandos, digite system-config-network
para iniciar a Ferramenta de Administração de Rede.
Na aba IPsec, clique no botão Nova para iniciar o assistente de configuração do IPsec.
Clique em Avançar para iniciar a configuração de uma conexão host-a-host do IPsec.
Digite um nome único para a conexão, por exemplo, ipsec0
. Se necessário, selecione a caixa de verificação para ativar a conexão automaticamente quando o computador iniciar. Clique em Avançar para continuar.
Selecione Criptografia Host a Host como tipo de conexão, e então clique em Avançar.
Selecione o tipo de criptografia a ser usado: manual ou automático.
Se você selecionar criptografia manual, uma chave de criptografia deve ser fornecida mais tarde durante o processo. Se você selecionar criptografia automática, o daemon do racoon
gerencia a chave de criptografia. O pacote ipsec-tools
deve ser instalado se você quiser usar criptografia automática.
Clique em Avançar para continuar.
Digite o endereço IP do host remoto.
Para determinar o endereço IP do host remoto, use o seguinte comandono host remoto:
[root@myServer ~] # /sbin/ifconfig <dispositivo>
onde <device>
é o dispositivo Ethernet que você deseja usar para a conexão VPN.
Se houver apenas uma placa de Ethernet no sistema, o nome do dispositivo normalmente é eth0. O seguinte exemplo, mostra as informações relevantes deste comando (note que isto é apenas um exemplo de saída):
eth0 Link encap:Ethernet HWaddr 00:0C:6E:E8:98:1D inet addr:172.16.44.192 Bcast:172.16.45.255 Mask:255.255.254.0
O endereço IP é o número que aparece após a etiqueta inet addr:
.
Para conexões de host-to-host, ambos os hosts devem possuir um endereço rotável público. Como forma alternativa, ambos os hosts podem ter um endereço não-rotável privado (por exemplo, das classes 10.x.x.x or 192.168.x.x) desde que estejam na mesma LAN.
Se os hosts estiverem em LANs diferentes, ou um tiver um endereço público enquanto outro tiver um endereço privado, consulte a Seção 2.7.7, “Configuração Rede-a-Rede do IPsec”.
Clique em Avançar para continuar.
Se a criptografia manual foi selecionada no passo 6, especifique a chave de criptografia a ser usada, ou clique em Gerar para criar uma.
Especifique um chave de autenticação ou clique em Gerar para criar uma. Pode ser qualquer combinação de números e letras.
Clique em Avançar para continuar.
Verifique a informação na página IPsec — Resumo e então clique em Aplicar.
Clique em Arquivo => Salvar para salvar a configuração.
Você pode precisar reiniciar a rede para que as mudanças surtam efeito. Para reiniciar a rede, use o seguinte comando:
[root@myServer ~]# service network restart
Selecione a conexão IPsec na lista e clique no botão Ativar.
Repita o procedimento inteiro para o outro host. É essencial que as chaves do passo 8 sejam usadas nos outros hosts. Caso contrário, o IPsec não funcionará.
Após configurar a conexão IPsec, a mesma aparece na lista IPsec, conforme ilustrado na Figura 2.10, “Conexão IPsec”.
Os seguintes arquivos são criados quando a conexão IPsec for configurada:
/etc/sysconfig/network-scripts/ifcfg-
<apelido>
/etc/sysconfig/network-scripts/keys-
<apelido>
/etc/racoon/
<ip-remoto>
.conf
/etc/racoon/psk.txt
Se a criptografia automática também for selecionada, /etc/racoon/racoon.conf
também é criado.
Assim que a interface estiver ativa, o /etc/racoon/racoon.conf
é modificado para incluir o
.
<ip-remoto>
.conf
O primeiro passo para criar uma conexão é coletar as informações de sistemas e de rede de cada estação de trabalho. Para uma conexão host-a-host, você precisa das seguintes informações:
O endereço IP de cada host
Um nome único, por exemplo, ipsec1
. Este nome é usado para identificar a conexão IPsec e para distinguí-la de outros dispositivos ou conexões.
Uma chave fixa de criptografia ou uma gerada automaticamente pelo racoon
.
Uma chave de autenticação pré-compartilhada, usada durante o estágio inicial da conexão e para trocar chaves de criptografia durante a sessão.
Por exemplo, suponha que as estações de trabalho A e B queiram se interconectar através de um túnel IPsec. Elas querem se conectar usando uma chave pré-compartilhada com o valor Key_Value01
e os usuários concordam em deixar que o racoon
gere automaticamente e compartilhe uma chave de autenticação entre cada host. Usuários de ambos os hosts decidem chamar suas conexões de ipsec1
.
Você deve escolher uma PSK que use uma mistura de caracteres de caixa alta e baixa, números e pontuação. Uma PSK fácil de adivinhar constitui um risco à segurança.
Não é necessário usar a mesmo nome de conexão para cada host. Você deve escolher um nome que seja conveniente e significativo para a sua instalação.
Veja a seguir o arquivo de configuração do IPsec da Estação de Trabalho A para uma conexão host-a-host do IPsec com a Estação de Trabalho B. O nome único para identificar a conexão, neste exemplo, é ipsec1
, e portanto o arquivo resultante é chamado /etc/sysconfig/network-scripts/ifcfg-ipsec1
.
DST=X.X.X.X
TYPE=IPSEC
ONBOOT=no
IKE_METHOD=PSK
A Estação de Trabalho A substituirá X.X.X.X
pelo endereço IP da estação de trabalho B, enquanto esta deve substituir X.X.X.X
pelo endereço IP da estação de trabalho A. Esta conexão não está configurada para iniciar na inicialização (ONBOOT=no
) e usa o método de autenticação de chave pré-compartilhada (IKE_METHOD=PSK
).
Veja a seguir o conteúdo do arquivo da chave pré-compartilhada (chamado /etc/sysconfig/network-scripts/keys-ipsec1
) que ambas estações de trabalho precisam para autenticarem-se entre si. O conteúdo deste arquivo deve ser idêntico nas duas estações de trabalho, e somente o usuário root deve poder acessar ou gravar (read or write) este arquivo.
IKE_PSK=Key_Value01
Para alterar o arquivo keys-ipsec1
para que somente o usuário root possa acessá-lo ou editá-lo, execute o seguinte comando após criar o arquivo:
[root@myServer ~] # chmod 600 /etc/sysconfig/network-scripts/keys-ipsec1
Para alterar a chave de autenticação a qualquer momento, edite o arquivo keys-ipsec1
nas duas estações de trabalho. As duas chaves devem ser idênticas para que a conexão funcione apropriadamente.
O próximo exemplo mostra a configuração específica para a conexão da fase 1 ao host remoto. O arquivo é nomeado como
, onde X.X.X.X
.confX.X.X.X
é substituído pelo endereço IP do host IPsec remoto. Note que este arquivo é gerado automaticamente quando o túnel IPsec é ativado e não deve ser editado diretamente.
remote X.X.X.X
{
exchange_mode aggressive, main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2 ;
}
}
O arquivo de configuração padrão da fase 1, criado quando uma conexão IPsec é iniciada, contém as seguintes declarações usadas pela implementação IPsec do Red Hat Enterprise Linux:
X.X.X.X
Especifica que as declarações subseqüentes deste arquivo de configuração aplicam-se somente ao nó remoto identificado pelo endereço IP X.X.X.X
.
A configuração padrão do IPsec no Red Hat Enterprise Linux usa um método de autenticação agressivo, que reduz a sobrecarga da conexão enquanto permite a configuração de diversas conexões IPsec com hosts múltiplos.
Define o método de identificação a ser usado na autenticação dos nós. O Red Hat Enterprise Linux usa endereços IP para identificar os nós.
Define a cifra de criptografia usada durante a autenticação. Por padrão, o Triple Data Encryption Standard (3DES) é usado.
Especifica o algoritmo de hash usado durante a negociação entre nós da fase 1. Por padrão, usa-se o Secure Hash Algorithm versão 1.
Define o método de autenticação usado durante a negociação dos nós. Por padrão, o Red Hat Enterprise Linux usa chaves pré-compartilhadas para autenticação.
Especifica o número do grupo Diffie-Hellman para estabelecer chaves de sessões geradas dinamicamente. Por padrão, modp1024 (grupo 2) é usado.
Os arquivos /etc/racoon/racoon.conf
devem ser idênticos em todos os nós IPsec, exceto pela declaração include "/etc/racoon/
. Esta declaração (e o arquivo que referencia) é gerada quando o túnel IPsec é ativado. Para a Estação de Trabalho A, X.X.X.X
.conf"X.X.X.X
na declaração include
é o endereço IP da Estação de Trabalho B. O oposto vale para a Estação de Trabalho B. Veja a seguir um arquivo racoon.conf
típico quando a conexão IPsec é ativada.
# Racoon IKE daemon configuration file. # See 'man racoon.conf' for a description of the format and entries. path include "/etc/racoon"; path pre_shared_key "/etc/racoon/psk.txt"; path certificate "/etc/racoon/certs"; sainfo anonymous { pfs_group 2; lifetime time 1 hour ; encryption_algorithm 3des, blowfish 448, rijndael ; authentication_algorithm hmac_sha1, hmac_md5 ; compression_algorithm deflate ; } include "/etc/racoon/X.X.X.X.conf";
Este arquivo racoon.conf
padrão inclui localidades definidas para a configuração do IPsec, arquivos de chaves pré-compartilhadas e certificados. Os campos sainfo anonymous
descrevem a SA da fase 2 entre os nós IPsec — a natureza da conexão IPsec (incluindo os algoritmos suportados de criptografia usados) e o método de troca de chaves. A lista a seguir define os campos da fase 2:
Denota que a SA pode iniciar anonimamente com qualquer par desde que as credenciais IPsec coincidam.
Define o protocolo Diffie-Hellman de troca de chaves, o que determina o método através do qual os nós do IPsec estabelecem uma chave de sessão temporária mútua para a segunda fase da conectividade IPsec. Por padrão, a implementação IPsec do Red Hat Enterprise Linux usa o grupo 2 (ou modp1024
) dos grupos de troca de chave criptográfica Diffie-Hellman. O grupo 2 usa uma exponenciação modular de 1024 bits, evitando que atacantes descriptografem transmissões IPsec anteriores, mesmo que uma chave privada seja comprometida.
Este parâmetro especifica o ciclo de vida de uma SA e pode ser quantificado por hora ou bytes de dados. A implementação IPsec do Red Hat Enterprise Linux especifica o tempo de uma hora.
Especifica as cifras de criptografia suportadas para a fase 2. O Red Hat Enterprise Linux suporta 3DES, 448-bit Blowfish e Rijndael (a cifra usada no Advanced Encryption Standard ou AES).
Lista os algoritmos de hash suportados para autenticação. Os modos suportados são os códigos de autenticação de mensagem sha1 e md5 hashed (HMAC).
Define o algoritmo Deflate de compressão para suporte à IP Payload Compression (IPCOMP), que permite a transmissão potencialmente mais rápida de datagramas IP através de conexões lentas.
Para iniciar a conexão, execute o seguinte comando em cada host:
[root@myServer ~]# /sbin/ifup <apelido>
onde <apelido> é o nome que você especificou para a conexão IPsec.
Para testar a conexão IPsec, execute o utilitário tcpdump
para visualizar os pacotes de rede sendo transferidos entre os hosts (ou redes) e verificar se estão criptografados usando o IPsec. O pacote deve incluir um cabeçalho AH e deve ser exibido como pacotes ESP. ESP significa que está criptografado. Por exemplo,
[root@myServer ~]# tcpdump -n -i eth0 host <sistemaAlvo> IP 172.16.45.107 > 172.16.44.192: AH(spi=0x0954ccb6,seq=0xbb): ESP(spi=0x0c9f2164,seq=0xbb)
O IPsec também pode ser configurado para conectar uma rede inteira (como uma LAN ou WAN) à uma rede remota através de uma conexão rede-a-rede. Este tipo de conexão requer a configuração de roteadores IPsec em cada lado das redes conectadas para processar e rotear transparentemente informações de um nó de uma LAN para outro nó de uma LAN remota. A Figura 2.11, “Uma conexão IPsec rede-a-rede passando por um túnel” mostra uma conexão IPsec rede-a-rede passando por um túnel.
Uma conexão IPsec rede-a-rede passando por um túnel
O diagrama mostra duas LANs separadas pela Internet. Estas LANs usam roteadores IPsec para autenticar e iniciar uma conexão, usando um túnel seguro através da Internet. Os pacotes interceptados em trânsito requerem descriptografia de força bruta para quebrar a cifra protegendo os pacotes entre estas LANs. O processo de comunicação entre um nó no intervalo de IP 192.168.1.0/24 e outro no 192.168.2.0/24 é completamente transparente aos nós, já que o processamento, criptografia/descriptografia e roteamento dos pacotes IPsec são executados inteiramente pelo roteador IPsec.
As informações necessárias para uma conexão rede-a-rede incluem:
Os endereços IP externamente acessíveis dos roteadores IPsec dedicados
Os intervalos de endereços de rede da LAN/WAN servida pelos roteadores IPsec, tal como 192.168.1.0/24 ou 10.0.1.0/24)
Os endereços IP dos dispositivos de gateway que roteiam os dados dos nós da rede para a Internet
Um nome único, por exemplo, ipsec1
. Este nome é usado para identificar a conexão IPsec e para distinguí-la de outros dispositivos ou conexões.
Uma chave fixa de criptografia ou uma gerada automaticamente pelo racoon
Uma chave de autenticação pré-compartilhada, usada durante o estágio inicial da conexão e para trocar chaves de criptografia durante a sessão.
Uma conexão IPsec rede-a-rede usa dois roteadores IPsec, um para cada rede, através dos quais o tráfego de rede para as sub-redes privadas é roteado.
Por exemplo, conforme ilustrado na Figura 2.12, “IPsec Rede-a-Rede”, se a rede privativa 192.168.1.0/24 manda tráfego de rede para a rede privativa 192.168.2.0/24, os pacotes passam pela gateway0 até o ipsec0, através da Internet, até o ipsec1, até a gateway1, e então chegam até a sub-rede 192.168.2.0/24.
Roteadores IPsec devem ter endereços IP endereçáveis publicamente, bem como outro dispositivo de Ethernet conectado às suas respectivas redes privativas. O tráfego passa por um roteador IPsec apenas se for destinado ao outro roteador IPsec com o qual uma conexão criptografada existe.
Opções de configuração de rede alternativas incluem um firewall entre cada roteador de IP e a Internet, e um firewall de intranet entre cada roteador IPsec e gateway de sub-rede. O roteador IPsec e a gateway para a sub-rede podem ser um mesmo sistema com dois dispositivos de Ethernet: um com um endereço IP público que age como o roteador IPsec; e um com um endereço IP privativo que age como a gateway para a sub-rede privativa. Cada roteador IPsec pode usar a gateway para sua própria rede privativa ou uma gateway pública para enviar os pacotes para o outro roteador IPsec.
Use o seguinte procedimento para configurar uma conexão IPsec rede-a-rede:
Em uma janela de comandos, digite system-config-network
para iniciar a Ferramenta de Administração de Rede.
Na aba IPsec, clique no botão Nova para iniciar o assistente de configuração do IPsec.
Clique em Avançar para começar a configurar uma conexão IPsec rede-a-rede.
Indique um apelido único para a conexão, por exemplo, ipsec0
. Se necessário, selecione a caixa de verificação para ativar a conexão automaticamente quando o computador iniciar. Clique em Avançar para continuar.
Selecione Criptografia de Rede-a-Rede (VPN) como tipo de conexão, e então clique em Avançar.
Selecione o tipo de criptografia a ser usado: manual ou automático.
Se você selecionar criptografia manual, uma chave de criptografia deve ser fornecida mais tarde durante o processo. Se você selecionar criptografia automática, o daemon do racoon
gerencia a chave de criptografia. O pacote ipsec-tools
deve ser instalado se você quiser usar criptografia automática.
Clique em Avançar para continuar.
Na página Rede Local, forneça as seguintes informações:
Endereço da Rede Local — O endereço IP do dispositivo no roteador IPsec conectado à rede privativa.
Máscara da Sub-Rede Local — A máscara da sub-rede do endereço IP da rede local.
Gateway da Rede Local — A gateway para a sub-rede privativa.
Clique em Avançar para continuar.
Na página Rede Remota, forneça as seguintes informações
Endereço IP Remoto — O endereço IP endereçável publicamente do roteador IPsec para a outra rede privativa. Em nosso exemplo, para o ipsec0, use o endereço IP endereçável publicamente do ipsec1, e vice versa.
Endereço da Rede Remota — O endereço de rede da sub-rede privativa atrás do outro roteador IPsec. No nosso exemplo, use 192.168.1.0
se estiver configurando o ipsec1, e use 192.168.2.0
se estiver configurando o ipsec0.
Máscara da Sub-Rede Remota — A máscara da sub-rede do endereço IP remoto.
Gateway da Rede Remota — O endereço IP da gateway do endereço de rede remoto.
Se a criptografia manual foi selecionada no passo 6, especifique a chave de criptografia a ser usada ou clique em Gerar para criar uma.
Especifique uma chave de autenticação ou clique em Gerar para criar uma. Esta chave pode ser qualquer combinação de números e letras.
Clique em Avançar para continuar.
Verifique a informação na página IPsec — Resumo e então clique em Aplicar.
Selecione Arquivo => Salvar para salvar a configuração.
Selecione a conexão IPsec da lista, e então clique em Ativar para ativar a conexão.
Habilitar encaminhamento de IP:
Edite /etc/sysctl.conf
e mude net.ipv4.ip_forward
para 1
.
Execute o seguinte comando para habilitar a alteração:
[root@myServer ~]# /sbin/sysctl -p /etc/sysctl.conf
O script de rede para ativar a conexão IPsec cria as rotas de rede automaticamente para enviar pacotes através do roteador IPsec, se necessário.
Por exemplo, suponha que a LAN A (lana.example.com) e LAN B (lanb.example.com) queiram se interconectar através de um túnel IPsec. O endereço de rede da LAN A está no intervalo 192.168.1.0/24, enquanto a LAN B usa o intervalo 192.168.2.0/24. O endereço IP da gateway é 192.168.1.254 para a LAN A e 192.168.2.254 para a LAN B. Os roteadores IPsec estão separados de cada gateway da LAN e usam dois dispositivos de rede: à eth0 é atribuído um endereço IP estático acessível externamente, que acessa à Internet, enquanto a eth1 atua como um ponto de roteamento para processar e transmitir pacotes da LAN de um nó da rede a outros nós da rede remota.
A conexão IPsec entre as redes usa uma chave pré-compartilhada com o valor r3dh4tl1nux
, e os administradores de A e B concordam em deixar que o racoon
gere automaticamente e compartilhe uma chave de autenticação entre cada um dos roteadores IPsec. O administrador da LAN A decide nomear a conexão IPsec como ipsec0
, enquanto o administrador da LAN B nomeia a conexão IPsec como ipsec1
.
Veja o conteúdo do arquivo ifcfg
para uma conexão IPsec rede-a-rede para a LAN A. O nome único para identificar a conexão neste exemplo é ipsec0
, portanto o arquivo resultante é nomeado como /etc/sysconfig/network-scripts/ifcfg-ipsec0
.
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=192.168.1.254
DSTGW=192.168.2.254
SRCNET=192.168.1.0/24
DSTNET=192.168.2.0/24
DST=X.X.X.X
A seguinte lista descreve o conteúdo deste arquivo:
Especifica o tipo de conexão.
Especifica que a conexão deve ser iniciada durante a inicialização do sistema.
Especifica que a conexão usa autenticação usa o método de autenticação de chaves pré-compartilhadas.
O endereço IP da gateway da fonte. Para a LAN A, é a gateway da LAN A, e para a LAN B, é a gateway da LAN B.
O endereço IP da gateway do destino. Para a LAN A, é a gateway da LAN B, e vice-versa.
Especifica a rede fonte para a conexão IPsec, a qual é, neste exemplo, o intervalo de rede da LAN A.
Especifica a rede de destino para a conexão IPsec, a qual é, neste exemplo, o intervalo de rede da LAN B.
O endereço IP externamente acessível da LAN B.
Veja a seguir o conteúdo do arquivo da chave pré-compartilhada, chamado /etc/sysconfig/network-scripts/keys-ipsec
(onde X
X
é 0 para a LAN A e 1 para a LAN B), que as duas redes usam para autenticarem-se entre si. O conteúdo destes arquivos deve ser idêntico e somente o usuário root deve poder acessar ou gravar este arquivo.
IKE_PSK=r3dh4tl1nux
Para alterar o arquivo keys-ipsec
para que somente o usuário root possa acessá-lo ou editá-lo, execute o seguinte comando após criar o arquivo:
X
chmod 600 /etc/sysconfig/network-scripts/keys-ipsec1
Para alterar a chave de autenticação a qualquer momento, edite o arquivo keys-ipsec
nos dois roteadores IPsec. As duas chaves devem ser idênticas para que a conexão funcione apropriadamente.
X
Veja o conteúdo do arquivo de configuração /etc/racoon/racoon.conf
da conexão IPsec. Note que a linha include
na parte inferior do arquivo é automaticamente gerada e aparece somente se o túnel IPsec está rodando.
# Racoon IKE daemon configuration file.
# See 'man racoon.conf' for a description of the format and entries.
path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
sainfo anonymous
{
pfs_group 2;
lifetime time 1 hour ;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}
include "/etc/racoon/X.X.X.X
.conf"
Veja a seguir o arquivo de configuração específico da conexão à rede remota. O arquivo é nomeado como
(onde X.X.X.X
.confX.X.X.X
é o endereço IP do roteador IPsec remoto). Note que este arquivo é gerado automaticamente quando o túnel IPsec é ativado e não deve ser editado diretamente.
remote X.X.X.X
{
exchange_mode aggressive, main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2 ;
}
}
Antes de iniciar a conexão IPsec, o encaminhamento de IP deve ser habilitado no kernel. Para habilitar o encaminhamento de IP:
Edite /etc/sysctl.conf
e mude net.ipv4.ip_forward
para 1
.
Execute o seguinte comando para habilitar a alteração:
[root@myServer ~] # sysctl -p /etc/sysctl.conf
Para iniciar a conexão IPsec, execute o seguinte comando em cada roteador:
[root@myServer ~] # /sbin/ifup ipsec0
As conexões são ativadas e as duas LANs, A e B, agora podem se comunicar. As rotas são criadas automaticamente através do script de inicialização invocado pela execução do ifup
na conexão IPsec. Para visualizar uma lista de rotas da rede, execute o seguinte comando:
[root@myServer ~] # /sbin/ip route list
Para testar a conexão IPsec, execute o utilitário tcpdump
no dispositivo externamente roteável (eth0 neste exemplo) para visualizar os pacotes de rede sendo transferidos entre os hosts (ou redes) e para verificar se estão criptografados com IPsec. Por exemplo, para verificar a conectividade IPsec da LAN A, use o seguinte comando:
[root@myServer ~] # tcpdump -n -i eth0 host lana.exemplo.com
O pacote deve incluir um cabeçalho AH e deve ser exibido como um pacote ESP. ESP significa que está criptografado. Por exemplo (barras invertidas denotam a continuação de uma linha):
12:24:26.155529 lanb.exemplo.com > lana.exemplo.com: AH(spi=0x021c9834,seq=0x358): \ lanb.exemplo.com > lana.exemplo.com: ESP(spi=0x00c887ad,seq=0x358) (DF) \ (ipip-proto-4)
Se a conexão IPsec não foi configurada para ser ativada durante a inicialização, você pode controlá-la da linha de comandos.
Para iniciar a conexão, use o seguinte comando em cada host para IPsec host-a-host, ou cada roteador IPsec para IPsec rede-a-rede.
[root@myServer ~] # /sbin/ifup <apelido>
onde <apelido>
é o apelido configurado anteriormente, como por exemplo, ipsec0
.
Para parar a conexão, use o seguinte comando:
[root@myServer ~] # /sbin/ifdown <apelido>
A segurança da informação é comumente encarada como um processo e não como um produto. Entretanto, implementações de segurança padronizadas geralmente utilizam alguma forma de mecanismo dedicado a controlar os privilégios de acesso e a restringir recursos de rede a usuários que são autorizados, identificáveis e rastreáveis. O Red Hat Enterprise Linux inclui muitas ferramentas poderosas para auxiliar administradores e engenheiros de segurança em questões de controle de acesso em nível de rede.
Os firewalls são um dos componentes centrais da implementação de segurança na rede. Diversos fabricantes comercializam soluções de firewall para suprir todos os nichos do mercado: de usuários domésticos protegendo um PC até soluções de centro de dados para proteger informações corporativas vitais. Firewalls podem ser soluções de hardware ligados intermitentemente, como as aplicações de firewall da Cisco, Nokia e Sonicwall. Também há soluções de software de firewall proprietárias desenvolvidas para os mercados doméstico e corporativo por fabricantes como Checkpoint, McAfee e Symantec.
Além das diferenças entre hardware e software de firewall, também há diferenças na maneira como os firewalls funcionam, que separam uma solução da outra. A Tabela 2.2, “Tipos de Firewall”detalha três tipos comuns de firewalls e como eles funcionam:
Método | Descrição | Vantagens | Desvantagens | ||||||
---|---|---|---|---|---|---|---|---|---|
NAT | Conversão de Endereços de Rede (Network Address Translation - NAT) insere sub-redes IP internas por trás de um ou um pequeno grupo de endereços IP públicos, mascarando todos os pedidos para uma fonte ao invés de várias. |
|
|
||||||
Filtro de Pacotes | Um firewall de filtragem de pacotes lê cada pacote de dados que passa por dentro e por fora de uma LAN. Pode ler e processar pacotes pela informação do cabeçalho e filtrar o pacote baseado em conjuntos de regras programáveis implementadas pelo administrador do firewall. O kernel do Linux tem a funcionalidade embutida de filtragem de pacotes através do sub-sistema Netfilter do kernel. |
|
|
||||||
Proxy | Firewalls de proxy filtram todos os pedidos de um determinado protocolo ou tipo dos clientes LAN para uma máquina proxy, que então faz estes pedidos à Internet representando o cliente local. Uma máquina proxy atua como um buffer entre usuários remotos maldosos e as máquinas dos clientes internos da rede. |
|
|
O kernel do Linux apresenta um sub-sistema de rede poderoso chamado Netfilter. O sub-sistema Netfilter oferece filtragem de pacote de estado (que guarda o estado das conexões inciadas pelos clientes) ou sem estado/'stateless' (na qual cada pacote é analisado individualmente, sem levar em conta pacotes anteriores trocados na mesma conexão), assim como NAT e serviços de mascaramento de IP. O Netfilter também tem a habilidade de danificar as informações do cabeçalho para roteamento avançado e gerenciamento do estado de conexão. O Netfilter é controlado através da funcionalidade iptables
.
A potência e flexibilidade de Netfilter é implementada usando a ferramenta de administração iptables
, uma ferramenta de linha de comando similar na sintáxe aos seus predecendentes, ipchains
.
Uma sintáxe semelhante, não significa uma implementação semelhante. No entanto, o ipchains
requer um jogo regras intrínsecas para: filtrar caminhos de fontes, filtrar caminhos de destino, filtrar ambas as fontes e portas de conexão de destino.
No entanto, iptables
usa o sub-sistema do Netfilter para melhorar a conexão, inspeção e processamento de rede. O iptables
inclui registro avançado, ações pré e pós-roteamento, conversão de endereços de rede e encaminhamento de porta; tudo em apenas uma interface de linha de comando.
Esta seção oferece uma visão geral do iptables
. Para informações mais detalhadas consulte o Seção 2.9, “IPTables”.
Assim como uma parede em uma construção evita que o fogo se alastre, um firewall evita que softwares maliciosos se alastrem em seu computador. Isto também ajuda a evitar que usuários desautorizados acessem seu computador.
Em uma instalação Red Hat Enterprise Linux padrão, um firewall existe entre seu computador ou rede e qualquer rede não confiável, por exemplo a Internet. Isto determina quais serviços no seu computador podem ser acessados por usuários remotos. Um firewall configurado pode aumentar consideravelmente a segurança de seu sistema. É recomendável que você configure um firewall para qualquer sistema Red Hat Enterprise Linux que tenha conexão de Internet.
Durante a tela Configuração do Firewall na instalação do Red Hat Enterprise Linux, você teve a opção de habilitar um firewall básico assim como permitir alguns dispositivos básicos, serviços e portas.
After installation, you can change this preference by using the Ferramenta de Configuração do Nível de Segurança.
Para iniciar este aplicativo, use o seguinte comando:
[root@myServer ~] # system-config-securitylevel
The Ferramenta de Configuração do Nível de Segurança only configures a basic firewall. If the system needs more complex rules, refer to Seção 2.9, “IPTables” for details on configuring specific iptables
rules.
Selecione uma das seguintes opções para o firewall:
Desabilitado — Desabilitar o firewall, oferece acesso completo ao seu sistema e não checa sua segurança. Este ítem deve ser selecionado somente se você estiver rodando em uma rede confiável (não na Internet) ou se precisar configurar um firewall padronizado usando ferramentas de linha de comando iptables.
Configurações Firewall e qualquer regras firewall padronizadas estão armazenadas no arquivo /etc/sysconfig/iptables
. Se você escolher Disabilitado e clicar em OK, estas configurações e regras de firewall serão perdidas.
Habilitado — Esta opção configura o sistema para rejeitar conexões recebidas que não estejam na resposta para solicitações de saída, assim como respostas de DNS ou solicitações de DHCP. Se for necessário acessar serviços que estejam rodando nesta máquina, você poderá escolher permitir serviços específicos através do firewall.
Se você estiver conectando seu sistema à Internet, mas não planeja rodar um servidor, esta escolha é a mais rápida.
Habilitar opções na lista de serviços Confiáveis permite que serviços específicos passem através do firewall.
O protocolo HTTP é utilizado pelo Apache ( e por outros servidores de Web) para servir páginas da web. Se você planeja disponibilizar seu servidor de Web ao público, selecione este ítem. Esta opção não é solicitada para visualizar páginas locais ou para desenvolver páginas na web. Este serviço requer a instalação de um pacote httpd
.
Habilitar o WWW (HTTP) não abrirá uma porta para HTTPS, a versão SSL do HTTP. Se este serviço for solicitado, selecione Secure WWW (HTTPS).
O protocolo FTP é utilizado para transferir arquivos entre máquinas em uma rede. Se você planeja disponibilizar seu servidor FTP ao público, selecione este ítem. Este serviço requer a instalação de um pacote vsftpd
.
Secure Shell (SSH) é um conjunto de ferramentas para comandos de registro e execução em uma máquina remota. Para permitir acesso remoto à uma máquina via ssh, selecione este ítem . Este serviço requer a instalação do pacote openssh-server
.
Telnet é um protocolo para registro de máquinas remotas. Telnet comunicações não são criptografadas e não oferecem nenhuma segurança de snooping de rede. Não é recomendável permitir o acesso de Telnet recebidas. Este serviço requer a instalação do pacote telnet-server
.
SMTP é um protocolo que permite que as hosts remotas se conectem à sua máquina para enviar correio. Você não precisa habilitar este serviço se você coletar seu correio a partir do servidor ISP usando POP3 ou IMAP, ou se você utilizar uma ferramenta como fetchmail
. Para permitir o envio de correio de sua máquina, selecione este ítem. Note que um servidor SMTP configurado de maneira imprópria, pode permitir que máquinas remotas usem seu servidor para enviar spam.
O Sistema de Arquivo de Rede (NFS) é um arquivo que compartilha protocolos geralmente usados nos sistemas *NIX. Versão 4 deste protocolo é mais seguro do que seus precedentes. Se desejar compartilhar arquivos ou diretórios em seu sistema com outros usuários de rede, selecione este ítem.
Samba é uma implementação do protocolo de rede SMB do proprietário da Microsoft. Se você precisar compartilhar arquivos , diretórios ou impressoras conectadas localmente com as máquinas Microsoft Windows, selecione este ítem.
The Ferramenta de Configuração do Nível de Segurança includes an Other ports section for specifying custom IP ports as being trusted by iptables
. For example, to allow IRC and Internet printing protocol (IPP) to pass through the firewall, add the following to the Other ports section:
194:tcp,631:tcp
Clique em OK para salvar mudanças e habilitar ou desabilitar o firewall. Se o Habilitar firewall foi selecionado, as opções selecionadas são traduzidas para os comandos iptables
e escritas para o arquivo /etc/sysconfig/iptables
. O serviço iptables
também é iniciado, assim o firewall é imediatamente ativado após salvar as opções selecionadas. Se o Desabilitar firewall foi selecionado, o arquivo /etc/sysconfig/iptables
é removido e o serviço iptables
é bloqueado imediatamente.
The selected options are also written to the /etc/sysconfig/system-config-securitylevel
file so that the settings can be restored the next time the application is started. Do not edit this file by hand.
Embora o firewall seja ativado imediatamente, o serviço iptables
não é configurado para iniciar automaticamente em tempo de inicialização. Consulte a Seção 2.8.2.6, “Ativando o Serviço IPTables” para maiores informações.
As regras do firewall ficam ativas somente se o serviço iptables
estiver rodando. Para iniciá-lo manualmente, use o seguinte comando:
[root@myServer ~] # service iptables restart
Para fazer com que o iptables
inicie por padrão sempre que o sistema é inicializado, use o seguinte comando:
[root@myServer ~] # chkconfig --level 345 iptables on
O serviço ipchains
não está incluso no Red Hat Enterprise Linux. No entanto, se o ipchains
for instalado (por exemplo, se uma houve uma atualização e o sistema já possuia o ipchains
instalado previamente.), os serviços ipchains
e iptables
não devem ser ativado simultaneamente. Para assegurar-se de que o serviço ipchains
está desabilitado e configurado para não iniciar em tempo de inicialização, use os seguintes dois comandos:
[root@myServer ~] # service ipchains stop [root@myServer ~] # chkconfig --level 345 ipchains off
O primeiro passo para usar o iptables
é iniciá-lo. Isto pode ser feito com o comando:
[root@myServer ~] # service iptables start
Os serviços ip6tables
devem ser desligados para usar o serviço iptables
. Se você desativar o serviço ip6tables
, lembre-se de desativar a rede IPv6 também. Nunca deixe um dispositivo de rede ativo sem um firewall compatível.
Para fazer com que o ip6tables
inicie por padrão sempre que o sistema for inicializado, use o seguinte comando:
[root@myServer ~] # chkconfig --level 345 iptables on
Para fazer com que o iptables
inicie sempre que o sistema é inicializado em nível de execução 3,4 ou 5.
Os seguintes exemplos do comando iptables
ilustram a sintáxe básica do comando:
[root@myServer ~ ] # iptables -A<chain>
-j<target>
A opção -A
especifica que a regra seja anexada à <chain>. Cada corrente é composta de uma ou mais regras, e portanto também conhecida como um conjunto de regras.
As três correntes internas são INPUT, OUTPUT e FORWARD. Estas correntes são permanentes e não podem ser deletadas. A corrente especifica o ponto no qual um pacote é manipulado.
A opção -j
especifica o alvo da regra, ou seja, o que fazer se um pacote combina com a regra. Exemplos de alvos internos são ACCEPT, DROP e REJECT.
<target>
A página man do iptables
também contém um informações sobre correntes disponíveis, opções e alvos.
Estabelecer normas básicas de firewall cria uma base para construir mais regras definidas pelo usuário detalhadamente.
Cada corrente iptables
é composta por uma norma padrão e mais de uma regra que funcione de comum acordo com a norma padrão para definir um conjunto de regras gerais para o firewall.
A política padrão para uma corrente pode tanto derrubar (DROP) quanto aceitar (ACCEPT). Administradores com foco em segurança geralmente escolhem derrubar todos os pacotes como uma norma e só permitem pacotes específicos, analisando-os caso-a-caso. As seguintes regras bloqueiam todos os pacotes entrando e saindo de uma porta de comunicação (gateway) de rede:
[root@myServer ~ ] # iptables -P INPUT DROP [root@myServer ~ ] # iptables -P OUTPUT DROP
Adicionalmente, é recomendado que qualquer pacote encaminhado — tráfego de rede roteado do firewall para seu nódulo de destino — seja negado também, para restringir os clientes internos da exposição inadvertida à Internet. Para fazer isso, use a seguinte regra:
[root@myServer ~ ] # iptables -P FORWARD DROP
Após definir as normas de correntes, você pode criar novas regras para a sua rede e seus requisitos de segurança em particular.
As seções a seguir descrevem como salvar regars iptables e sublimar algumas das regras que você pode implementar ao longo da construção de seu firewall iptables.
As mudanças para iptables
são transitórias. Se o sistema ou o serviço iptables
forem reiniciados as regras serão automaticamente liberadas e redefinidas. Para salvar as regras de modo que elas sejam carregadas posteriormente, quando o serviço iptables
for iniciado, use o seguinte comando:
[root@myServer ~ ] # service iptables save
As regras são armazenadas no arquivo /etc/sysconfig/iptables
e são aplicadas sempre que o serviço é iniciado, reiniciado ou quando a máquina é reinicializada.
Prevenir ataques remotos ao acessar uma LAN é um dos mais importantes aspectos de segurança de rede. A integridade de uma LAN deveria ser protegida de usuários remotos maliciosos através do uso de regras severas de firewall.
No entanto, com uma política padrão ajustada para bloquear todos os pacotes de entrada, saída e enviados, é possível que o firewall/gateway e usuários de LAN internos se comunicarem uns com os outros ou com recursos externos.
Para permitir que usuários realizem funções relacionadas à rede e usem aplicativos de rede, os administradores devem abrir certas portas para comunicação.
Por exemplo: para permitir o acesso à porta 80 pelo firewall, adicione a seguinte regra:
[root@myServer ~ ] # iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Isto permite que usuários naveguem as páginas da web que se comunicam utilizando a porta 80 padronizada. Para permitir o acesso a sites seguros (como https://www.example.com/), você deve abrir a porta 443 também, como se segue:
[root@myServer ~ ] # iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Ao criar um conjunto de regras iptables
, a ordem é muito importante.
Se uma regra especifica que qualquer pacote de sub-rede 192.168.100.0/24 pode ser derrubado, e é seguido de uma regra que permite os pacotes do 192.168.100.13 (que está dentro da sub-rede restrita derrubada), então a regra adicionada é ignorada.
A regra para permitir pacotes de 192.168.100.13 deve preceder a regra que derruba o lembrete do subnet.
Para inserir uma regra em um local específico em uma corrente existente, use a opção -I
. Por exemplo:
[root@myServer ~ ] # iptables -I INPUT 1 -i lo -p all -j ACCEPT
A regra é inserida como a primeira no conjunto INPUT para permitir o tráfego do dispositivo loopback local.
Quando você solicitar acesso remoto à uma LAN, use serviços seguros como o SSH, para conexões remotas criptografadas à serviços LAN.
Administradores com recursos baseados em PPP (tais como, bancos de modem ou grupos de contas ISP) podem utilizar acesso discado para driblar as barreiras firewall de forma segura. Como as conexões são diretas, as conexões de modem estão sempre atrás de um firewall/gateway.
No entanto, para usuários remotos com conexões de banda larga existem exceções para casos especiais. Você pode configurar iptables
para aceitar conexões de clientes SSH remotos. Por exemplo, as seguintes regras permitem um acesso remoto SSH:
[root@myServer ~ ] # iptables -A INPUT -p tcp --dport 22 -j ACCEPT [root@myServer ~ ] # iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
Estas regras permitem o acesso de entrada e saída para um único sistema, como um PC conectado diretamente à Internet ou firewall/porta de comunicação (gateway). No entanto, não permitem que os nódulos por trás do firewall/porta de comunicação acessem estes serviços. Para permitir o acesso LAN a estes serviços, você pode usar a Conversão de Endereços de Rede (Network Address Translation - NAT) com regras de filtragem do iptables
.
A maioria dos ISPs oferecem somente um número limitado de endereços IP rotáveis publicamente para as organizações que eles servem.
Os administradores devem portanto, encontrar formas alternativas de compartilhar acesso aos serviços de Internet sem disponibilizar os endereços IP públicos a todos os nós da LAN. Usar endereços IP privados é a forma mais comum de permitir que todos os nós em uma LAN acessem devidamente serviços de rede internos e externos.
Roteadores de borda (tais como os firewalls) podem receber transmissões de entrada da Internet e rotear os pacotes aos nós de LAN previstos. Da mesma forma, os firewalls/gateways podem também rotear solicitações de saída de um nó de LAN ao serviço de Internet remoto.
Este envio de trânsito de rede pode, muitas vezes, se tornar perigoso, especialmente com a disponibilidade de ferramentas modernas de quebra, que podem falsificar os endereços IP internos e fazer com que a máquina do atacante remoto aja como um nó em sua LAN.
Para evitar que isto aconteça, o comando iptables
oferece um roteamento e envio de políticas que podem ser implementadas para evitar uso anormal de recursos de rede.
A norma FORWARD
permite que um administrador controle onde os pacotes podem ser roteados em uma LAN. Por exemplo: para permitir o encaminhamento para a LAN inteira (assumindo que o firewall/porta de comunicação tenha um endereço IP interno na eth 1), as seguintes regras podem ser definidas:
[root@myServer ~ ] # iptables -A FORWARD -i eth1 -j ACCEPT [root@myServer ~ ] # iptables -A FORWARD -o eth1 -j ACCEPT
Essa regra da acesso para a rede interna aos sistemas por trás do firewall/porta de comunicação. A porta de comuncação roteia os pacotes de um nódulo da LAN para o seu nódulo pretendido, passando todos os pacotes através de seu dispositivo eth1
.
Por padrão, a norma IPV4 nos kernels do Red Hat Enterprise Linux desabilita o suporte para encaminhamento do IP, o que evita que caixas rodando o Red Hat Enterprise Linux funcionem como roteadores de borda dedicados. Para habilitar o encaminhamento do IP, execute o seguinte comando:
[root@myServer ~ ] # sysctl -w net.ipv4.ip_forward=1
A mudança desta configuração é válida somente para sessões atuais, ela não persiste além de um reboot ou uma reinicialização de serviço de rede. Para ajustar permanentemente o envio de IP, edite o arquivo /etc/sysctl.conf
como se segue:
Localize a seguinte linha:
net.ipv4.ip_forward = 0
Edite-a para ler como se segue:
net.ipv4.ip_forward = 1
Execute o seguinte comando para ativar a alteração do arquivo sysctl.conf
:
[root@myServer ~ ] # sysctl -p /etc/sysctl.conf
Aceitar pacotes enviados através de dispositivos IP internos de firewall, permite que os nós de LAN se comuniquem entre si. No entanto, eles ainda não podem se comunicar externamente com a Internet.
Para permitir que nódulos da LAN com endereços IP privados comuniquem-se com redes públicas externas, configure o firewall com o mascaramento do IP, que mascara pedidos de nódulos da LAN com endereços IP do dispositivo externo do firewall (neste caso, eth0):
[root@myServer ~ ] # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
A regra usa a tabela de pacotes coincidentes da NAT (-t nat
) e especifica a corrente POSTROUTING embutida para a NAT (-A POSTROUTING
) no dispositivo de rede externa do firewall (-o eth0
).
O POSTROUTING (pós-roteamento) permite que os pacotes sejam alterados como são, deixando de lado os dipositivos externos do firewall.
O alvo -j MASQUERADE
é especificado para mascarar o endereço IP privado de um nó com endereço IP externo do firewall/gateway
Se você tem um servidor em sua rede interna que deseja disponibilizar externamente, pode usar o alvo -j DNAT
da corrente PREROUTING na NAT para especificar um endereço IP e porta de destino para onde encaminhar os pacotes de entrada requisitando uma conexão.
Por exemplo, se você deseja encaminhar os pedidos HTTP de entrada para seu Servidor HTTP Apache dedicado para 172.31.0.23, submeta o seguinte comando:
[root@myServer ~ ] # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80
Esta regra especifica que a tabela nat usa a corrente PREROUTING embutida para encaminhar pacotes HTTP de entrada exclusivamente para o endereço IP 172.31.0.23 listado.
Se você tem uma norma padrão DROP na sua corrente FORWARD, deve adicionar uma regra para permitir o encaminhamento de pedidos HTTP de entrada para possibilitar o roteamento do destino da NAT. Para fazer isso, submeta o seguinte comando:
[root@myServer ~ ] # iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT
Esta regra permite o encaminhamento de pedidos de entrada HTTP do firewall para seu destino pretendido no ApacheHTTP por trás do firewall.
As regras do iptables
também podem ser definidas para rotear tráfego para determinadas máquinas, como um servidor dedicado HTTP ou FTP, numa zona desmilitarizada (DMZ). A DMZ é uma sub-rede local especial dedicada a prover serviços num meio público como a Internet.
Por exemplo: para definir uma regra para rotear os pedidos HTTP externos para um servidor HTTP dedicado no endereço IP 10.0.4.2 (fora do intervalo 192.168.1.0/24 da LAN), a tradução de endereço de rede (NAT) evoca uma tabela PREROUTING
para encaminhar os pacotes ao destino apropriado:
[root@myServer ~ ] # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.4.2:80
Com este comando, todas as conexões HTTP para a porta 80 de fora da LAN são roteadas ao servidor HTTP em uma rede separada do resto da rede interna. Esta forma de segmentação de rede pode ser mais segura que permitir conexões HTTP para uma máquina na rede.
Se o servidor HTTP estiver configurado para aceitar conexões seguras, então a porta 443 deve ser encaminhada também.
Regras mais elaboradas podem ser criadas para controlar acesso a sub-redes específicas, ou até mesmo nós específicos, dentro de uma LAN. Você também pode restringir certos aplicativos duvidosos ou programas, tais como trojans, worms, e outros vírus de client/server ao contatar os servidores da LAN.
Por exemplo, alguns trojans escaneiam redes para serviços em portas de 31337 até 31340 (chamados de portas elitena terminologia de crack)
Já que nao existe nenhum serviço legítimo que comunique através destas portas não padronizadas, ao bloqueá-las você pode diminuir consideravelmente as chances de nós, com vírus em sua rede, se comunicarem de forma independente com seus servidores master remotos.
As regras a seguir, derruban todo o trânsito de TCP que tentar usar a porta 31337:
[root@myServer ~ ] # iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP [root@myServer ~ ] # iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
Você também poderá bloquear conexões exteriores que tentem falsificar a variedade de endereços IP privados para infiltrar em sua LAN.
Por exemplo: se uma LAN usa o intervalo 192.168.1.0/24, uma regra pode determinar que o dispositivo de rede, que faz a interface com a Internet (eth0, por exemplo), derrube quaisquer pacotes para este dispositivo com um endereço do intervalo de IP de sua LAN.
Como norma padrão, é recomendado rejeitar pacotes encaminhados, portanto qualquer outro endereço IP espionado ao dispositivo que faz a interface externa (eth0) é rejeitado automaticamente.
[root@myServer ~ ] # iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -j DROP
Existe uma distinção entre os alvos DROP
eREJECT
ao lidar com as regrasadicionadas.
O alvo REJECT
nega acesso e retorna um erro connection refused
(conexão negada) para usuários que tentarem se conectar ao serviço. A ação DROP
(derrubar) um alvo, como o nome sugere, derruba os pacotes sem nenhum aviso.
Administradores podem usar seu próprio bom senso ao lidar com estes alvos; entretanto, para evitar a confusão do usuário e tentativas para continuar conectando, recomenda-se usar o alvo REJECT
.
O iptables
inclui um módulo que permite que osadministradores inspecionem e restrinjam conexões a serviços disponíveis numa rede interna, usando um método chamado registro de conexão (connection tracking). O registro de conexão armazena as conexões numa tabela, que possibilita os administradores permitir ou negar acesso baseado nos seguintes estados de conexão:
NEW
(novo) — Um pacote requisitando uma nova conexão, como um pedido HTTP.
ESTABLISHED
(estabelecido) — Um pacote que é parte de uma conexão existente.
RELATED
(relacionado) — Um pacote solicitando uma nova conexão, mas que é parte de uma conexão existente. Por exemplo, conexões FTP usam a porta 21 para estabelecer conexão, mas os dados são transferidos para uma porta diferente (geralmente para a 20).
INVALID
(inválido) — Um pacote que não faz parte de nenhuma das conexões da tabela de registro das conexões.
Você pode usar a funcionalidade de estado do registro de conexões do iptables
com qualquer protocolo de rede, mesmo que o próprio protocolo seja sem estado (como o UDP). O exemplo a seguir mostra uma regra que usa o registro de conexão para encaminhar somente os pacotes associados a uma conexão estabelecida:
[root@myServer ~ ] # iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
A introdução do Protocolo de Internet de última geração chamado IPv6, vai além do limite de endereços de 32 bits do IPv4 (ou IP). IPv6 suporta endereços de 128 bits e, como tal, redes de transporte cientes do IPv6 são capazes de lidar com um número maior de endereços roteáveis que o IPv4.
O Red Hat Enterprise Linux suporta regras de firewall IPv6 usando o sub-sistema Netfilter 6 e o comando ip6tables
. Em Red Hat Enterprise Linux 5, os serviços IPv4 e IPv6 são habilitados por padrão.
A sintáxe é idêntica à do iptables
em todos os aspectos, exceto pelo fato do ip6tables
suportar endereços de 128 bits. Por exemplo: as conexões SSH em um servidor de rede ciente do IPv6 podem ser possibilitadas pela seguinte regra:
[root@myServer ~ ] # ip6tables -A INPUT -i eth0 -p tcp -s 3ffe:ffff:100::1/128 --dport 22 -j ACCEPT
Para mais informações sobre redes com IPv6, consulte a página de informações sobre o IPv6: http://www.ipv6.org/.
Há diversos aspectos do firewall e do sub-sistema Netfilter do Linux que não foram abordados neste capítulo. Para mais informações, consulte os seguintes recursos.
Consulte o Seção 2.9, “IPTables” para maiores informações detalhadas sobre o comando iptables
, incluindo as definições de todas as opções de comandos.
A página man do iptables
também contém um breve resumo das várias opções.
http://www.netfilter.org/ — O site oficial do Netfilter e do projeto iptables
.
http://www.tldp.org/ — O Projeto de Documentação do Linux contém diversos guias úteis relacionados à criação e administração do firewall.
http://www.iana.org/assignments/port-numbers — A lista oficial de portas de serviços comuns conforme definição da 'Internet Assigned Numbers Authority'.
Red Hat Linux Firewalls, de Bill McCarty; Red Hat Press — uma referência detalhada para a criação de firewalls de rede e servidores usando tecnologia de filtragem de pacote de código aberto como Netfilter e iptables
. Inclui tópicos como a análise de registros de firewalls, criação de regras de firewall e a personalização de seu firewall com ferramentas gráficas como lokkit
.
Linux Firewalls, de Robert Ziegler; New Riders Press. — contém muitas informações sobre a criação de firewalls usando o ipchains
do kernel 2.2, assim como o Netfilter e iptables
. Tópicos adicionais de segurança, como questões de acesso remoto e sistemas de detecção de intrusão também são abordados.
O Red Hat Enterprise Linux inclui ferramentas avançadas para a filtragem de pacotes de rede — o processo de controlar pacotes enquanto os mesmos, entram, trafegam, e saem da stack de rede do kernel. Versões do kernel anteriores à 2.4 dependiam do ipchains
para a filtragem de pacotes e usava listas de regras para pacotes a cada passo do processo de filtragem. O kernel 2.4 introduziu iptables
(também chamado de netfilter), que é similar ao ipchains
mas expande significativamente o âmbito e o controle disponíveis para a filtragem de pacotes de rede.
Este capítulo trata de noções básicas de filtragem de pacotes, define as diferenças entre ipchains
e iptables
, explica várias opções disponíveis com os comandos do iptables
, e detalha como regras de filtragem podem ser preservadas entre reinicializações do sistema.
Consulte a Seção 2.9.7, “Recursos Adicionais” para instruções sobre como construir regras para o iptables
e configurar uma firewall com base nestas regras.
O mecanismo de firewall padrão nos kernels de versões 2.4 e mais recentes é o iptables
, mas o iptables
, não pode ser usado se o ipchains
já estiver rodando. Se o ipchains
estiver presente durante a inicialização do sistema, o kernel emite um erro e falha em iniciar o iptables
.
A funcionalidade do ipchains
não é afetada por esses erros.
O kernel do Linux usa o Netfilter para a filtragem de pacotes, permitindo que alguns pacotes alcancem ou passem pelo sistema, enquanto outros são barrados. Esta funcionalidade está embutida no kernel do Linux, e possui três tabelas ou listas de regras padrão:
filter
— A tabela padrão usada para lidar com pacotes de rede.
nat
— Usada para alterar pacotes que criem uma nova conexão, e também usado para Conversão de Endereços de Rede (Network Address Translation - NAT).
mangle
— Usada para tipos específicos de alterações de pacotes.
Cada tabela tem um grupo de cadeias embutidas, as quais correspondem às ações executadas no pacote pelo netfilter
.
As cadeias embutidas para a tabela filter
são as seguintes:
INPUT — Aplicável a pacotes de rede que sejam destinados ao host.
OUTPUT — Aplicável a pacotes de rede gerados localmente.
FORWARD — Aplicável a pacotes de rede roteados através do host.
As cadeias embutidas para a tabela nat
são as seguintes:
PREROUTING — Altera pacotes de rede assim que eles chegam.
OUTPUT — Altera pacotes de rede criados localmente antes que os mesmos sejam enviados.
POSTROUTING — Altera pacotes de rede antes que que os mesmos sejam enviados.
As cadeias embutidas para a tabela mangle
são as seguintes:
INPUT — Altera pacotes de rede destinados ao host.
OUTPUT — Altera pacotes de rede criados localmente antes que os mesmos sejam enviados.
FORWARD — altera pacotes de rede roteados através do host.
PREROUTING — Altera pacotes de rede de entrada antes que eles sejam roteados.
POSTROUTING — Altera pacotes de rede antes que que os mesmos sejam enviados.
Cada pacote de rede recebido ou enviado por um sistema Linux está sujeito a pelo menos uma tabela. Entretanto, um pacote pode ser submetido à múltiplas regras em uma tabela antes de chegar ao fim da cadeia. A estrutura e o propósito destas regras podem variar, mas normalmente buscam identificar um pacote vindo de ou indo para um endereço IP específico, ou um grupo de endereços IP, ao usar certos protocolos ou serviços de rede.
De acordo com a configuração padrão, regras de firewall são salvas nos arquivos /etc/sysconfig/iptables
ou /etc/sysconfig/ip6tables
.
O serviço iptables
inicia antes de qualquer serviço relacionado ao DNS durante a inicialização de um sistema Linux. Isto significa que regras de firewall podem apenas fazer referência a endereços IP numéricos (por exemplo, 192.168.0.1). Nestas regras, endereços não numéricos (por exemplo, host.exemplo.com) produzirão erros.
Independentemente do seu destino, quando pacotes correspondem a uma regra específica em uma das tabelas, um alvo (ou ação) é aplicado aos mesmos. Se a regra especifica um alvo ACCEPT
para um pacote correspondente, o pacote ignora o resto das verificações de regras e ganha a permissão para continuar até o seu destino. Se uma regra especifica um alvo DROP
, o pacote é negado acesso ao sistema e nada é mandado de volta ao host que emitiu o pacote. Se uma regra especifica um alvo QUEUE
, o pacote é passado ao espaço do usuário. Se uma regra especifica o alvo opcional REJECT
, o pacote é descartado, mas um pacote de erro é enviado ao emissor do pacote.
Cada cadeia tem uma diretiva padrão para ACCEPT
, DROP
, REJECT
, ou QUEUE
. Se nenhuma das regras da cadeia é aplicável ao pacote, o mesmo é tratado de acordo com a diretiva padrão.
O comando iptables
configura estas tabelas, e cria novas tabelas se necessário.
Tanto o ipchains
quanto o iptables
usam cadeias de regras que operam dentro do kernel do Linux filtrando pacotes com base na correspondência à certas regras ou conjuntos de regras. Entretanto, o iptables
representa uma forma mais extensível de filtrar pacotes, dando ao administrador maior controle sem precisar agregar complexidades desnecessárias ao sistema.
Você deve estar ciente das seguintes diferenças significantes entre o ipchains
e o iptables
:
iptables
, cada pacote filtrado é processado usando regras de uma única cadeia, ao invés de múltiplas.
Por exemplo, um pacote FORWARD entrando em um sistema usando o ipchains
teria que passar pelas cadeias INPUT, FORWARD, e OUTPUT para continuar até o seu destino. Entretanto, o iptables
apenas envia pacotes à cadeia INPUT se eles forem destinados ao sistema local, e apenas envia pacotes à cadeia OUTPUT se eles foram gerados pelo sistema local. Assim sendo, é importante colocar a regra projetada para apanhar um certo pacote dentro da cadeia que realmente lida com aquele pacote.
No ipchains
, pacotes que correspondessem a uma regra em uma cadeia podiam ser direcionados ao alvo DENY. Este alvo deve ser modificado para DROP no iptables
.
No ipchains
, a ordem das opções de uma regra não importa.
O comando iptables
tem uma sintaxe mais rigorosa. O comando iptables
solicita que o protocolo (ICMP, TCP, ou UDP) seja especificado antes das portas de origem ou destino.
Por exemplo, interfaces de entrada (opção -i
) podem apenas ser usadas em cadeias INPUT ou FORWARD. Da mesma forma, interfaces de saída (opção -o
) podem apenas ser usadas em cadeias FORWARD ou OUTPUT.
Ou seja, cadeias INPUT e interfaces de entrada trabalham juntas assim como cadeias OUTPUT e interfaces de saída trabalham juntas. Cadeias FORWARD funcionam tanto com interfaces de entrada quanto de saída.
Cadeias OUTPUT não são mais usadas por interfaces de entrada, e cadeias INPUT não são vistas por pacotes trafegando através das interfaces de saída.
Esta lista não inclui todas as mudanças. Consulte a Seção 2.9.7, “Recursos Adicionais” para informações específicas.
Regras para a filtragem de pacotes são criadas usando o comando iptables
. As seguintes características de um pacote são as mais usadas como critérios:
Tipo de Pacote — Especifica o tipo dos pacotes que o comando deve filtrar.
Origem/Destino do Pacote — Especifica quais pacotes o comando filtra baseado na origem ou no destino do pacote.
Alvo — Especifica qual ação é tomada em relação a pacotes que correspondam aos critérios acima.
Consulte a Seção 2.9.3.4, “Opções de Correspondência do IPTables” e a Seção 2.9.3.5, “Opções de Alvo” para mais informações sobre opções específicas que tratam destas características de um pacote.
As opções usadas com regras específicas do iptables
devem ser agrupadas de maneira lógica, com base no propósito e condições da regra, para que a mesma seja válida. O resto desta seção explica opções geralmente usadas com o comando iptables
.
Muitos dos comandos do iptables
tem a seguinte estrutura:
iptables [-t <nome-da-tabela>
] <comando>
<nome-da-cadeia>
\ <parâmetro-1>
<opção-1>
\ <parâmetro-n>
<opção-n>
<nome-da-tabela>
— Especifica à qual tabela a regra pertence. Se omitido, a tabela filter
é usada.
<comando>
— Especifica a ação a ser executada, como acrescentar ou remover uma regra.
<nome-da-cadeia>
— Especifica a cadeia a ser editada, criada, ou removida.
Pares <parâmetro>-<opção>
— Parametros e ações associadas especificando como proceder quando um pacote corresponde à uma regra.
A extensão e a complexidade de um comando do iptables
pode mudar bastante, de acordo com o seu propósito.
Por exemplo, um comando para remover uma regra de uma cadeia pode ser bem curto:
iptables -D
<nome-da-cadeia> <número-da-linha>
Em contraste, um comando que adicione uma regra que filtre pacotes oriundos de uma subnet específica, usando uma variedade de parâmetros e opções específicos, pode ser bem longo. Ao construir comandos iptables
, é importante lembrar que alguns parâmetros e opções necessitam parâmetros e opções adicionais para construir uma regra válida. Isto pode produzir um efeito cascata. A regra não é válida até que todos os parâmetros e opções que necessitem de outro grupo de opções estejam concluídos.
Digite iptables -h
para ver uma lista abrangente de estruturas de comandos iptables
.
Opções de comando fazem com que o iptables
execute uma ação específica. Apenas uma opção de linha de comando é permitida em cada comando iptables
. Com a exceção do comando help, todos os comandos são escritos em letras maiúsculas.
Os comandos do iptables
são os seguintes:
-A
— Acrescenta a regra ao final da cadeia especificada. Ao contrário da opção -I
descrita abaixo, -A
não aceita um número inteiro como argumento. Esta opção sempre acrescenta a regra ao final da cadeia especificada.
-C
— Verifica uma regra específica antes de adicioná-la à cadeia especificada pelo usuário. Este comando pode lhe ajudar a construir regras complexas do iptables
pedindo que você digite parâmetros e opções adicionais.
-D <número-inteiro> | <regra>
— Remove uma regra da cadeia específica através de um número (por exemplo, 5
para a quinta regra da cadeia), ou através da especificação da regra. A especificação de uma regra deve corresponder exatamente à uma regra existente.
-E
— Renomeia uma cadeia definida pelo usuário. Uma cadeia definida pelo usuário é qualquer uma que não seja uma das padrões ou pré-existentes (consulte a opção -N
abaixo, para maiores informações sobre a criação de cadeias definidas pelo usuário). Esta é uma mudança apenas cosmética, e não afeta a estrutura da tabela.
Se você tentar renomear uma das cadeias padrão, o sistema relatará um erro do tipo Match not found
(Correspondente não encontrado). Você não pode renomear as cadeias padrão.
-F
— Esvazia a cadeia selecionada, o que na verdade remove todas as regras da cadeia. Se nenhuma cadeia for selecionada, este comando esvazia todas as regras de todas as cadeias.
-h
— Oferece uma lista de estruturas de comandos, assim como um breve resumo dos parâmetros e opções dos comandos.
-I [<número-inteiro>]
— Insere uma regra na cadeia especificada no lugar especificado pelo argumento inteiro definido pelo usuário. Se nenhum argumento é especificado, a regra é inserida no topo da cadeia.
Conforme indicado acima, a ordem das regras em uma cadeia determina quais regras são aplicáveis a quais pacotes. É importante lembrar disto ao adicionar regras usando as opções -A
ou -I
.
Isto é especialmente relevante ao se adicionar regras usando a opção -I
como argumento. Se você especificar um número existente ao adicionar uma regra à uma cadeia, o iptables
adiciona a nova regra antes (ou acima) da regra existente.
-L
— Lista todas as regras da cadeia especificada após o comando. Para listar todas as regras em todas as cadeias na tabela padrão filter
, não especifique uma cadeia ou tabela. Caso contrário, a seguinte sintaxe deve ser usada para listar as regras de uma específica cadeia em uma específica tabela:
iptables -L <nome-da-cadeia>
-t <nome-da-tabela>
A Seção 2.9.3.6, “Opções de Listagem” descreve opções adicionais para a opção de comando -L
, a qual oferece números de regras e permite descrições de regras mais detalhadas.
-N
— Cria uma nova cadeia com um nome especificado pelo usuário. O nome da cadeia deve ser exclusivo, caso contrário uma mensagem de erro é exibida.
-P
— Estabelece a diretiva padrão para a cadeia especificada, de modo que quando pacotes passam pela cadeia toda sem encontrar uma regra correspondente, os mesmos são enviados para o alvo específico, como ACCEPT ou DROP.
-R
— Substitui uma regra na cadeia especificada. O número da regra deve ser especificado após o nome da cadeia. A primeira regra em uma cadeia corresponde à regra número um.
-X
— Remove uma cadeia especificada pelo usuário. Você não pode remover uma cadeia padrão.
-Z
— Configura os contadores de bytes e de pacotes de todas as tabelas para zero.
Alguns comandos do iptables
, incluindo aqueles usados para adicionar, remover, inserir ou substituir regras em uma cadeia específica, requerem vários parâmetros para construir uma regra de filtragem de pacotes.
-c
— Restaura os contadores para uma dada regra. Este parâmetro aceita as opções PKTS
e BYTES
para especificar quais contadores devem ser restaurados.
-d
— Estabelece o nome de host, endereço IP, ou rede de destino de um pacote que corresponda à uma regra. Ao fazer a correspondência de uma rede, os seguintes formatos de endereços IP e máscaras de rede são suportados:
— Onde N.N.N.N
/M.M.M.M
N.N.N.N
é o intervalo de endereços IP e M.M.M.M
é a máscara de rede.
— Onde N.N.N.N
/M
N.N.N.N
é o intervalo de endereços IP e M
é a máscara de bits.
-f
— Aplica esta regra apenas a pacotes fragmentados.
Você pode usar a opção do caractere do ponto de exclamação (!
) após este parâmetro para especificar que a regra seja aplicada apenas a pacotes não fragmentados.
É desejável que se faça a distinção entre pacotes fragmentados e não fragmentados, mesmo que pacotes fragmentados representem uma parte padrão do protocolo IP.
A fragmentação hoje em dia é normalmente usada para gerar ataques de DoS usando pacotes mal formados, apesar de ser desenvolvida com o intuito original de permitir que pacotes IP trafegassem por redes com tamanhos de quadro variados. Vale também notar que o IPv6 proíbe totalmente o uso da fragmentação.
-i
— Estabelece a interface de rede de entrada, como eth0
ou ppp0
. Com o iptables
, este parâmetro opcional pode ser usado apenas com as cadeias INPUT e FORWARD quando usado com a tabela filter
e a cadeia PREROUTING quando usado com as tabelas nat
e mangle
.
Este parâmetro também suporta as seguintes opções especiais:
Caractere do ponto de exclamação (!
) — Reverte a diretiva, o que significa que quaisquer interfaces especificadas são excluídas desta regra.
Caractere de mais (+
) — Um caractere curinga usado para fazer a correspondência de todas as interfaces que correspondam à string especificada. Por exemplo, o parâmetro -i eth+
aplicaria esta regra a quaisquer interfaces Ethernet, mas excluiria quaisquer outras interfaces, como ppp0
.
Se o parâmetro -i
é usado, mas nenhuma interface é especificada, todas as interfaces são afetadas pela regra.
-j
— Pula para o alvo especificado quando um pacote corresponde à uma regra específica.
Os alvos padrão são ACCEPT
, DROP
, QUEUE
, e RETURN
.
Opções adicionais estão disponíveis através de módulos carregados como padrão com o pacote RPM do iptables
do Red Hat Enterprise Linux. Alvos válidos nestes módulos incluem LOG
, MARK
, e REJECT
, entre outros. Consulte a página man do iptables
para maiores informações sobre estes e outros alvos.
esta opção também pode ser usada para direcionar um pacote correspondendo a uma regra específica para uma cadeia definida pelo usuário fora da cadeia atual para que outras regras também possam ser aplicadas ao pacote.
Se nenhum alvo é especificado, o pacote passa pela regra sem que nenhuma ação seja executada. O contador desta regra, entretanto, é aumentado em uma unidade.
-o
— Estabelece as interfaces de rede de saída para uma regra. Esta opção é válida apenas para as cadeias OUTPUT e FORWARD na tabela filter
, e para a cadeia POSTROUTING nas tabelas nat
e mangle
. Este parâmetro aceita as mesmas opções que o parâmetro de interfaces de rede de entrada (-i
).
-p <protocolo>
— Estabelece o protocolo IP afetado pela regra. Pode ser icmp
, tcp
, udp
, ou all
(todos), ou pode ser um valor numérico, representando um destes ou um protocolo diferente. Você também pode usar quaisquer dos protocolos listados no arquivo /etc/protocols
.
O protocolo "all
" significa que a regra aplica-se a todos os protocolos suportados. Se nenhum protocolo é listado com esta regra, o "all
" é usado.
-s
— Estabelece a origem para um determinado pacote usando a mesma sintaxe do parâmetro de destino (-d
).
Protocolos de rede diferentes oferecem opções de correspondência especializadas que podem ser configuradas para para corresponder a um determinado pacote usando o protocolo em questão. Entretanto, deve-se primeiro especificar o protocolo no comando iptables
. Por exemplo, -p
habilita opções para o protocolo especificado. Note que você também pode usar a ID do protocolo, ao invés do seu nome. Veja, por exemplo, os seguintes exemplos, cada um dos quais tem o mesmo efeito:
<nome-do-protocolo>
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
iptables -A INPUT -p 5813 --icmp-type any -j ACCEPT
Definições de serviços aparecem no arquivo /etc/services
. Por questões de legibilidade, é recomendável usar os nomes dos serviços ao invés dos números de portas.
Proteja o arquivo /etc/services
para prevenir a edição não autorizada. Se este arquivo for editável, crackers podem usá-lo para habilitar portas na sua máquina as quais você tenha decidido deixar fechadas. Para proteger este arquivo, digite os seguintes comandos como root:
[root@myServer ~]# chown root.root /etc/services [root@myServer ~]# chmod 0644 /etc/services [root@myServer ~]# chattr +i /etc/services
Isto previne que o arquivo seja renomeado, removido, ou que tenha links estabelecidos até ele.
Estas opções de correspondência estão disponíveis para o protocolo TCP (-p tcp
):
--dport
— Estabelece a porta de destino para o pacote.
Para configurar esta opção, use um nome de serviço de rede (como www ou smtp), um número de porta, ou um intervalo de números de portas.
Para especificar um intervalo de números de portas, separe os dois números com um dois pontos (:
). Por exemplo: -p tcp --dport 3000:3200
. O maior intervalo válido aceitável é 0:65535
.
Use um ponto de exclamação (!
) após a opção --dport
para causar a correspondência de todos os pacotes que não usem aquele serviço ou porta de rede.
Para visualizar os nomes e aliases de serviços de rede assim como os números de portas que os mesmos usem, veja o arquivo /etc/services
.
A opção de correspondência --destination-port
equivale a --dport
.
--sport
— Estabelece a porta de origem do pacote usando as mesmas opções que --dport
. A opção de correspondência --source-port
equivale a --sport
.
--syn
— Aplica-se a todos os pacotes TCP concebidos para iniciar a comunicação, normalmente chamados de pacotes SYN. Pacotes que carreguem dados não são manuseados.
Use um ponto de exclamação (!
) após a opção --syn
para causar a correspondência de todos os pacotes que não sejam SYN.
--tcp-flags <tested flag list> <set flag list>
— Permite que pacotes TCP que tenham bits (sinalizadores) específicos definidos, correspondam a uma regra.
A opção de correspondência --tcp-flags
aceita dois parâmetros. O primeiro parâmetro é a máscara, uma lista de sinalizadores separados por vírgulas a serem examinados no pacote. O segundo parâmetro é uma lista de sinalizadores separados por vírgulas que devem ser definidos para que a regra corresponda.
Os sinalizadores possíveis são:
ACK
FIN
PSH
RST
SYN
URG
ALL
NONE
Por exemplo, uma regra iptables
que contenha a seguinte especificação corresponde apenas a pacotes TCP que tenham o sinalizador SYN definido e os sinalizadores ACK e FIN não definidos:
--tcp-flags ACK,FIN,SYN SYN
Use um ponto de exclamação (!
) após --tcp-flags
para reverter o efeito da opção de correspondência.
--tcp-option
— Tenta corresponder à opções específicas de TCP que possam ser estabelecidas dentro de um pacote específico. Esta opção de correspondência também pode ser revertida usando o ponto de exclamação (!
).
Estas opções de correspondência estão disponíveis ao protocolo UDP (-p udp
):
--dport
— Especifica a porta de destino para o pacote UDP, usando o nome do serviço, número da porta, ou intervalo de números de portas. A opção de correspondência --destination-port
equivale --dport
.
--sport
— Especifica a porta de origem para o pacote UDP, usando o nome do serviço, número da porta, ou intervalo de números de portas. A opção de correspondência --source-port
equivale a --sport
.
Para especificar um intervalo de números de portas para as opções --dport
e --sport
, separe os dois números usando dois pontos (:). Por exemplo: -p tcp --dport 3000:3200
. O maior intervalo válido aceitável é 0:65535.
As seguintes opções de correspondência estão disponíveis para o Internet Control Message Protocol (ICMP) (-p icmp
):
--icmp-type
— Estabelece o nome ou o número do tipo de ICMP a corresponder à regra. Uma lista de nomes de ICMP válidos pode ser obtida digitando o comando iptables -p icmp -h
.
Opções de correspondência adicionais estão disponíveis através de módulos carregados pelo comando iptables
.
Para usar um módulo de opções de correspondência, carregue o módulo pelo nome, usando a opção -m
, onde <nome-do-módulo>
<nome-do-módulo>
é o nome do módulo.
Vários módulos estão disponíveis por default. Você também pode criar módulos para oferecer funcionalidades adicionais.
A seguinte lista parcial indica os módulos geralmente mais usados:
Módulo limit
— Coloca um limite no número de pacotes que podem corresponder à uma dada regra.
Quando usado com o alvo LOG
, o módulo limit
pode prevenir que uma enxurrada de pacotes correspondentes encham o arquivo de registro do sistema com mensagens repetitivas ou utilizem recursos do sistema demasiadamente.
Consulte a Seção 2.9.3.5, “Opções de Alvo” para mais informações sobre o alvo LOG
.
O módulo limit
habilita as seguintes opções:
--limit
— Estabelece o número máximo de eventos de correspondência para um determinado período de tempo, especificado como um par
. Por exemplo, o uso de <valor>/<período>
--limit 5/hour
permite cinco eventos de correspondência à regra por hora.
Períodos podem ser especificados em segundos, minutos, horas ou dias.
Se um modificador não for indicado, o valor padrão 3/hour
é usado.
--limit-burst
— Estabelece um limite ao número de pacotes que podem corresponder à uma regra ao mesmo tempo.
Esta opção é especificada como um número inteiro e deve ser usada junto com a opção --limit
.
Se nenhum valor for especificado, o valor padrão (5) é usado.
Módulo state
— Habilita a correspondência de estados.
O módulo state
habilita as seguintes opções:
--state
— Faz a correspondência de um pacote com os seguintes estados de conexão:
ESTABLISHED
— O pacote correspondente é associado a outros pacotes em uma conexão estabelecida. Você deve aceitar este estado se você quiser manter uma conexão entre um cliente e um servidor.
INVALID
— O pacote correspondente não pode ser atrelado à uma conexão conhecida.
NEW
— O pacote correspondente ou está criando uma nova conexão ou faz parte de uma conexão de duas mãos não vista antes. Você precisa aceitar este estado se você quiser permitir novas conexões a um serviço.
RELATED
— O pacote correspondente está iniciando uma nova conexão relacionada de alguma forma à uma conexão existente. Um exemplo disto é o FTP, o qual usa uma conexão para controle de tráfego (porta 21), e uma conexão separada para transferência (porta 20).
Estes estados de conexão podem ser usados um com o outro separando-os por vírgulas, como -m state --state INVALID,NEW
.
Módulo mac
— Habilita a correspondência de hardware usando endereços MAC.
O módulo mac
habilita a seguinte opção:
--mac-source
— Faz a correspondência usando um endereço MAC da placa de interface de rede que enviou o pacote. Para excluir um endereço MAC de uma regra, coloque um ponto de exclamação (!
) após a opção de correspondência --mac-source
.
Consulte a página man do iptables
para mais opções de correspondência disponíveis aos diversos módulos.
Quando um pacote corresponde à uma regra específica, a regra pode direcionar o pacote para uma variedade de alvos diferentes, os quais determinam a ação adequada. Cada cadeia tem um alvo padrão, o qual é usado se nenhuma das regras daquela cadeia corresponde a um pacote, ou se nenhuma das regras que correspondem ao pacote possuem um alvo especificado.
Os seguintes são os alvos padrão:
— Uma cadeia definida pelo usuário (user-defined chain) dentro da tabela. Nomes de cadeias definidas pelo usuário devem ser exclusivos. Este alvo envia o pacote para a cadeia especificada.
<cadeia-definida-pelo-usuário>
ACCEPT
— Permite que o pacote chegue até o seu destino ou até outra cadeia.
DROP
— Descarta o pacote sem responder ao solicitante. O sistema que enviou o pacote não fica sabendo da falha.
QUEUE
— O pacote é enfileirado para ser posteriormente manuseado por um aplicativo do espaço do usuário.
RETURN
— Para de verificar o pacote contra regras na cadeia atual. Se o pacote com o alvo RETURN
corresponde à uma regra numa cadeia chamada a partir de outra cadeia, o pacote é devolvido à primeira cadeia para que a mesma continue com a verificação de regras a partir de onde tinha parado. Se a regra RETURN
for usada em uma cadeia padrão e o pacote não puder retornar à sua cadeia anterior, o alvo padrão para a cadeia atual é usado.
Além disso, extensões estão disponíveis as quais permitem que outros alvos sejam especificados. Estas extensões são chamadas de módulos de alvos ou módulos de opções de correspondência, e a maioria é aplicável apenas à tabelas e situações específicas. Consulte a Seção 2.9.3.4.4, “Módulos Adicionais de Opções de Correspondência” para maiores informações sobre módulos de opções de correspondência.
Existem vários módulos de alvos adicionais, a maioria dos quais são aplicáveis somente à tabelas e situações específicas. Alguns dos módulos de alvos mais populares incluídos por padrão no Red Hat Enterprise Linux são:
LOG
— Faz um registro de todos os pacotes que correspondem à esta regra. Uma vez que os pacotes são registrados pelo kernel, o arquivo /etc/syslog.conf
determina onde estas entradas de registro são escritas. Por padrão, elas são colocadas no arquivo /var/log/messages
.
Opções adicionais podem ser usadas após o alvo LOG
para especificar a forma como os registros são feitos:
--log-level
— estabelece o nível de prioridade de um evento de registro. Consulte a página man do syslog.conf
para uma lista de níveis de prioridade.
--log-ip-options
— Registra quaisquer opções configuradas no cabeçalho de um pacote IP.
--log-prefix
— Coloca uma string de até 29 caracteres antes da linha do registro quando o mesmo for escrito. Isto pode ser útil ao usar filtros de syslog junto com o registro de pacotes.
Devido a um problema com esta opção, você deve adicionar um espaço após o valor de log-prefix
.
--log-tcp-options
— Registra quaisquer opções configuradas no cabeçalho de um pacote TCP.
--log-tcp-sequence
— Escreve o número de seqüência TCP do pacote no registro do sistema.
REJECT
— Manda um pacote de erro de volta ao sistema remoto e descarta o pacote.
O alvo REJECT
aceita --reject-with
(onde <tipo>
<tipo>
é o tipo de rejeição), permitindo que informações mais detalhadas sejam retornadas com o pacote de erro. Caso nenhuma outra opção seja usada, a mensagem port-unreachable
é o tipo de erro padrão utilizado. Consulte a página man do iptables
para uma lista completa de opções para
.
<tipo>
Outros alvos adicionais, incluindo vários que são úteis para IP masquerading usando a tabela nat
, ou para alteração de pacotes usando a tabela mangle
, podem ser encontrados na página man do iptables
.
O comando de listagem padrão, iptables -L [<nome-da-cadeia>]
, oferece uma visão geral bem básica das cadeias atuais da tabela padrão filter
. Opções adicionais oferecem mais informações:
-v
— Gera informações detalhadas da saída, como o número de pacotes e bytes processado por cada cadeia, o número de pacotes e bytes que tenham correspondido a cada regra, e quais interfaces aplicam-se à uma dada regra.
-x
— Expande números para seus valores exatos. Em um sistema de alta utilização, o número de pacotes e bytes processados por uma dada cadeia ou regra pode ser abreviado para Kilobytes
, Megabytes
(Megabytes) ou Gigabytes
. Esta opção força a exibição do número por completo.
-n
— Exibe endereços IP e números de porta em formato numérico, ao invés do formato padrão de nome de host e serviço de rede.
--line-numbers
— Lista regras em cada cadeia precedidas por um número representando sua ordem numérica na cadeia. Esta opção é útil ao tentar remover uma regra específica de uma cadeia ou determinar onde inserir uma regra em uma cadeia.
-t <nome-da-tabela>
— Especifica o nome de uma tabela. Se omitido, a tabela padrão filter
é usada.
Os seguintes exemplos ilustram o uso de várias destas opções. Note a diferença na exibição de bytes ao incluir a opção -x
.
[root@myserver ~]# iptables -L OUTPUT -v -n -x Chain OUTPUT (policy ACCEPT 64005 packets, 6445791 bytes) pkts bytes target prot opt in out source destination 1593 133812 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 [root@myserver ~]#iptables -L OUTPUT -v -n Chain OUTPUT (policy ACCEPT 64783 packets, 6492K bytes) pkts bytes target prot opt in out source destination 1819 153K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 [root@myserver ~]#
Regras criadas com o comando iptables
são armazenadas na memória. Se o sistema for reiniciado antes que o conjunto de regras do iptables
seja salvo, todas as regras são perdidas. Para que as regras do netfilter persistam entre reinicializações do sistema, as mesmas precisam ser salvas. Para salvar as regras do netfilter, digite o seguinte comando como root:
/sbin/service iptables save
Isto executa o script the inicialização do iptables
, o qual roda o programa /sbin/iptables-save
e escreve a configuração atual do iptables
em /etc/sysconfig/iptables
. O arquivo existente /etc/sysconfig/iptables
é salvo como /etc/sysconfig/iptables.save
.
A próxima vez que o sistema inicializar, o script de inicialização do iptables
restaura as regras salvas em /etc/sysconfig/iptables
usando o comando /sbin/iptables-restore
.
Apesar de ser uma boa idéia testar uma nova regra do iptables
antes de submetê-la ao arquivo /etc/sysconfig/iptables
, é possível copiar regras do iptables
encontradas em versões deste arquivo em um outro sistema para este arquivo. Isto permite a distribuição de grupos de regras do iptables
para várias máquinas de forma rápida.
Você também pode salvar as regras do iptables
em um arquivo específico para distribuição, backup, ou outros propósitos. Para salvar suas regras do iptables
, digite o seguinte comando como root:
[root@myserver ~]# iptables-save >
onde<nome-do-arquivo>
<nome-do-arquivo>
é um nome definido pelo usuário para o seu grupo de regras.
Se você distribuir o arquivo /etc/sysconfig/iptables
para outras máquinas, digite /sbin/service iptables restart
para que as novas regras façam efeito.
Note a diferença entre o commandiptables
(/sbin/iptables
), o qual é usado para manipular as tabelas e cadeias que fazem parte da funcionalidade do iptables
, e o serviceiptables
(/sbin/iptables service
), o qual é usado para habilitar e desabilitar o iptables
em si.
Existem dois métodos básicos para controlar o iptables
no Red Hat Enterprise Linux:
/sbin/service iptables
— Usado para manipular várias funções do <opção>
iptables
usando o seu script de inicialização. As seguintes opções estão disponíveis:
start
— Se uma firewall estiver configurada (ou seja, /etc/sysconfig/iptables
existir), todas as instâncias do iptables
atualmente rodando são totalmente paradas e então reiniciadas usando o comando /sbin/iptables-restore
. Esta opção apenas funciona caso o módulo de kernel ipchains
não esteja carregado. Para verificar se este módulo encontra-se carregado, digite o seguinte comando como root:
[root@MyServer ~]# lsmod | grep ipchains
Se este comando não gerar nenhuma saída, significa que o módulo não encontra-se carregado. Se for necessário, use o comando /sbin/rmmod
para remover o módulo.
stop
— Se uma firewall estiver rodando, as regras da firewall armazenadas na memória são liberadas, e todos os módulos e auxiliares do iptables são descarregados.
Se a diretiva IPTABLES_SAVE_ON_STOP
no arquivo de configuração /etc/sysconfig/iptables-config
tiver seu valor padrão alterado para yes
, as regras atuais são salvas em /etc/sysconfig/iptables
e quaisquer regras existentes são movidas para o arquivo /etc/sysconfig/iptables.save
.
Consulte a Seção 2.9.5.1, “Arquivo de Configuração de Scripts de Controle do IPTables” para maiores informações sobre o arquivo iptables-config
.
restart
— Se uma firewall estiver rodando, as regras da firewall armazenadas na memória são liberadas, e a firewall é reiniciada se estiver configurada em /etc/sysconfig/iptables
. Esta opção funciona apenas se o módulo ipchains
do kernel estiver carregado.
Se a diretiva IPTABLES_SAVE_ON_RESTART
no arquivo de configuração /etc/sysconfig/iptables-config
tiver seu valor padrão alterado para yes
, as regras atuais são salvas em /etc/sysconfig/iptables
e quaisquer regras existentes são movidas para o arquivo /etc/sysconfig/iptables.save
.
Consulte a Seção 2.9.5.1, “Arquivo de Configuração de Scripts de Controle do IPTables” para maiores informações sobre o arquivo iptables-config
.
status
— Exibe o estado da firewall e lista todas as regras ativas.
A configuração padrão para esta opção exibe os endereços IP em cada regra. Para exibir informações sobre domínio e nome de host, edite o arquivo /etc/sysconfig/iptables-config
e mude o valor de IPTABLES_STATUS_NUMERIC
para no
. Consulte a Seção 2.9.5.1, “Arquivo de Configuração de Scripts de Controle do IPTables” para maiores informações sobre o arquivo iptables-config
.
panic
— Limpa todas as regras da firewall. A diretiva de todas as tabelas configuradas é mudada para DROP
.
Esta opção pode ser útil se um servidor for comprometido. Ao invés de desconectar fisicamente da rede, ou desligar o sistema, você pode usar esta opção para parar todo e qualquer tráfego subseqüente na rede, mas deixar a máquina em um estado pronto para uma análise ou algum tipo de atividade forense.
save
— Salva regras de firewall em /etc/sysconfig/iptables
usando iptables-save
. Consulte a Seção 2.9.4, “Salvando Regras do IPTables” para mais informações.
Para usar os mesmos comandos do script de inicialização para controlar o netfilter para IPv6, substitua ip6tables
por iptables
nos comandos /sbin/service
listados nesta seção. Para mais informação sobre o IPv6 e o netfilter, consulte a Seção 2.9.6, “IPTables e IPv6”.
O comportamento dos scripts de inicialização do iptables
é controlado pelo arquivo de configuração /etc/sysconfig/iptables-config
. A seguir está uma lista de diretivas encontradas neste arquivo:
IPTABLES_MODULES
— Especifica uma lista, separada por espaços, de módulos adicionais do iptables
a serem carregados quando uma firewall for ativada. Estes podem incluir rastreamento de conexão e auxiliares de NAT.
IPTABLES_MODULES_UNLOAD
— Descarrega módulos ao reiniciar e parar. Esta diretiva aceita os seguintes valores:
yes
— O valor padrão. Esta opção deve ser usada para que um estado correto para as ações de parar ou reiniciar uma firewall possa ser atingido.
no
— Esta opção deve ser usada apenas se houverem problemas ao descarregar os módulos do netfilter.
IPTABLES_SAVE_ON_STOP
— Salva as regras atuais da firewall em /etc/sysconfig/iptables
quando a firewall for parada. Esta diretiva aceita os seguintes valores:
yes
— Salva regras existentes em /etc/sysconfig/iptables
quando a firewall for parada, movendo a versão anterior para o arquivo /etc/sysconfig/iptables.save
.
no
— O valor padrão. Não salva regras existentes quando a firewall for parada.
IPTABLES_SAVE_ON_RESTART
— Salva as regras atuais da firewall quando a firewall for reiniciada. Esta diretiva aceita os seguintes valores:
yes
— Salva regras existentes em /etc/sysconfig/iptables
quando a firewall for reiniciada, movendo a versão anterior para o arquivo /etc/sysconfig/iptables.save
.
no
— O valor padrão. Não salva regras existentes quando a firewall for reiniciada.
IPTABLES_SAVE_COUNTER
— Salva e restaura todos os contadores de pacotes e de bytes em todas as cadeias e regras. Esta diretiva aceita os seguintes valores:
yes
— Salva o valor dos contadores.
no
— O valor padrão. Não salva o valor dos contadores.
IPTABLES_STATUS_NUMERIC
— Exibe a saída de endereços IP em formato numérico ao invés de domínios e nomes de host. Esta diretiva aceita os seguintes valores:
yes
— O valor padrão. Retorna apenas endereços IP numa saída de estado.
no
— Retorna domínios ou nomes de host numa saída de estado.
Se o pacote iptables-ipv6
estiver instalado, o netfilter do Red Hat Enterprise Linux pode filtrar a versão da próxima geração do protocolo de Internet, o IPv6. O comando usado para manipular o netfilter IPv6 é o ip6tables
.
A maioria das diretivas para este comando são idênticas àquelas usadas para o iptables
, entretanto, a tabela nat
ainda não é suportada. Isto significa que ainda não é possível executar tarefas de conversão de endereços IPv6 de rede, como masquerading e encaminhamento de portas.
As regras para o ip6tables
são salvas no arquivo /etc/sysconfig/ip6tables
. As regras anteriores salvas pelos scripts de inicialização do ip6tables
são salvas no arquivo /etc/sysconfig/ip6tables.save
.
Opções de configuração para o script de inicialização so ip6tables
são armazenadas em /etc/sysconfig/ip6tables-config
, e os nomes para cada diretiva variam um pouco em relação aos nomes das diretivas do iptables
.
Por exemplo, a diretiva IPTABLES_MODULES
no arquivo iptables-config
equivale à diretiva IP6TABLES_MODULES
no arquivo ip6tables-config
.
Consulte os seguintes recursos para informações adicionais sobre a filtragem de pacotes usando o iptables
.
man iptables
— Contém uma descrição do iptables
, assim como uma lista abrangente de alvos, opções, e extensões de correspondência.
http://www.netfilter.org/ — Esta é a casa do projeto netfilter/iptables. O site contém informações variadas sobre o iptables
, incluindo uma FAQ focada em problemas específicos e vários guias úteis escritos pelo Rusty Russell, o mantenedor da firewall IP do Linux. Os documentos HOWTO do site cobrem tópicos como conceitos básicos de rede, filtragem de pacotes no kernel, e configurações de NAT.
http://www.linuxnewbie.org/nhf/Security/IPtables_Basics.html — Uma introdução sobre como pacotes trafegam pelo kernel do Linux, além de uma introdução à construção de comandos iptables
básicos.
[2] Uma vez que BIOS de sistemas variam de acordo com o fabricante, alguns podem não suportar qualquer tipo de proteção por senha, enquanto outros podem suportar um tipo mas não o outro.
[3] O GRUB também aceita senhas não criptografadas, mas recomendamos que use um hash MD5, para maior segurança.
[4] Este acesso ainda é sujeito às restrições impostas pelo SELinux, se disponível. Consulte a Seção 3.2, “Introdução ao SELinux” para maiores informações.
[5] Um sistema no qual ambos, cliente e servidor compartilham uma chave em comum, usada para criptografar e descriptografar comunicações de rede
Segue nesta seção, uma apresentação básica dos Mecanismos de Controle de Acesso (ACMs). Os ACMs oferecem aos administradores de sistemas, um meio de controlar quais usuários e processos podem acessar diferentes arquivos, despositivos, interfaces, etc. em um sistema de computador. Isto é primordial quando se trata de assegurar um sistema de computadores ou rede de trabalho de qualquer tamanho.
O Controle de Acesso Discricionário (DAC) define os controles de acesso básico para objetos em um sistema de arquivo. Este é um típico controle de acesso, oferecido pelas permissões de arquivo, compartilhamento, etc. Tal acesso, condiz geralmente ao dono do objeto (arquivo, diretório, dispositivo, etc.).
DAC apresenta uma maneira de evitar que usuários ou grupos (assuntos) acessem objetos baseados em identidade. Dependendo das permissões de acesso ao assunto, eles podem também passar permissões à outros assuntos.
Controle de Acesso Obrigatório (MAC) é um mecanismo de segurança que restringe o nível de controle que os usuários (assuntos) possuem sob os objetos que eles criam. Diferente de uma implementação DAC , onde usuários possuem total controle sob seus próprios arquivos, diretórios, etc. O MAC adiciona rótulos, ou categorias, em todos os objetos de sistema de arquivo. Usuários e processos devem ter o acesso apropriado para estas categorias antes que eles possam interagir com estes objetos.
No Red Hat Enterprise Linux, MACé imposto pelo SELinux. Para maiores informações, consulte o Seção 3.2, “Introdução ao SELinux”.
Controle de Acesso baseado na Função (RBAC) é um método alternativo de controlar o acesso do usuário à objetos de sistema de arquivo. Ao invés do acesso ser controlado pelas permissões de usuários, o administrador de sistemas estabelece Funções baseadas em requerimentos funcionais de negócios ou critérios similares. Estas Funções possuem diferentes tipos e níveis de acesso à objetos.
Em contraste com o DAC ou MAC, onde usuários possuem acesso à objetos baseados nas permissões próprias e de objeto, os usuários de um sistema RBAC precisam ser membros de um grupo apropriado, ou de uma Função, antes de interagir com arquivos, diretórios, dispositivos, etc.
De um ponto de vista administrativo, o simples controle dos membros do grupo facilita o controle de quem acessa diversas partes do sistema de arquivo.
Segurança de Nível Múltiplo (MLS) é um esquema de segurança de Controle de Acesso Obrigatório específico (MAC). Neste esquema, os processos são chamados de Assuntos. Arquivos, soquetes e outras entidades de sistema de operação passiva são chamadas de Objetos. Para maiores informações, consulte o Seção 3.4, “Segurança de Nível Múltiplo (MLS)”.
A Segurança Aprimorada Linux (SELinux) é uma arquitetura de segurança integrada no kernel 2.6.x usando os Módulos de Segurança Linux (LSM). É um projeto da National Security Agency (NSA) dos Estados Unidos e da comunidade SELinux. A integração do SELinux no Red Hat Enterprise Linux foi um esforço conjunto entre a NSA e a Red Hat.
O SELinux oferece um sistema de Controle de Acesso Obrigatório - MAC (Mandatory Access Control) flexível incorporado ao kernel do Linux. Sob o Controle de Acesso Discricionário - DAC (Discretionary Access Control) padrão do Linux, um aplicativo ou processo rodando como um usuário (UID ou SUID) tem as permissões do usuário em relação a objetos como arquivos, soquetes, e outros processos. Rodar um kernel com MAC protege o sistema de aplicativos maléficos ou defeituosos que possam danificar ou destruir um sistema.
O SELinux define os direitos de acesso e transição de cada usuário, aplicativo, processo e arquivo no sistema. O SELinux então governa as interações destas entidades usando uma política de segurança que especifica quão severa ou branda uma certa instalação do Red Hat Enterprise Linux deve ser.
No dia-a-dia, os usuários, em grande parte, mal perceberão a existência do SELinux. Apenas os administradores de sistemas precisam considerar o nível de rigidez a ser implementado para os seus ambiente de servidores. A política pode ser tão severa ou branda quanto for preciso, e é altamente detalhada. Este nível de detalhamento dá ao kernel SELinux o controle completo e granular sobre todo o sistema.
Quando uma entidade (por exemplo, um aplicativo) tenta acessar um objeto (por exemplo, um arquivo), o servidor de imposição de políticas no kernel verifica um cache do vetor de permissões de acesso (AVC), onde permissões de entidades e objetos são temporariamente armazenadas. Se uma decisão não pode ser efetivada com base nos dados do AVC, o pedido continua até o servidor de segurança, o qual busca o contexto de segurança do aplicativo e do arquivo em uma matriz. A permissão é então concedida ou negada, com uma mensagem avc: denied
detalhada em /var/log/messages
caso a permissão seja negada. O contexto de segurança de entidades e objetos é obtido a partir da política instalada, a qual também fornece a informação para povoar a matriz do servidor de segurança.
Consulte o seguinte diagrama:
Ao invés de rodar em modo imposição, o SELinuxpode rodar em modo permissivo, onde o AVC é verificado, e negações são registradas, entretanto o SELinux não impõe a política. Isto pode ser útil para resolução de problemas e para o desenvolvimento ou o aprimoramento de políticas do SELinux.
Para maiores informações sobre o funcionamento do SELinux, consulte a Seção 3.2.3, “Recursos Adicionais”.
As seções seguintes descrevem os arquivos de configuração e sistemas de arquivos referentes ao SELinux.
O pseudo-sistema de arquivos /selinux/
contém comandos que são normalmente usados pelo subsistema do kernel. Este tipo de sistema de arquivos é similar ao pseudo-sistema de arquivos /proc/
.
Administradores e usuários normalmente não precisam manipular este componente.
O seguinte exemplo oferece amostras do conteúdo do diretório /selinux/
:
-rw-rw-rw- 1 root root 0 Sep 22 13:14 access dr-xr-xr-x 1 root root 0 Sep 22 13:14 booleans --w------- 1 root root 0 Sep 22 13:14 commit_pending_bools -rw-rw-rw- 1 root root 0 Sep 22 13:14 context -rw-rw-rw- 1 root root 0 Sep 22 13:14 create --w------- 1 root root 0 Sep 22 13:14 disable -rw-r--r-- 1 root root 0 Sep 22 13:14 enforce -rw------- 1 root root 0 Sep 22 13:14 load -r--r--r-- 1 root root 0 Sep 22 13:14 mls -r--r--r-- 1 root root 0 Sep 22 13:14 policyvers -rw-rw-rw- 1 root root 0 Sep 22 13:14 relabel -rw-rw-rw- 1 root root 0 Sep 22 13:14 user
Por exemplo, a execução do comando cat
no arquivo enforce
revela ou um 1
, para modo imposição, ou um 0
, para modo permissivo.
As seções seguintes descrevem os arquivos de configuração e política do SELinux, assim como os sistemas de arquivos relacionados localizados no diretório /etc/
.
There are two ways to configure SELinux under Red Hat Enterprise Linux: using the SELinux Administration Tool (system-config-selinux
), or manually editing the configuration file (/etc/sysconfig/selinux
).
O /etc/sysconfig/selinux
é o arquivo de configuração principal usado para habilitar ou desabilitar o SELinux, determinar qual política deve ser imposta no sistema, e como impor tal política.
O /etc/sysconfig/selinux
contém um link simbólico para o verdadeiro arquivo de configuração, o /etc/selinux/config
.
Veja a seguir o conjunto completo de opções de configuração disponíveis:
SELINUX=
— Define o estado de nível superior do SELinux em um sistema.
enforcing|permissive|disabled
enforcing
— A política de segurança do SELinux é imposta.
permissive
— O sistema SELinux emite avisos mas não impõe a política.
Isto pode ser útil para fins de depuração e resolução de problemas. Em modo permissivo, mais negações são registradas porque entidades podem continuar com ações que seriam negadas em modo imposição. Por exemplo, percorrer um diretório em modo permissivo produz uma mensagem avc: denied
para cada nível de diretório lido. Em modo imposição, o SELinux pararia assim que a primeira negação ocorresse, prevenindo que mensagens de erro adicionais ocorressem.
disabled
— O SELinux é totalmente desabilitado. O SELinux é desvinculado do kernel, e o pseudo-sistema de arquivos torna-se não registrado.
Ações tomadas enquanto o SELinux estiver desabilitado podem resultar em um arquivo não tendo mais o contexto de segurança correto. Ou seja, o contexto de segurança definido pela política. A melhor maneira de reetiquetar o sistema de arquivos é criar o arquivo sinalizador /.autorelabel
e reinicializar a máquina. Isto faz com que a etiquetagem ocorra bem cedo durante o processo de inicialização, antes de qualquer processo estar rodando no sistema. O uso deste procedimento significa que processos não podem acidentalmente criar arquivos ou iniciar no contexto errado.
É possível usar o comando fixfiles relabel
para reetiquetar o sistema de arquivos antes de habilitar o SELinux. Entretanto, este método não é recomendável porque uma vez que for concluído, ainda é possível que processos rodem no contexto errado. Tais processos podem criar arquivos que também possuam o contexto errado.
Espaços adicionais no final de uma linha de configuração, ou linhas adicionais no final do arquivo podem causar comportamento inesperado. Para ficar imune a isto, remova espaços desnecessários.
SELINUXTYPE=
— Especifica a política que o SELinux deve impor.
targeted|strict
targeted
— Apenas os daemons de rede visados (targeted) são protegidos.
Os seguintes daemons são protegidos pela política targeted padrão: dhcpd, httpd (apache.te), named, nscd, ntpd, portmap, snmpd, squid
, e syslogd
. O resto do sistema roda no domínio unconfined_t. Este domínio permite que entidades e objetos com aquele contexto de segurança operem usando a segurança padrão do Linux.
Os arquivos de política para estes daemons estão localizados em /etc/selinux/targeted/src/policy/domains/program
. Estes arquivos estão sujeitos à mudanças à medida que novas versões do Red Hat Enterprise Linux são lançadas.
Policy enforcement for these daemons can be turned on or off, using Boolean values controlled by the SELinux Administration Tool (system-config-selinux
).
A atribuição de um valor Booleano de 0
(zero) para um daemon visado desabilita a transição de política para o daemon. Por exemplo, você pode configurar dhcpd_disable_trans
para 0
para prevenir que o init
faça a transição do dhcpd
do domínio unconfined_t para o domínio especificado em dhcpd.te
.
Use o comando getsebool -a
para listar todos os Booleanos do SELinux. Veja a seguir um exemplo sobre o uso do comando setsebool
para configurar um Booleano do SELinux. A opção -P
faz com que a mudança torne-se permanente. Sem esta opção, o Booleano mudaria para 1
na reinicialização.
setsebool -P dhcpd_disable_trans=0
strict
— Total proteção do SELinux para todos os daemons. Contextos de segurança são definidos para todas as entidades e objetos, e todas as ações são processadas pelo servidor de imposição de políticas.
SETLOCALDEFS=
— Controla como definições locais (usuários e Booleanos) são estabelecidas. Use 1 para fazer com que estas definições sejam controladas pelo 0|1
load_policy
de arquivos em /etc/selinux/
, ou use 0 para fazer com que sejam controladas pelo <nome-da-política>
semanage
.
Você não deve usar um valor que não seja o padrão (0) a não ser que você esteja completamente ciente do impacto de tal mudança.
O diretório /etc/selinux/
é a localização principal de todos os arquivos de política, bem como do principal arquivo de configuração.
O seguinte exemplo oferece amostras do conteúdo do diretório /etc/selinux/
:
-rw-r--r-- 1 root root 448 Sep 22 17:34 config drwxr-xr-x 5 root root 4096 Sep 22 17:27 strict drwxr-xr-x 5 root root 4096 Sep 22 17:28 targeted
Os dois subdiretórios, strict/
e targeted/
, são os diretórios específicos onde os arquivos de política com o mesmo nome (ou seja, strict
e targeted
) são armazenados.
Veja a seguir os utilitários SELinux mais utilizados:
/usr/sbin/setenforce
— Modifica, em tempo real, o modo de execução do SELinux.
Por exemplo:
setenforce 1
— O SELinux roda em modo imposição.
setenforce 0
— O SELinux roda em modo permissivo.
Para realmente desabilitar o SELinux, você precisa ou especificar o parâmetro do setenforce
adequado em /etc/sysconfig/selinux
ou passar o parâmetro selinux=0
para o kernel, ou em /etc/grub.conf
ou durante a inicialização.
/usr/sbin/sestatus -v
— Exibe o estado detalhado de um sistema rodando o SELinux. O exemplo a seguir mostra um trecho da saída do sestatus -v
:
SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 21 Policy from config file: targeted Process contexts: Current context: user_u:system_r:unconfined_t:s0 Init context: system_u:system_r:init_t:s0 /sbin/mingetty system_u:system_r:getty_t:s0
/usr/bin/newrole
— Roda um novo shell em um novo contexto ou papel. A política deve permitir a transição para o novo papel..
Este comando está disponível apenas se você tiver o pacote policycoreutils-newrole
instalado, o qual é necessário às políticas strict e MLS.
/sbin/restorecon
— Estabelece o contexto de segurança de um ou mais arquivos através da marcação de atributos estendidos com o arquivo ou contexto de segurança apropriado.
/sbin/fixfiles
— Verifica ou corrige o banco de dados de contextos de segurança no sistema de arquivos.
Consulte as páginas man associadas a estes utilitários para maiores informações.
Consulte o conteúdo dos pacotes setools
ou policycoreutils
para mais informações sobre todos os utilitários binários disponíveis. Para visualizar o conteúdo de um pacote, use o seguinte comando:
rpm -ql
<nome-do-pacote>
Consulte os seguintes recursos para obter informações mais detalhadas sobre o SELinux.
/usr/share/doc/setools-<
Toda a documentação para os utilitários contidos no pacote número-da-versão
>/setools
. Isto inclui todos os scripts auxiliares arquivos de configuração, e a documentação em si.
http://www.nsa.gov/selinux/ A homepage do time de desenvolvimento do SELinux na NSA, com vários recursos disponíveis nos formatos HTML e PDF. Embora alguns destes recursos não sejam específicos para o SELinux, alguns conceitos ainda podem ser relevantes.
http://fedora.redhat.com/docs/ A homepage do projeto de documentação do Fedora, a qual contém materiais específicos do Fedora Core que podem estar mais atualizados uma vez que o ciclo de lançamentos é muito mais curto.
http://selinux.sourceforge.net A homepage da comunidade SELinux.
O SELinux foi originalmente um projeto de desenvolvimento da National Security Agency (NSA )[6], entre outros. O SELinux é uma implementação do Flask [7], uma arquitetura de segurança de sistemas operacionais. A NSA integrou o SELinux ao kernel do Linux usando a estrutura dos Módulos de Segurança Linux (LSM ). O SELinux motivou a criação dos LSM, conforme sugestão do Linus Torvalds, que queria uma abordagem modular para segurança, ao invés de simplesmente aceitar o SELinux no kernel.
Originariamente, a implementação do SELinux usava IDs de segurança persistente (PSIDs) armazenadas em um campo vago do inode ext2. Estas representações numéricas (ou seja, ilegíveis para o usuário) eram associadas pelo SELinux à uma etiqueta de contexto de segurança. Infelizmente, isto implicava a modificação de cada tipo de sistema de arquivos para suportar PSIDs, e portanto não era uma solução redimensionável nem tampouco uma solução que seria suportada upstream no kernel do Linux.
A evolução subseqüente do SELinux veio na forma de um módulo de kernel carregável para a série de kernels de versões 2.4.<x>
do Linux. Este módulo armazenava PSIDs em um arquivo normal, e o SELinux podia suportar mais sistemas de arquivos. Esta solução não foi ideal em termos de desempenho, e era inconsistente de uma plataforma para outra. Finalmente, o código do SELinux foi integrado upstream ao kernel 2.6.x
, o qual oferece completo suporte para os LSM e possui funções extendidas
(xattrs
) no sistema de arquivos ext3. O SELinux mudou para a utilização de xattrs para o armazenamento de informações de contexto de segurança. O espaço de nome (namespace) xattr oferece a separação útil para múltiplos módulos de segurança existentes no mesmo sistema.
Muito do trabalho despendido em aprontar o kernel para upstream, assim como o desenvolvimento subseqüente do SELinux tem sido um esforço conjunto entre a NSA, a Red Hat, e a comunidade de desenvolvedores do SELinux.
Para maiores informações sobre a história do SELinux, o site definitivo é o http://www.nsa.gov/selinux/.
Em muitos negócios, é de suma importância proteger dados sensíveis e confidenciais. Se uma informação torna-se pública, os negócios podem enfrentar ramificações financeiras ou legais. No mínimo, irão sofrer uma perda de confiança dos clientes. Na maioria dos casos, no entanto, eles não conseguem se recuperar destas perdas financeiras ou de outras perdas, com investimento ou compensação apropriada.
Não pode-se dizer o mesmo sobre comunidades de defesa e afins, as quais incluem serviços militares, organizações de inteligência e algumas áreas de serviço policial. Estas organizações não podem ser recuperadas facilmente caso estas informações confidenciais sejam vazadas, e podem nunca se recuperarem. Estas comunidades requerem maiores níveis de segurança do que aqueles utilizados pelos negócios e outras organizações.
Informações com níveis diferenciados de segurança no mesmo sistema de computador, representam uma verdadeira ameaça. Isolar informações de níveis de segurança diferentes não soluciona o problema, apesar de usuários diversos acessarem usando contas diferentes, com permissões diferentes e controles de acesso diferentes.
Algumas empresas vão mais adiante e compram sistemas dedicados para cada nível de segurança. No entanto, isto é geralmente extremamente caro. É necessário um mecanismo diferente para habilitar usuários com diferentes níveis de segurança para acessar sistemas simultaneamente, sem medo de contaminar informações.
O termo nível múltiplo deriva das classificações de segurança da comunidade de defesa. Confidencial, Secreto e Top Secret.
Indivíduos precisam receber espaços vazios apropriados antes que eles possam ver as informações classificadas. Aqueles com espaços vazios Confidenciais, são autorizados a somente visualizar documentos Confidenciais. Eles não estão autorizados a ver informações Secretas ou de Top Secret. As regras que se aplicam ao fluxo de dados, operam desde níveis mais baixos à níveis mais altos e nunca o oposto. Veja a ilustração a seguir:
A hierarquia dos Níveis de Segurança da Informação. A seta indica a direção que as regras permitem que os dados fluam.
SELinux, como muitos outros sistemas que protegem os dados de nível múltiplo, utiliza o modelo BLP. Este modelo especifica como a informação pode fluir dentro de um sistema baseado em rótulos anexados a cada assunto ou objeto. Consulte o seguinte diagrama:
Os processos podem ler o mesmo nível de segurança ou mais baixo, mas somente pode escrever para si próprios ou para níveis de segurança mais altos.
Neste sistema, os usuários, computadores e redes de trabalho, utilizam rótulos para indicar os níveis de segurança. Os dados podem fluir entre níveis similares, por exemplo entre "Segredo" e "Segredo", ou de um nível mais baixo até um nível mais alto. Isto significa que os usuários de nível "Segredo" podem compartilhar dados entre si e também podem recuperar informações em um nível Confidencial (ou seja, nível mais baixo). No entanto, os dados não podem fluir de um nível mais alto para um mais baixo. Isto evita que processos em nível "Segredo", visualizem informações classificadas como "Top Secret". Ele também previne que processos em um nível mais alto escrevam informações, acidentalmente, para um nível mais baixo. Esta ação é chamada de modelo "não leia, não escreva".
O acesso à regras MLS combinam com as permissões de acesso convencionais (permissões de arquivo). Por exemplo, se um usuário com um nível de segurança de "Segredo", usar o Controle de Acesso Discreto (DAC) para bloquear o acesso de um arquivo à outros usuários, ele também bloqueia o acesso à usuários com nível de segurança de "Top Secret". Um espaço livre de segurança maior não dá permissão automática para navegar de forma arbitrária em um sistema de arquivo.
Usuários com espaços livres de nível máximo não adquirem automaticamente direitos administrativos em sistemas de nível múltiplo. Apesar de terem acesso à toda informação nos computadores, é diferente de ter direitos iguais.
Como já discutido anteriormente, os assuntos e objetos são rotulados com Níveis de Segurança (SLs) os quais são compostos por dois tipos de entidades:
Confidencialidade
: — Uma função hierárquica, tal como "Segredo" ou "Top Secret".
Categorias
: — Um conjunto de funções não hierárquicas tais como "Somente EUA" ou "UFO".
Um SL deve possuir uma confidencialidade e pode ter zero ou mais categorias.
Exemplos de SLs São { Secreto / UFO, Crypto }, { Top Secret / UFO, Crypto, Stargate } e { Não classificado }
Verifique a confidencialidade hierárquica seguida de zero ou mais categorias. A razão pela qual ela possui categorias, assim como confidencialidades, é que as confidencialidades podem ser divididas dependendo da necessidade. Por exemplo, embora o processo possa ser esvaziado para o nível de confidencialidade "Segredo", ele pode não precisar qualquer tipo de acesso ao projeto "Drive Distorcido" (que pode ser o nome de uma categoria).
Níveis de Segurança em objetos são chamados de Classificações.
Os Níveis de Segurança em assuntos são chamados de Áreas Livres
Dessa forma, os objetos são rotulados com a Classificação, enquanto assuntos operam com uma Área Livre específica. Os níveis de Segurança também podem ter Intervalos, mas isto ultrapassa o escopo desta apresentação.
O SELinux, utiliza o modelo Bell-La PadulaBLP com Imposição de Tipo (TE) para sua integridade. Em outras palavras, a política MLS, assegura que um Assunto tenha uma área livre apropriada para acessar um Objeto de uma classificação específica.
Por exemplo, na MLS, o sistema precisa saber como processar uma solicitação tal como: Um processo rodando com uma área livre de { Top Secret / UFO, Rail gun } pode escrever para um arquivo classificado como { Top Secret / UFO } ?
O modelo MLS e a política implementada para ele, irá determinar a resposta. (Considere, por exemplo, o problema de informação vazando da categoria Rail gun no arquivo).
O MLS encontra um conjunto bastante estreito (ainda que crítico) de requerimentos de segurança, baseado na maneira que as informações e pessoas são gerenciadas em ambientes extremamente controlados, tal como o exército. Geralmente, é difícil trabalhar com a MLS além de não mapear bem em situações de casos gerais.
A Imposição de Tipo (TE) sob o SELinux é mais flexível e possui um esquema de segurança expressivo, o que em muitos casos é mais aceitável do que a MLS.
Existem, no entanto, diversas situações onde ainda requer-se a MLS tradicional. Por exemplo, um servidor de arquivo onde os dados armazenados podem conter classificações mixas e onde os clientes conectam em áreas livres diferentes. Isto resulta em diversos níveis de Segurança e de um isolamento significativo em um só sistema.
Este tipo de situação é a razão pela qual o SELinux inclui a MLS como um modelo de segurança, como um adjunto para TE.
Existe um grande esforço para certificar o Linux como um sistema de operações MLS. A certificação é equivalente à antiga classificação B1, que foi re-estruturada no Perfil de Proteção de Segurança Rotulada sob o esquema Common Criteria
[6] A NSA é a agência de criptanálise do governo Federal dos Estados Unidos da América, responsável pela confiabilidade de informações e inteligência de comunicações. Você pode ler mais sobre a NSA no site da agência em http://www.nsa.gov/about/.
[7] O Flask foi concebido num projeto visando a integração do Distribuição de Sistema Operacional Confiável (DTOS ) ao sistema operacional de pesquisas chamado Fluke. Flask era o nome da arquitetura e da implementação no sistema operacional Fluke.
Nos lançamentos de Red Hat Enterprise Linuxanteriores, era necessário instalar os pacotes selinux-policy-targeted-sources
e somente então criar um arquivo local.te
no diretório /etc/selinux/targeted/src/policy/domains/misc
. Você poderia usar o utilitário audit2allow
para traduzir as mensagens AVC em regras de permissão e então reconstruir e recarregar a política.
O problema era que, todas as vezes que um pacote de política novo era lançado, o Makefile era executado para tentar manter a política local.
No Red Hat Enterprise Linux5, este processo foi completamente revisado. Os pacotes das "fontes" rpm foram completamente removidos, e os pacotes de política são tratados mais como um kernel. Para pesquisar nas fontes usadas para construir a política, você precisa instalar o rpm fonte selinux-policy-XYZ.src.rpm
. Um pacote extra, selinux-policy-devel
também foi adicionado, o qual oferece funcionalidade de padronização extra.
Red Hat Enterprise Linux apresenta o conceito de política modular. Esta política permite que o fabricante envie a política SELinux separado da política do sistema de operações. Isto permite que os administradores façam mudanças locais na política sem se preocuparem com a próxima instalação da mesma. O comando adicionado mais importante é o semodule
.
O semodule
é a ferramenta utilizada para gerenciar o SELinux módulos de política, incluindo instalar, atualizar, listar e remover módulos. Você também pode utilizar o semodule
para forçar uma reconstrução de política a partir do módulo armazenar e/ou forçar uma recarga de política sem desempenhar qualquer outra transação. O semodule
age nos pacotes de módulo, criados pelo semodule_package
. Geralmente, estes arquivos possuem um sufixo .pp (pacote de política), embora não seja obrigatório.
Para listar os módulos de política em um sistema, use o comando semodule -l
:
[root@host2a ~]# semodule -l amavis 1.1.0 ccs 1.0.0 clamav 1.1.0 dcc 1.1.0 evolution 1.1.0 iscsid 1.0.0 mozilla 1.1.0 mplayer 1.1.0 nagios 1.1.0 oddjob 1.0.1 pcscd 1.0.0 pyzor 1.1.0 razor 1.1.0 ricci 1.0.0 smartmon 1.1.0
Este comando não lista o módulo de política base, que também está instalado.
O diretório /usr/share/selinux/targeted/
contém diversos arquivos de pacote de política (*.pp). Estes arquivos estão inclusos no rpm selinux-policy
e são utilizados para construir o arquivo de política.
A seção a seguir, utiliza um exemplo atual para demonstrar a construção de um módulo de política local para apontar um problema com a política atual. Este problema envolve o script ypbind init
, que executa o comando setsebool
, que por sua vez, tenta utilizar o terminal. Isto gera a seguinte negação:
type=AVC msg=audit(1164222416.269:22): avc: denied { use } for pid=1940 comm="setsebool" name="0" dev=devpts ino=2 \ scontext=system_u:system_r:semanage_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=fd
Embora tudo ainda funcione corretamente (ou seja, não evita que nenhum formulário de aplicativo rode como pretendido), ele interrompe o fluxo de trabalho normal do usuário. Ao criar um módulo de política local, você soluciona este problema.
O utilitário audit2allow
possui agora a habilidade de construir módulos de política . Use o seguinte comando para construir um módulo de política baseado em conteúdo específico do arquivo audit.log
:
ausearch -m AVC --comm setsebool | audit2allow -M mysemanage
O utilitário audit2allow
construiu um arquivo de imposição (mysemanage.te
). Depois, ele executou o comando checkmodule
para compilar um arquivo de módulo (mysemanage.mod
). Por último, ele usa o comando semodule_package
para criar um pacote de política (mysemanage.pp
). O comando semodule_package
combina arquivos de política diferentes (geralmente somente o módulo e potencialmente um arquivo de contexto) no pacote de política.
Use o comando cat
para inspecionar o conteúdo do arquivo TE:
[root@host2a ~]# cat mysemanag.te module mysemanage 1.0; require { class fd use; type init_t; type semanage_t; role system_r; }; allow semanage_t init_t:fd use;
O arquivo TE é composto por três seções. A primeira seção é o comando module
, que identifica o nome do módulo e versão. O nome do módulo deve ser único. Se você criar um módulo semanage
usando o nome de um módulo pré-existente, o sistema tentaria substituir o pacote do módulo existente por uma versão nova. A última parte da linha do módulo é a versão. O semodule
pode atualizar pacotes de módulo e checar a versão atualizada em relação à versão instalada atualmente.
O próximo bloco do arquivo TE é o bloco require
. Este, informa o carregador de política, quais tipos, classes e papéis são necessários na política de sistema, antes que este módulo possa ser instalado. Se qualquer um destes campos forem indefinidos, o comando semodule
irá falhar.
Por último, estão as regras de permissão. Neste exemplo, você poderia modificar esta linha para dontaudit
, pois semodule
não precisa acessar o descritor do arquivo.
O último passo a ser dado neste processo de criação de um módulo de política local é carregar o pacote da política no kernel.
Use o comando semodule
para carregar o pacote de política:
[root@host2a ~]# semodule -i mysemanage.pp
Este comando recompila o arquivo de política e regenera o contexto do arquivo. As mudanças são permanentes e irão sobreviver a uma reinicialização. Você pode também copiar o arquivo com o pacote de política (mysemanage.pp
) para outras máquinas e instalá-lo utilizando o semodule
.
O comando audit2allow
exibe a saída do comando que ele executou para criar um pacote de política onde você possa editar o arquivo TE. Isto significa que você pode adicionar novas regras como solicitado ou mudar a regra de permissão
para dontaudit
. Você pode então recompilar e reempacotar o pacote de política para ser novamente instalado.
Não existe limite para o número de pacotes de políticas, portanto, você pode criar um para cada modificação local, mas você precisa se assegurar de que as "instruções solicitadas combinem com todas as outras regras".
As seguintes referências são indicadores para informações adicionais relevantes para SELinux e Red Hat Enterprise Linux mas além do escopo deste guia. Note que devido ao rápido desenvolvimento de SELinux, uma parte deste material pode se aplicar somente à lançamentos específicos do Red Hat Enterprise Linux
Mayer, MacMillan, e Caplan
Prentice Hall, 2007
https://sourceforge.net/docman/display_doc.php?docid=21959[amp ]group_id=21266
irc.freenode.net, #rhel-selinux