Preparando seu Linux Box para a Internet
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.
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
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.
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 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:
/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.
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.
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.
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.
Estes são exemplos do artigo "Protegendo seu Linux"
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,
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!
#
#
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:/:
Este é um exemplo de /etc/ftpusers
root
bin
daemon
adm
lp
mail
uucp
nobody
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!
Este é um exemplo de listas de controle de acesso para TCP Wrappers. A sintaxe é
Service: Source (IP address, network, or name):
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