Preparando seu Linux Box para a Internet PROTEGENDO O LINUX por Lance Spitzner Organizações pelo mundo inteiro estão adotando o Linux como sua plataforma de produção. Ao conectar-se à Internet para fornecer serviços críticos, eles tornam-se alvos para o azar. Para ajudar a proteger estes sistemas Linux, este artigo cobre o básico sobre segurança de um Sistema Linux. Os exemplos fornecidos são baseados no Red Hat 5.x, mas devem aplicar-se à maioria das distribuições Linux. INSTALAÇÃO O melhor momento para começar a proteger seu sistema é no início, na instalação do SO. Uma vez que seja um sistema de produção, você não pode confiar em qualquer instalação anterior. Você vai querer começar com uma instalação limpa, onde você possa garantir a integridade do sistema. Coloque seu sistema em uma rede isolada. Em nenhum momento você vai querer conectar este sistema a uma rede ativa ou a Internet, expondo o sistema a um possível comprometimento. Para obter arquivos críticos e correções posteriores, você vai precisar de uma segunda máquina para atuar como intermediária. Esta segunda máquina vai baixar arquivos da Internet, então vai se conectar à sua rede isolada para usar na configuração, para transferir arquivos críticos. Uma vez que você tenha colocado seu futuro Sistema Linux em uma rede isolada, você está pronto para iniciar. O primeiro passo é selecionar qual pacote de SO vais baixar. A idéia é fazer uma instalação mínima, enquanto mantém a máxima eficiência. Escolha a instalação que resolva suas necessidades, mas retire os pacotes que você não vai usar. Quanto menos pacotes no sistema, menor o potencial de problemas de segurança ou furos de segurança. Isto significa que, se você não necessita do servidore de News ou de Real Audio, não deve instalar os mesmos. O bom do Linux é que é fácil adicionar pacotes. Não importa a instalação que estejas fazendo, você vai querer instalar as páginas man e os documentos HOWTO. Estas páginas de manual e documentos tem sido críticos para mim, e acrescentam pouco risco ao sistema. Durante o processo de instalação, você será perguntado sobre o particionamento do teu sistema. Eu sempre gosto de fazer o root o maior possível e jogar tudo lá dentro, para não ficar sem espaço no futuro. Entretanto, precisamos de várias partições para proteger o disco root. Se vamos encher a partição root de dados, como log ou email, podemos causar uma queda dos serviços (N.T.:denial of service - DoS - um ataque comum na Internet, em que um computador cessa de fornecer um serviço, geralmente por estar sobrecarregado), com possibilidade de derrubar o sistema. Além disso, eu sempro recomendo uma partição separada para /var, que é onde todo o log do sistema e os emails são colocados. Isolando a partição /var, você portege sua partição root de ficar sobrecarregada. Normalmente, 400MB é mais que suficiente para /var. Você também pode considerar montar uma partição separada para as necessidades de aplicações específicas, especialmente aplicações que armazenam extensivos logs. Com esta configuração, suas partições podem ser como segue: / - todo o restante /var - 200 MB swap - (máximo 127 MB de RAM) Uma vez o sistema tenha reiniciado após a instalação, certifique-se de instalar as correções (patches) de segurança recomendadas. Para o Red Hat, você pode encontrar estas correções de segurança em http://www.redhat.com/support/. Um excelente exemplo disto é a atualização de segurança do wu-ftpd. Sem estas correções, seu sistema pode ser facilmente comprometido. Certifique-se de utilizar seu sistema intermediário para obter as correções de segurança. O Sistema Linux deve sempre permanecer em uma rede isolada. Correções são críticas para proteger um sistema e devem sempre ser atualizadas. BUGTRAQ@netspace.org é uma excelente fonte para descobrir bugs e correções do sistema. Para o Red Hat, uma vez que você tenha copiado o rpm, você pode facilmente atualizar seu sistema usando a sintaxe abaixo: rpm -Uvh wu-ftpd-2.4.2b18-2.1.i386.rpm Para sistemas que estão on-line, vocè pode efetuar o ftp e instalar o rpm ao mesmo tempo, usando a sintaxe abaixo: rpm -Uvh ftp://updates.redhat.com/5.2/i386/wu-ftpd-2.4.2b18-2.1.i386.rpm ELIMINANDO SERVIÇOS Uma vez que você tenha carregado o pacote de instalação, correções, e reiniciado o sistema, estamos prontos para proteger o sistema operacional. A proteção consiste principalmente em desligar serviços, acrescentar logs, configurar vários arquivos, e configurar TCP Wrappers. Começaremos com o desligamento de serviços. Por padrão, o Linux é um sistema operacional poderoso que executa muitos serviços úteis. Entretanto, muitos destes serviços são desnecessários e representam um risco de segurança em potencial. O primeiro lugar para começar é em /etc/inetd.conf. Este arquivo especifica quais serviços o daemon /usr/sbin/inetd vai atender. Por padrão, o /etc/inetd.conf é configurado para uma variedade de serviços, e você vai precisar provavelmente de apenas dois, ftp e telnet. Os serviços restantes e desnecessários são eliminados comentando a linha (exemplo A - os exemplos estão no fim do texto). Esta atividade é crítica, uma vez que muitos serviços executados pelo inetd representam sérias ameaças à segurança, como o popd, imapd, e rsh. Confirme que você comentou estes serviços usando o comando abaixo (que irá mostrar todos os serviços que foram deixados não-comentados) # grep -v "^#" /etc/inetd.conf O próximo lugar para iniciar a limpeza são os scripts .rc. Estes scripts determinam quais serviços são iniciados pelo processo init. Para o Red Hat, você encontra estes scripts em /etc/rc.d/rc3.d. Para fazer com que um script deixe de ser iniciado, substitua o "S" maiúsculo por um "s" minúsculo. Desta forma você pode facilmente permitir que o script seja iniciado novamente, bastando substituir o "s" minúsculo por um "S" maiúsculo. Ou, se você preferir, o Red Hat vem com uma ótima ferramenta para desligar estes serviços. Basta digitar "setup" na linha de comando, e selecionar "System Services", onde você vai poder selecionar os serviços que serão iniciados durante proceso de boot. Outra opção é o chkconfig, que é encontrado na maioria das distribuições. Os seguintes scripts de partida podem ser instalados por padrão, mas não são criticos para o funcionamento do sistema. Se você não necessita dos mesmos, deligue-os. Os números nos nomes determinam a seqüência de inicialização, e podem variar dependendo de sua distribuição e versão. S05apmd (Só necessário para laptops) S10xntpd (protocolo de sincronismo de tempo na rede) S15sound S20bootparamd (usado para clientes diskless, provavelmente não precisas deste serviço vulnerável). S20rusersd (tente evitar usar qualquer serviço que comece com r, eles dão muita informação para usuários remotos) S20rwalld S20rwhod S25innd (servidor de News) S25squid (servidor Proxy) S30sendmail (você pode enviar mensagems sem este script, mas não pode receber ou passar adiante). S30ypbind (necessário se você é um cliente NIS) s34yppassedd (necessário se você é um servidor NIS, que é um serviço extremamente vulnerável) S35dhcpd S35ypserv (necessário se você é um servidor NIS, que é um serviço extremamente vulnerável) S40portmap (este script é necessário se você possui algum serviço rpc, como NIS ou NFS) S40snmpd S55routed (RIP, não execute este a menos que você REALMENTE precise dele) S55named (servidor DNS. Se você está configurando um DNS, atualize o Bind para a versão 8.2, em http://www.isc.org/bind.html) S60atd (usado pelo serviço at, similar ao cron, mas não é exigido pelo sistema) S60lpd (serviços de impressão) S72amd S75gated (usado para executar outros protocolos de roteamento, como OSPF) S85httpd (servidor Web Apache, atualize para a última versão, em http://www.apache.org/) S95nfsfs (este é para servidors NFS, um serviço extremamente vulnerável) S95pcmcia (só necessário em laptops) Para ver quantos serviços estão sendo executados antes de mudar os scripts de início, execute ps aux | wc -l Uma vez que você tenha feito a instalação e desligado os scripts de início, execute o comando novamente e compare como o número de serviços diminuiu. Quanto menos serviços estiverem sendo executados, melhor. EFETUANDO LOG E CONFIGURANDO Uma vez que tenhas eliminado o máximo de serviços possíveis, vamos habilitar o log. Todo o log do sistema ocorre em /var/log. Por padrão, o Linux possui um excelente serviço de log, exceto para o ftp. Existem duas opções para fazer o log do FTP, configurar o arquivo /etc/ftpaccess ou editar o arquivo /etc/ined.conf. Eu prefiro editar o arquivo /etc/inetd.conf, que é mais simples (ou seja, mais difícil de "detonar" com ele :). Edite o arquivo conforme abaixo /etc/inetd.conf para garantir o log completo de todas as sessões FTP: ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o --- Da página man --- Se a opção -l é especificada, cada sessão ftp é logada no syslog. Se a flag -L é usada, o registro de comandos estará ativado assim que o servidor FTP seja ativado. Isto irá fazer com que o servidor registre todos os comandos USER (do FTP - veja a documentação do seu cliente ftp), de forma que, se um usuário acidentalmente informa uma senha para o comando ao invés do nome do usuário, a senha será registrada via syslog. Se a opção -i é especificada, os arquivos recebidos pelo servidor ftpd(8) serão logados para o xferlog(5). Se a opção -o é especificada, os arquivos transmitidos pelo servidor ftpd(8) serão logados para o xferlog(5). --- até aqui --- O próximo passo é a configuração (tweaking - configuração em um nível superior, ajuste fino da configuração). Esta atividade envolve a administração de vários arquivos. A primeira coisa que queremos é criar o arquivo /etc/issue. Este arquivo é um anúncio em ASCII que aparece para todos os logins de telnet (exemplo B). Esta advertência legal irá aparecer sempre que alguém tentar efetuar login no seu sistema. Se você quiser continuar usando o mesmo arquivo /etc/issue, terá que modificar o script /etc/rc.d/rc3.d/S99local. Por padrão, o Linux cria um novo arquivo /etc/issue a cada reinicialização do sistema. Vamos querer duas coisas para proteger nosso arquivo /etc/passwd (este arquivo é o banco de dados que mantém as contas de usuários e senhas). Primeiro, vamos querer converter nosso sistema para que o mesmo passe a usar o /etc/shadow, que armazena de forma segura as senhas de todo mundo em um arquivo que só o root (superusuário) pode acessar. Isto protege suas senhas de serem facilmente acessadas e quebradas (um dos primeiros ataques que os hackers tentam). Tudo que você tem a fazer é escrever o seguinte comando como root. Este comando automaticamente converte suas senhas criptografadas para o arquivo /etc/shadow pwconv O segundo passo é remover a maioria das contas padrão de sistema de /etc/passwd. O linux fornece estas contas para árias atividades do sistema que você não vai precisar. Se você não necessita da conta, remova-a. Quanto mais contas você tiver, mais fácil é acessar teu sistema. Um exemplo é a conta "news". Se você não estiver executando o nntp, um servidor de news group, você não necessita a conta. Garanta também que a conta ftp seja removida, uma vez que esta conta é usada para ftp anônimo. Das páginas man. man ftpd: O ftpd autentica contas de acordo com quatro regras. ... 4) Se o nome do usuário é "anonymous" ou "ftp", uma conta de ftp anônimo deve estar presente no arquivo de senhas (usuário "ftp"). neste caso, o usuário recebe permissão para logar no sistema especificando qualquer senha (por convenção é informado o nome da máquina cliente). Para um exemplo de meu arquivo /etc/passwd, veja o exemplo C. Vamos querer alterar também o arquivo /etc/ftpusers (exemplo D). Qualquer conta listada neste arquivo não pode fazer ftp no sistema. Desta forma restringimos contas de sistema comum, como root ou bin, de tentar efetuar sessões de ftp. O Linux possui, por padrão, este arquivo. Garanta que qualquer conta que precise fazer ftp ao arquivo NÃO esteja no arquivo /etc/ftpusers. Garanta, também, que o root não possa efetuar telnet ao sistema. Isto obriga que os usuários façam login no sistema como eles mesmos e depois executem um su para tornarem-se root. O arquivo /etc/securetty lista quais ttys o root pode usar para se conectar. Liste somente tty1, tty2, etc, neste arquivo, restringindo o login do root para acesso local. ttyp1, ttyp2, são pseudo terminais, e permitem ao root fazer telnet ao sistema remotamente (exemplo E). TCP WRAPPERS TCP Wrappers são um must, nenhum sistema pode ser considerado protegido sem tê-los. Criado por Wietse Venema, o TCP Wrappers é um binário que envolve os serviços inetd, tais como telnetd ou ftp. Com o TCP Wrappers, o sistema lança o wrapper para conecções inetd, que loga todas as tentativas e verifica a tentativa contra uma lista de controle de acesso. Se a conexão é permitida, os TCP Wrappers passa a conexão para o binário apropriado, como o telnetd. Se a conexão é rejeitada pela lista de controle de acessos, a conexão é derrubada. Para sorte nossa, usuários Linux, TCP Wrappers é instalado por padrão, a única coisa que precisamos é editar o arquivo /etc/hosts.allow e /etc/hosts.deny. Estes arquivos determinam que pode e quem não pode acessar nossos sistemas. Os TCP Wrappers também permitem outras brincadeiras, como banners (anúncios) e ativar programas adicionais, como o safe_finger. A sintaxe é relativamente simples. Coloque o endereço ou rede IP permitidos a conectar em /etc/hosts.allow. Coloque o endereço ou rede IP não permitidos a conectar em /etc/hosts.deny. Por padrão, o Linux permite conexões para todo mundo, portanto, estes arquivos devem ser modificados. Duas recomendações quando trabalhando com TCP Wrappers: 1. Use endereços e redes IP em vez de nomes de domínios; 2. Configure o arquivo /etc/hosts.deny para proibir todos (ALL), e então dê permissão para sites específicos no arquivo /etc/hosts.allow. Para exemplos de como configurar o arquivo /etc/hosts.allow e /etc/hosts.deny, veja o exemplo F. PARA OS VERDADEIRAMENTE PARANÓICOS Eu considero as medidas acima discutidas absolutamente essenciais. Seguindo ests passos, você aumentou a segurança do seu Sistema Linux, meus parabéns! Desafortunadamente, seu sistema não está 100% seguro, e nunca vai ser. Portanto, para os verdadeiramente paranóicos, existem alguns passos adicionais que podem ser tomados. Primeiro, criamos o grupo wheel. O grupo wheel é um grupo de indivíduos selecionados que podem executar comandos poderosos, como /usr/bin/su. Limitando as pessoas que podem acessar estes comandos, você aumenta a segurança do sistema. Para criar o grupo, edite com o vi o arquivo /etc/group, crie o grupo wheel, e acrescente os administradores do sistema a este grupo. A seguir, identifique os sistemas binários críticos, como /usr/bin/su. Mude o grupo proprietário do comando para wheel, e as permissões para que somente o proprietário e o grupo possam executar o arquivo (certifique-se de manter o bit suid ou guid para alguns binários específicos). Para o arquivo /usr/bin/su, os comandos são: /usr/bin/chgrp wheel /usr/bin/su /usr/bin/chmod 4750 /usr/bin/su Segundo, vamos bloquear o uso dos arquivos ./rhosts, .netrc, e /etc/hosts.equiv. Os comandos r usam estes arquivos para acessar os sistemas. Para bloquear os arquivos, use ou touch nos mesmos (para criá-los), e mude as permissões para zero, bloqueando-os. Desta forma, ninguém vai poder criar ou alterar estes arquivos. Por exemplo, /usr/bin/touch /.rhosts /.netrc /etc/hosts.equiv /usr/bin/chmod 0 /.rhosts /.netrc /etc/hosts.equiv Terceiro, vamos fazer algumas modificações ao PAM. O PAM (Pluggable Authentication Modules) é um conjunto de bibliotecas compartilhadas que permitem você escolher como as aplicações autenticam o usuários. Para aprender mais sobre PAM, leia o arquivo ftp://ftp.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam.html. Há uma variedade de alterações que podem ser feitas ao seu sistema. Aqui está um exemplo de como converter suas senhas criptografadas para usar MD5, tornando seu arquivo /etc/shadow mais difícil de quebrar. Vá ao diretório /etc/pam.d, onde você encontra todos os arquivos de configuração para diferentes binários que necessitam autenticação. A maioria dos arquivos de configuração possuem a seguinte entrada: password required /lib/security/pam_pwdb.so shadow nullok use_authtok Tudo que você precisa fazer é encontrar todos os arquivos de configuração que tem esta entrada, e acrescentar md5 no fim, de forma a ficar desta forma: password required /lib/security/pam_pwdb.so shadow nullok use_authtok md5 Para meu sistema Red Hat 5.1, eu tive que editar esta linha nos seguintes arquivos de configuração em /etc/pam.d chfn chsh login passwd rlogin su xdm A última coisa que pode ser feita é proteger o sistema de acessos físicos. Consiste, principalmente, em configurar uma senha para sua BIOS. Você também pode proteger seu sistema durante o boot configurando o arquivo /etc/lilo.conf com uma senha (password=xxx, onde xxx é sua senha). Entretanto, tenha em mente, uma vez que alguém tenha acesso físico a seu sistema, não há modo garantido de proteger o mesmo. CONCLUSÃO Cobrimos alguns dos passos básicos envolvidos em proteger um Sistema Linux (a distribuição Red Hat). A chave para um sistema seguro é ter o mínimo de software instalado, com proteção em diversas camadas, como com o TCP Wrappers. Existem muitos passos adicionais que podem ser tomados, tais como o sudo (permite um administrador de sistemas dar privilégio de superusuário limitado a usuários e a registrar suas atividades), ssh (rlogin, rcp e telnet criptografados), tripwire (monitora alterações nos arquivos binários do sistema), e swatch (monitoração automática de log e alertas). Lembre-se, nenhum sistema é 100% seguro. Entretanto, com os passos acima, os riscos são bastante reduzidos. Biografia do Autor Lance Spitzner gosta de aprender detonando seus sistemas Unix em casa. Antes disto, ele era um Oficial no Rapid Deployment Force, onde detonava coisas de natureza diferente. Pode ser encontrado em lance@spitzner.net. -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- EXEMPLOS Estes são exemplos do artigo "Protegendo seu Linux" Exemplo A Este é um exemplo do arquivo /etc/inetd.conf. Note como tudo está comentado, exceto para o ftp e telnetd # # inetd.conf This file describes the services that will be available # through the INETD TCP/IP super server. To re-configure # the running INETD process, edit this file, then send the # INETD process a SIGHUP signal. # # Version: @(#)/etc/inetd.conf 3.10 05/27/93 # # Authors: Original taken from BSD UNIX 4.3/TAHOE. # Fred N. van Kempen, # # Modified for Debian Linux by Ian A. Murdock # # Modified for RHS Linux by Marc Ewing # # # # Echo, discard, daytime, and chargen are used primarily for testing. # # To re-read this file after changes, just do a 'killall -HUP inetd' # #echo stream tcp nowait root internal #echo dgram udp wait root internal #discard stream tcp nowait root internal #discard dgram udp wait root internal #daytime stream tcp nowait root internal #daytime dgram udp wait root internal #chargen stream tcp nowait root internal #chargen dgram udp wait root internal # # These are standard services. # ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd #gopher stream tcp nowait root /usr/sbin/tcpd gn # do not uncomment smtp unless you *really* know what you are doing. # smtp is handled by the sendmail daemon now, not smtpd. It does NOT # run from here, it is started at boot time from /etc/rc.d/rc#.d. #smtp stream tcp nowait root /usr/bin/smtpd smtpd #nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd # # Shell, login, exec and talk are BSD protocols. # #shell stream tcp nowait root /usr/sbin/tcpd in.rshd #login stream tcp nowait root /usr/sbin/tcpd in.rlogind #exec stream tcp nowait root /usr/sbin/tcpd in.rexecd #talk dgram udp wait root /usr/sbin/tcpd in.talkd #ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd #dtalk stream tcp waut nobody /usr/sbin/tcpd in.dtalkd # # Pop and imap mail services et al # #pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d #imap stream tcp nowait root /usr/sbin/tcpd imapd # # The Internet UUCP service. # #uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l # # Tftp service is provided primarily for booting. Most sites # run this only on machines acting as "boot servers." Do not uncomment # this unless you *need* it. # #tftp dgram udp wait root /usr/sbin/tcpd in.tftpd #bootps dgram udp wait root /usr/sbin/tcpd bootpd # # Finger, systat and netstat give out user information which may be # valuable to potential "system crackers." Many sites choose to disable # some or all of these services to improve security. # # cfinger is for GNU finger, which is currently not in use in RHS Linux # #finger stream tcp nowait root /usr/sbin/tcpd in.fingerd #cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd #systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx #netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet # # Time service is used for clock syncronization. # #time stream tcp nowait nobody /usr/sbin/tcpd in.timed #time dgram udp wait nobody /usr/sbin/tcpd in.timed # # Authentication # #auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -l -e -o # # End of inetd.conf Exemplo B Este é um exemplo do arquivo /etc/issue. # # # WARNING: You must have specific authorization to access # this machine. Unauthorized users will be logged, # monitored, and then shot on site! # # Exemplo C Este é um exemplo de contas de sistema que eu deixo no arquivo /etc/passwd. Note que o campo senha contém "x" e não a senha criptografada. Senhas criptografadas estão armazenadas com segurança no arquivo /etc/shadow como resultado do comando "pwconv". root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin: daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:/var/adm: lp:x:4:7:lp:/var/spool/lpd: mail:x:8:12:mail:/var/spool/mail: uucp:x:10:14:uucp:/var/spool/uucp: nobody:x:99:99:Nobody:/: Exemplo D Este é um exemplo de /etc/ftpusers root bin daemon adm lp mail uucp nobody Exemplo E Este é um exemplo do arquivo /etc/sercuretty. tty1 tty2 tty3 tty4 ttyp1 -- > Note, esta entrada permite que um usuário remote faça o login como root. Normalmente, você NÃO vai querer esta entrada! Exemplo F Este é um exemplo de listas de controle de acesso para TCP Wrappers. A sintaxe é Service: Source (IP address, network, or name): : ALLOW or DENY Exemplo de /etc/hosts.allow in.telnetd: 192.168.1.0/255.255.255.0 : banners /etc/bannerfile : ALLOW in.ftpd: 192.168.1.30 :ALLOW imapd: ALL : spawn (/usr/local/bin/ids.sh %d %h %H %u) Exemplo de /etc/hosts.deny. Eu recomendo bastante que você sempre use este como seu arquivo /etc/hosts.deny. ALL: ALL DENY