www.linuxsecurity.com.br 1 Fale conosco C@RTAS CARTAS A seção c@rtas é destinada ao leitor para que opine sobre o conteúdo da revista LinuxSecurity Magazine, enviando suas sugestões ou comentários. As cartas podem ser resumidas por questão de espaço. mail to: [email protected] Este espaço é seu! www.linuxsecurity.com.br 2 Sumário Retrospectiva: os três programas de criptografia mais influentes no dia-a-dia do administrador da rede. Marco “Kiko” Carnut. 6 14 Níveis de execução Rubens Queiroz de Almeida Enriquecendo os logs de seu sistema Unix e facilitando a auditoria, parte 1 18 Renato Murilo Langona 27 SPAM x qmail Diego Linke - GAMK 33 Saudosa Malloca, Malloca Querida ... Izar Tarandach FingerPrint - Explorando a pilha TCP/IP (versão 1.0) 39 Sandro Mello 45 Introdução à Análise Forense - Parte 1 Leonardo Alcântara Moreira 49 TrustedBSD - Parte I - Introdução Edson Brandi 52 Snort - Uma ferramenta NIDS Gabriel Armbrust Araujo Aumentando a segurança do seu Webserver com LIDS Rodrigo Pereira Telles www.linuxsecurity.com.br 3 59 MENSAGEM AO LEITOR Carta ao Leitor Em meados de 1999, logo após um excelente treinamento em segurança computacional ministrado pelo mestre Guina na Unicamp, criei a lista security-l, composta por alguns dos alunos do curso para que o fluxo de informações pudesse permanecer assim como o contato. A lista, que ainda existe hoje, cresceu e iniciou o projeto LinuxSecurity Brasil no segundo semestre de 2000, agregando membros dia após dia passando a ser uma comunidade nacional. Hoje posso dizer que mais um sonho começa a ser realizado, o da publicação de informações livres através de uma revista. Inicialmente no formato eletrônico PDF, a LinuxSecurity Magazine nada mais é do que o resultado do esforço da comunidade para a própria comunidade, da boa vontade de uma grande maioria disposta a ajudar e compartilhar conhecimentos, o que já é o suficiente para um excelente resultado. De início a LinuxSecurity Magazine não terá muitas colunas ou seções. Com a evolução da revista e com a boa aceitação de todos, gradualmente agregaremos novos conteúdos que sejam pertinentes e úteis à comunidade. Essa nossa primeira edição pode ser vista como comemorativa dos dois anos de projeto LinuxSecurity e também como a consolidação de mais uma etapa na evolução do projeto como um todo, assim como da disseminação do conhecimento e do software livre em nosso país. Todos os artigos dessa revista foram escritos por profissionais Brasileiros que aceitaram o convite e o desafio, tanto profissionais de segurança computacional quanto diagramadores, designers e administradores de sistemas, todos unidos e com um mesmo ideal. Agradeço a todos vocês que tornaram possível a realização desse sonho e espero sinceramente que essa seja não a minha, não a sua, mas a NOSSA revista, a nossa conquista. Encerro por aqui essa primeira carta ao leitor, na esperança de que esse trabalho seja de utilidade, que possa ser continuado em breve e, quem sabe, tornar-se um dia impresso. Sintam-se todos meus convidados para entrar em contato com sugestões, críticas ou para envio de artigos para próximas edições. Meus mais sinceros desejos de sucesso a todos. Renato Murilo Langona ([email protected]) LinuxSecurity Brasil Solutions S/C Ltda. www.linuxsecurity.com.br 4 www.linuxsecurity.com.br Diretor Executivo: Renato M. Langona Diretor de Operações: Renato M. Langona Diretor de Marketing: Renato M. Langona Coordenador executivo: Renato M. Langona Colaboradores especiais: Gustavo Nozella Marcello Romeiro Webmaster: Renato M. Langona Diagramação e assessoria gráfica: Marcello Romeiro Capa : Gustavo Nozella Marcello Romeiro Revisão: Renato M. Langona Gerente Administrativo: Renato M. Langona LinuxSecurity Magazine é uma publicação mensal da LinuxSecurity Brasil Solutions S/C Ltda Distribuição Exclusiva: OnLine Fax para contato: +55 14 4621030 SAC ( Serviço de Atendimento ao Cliente) Problemas de qualidade na entrega e/ou exemplares. O SAC presta atendimento aos leitores por e-mail: [email protected] A LinuxSecurity Maganize não se responsabiliza por conceitos emitidos nos artigos assinados de colaboradores, a LinuxSecurity Magazine não se responsabiliza por eventual quebra de links fornecidos por colaboradores nem pelo material exposto neste(s) link(s). Problemas com quebra de links devem ser reportados para [email protected] subject: “LinkQuebrado” indicando a edição e o artigo”. A fim de proteger todos os interessados e ainda assim estipular a divulgação de material referente ao Linux e à LinuxSecurity Magazine, convencionou-se que reproduções de texto da LinuxSecurity Magazine são permitidos, desde que se inclua a frase “Reproduzido com a permissão da LinuxSecurity Magazine (www.linuxsecurity.com.br)”. www.linuxsecurity.com.br 5 ARTIGO Sumário Criptografia: A influência no dia a dia Retrospectiva: os três programas de criptografia mais influentes no dia-a-dia do administrador da rede C tcpdump) em qualquer roteador entre o cliente e o servidor, junto com um pouco de conhecimento dos protocolos de rede, tornava trivial capturar as senhas dos usuários e até do root. omemoração de aniversário envolve festa, mas também envolve relembrar o passado, ceder à nostalgia; e tentar prever o futuro, enxergar para onde se vai. O Renato me pediu pra rememorar os programas de criptografia mais influentes no dia-a-dia prático do administrador de segurança antenado no mundo do código livre. Eu diria que foram três, o SSH, o PGP/GPG e o HTTPS/SSL/X.509, implementados no Apache via o mod_ssl. Vale a pena relembrar as histórias, os lances e os por quês de todos eles – mesmo porque há um desfecho de impacto para todos nós. Toda vez que eu falo sobre interceptação, até hoje um monte de administradores de sistemas me olha meio incrédulo, achando que é uma realidade distante ou tecnodelírio de filme hollywoodiano. Acredite – é feito rotineiramente. Para muitos, como telecoms e ISPs, o foco não é espionar os outros, e sim depurar o funcionamento da rede. Entretanto os espiões digitais, lícitos e ilícitos, existem. Mas, retornemos às questões técnicas – falo das questões culturais mais adiante. SHELL SEGURO: ABAIXO O TELNET E OS SERVIÇOS-R Várias soluções foram propostas para tornar mais difícil para um invasor fazer das credenciais (login/senha) que conseguisse. As primeiras foram melhorias no controle de acesso: por exemplo, usar o tcpwrappers ou um firewall (àquela época eram raros; mais provável serem ACLs de roteador Cisco, para os poucos que sabiam e queriam usá-las) para restringir o endereço de origem de onde se podia conectar. A idéia era, “ok, você pega minha senha de root, mas daí de onde está não usa”. Dificulta, sim, mas não resolve: o tráfego e as credenciais continuavam indo abertas do mesmo jeito, suscetíveis a captura; e nem sempre era viável restringir o endereço de origem. Além disso, o atacante poderia nem estar fazendo questão de logar na sua máquina – meramente ver você lendo seu correio pelo Pine, Mutt, etc. já podia ser o bastante para ele. No começo, controlar remotamente uma máquina Unix era usar o utilitário telnet para fazer emulação de terminal. Ou os “serviços-r”: rlogin, rsh, rexec. Concebidos nos anos 80, na era em que a Internet era pequena e crédula, mandavam todo o seu tráfego “em aberto” – inclusive os logins e senhas. Isso os tornava presas fáceis para toda uma sorte de ataques: um sniffer genérico (capturador de pacotes, tal como o www.linuxsecurity.com.br Com um pouco mais de conhecimento e algumas ferramentas especializadas, tais como o hunt, 6 era possível até seqüestrar uma sessão em andamento: o usuário legítimo conecta, satisfazendo quaisquer controles de acesso; e depois o atacante consegue “tomar conta” da conexão em si. Se a vítima estava logada no seu servidor com a conta de root, o atacante tinha a situação perfeita para causar um belo estrago. Verdade, é um ataque sofisticado que requer diversas pré-condições para ser feito. Mas quando satisfeitas, o hunt o torna não apenas viável, mas muito fácil. A solução mais aceita veio com o advento do pacote SSH: o Secure SHell. Era um protocolo inteiramente novo e um pacote de programas: o servidor SSH, o cliente SSH e alguns utilitários de apoio. Ele resolveu os vários subproblemas técnicos: ele criptografa todo o tráfego, tornando impossível para o atacante entender o que você está fazendo e/ou obter logins e senhas; identifica os servidores usando chaves criptográficas, o que, se corretamente usado, permite detectar falsificação de DNS; oferece um esquema de autenticação de usuários também usando chaves criptográficas que torna as senhas no servidor desnecessárias. Além de vários outros recursos legais, como a capacidade de estender o mesmo tipo de proteção para conexões X Windows remotas e até para outros protocolos, tais como o VNC. E há ainda outros ataques poderosos: por exemplo, se um atacante conseguir forjar respostas de DNS para a sua vítima, pode fazê-la conectar em uma máquina sob seu controle, ao invés da máquina que a vítima esperava e com isso pegar as credenciais desejadas. Durante vários anos, o SSH era um tanto desconhecido. Até porque ele só era distribuído em código fonte – e muitos sistemas não tinham gcc, make e afins para compilá-lo. Há muitos administradores de rede, especialmente os “corporativos”, que ou não sabem fazer um simples ./configure && make install, ou simplesmente morrem de medo de compilar um programa eles mesmos; já a turma do código aberto costuma ser mais desenrolada nisso. (Um monte de gente de empresas grandes – bem grandes e famosas, nacionais e internacionais, setores privado e governo, com um tremendo orçamento de TI – vive me perguntando sobre o que é o SSH, como fazer um “projeto piloto” de SSH na empresa deles, etc; e ainda há alguns que, quando eu falo em SSH, fazem o sinal-dacruz como se eu fosse o demônio em pessoa. Memo para os admins corporativos e gerentes de TI: aprendam com a comunidade opensource; nesse aspecto, eles estão anos-luz à frente). A licença das primeiras versões do SSH era muito restritiva, não permitia que o programa Em suma: telnet, rlogin, rsh, etc., são inseguros demais. Podem ser aceitáveis para uma rede local muito controlada, mas disponibilizá-los na rede global é um risco inaceitavelmente alto – hoje em dia, é pedir para ser invadido. A criptografia veio trazer várias contramedidas técnicas para essas vulnerabilidades. Muitas delas, como senhas descartáveis (one-time passwords), SRP, tokens em hardware, etc., ajudavam, mas, por uma razão ou por outra, nunca se tornaram muito populares. www.linuxsecurity.com.br 7 viesse na instalação padrão dos SOs. Portanto, sendo opcional, acabava sendo relegado. Os radicais reagem a isso dizendo: Torne a segurança o padrão; não dê ao usuário a chance de degradá-la. os torna presa fácil para programas como o sshmitm, que realiza o celebrado ataque “manin-the-middle”. Mas a maioria das pessoas não faz a menor idéia do que seja esse ataque, porque desconhecem o funcionamento da criptografia de chave pública subjacente ao SSH. Aí toda a segurança que ele oferece fica fragilizada meramente pelo mau hábito do usuário. Hoje em dia, isso mudou. A turma do OpenBSD criou uma versão do SSH chamada OpenSSH, com uma licença muito mais aberta. Isso tornou possível que ele se tornasse parte da instalação padrão do OpenBSD, Linux, Solaris e outros SOs mais recentes. Há versões para Windows; inclusive, o OpenSSH já vem pré-instalado no Cygwin (se você usa Windows além de Unix e não conhece o Cygwin, não sabe o que está perdendo). Em qualquer repositório acha-se pacotes RPMs, DEBs, etc., bem como binários até para plataformas menos comuns, tais como AIX, HP-UX, Solaris, etc. Compilá-lo a partir dos fontes costuma ser facílimo. Qualquer que seja o caso, levase menos de cinco minutos para instalar e por para rodar. Há vários ótimos clientes para Windows (SecureCRT, a própria linha de produtos da SSH.com e da Bitvise, TTSSH, Putty) e há até clientes em Java (JavaSSH, Mindterm) . Esse é só um exemplo dentre muitos possíveis para ilustrar um ponto recorrente: segurança não é plug-in – não é simplesmente instalar um programinha e estar seguro. Segurança é entender o sistema, suas possíveis falhas, como as contramedidas contornam as vulnerabilidades, o que pode dar errado, qual a parte do usuário em tudo isso – que hábitos ele tem de ter, como tomar decisões de segurança informadas e conscientes. Eu costumo dizer que segurança é como higiene: não basta instalar o chuveiro; é preciso adquirir o hábito de tomar banho todo dia. Por tudo isso, há quem considere o SSH uma das mais bem sucedidas iniciativas de prover segurança através de criptografia: amplamente disponível, seguro, bem implementado, fácil de instalar, conveniente de usar. Falaremos de outras iniciativas não tão bem sucedidas, que pecam em algum desses pontos. Na comunidade open-source, o SSH já é velho companheiro de muitos admins. Mesmo assim, muitos nunca o estudaram por completo. Exemplo: Muitos desconhecem que o ssh-agent e o ssh-add podem prover um serviço de “single-sign on” que permite ter toda a segurança do SSH digitando a frase-senha da chave privada do usuário uma única vez. Há uma armadilha no fato do SSH ser conveniente de usar: ele é até conveniente demais. Isso faz com que muitos administradores não estudem direito no que ele se baseia, as proteções que ele oferece, e quais as condições para que seja efetiva. Por exemplo: a esmagadora maioria dos usuários do SSH que eu conheço não se importa em checar o fingerprint dos servidores onde conecta. Isso www.linuxsecurity.com.br As lições que se tiram são: se você ainda usa telnet, rlogin, etc., faça um favor a si mesmo: livrese deles e troque pelo SSH. E se você pretende 8 trabalhar com segurança, e, em especial, segurança criptográfica, devore os manuais, a documentação. Segurança não é só instalar o pacote. Leia, estude, compare com outros sistemas, outras instalações. Aprofunde-se. Professores universitários: incluam essas coisas nos currículos dos seus cursos; e uma dica: o melhor, mais didático, prático e abrangente livro que eu conheço sobre os conceitos de criptografia aplicados a segurança de redes é o livro do Stallings. Faça seus alunos lerem uma página dele ao escovar os dentes todo dia e em um ano você terá formado admins mais preparados. Nada melhora mais a segurança do que gente que sabe o que faz. Para dar um exemplo de bobagens ditas por gente muito lida e supostamente em outros assuntos confiável, basta lembrar que, quando o sshmitm foi lançado no dsniff-2.3, vários jornais e sites anunciaram “o fim do SSH”, “novo programa ‘quebra’ a criptografia do SSH” – quando, de fato, o ataque man-in-themiddle já era conhecido e previsto desde o início, e os meios para tratá-lo já existiam: a verificação do fingerprint do servidor e o modo StrictHostKeyChecking. popular na Internet. Isso atraiu a ira das entidades de inteligência do governo americano, que há muito vinham jogando areia do desenvolvimento de bons produtos de criptografia porque eles rotineiramente espionam o tráfego das redes de dados e não querem deixar de entender o que capturam. Exportar produtos de criptografia nos EUA sem uma autorização expressa do governo era crime na época. Zimmermann foi processado e levou três anos e muita ajuda da Electronic Frontier Foundation para tirá-lo da enrascada. O PGP tem várias similaridades conceituais com o SSH: eles usam uma técnica híbrida para prover a segurança e gerenciabilidade de chaves da criptografia de chave pública (também conhecida como “assimétrica”) com a performance da criptografia simétrica convencional (que é 1000 vezes mais rápida); vários dos algoritmos são os mesmos (RSA, DH/ ElGamal, DES, CAST, AES, etc); os dois provêem confidencialidade – o SSH protege o tráfego de rede, enquanto o PGP protege mensagens de e-mail e arquivos quaisquer; para que seu uso realmente garanta a segurança, é preciso conferir os fingerprints das chaves. Eles diferem, porém, nos detalhes de implementação, nos formatos de dados e dos pacotes, etc. PRIVACIDADE DE EMAIL: PGP & GPG Um recurso legal que o PGP tem é o de assinatura digital (o SSH também faz, é invisível para o usuário; é usado só internamente, para prover a autenticação). Você pode criar um bloco de dados que autentica uma mensagem ou arquivo qualquer, satisfazendo as seguintes propriedades: só você pode criar esse pacotes de dados e ninguém mais conseguiria forjá-lo; e qualquer pessoa pode verificar sua autenticidade. Justamente por isso, esse bloco de dado é chamado de “assinatura digital”. Ele age algo parecido com uma assinatura física – ele garante que você gerou aquela mensagem ou arquivo. E mais: Outra história heróica de como a criptografia vem se enxerindo na vida prática dos admins e dos usuários em geral é o caso do PGP. Para quem não conhece, é um programa que permite cifrar mensagens de e-mail e arquivos quaisquer. Ele já tem uma longa história – a primeira versão foi lançada em 1991, para DOS, como um trabalho solitário do Phil Zimmerman. Depois de vários upgrades de versão, virou um produto da Network Associates, mas, por insistência do Zimmerman, sempre houve uma versão freeware. O PGP foi um dos primeiros programas com criptografia genuinamente forte a se tornar www.linuxsecurity.com.br 9 se o arquivo for adulterado, sua assinatura não conferirá – ela é função da mensagem (as assinaturas reais não provêem isso). Ou seja, como dizem os professores de criptografia: a assinatura digital provê também verificação de integridade. Outro recurso único do PGP é a segurança de sabermos com quem estamos falando. As chaves PGP identificam pessoas, através de seus nomes e endereços de e-mail: os usuários podem usar o próprio recurso de assinatura digital para assinar as chaves de outros usuários como forma de “apresentá-los” entre si. Ou seja, se eu assino a sua chave pública PGP, isso é interpretado como que eu tenha dado meu aval de que essa chave é mesmo sua; se alguém mandar uma mensagem para você usando essa chave, eu atesto que você é você mesmo. No jargão da área, isso se chama “distribuição indireta de confiança”. O SSH não tem esse recurso. As chaves SSH identificam os servidores apenas por IP/DNS. Mas elas não provêem a possibilidade de um servidor atestar a identidade de outro, ou do admin senior assinar as chaves dos seus servidores, ou algo que o valha. Por isso, confiase que os usuários sejam maduros o bastante para religiosamente se dar à ligeira inconveniência de verificar os fingerprints das chaves para se certificar de que ninguém está zoando com seu roteamento ou com seu DNS. Alguns diriam que essa inconveniência é mais do que ligeira, dado que até usuários experientes freqüentemente não verificam os fingerprints. Mas a verdade é que muita gente que usa o PGP também está se lixando para esse negócio de assinar as chaves uns dos outros. A maioria nem sabe que nada disso existe. E muitos dos que sabem, não aplicam. O resultado final é que a criptografia agrega segurança, realmente dificulta a interceptação... mas não tanto www.linuxsecurity.com.br 10 quanto poderia ser. Se o usuário for descuidado, um araponga determinado ainda consegue interceptar o tráfego de muita gente; ele tem mais trabalho, mas ainda consegue. Por outro lado, para os conscientes da importância dessas questões, vivemos um momento único: finalmente temos em mãos as ferramentas para tornar o trabalho dos arapongas realmente inviável. Há apenas poucos anos, isso não apenas não existia, mas também parecia inconcebível. Hoje é uma realidade: podemos enviar e-mails com a velha e boa privacidade. Mesmo assim, ainda há um longo caminho a trilhar, pois o PGP ainda é “coisa de nerd”: só quem usa são os interneteiros da velha guarda, administradores de sistemas mais esclarecidos e entusiastas de informática. O usuário médio do Windows que só sabe visitar portal não faz a menor idéia de nada disso. O desafio é de divulgação e de didática: como tornar todos esses conceitos acessíveis para uma audiência não-técnica mais ampla. Um amigo meu disse certa vez com muita propriedade: “vou acreditar que o PGP se tornou popular quando mamãe passar a usar”. Parece brincadeira enunciar assim, mas ele está certo: eu vivia alardeando que o PGP era fácil de usar e descobri que... estou errado. Quase todo usuário novato demonstra dificuldade em entender os conceitos de chave privada e chave pública; a primeira coisa que eles fazem é mandar uma mensagem cifrada para eles mesmos, ao invés de mandarem as chaves públicas recém-geradas deles – entre muitas outras patetadas simples mas dolorosamente comuns. Leia mais sobre isso no artigo “Por Que Joãozinho Não Consegue Cifrar: Uma Avaliação da Usabilidade do PGP 5.0”, que apesar do título jocoso, é excelente, sério, direto ao ponto. conjurar os mortos: usar infame o esquema de certificação X.509. Justamente porque o PGP não conquistou o grande público, a Network Associates nunca conseguiu fazer dinheiro com ele. Resultado: ela desistiu e descontinuou a linha de produtos PGP, deixando uma legião de usuários meio que órfãos. A comunidade de código-aberto vinha se preparando para isso e fez um programa compatível: o GNU Privacy Guard (GPG), cujo time de desenvolvimento hoje conta com subsídio do Governo Alemão. O Zimmerman fundou uma ONG para promover o padrão OpenPGP. Apesar de tudo, hoje o GPG é item padrão na maioria das distribuições dos SOs de código aberto. Mas ainda há muitos, muitos usuários por conquistar. O X.509 é um formato para armazenar chaves públicas em coisas chamadas certificados digitais, que permitem não só obter as chaves necessárias para que a criptografia funcione, mas também oferece meios de garantir que as chaves pertençam a quem dizem pertencer – uma versão daquela idéia dos usuários assinarem chaves uns dos outros que discutimos acima sobre o PGP, só que de forma mais hierarquizada, rígida e institucional. Em tese, isso viabiliza a seguinte coisa: o usuário conecta em um site, recebe as chaves e o navegador as valida automaticamente, sinalizando “tudo ok” para o usuário através de um simpático cadeadinho amarelo. Isso funciona porque o certificado em a assinatura digital de uma Autoridade Certificadora, empresas cujo negócio é dar o “aval digital” que os sites são quem dizem ser – de novo, que não tem ninguém corrompendo o DNS ou o roteamento globais da Internet. (Acredite, todo santo dia tem gente tentando corrompê-los). X.509, SSL e HTTPS: A WEB “SEGURA” Demos um passeio pela segurança de conexões de emulação de terminal, com o SSH, e das mensagens de email, com o PGP. É natural perguntar: hmmmm... e o que temos de segruança criptográfica para a Web e seu protocolo-mor, o HTTP? Temos o HTTPS. Essa é uma história mais sórdida, que remonta à ressureição de alguns mortos. Explico: em 1993, a Netscape teve a sacada de bolar um protocolo para prover segurança criptográfica para HTTP. Na ocasião, a sensação era que segurança criptográfica tornaria a Web um paraíso para se conduzir negócios on-line. O protocolo em si levou algum tempo para ser evoluído, mas hoje temos o SSLv3 e seu irmão mais novo, o TLSv1. Quando aplicado ao HTTP, dá origem ao HTTPS que vemos nas URLs dos “sites seguros”. Contudo, na hora de escolherem um meio de distribuir as chaves e garantir a identidade dos servidores e clientes, resolveram www.linuxsecurity.com.br Seria tudo muito bonito se: a) o formato X.509 não fosse incrivelmente rebuscado, difícil de implementar e inerentemente problemático – eles são mais irritantes que os arquivos .TIFF dos programas gráficos, que às vezes nem o programa que salvou consegue ler de volta; b) várias versões do IE/Windows não tivessem criptografia deliberadamente aleijada; c) a interface de usuário de gerenciamento de certificados digitais não fosse genericamente uma droga na maioria das aplicações, tornando tudo isso incrivelmente obscuro para a mamãe do meu amigo que só quer comprar uns presentes na americanas.com. Pior, as Autoridades Certificadoras oferecem um serviço desnecessariamente caro (um certificado digital para servidor custa uns R$ 2.500,00 por ano), burocrático e que não garante grandes 11 níveis de segurança. Além do fato de o usuário não entender nada: o fato do site ter o selinho “site seguro, clique e verifique” significa apenas que o site tem boa chance de ser legítimo e que o tráfego é difícil de ser interceptado – mas não garante que o site não tenha vulnerabilidades ridículas que lhe permitam ser invadido (ou que já esteja invadido) e ter toda a base de cartões de crédito roubada, ou pedidos emitidos nos nomes de outras pessoas, etc; nem garante a idoneidade da empresa. Mas o usuário final vê o cadeadinho amarelo e acha que está tudo bem. Mesmo assim, o SSL/TLS/HTTPS é um avanço. Montar um webserver “seguro” leva mais que os cinco minutos que se leva para montar um servidor SSH, mas o mod_ssl do Apache faz um belo trabalho em tornar a tarefa senão simples, pelo menos factível. Se você tiver um pouco de paciência de ler os HOW-TOs e a documentação, dá pra fazer bem feito em uma tarde. Ainda assim, o que eu recebo de e-mail de gente me pedindo ajuda sobre como gerar seu primeiro certificado só perde para a quantidade de spam que aterrisa diariamente na minha caixa postal. Aliás, pra esses: visitem a AC de Certificados Expressos da FreeICP e sigam as instruções; o certificado sai na hora, feito caldo de cana. Para turma do Windows, funciona no IIS, também. O protocolo SSL também provê uma maneira poderosa de autenticar não só os servidores, mas os usuários também, usando chaves públicas – conceitualmente semelhante ao método empregado pelo SSH para fazer a mesma coisa, só que, claro, muito mais complicado, rebuscado, coalhado de problemas de interoperabilidade. Resultado: quase ninguém usa. Há pouquíssimos desenvolvedores que sabem criar aplicações que usem esses recursos da maneira correta. E é justamente esse, complicado, caro e rebuscado, que o Governo Brasileiro tornou lei. www.linuxsecurity.com.br A MP 2200-2: AGORA CRIPTO É LEI NO BRASIL É isso mesmo. Essa história toda de criptografia, chaves privadas e públicas – tudo isso que um monte de gente não sabe usar direito, foi institucionalizado na Medida Provisória 2200-2 e se chama “Infra-Estrutura de Chaves Públicas – Brasil”, ou ICP-BR. Teoricamente, é uma boa idéia: usar a nata dos algoritmos de criptografia para tornar Internet Brasileira mais segura. Nada é difícil para quem não tem de implementar. Para nós, administradores de sistemas e de redes, desenvolvedores de aplicações, etc., sobra ter de descascar o abacaxi da interoperabilidade para criar essa Internet Brasileira supostamente segura. Nem vou cansar o leitor sobre as dezenas de coisas que podem dar errado se não implementarmos direito (minto; logo abaixo eu digo pelo menos uma que é particularmente fácil de explicar). Para isso, visitem o site do Projeto FreeICP; é um projeto que tenta criar uma infraestrutura de chaves públicas que de código aberto que funcione e interopere com a ICP-BR – o que, ao forçar uma discussão centrada nos aspectos técnicos de implementação, expõe as dificuldades em se implementar o proposto pela ICP-BR. Um aspecto especialmente trágico é que, como quase ninguém entende nada disso, algumas coisas muito estranhas viraram lei. Por exemplo, a resolução No 11 do Comitê Gestor da ICP-BR diz que todos os certificados digitais de usuário devem conter a data de nascimento, CPF, PIS/ PASEP e RG+Órgão Emissor do detentor). 12 Pense bem nisso: você quer mesmo revelar todos esses seus dados pessoais para qualquer um na Internet? Especialmente considerado que tudo que sua operadora de cartão de crédito pede para lhe “autenticar” em várias operações pelo atendimento via telefone é sua data de nascimento e CPF? Se os spammers já pintam miséria pegando só seu endereço de e-mail, o que você acha da perspectiva de eles poderem pegar seus identificadores nos principais cadastros nacionais em uma só tacada? O CAMINHO ADIANTE A criptografia mudou, sim, o nosso jeito de trabalhar, e tem tornado, a passos lentos mas firmes, a Internet mais segura. O SSH nos permite administrar as máquinas remotamente; o PGP nos provê boa segurança para mandar correio (dá até pra mandar senhas de root de servidores via e-mail... o quêêê? Você mandava mesmo sem criptografia?!) e arquivos; o mod_ssl tem impulsiona a web segura. E há várias outras aplicações criptográficas para as mais diversas especialidades, numerosas demais para mencionar aqui. Mas o resultado é inegável: a infra-estrutura para tornar a Internet mais segura já está aí. Isso nos impõe um desafio: aprender a usar isso tudo de forma segura e manter isso tudo seguro. Em detalhes. Compreender os prós e contras, entender a teoria por trás das coisas e saber aplica-la na prática. Não exagerar demais em uma proteção e deixar todo o resto descoberto. Explicar isso para os usuários, para os gerentes, para os políticos e aqueles que decidem – melhorar nossa didática, refinar as analogias. Entender as questões políticas, desenrolar os problemas de interoperabilidade, atentar aos regulamentos. Ter uma visão geral do quanto a criptografia já está difundida em diversas aplicações (dica: a PKI-Page é um bom ponto de partida). www.linuxsecurity.com.br 13 E, por causa da MP 2200-2, a demanda por gente que entenda sobre como montar webservers seguros com certificação digital vai crescer um bocado. Eu arriscaria dizer que vai se tornar um bom filão de mercado – vai ser curioso ver os quadros de avisos pedindo “contrata-se profissional com experiência em criptografia, montagem e operação de servidores seguros segundo o padrão ICP-BR” ou “administrador de rede com experiência em administração de servidores SSH”; ou ainda “procura-se desenvolvedor de aplicações Web em Java; experiência com criptografia, JCA e JCE são altamente desejáveis”. A criptografia, antes distante, agora vai fazer parte dos nossos currículos e do nosso dia-a-dia. Tanto a boa, bem implementada, quanto a ruim. Vai ser um prazeroso desafio acompanhá-la todo dia nesse e nos próximos aniversários da LinuxSecurity. FICHA do AUTOR Nome: Marco “Kiko” Carnut. CISSP é Consultor de Segurança de Informação da Tempest Security Technologies, unidade de negócios do Centro de Estudos e Sistemas Avançados do Recife, ONG vinculada ao Centro de Informática da Universidade Federal de Pernambuco. e-mail: [email protected] ARTIGO Sumário Níveis Níveis de de Execução Execução Níveis de execução S istemas Linux podem funcionar em vários níveis distintos de execução. Cada nível é caracterizado pelo conjunto de processos permanentes e funções oferecidas. Sistemas Red Hat Linux e derivados, utilizam seis níveis de execução, ou runlevels, como são mais conhecidos. Esta concepção tem suas origens no sistema Unix desenvolvido na AT&T (System V Unix). K10xfs -> ../init.d/xfs lrwxrwxrwx 1 root root 13 Mar 22 20:58 K15gpm -> ../init.d/gpm lrwxrwxrwx 1 root root 15 Mar 22 20:53 K15httpd -> ../init.d/httpd lrwxrwxrwx 1 root root 18 Mar 22 21:05 K30sendmail -> ../init.d/sendmail lrwxrwxrwx 1 root root 14 Mar 22 21:03 K50inet -> ../init.d/inet lrwxrwxrwx 1 root root 13 Mar 22 20:53 K60atd -> ../init.d/atd lrwxrwxrwx 1 root root 15 Mar 22 21:06 K60crond -> ../init.d/crond lrwxrwxrwx 1 root root 13 Mar 22 21:02 K60lpd -> ../init.d/lpd lrwxrwxrwx 1 root root 15 Mar 22 20:59 K75netfs -> ../init.d/netfs lrwxrwxrwx 1 root root 17 Mar 22 21:05 K89portmap -> ../init.d/portmap lrwxrwxrwx 1 root root 17 Mar 22 20:59 K90network -> ../init.d/network lrwxrwxrwx 1 root root 16 Mar 22 21:06 K99syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 16 Mar 22 20:59 S00single -> ../init.d/single Os níveis de inicialização são controlados pelos scripts que se encontram no diretório /etc/ rc.d/init.d. Uma listagem deste diretório revela os seguintes arquivos: atd nfslock crond portmap dhcpd postgresql functions random gpm rstatd halt rusersd httpd rwhod inet sendmail keytable single killall smb linuxconf snmpd lpd squid mars-nwe sshd named syslog netfs xfs network ypbind Uma rápida inspeção nos revela vários serviços conhecidos como sendmail, httpd e named. Cada nível de execução é controlado através de links simbólicos existentes nos seis diretórios (/etc/rc.d/rc1.d até /etc/rc.d/rc6.d). Examinemos o conteúdo do diretório /etc/rc1.d: Como se pode ver, todo o conteúdo do diretório /etc/rc1.d consiste de links simbólicos apontando para scripts dentro do diretório /etc/ rc.d/init.d. A primeira letra dos nomes dos links simbólicos pode ser ou “S” ou “K”, indicando se o processo para o qual aponta deve ser ativado (Started) ou desativado (Killed). O número que se segue a esta letra indica a # ls -l lrwxrwxrwx 1 root root 19 Mar 22 21:02 K00linuxconf -> ../init.d/linuxconf lrwxrwxrwx 1 root root 18 Mar 22 20:54 K05keytable -> ../init.d/keytable lrwxrwxrwx 1 root root 13 Mar 22 20:59 www.linuxsecurity.com.br 14 ordem em que os processos devem ser encerrados ou ativados. Em nosso exemplo o primeiro processo a ser desativado é o linuxconf. O primeiro a ser ativado, após terem sido encerrados todos os demais processos, é o script single. Cada um dos scripts residentes no diretório /etc/rc.d/init.d aceita geralmente três parâmetros: start, stop, restart. Estes parâmetros indicam, respectivamente, a ativação, desativação e desativação seguida de ativação do processo. Para determinar o nível de execução em que seu sistema está funcionando, utilize o comando /sbin/runlevel. Este comando irá consultar o arquivo /var/run/utmp para determinar o estado atual e o anterior. Caso o estado anterior não possa ser determinado é exibida a letra “N” em seu lugar: rede (como nfs, nis, named e httpd). Nível 3 Este é o nível normal de operação, com todos os processos ativos. Nível 4 Este nível não é utilizado na maior parte das distribuições Nível 5 Semelhante ao nível 3, com todos os processo ativos, porém com uma interface gráfica de logon Nível 6 É executado neste nível um reboot do sistema. \ Alteração dos Níveis de Execução Os níveis de execução podem ser mudados pelo superusuário com o sistema em funcionamento. Sempre que é alterado um nível de execução são comparados, nos dois níveis, os processos que devem ser ativados e quais devem ser desativados. O processo init, que é processo pai de todos os demais (PID 1), compara a lista dos processos que devem ser encerrados no diretório indicativo d o nível de execução atual com a lista dos processos que devem ser ativados no nível de execução de destino. De posse desta informação o processo init determinará quais processos devem ser ativados ou desativados. Para reiniciar o sistema basta executar o comando: #init 6 Veja a lista dos links em /etc/ rc.d/rc6.d: # /sbin/runlevel N3 Descrição dos Níveis de Execução A seguir listamos os estados possíveis de um sistema Linux e sua descrição: Nível 0 Neste nível o sistema está parado Nível 1 Sistemas funcionando no nível 1 estão em modo monousuário, com um conjunto mínimo de processos ativos. O sistema de arquivos raiz (root) está montado em modo de leitura. Este nível de execução é normalmente utilizado quando a inicialização normal falha por alguma razão. Nível 2 A maior parte dos serviços estão ativos, com exceção dos processos de www.linuxsecurity.com.br #init6 K00linuxconf K05keytable K10xfs 15 Definição ou Remoção de Processos Residentes K15gpm K15httpd K30sendmail K50inet K60atd K60crond K60lpd K75netfs K80random K89portmap K90killall K90network K99syslog S00reboot Para desativar um serviço de um determinado nível de execução basta remover o link simbólico do diretório apropriado. Por exemplo, para desativar o serviço httpd, do nível de execução 3, basta remover o link /etc/rc.d/rc3.d/S85httpd do diretório /etc/rc.d/rc3.d. Similarmente, para inserir um novo serviço, basta criar um link no diretório padrão de execução, apontando para o script correspondente em /etc/rc.d/init.d: Como se pode ver, a maioria dos links inicia-se com a letra “K”, indicando que os processos serão desativados. Apenas um link inicia-se por “S”, S00reboot, que aponta para o script /etc/init.d/halt. Similarmente, para colocar o sistema em modo monousuário: # cd /etc/rc.d/rc3.d # ln -s /etc/rc.d/init.d S99local Este script realmente existe e é normalmente utilizado para inserir os serviços locais. Pela numeração (99), este script sempre será o último a ser ativado. init 1 Importante, certifique-se de escolher uma numeração que posicione a ativação do script na ordem correta. Se o serviço é dependente do funcionamento da rede ele deve necessariamente ser ativado após estes serviços estarem ativos. Nível de Execução Padrão O nível em que o sistema irá funcionar é indicado pela entrada do arquivo /etc/inittab. id:3:initdefault: Utilitários para Configuração dos Níveis de Execução Neste sistema o nível padrão de execução é 3. Para alterar este nível de execução basta alterar o número “3” para o valor desejado. Nunca altere este valor para “0” ou “6”, que indicam, respectivamente, o sistema parado ou em modo de encerramento. www.linuxsecurity.com.br Até agora abordamos a configuração manual dos scripts de inicialização. Existem entretanto diversos utilitários para realizar este este trabalho. chkconfig Utilitário para configuração dos níveis de execução invocado a partir da linha de comandos ksysv Utilitário gráfico que permite a configuração dos níveis 16 de execução e ativação e desativação de processos individuais linuxconf Ferramenta genérica de configuração que permite o gerenciamento dos níveis de execução A forma mais segura de se lidar com esta configuração certamente começa com o entendimento perfeito de seu funcionamento. As interfaces gráficas podem obscurecer o significado real do que se está fazendo e conduzir a uma configuração indesejável. Em qualquer situação, realizando-se o trabalho manualmente ou através de utilitários, recomendamos o backup de todos os arquivos envolvidos para poder retornar à uma situação estável em caso de problemas. Para lidar com a ativação e desativação de processos residentes, algo que frequentemente precisamos fazer sempre que alteramos a configuração de um serviço, precisamos realizar os seguintes passos: Referências Adicionais: No transcorrer deste artigo foram feitas referências aos comandos ln, init, chkconfig, inittab e runlevel. A leitura da documentação destes c o m a n d o s fornece informações valiosas sobre todo o processo descrito e pode ser acessada a partir do comando man (man ln, man init, etc). # cd /etc/rc.d/init.d # httpd restart Em nosso exemplo nos dirigimos ao diretório onde ficam todos os scripts de ativação de processos e invocamos o script httpd com o parâmetro “restart”. FICHA do AUTOR Um artifício engenhoso para realizar esta tarefa nos é fornecido, através de um alias, em sistemas Conectiva Linux. Este alias, disponível no ambiente do usuário root, chama-se cds: alias cds=’cd /etc/rc.d/init.d && ls’ Nome Completo: Rubens Queiroz de Almeida Data de Nascimento:06/06/1960 Empresa: Unicamp Diretor de informática Mentor de diversos projetos ligados ao software livre incluindo a lista Dicas-L: http://www.dicas-l.unicamp.br Como podemos ver, o alias realiza dois passos: a mudança para o diretório /etc/rc.d/init.d e a listagem de seu conteúdo. Desta forma podemos visualizar o nome de todos os scripts disponíveis, facilitando a invocação do script apropriado. Simples, mas extremamente útil. www.linuxsecurity.com.br 17 ARTIGO Sumário Enriquecendo os Logs do seu sistema Unix e Facilitando a Auditoria - Parte 1 Enriquecendo os logs de seu sistema Unix e facilitando a auditoria, parte 1 bastante para verificação real de um dado servidor, além de não proporcionarem uma maneira prática e menos monótona de acompanhamento e leitura, por isso recorremos a ferramentas livres disponíveis. Irei apresentar nesse primeiro artigo da forma mais simples possível algumas ferramentas específicas para o tratamento e análise/auditoria de logs em sistemas Unix, tornando-os mais ricos em informações e mais fáceis de serem gerenciados. Introdução Acredito que já seja do conhecimento da maioria dos amigos leitores que a auditoria, leitura, avaliação ou análise freqüente dos logs de um servidor seja uma das principais funções delegadas a um administrador de sistemas que tenha o desejo de manter seu servidor seguro e estar a par de tudo o que ocorre no mesmo. Infelizmente essa também é uma das tarefas mais monótonas e repetitivas, o que acaba muitas vezes fazendo com que dados importantes não sejam lidos ou analisados de forma correta ou com a devida atenção. Algo que sempre repito e acredito é que uma das maiores dádivas do mundo do software livre e Open Source é termos uma miríade de soluções para um dado problema. É justamente por isso que o leitor não deve levar em consideração apenas o que apresentarei nesse artigo, devendo procurar por si próprio novas fontes, ferramentas similares e informações mais aprofundadas para a implementação do sistema que mais se adequar à sua situação e/ou rede. Dentre as soluções possíveis, escolhi para esse primeiro artigo as ferramentas: Sistemas Unix-like já possuem por padrão um sistema excelente para registro de logs, comumente representado pelo syslogd e klogd, que são os daemons responsáveis por oferecer esse suporte, registrando mensagens de diferentes aplicativos e serviços (inclusive de si próprios) , além do kernel, em diferentes locais de acordo com suas configurações. –IPPL (http://pltplp.net/ippl/) –LogSurfer (http://www.cert.dfn.de/eng/ logsurf/) Apesar de ser um sistema excelente, geralmente os logs gerados e registrados como padrão não são suficientes ou completos o www.linuxsecurity.com.br Como disse anteriormente, tentarei ser o mais claro e objetivo possível nesse artigo, porém convido cada um dos amigos leitores a realizarem pesquisas e estudos sobre essas ferramentas para o aprofundamento do conhecimento e, conseqüentemente, melhor utilização das mesmas. 18 mesmo e adequá-lo ao seu ambiente. IPPL O arquivo de configurações padrão de nossa instalação é o /usr/local/etc/ippl.conf (podendo ser alterado no momento da compilação utilizando o script configure com a opção —sysconfdir=/diretório), que é muito bem comentado. Nele temos como opções principais: O ippl é um l o g g e r altamente configurável de protocolos IP desenvolvido por Hugo Haas e E t i e n n e Bernard como substituto ou alternativa ao conhecido iplogger. Ele registra mensagens ICMP, conexões TCP e datagramas UDP, possuindo uma sintaxe de configuração amigável e muito similar a encontrada em servidores web Apache, além de já possuir um cache DNS padrão incluído. Podemos entender como Logger de protocolos IP um serviço ou daemon que registre em arquivos de log pacotes IP enviados para um servidor. –runas Sintaxe: runas usuário Através dessa opção podemos utilizar outros usuários do sistema para executarmos o ippl. Comumente esse usuário é o nobody ou o ippl (criado apenas para esse propósito). –noresolve No momento em que escrevo esse artigo, a última versão disponível do IPPL é a 1.4.14 e pode ser obtida através do endereço: Sintaxe: noresolve protocolo Com essa opção ativa em nosso arquivo de configurações, o ippl não tentará utilizar resolução DNS durante o registro dos logs para um dado protocolo escolhido ou para todos (noresolve all). Essa opção é altamente recomendada para servidores com alto tráfego. http://pltplp.net/ippl/archive/ippl-1.4.14.tar.gz A instalação do IPPL é extremamente simples. Após realizar o download do código fonte e descompactá-lo, basta utilizarmos a tríade: –Log-in ./configure; make; make install E já teremos o ippl corretamente compilado e instalado em nosso sistema, já configurado para ser executado como nobody e com prefixo de instalação /usr/local por padrão . Caso deseje utilizar outro usuário como padrão, o script configure possui a opcao —with-user=USUARIO ou então você poderá alterá-lo através do parâmetro runas do arquivo de configurações do IPPL. Sintaxe: log-in protocolo destino Através dessa opção, podemos separar os arquivos onde serão registrados os pacotes enviados ao servidor por protocolo. Utilizando por exemplo log-in icmp /var/log/ippl/ icmp.ippl.log, fará com que os registros de pacotes icmp sejam direcionados ao arquivo icmp.ippl.log no diretório /var/log/ippl . Devo frisar aqui que a ferramenta não cria o diretório ou arquivo escolhido, ele deverá existir ou ser criado pelo próprio administrador. Dependendo do tráfego de seu servidor, uma boa idéia é simplesmente direcionar todos os seus logs para o próprio /var/log/messages (log-in all /var/log/messages), facilitando assim a auditoria Apesar de já podermos executar o ippl logo após sua instalação sem a necessidade de alteração de seus parâmetros, seu arquivo de configurações possui diversas opções que podem facilitar ainda mais o funcionamento do www.linuxsecurity.com.br 19 automática desses logs através do LogSentry ou pelo LogSurfer (comentado mais abaixo) com um arquivo de configuração unificado. Você também tem pode utilizar a opção log em conjunto da options, disponíves para determinar de forma explícita como deve ser registrado um dado pacote ou conexão diferentemente do padrão configurado. Um exemplo dessa opção pode ser: –Run Sintaxe: run protocolo A opção run determina quais são os protocolos cujos pacotes serão registrados. Como padrão o icmp e tcp estão habilitados. log options resolve,logclosing,normal tcp port 22 from 10.0.0.32 Nesse caso, toda conexão vinda de 10.0.0.32 para a porta 22 (ssh) local seria registrada com as opções resolve (para resolução de nomes), logclosing (para registro do término da conexão) e com nível de detalhes normal. –logformat Sintaxe: logformat formato protocolo Essa opção é responsável pelo nível de detalhes com que os logs serão registrados, variando de mínimo (short), normal (normal) e detalhado (detailed). Para qualquer servidor o recomendado é o detalhado, que inclui informações a respeito da origem, destino e porta acessada de uma conexão registrada. O leitor poderá criar regras mais elaboradas e complexas de acordo com o funcionamento de seu servidor e rede obtendo, para isso, maiores informações através da página manual do ippl.conf: man 5 ippl.conf Além da configuração, o IPPL possui opções para filtragem de tudo que for registrado. Essas opções são de fácil entendimento e também devem ser utilizadas no arquivo ippl.conf. Uma dessas opções é a ignore, que faz o que o próprio nome diz, ignora certos pacotes baseado no protocolo, tipo, host e porta destino, host e porta origem. Essa opção é importante para evitar por exemplo que conexões ao serviço web de um servidor sejam registradas (já que as mesmas já são registradas de forma muito completa pelo próprio daemon responsável pela web) ou que mensagens icmp comuns não aumentem seus logs de forma descontrolada. Para esse exemplo, poderíamos utilizar em nosso arquivo de configurações: Depois de configurado, podemos já executar nosso ippl e observar no arquivo de logs escolhido os pacotes sendo registrados. Não se esqueça de adicionar o mesmo em seu arquivo de inicialização: # Inicializando o logger IPPL if [ -x /usr/local/sbin/ippl ]; then /usr/local/sbin/ippl fi LogSurfer Para quem já conhece o swatch e o LogCheck, o LogSurfer é uma ferramenta muito similar desenvolvida por Wolfgang Ley e Uwe Ellerman para checagem e auditoria de logs, porém com a capacidade de manipular ignore tcp port 80 ou ignore tcp port http ignore icmp type echo_reply ou ignore icmp type 0 ignore icmp type echo_req ou ignore icmp type 8 www.linuxsecurity.com.br 20 registros com diversas linhas, adaptando dinamicamente suas regras. O programa foi desenvolvido para monitorar qualquer arquivo de log baseado em texto de seu sistema em tempo real, tomando decisões baseadas em regras, podendo também executar programas externos,o que facilita muito o trabalho de administradores de sistemas, principalmente em servidores com tráfego considerável onde essa análise em tempo real é praticamente impossível de ser realizada pelo próprio responsável pelo sistema. para esse fim, como por exemplo logsurfer :-) Assim como do IPPL, a instalação do LogSurfer é bem simples e rápida, bastando aos mais apressados: ./configure; make; make install Após a instalação padrão, provavelmente você poderá encontrar problemas ao acessar as manpages do pacote dependendo de sua distribuição. Caso isso aconteça, instale manualmente as manpages em seu sistema utilizando por exemplo: A vantagem do LogSurfer sobre outras ferramentas de análise similares é justamente a rapidez com que você será informado a respeito de qualquer eventualidade no servidor. Ao invés de precisar analisar resumos de logs enviados ao seu email de tempos em tempos, você receberá uma notificação assim que um dado fato ocorrer e poderá tomar imediatamente sua decisão ou ainda acompanhar o caso, evitando muitas vezes um incidente de segurança maior. cp man/logsurfer.1 /usr/share/ man/man1/ cp man/logsurfer.conf.4 /usr/ share/man/man4/ Substitua /usr/share pelo prefixo correto caso necessário. Depois de corretamente instalado, precisaremos agora configurar as regras de análise do LogSurfer para utilizá-lo corretamente. O arquivo padrão que deverá conter essas regras é o logsurfer.conf, porém você poderá especificar outros arquivos de regras diferentes através do próprio comando de linha e até executar diversas instâncias do LogSurfer dependendo de suas necessidades. O LogSurfer é uma ferramenta poderosa e muito versátil, podendo possuir configurações muito simples, mas também complexas ao extremo. Repassarei nesse artigo algumas informações simples e básicas sobre ele, esperando que tais informações encoragem o estimado leitor a procurar sempre mais. Para entendermos melhor a estrutura de configuração das regras do LogSufer, devemos primeiramente saber que cada regra no arquivo deve conter 6 campos obrigatórios e um campo opcional, todos separados por espaços. O sinal “-” colocado em um dos campos determinará sua anulação ou não utilização. Como os campos são delimitados por espaços, caso um campo necessite conter espaços, ele deverá estar delimitado por aspas simples ou duplas, do contrário cada um será entendido como sendo um campo da regra. A última versão do LogSurfer disponível no momento é a 1.5a e pode ser obtida através do endereço: ftp://ftp.cert.dfn.de/pub/tools/audit/logsurfer/ logsurfer-1.5a.tar Como a ferramenta não necessita de privilégios de superusuário para ser executada, antes de instalarmos o logsurfer o ideal é criarmos um usuário comum no sistema, de preferência um www.linuxsecurity.com.br 21 Se precisarmos utilizar aspas duplas em algum campo já delimitado por aspas, deveremos utilizar o caracter escape (“\”). Os tipos de ação disponíveis são: –ignore: Nada mais será feito caso a ação seja ignore, ou seja, o processo será simplesmente ignorado. –Exec: executa um programa externo, podendo receber também parâmetros ou argumentos. Todos os programas devem ser sempre especificados utilizando o caminho (PATH) completo para o mesmo. –Pipe: Assim como o exec, ele executa um programa externo, porém repassando a esse programa as linhas que combinaram com a regra como stdin. De forma prática é o mesmo que utilizar o pipe (“|”) em sua linha de comando para passar argumentos a outros programas. –Open: Essa ação abre um contexto que já exista. O contexto nada mais é que um conjunto de linhas que foram lidas pelo LogSurfer. –Delete: Essa ação apaga um contexto existente –report: Com essa ação os contextos especificados são utilizados como stdin do programa especificado como primeiro argumento. –rule: Utilizados para criação de novas regras em tempo real. Como disse anteriormente, o contexto para o LogSurfer são conjuntos de mensagens que foram lidas pela ferramenta. Contextos podem ser utilizadas com a opção “report” para apresentar uma coleção de mensagens associadas a uma ação específica, como por exemplo todas as mensagens de uma sessão ftp ou telnet. Os campos e suas funções em ordem são: match_regex not_match_regex stop_regex not_stop_regex timeout [continue] Ação Sendo: –match_regex: Expressão regular que determina quais linhas ou registros de um log combinam ou casam com a regra. –not_match_regex: Expressão regular que determina quais linhas ou registros deverão ser excluídos do campo anterior (match_regex). –stop_regex: Caso uma linha ou registro combine com a expressão regular do campo stop_regex, a regra será deletada da lista ativa. –not_stop_regex: Caso uma linha ou registro combine com a expressão regular do campo not_stop_regex e o campo stop_regex não esteja anulado com o sinal “-”, então a regra não será deletada. –Timeout: Duração em segundos para timeout. Para especificar um timeout infinito, devemos utilizar “0” nesse campo. –Continue (opcional): Caso a palavra “CONTINUE” seja incluída na regra, as demais regras do arquivo de configuração serão também consideradas ao invés do processo ser terminado, que é o padrão do LogSurfer. –Ação: Esse campo especifica o tipo de ação que deverá ser tomada pelo LogSurfer caso uma regra seja ativada. Esse campo é seguido por diversas opções dependendo da ação escolhida. www.linuxsecurity.com.br Cada contexto também possui 6 campos, sendo eles: –match_regex: Determina que linhas casarão com o contexto. –not_match_regex: utilizado para excluir linhas determinadas pelo match_regex. 22 –line_limit: Define o número máximo de linhas que serão armazenadas no contexto. Ideal para evitar ataques DoS. –timeout_abs: Valor em segundos que define o timeout absoluto do contexto antes que a ação padrão seja executada (comentado abaixo). –timeout_rel: Valor em segundos que define o timeout relativo do contexto, que é o intervalo de tempo de espera para que novas mensagens sejam adicionadas ao contexto antes que a ação padrão seja executada. –default_action: Ação padrão a ser executada caso o número de linhas máximo ou os timeouts sejam alcançados. As ações ignore, exec, pipe e report estão disponíveis para esse campo. article.php?sid=3056 h t t p : / / w w w. l i n u x s e c u r i t y. c o m . b r / article.php?sid=1843 h t t p : / / w w w. l i n u x s e c u r i t y. c o m . b r / article.php?sid=1848 h t t p : / / w w w. l i n u x s e c u r i t y. c o m . b r / article.php?sid=2665 http://www-106.ibm.com/developerworks/library/ l-sed1.html http://www-106.ibm.com/developerworks/library/ l-sed2.html http://www-106.ibm.com/developerworks/library/ l-sed3.html Nesse exemplo simples estaremos monitorando o arquivo padrão de registro de logs de muitas distribuições Linux, o /var/log/messages. Apesar de interessante, a teoria muitas vezes não é muito útil se não for acompanhada de pelo menos um exemplo prático de utilização, por isso vamos apresentar agora um desses exemplos. Antes de apresentá-lo porém, gostaria de recomendar aos estimados amigos que procurem maiores informações a respeito de expressões regulares, cujo entendimento é muito importante não só para a utilização dessa ferramenta, como também para diversas outras tarefas de qualquer administrador de sistemas. Um bom início de estudo sobre expressões regulares é o capítulo 19.1 do Advanced BashScripting Guide: Executamos o LogSurfer da seguinte maneira: /bin/su - logsurfer -c “/usr/local/sbin/ logsurfer -c /etc/logsurfer.conf \ -f /var/log/messages” Através dessa linha de comando estaremos executando o logsurfer com privilégios do usuário logsurfer, utilizando o arquivo de regras /etc/ logsurfer.conf e monitorando nosso arquivo de registro de logs /var/log/messages. Em nosso /etc/logsurfer.conf: # logsurfer.conf exemplo ‘sshd\[([0-9]+)\]: log: Password authentication for (.*) failed’ - - - 0 pipe “/bin/mail root -s \”Falha na autenticação SSH\”” http://www.tldp.org/LDP/abs/html/x11896.html ‘proftpd\[([0-9]+)\]: server \(([09.]*)\[([0-9.]*)\]\) - no such’ - - - 0 pipe “/bin/mail root -s \”Usuário proftpd não existente\”” Além dos documentos para aprofundamento (awk e sed), que o ajudarão muito a dominar completamente expressões regulares, além do próprio awk e sed, indispensáveis à administração: ‘.*’ - - - 0 ignore h t t p : / / w w w. l i n u x s e c u r i t y. c o m . b r / www.linuxsecurity.com.br 23 Nesse simples logsurfer.conf de exemplo temos uma primeira regra que envia um email ao superusuário do sistema em todos os momentos em que houver uma falha na autenticação de um usuário SSH e a string de erro padrão de autenticação do sshd for registrada em nosso / var/log/messages. Como estamos utilizando a opção de ação pipe, a mensagem registrada sera enviada como entrada do programa mail, portanto enviada juntamente com o email ao superusuário para pronta análise. Pela segunda regra de nosso arquivo, quando um usuário qualquer tentar conectar-se ao servidor ftp proftpd local com um usuário inexistente no sistema, um email será também enviado ao superusuário contendo o registro para análise. A última linha de nosso arquivo exemplo de configuração simplesmente diz ao LogSurfer para ignorar quaisquer outros registros de nosso arquivo de logs. Como puderam perceber também, utilizei aspas simples para delimitar o primeiro campo das 2 primeiras regras, aspas duplas para delimitar as opções da ação pipe e o caracter escape para poder utilizar aspas duplas dentro de um campo delimitado por aspas duplas como explicado anteriormente. Comentei nesse artigo que outras instâncias do LogSurfer poderiam ser executadas analisando diferentes arquivos de log de seu sistema ao mesmo tempo. Poderíamos por exemplo criar uma configuração para executar uma instância específica para os logs do servidor DNS Bind: —————————————— ## Arquivo exemplo comentado logsurfer-BIND.conf # Ignoramos algumas mensagens comuns ‘named.*IN MX. points to a CNAME’ - - - 0 ignore ‘named.*starting’ - - - 0 ignore # Nesse caso ativamos um script qualquer de exemplo que funcione como pager, # enviando a um celular ou email uma notificação ‘^.{16}(.*) named\[([0-9]+)\]: Ready to answer queries’ - - - 0 exec “/bin/pager.sh \”Servidor DNS iniciado\”” # No caso abaixo uma notificação será enviada ao hostmaster via email quando # uma zona DNS não estiver sendo encontrada. ‘^.{16}(.*) named\[([0-9]+)\]: db_load could not open: (.*): No such file or directory’ - - - 0 pipe “/bin/mail hostmaster -s \”Arquivo de zona DNS apagada ou não encontrada \”” # Registramos também requisições negadas pelo nosso servidor e utilizamos o # script perl externo reportmailer para enviar a notificação ao hostmaster ‘^.{16}(.*) named\[([0-9]+)\]: denied (.*) from \[(.*)\].*for \”(.*)\”.*’ - - - 0 open “$5” - 5000 600 180 report “/bin/reportmailer -r hostmaster -S \” $5\”” “$5” # Mais uma vez utilizamos o script perl reportmailer para enviar uma notificação # de um erro gerado por uma recusa a um arquivo de zona DNS ‘^.{16}(.*) named\[([0-9]+)\]: master zone \”(.*)\”.*rejected due to errors \(serial (.*)\)’ - - - 0 www.linuxsecurity.com.br 24 report “/bin/reportmailer -r logsurfer -S \”DNS zone $4 serial $5 broken on $2\”” “$2 named\\[$3\\]” # Ignoramos outros registros ‘named\[[0-9]+\]’ - - - 0 ignore O script Perl utilizado acima, assim como o script pager.sh são apenas exemplos ilustrativos para demonstrar que outros programas externos e com mais opções e parâmetros podem ser utilizados: —————reportmailer————— #!/usr/bin/perl use Getopt::Std; getopts(“S:r:”); my $SUBJECT = $opt_S if defined $opt_S; my $RECIPIENT = $opt_r if defined $opt_r; open OUTFILE, “|/usr/sbin/sendmail $RECIPIENT ; print OUTFILE “Subject: $SUBJECT\n\n”; while (<>) { print OUTFILE $_; } ——————pager.sh——————— #!/bin/bash SMSEMAIL=”[email protected]” #email para celular echo $1 | /bin/mail -s ‘LogSurfer Pager’ $SMSEMAIL Como disse, esses são exemplos extremamente simples perante o real poder do LogSurfer, mas já servem como bom ponto de partida. Outros 2 exemplos com maior complexidade podem ser acessados através do site do próprio projeto em: ftp://ftp.cert.dfn.de/pub/tools/audit/logsurfer/ config-examples Espero que o artigo tenha sido de alguma forma útil e que tenha despertado o desejo do leitor em procurar novas fontes de informação a respeito. Fico a disposição para eventuais dúvidas e/ou sugestões e volto na próxima edição de nossa revista com mais dicas para o enriquecimento de seus logs e facilidade de auditoria/análise. Obrigado a todos pela atenção e pelo tempo gasto na leitura desse documento. FICHA do AUTOR Forte abraco... www.linuxsecurity.com.br 25 Nome: Renato Murilo Langona Idade: 22 Profissao: Analista/Consultor de Seguranca da Informação Empresa: LinuxSecurity Brasil Solutions S/C Ltda. Email: [email protected] Site: http://www.linuxsecurity.com.br www.linuxsecurity.com.br 26 ARTIGO Sumário SPAM SPAM xx qmail qmail SPAM x qmail falha de segurança no qmail e, por incrível que pareça, ninguém achou nada ainda. A versão atual do qmail é a 1.03 de 1998, isso nos dá uma grande sensação de estabilidade deste grande MTA. Introdução A palavra SPAM na verdade é uma marca de presunto enlatado que se popularizou num programa de TV, onde Vikings pediam repetidamente presunto enlatado da marca SPAM. Cada processo do qmail roda apenas com as permissões que realmente necessita, evitando assim que algum processo rode como root desnecessariamente. Porém, na internet, SPAM são e-mails que recebemos e não são solicitamos, normalmente fazendo propaganda de um produto ou serviço, falando mal de alguma pessoa, propaganda de sites pornográficos, corrente, pirâmide... Para maiores informações sobre a segurança do qmail visite o site: http://cr.yp.to/qmail/ guarantee.html Estes e-mails sempre são enviados não apenas para você mas para várias pessoas (muitas vezes milhões). Como resultado disso tudo, temos nossas caixas postais cheias de “lixos”e além disso para nós, administradores de sistemas, servidores de e-mails lotados, gerando tráfego desnecessário. Estrutura do qmail O qmail é modular e possui vários programas que o gerenciam. Na figura abaixo veremos cada um deles e a suas principais funções. Neste artigo ,irei abordar como filtrar estas mensagens e também como prevenir que nosso servidor de e-mail seja usado para enviar um SPAM. Por que qmail ? Discutir qual MTA (Mail Transfer Agent) é melhor é como discutir política ou futebol, cada um vai defender o que mais gosta. Mas a escolha do qmail foi por ele ser um MTA totalmente modular e principalmente seguro. Para se ter uma idéia da segurança do qmail, o seu autor Dan Bernstein ofereceu em março de 1997 500 dólares para quem descobrisse alguma www.linuxsecurity.com.br 27 qmail-smtpd - É o daemon que escuta (auxiliado pelo tcpserver ou inetd) na porta 25 (smtp) para receber as mensagens. qmail-inject - É o programa responsável pela entrada de um e-mail no qmail atravéz de linha de comando. qmail-queue - É o programa responsável pelo gerenciamento da queue (fila). qmail-send - É o programa responsável pela entrega dos e-mails. qmail-rspawn - É o programa que gerencia as entradas remotas (MX externos). qmail-lspawn - É o programa que gerencia as entregas locais (caixas dos usuários). qmail-remote - É o programa que faz a entrega propriamente dita do e-mail remoto. qmail-local - É o programa que faz a entrega do e-mail localmente (caixa dos usuários). Digamos que queremos liberar RELAY para os IPS 192.168.0.X e 192.168.5.2, neste caso teríamos que colocar no nosso /etc/tcp.smtp o seguinte: 192.168.0.:allow,RELAYCLIENT=”” 192.168.5.2:allow,RELAYCLIENT=”” Logo após teríamos que gerar o cdb: # tcprules /etc/tcp.smtp.cdb /etc/tcp.tmp < /etc/tcp.smtp E colocarmos no nosso tcpserver o parâmetro -x /etc/tcp.smtp.cdb # tcpserver -x /etc/tcp.smtp.cdb -u 81 -g 82 0 smtp /var/qmail/bin/qmail-smtpd & Parece um pouco confuso no começo, mas na verdade se formos analisar é extremamente simples e funcional. É importante nós entendermos como o qmail funciona, para futuramente no artigo entendermos como funciona cada software. Feito isso todos os e-mails que vierem de 192.168.0.X ou 192.168.5.2 terão o RELAY liberados. OBS: Se você omitir o parâmetro -x no tcpserver e não instalar nenhum software que abra o RELAY ,o qmail tem como padrão o RELAY fechado. A configuração do qmail é feita em arquivos normalmente localizados no diretório /var/qmail/ control. Existem alguns arquivos por padrão no qmail que podem nos ajudar a bloquear SPAM. RELAY no qmail São eles: /var/qmail/control/badmailfrom - Neste arquivo podemos listar e-mails que queremos que o qmail rejeite. Se omitido o usuário, ele considera o domínio inteiro: O controle de RELAY no qmail é feito pela variável RELAYCLIENT, normalmente setada no arquivo /etc/tcp.smtp que depois de transformado em formado CDB é passada como parâmetro para o tcpserver através do opção -x. # cat /var/qmail/control/badmailfrom [email protected] Vamos ver um exemplo: www.linuxsecurity.com.br 28 Feito isso altere a linha do seu tcpserver ou inetd para o qmail-smtpd receber 3 parâmetros: [email protected] @dominio.com # tcpserver -x /etc/tcp.smtp.cdb -u 81 -g 82 0 smtp /var/qmail/bin/qmail-smtpd meu_hostname meu_sofware_de_auth patch_do_binario_true & /var/qmail/control/concurrencyremote - Este arquivo normalmente não está no diretório control, terá que ser criado. Caso não exista o arquivo, o valor padrão é 20, ou seja , o qmail limitará em 20 entregas de e-mails remota simultâneas. Se você quiser mudar este valor para 80 por exemplo faça: # tcpserver -x /etc/tcp.smtp.cdb -u 81 -g 82 0 smtp /var/qmail/bin/qmail-smtpd mail.gamk.com.br /var/vpopmail/bin/ vchkpw /usr/bin/true & # echo 80 > /var/qmail/control/ concurrencyremote OBS: Neste exemplo foi usado o qmail com vpopmail http://www.inter7.com/ vpopmail que é um software muito bom para um servidor com vários domínios. OBS2: /usr/bin/true é o patch do arquivo em *BSD, verifique a localização do seu (no Linux normalmente fica em /bin/true). Mas como você pode ver no qmail ,por padrão, você não tem muitas opções para bloquear SPAM, para melhorar isso existem vários softwares, que veremos logo a seguir. qmail-smtpd-auth Caso você use realmente o vpopmail, você terá que ajustar as permissões do binário vchkpw para: Este software realiza o trabalho de autenticação de usuários no SMTP para enviar e-mail. Para obter este patch entre em: http:// members.elysium.pl/brush/qmail-smtpd-auth/ # chmod 4755 /var/vpopmail/bin/vchkpw # chown root.wheel /var/vpopmail/bin/ vchkpw Este pacth possui suporte auth do tipo: LOGIN, PLAIN, CRAM-MD5. A versão atual do patch é a 0.31. Para instalar siga as instruções: OBS: O grupo do root em sistemas *BSD é o wheel. Caso esteja usando Linux altere para root. # cp README.auth base64.h base64.c ../ qmail-1.03 # patch -d ../qmail-1.03 < auth.patch Feito isso qualquer usuário de qualquer lugar da internet vai ter acesso ao envio de e-mails usando o seu SMTP se fizer a autenticação com o seu usuário e senha. Feito isso recompile o seu qmail (desligue o qmail antes se estiver rodando): Vpopmail com suporte a liberação de RELAY após auth no POP3 # cd ../qmail-1.03 # make setup check www.linuxsecurity.com.br Esta é outra funcionalidade interessante se usarmos qmail junto com o vpopmail. 29 Na hora de compilar o vpopmail use as opções (./configure): • Limitar o máxido de recepients por mensagem —enable-roaming-users=y —enable-relay-clearminutes=60 • Controle de RELAY por IP, dominio e Mail From. Logo após adicione no cron para rodar de minuto em minuto o binário: clearopensmtp Você pode encontrá-lo na página: http:// www.fehcom.de/qmail/qmail_en.html. A versão atual é a 1.8.0. E no tcpserver coloque o parâmetro -x /var/ vpopmail/etc/tcp.smtp.cdb Neste caso os usuários que fizerem auth via POP3 terão 60 minutos de RELAY aberto, no SMTP. Para instalar o SPAMCONTROL: Copie o tgz do SPAMCONTROL para dentro do source do qmail e descompacte-o. Logo após execute ./spamcontrol.sh. Feito isso os patchs serão aplicados. Agora basta recompilar o qmail ou apenas o qmail-smtpd novamente usando “make setup check”. Feito isso o SPAMCONTROL será instalado no seu qmail e ele irá alterar inclusive os man pages. Para maiores informações sobre as novas variáveis que o spamcontrol criou, no qmail digite “man qmail-control”. SPAMCONTROL Como eu falei anteriormente, a maioria das configurações do qmail é feita no diretório control com o SPAMCONTROL. Não podia ser diferente. Para bloquear e-mails nós temos os bad* files: SPAMCONTROL é um patch também para o qmail-smtpd desenvolvido por Erwin Holffmann, que uniu vários patchs de diversos autores e fez um grande patch, com várias funcionalidades anti-spam para qmail. Na minha opinião o melhor patch para qmail. /var/qmail/control/badmailfrom - Neste arquivo não alterou nada. Continua o padrão do qmail /var/qmail/control/badrcptto - Neste arquivo colocaremos os recepients que queremos bloquear (lembre-se que pode colocar domínios também). Este patch aplica ao qmail-smtpd varias funcionalidades, como: • Suporte a filtrar from e to com regex • Suporte a checagem de DNS no mail from • Suporte a tarpit • Os bad* lista recebem o KILL da conexão TCP na hora www.linuxsecurity.com.br /var/qmail/control/badmailpatterns - Igual ao badmailfrom só que neste arquivo você pode usar Wildcards (*,!,[]). 30 /var/qmail/control/badrcptpatterns - Igual ao badrcptto só que neste arquivo você pode usar Wildcards (*,!,[]). tcpserver). Com isso você poderá definir que algumas redes não farão checagem de DNS e outras sim. Se você quiser que apenas em alguns domínios não seja feita a checagem de DNS, coloque estes dominios no arquivo /var/qmail/ control/nodnscheck. Estes arquivos listados acima quando forem negar uma mensagem negarão na porta com a mensagem de erro e haverá corte da conexão TCP imediatamente. Com o SPAMCONTROL podemos controlar o RELAY de várias maneiras (por IP, dominio e por Mail from). Outra grande funcionalidade do SPAMCONTROL é o suporte a tarpiting, isso é, você define quantos “rcpt to” um email pode ter e depois que ultrapassar este numero, ele começará a ter um delay definido num arquivo de configuração para pedir o próximo comando, fazendo com que se uma pessoa quiser enviar um SPAM para 150 pessoas quando passar de 10 (exemplo) as próximas (de 11 a 150) ficarão muito lentas para o SMTP aceitar, fazendo com que a pessoa desista (normalmente). Os arquivos de configuração são: /var/qmail/control/mailfromrelay - Controle de RELAY baseado no Mail From /var/qmail/control/relaydomains - Controle de RELAY baseado no Domínio /var/qmail/control/relayclients - Controle de RELAY baseado no IP do Cliente. OBS: no relaydomains você tem que colocar o dominio e um : (dois pontos) no final, por exemplo: “gamk.com.br:” (um por linha). /var/qmail/control/tarpitcount - Numero de “rcpt to” para começar a ficar lento (Default: 0) . 0 significa ilimitado. Como vocês puderam observar ,o SPAMCONTROL é um patch completo para o controle de SPAM no qmail, além dessas funcionalidades apresentadas no artigo, existem algumas outras que você poderá encontrar no arquivo README.spamcontrol presente no source do SPAMCONTROL. /var/qmail/control/tarpitdelay - Delay em segundos para aceitar o próximo “rcpt to” (Default: 5). Outra opção interessante que o SPAMCONTROL implementa e que pode ser usada juntamente com o tarpiting é limitar o número máximo de recipients por mensagem, na variável /var/qmail/ control/maxrecipients. qmail-filter O qmail-filter é um filtro de e-mails para qmail desenvolvido pelo grande amigo Rodrigo P. Telles. Ele foi escrito em AWK e a sua versão atual é a 1.0.4. Você pode obtê-la na página http:/ /qmail.linuxsecurity.com.br Eu normalmente uso tarpitcount com 20 tarpitdelay de 5 e maxrecipients com 40. Neste caso, a partir de 20 pessoas o qmail irá começar a fazer um delay de 5 segundos para pedir o próximo e a partir de 40 ele negará o envio da mensagem. Este software trabalha entre o qmail-smtpd e o qmail-queue, bloqueando os e-mails na porta, nem chegando a entrar na queue (fila). Por padrão temos vários filtros (por Subject) de vírus, algumas extenções de arquivos e alguns arquivos perigosos. Obviamente estes filtros Checagem de DNS com o SPAMCONTROL é padrão. Se você quiser desabilitar configure a variável NODNSCHECK no seu tcprules (-x www.linuxsecurity.com.br 31 poderão ser alterados facilmente editando o arquivo qmail-filter.awk. Além disso, junto com o qmail-filter acompanha o virus-total.awk que oferece algumas estatísticas dos e-mails barrados (baseado nos logs do qmail-filter). A instalação é muito simples basta executar o comando ./install, o programa fará algumas perguntas (em português) e pronto!! ele será instalado. Como ele barra os e-mails na porta, ele retorna um erro para o cliente. Este erro pode ser personalizado. Leia o arquivo INSTALL que acompanha o source do qmail-filter para saber como fazer isto. Além disso, junto com source do qmail-filter existe um arquivo chamdo FILTERS com instruções de como criar novos filtros (em português). O qmail-filter é uma execelente ferramenta que filtra através de Subject e arquivos anexados em e-mails, porém por possuir um código simples, pode ser facilmente alterado para filtrar outras coisas. FICHA do AUTOR SPAM é coisa séria e hoje em dia na intenet é um modo de propaganda fácil e barata mas que muitas vezes incomoda várias pessoas. O qmail possui várias ferramentas para prevenir isto. Entre na página oficial do qmail http:// www.qmail.org que você encontrará uma gama de ferramentas úteis e alguma com certeza o agradará. Espero ter sido útil neste artigo simples que pretendeu mostrar algumas maneiras de se proteger contra SPAM e proteger o seu servidor de ser usado para envio. Eu pessoalmente uso a solução qmailfilter+SPAMCONTROL. Verifique qual lhe agrada e começe a se proteger desse mal. www.linuxsecurity.com.br Nome: Diego Linke - GAMK System/Network Administrator Curitiba - Parana - Brazil e-mail: [email protected] Web Site: http://www.gamk.com.br Phone Number: (+5541) 9967-3464 32 ARTIGO Sumário Saudosa Malloca, Malloca Querida ... Izar Tarandach, Junho ’02, (c)LinuxSecurity Brasill O conceito de seguranca faz parte e todos os estágios de desenvolvimento de software. Em artigos anteriores em minha coluna no site da LinuxSecurity (http:// www.linuxsecurity.com.br), abordei alguns destes estágios e as estratégias e ferramentas utilizadas para diminuir a possibilidade de bugs no produto final. O planejamento do sistema deve incluir o fator segurança, e o código-fonte deve ser revisado automaticamente por ferramentas especializadas e a mão por colegas que possam encontrar problemas de lógica e maior complexidade do que as opções automáticas Passado o momento da compilação, nos restam ainda algumas tarefas, em se tratando tanto de segurança quanto de boas práticas de programação, como por exemplo estarmos certos de que o programa pode sobreviver ao “teste do gorila”, e de que não existem problemas de memória, que podem trazer problemas a longoprazo, no caso de servidores que apresentem vazamento de memória ou, a curto, no caso de buffer overflows e outros possíveis problemas ligados a entrada de dados não verificados. Na maioria das vezes, erros simples são encontrados rodando o programa, utilizando entradas pré-definidas que provem a correção do mesmo, quando a saída esperada é recebida. No caso de algum problema, debugadores e comandos de impressão espalhados pelo programa ajudam e são, normalmente, suficientes. Infelizmente, este tipo de debug implica que a presença e a natureza do bug são conhecidas, e que o programador tem algum conhecimento da operação de um debugger (que pode ser complexo, em alguns casos - por exemplo, adb). www.linuxsecurity.com.br Assim, uma das melhores ferramentas que podem ajudar o programador neste estágio do processo é o runtime-debugger, e este é o assunto que eu gostaria de abordar neste artigo. Programas tem basicamente quatro tipos de usos para memória: variáveis globais, variáveis locais, memória alocada dinamicamente e memória partilhada. As variáveis globais e locais podem apresentar problemas, as primeiras quando utilizadas sem inicialização prévia (“lixo” na variável), e as seguintes por estarem presentes no stack. Nesta categoria o problema se apresenta na maior parte das vezes como memória alocada dinamicamente. Alguns dos erros mais comuns quando se utiliza memória dinamicamente alocada são buffer overflows (tenta-se escrever após o fim do segmento alocado) e underflows (tenta-se escrever antes do começo do segmento alocado). FICHA do AUTOR Nome Completo: Izar Tarandach Idade: 34 anos Profissão: Diretor de Engenharia e Tecnologia Empresa: Aduva Ltd. E-mail: <[email protected]> http://www.aduva.com/~izar 33 O programa sai com um SIGSEV, uma falta de segmentação, já que tenta acessar uma pagina de memória que não foi alocada pelo malloc. O resultado é a parada total do programa, na maioria dos casos, e em alguns casos específicos, a possibilidade de se inserir código malicioso dentro da execução do binário em questao, com os resultados conhecidos. O uso de “debuggers de malloc”, como efence, libsafe e soluções comerciais como Insure e Purify nos permitem isolar este tipo de erro e outros, antes deles se tornarem perigosos demais. void foo(char *bar) { char baz[10]; strcpy(baz,bar); } Se a funcao foo for chamada com argumento “abcdefghijklmnopqrs” vai provocar um buffer overflow, já que a variável baz, que deverá receber uma cópia do argumento, só tem lugar para 10 caracteres (9+NULL de terminação): Assim, se o programa for rodado usando libsafe, o resultado sera ligeiramente diferente: Starting program: /home/izar/./foo Breakpoint 1, main () at foo.c:8 8 foo(“aaaaaaaaaaaabcdefghijklm”); (gdb) s foo (bar=0x80484a8 ‘a’ <repeats 12 times>,”abcdefghijklm”) at foo.c:4 4 strcpy(baz,bar); (gdb) n 5 } (gdb) p baz $1 = “aaaaaaaaaa” (gdb) n izar@milfalcon ~ > setenv LD_PRELOAD /lib/ libsafe.so.2 izar@milfalcon ~ > ./foo Detected an attempt to write across stack boundary. Terminating /home/izar/foo. uid=501 euid=501 pid=1635 Call stack: 0x400175d5 0x4001770f 0x8048410 0x804842e 0x4004b27b Overflow caused by strcpy() Killed Até aqui, tudo bem. O programa foi executado, a cópia da cadeia foi feita e, por ser o gdb um debugger bastante “esperto”, a variável baz é mostrada como tendo apenas 10 vezes a letra “a”. Porém: A vantagem inerente ao uso de libsafe é que não requer uma recompilaçã do codigo para fazer o debug. Basta informar ao carregador de bibliotecas dinâmicas que estaremos fazendo uso do libsafe via o uso de setenv em tcsh ou “export LD_PRELOAD=/usr/lib/libsafe.so.2” em bash. A variável de ambiente LD_PRELOAD informa ao carregador que a biblioteca em questão deve ser carregada antes de quaisquer outras, efetivamente possibilitando um “override” de funções específicas. Isto é exatamente o que o libsafe faz, sobrecarregando aquelas funções main () at foo.c:10 10 } (gdb) 0x4003c3ce in _dl_pagesize () from /lib/ libc.so.6 (gdb) Single stepping until exit from function _dl_pagesize, which has no line number information. Program received signal SIGSEGV , Segmentation fault. 0x4003c448 in _dl_pagesize () from /lib/ libc.so.6 www.linuxsecurity.com.br 34 conhecidas como problemáticas, que recebem espaços de memória e efetuam operações como cópia sem checar as fronteiras (strcpy, strcat, gets, scanf...etc.). Uma vez que o programa chama a rotina, a versão provida pelo libsafe é usada. Essa versão provê uma guarda mais detalhada dos espaços de memória, e como visto no exemplo, pode dar uma indicação mais específica do local do erro. Outra vantagem do uso de libsafe é a escrita nos logs de quaisquer violações. Se você tiver um servidor que esteja sob suspeita de ser vulnerável a ataques via buffer overflow, é possivel receber uma mensagem cada vez que uma tentativa ocorrer: Outra opção interessante é efence. O uso é um pouquinho mais complicado, mas as opções são mais flexíveis. O projeto é fruto do trabalho do “desconhecido” Bruce Perens. Esta biblioteca pode ser usada tanto estaticamente, compilada dentro do programa (/ usr/lib/libefence.a na linha de compilação) quanto dinamicamente utilizando o mesmo mecanismo de setenv/export explicado acima. Uma vez que se incluiu a biblioteca com um destes métodos, resta rodar o programa em um debugger - do contrário, teríamos que rodar o programa, receber um arquivo core e então sim rodar o debugger. Como arquivos core podem ser muito grandes, vale a pena começar o processo desde o debugger. [root@milfalcon izar]# more /var/log/secureJun 25 12:26:27 milfalcon libsafe.so[1635]: 2.0.13 Jun 25 12:26:27 milfalcon libsafe.so[1635]: Detected an attempt to write across stack boundary. Jun 25 12:26:27 milfalcon libsafe.so[1635]: Terminating /home/izar/foo. Jun 25 12:26:27 milfalcon libsafe.so[1635]: uid=501 euid=501 pid=1635 Jun 25 12:26:27 milfalcon libsafe.so[1635]: Call stack: Jun 25 12:26:27 milfalcon libsafe.so[1635]: 0x400175d5 Jun 25 12:26:27 milfalcon libsafe.so[1635]: 0x4001770f Jun 25 12:26:27 milfalcon libsafe.so[1635]: 0x8048410 Jun 25 12:26:27 milfalcon libsafe.so[1635]: 0x804842e Jun 25 12:26:27 milfalcon libsafe.so[1635]: 0x4004b27b Jun 25 12:26:27 milfalcon libsafe.so[1635]: Overflow caused by strcpy() izar@milfalcon ~ > gcc -g -o foo foo.c izar@milfalcon ~ > setenv LD_PRELOAD libefence.so.0.0 izar@milfalcon ~ > gdb ./foo Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens <[email protected]> GNU gdb 5.1.1 Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type “show copying” to see the conditions. There is absolutely no warranty for GDB. Type “show warranty” for details. This GDB was configured as “i386-mandrake-linux”... (gdb) Na primeira linha da execução do gdb pode-se ver a mensagem “ElectricFence 2.2.0...”, indicando que a biblioteca foi incluida com exito. Se isto nao for suficiente, é possivel recompilar a libsafe com a opção de enviar email com a notificação do problema cada vez que este ocorrer. A documentação da biblioteca tem todos os detalhes necessários. Libsafe pode ser encontrada em: http://www.research.avayalabs.com/project/ libsafe/index.html. www.linuxsecurity.com.br (gdb) run Starting program: /home/izar/foo [New Thread 1024 (LWP 3744)] 35 Antes da execução do programa, podemos utilizar as variáveis de ambiente EF_PROTECT_FREE e pedir que o efence gere uma exceção no caso de acesso a memória previamente retornada ao sistema. Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens <[email protected]> Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 1024 (LWP 3744)] 0x400b4869 in strcpy () from /lib/libc.so.6 Modificando mais uma vez nosso foo.c: Aqui pode-se ver o efence avisando onde o erro ocorreu.Sem o efence, a mensagem seria: char * foo(char *bar) { char *baz = (char *)malloc(10*sizeof(char)); (gdb) run Starting program: /home/izar/foo strcpy(baz,bar); return baz; } Program exited with code 0110. (gdb) main() { char *ptr = foo(“abcdefghi”); free(ptr); strcat(ptr,”foo”); O programa nem mesmo apresenta o erro! Para falar a verdade, tive de dar uma “ajeitada” no programa para que o efence soubesse lidar com ele. A linha char baz[10] foi modificada para char baz=(char )malloc(sizeof(char)*10)); para que o efence pudesse interceptar a alocacao de memória! Caso contrário, o erro não teria sido encontrado. Isso é facilmente explicado apos examinar a construção das duas soluções: libsafe faz um sobrecarregamento das funções problemáticas, enquanto o efence é focado no uso de malloc. Na minha opinião, a melhor solução seria um trabalho conjunto com as duas soluções. Alguns outros erros comuns são a tentativa de se acessar memória que foi previamente retornada ao sistema (programadores C, memória que allocada com malloc, é retornada com free; programadores C++, memoria inicializada com new, é retornada com delete) e a escrita para um ponteiro que contenha zero. Enquanto a leitura da locação zero é legal, porém indefinida, a escrita gera uma exceção na unidade de processamento de memória, normalmente parando o program com um segmentation fault. No primeiro caso, o desempenho do efence é mais acentuado. www.linuxsecurity.com.br } Uma vez compilado e rodado o programa sem efence, nada deve ocorrer. Porém, se compilarmos com efence, e setarmos a variável EF_PROTECT_FREE para 1, veremos: (gdb) run Starting program: /home/izar/./foo [New Thread 1024 (LWP 3945)] Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens <[email protected]> Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 1024 (LWP 3945)] 0x400b3893 in strcat () from /lib/libc.so.6 O problema em strcat foi achado e assinalado para correção. Da mesma maneira, pode-se utilizar EF_PROTECT_BELLOW para assinalar problemas de buffer underrun, quando a memória for acessada abaixo do espaço reservado, EF_ALLOW_MALLOC_0, para deixar 36 de assinalar a chamada de malloc com zero como argumento, e EF_FILL, que preenche a memória alocada com o valor da variável, com o intuito de interceptar a leitura de memória não inicializada. “ rodar o programa, tanto sob debugger como livre “testar o programa para uso de variáveis não-inicializadas “testar o programa para uso de ponteiros com valor zero “ testar o programa para vazamentos de memória (memória alocada não retornada ao sistema) Existe um pequeno problema de conflito entre o alinhamento de memória usado por malloc e a maneira como o efence acha erros. Para um tratamento mais detalhado deste problema, indico ao leitor a página manual do efence (‘man efence’). Em conclusão, o conceito de debugging do uso de memória como um dos passos finais antes de considerar o projeto “acabado” deve ser visto como imprescindível. A metodologia a ser utilizada é bastante simples. Este é um exemplo não exaustivo, e ainda há mais testes a serem incorporados: Neste artigo não abordamos o fator de vazamento de memória, já que o mesmo é mais um problema de performance do que de segurança, porém a mesma classe de ferramentas aqui apresentada pode ser usada para encontrar problemas do tipo. Por exemplo, a ferramenta memprof pode ser muito útil neste caso. “Black-box testing (não-intrusivo) “fazer o “teste do gorila” - jogar lixo como entrada não estruturada para o programa, e ver como se comporta “ mapear todas as possíveis entradas de dados do programa (linha de comando, network, pipes, dados vindos de outros programas) “ prover a entrada estruturada, porém utilizando tamanhos variáveis e exagerados de campos, enquanto o programa roda sob um debugger de uso de memória “checar que a saída do programa não seja “suja”, caso esta seja utilizada como entrada em algum outro programa Em caso de dúvidas, reclamações e caixas de garrafas de cerveja, meu email está a disposição. Alguns ponteiros para mais ferramentas que tratam de uso de memoria: “gcc com checagem de memoria http://web.inter.nl.net/hcc/Haj.Ten.Brugge/ “FDA - http://packages.debian.org/unstable/ devel/fda.html “NJAMD - http://fscked.org/proj/njamd.shtml “White-box testing (intrusivo) “recompilar o programa com uma biblioteca com checagem de erros de memória www.linuxsecurity.com.br 37 www.linuxsecurity.com.br 38 ARTIGO Sumário FingerPrint FingerPrint - Explorando a pilha TCP/IP (versão 1.0) T raduzindo mais ao pé da letra fingerprint seria a impressão digital, literalmente o polegar na tinta, mas no mundo underground essa expressão tem um valor especial. Seria a exploração da pilha TCP/ IP para definir o S.O. de um respectivo host. Sendo notório essa identificação para o invasor ter sucesso na utilização de um respectivo exploit, sendo que o invasor tem em mente que ao ter em mãos um exploit funcional para um serviço de um respectivo sistema operacional ele terá uma única oportunidade que poderá lhe permitir “rootiar” a máquina, dessa forma uma investida falha poderá tirar o serviço do ar e/ou ainda chamar atenção do administrador. com SNMP habilitado e configurado de forma padrão com “comunidade publica” e utilizando ferramentas como snmpwalk ou até o languard. Outra forma clássica de FingerPrint é a manipulação de datagrama ICMP, um exemplo dessa técnica é a resposta de icmp tipo 8 (echo request), cujo padrão é icmp tipo 0 (echo replay), em que a partir do valor do campo TTL da resposta é possível, em muitos casos, determinar o sistema operacional da máquina, pois mesmo seguindo RFCs, muitos fabricantes acabam criando particularidades na implementação da pilha TCP/IP de seu sistema, devido a não definição específica para certos padrões de resposta. Dessa forma tem-se um novo cenário interessante, onde com um inocente ping, o invasor pode executar um FingerPrint. Veja na tabela abaixo alguns exemplos: Todavia, de forma generalizada, podemos englobar qualquer técnica que defina o sistema operacional como um FingerPrint, dessa forma podemos começar aentender essa técnica e seu objetivo através de um exemplo básico que é a artimanha trivial de leitura de banners, em que por exemplo através do comando comumente conhecido como telnet, o invasor faz uma conexão para uma dada porta de serviço, digitando um comando específico ou uma seqüência de caratecteres sem sentido para provocar um erro e retornar o banner ou informações que possam ser analisadas. Sistemas que retornam valor 30 para ICMP tipo 8 - Roteador Cyclades PR2000 - Switches (3 Com) Sistemas que retornam valor 32 para ICMP tipo 8 - Windows 95 (primeira versão) Sistemas que retornam valor 60 para ICMP tipo 8 - Impressoras HP (JetDirect / LaserJet ) Uma outra possibilidade de um invasor obter não só o FingerPrint mas também em muito casos o footprint sem muito esforço é através de servidores www.linuxsecurity.com.br Sistemas que retornam valor 64 para ICMP tipo 8 - Compaq Tru64 V5.0 39 a manipulação tanto de datagramas UDP como TCP para esse fim, sendo que as possibilidades são maiores para esse último devido as particularidades das pilhas TCP/IP de cada sistema, assim os crackers buscam identificar essas diferenças entre os sistemas operacionais organizando-as em tabelas com cada respectivo perfil (assinatura de comportamento) para desenvolvimentos de programas de sondagem (scanners) que sejam capazes de enviar uma seqüência de pacotes pré-definida a um host e a partir da resposta, cruzar com as informações da tabela de assinaturas e aí sim identificar o sistema operacional ou ainda simplesmente atuar como um farejador (sniffer) de pacotes. Essa lógica é a base dos scanners de Fingerprint. - Linux Kernel 2.0.x Sistemas que retornam valor 128 para ICMP tipo 8 - Windows 95 (segunda versão) - Windows 98 - Windows 98 SE - Windows ME - Windows NT 4 Workstations SP 3 - Windows NT 4 Workstations SP 6a - Windows NT Server SP4 - Windows 2000 Profissional - Windows 2000 Server - Windows XP - Novell Netware 3.12 / 5.0 / 5.1 SP1 Sistemas que retornam valor 255 para ICMP tipo 8 - FreeBSD 3.4 / 4.0 - OpenBSD 2.6 / 2.7 / 2.8 / 2.9 / 3.0 / 3.1 - NetBSD - BSDi - Solais 2.5.1 / 2.6 / 2.7 / 2.8 - HP-UX - IRIX - AIX - ULTRIX - OpenVMS v7.1-2 Esses programas de fingerprinting podem ser divididos de forma didática em três categorias de acordo com a técnica utilizada. Passive OS Fingerprint: seriam programas de sondagem que ao invés de enviar uma seqüência de pacotes atuam com sniffers capturando pacotes de redes e, a partir da estrutura dos datagramas, definem o sistema operacional da máquina que os está enviando. Bons exemplos de programas de FingerPrint que usam essa técnica são: p0f e o Ettercap (escrito por 2 programados da Universidade de Milão,um verdadeiro canivete suíço na mão de um insider). Conhecendo essa tabela bastar fazer um traceroute ou usar o mtr, observar o número de saltos, somar e chegar no valor da TTL correspondente. Aticve OS Fingerprint: São scanners de fingerprint que analisam as respostas de um respectivo host para pacotes por ele manipulados e enviados, sendo capazes de definir o Sistema Operacional do host alvo, cruzando os dados com sua tabela de fingerprint. Bons exemplos são o QUESO (sua base é o arquivo queso.conf) e o nmap (sua base é o arquivo nmap-os-fingerprints). Deamon OS Fingerprint: Seriam “Acitves OS FingerPrints” que são desenvolvidos para explorar diretamente um serviço, um bom exemplo seria o “telnetfp” desenvolvido pelo TESOTeam que é capaz de fazer um fingerprint a partir de um servidor telnet. A partir desse exemplo podemos assumir uma política bem restritiva a respostas ICMP, exemplo disso é que muitos Firewalls são configurados para não responderem a nenhuma solicitação ICMP exceto das definidas pelo administrador. Partindo do pré-suposto que um alvo pode ser facilmente atingido a partir do momento em que é localizado, fica muito mais difícil acertar em algo que não se vê ou que não se possa alcançar. Mas tudo o que foi mencionado até agora são técnicas simples embora sagazes, mas o FingerPrint vai além disso, pois ainda é possível www.linuxsecurity.com.br 40 As técnicas são muitas, entretanto, vamos destacar as mais utilizadas: fingerprint mais inteligentes são capazes de utilizarem esse valor de um datagrama , pois alguns possuem um valor especifico como o AIX, todavia existem outros com valores similares como por exemplo a implementação da pilha TCP/IP da Microsoft que possui o mesmo valor do FreeBSD e OPenBSD. Como bons exemplos podemos citar QUESO e o NMAP. Investigação de FIN (FIN Probe) -Técnica interessante que consiste no envio de um flood de pacotes FIN para um host. Implementações que seguem a RFC 793 detornam RST para portas fechadas e demais devem ignorar os pacotes, mas existem implementações da pilha TCP/IP na família Microsoft Windows, com exceção da primeira série da versão win/95, que respondem com RST nas duas situações. Um dado interessante dessa técnica é ser base das varreduras de serviço “Nulas (pacotes TCP sem flags ativos), Arvore de Natal (pacotes TCP com flags FIN/URG/PSH ativos) e FIN”. Exemplos de exploração de FingerPrint com Nmap: # nmap -o ip.ip.ip.ip # nmap -O -p 119 -P0 ip.ip.ip.ip # nmap -sS -O -p21,80 -P0 -v ip.ip.ip.ip Investigação FALSA (BOGUS flag) Obs.: Quando ocorrer de não haver a identificação ainda é possível forçar com o parâmetro “- - osscan_guess” - Técnica bem conhecida pois foi implementada no QUESO. Consiste em enviar um datagrama TCP com flag de valor (64 ou 128) no cabeçalho de um pacote TCP de inicio de conexão (bit SYN ativo), a maioria dos sistemas operacionais retornam um pacote RST. # nmap -sS -P0 - - osscan_guess -p 110 ip.ip.ip.ip Como o Nmap realiza o fingerprint ? Padrão TCP de ISN (TCP ISN Sampling) O arquivo nmap-os-fingerprint tem assinaturas de vários sistemas operacionais. Esse arquivo é continuamente incrementado com contribuições de vários profissionais do mundo Livre, pois quando é executado um Fingerprint e a assinatura do host não corresponde a nenhuma do registro no arquivo nmap-os-fingerprint, o nmap faz a saída na tela da respectiva assinatura, dessa forma um usuário pode encaminhar essa nova assinatura uma vez que ele saiba qual o sistema que não fora identificado pela ferramenta para o email do principal desenvolvedor do nmap: [email protected] ou submeter a informação direto no site do nmap http://www.insecure.org/cgi-bin/nmap-submit.cgi - Essa técnica, como o próprio nome já diz, tem como objetivo identificar o sistema operacional a partir do modo como eles elaboram o Número Inicial de Seqüência, pois sistemas como Solaris, IRIX, FreeBSD, usam um padrão de incrementação randômica, e o sistema Windows usa um outro modelo que esta vinculado ao horário. Antigos modelos usados em Unix baseados em 64k eram famosos por serem fáceis de burlar. Janela Deslizante inicial do TCP (TCP Initial Windows) - Técnica que trabalha com a informação do tamanho da janela de um pacote. Scanners de www.linuxsecurity.com.br 41 Assinatura ? T4(DF=N%W=0%ACK=S%Flags=R%Ops=) T5(DF=N%W=0%ACK=S%Flags=AR%Ops=) T6(DF=N%W=0%ACK=S%Flags=R%Ops=) T7(DF=N%W=0%ACK=S++%Flags=AR%Ops=) PU(Resp=N) Se fomos considerar o nmap-os-fingerprint como uma base de dados, podemos considerar cada assinatura um registro, dessa forma seria correto falar que cada assinatura é composta por nove campos descrito a seguir: - Tseq is the TCP sequenceability test Contramedidas - T1 is a SYN packet with a bunch of TCP options to open port Eliminar todos os banners ou simplesmente alterá-los para evitar facilitar a atividade de curiosos. Ter políticas restritivas quanto à resposta ICMP de sua LAN ou Rede Periférica para Internet, em alguns caso simplesmente negar qualquer possibilidade. Uma dica interessante é que podemos manipular no Linux o arquivo “ip_default_ttl” cujo valor original é 64. Mudamos para 35, isso já deixa o nmap cego pois essa informação vai gerar uma resposta que não corresponde com a base de dados de assinatura do nmap. Sabemos que quando a exploração é feita por scanners mais arrojados como o Nmap a contramedida tem que ser engenhosa, à altura, uma solução é o IP Personality , um projeto muito interessante de path de kernel (família 2.4) que permite habilitar diferentes “personalidades” para a pilha TCP/IP do Linux, há mas se eu estiver usando windows? Não conheço nenhuma solução além de você migrar para Linux >;-). O primeiro objetivo desse projeto é justamente ser uma contramedida para a forma como o nmap realiza o FingerPrint O segredo é o uso do próprio veneno pois a simulação usa justamente a informação da assinaturas da base do nmap, o arquivo nmap-os-fingerprint. - T2 is a NULL packet w/options to open port –T3 is a SYN|FIN|URG|PSH packet w/options to open port - T4 is an ACK to open port w/options - T5 is a SYN to closed port w/options - T6 is an ACK to closed port w/options - T7 is a FIN|PSH|URG to a closed port w/ options - PU is a UDP packet to a closed port Através desses campos são estruturadas a respectivas assinaturas, não somente de Sistemas operacionais como também de equipamentos específicos como switches e roteadores. Veja abaixo um exemplo de assinatura que corresponde ao sistema operacional AtheOS. # Contributed by “Steven Lawrance” <[email protected]> Fingerprint AtheOS ( www.atheos.cx ) TSeq(Class=RI%gcd=<8%SI=<A78&>6) T1(DF=N%W=3FF0%ACK=S++%Flags=AS%Ops=M) T2(Resp=N) T3(Resp=Y%DF=N%W=3FF0%ACK=S++%Flags=AS%Ops=M) www.linuxsecurity.com.br 42 Feito essa etapa estaremos definindo o cenário para o IP Personality ser suportado, mas ainda dependemos do Iptables e o recurso da tabela šmangleš. Instalando o IP Personality Patch Baixe o path correspondente para a versão de seu kernel, nesse documento estarei exemplificando para o Redhat 7.2, cujo Kernel é o 2.4.7. Como esse modulo irá ser manipulado com uma “propriedade” especifica do IPtables, também será necessário ter o mesmo na máquina. Para o a versão destinada ao Kernel 2.4.7 utilize o iptables 1.2.2 ou superior. Uma vez que seu sistema esteja atendendo os pré requisitos, podemos passar para a instalação do path de kernel: 3) Aplicando o patch iptables: $ cd iptables-1.2.2/ $ patch -p1 < o patch ( que acompanha o pacote do IP Personality) 4) Compilando o iptables: 1) Patch do kernel: # make Vá para o diretório do fonte do código fonte de seu kernel: 5) Carregando o novo modulo gerado ppara o iptables ipt_PERS.o: # cd /usr/src/linux # patch -p1 < path (pacote do Ippersonality) # insmod ipt_PERS 6) Escrevendo as políticas para tabela “mangle” como o uso da target PERS: 2) Compile seu Kernel: Durante a etapa de configuração (make config) será necessário habilitar em seu kernel o suporte a Iptables com a nova opção adicionada pelo path aplicado: —tweak {src|dst}: define a ação se será para destino ou origem —local: referindo-se que o pacote é para máquina local necessário para decoy (isca). IP Personality Support (EXPERIMENTAL) —conf <file>: define o arquivo de configuração com a assinatura do respectivo sistema operacional Editando o arquivo de configuração do kernel: CONFIG_IP_NF_PERS=y Vide exemplo: Caso você deseje que o IP Personality seja suportado como modulo pelo kernel. CONFIG_IP_NF_PERS=m Imagine o cenário onde duas máquinas A e B, separadas por uma máquina linux funcionando com o roteado. Toda resposta com destino a maquina será emulado o perfil de resposta de um sistema AmigaOS. Você pode utilizar ainda o “make menuconfig” indo em “Network options/IP: Netfilter configuration/IP Personality Support (experimental)” # iptables -t mangle -A PREROUTING - Compile seu kernel e habilite em seu bootload para suporte do mesmo. www.linuxsecurity.com.br s B -d A -j PERS —tweak src —conf 43 Bibliografia amigaos.conf # iptables -t mangle -A PREROUTING -s A -d B -j PERS —tweak dst —conf amigaos.conf sites: http://ippersonality.sourceforge.net http://www.insecure.org http://www.sys-security.com http://www.absoluta.org Agora todo pacote de origem local com destino a maquina B terá emulado o perfil de resposta do sistema operacional Win9x, o que com certeza não é uma boa idéia pois será motivação para tentativas de ataques DOS ! Livros: Hackers Expostos Segurança Nacional Desvendando TCP/IP # iptables -t mangle -A PREROUTING -s B -d router -j PERS —tweak dst — local —conf win9x.conf # iptables -t mangle -A OUTPUT -s router -d B -j PERS —tweak src —local — conf win9x.conf FICHA do AUTOR Para finalizar a configuração é necessário incrementar o arquivo šip_conntrack_Maxš com um valor especifico de 20480 # echo 20480 > /proc/sys/net/ipv4/ip_conntrack_max Nome: Sandro Mello e-mail: [email protected] IMPORTANTE: Para você efetuar seus testes o interessante seria usar o nmap a partir de outro host ou a até o osdet que é um versão modificada justamente para testar o IP Personality. Atuante na área de TI desde de 1991 adquirindo ampla visão das necessidades e peculiaridades deste setor. Atualmente é Chief Security Office (CSO) da 4Linux, desenvolvendo projetos de Redes e Segurança utilizando Software Livre, sendo responsável também por projetos de Ensino a Distancia na mesma. Formado em Tecnologia de Processamento de Dados pelo Mackenzie onde também fez Pós Graduação em Analise de Sistemas. Atualmente aluno do curso de Mestrado em Engenharia de Redes no IPT/USP, “Membro do ADC (Apple Developer Connection)” e do GUSoftware Livre da Sucesu São Paulo. Esse documento é apenas um resumo, é extremamente válida a visita ao site do projeto http:/ /ippersonality.sourceforge.net. Bem, finalizo aqui esse artigo, só me resta agradecer ao Renato Murilo essa oportunidade de compartilhar meus conhecimentos. Palestrante assíduo em vários eventos acadêmicos e corporativos, como Comdex - SP, Semana Paraense de Informática - Sepai (Pa), Forum Internacional de Software Livre - RS, Workshop de Informática do Instituto Bennett - RJ entre tantos outros de igual importância. QUE A FORÇA ESTEJA CONOSCO !!! Colaborador de matérias para revistas e jornais como: PcMaster, Diário de São Paulo e Digital.Net e agora LinuxSecurity Magazine. www.linuxsecurity.com.br 44 ARTIGO Sumário Introdução Introdução àà Análise Análise Forense Forense -- Parte Parte 11 Introdução à Análise Forense - Parte 1 E ste é o primeiro de uma série de artigos em que serão introduzidos os conceitos básicos de análise forense no âmbito dos sistemas computacionais. O objetivo é acompanhar passo a passo as etapas do processo, permitindo aos leitores se profundarem posteriormente se lhes for interessante. No mínimo, pretendemos dotar os administradores de rede do conhecimento necessário para gerar e preservar as informações que são o substrato do trabalho do analista forense. No evento de uma invasão, mesmo não sentindo-se preparado para realizar ele mesmo a análise, saberá como proceder para não dificultar o trabalho futuro do analista, que poderá ser um colega com mais conhecimento ou até mesmo um profissional contratado no mercado. nicas necessárias. Este é o contexto da análise forense, que pode ser definida como: Análise Forense em Sistemas Computacionais é o processo de coleta, recuperação, análise e correlacionamento de dados que visa, dentro do possível, reconstruir o curso das ações e recriar cenários completos e fidedignos. Preparando-se para a invasão As técnicas descritas poderão ser utilizadas em qualquer sistema, porém alguns cuidados prévios permitem gerar e garantir a consistência de uma variedade maior de informações para a análise. O trabalho de análise, que é a parte mais trabalhosa do processo, constitui-se principalmente do correlacionamento de dados, portanto quanto mais redundantes forem os dados mais fácil se torna a Neste primeiro artigo ainda não abordaremos o processo de análise em si. Pretendemos ilustrar como algumas medidas simples, e outras nem tanto, podem aumentar e muito a quantidade e a qualidade dos dados a respeito do seu sistema. Ilustraremos ainda qual o procedimento adequado ao se deparar com um sistema que se suspeita de comprometimento. FICHA do AUTOR A complexidade crescente dos sistemas computacionais, integrando um grande número de novas tecnologias, sistemas legados com novas implementações, interligação dos ambientes de rede e softwares com um número cada vez maior de linhas de código, é algo que cria o ambiente propício para o surgimento de brechas de segurança. Por mais capacitada e dedicada que seja a equipe de segurança de uma empresa há sempre o risco do comprometimento. Neste contexto é fundamental para a continuidade dos negócios uma política de recuperação de desastres. Além disso, em um eventual incidente, é desejável a capacidade de levantar os acontecimentos de forma a permitir que sejam tomadas as medidas jurídicas, administrativas e técwww.linuxsecurity.com.br Nome Completo: Leonardo Alcântara Moreira Idade: 29 anos Profissão: Engenheiro de Computação Empresa: Montreal Informática Analista de Projetos E-mail: <[email protected]> 45 chegada a uma conclusão e maior é o grau de confiabilidade desta. Em seguida iremos inumerar algumas técnicas e ferramentas úteis no processo: HIDS no estado do sistema e arquivos de log. A possibilidade de detecção rápida de um ataque bem sucedido facilita o trabalho de levantamento. Quanto menos tempo o sistema estiver sob o controle alheio menor será o seu comprometimento e mais claras estarão “as pegadas” do intruso. Por fim, os dados reportados pelo IDS podem dar indícios ao analista à respeito do modo de operação do invasor, servindo para orientar sua análise e corroborar suas hipóteses. A utilidade dos dados do IDS dependem, no entanto, da sua integridade, que pode estar afetada caso estes estejam gravados na própria estação como alguns IDS de host fazem por default. Caixa de ferramentas do analista Em um sistema comprometido tudo pode ter sido alterado. Os arquivos de log, os binários do sistema, e até mesmo o kernel, através do uso cada vez mais comum dos LKM. O analista precisa ter à mão versões confiáveis dos utilitários do sistema e das ferramentas extras que irá utilizar no processo de coleta. Os binários devem ter sido previamente compilados, em um sistema asseguradamente limpo, com ligação estática. As bibliotecas de ligação dinâmica do servidor comprometido também podem ter sido alteradas. A utilização de cd-rom ou disquete dependerá principalmente da disponibilidade dos dispositivos leitores correspondentes. É preferível utilizar um cd-rom com os binários e um disquete para a gravação da saída dos utilitários. Se os binários estiverem contidos em um disquete é recomendado que este seja protegido contra a gravação. O conhecimento prévio e a prática com estas ferramentas é de grande relevância. Algumas possuem sintaxes obscuras e geram saídas pouco amigáveis aos leigos. Dada a volatilidade das informações o aprendizado na prática pode atrapalhar o sucesso da empreitada. Cópias de Segurança ou Backup Peça fundamental na recuperação de um desastre, um sistema de backup bem organizado também pode ser bastante útil no processo de análise. A comparação dos arquivos antes e depois ajuda a montar o quebra-cabeça onde algumas peças foram perdidas, ou seja, setores do disco foram sobrescritos. Preservação de Logs Uma coisa pouco comum exceto nos sistemas de alta segurança é o cuidado de arquivar os logs fora dos servidores, de preferência fora da rede. Comprometer um host e alterar seus logs para apagar rastros é muito mais fácil que comprometer dois hosts que disponibilizam serviços diferentes e portanto talvez não apresentam provavelmente a mesma vulnerabilidade. Melhor ainda se o segundo servidor nem mesmo em rede estiver. A solução pode se apresentar como um servidor de logs centralizado para o qual todos os servidores redirecionam seus arquivos de log, ou cópias destes. Pode-se acrescentar requintes para dificultar o comprometimento deste servidor central. Este pode estar protegido por um outro firewall, ou de outra forma. Sistemas de detecção de intrusão. Sem nos aprofundarmos muito em detalhes técnicos, há basicamente dois tipos de sistemas de detecção de intrusão, ou IDS: os baseados em rede (NIDS) e os baseados em host(HIDS). Ambos fundamentam-se na análise do comportamento do ambiente monitorado, detectando anomalias ou assinaturas características de ataques ou funcionamento inadequado, diferenciando-se apenas no escopo de seu monitoramento. Os NIDS utilizam o tráfego em um segmento de rede e os www.linuxsecurity.com.br 46 backup. RESISTA !!! Mais que isso... saia da frente do teclado, dê uma volta no corredor, tome um copo d’água. Certifique-se que está calmo e sob controle antes de voltar à “cena do crime”, lembre-se que qualquer interação com o sistema vai alterá-lo e pode sumir com dados importantes. A velocidade é importante, mas cada passo a partir de então deve ser pensado. Lembre-se que é pouco provável que o invasor esteja realizando alguma atividade danosa exatamente naquele momento. Boa parte dos invasores quer manter sua discrição enquanto explora os recursos do seu sistema ou o utiliza como base de lançamento para outras invasões, logo estes evitarão modificar seu sistema mais que o necessário. Os invasores que possuem instinto destrutivo provavelmente já terão conseguido causar muito dano antes que você os note. Um rm * não demora mais que alguns minutos. Logo o pânico não ajudará em nada. Também pode ser utilizada a porta serial ou paralela do computador para enviar os dados para o servidor de logs. Não é difícil implementar esta solução de forma a permitir o envio de dados utilizando um driver tão simples que não oferece recursos para uma invasão. Outra opção é a utilização de ferramentas impedindo a modificação do conteúdo dos logs, permitindo apenas a inclusão de novos eventos.Temos por exemplo no caso do Linux o LIDS. Devemos lembrar no entanto que não há garantias que esta ferramenta ou outras porções do kernel não contenham bugs que permitam a alguém driblar seus controles. Independente da utilização de qualquer uma destas soluções ou de qualquer outra que siga as mesmas linhas, o importante é tentar preservar ao máximo a integridade dos arquivos de log do sistema. O grande foco deve ser sempre a preservação dos dados. E esta depende de onde estão armazenados. Existe uma tabela que ilustra a sua volatilidade : Integridade de Arquivos A utilização de um utilitário de verificação de integridade, por exemplo o Tripwire, permite identificar arquivos alterados, complementando as informações levantadas através dos MAC times Registradores, memória cache Memória Estado da Rede Processos Disco Rígido Disquetes, Zips, Fitas Cd-rom, dados impressos A invasão Um belo dia acontece. Uma ferramenta do IDS alarda. Um usuário reclama de algum dado seu alterado. O administrador encontra um arquivo estranho em um diretório do sistema. O sistema se comporta de forma inexplicável... De repente algum indício leva o administrador a procurar por outros e em minutos fica claro que o seu sistema foi invadido. E agora ? O primeiro impulso é muito forte: reinicializar a máquina, reinstalar tudo, voltar www.linuxsecurity.com.br Toda operação realizada em um computador ou até mesmo o seu funcionamento normal executando as tarefas de sistema causa a modificação do seu estado. Desta forma o procedimento deve sempre procurar salvar primeiro os dados mais voláteis. 47 A coleta O processo de coleta é relativamente simples e não requer nenhum grande esforco além da atenção para evitar que se danifiquem dados importantes. Ainda assim é impossível a reconstrução perfeita de todo o cenário. O primeiro passo é colocar seu cd-rom de ferramentas e um disquete em branco e coletar as informações sobre a memória, estado da rede para arquivos no disquete. Assim quem sabe com muita sorte você pode até surpreender uma conexão do atacante ou algum backdoor. Não analise nada ainda, não perca tempo e nem o foco. Tenha disponivel um bloco de notas e documente tudo que achar importante. Terminado este processo você deverá ter em mãos todas as evidências, ainda em um estado muito cru, que serão utilizadas. A partir deste ponto o processo é idêntico ao de uma investigação criminal comum. Isole a área adequadamente. Para isso retire o cabo de rede, notifique outros usuários que possam utilizar o console da máquina. Se precisar se ausentar coloque um aviso sobre o teclado. No próximo artigo continuaremos analisando a utilização de algumas ferramentas que podem compor um kit básico. A idéia é levantar o estado do sistema antes da reinicialização, pois boa parte destas informações serão perdidas. É importante utilizar sempre um disquete para redirecionar a saída ou copiar os dados que interessam direto da tela para o papel. Não escreva de forma nenhuma no próprio disco rígido!!! Os blocos livres podem conter informações de arquivos apagados. 1 Loadable Kernel Modules. Módulos do kernel que podem ser carregados sob demanda quando associados a algum recurso, ou através de utilitários de administração. Estes módulos permitem gerar um kernel mais compacto e flexível. 2 Intrusion Detection Systems. 3 Network Intrusion Detection Systems. 4 Host-based Intrusion Detection Systems. 5 Linux Intrusion Detection System. Patch para o kernel do Linux que permite o controle de acesso a recursos através de Access Control Lists. Este módulo vem ainda com um port scanner embutido. http://www.lids.org 6 Tripwire É uma ferramenta que verifica a integridade de arquivos através da comparação de informações sobre os arquivos, tais como atributos, assinaturas binárias, tamanho, etc. http://www.tripwire.org 7 Registros de datas de criação, alteração e acesso em um sistema de arquivos. Não exagere, recolha só as informações essenciais. Cada comando que você utiliza tem o potencial de destruir mais dados. Então evite trabalhar no sistema original. Agora pode bootar a máquina. Retire o disco rígido, coloque-o em outra máquina e faça uma cópia da imagem de cada sistema de arquivos. Copie os dados, byte a byte, para um arquivo dentro de um sistema de arquivos maior ou faça a cópia física para outro disco rígido de capacidade igual . Agora você tem imagens nas quais poderá trabalhar, sem o risco de perder seu original. Se possível crie um hash destas imagens para que você possa verificar a qualquer momento a sua integridade. www.linuxsecurity.com.br 48 ARTIGO Sumário TrustedBSD - A Missão... TrustedBSD - Parte I - Introdução O projeto TrustedBSD foi criado com o objetivo de adicionar uma série de extensões de segurança ao sistema operacional FreeBSD, tanto no nível do kernel quanto no nível das aplicações, visando tornálo um sistema compatível com o nível de segurança B1 segundo os critérios do NCSC (U.S. National Computer Security Center). Um sistema pode ser classificado em 4 níveis de segurança, variando de D a A1, sendo que o D é definido como sendo o nível de segurança mínima, a classificação de um sistema depende do comportamento do mesmo perante o teste (TCSEC) de avaliação aplicado pelo departamento de defesa norte americano (DoD). A classificação atual do FreeBSD é C2. estabilidade e performance do sistema. Para que muitas das novas features de segurança pudessem ser implementadas, foi necessária a criação de uma API específica, que possibilita a associação de metadados adicionais a um arquivo ou diretório. Esses metadados receberam o nome de EA (Extended Attributes), e é através deles que o conceito de ACLs foi implementado. Dentre as extensões do TrustedBSD que serão disponibilizadas na versão 5.0 do FreeBSD, merecem destaque as seguintes: Trust Management Apesar de obtermos um sistema relativamente seguro numa instalação padrão do FreeBSD, existem uma serie de ajustes de configuração que podem ser executados para s e melhorar o nível de segurança do servidor, tais como desabilitar serviços desnecessários, setar flags especiais nas partições, etc. Esta extensão visa realizar todos esses ajustes de forma automática, minimizando a possibilidade É importante lembrar que o TrustedBSD é um projeto que ainda está em andamento, sendo que a maioria das extensões só estarão disponíveis a partir da versão 5.0 do FreeBSD. A adição das novas funcionalidades propostas pelo TrustedBSD implica uma grande alteração na implementação do subsistema de segurança do FreeBSD, motivo pelo qual elas estão sendo incorporadas gradualmente ao branch -Current a medida em que se tornam estáveis, sendo estes cuidados necessários para evitar que as alterações afetem a funcionalidade, www.linuxsecurity.com.br 49 de que o administrador cometa erros durante o processo. Continuarei com informações mais específicas no próximo número da LinuxSecurity Magazine. Fine-grained System Capabilities Normalmente num sistema UNIX, todos os direitos e privilégios são atribuídos ao usuário “root”, esta extensão visa retirar do mesmo parte desses super poderes e colocá-los sob o controle direto do sistema operacional. Access Control Lists Listas de controle de acesso (ACLs), permitem aos usuários definir permissões de acesso mais detalhadas para os seus arquivos e diretorios, não ficando restritas aos conceitos tradicionais de usuário/grupo. FICHA do AUTOR Security Event Auditing Normalmente um sistema UNIX só loga registros de autenticação e de situações de erro, comportamento que pode dificultar em muito um processo de auditoria de segurança. Esta extensão visa proporcionar o registro de eventos independente de estarem ou não associados a eventos anormais. Nome Completo: Edson Brandi, Idade: 25 anos, Profissão: Bacharel em Quimica pela UNICAMP. Trabalha profissionalmente com FreeBSD desde 1995 tendo atuado como consultor junto a varias empresas nos ultimos anos. É um membro ativo da comunidade FreeBSD, sendo o responsavel pelo site “FreeBSD Primeiros Passos” (www.primeirospassos.org), fundador do “Grupo Brasileiro de UsuarioFreeBSD” ( www.fugspbr.org), responsavel pelo projeto “FreeBSD LiveCD” (livecd.sourceforge.net). Atualmente trabalha como Gerente de Tecnologia no iBest (www.ibest.com.br). Mandatory Access Control Esta extensão permite ao administrador definir de forma centralizada e única regras de preservação de privacidade e integridade para todos os objetos do sistema, sobrepondo-se as demais ACLs. São inúmeros os benefícios proporcionados pela adoção das extensões acima, você se interessou pelo assunto e deseja maiores informações sobre o estágio atual de desenvolvimento do TrustedBSD, visite o site do projeto em http:// www.trustedbsd.org www.linuxsecurity.com.br 50 www.linuxsecurity.com.br 51 ARTIGO Sumário Snort vulnerabilidade de uma aplicação; ataques DOS (Deny of Service) , na tentativa de enviar centenas de pacotes de modo que a vítima se afogue. Uma ferramenta de NIDS monitora todos os pacotes enviados a uma interface de rede e, baseando-se em uma série de regras préestipuladas, gera alarmes quando algum desses pacotes conter especificaçõs que o aponte como possível ataque. Para aqueles que gostariam de ler mais sobre NIDS, segue um ótimo FAQ sobre o assunto: http://www.ticm.com/kb/faq/idsfaq.html Introdução A tualmente uma das maiores preocupações do administrador de uma máquina conectada à Internet, seja residencial ou a porta de entrada de uma empresa, é manter a segurança de sua rede interna. A primeira resposta (e na maioria das vezes a única) é configurar um firewall com um conjunto de regras que impeçam o acesso indevido de terceiros. Mas será que podemos prover algum outro mecanismo que n o s alerte sobre tentativas de invasão e scans? É justamente essa resposta que esse artigo tem como objetivo, informar e esclarecer sobre NIDS - Network Intrusion Detection System - que pode ser traduzido como “Sistema de Detecção de Invasão de Redes”. Para isso, usaremos como ferramenta o Snort. (www.snort.org) Snort - Uma ferramenta NIDS Iremos utilizar nesse artigo o Snort, uma ferramenta NIDS open-source bastante popular por sua flexibilidade nas configurações de regras e constante atualização frente às novas ferramentas de invasão (como o fagroute). Snort monitora o tráfego de pacotes em redes IP , realizando análises em tempo real sobre diversos protocolos (nível rede e aplicação) e sobre conteúdo (hexa e ASCII). Outro ponto positivo desse software é o grande número de possibilidades de tratamento dos alertas gerados, que podem ser gravados em log via syslog, armazenados em uma base de dados (MySQL, PostgreSQL,...) , em arquivo XML ou mesmo gerando Traps SNMP que podem ser enviados para um segundo software de Gerência de Redes para auditoria. Atualmente ele é suportado para diversas plataformas Unix e inclusive Windows. Os testes para esse artigo foram feitos utilizando Red Hat 7.3 , kernel 2.4.18-4 , mas seus resultados podem O que é NIDS ? Como citado acima, NIDS é um sistema de configurações e regras que tem como objetivo gerar alertas quando detectar pacotes que possam fazer parte de um possível ataque. Na verdade, as ferramentas hoje disponíveis detectam diversos tipos de situações: scans, afim de verificar quais portas de seu sistema estão abertas ; ataques de compromentimento, na tentativa de obter geralmente uma shell com privilégios de root explorando alguma www.linuxsecurity.com.br 52 Mas aonde instalar? Certo. Sabemos como funciona e que tipo de informação/alertas o snort irá gerar. Mas em que tipo de sistema e/ou localização de uma rede deve-se instalar um NIDS? O snort tem como objetivo analisar o tráfego de uma rede, alertando possíveis tentativas de comprometimento. Justamente por isso, ele deve ser instalado em um ponto de rede que receba todos os pacotes que trafegam entre a rede interna e externa, como em uma DMZ. (ou mesmo na máquina fazendo NAT que repassa os pacotes em uma rede ADSL doméstica, por exemplo :) ser obtidos em praticamente qualquer máquina com seu Unix preferido. Como ele funciona? Vamos supor que estamos tentando verificar tentativas de ataques que exploram o um bug no protocolo SSH1 (SSH CRC32 attack detection code bug - 02/08/2001 - veja em http://www.kb.cert.org/ vuls/id/945216 ) que permite ao atacante ganhar privilégios em certo sistema que esteja rodando o daemon antigo de sshd. Para esse tipo de ataque específico, criamos uma regra (veremos regras de snort a seguir) como a seguinte: alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:”EXPLOIT ssh CRC32 overflow”; flags:A+; content:”|00 01 57 00 00 00 18|”; offset:0; depth:7; content:”|FF FF FF FF 00 00|”; offset:8; depth:14; reference:bugtraq,2347; reference:cve,CVE-2001-0144; classtype:shellcode-detect; sid:1327; rev:2;) Instalando Snort Primeiro vamos satisfazer as dependências do snort e instalar o pacote libpcap, um conjunto de bibliotecas que provê o mecanismo de filtro de pacotes. Para isso, faça o download em www.tcpdump.org, e siga a receita de bolo: (Note que seu sistema já pode ter esse pacote instalado - mas é sempre bom se manter atualizado :) Como root: (su -) Que diabos é isso? tar zxfv libpcap.X.tar.gz cd libpcap.X ./configure make make install Não se preocupe em entender os parâmetros acima por enquanto. O interessante é notar “ content:”|00 01 57 00 00 00 18| “;” . Em termos gerais, isso pode ser chamado de assinatura de um ataque, que aqui se encontra em formato hexadecimal. Quando um pacote chega no sistema rodando Snort, uma análise é feita nos dados e opções do protocolo em questão (TCP,UDP,ICMP, etc) e se ele conter esse trecho , o pacote pode ser o início de um ataque. Note que não necessariamente ele será, já que nossa regra definida acima depende de outros parâmetros (como offset e flags) para gerar corretamente um alerta. www.linuxsecurity.com.br Feito isso, podemos finalmente instalar o pacote que pode ser baixado do site oficial (www.snort.org). A compilação e instalação deve seguir os mesmos passos descritos acima. tar zxfv snort.x.tar.gz cd snort.x ./configure make make install 53 Configurando Snort Agora com tudo instalado, precisamos configurar o ambiente. Opcionalmente, tenho preferência em instalar os arquivos de configuração em um diretório específico, mas se houver necessidade o leitor pode mudar o diretório em questão, mantendo coerência com o resto do texto. Crie o diretório: mkdir /etc/snort Nele vamos armazenar os arquivos de configuração utilizados pelo snort. Como o snort analiza os pacotes de certa interface de rede, vale a pena separar os arquivos de configuração em diretórios diferentes, relativos a cada interface, apenas por organização. Logo, suponha que seu sistema tenha 2 interfaces de rede: eth0 para a rede externa (Internet) e eth1 para a rede interna. É possível que se queira tratar a análise das interfaces diferentemente, já que se trata de subredes diferentes. Crie o diretório da interface: mkdir /etc/snort/eth0 e um diretório geral para os arquivos de regras: mkdir /etc/snort/rules Volte agora para o diretório source do snort, aonde compilamos o pacote, para copiar alguns arquivos de configuração: cd snort.x cp snort.conf /etc/snort/eth0/ cp classification.config /etc/snort/eth0/ cp *.rules /etc/snort/rules/ O diretório dos arquivos de regras (no nosso caso, /etc/snort/rules/) contém diversos arquivos que podem ou não serem utilizados pelo snort durante a execução. Cada arquivo contém www.linuxsecurity.com.br 54 assinaturas de scans/ataques específicos, logo é de extrema importância a atualização desses arquivos, visto que novas técnicas de scan e ataques aparecem regularmente. Para isso, mantenha no seu bookmark o site http:// www.snort.org/dl/signature , aonde novas atualizações das assinaturas são postadas. Mas antes de aprofundar em regras e assinaturas, vamos completar nossa instalação. Quanto menos processos rodando como o usuário root, melhor. Por isso vamos criar um usuário snort (grupo snort): groupadd snort useradd snort -g snort passwd -l snort O último comando garante que o usuário snort esteja disponível somente para o root - e nenhum outro usuário. Agora mudamos as permissões dos arquivos de configuração para que somente o usuário snort tenha acesso. chmod -R 700 /etc/snort/ chown -R snort.snort /etc/snort/ Arquivo de configuração - snort.conf Quando o snort é executado no modo de detecção de intrusos, um dos parâmetros é o arquivo de configuração que contém informações específicas, como interface a ser monitorada, quais regras serão usadas, existência de servidores, etc. O artigo deve cobrir as principais, deixando o leitor se aprofundar no assunto. Vamos editar o arquivo snort.conf , um exemplo de configuração padrão do pacote, muito bem documentada: vi /etc/snort/eth0/snort.conf Procure a linha em que a variável HOME_NET é declarada. Deve ser algo do tipo: A linha significa que o snort irá usar o syslog para gerenciar o output, sendo LOCAL5 a facility e CRIT (crítico) o nível de severidade. Iremos, em breve, editar o arquivo syslog.conf para adicionar uma linha correspondende, indicando o arquivo de log a ser utilizado pelo syslog. Por último, devemos incluir quais regras o snort usará em seu monitoramento. As linhas de “include” fazem justamente isso. Por exemplo, a linha: var HOME_NET $eth0_ADDRESS Com isso estou indicando que o snort deve monitorar o endereço IP da interface eth0. É possível especificar o endereço IP diretamente (ou mais de 1!). Uma alternativa seria: var HOME_NET [10.1.1.0/24,192.168.1.0/24] Outras variáveis, como HTTP_SERVERS, podem ser declaradas e tem como valor padrão a própria variável HOME_NET. Se for seu caso, substitua pelo endereço IP correspondente. Agora setamos a variável que define o diretório que contém as regras: include $RULE_PATH/exploit.rules irá incluir as regras definidas no arquivo /etc/ snort/rules/exploit.rules , responsável pelas assinaturas de certos exploits (programas que tentam explorar certa vulnerabilidade de certo programa, na tentativa de obter uma shell do sistema). Inclua todos os arquivos ou somente aqueles que desejar. Lembre-se que a inclusão de regras também é outro fator para a performance do snort. Muitos arquivos de regras resultam em maior demanda de processamento. Editando syslog.conf Como dito anteriormente, configuramos o snort para gerar logs através do daemon syslog com a linha: output alert_syslog: LOG_LOCAL5 LOG_CRIT. Agora temos que modificar o arquivo de configuração do syslog para que as mudanças tenham efeito. Edite o arquivo /etc/syslog.conf e adicione a seguinte linha: var RULE_PATH /etc/snort/rules O arquivo também contém a declaração de preprocessors, que são pequenos módulos/ plugins que extendem o poder do snort, a um certo custo de processamento. Essa funcionalidade está presente desde a versão 1.5 do snort, abrindo espaço para que os programadores de plantão desenvolva plugins adicionais e acoplem ao snort. Embora a utilização deles possa aumentar as chances de detecção de um ataque, vale a pena lembrar que a adição de plugins adicionais resulta na necessidade de um processamento extra. Como exemplo: preprocessor frag2 # Arquivo log snort local5.crit /var/log/snort/snort.log Isso garante inclusão do plugin frag2, responsável por detectar scans e ataques com fragmentação do pacote IP, utilizado como alternativa de ataque para driblar certos mecanismos de detecção. Como dito no início deste texto, é possível redirecionar os alarmes do snort para diversas saídas e aqui usaremos um arquivo texto, gerenciado pelo syslog para armazenar nossos alarmes: output alert_syslog: LOG_LOCAL5 LOG_CRIT www.linuxsecurity.com.br Nota: há possibilidade que seu arquivo já tenha uma linha tratando a facility local5 (ou *.crit). Se esse for o caso, talvez seja melhor assumir outra facility para tratar os alarmes do snort. Fica por sua conta! Agora criamos o diretório e o arquivo de log: mkdir /var/log/snort/ 55 touch /var/log/snort/snort.log chmod -R 770 /var/log/snort/ chown -R snort.snort /var/log/snort/ chmod 700 /etc/init.d/snort.sh n -s /etc/init.d/snort.sh /etc/rc3.d/S14Snort ln -s /etc/init.d/snort.sh /etc/rc1.d/ K91Snort Agora , com tudo pronto, precisamos reiniciar o syslog. Há diversos modos de fazer isso. Sua distribuição deve conter um script de inicialização em /etc/init.d/syslog , nesse caso: Pronto! O snort está devidamente configurado para iniciar durante o boot, gravando os alarmes em /var/log/snort/snort.log . Se você quiser parar por aqui, já cobrimos o necessário para o funcionamento do snort - agora basta manter a base de assinaturas atualizada, visitando o site www.snort.org de tempos em tempos. Convido aos interessados a continuar a leitura do próximo ítem - Introdução à regras de Snort aonde tentaremos entender como as regras de Snort funcionam, assim podemos escrever nossas próprias regras, aperfeiçoando ainda mais nossa solução. /etc/init.d/syslog restart caso contrário: kill -1 ‘cat /var/run/syslogd.pid‘ Testando a instalação Tudo que precisamos já está configurado e estamos prontos pra um teste. Inicie o snort: Introdução à regras de Snort snort -D -c /etc/snort/eth0/snort.conf -u snort -g snort -b -l /var/log/snort/snort.log Uma solução NIDS só é realmente eficiente se sua base de dados está sempre atualizada, já que novos ataques aparecem todo o dia. Para tornar a explicação mais didática (e provar que realmente funciona :) iremos criar uma regra de snort para a recente vulnerabilidade encontrada no daemon servidor de httpd Apache. De acordo com a cert.org ( http://www.cert.org/advisories/ CA-2002-17.html ) e a Apache Software Foundation http://httpd.apache.org/info/ security_bulletin_20020617.txt existe uma falha na configuração padrão das versões 1.2.2 e superior, 1.3 até 1.3.24, e versões 2.0 até 2.0.36 durante o tratamento de dados codificados em pedaços (chunks). Recentemente o grupo de segurança Gobbles publicou um exploit do problema para a plataforma OpenBSD e afirma ser possível explorar o mesmo problema nas plataformas Linux (GNU) 2.4 (x86), Sun Solaris 6-8 (sparc/x86) e FreeBSD 4.3-4.5 (x86). Considerando que seu sistema já esteja conectado à Internet, logo seu log começará a se encher de alertas, como o seguinte: Jun 01 17:12:34 eca snort: [1:615:2] SCAN Proxy attempt [Classification: Attempted Information Leak] [Priority: 2]: {TCP} 200.254.85.134:61546 -> 200.134.1.18:1080 Iniciando Snort durante o boot Vamos criar um script de inicialização do snort, assim quando o sistema inicia, o snort começa a executar. Pegue o arquivo aqui Depois: mv snort.sh /etc/init.d/ www.linuxsecurity.com.br 56 Visto que se trata de um problema grave, valhe a pena criarmos uma regra no snort para notificar as possíveis tentativas (e se você ainda não atualizou seu Apache, pause essa leitura e corra até o site do seu distribuidor ;-). Antes de mais nada, vamos entender a sintaxe básica. diversas outras opções para a configuração de regras que não serão escopo deste artigo, já que o objetivo é iniciar o leitor no básico sobre a sintaxe das regras. Se quiser se aprofundar no assunto, sugiro uma visita ao site: http:// www.snort.org/docs/writing_rules/ O básico Escrevendo a regra para Apache Quando o snort inicia, ele lê do arquivo de configuração quais regras serão tratadas, de acordo com a sintaxe: exemplo: include $RULE_PATH/scan.rules aonde $RULE_PATH é uma variável definida no mesmo arquivo Portanto, o arquivo scan.rules contém diversas regras que classificam tipos de scan. Um exemplo simples Esse exemplo retirado da própria documentação do snort vai nos ajudar entender a sintaxe básica: Voltando ao nosso problema inicial, abaixo se encontra a regra oficial disponibilizada no site oficial do snort para o recente problema no Apache: alert tcp any any -> $MY_NET any (flags: S; msg: “SYN packet”;) (para snort-1.8.6) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:”WEB-MISC Transfer-Encoding\: chunked”; flow:to_server,established; content:”Transfer-Encoding\:”; nocase; content:”chunked”; nocase; classtype:web-application-attack; reference:bugtraq,4474; reference:cve,CAN-2002-0079; reference:bugtraq,5033; reference:cve,CAN-2002-0392; sid:1807; rev:1;) Primeiro notamos a definição da variável MY_NET, que compreende os endereços IP da minha rede - 192.168.1.0/24 e 10.1.1.0/24 . Logo em seguida, a diretiva “alert” significa que o snort irá gerar um alerta (e loga-lo) se: o pacote for do tipo tcp; o pacote vier de qualquer endereço e qualquer porta (any any) destinado à variável $MY_NET (meu endereço) para qualquer porta (any); além disso, o pacote deve conter a flag SYN do protocolo TCP, caracterizando como possível inicio de uma conexão TCP (msg: “SYN packet”); A sintaxe lembra bastante a configuração de regras de um firewall, como o iptables. O tipo do protocolo deve ser informado (tcp, udp, icmp, etc), a origem (endereço IP e porta), o destino (idem), entre outras opções disponíveis. Existem Iremos analizar todas as opções da regra, demonstrando suas utilidades. Note que a conexão em questão se trata do protocolo TCP, vindo da rede externa (normalmente a Internet) de qualquer porta origem (any) para a variável $HTTP_SERVERS , que obviamente compreende todos os servidores w3 da minha rede, para o conjunto de portas, também definido por uma variável $HTTP_PORTS. A mensagem que deve ser postada no alarme é “WEB-MISC Transfer-Encoding: chunked” Para uma melhor análise das opções content:”Transfer-Encoding\:” e content:”chunked” , vamos nos basear no recente exploit lançado pela Gobbles ( http://www.dcc.unicamp.br/pub/~983728/ pub/artigos/snort/snort.sh) para verificar a assinatura que devemos receber em var MY_NET [192.168.1.0/24,10.1.1.0/ 24] www.linuxsecurity.com.br 57 uma rede. Além de uma prevenção, os alarmes ajudam a definir possíveis atacantes, aumentando a flexibilidade aliado a outras soluções de segurança, como regras adicionais de firewall. No entanto, a luta entre os sistemas de detecção de scans e as ferramentas de scan (como o nmap) é eterna. Enquanto os scans tentam driblar os sistemas de detecção, obtendo informações sobre um sistema sem gerar alertas ou suspeitas, ferramentas como o Snort tentam cobrir todas as técnicas de scan para tentar denunciar tais varreduras. É necessário, portanto, a atualização constante, tanto do software, como das assinaturas de novos ataques. caso desse ataque seja usado (mesmo que o exploit seja para OpenBSD, e não para Linux). Acionando o exploit em uma tentativa (frustrada!) de corromper a execução do Apache rodando localmente, temos: gcc -o apache-scalp apache-scalp.c ../apache-scalp 0 127.0.0.1 Vamos dar uma olhada no conteúdo dos pacotes enviados pelo exploit com o tcpdump (ou outro sniffer qualquer): [root@eca root]# tcpdump -i lo -X -s0 tcpdump: listening on lo Links Site oficial Snort http://www.snort.org/ Documentação oficial http://www.snort.org/docs/ writing_rules Update de assinaturas http://www.snort.org/dl/signatures/ NIDS FAQ http://www.ticm.com/kb/faq/idsfaq.html Artigo snort http://www.dcc.unicamp.br/~983728/pub/artigos/snort/ snort.html Snort script http://www.dcc.unicamp.br/~983728/pub/artigos/snort/ 22:42:42.486917 eca.33112 > eca.http: P 16384:29897(13513) ack 1 win 32767 <nop,nop,timestamp 659847 659847> (DF) .... 0x34c0 0000 0000 0000 0000 000d 0a54 7261 6e73...........Trans 0x34d0 6368 6665 722d 456e 636f 6469 6e67 3a20 fer-Encoding:.ch 0x34e0 4242 756e 6b65 640d 0a0d 0a35 0d0a 4242 unked....5..BBBB FICHA do AUTOR 0x34f0 420d 0a66 6666 6666 6636 650d 0a B..ffffff6e.. .... Além dos pacotes do inicio de conexão TCP, encontramos um pacote com o conteúdo acima Transfer-Encoding e chunked . Ainda verificamos que se trata de um pacote com flag Ack, vindo do cliente ( eca.33112 - minha máquina/ porta 33112) para o servidor ( > eca.http - porta 80 ), explicando a diretiva de fluxo de pacotes: flow:to_server,established; As demais opções da regra - reference, classtype, sid e rev - são utilizadas para informação específica da regra, aonde encontrar referência do problema que ela irá alertar. Conclusão Demonstramos que uma ferramenta NIDS como o Snort pode ser um grande aliado , apontando, através de alarmes, os diversos scans/ataques direcionados à www.linuxsecurity.com.br 58 Nome: Gabriel Armbrust Araujo idade: 23 Profissão: analista em gerência e segurança em redes, terminando curso de ciência da computação UNICAMP empresa: www.icaro.com.br emails: : [email protected] [email protected] site: http://www.dcc.unicamp.br/~983728/ ARTIGO Sumário Aumentando a segurança do seu Webserver com LIDS Aumentando a segurança do seu Webserver com LIDS A cada dia que passa ficamos cada vez mais a mercê dos inconsequentesvirtuais. Isso se dá ao fato de a internet ter se tornado o maior meio de comunicação global de todos os tempos. Com certeza isso não é uma novidade para você que está lendo este artigo e pensando no que este colunista tem de novo para mostrar no que se refere a “segurança virtual” ! Ultimamente a palavra “segurança” tem causado um alvoroço muito grande na comunidade internacional e tudo que se refere à segurança da informação chama a atenção de todos, como se fossem os primeiros lançamentos do pirulito “Diplik” (pode dar risada, eu sei que você conhece também). E o que segurança da informação tem a ver com pirulitos de 20 anos atráz que nem existem mais (na realidade eu encontrei um desses a uns 2 meses atráz, e confesso, fui obrigado a comprar pelo menos 10) ? malditos “script kiddies”. Podemos ter apenas uma certeza nisso tudo, a de que você ainda vai ouvir falar muito sobre Dipli.., opa, quer dizer, segurança da informação e que a única forma de estar totalmente seguro nos meios virtuais, infelizmente é desplugando o seu cabo. Sejam bem vindos, espero que tenham se distraído um pouco com a minha pequena história, que para bons entendedores, pode ser engraçada. Neste artigo, terei o imenso prazer de lhes mostrar, como reforçar a segurança de um Webserver rodando serviços básicos com LIDS. Para quem não conhece, o LIDS (Linux Instrusion Detection System) é um patch para o kernel linux, que tráz, excelentes recursos para melhorar a implementação de uma política de segurança realmente eficaz. Na realidade, o nome LIDS não faz jus as suas funções, pois herdou este nome pelo fato de possuir um avançado sistema de detecção de portscans embutido no kernel. Pauma pauma, não priemos cânico, eu explico. O exemplo do pirulito (sei que não foi uma boa escolha, mas tudo bem) é como se fosse a segurança que tanto buscamos, ou seja, queremos o pirulito mas não sabemos aonde encontrá-lo, e queremos a segurança mas não sabemos ao certo como alcançala, ou mesmo como lidar com ela, é por isso que o assunto “ chama tanto a atenção, porque todos estão em uma corrida frenética para conseguir manter a sua rede menos vulnerável aos inconsequentes virtuais ou, na maioria dos casos, dos www.linuxsecurity.com.br O LIDS é muito mais que um sistema de detecção de intrusos, ele é também um sistema completo de MAC (Controle de Acesso Mandatório), em que por exemplo, pode-se configurar ACL’s (Listas de/para Controle de Acesso) que negam o acesso de programas à determinados diretórios/recursos do computador, e isso é válido também para o super usuário “root”. Recentemente, tive o prazer de representar a LinuxSecurity Brasil Solutions no III Forum internacional de Software Livre, ministrando uma palestra sobre LIDS, sendo assim, não tomarei 59 automake, make, cpp) * ncurses-devel (apenas se quiser utilizar menuconfig) muito este espaço para falar sobre as funcionalidades do LIDS, confira maiores detalhes sobre esta fantástica ferramenta nos Slides que se encontram online no: http://www.linuxsecurity.com.br/info/eventos/lidsfisl2002 OBS: A instalação do LIDS não é recomendada para usuários iniciantes no mundo Linux, pois envolve conhecimentos avançados, principalmente no que diz respeito à recompilação do kernel. Serviços Faça o download do LIDS em: http://www.lids.org/ download O nosso Webserver em questão, terá a seguinte configuração: * OpenSSH -> padrão, rodando na porta 22 * Apache/PHP4 -> versão 1.3.26 com suporte a PHP4 * ProFTPD -> rodando com suporte a chroot (DefaultRoot ~) * daemontools -> para controle do qmail * qmail -> somente como MTA (Mail Transfer Agent) * syslog-ng -> maior segurança em relação ao conhecido syslogd * kernel 2.4.18 -> último release stable do kernel Linux série 2.4 * lids-1.1.1r2-2.4.18 -> último release stable para o kernel 2.4 Assumirei que você baixou o arquivo no diretório “/usr/local/src” e que o src do seu kernel está em “/usr/src/linux”: [root@lids ~]# cd /usr/local/src && tar xzvf lids-1.1.1r2-2.4.18.tar.gz [root@lids src]# cd /usr/src/linux [root@lids linux]# patch -p1 < /usr/local/ src/lids-1.1.1r2-2.4.18/lids-1.1.1r22.4.18.patch Neste artigo não trataremos da instalação destes serviços, consulte a documentação de cada um deles para maiores informações. [root@lids linux]# make menuconfig [*] Linux Intrusion Detection System support (EXPERIMENTAL) — LIDS features (256) Maximum protected objects to manage (256) Maximum ACL subjects to manage (256) Maximum ACL objects to manage [ ] Hang up console when raising a security alert [*] Security alert when execing unprotected programs before sealing LIDS [ ] Do not execute unprotected programs before sealing LIDS [*] Attempt not to flood logs (60) Authorised time between two identic logs (seconds) Instalação do LIDS A instalação do LIDS requer aplicação do patch no kernel e recompilação do mesmo, como qualquer outro patch para o kernel, para isso você vai precisar ter instalado: * Compilador C/C++ (gcc) * Fontes do kernel 2.4.18 * Bibliotecas C/C++ para desenvolvimento (glibcdevel) * Ferramentas GNU para compilação (autoconf, www.linuxsecurity.com.br 60 Esta linha é muito importante, pois é ela quem faz o “sealing” do kernel, ou seja, é ela que inicia efetivamente todas as ACL’s e CAPABILITIES. [*] Allow switching LIDS protections [*] Restrict mode switching to specified terminals [*] Allow mode switching from a Linux Console [ ] Allow mode switching from a serial Console [*] Allow mode switching from a PTY (3) Number of attempts to submit password (3) Time to wait after a fail (seconds) [ ] Allow any program to switch LIDS protections [*] Allow reloading config. file [*] Port Scanner Detector in kernel [*] Send security alerts through network [*] Hide klids kernel thread (3) Number of connection tries before giving up (30) Sleep time after a failed connection (16) Message queue size [*] Use generic mailer pseudo-script [*] LIDS Debug OBS: Para maiores informações sobre a instalação do LIDS, consulte o meu artigo online no: http://www.linuxsecurity.com.br/ sections.php?op=viewarticle&artid=25 Compilando as ferramentas lidsadm e lidsconf [root@lids ~]# cd /usr/local/src/lids1.1.1r2-2.4.18 [root@lids lids-1.1.1r2-2.4.18]# ./ configure && make && make install lidsadm lidsadm é a ferramenta que se encarrega de manipular as CAPABILITIES e o stado do sistema. Você vai utilizá-la basicamente para: Recomendo fortemente que você visite a sessão HELP de cada uma das opções para obter uma breve descrição do que você está habilitando em seu kernel. Perceba que para este kernel estamos limitando o número máximo de ACL’s de objects e subjects para 256, é mais do que suficiente. - Selar o kernel (sealing the kernel -> lidsadm -I) - Criar free session (veja sobre free session) - Ativar/Desativar o LIDS (lidsadm -S — +|LIDS_GLOBAL) - Fazer reload das ACL’s (lidsadm -S — +RELOAD_CONF) - Mostrar status (lidsadm -V) Compile o seu novo kernel: [root@lids linux]# make clean dep bzImage Veja maiores informações na man page do lidsadm. Após a compilação, configure o seu novo kernel no seu gerenciador de boot, mas “NÃO” faça o reboot da sua máquina ainda. lidsconf lidsconf é a ferramenta que manipula as ACL’s do LIDS. Veja maiores informações na man page do lidsconf. Coloque a seguinte linha no final do seu arquivo “/etc/rc.d/rc.local”: [ -f /proc/sys/lids/locks ] && /sbin/lidsadm -I www.linuxsecurity.com.br 61 -23:CAP_SYS_NICE -24:CAP_SYS_RESOURCE -25:CAP_SYS_TIME -26:CAP_SYS_TTY_CONFIG -27:CAP_MKNOD -28:CAP_LEASE -29:CAP_HIDDEN -30:CAP_KILL_PROTECTED -31:CAP_PROTECTED Arquivos de configuração Arquivo “lids.net” de exemplo: O LIDS utiliza os seguintes arquivos de configuração que residem no diretório “/etc/lids”: MAIL_SWITCH=1 MAIL_RELAY=192.168.1.2:25 MAIL_SOURCE=lidsbox.telles.org [email protected] [email protected] MAIL_SUBJECT=LIDS ALert * lids.cap -> arquivo aonde são configuradas as CAPABILITIES * lids.conf -> arquivo aonde são armazenadas as ACL’s em formato não legível * lids.net -> arquivo aonde devem ser configurados os dados para notificação de violações por e-mail * lids.pw -> este arquivo armazena a senha do LIDS criptografada em RipeMD-160 Conhecendo um pouco sobre objects e subjects Arquivo “lids.cap” utilizado neste artigo: O LIDS trabalha com objects (objetos) e subjects (referencia de um objeto para outro objeto), sendo assim, ele transforma diretórios e arquivos em objetos, que são mais fáceis de serem manipulados, vejamos um exemplo: -0:CAP_CHOWN -1:CAP_DAC_OVERRIDE -2:CAP_DAC_READ_SEARCH -3:CAP_FOWNER -4:CAP_FSETID -5:CAP_KILL -6:CAP_SETGID -7:CAP_SETUID -8:CAP_SETPCAP -9:CAP_LINUX_IMMUTABLE -10:CAP_NET_BIND_SERVICE -11:CAP_NET_BROADCAST -12:CAP_NET_ADMIN -13:CAP_NET_RAW -14:CAP_IPC_LOCK -15:CAP_IPC_OWNER -16:CAP_SYS_MODULE -17:CAP_SYS_RAWIO -18:CAP_SYS_CHROOT -19:CAP_SYS_PTRACE -20:CAP_SYS_PACCT -21:CAP_SYS_ADMIN +22:CAP_SYS_BOOT www.linuxsecurity.com.br lidsconf -A -o /etc -j READONLY A regra acima instrui o LIDS para criar um objeto cujo nome é “/etc” e que poderá somente ser lido. lidsconf -A -s /bin/login -o /etc/shadow -j READONLY Da mesma forma, a regra acima instrui o LIDS para criar uma ACL, onde o objeto “/bin/login” poderá ter privilégios somente de leitura no objeto “/etc/shadow”, isso chama-se “subject”. OBS: Só é possível criar subjects a partir de objetos previamente criados. 62 CAP_CHOWN -> Capacidade de trocar dono e grupo do arquivo/diretório Conhecendo um pouco sobre CAPABILITIES CAP_DAC_OVERRIDE -> Acesso DAC (veja mais abaixo sobre DAC) CAP_DAC_READ_SEARCH -> Leitura DAC (veja mais abaixo sobre DAC) CAP_FOWNER -> Sobrescreve todas as restrições aplicadas à arquivos, isso se o owner ID for igual ao user ID, exceto se CAP_FSETID estiver habilitado CAP_FSETID -> Restrições se o effective user ID não for igual ao owner ID CAP_KILL -> Limitação que faz com que o effective user ID que emita um sinal deva combinar com ou user ID do processo que recebe o sinal. Trocando em miúdos, restringe o poder que o usuário root tem de matar processo que não seja dono Todo e qualquer recurso que possa ser utilizado em um sistema operacional é chamado de CAPABILITY, ou seja, é uma capacidade que é solicitada ao kernel para executar uma determinada operação. Quando você executa um comando como “chown root /tmp/arquivo.txt”, você está solicitando ao kernel a utilização da CAPABILITY CAP_CHOWN, e o kernel prontamente atenderá a sua solicitação baseando-se apenas em permissões de file system. O LIDS permite que você manipule estas CAPABILITIES, assim sendo, com o LIDS é possível instruir o kernel de que nenhum programa poderá utilizar a CAPABILITY CAP_CHOWN. CAP_SETUID -> Execução de processos com UID forjado (Ex: Apache, Squid, etc) CAP_SETGID -> Execução de processos com GID forjado (Ex: Named, ProFTPD, etc) CAP_SETPCAP -> Transfere capacidade de um ambiente para qualquer PID (veja sobre LD_LIBRARY_PATH) CAP_LINUX_IMMUTABLE -> Modificações nos atributos de arquivos (chattr) CAP_NET_BIND_SERVICE -> Binding para portas TCP/UDP abaixo de 1024 CAP_NET_BROADCAST -> Multicast CAP_NET_ADMIN -> Tarefas administrativas de rede: levantar eth’s, trocar IP’s, rotas, regras de firewall, configurar modo PROMÍSCUO, etc . Vejamos as CAPABILITIES que podemos manipular com o LIDS e uma breve descrição sobre elas: www.linuxsecurity.com.br Broadcast/ 63 CAP_NET_RAW -> Utilização de sockets RAW (Ex: ping, ipvs). CAP_PROTECTED -> Protege processos de sinais (KILL, HUP, ALARM, etc). CAP_IPC_LOCK -> Locking de segmentos de memória compartilhada. CAP_KILL_PROTECTED -> Permite matar processos protegidos . CAP_IPC_OWNER -> Checagem de ownership de IPC. CAP_SYS_MODULE -> Inserir e remover módulos de kernel. CAP_SYS_RAWIO -> Acesso a /dev/ports, /dev/ {mem,kmem} e raw devices. Free Session CAP_SYS_CHROOT -> Utilização de chroot (Ex: bind-chroot, ProFTPD, etc). Free Session (sessão livre) é um recurso extremamente importante no LIDS, ele serve para desabilitar o LIDS somente no seu console/tty, isso é necessário quando o admin precisa fazer manutenção na máquina, assim sendo, não é preciso desabilitar o LIDS em todo o sistema para fazer este serviço. Entenda-se por manutenção, atualização do webserver, reiniciar alguns processos protegidos, alterar um IP, realizar backup e etc. Antigamente, seria comum desabilitar o LIDS globalmente para fazer este serviço: CAP_SYS_PTRACE -> Proccess trace (strace, ptrace, etc). CAP_SYS_PACCT -> Configuração de process accounting. CAP_SYS_ADMIN -> Tarefas administrativos do sistema: configurar quotas, hostname, domainname, mount, umount, serialports, etc. CAP_SYS_BOOT -> Utilização de reboot. lidsadm -S — -LIDS_GLOBAL CAP_SYS_NICE -> Nice level de processos. Mas a muito tempo atráz, foi incluído este recurso chamado “free session”, para poder resolver este problema: CAP_SYS_RESOURCE -> Resource limites (Ex: ulimits, quota limits, console limits, etc). CAP_SYS_TIME -> Manipulação da hora do sistema e real-time clock. lidsadm -S — -LIDS Assim o LIDS é desabilitado somente no console/ tty em que você estiver logado. CAP_SYS_TTY_CONFIG -> Configuração de devices TTY’s (Ex: mingetty, getty, screen). OBS: Somente é permitido 1 free session na máquina, se você tentar fazer mais de 1, a primeira free session será automaticamente desabilitada, e o LIDS estará habilitado novamente neste console/ tty. CAP_MKNOD -> Ações ioctl e chamadas de manipulação de dispositivos do sistema. CAP_LEASE -> Altera leases de arquivos. CAP_HIDDEN -> Torna processos invisíveis. www.linuxsecurity.com.br 64 DAC - Discretionary Access Control (Controle de Acesso Ilimitado) CAP_SETPCAP e LD_LIBRARY_PATH A pouco tempo atráz foi descoberto um BUG de segurança que envolvia a obtenção de privilégios a partir da variável de ambiente LD_LIBRARY_PATH. Após este ocorrido, o LIDS por padrão nega este tipo de acesso a esta variável de ambiente, sendo assim se você precisa que um determinado programa tenha acesso a estas informações, deve-se criar ACL’s do tipo: O LIDS definitivamente veio resolver uma série de problemas de segurança que alguns sysadmins possuem a muito tempo no Linux, um deles diz respeito ao controle de acesso ilimitado a diretórios (DAC). O super usuário “root” pode ler/escrever em qualquer diretório onde ele não tenha permissão. O LIDS põe um fim nisso, com a manipulação das CAPABILITIES CAP_DAC_OVERRIDE e CAP_DAC_READ_SEARCH, Ex: lidsconf -A -o /path/do/programa -j READONLY lidsconf -A -s /path/do/programa -o CAP_SETPCAP -j GRANT OBS: Recomendo não manter esta variável de ambiente setada, a menos que você realmente precise dela e saiba o que está fazendo. [root@lids ~]# ls -ld /home/rodrigo drwx——— 52 rodrigo rodrigo 4096 Jun 28 21:31 /home/rodrigo Herança (inheritance -> -i) Percebam que o usuário “root” não possui permissão para ler este diretório, mas em uma situação normal, ele poderá acessar o diretório sem maiores problemas: O LIDS possui um avançado sistema de heranças em suas ACL’s, imaginemos a seguinte situação: [root@lids ~]# cd /home/rodrigo [root@lids rodrigo]# pwd ; id -u /home/rodrigo 0 #!/bin/bash log=/var/log/backup-day tar -czvf arq.tar.gz ~/ > $log Com LIDS e removendo as CAPABILITIES CAP_DAC_OVERRIDE e CAP_DAC_READ_SEARCH: Se executarmos: lidsconf -A /etc/scripts/backup.sh -o /var/log/ backup-day -j WRITE [root@lids ~]# cd /home/rodrigo Operation not permitted [root@lids ~]# ls -l /home/rodrigo Operation not permitted O script não vai funcionar, pois os seus filhos não iriam conseguir escrever no arquivo “/var/ log/backup-day”. Usando: lidsconf -A /etc/scripts/backup.sh -o /var/log/ backup-day -i 1 -j WRITE www.linuxsecurity.com.br 65 Agora o script “/etc/scripts/backup.sh” pode passar as suas permissões como herança para os seus filhos (tar). separar as informações de LOG que o LIDS gera em 4 arquivos que estarão dentro do diretório “/ var/log/lids”: Se pegarmos um outro script executando o nosso anterior: * changes -> informações de modificação de stado do LIDS (enable, disable, etc) * portscan -> informações referentes a detecção de portscans * scanports -> portas que estão sendo scaneadas * violates -> informações sobre as violações do sistema #!/bin/bash log=/var/log/backup-day . /etc/scripts/logrotate.sh tar -czvf arq.tar.gz ~/ > $log Estas regras devem ser adicionadas ao arquivo “syslog-ng.conf”, caso você tenha optado em instalá-lo no lugar do syslogd são: Agora não vai funcionar mais, temos um problema ??? lidsconf -A /etc/scripts/backup.sh -o /var/log/ backup-day -i 2 -j WRITE #———————————————— source mysrc { file(“/proc/kmsg”); }; Agora os filhos do script “/etc/scripts/backup.sh” podem passar as suas permissões como herança para o script “/etc/scripts/logrotate.sh”. destination lids { file(“/var/log/lids/violates”); }; destination lids_pscan { file(“/var/log/lids/portscan”); }; destination lids_scanports { file(“/var/log/lids/scanports”); }; destination lids_changes { file(“/var/log/lids/changes”); }; Caso você precise de um nível de herança infinito, pode-se utilizar “-1”, mas cuidado com este nível de herança, pois ele é GULOSO. Ele é o “*” das expressões regulares. filter f_lids { match(“unprotected”) or match(“try to”) \ filter f_scan { match(“Port scan detected:”); }; or match(“violated”) or match(“Attempt”) or match(“: access”); }; filter f_sports { match(“LIDS.lids_check_scan.l”) and match([0-9]+) \ and not match(“return”); }; filter f_lidschg { match(“LIDS locally switched”) or match(“LIDS: lidsadm”) \ or match(“LIDS switched”) or match(“Mail Switch”) \ or match(“LIDS: Statistics:”) or match(“LIDS: init”); }; # Esta regra serve para limpar as mensagens sobre LIDS do log do kernel filter f_kern { facility(kern) and not match(“LIDS”); }; # Esta regra serve para limpar as mensagens sobre LIDS do log de debug filter p_debug { level(debug) and not match(“LIDS”); }; log { source(mysrc); filter(f_lids); destination(lids); }; log { source(mysrc); filter(f_scan); destination(lids_pscan); }; log { source(mysrc); filter(f_sports); destination(lids_scanports); }; log { source(mysrc); filter(f_lidschg); destination(lids_changes); }; #—————————————————— LIDS e syslog-ng LIDS e syslog-ng formam um par perfeito para geração e monitoramento de LOGs, pois não adianta um sistema que gera muitas informações de LOG se o admin nem mesmo sabe como utilizar estas informações em seu próprio benefício, assim sendo, estas informações acabam se tornando inconvenientes. Com syslog-ng, nós vamos www.linuxsecurity.com.br 66 nas directivas de “Directory” do seu apache, pois seria uma catástrofe fazer o apache seguir links simbólicos no sistema. Muito cuidado, esta opção vem como default na instalação padrão do apache. Se você não terá nada de especial neste diretório, simplesmente utilize “Options None”. OBS: Recomendo a leitura da documentação do syslog-ng para maiores exclarecimentos sobre estas regras. Crie o diretório “/var/log/lids” antes de reiniciar o syslog-ng: [root@lids ~]# mkdir -p /var/log/lids Alguns ajustes no “proftpd.conf” É extremamente recomendável que você “prenda” os seus usuários de ftp dentro do seu próprio home, isso evita muitas catástrofes, para isso, utilize a seguinte configuração no seu arquivo “proftpd.conf”: Configuração Alguns ajustes no PHP4 (php.ini) Uma ótima opção é utilizar o mod_php4 em safe mode, desabilitar o php por padrão e também barrar algumas funções perigosas: DefaultRoot ~ Para evitar que utilizem o usuário de ftp para fazer conexões ssh no seu servidor ou outra similar, crie sempre usuários com shell “/bin/false”, e não esqueça de colocar esta configuração no “proftpd.conf”: engine = off safe_mode = On disable_functions = phpinfo, php_uname, get_current_user RequireValidShell Off Como última dica para o proftpd, utilize a directiva “ServerIdent” para esconder a versão do proftpd (obscuridade como complemento de segurança, sim; como solução, nunca) Veja a documentação online do php para maiores informações sobre funções em http:// www.php.net . Como o php está desabilitado por padrão, será necessário habilitá-lo por diretório onde será utilizado, Ex: ServerIdent on “Telles FTP Server” Veja a diferença: - Antes [root@lids ~]$ ftp localhost Connected to localhost.localdomain. 220 ProFTPD 1.2.2rc1 Server ready. <Directory /home/httpd/html/scripts_php> Order allow,deny Allow from all php_flag engine On </Directory> - Depois [root@lids ~]$ ftp localhost Connected to localhost.localdomain. 220 Telles FTP Server Name (localhost:rodrigo): Alguns ajustes no “httpd.conf” Recomendo fortemente que você não utilize a opção “FollowSymLinks” www.linuxsecurity.com.br 67 Se você acha que já está acabando, está enganado, agora que começa a ficar interessante. Não esqueça de configurar a senha do LIDS: -j GRANT Qual tal uma regra de LIDS para permitir que o daemon proftpd possa escrever no diretório “/ etc” das 11:00 as 11:15 (pouco usual é claro): [root@lids ~]# lidsconf -P MAKE PASSWD enter new password: reenter new password: lidsconf -A -s /usr/sbin/proftpd -o /etc -t 1100-1115 -i -1 -j WRITE Somente com estas 3 regras, eu tenho certeza que a sua mente já imaginou o que é possível fazer com o LIDS, fantátisco não ? OBS: Sempre utilize senhas fortes, com números, letras e símbolos. Nesta etapa, já teremos todos os serviços/ daemons funcionando, sendo assim, apenas nos focaremos na configuração das ACL’s do LIDS. E por isso eu disse que dependendo do refinamento que você deseja fazer no seu sistema, você terá muitas ACL’s para digitar na mão e você pode ter certeza, uma hora isso vai começar a ficar inconveniente. Pensando nisso, eu resolví escrever um script em shell, que lê um arquivo (/etc/lids/lids.objs) em um formato um pouco mais simples, e monta as regras para você, vejamos como ficariam as regras acima: OBS: Não prossiga com as configurações caso alguma etapa anterior não tenha sido executada com sucesso. Em um sistema como o nosso, pode-se ter facilmente mais de 100 ACL’s de LIDS, isso vai depender muito do refinamento que cada um desejará fazer quando estiver dominando a ferramenta. No nosso sistema teremos 121 ACL’s, estão incluídas ACL’s para o boot correto do sistema e também para o desligamento sem maiores danos. OBJ:/etc:0:READONLY S U B : / u s r / s b i n / p r o f t p d : 1:GRANT:CAP_NET_BIND_SERVICE:20-21 SUB:/usr/sbin/proftpd:-1:WRITE:/etc:T(11001115) Eu não sei você, mas eu achei este formato muito mais simples e rápido de manter, vamos utilizá-lo daquí pra frente. É sempre assim, o sysadmin sempre quer automatizar algo, dizem as más línguas, que não existe bicho mais preguiçoso que o sysadmin, é claro, eu concordo com eles. O script que lê este formato de arquivo e monta as regras do LIDS, chama-se lidsconf.sh e foi incorporado à distribuição do LIDS como contrib à partir da versão 0.11.1, infelizmente este script lê somente o formato para a versão do LIDS do kernel 2.2. Mas não se preocupe, nem tudo está perdido, eu atualizei o script para a nova versão (kernel 2.4), ainda não está incorporado como contrib para o LIDS 1.1.1r2, mas já pode ser obtido através do endereço http://www.linuxsecurity.com.br/tools/IDS/ lidsconf-2.0.tar.gz . Entendendo um pouco sobre CAPABILITIES Vamos ver como seria uma regra para tornar o diretório “/etc” como somente leitura: lidsconf -A -o /etc -j READONLY Vejamos agora, como seria uma regra de LIDS para permitir que o daemon proftpd pudesse levantar na porta 20 e 21: lidsconf -A -s /usr/sbin/proftpd -o CAP_NET_BIND_SERVICE 20-21 -i -1 www.linuxsecurity.com.br 68 ACL’s Todas estas ACL’s foram feitas/testadas em distribuições Linux baseadas em RedHat, pode ser necessário fazer algumas adaptações caso a distribuição seja diferente. Nosso arquivo “/etc/lids/lids.objs” com as ACL’s necessárias para o perfeito funcionamento de todos os serviços e que o lidsconf realizará leitura: OBS: Os PATH’s utilizados neste arquivo, estão de acordo com a instalação padrão dos serviços em uma distribuição baseada em RedHat, altere conforme a sua necessidade. —————————————————————————————————————— # Proteção de diretórios: OBJ:/sbin:0:READONLY OBJ:/bin:0:READONLY OBJ:/boot:0:READONLY OBJ:/etc:0:READONLY OBJ:/lib:0:READONLY OBJ:/usr:0:READONLY OBJ:/root:0:READONLY OBJ:/home:0:READONLY OBJ:/var/log:0:APPEND OBJ:/etc/shadow:0:DENY OBJ:/etc/ssh/sshd_config:0:DENY OBJ:/etc/ssh/ssh_host_key:0:DENY OBJ:/etc/ssh/ssh_host_dsa_key:0:DENY OBJ:/root/lidsconf.sh:0:DENY OBJ:/service:0:READONLY OBJ:/etc/lids:0:DENY OBJ:/etc/httpd:0:DENY OBJ:/home/httpd/html:0:DENY OBJ:/var/log/httpd:0:DENY # Boot do sistema: SUB:/etc/rc.d/rc.sysinit:1:WRITE:/etc SUB:/etc/rc.d/rc.sysinit:1:WRITE:/boot SUB:/etc/rc.d/rc.sysinit:1:WRITE:/var/log SUB:/etc/rc.d/rc.sysinit:1:GRANT:CAP_KILL SUB:/etc/rc.d/rc.sysinit:1:GRANT:CAP_SYS_ADMIN SUB:/etc/rc.d/rc.sysinit:1:GRANT:CAP_SYS_RAWIO SUB:/etc/rc.d/rc.sysinit:1:GRANT:CAP_NET_ADMIN SUB:/etc/rc.d/rc.sysinit:1:GRANT:CAP_SYS_MODULE SUB:/etc/rc.d/rc.sysinit:1:GRANT:CAP_CHOWN SUB:/etc/rc.d/rc.sysinit:-1:GRANT:CAP_DAC_OVERRIDE SUB:/etc/rc.d/rc.sysinit:-1:GRANT:CAP_DAC_READ_SEARCH www.linuxsecurity.com.br 69 # Funcionamento do sistema: SUB:/sbin/hwclock:0:WRITE:/etc/adjtime SUB:/sbin/hwclock:0:GRANT:CAP_SYS_TIME SUB:/sbin/update:0:GRANT:CAP_SYS_ADMIN SUB:/sbin/init:0:WRITE:/etc SUB:/sbin/init:0:WRITE:/var/log/lastlog SUB:/sbin/init:0:WRITE:/var/log/wtmp SUB:/bin/bash:0:GRANT:CAP_SYS_RESOURCE SUB:/bin/bash:0:WRITE:/root/.bash_history SUB:/bin/login:0:READONLY:/etc/shadow SUB:/bin/login:0:WRITE:/var/log/wtmp SUB:/bin/login:0:WRITE:/var/log/lastlog SUB:/bin/login:0:GRANT:CAP_SETUID SUB:/bin/login:0:GRANT:CAP_SETGID SUB:/bin/login:0:GRANT:CAP_CHOWN SUB:/bin/login:0:GRANT:CAP_SYS_TTY_CONFIG SUB:/bin/su:0:READONLY:/etc/shadow SUB:/bin/su:0:GRANT:CAP_SETUID SUB:/bin/su:0:GRANT:CAP_SETGID SUB:/sbin/mingetty:0:GRANT:CAP_SYS_TTY_CONFIG # Shutdown SUB:/etc/rc.d/init.d/halt:-1:GRANT:CAP_KILL_PROTECTED SUB:/etc/rc.d/init.d/halt:-1:GRANT:CAP_KILL SUB:/etc/rc.d/init.d/halt:-1:GRANT:CAP_SYS_ADMIN SUB:/etc/rc.d/init.d/halt:-1:GRANT:CAP_SYS_RAWIO SUB:/etc/rc.d/init.d/halt:-1:GRANT:CAP_NET_ADMIN SUB:/etc/rc.d/init.d/halt:-1:GRANT:CAP_SETUID SUB:/etc/rc.d/init.d/halt:0:WRITE:/var/log/wtmp SUB:/etc/rc.d/init.d/halt:0:WRITE:/var/log/lastlog SUB:/etc/rc.d/init.d/killall:-1:GRANT:CAP_KILL_PROTECTED SUB:/etc/rc.d/init.d/killall:-1:GRANT:CAP_KILL SUB:/etc/rc.d/init.d/killall:-1:GRANT:CAP_SYS_ADMIN SUB:/etc/rc.d/init.d/killall:-1:GRANT:CAP_SYS_RAWIO SUB:/etc/rc.d/init.d/killall:-1:GRANT:CAP_NET_ADMIN SUB:/etc/rc.d/init.d/killall:-1:GRANT:CAP_DAC_OVERRIDE SUB:/etc/rc.d/init.d/killall:-1:GRANT:CAP_DAC_READ_SEARCH # OpenSSH SUB:/usr/sbin/sshd:0:READONLY:/etc/shadow SUB:/usr/sbin/sshd:0:READONLY:/etc/ssh/sshd_config SUB:/usr/sbin/sshd:0:READONLY:/etc/ssh/ssh_host_key SUB:/usr/sbin/sshd:0:READONLY:/etc/ssh/ssh_host_dsa_key SUB:/usr/sbin/sshd:0:WRITE:/var/log/wtmp SUB:/usr/sbin/sshd:0:WRITE:/var/log/lastlog www.linuxsecurity.com.br 70 SUB:/usr/sbin/sshd:0:GRANT:CAP_SETUID SUB:/usr/sbin/sshd:0:GRANT:CAP_SETGID SUB:/usr/sbin/sshd:0:GRANT:CAP_FOWNER SUB:/usr/sbin/sshd:0:GRANT:CAP_CHOWN SUB:/usr/sbin/sshd:0:GRANT:CAP_DAC_OVERRIDE SUB:/usr/sbin/sshd:0:GRANT:CAP_SYS_TTY_CONFIG SUB:/usr/sbin/sshd:0:GRANT:CAP_NET_BIND_SERVICE:22-22 SUB:/usr/sbin/sshd:0:GRANT:CAP_PROTECTED SUB:/usr/bin/ssh:0:GRANT:CAP_NET_BIND_SERVICE:0-1024 # syslog-ng: SUB:/sbin/syslog-ng:0:GRANT:CAP_CHOWN SUB:/sbin/syslog-ng:0:WRITE:/var/log # daemontools SUB:/usr/local/bin/multilog:0:WRITE:/var/log/qmail SUB:/usr/local/bin/svc:0:WRITE:/var/qmail/supervise SUB:/usr/local/bin/supervise:0:WRITE:/var/qmail/supervise SUB:/usr/local/bin/supervise:0:GRANT:CAP_KILL SUB:/usr/local/bin/setuidgid:0:GRANT:CAP_SETUID SUB:/usr/local/bin/setuidgid:0:GRANT:CAP_SETGID # qmail SUB:/var/qmail/bin/qmail-inject:0:WRITE:/var/qmail/queue SUB:/var/qmail/bin/qmail-rspawn:0:WRITE:/var/qmail/queue SUB:/var/qmail/bin/qmail-lspawn:0:WRITE:/var/qmail/queue SUB:/var/qmail/bin/qmail-queue:0:WRITE:/var/qmail/queue SUB:/var/qmail/bin/qmail-clean:0:WRITE:/var/qmail/queue SUB:/var/qmail/bin/qmail-send:0:WRITE:/var/qmail/queue SUB:/var/qmail/bin/qmail-remote:0:WRITE:/var/qmail/queue SUB:/var/qmail/bin/qmail-send:-1:GRANT:CAP_DAC_OVERRIDE SUB:/var/qmail/bin/qmail-send:-1:GRANT:CAP_DAC_READ_SEARCH SUB:/var/qmail/bin/qmail-queue:0:GRANT:CAP_DAC_OVERRIDE SUB:/var/qmail/bin/qmail-queue:0:GRANT:CAP_DAC_READ_SEARCH SUB:/var/qmail/bin/qmail-start:0:GRANT:CAP_SETUID SUB:/var/qmail/bin/qmail-start:0:GRANT:CAP_SETGID SUB:/var/qmail/bin/qmail-lspawn:0:GRANT:CAP_SETUID SUB:/var/qmail/bin/qmail-lspawn:0:GRANT:CAP_SETGID SUB:/var/qmail/bin/qmail-lspawn:0:GRANT:CAP_DAC_OVERRIDE SUB:/var/qmail/bin/qmail-lspawn:0:GRANT:CAP_DAC_READ_SEARCH SUB:/var/qmail/bin/qmail-rspawn:-1:GRANT:CAP_NET_BIND_SERVICE:1-1023 SUB:/var/qmail/bin/qmail-local:1:WRITE:/home # Apache SUB:/usr/sbin/httpd:0:GRANT:CAP_NET_BIND_SERVICE:80-80 www.linuxsecurity.com.br 71 SUB:/usr/sbin/httpd:0:GRANT:CAP_SETUID SUB:/usr/sbin/httpd:0:GRANT:CAP_SETGID SUB:/usr/sbin/httpd:0:READONLY:/etc/httpd SUB:/usr/sbin/httpd:0:READONLY:/home/httpd SUB:/usr/sbin/httpd:0:WRITE:/var/log/httpd # ProFTPD SUB:/usr/sbin/proftpd:-1:GRANT:CAP_SETUID SUB:/usr/sbin/proftpd:-1:GRANT:CAP_SETGID SUB:/usr/sbin/proftpd:-1:GRANT:CAP_SYS_CHROOT SUB:/usr/sbin/proftpd:-1:GRANT:CAP_NET_BIND_SERVICE:20-21 SUB:/usr/sbin/proftpd:-1:READONLY:/etc/shadow SUB:/usr/sbin/proftpd:-1:WRITE:/home/httpd/html # Mail - Você vai precisar destas regras caso utilize o comando “mail” para # enviar e-mails a partir do console SUB:/bin/mail:0:GRANT:CAP_SETGID SUB:/bin/mail:0:WRITE:/root SUB:/bin/mail:0:WRITE:/home ————————————————————————————————————————— Se você ainda não baixou o script lidsconf.sh, então faça isso agora, e rode-o no seu sistema, se você não digitou nada errado, ele apresentará: [root@lids ~]# ./lidsconf.sh ========================================================= Read objects : 121 Errors: 0 Inserted objects successfully: 121 ========================================================= Se existirem erros, veja o arquivo de log (/var/log/lids.log) do script para maiores informações sobre o erro. Depois desta longa jornada de configurações, finalmente você pode rebootar o seu Linux com o novo kernel e experimentar o fruto do seu trabalho, esta é a melhor parte ! Muito cuidado com a falsa sensação de segurança que o LIDS pode passar, pois ele é simplesmente o espelho da sua confiança no sistema, as ACL’s aquí descritas oferecem um alto grau de confiabilidade, mas não corrigem problemas como: 1 - utilização de senhas 1234, RG, data de nascimento, etc 2 - criar usuário de ftp com shell válido 3 - passar senhas de ftp e ssh por ICQ, e-mail e qualquer outro meio não www.linuxsecurity.com.br 72 criptografado 4 - permitir que usuários estranhos façam upload de código php sem auditoria 5 - o servidor fica em cima da mesa da secretária 6 - não tem senha na BIOS e dá boot por CDROM e disquete 7 - etc, etc, etc Referências: http:/www.lids.org http://www.linuxsecurity.com.br/info/eventos/ lids-fisl2002 http://www.linuxsecurity.com.br/ sections.php?op=viewarticle&artid=25 http://lists.sourceforge.net/lists/listinfo/lids-user http://www.apache.org http://www.php.net http://www.proftpd.net http://www.qmail.org http://cr.yp.to/daemontools.html http://cr.yp.to/ucspi-tcp.html http://www.balabit.hu/en/downloads/syslog-ng www.linuxsecurity.com.br FICHA do AUTOR Nome: Rodrigo Pereira Telles Idade:23 anos e-mail: [email protected] Administrador de Sistemas UNIX Consultor de Segurança Desenvolvedor de ferramentas GPL: -Webtools -> http://webtools.linuxsecurity.com.br - Securitylog2html/netfilter2html -> http://webtools.linuxsecurity.com.br - qmail-filter/queue-admin -> http://qmail.linuxsecurity.com.br O Mantenedor/Desenvolvedor de conteúdo do site http://www.dicaslinux.com.br O Colunista, desenvolvedor e representante da LinuxSecurity Brasil Solutions http://www.linuxsecurity.com.br O Palestrante da III ExpoSALT (Exposição de Sistemas Alternativos) no Rio de Janeiro sobre Webtools e incentivo ao desenvolvimento de sistemas alternativos. O Palestrante do III Forum Internacional de Software Livre em Porto Alegre sobre LIDS 73 www.linuxsecurity.com.br 74 www.linuxsecurity.com.br 75