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 remoto 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

1