Você está na página 1de 15

Reviso 1.

11

Checklist de segurana para servidores RedHat 5 / CentOS 5

04 Jan 2012 Vila Nova de Gaia, Porto Portugal.

Introduo Servidores baseados em RedHat e CentOS (verso gratuita do RedHat) instalam por padro diversos servios e pacotes desnecessrios, alm de uma configurao padro um tanto permissiva. Para isto criei este pequeno checklist ps-instalao para adicionar um pouco mais de segurana ao ambiente, alm de uma configurao bsica de firewall. Lembre-se de instalar o servidor utilizando apenas o grupo server, desabilite quaisquer interface grfica, alm de consumir memria, espao em disco e ser intil, instala diversos arquivos que podem vir a ser vulnerveis no sistema. Muitas destas dicas tambm trazem melhorias de desempenho e liberam recursos, principalmente memria, desativando servios desnecessrios. Vamos ao checklist:

1. Nunca utilize o super utilizador root diretamente, crie utilizadores comuns Devemos sempre evitar o compartilhamento da senha do super utilizador, e obrigatoriamente bloquear quaisquer uso direto do mesmo. Para isto, devemos primeiramente adicionar os utilizadores administradores do sistema. Isto deve-se ao fato de que quando se permite o acesso remoto como super utilizador, estamos vulnerveis a uma palavra passe apenas, alm de no termos muitas informaes registradas. Quando se utiliza utilizadores comuns que se tornam super utilizador, fica registrado quem utilizou e quando estes poderes.

2. Criar o utilizador de suporte muito importante ter um utilizador para o suporte, e ter o habito de mudar a password deste utilizador toda vez que realizar um procedimento neste servidor. Para criar um utilizador siga os passos abaixo: # adduser suporte # passwd suporte Changing password for user suporte. New UNIX password: 12345678 BAD PASSWORD: it is based on a dictionary word Retype new UNIX password: 12345678 passwd: all authentication tokens updated successfully. quando solicitado a password coloque 12345678. Obs.: tudo minsculo.

3. Alterando o algoritmo de criptografia de senhas Por padro, o RedHat/CentOS utilizam o algortimo de criptografia MD5 para guardar as senhas, o que considerado fraco. Voc pode utilizar SHA512, que um algortimo muito mais forte. Basta voc utilizar o comando abaixo, e alterar as senhas novamente dos usurios j existentes para recri-las: # authconfig --passalgo=sha512 update

4. Restringir o uso do comando su

Para uma melhor segurana do super usurio root, restrinja o uso do comando su apenas para usurios que esto no grupo wheel. Para isto, edite o arquivo /etc/pam.d/su e descomente (retire o sustenido, #) da linha: # auth required pam_wheel.so use_uid Lembre-se de possuir um usurio neste grupo antes de realizar este bloqueio. Para adicionar um usurio no grupo wheel, utilize o seguinte comando: # gpasswd -a UTILIZADOR wheel Para remover um usurio do grupo wheel, utilize o seguinte comando: # gpasswd -d UTILIZADOR wheel

5. Bloqueando recurso do SSH O servio de SSH bem antigo, e possui diversos recursos que so desnecessrios ou trazem uma relativa insegurana ao servio. Devemos forar o uso apenas da segunda verso do protocolo, no permitir usurios sem senha (senha em branco), autenticaes baseadas em host, acesso direto como super usurio e nos servidores, evitar a permisso de redirecionamento de trfego e redirecionamento X11. Para isto, devemos editar o arquivo /etc/ssh/sshd_config, alterando (ou adicionando, caso no existam) as seguintes configuraes:

Voc precisa instalar os seguintes pacotes (que so instalados por padro e at mesmo que voc a retirou ou ignorou enquanto realizava a instalao do CentOS GNU/Linux). openssh-clients: As aplicaes cliente OpenSSH openssh-server: O daemon do servidor OpenSSH Para instalar o pacote do servidor e o pacote do cliente execute os comandos abaixo; # yum -y install openssh-server openssh-clients Inicie o servio: # chkconfig sshd on

# service sshd start Medidas de segurana: edite /etc/ssh/sshd_config, para isto utilize o editor de sua preferencia: # vim /etc/ssh/sshd_config

Mudar a porta padro, ou seja fazer o ssh executar em uma porta no-padro como 3030; Port 3030 ( linha 13 ) Protoco 2,1

Para desabilitar o login do root, editar ou adicionar a seguinte linha: PermitRootLogin no ( retire o # descomente linha 39 ) HostbasedAuthentication no PermitEmptyPasswords no UsePrivilegeSeparation yes AllowTcpForwarding no X11Forwarding no StrictModes yes Outra opes que devem ser levada em considerao, mas que gera uma possvel manuteno posterior, a limitao dos usurios que podem utilizar este servio, atravs da opo AllowUsers. Ou seja, basta adicionar no arquivo de configurao: AllowUsers suporte user2 user3 ( incluir contexto na linha 42 ) Na ultima se estiver comentada, descomete, se no tiver, inclua o texto abaixo; Subsystem sftp /usr/libexec/openssh/sftp-server ( verifique a linha 120, se estiver comentada, remova o # descomente )

Guarde e feche o ficheiro. Depois de feita as alteraes, force a atualizao do servio utilizando o comando: # service sshd restart

6. Desabilite o acesso remoto a servios portmap Na grande maioria das vezes, no utilizamos o servio portmap, e o mesmo uma grande fonte de vulnerabilidades e por isto, iremos bloquear o acesso a ele. Primeiramente, iremos bloquear totalmente o acesso a este servio, editando o arquivo /etc/hosts.deny e adicionando a seguinte linha: portmap: ALL Agora liberamos o acesso apenas para o prprio servidor, ou seja, localhost, editando o arquivo /etc/hosts.allow e adicionando as seguintes linhas: portmap: localhost portmap: 127.0.0.1 portmap: 192.168.1.55 Caso voc utilize este servio, adicione no arquivo de permisses o endereo e o IP do cliente.

7. Remover servios desnecessrios A seguinte lista de servios deve ser removido, e claro que voc deve ajustar esta lista para contemplar a sua necessidade: NetworkManager NetworkManagerDispatacpid apmd autofs avahi-daemon avahi-dnsconfd bluetooth conman cpuspeed cups dc_client dc_server dhcdbd dund firstboot gpm haldaemon hidd ibmasm ip6tables ipmi irda irqbalance kdump kudzu mcstrans mdmonitor mdmpd microcode_ctl

netfs netplugd nfs nfslock nscd oddjobd pand pcscd portmap rdisc restorecond rpcgssd rpcidmapd rpcsvcgssd saslauthd setroubleshoot smartd smb squid tux winbind wpa_supplicant xfs ypbind yum-updatesd Crie um arquivo (por exemplo, servicos-a-remover.txt) contendo a lista que deve ser removida, e utilize o seguinte script para facilitar o trabalho: # for srv in $(cat servicos-a-remover.txt); do service $srv stop; chkconfig $srv off; done Muitos servios podem apresentar erro, por no estarem inicializados ou mesmo instalados, ou seja, no se preocupe com as mensagens de erro.

8. Remova pacotes desnecessrios A seguinte lista de pacotes devem ser removidos, e claro que voc deve ajustar esta lista para contemplar a sua necessidade: acpid alsa-lib alsa-utils apmd bluez-gnome centos-release-notes cpuspeed dos2unix dosfstools

esound finger firstboot-tui GConf2 gnome-mime-data gnome-mount gnome-python2-bonobo gnome-python2-canvas gnome-python2-extras gnome-python2-gconf gnome-python2-gnomevfs gnome-python2-gtkhtml2 gpm hicolor-icon-theme metacity NetworkManager nfs-utils OpenIPMI OpenIPMI-libs portmap redhat-menus samba samba-client samba-common subversion system-config-display system-config-kdump system-config-network system-config-nfs system-config-samba system-config-securitylevel system-config-soundcard talk tux xkeyboard-config xorg-x11-drv-evdev xorg-x11-drv-keyboard xorg-x11-drv-mouse xorg-x11-drv-vesa xorg-x11-drv-void xorg-x11-filesystem xorg-x11-fonts-base xorg-x11-server-utils xorg-x11-server-Xnest xorg-x11-server-Xorg xorg-x11-server-Xvfb xorg-x11-utils xorg-x11-xauth xorg-x11-xfs xorg-x11-xinit xorg-x11-xkb-utils ypbind yp-tools

Crie um arquivo (por exemplo, pacotes-a-remover.txt) contendo a lista que deve ser removida, e utilize o seguinte script para facilitar o trabalho:

# for pkg in $(cat pacotes-a-remover.txt); do rpm -e $pkg; done

Muitos pacotes podem no ser removidos por existirem dependncia, ou nem estarem instalados.

9. Resoluo de nomes de mquinas Voc deve certificar-se que o prprio servidor est listado no arquivo de hosts, relacionando o mesmo a localhost e IP 127.0.0.1. Edite o arquivo /etc/hosts e localizando a seguinte linha: 127.0.0.1 SERVIDOR.DOMINIO SERVIDOR localhost.localdomain localhost Caso no esteja listado, adicione. Edite tambm o arquivo /etc/host.conf e altere a ordem de pesquisa para respeitar primeiramente o arquivo de hosts local, depois utilizar o DNS externo. Alm disto, devemos habilitar o retorno de mltiplas respostas e a proteo de spoof. O arquivo deve ficar assim:

order hosts,bind multi on nospoof on A proteo contra spoof funciona realizando uma pesquisa do endereo retornado pela pesquisa de reversa de IP, e caso estes no combinem, a resposta descartada.

10. Caso voc no utilize IPv6, desabilite o mesmo A utilizao de IPv6 em servidores que no o utilizam apenas utiliza recursos. Para desabilitar, altere o arquivo /etc/sysconf/network e altere a opo NETWORKING_IPV6 para no:

NETWORKING_IPV6=no Crie o arquivo /etc/modprobe.d/disable-ipv6, e caso seu RedHat ou CentOS seja verso 5.3 ou anterior, inclua o seguinte contedo: alias ipv6 off alias net-pf-10 off

Caso seja verso 5.4 ou superior, inclua o seguinte contedo:

options ipv6 disable=1 Caso o servidor ainda no esteja em produo, aconselhvel a reinicializao do mesmo para que todos os servios inicializem sem suporte a IPv6. Vale lembrar que no estou sendo contra a utilizao de IPv6, pelo contrrio, creio ser o futuro da Internet, e apoio toda e qualquer iniciativa para sua utilizao, apenas no devemos habilit-lo se no formos utilizar.

11. Caso voc possua partio separada para /tmp e /home interessante alterar o arquivo /etc/fstab e alterar as opes para a montagem destes diretrios alterando a opo de default para as opes noexec,nodev,nosuid. Elas bloqueiam a execuo de quaisquer arquivo nestes pontos de montagem, evita tambm a utilizao de arquivos suid root e a criao e utilizao de arquivos de dispositivos. Aqui segue um exemplo de como uma configurao padro no /etc/fstab: /dev/VolGroup00/LogVol01 /tmp /dev/VolGroup00/LogVol02 /home E como deve ficar aps a alterao: /dev/VolGroup00/LogVol01 /tmp /dev/VolGroup00/LogVol02 /home ext3 ext3 noexec,nodev,nosuid noexec,nodev,nosuid 11 11 ext3 ext3 defaults defaults 11 11

Para remontar novamente estas parties sem reinicializar o servidor, utilize o comando: mount -o remount /tmp mount -o remount /home

12. Desabilite consoles desnecessrios Edite o arquivo /etc/inittab e desabilite os consoles de 3 a 6, comentando ou removendo as seguintes linhas: 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6

Para forar as alteraes realizadas, utilize o comando:

# telinit q

13. Habilite o sincronismo de hora Manter os relgios dos servidores sincronizados essencial para a boa sade dos seus sistemas, e mais ainda para a sade mental do auditor (e do tcnico que vai escrever um relatrio para ele) em caso de auditorias. No necessrio possuir um servidor NTP em sua rede, visto que hoje em dia as conexes de internet so muito confiveis e rpidas, podemos utilizar o prprio pool de servidores do ntp.org. Verifique se o pacote ntp est instalado, utilizando o comando:

# rpm -qi ntp Se retornar a mensagem package ntp is not installed, voc ter que instalar o pacote, utilizando o seguinte comando:

# yum install ntp

Uma vez instalado, edite o arquivo /etc/ntp.conf, e confira se a lista de servidores est habilitada. No caso do CentOS, a lista de servidores utilizada : server 0.centos.pool.ntp.org server 1.centos.pool.ntp.org server 2.centos.pool.ntp.org E no RedHat, utiliza-se os seguintes servidores: server 0.rhel.pool.ntp.org server 1.rhel.pool.ntp.org server 2.rhel.pool.ntp.org Antes de habilitar o servio, sincronize o relgio do servidor, utilizando o comando (troque o servidor para centos ou rhel, dependendo do seu caso): # ntpdate 0.centos.pool.ntp.org Depois habilite o servio de NTP, utilizando os comandos: # service ntpd start # chkconfig ntpd on Voc pode eleger um servidor da sua rede para manter o sincronismo com servidores do ntp.org, e ele propagar este servio para sua rede de servidores. Para isto, voc deve incluir o endereo da sua rede no arquivo /etc/ntp.conf,

adicionando a seguinte informao:

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap Alterando a rede e a mscara para a sua configurao. Lembre-se de reinicializar o servio caso tenha alterado. Nos outros servidores da sua rede, comente ou remova os servidores externos, e adicione o IP do seu servidor NTP. Para testar, pode utilizar o mesmo comando ntpdate com o IP do seu servidor como parmetro.

14. Escondendo informaes no servidor HTTP Se voc utiliza Apache 2 (servio httpd), interessante alterar a configurao do servidor para que no exponha que voc utiliza certa verso do Linux (RedHat, CentOS, ou outros). Edite o arquivo /etc/httpd/conf/httpd.conf, localize a opo ServerTokens, altere para ProductOnly, e caso no exista esta opo, apenas adicione no contexto global, ficando assim:

ServerTokens ProductOnly Se voc utiliza PHP, desabilite a exposio da informao de verso do PHP, e tambm a informao que voc possui PHP habilitado. Edite o arquivo /etc/php.ini, localize a opo expose_php e altere para Off, ficando assim:

expose_php = Off Lembre-se tambm de nunca habilitar mensagens de erro em servidores de produo, pois estas mensagens expe a estrutura organizacional de arquivos do seu servidor, alm de outras informaes que podem ser utilizadas para realizar ataques ao servidor. Procure sempre que possvel utilizar a restrio de diretrios do PHP atravs da opo open_basedir e desabilitar funes e classes que possam executar binrios ou alterar processos atravs das opes: disable_functions e disable_classes

15. Filtrando spoof e combinaes TCP invlidas Devemos filtrar quaisquer trfego recebido com IPs da rede 127.0.0.0/8 que no seja na interface loopback (lo), e combinaes de flags TCP invlidas. Para isto, utilize os comandos: /sbin/iptables -N logspoof /sbin/iptables -A logspoof -m limit --limit 3/min --limit-burst 3 -j LOG --logprefix "Spoofed: " --log-level info /sbin/iptables -A logspoof -j DROP

/sbin/iptables -N logflags /sbin/iptables -A logflags -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "TCP Flags: " --log-level info /sbin/iptables -A logflags -j DROP /sbin/iptables -A INPUT -d 127.0.0.0/8 -i ! lo -j logspoof /sbin/iptables -A INPUT -s 127.0.0.0/8 -i ! lo -j logspoof /sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j tcpflags /sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j tcpflags /sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j tcpflags /sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j tcpflags /sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j tcpflags /sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j tcpflags /sbin/iptables -A OUTPUT -d 127.0.0.0/8 -o ! lo -j logspoof /sbin/iptables -A OUTPUT -s 127.0.0.0/8 -o ! lo -j logspoof /sbin/iptables -A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j tcpflags /sbin/iptables -A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j tcpflags /sbin/iptables -A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j tcpflags /sbin/iptables -A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j tcpflags /sbin/iptables -A OUTPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j tcpflags /sbin/iptables -A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j tcpflags Para que as alteraes feitas no iptables sejam mantidas quando reinicializado o servidor, devemos grav-las utilizando o seguinte comando: service iptables save

16. Bloqueando trfego de redes privadas Por que permitir trfego de redes privadas (listadas na RFC 1918 [1]) em servidores com trfego exclusivo de internet? Para bloquear este trfego, utilize: /sbin/iptables -N loginternal /sbin/iptables -A loginternal -m limit --limit 3/min --limit-burst 3 -j LOG --logprefix "Private network: " --log-level info /sbin/iptables -A loginternal -j DROP /sbin/iptables -A INPUT -d 10.0.0.0/8 -j loginternal /sbin/iptables -A INPUT -s 10.0.0.0/8 -j loginternal /sbin/iptables -A INPUT -d 192.168.0.0/16 -j loginternal /sbin/iptables -A INPUT -s 192.168.0.0/16 -j loginternal /sbin/iptables -A INPUT -d 172.16.0.0/12 -j loginternal

/sbin/iptables -A INPUT -s 172.16.0.0/12 -j loginternal /sbin/iptables -A OUTPUT -d 10.0.0.0/8 -j loginternal /sbin/iptables -A OUTPUT -s 10.0.0.0/8 -j loginternal /sbin/iptables -A OUTPUT -d 192.168.0.0/16 -j loginternal /sbin/iptables -A OUTPUT -s 192.168.0.0/16 -j loginternal /sbin/iptables -A OUTPUT -d 172.16.0.0/12 -j loginternal /sbin/iptables -A OUTPUT -s 172.16.0.0/12 -j loginternal Lembre-se de gravar as alteraes realizadas no firewall utilizando o comando:

# service iptables save

17. Bloqueando ataques de fora bruta Hoje em dia, ataques de fora bruta contra servios tipo SSH so extremamente comuns. Este tipo de ataque cessa caso o servidor pare de responder. Utilizando iptables, podemos criar uma regra para registrar e bloquear temporariamente o IP que acessar mais de 3 vezes com intervalos menores que 1 minuto este servio (ou outros, como FTP). Para tal, utilize os seguintes comandos: /sbin/iptables -N logforce /sbin/iptables -A logforce -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "Brute force: " --log-level info /sbin/iptables -A logforce -j DROP /sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource /sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource -j logforce O tempo de bloqueio o mesmo tempo de intervalo mximo entre as tentativas, que neste caso de 1 minuto (60 segundos). No custa lembrar novamente de salvar as alteraes realizadas no firewall utilizando o comando:

# service iptables save

18. Limitando tipos de pacotes ICMP Devemos restringir os tipos de pacote ICMP recebidos pelo servidor. Os pacotes que devemos permitir, so: 0: Resposta a echo (echo-reply); 3: Destino inalcanvel (destination-unreachable); 8: Requisio de ping (echo-request), limitando a 1 por segundo; 11: Tempo limite excedido (time-limit-exceeded). Utilize os seguintes comandos para restringir os pacotes ICMP, e registrar os demais: /sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT /sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT /sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT /sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT /sbin/iptables -A INPUT -p icmp -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "ICMP: " --log-level info /sbin/iptables -A INPUT -p icmp -j DROP No custa lembrar novamente de salvar as alteraes realizadas no firewall utilizando o comando: # service iptables save

19. Firewall restritivo extremamente aconselhvel que voc utilize o firewall em modo restritivo, ou seja, o descarte de pacotes sendo o padro, e habilitando o acesso aos servios aos clientes ou redes que devem acess-los. Este tipo de configurao normalmente requer um maior conhecimento na manuteno e utilizao de firewalls com iptables, mas vale o esforo. Vale lembrar que o arquivo padro de iptables no RedHat/CentOS fica em /etc/sysconfig/iptables. Caso voc altere manualmente e quiser carregar as alteraes, utilize o seguinte comando: # service iptables start

Sempre que voc alterar alguma configurao atravs do comando iptables, e quiser manter esta configurao mesmo aps a reinicializao do servidor, utilize o seguinte comando: # service iptables save

Para transformar seu firewall em restritivo, habilitando acesso somente as portas 22 e 80 TCP, utilize os seguintes comandos: /sbin/iptables -P INPUT DROP /sbin/iptables -P FORWARD DROP /sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT /sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT interessantes neste caso liberar todo acesso atravs da interface de loopback (lo). Para isto, utilize os seguintes comandos: /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A OUTPUT -o lo -j ACCEPT Caso voc queira registrar tentativas de conexo a quaisquer outra porta que no esteja habilitada, utilize o seguinte comando: /sbin/iptables -A INPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "Dropped: " --log-level info Se for adicionado outras regras de permisso aps este comando, deve-se alterar manualmente o arquivo de regras e posicion-la como ltima regra de entrada, caso contrrio ir registrar todos pacotes de regras que estiverem abaixo dela tambm. Por enquanto estas so as dicas que conheo, e com o tempo vou alterando este artigo para atualizaes ou incluso de novas dicas. Caso voc tenha uma dica para incluir, envie como comentrio que ser muito bem vindo! Histrico 1.0 13/Dez/2010 Primeira verso. 1.1 14/Dez/2010 Adicionado item sobre Apache e PHP. 1.2 20/Dez/2010 Adicionado item sobre algortimo de criptografia de senhas. 1.3 04/Jan/2012 Adicionado criar utilizador Fonte Professor Especialista Angelo de Barros Delphini Endereos neste artigo: [1] RFC 1918: http://www.ietf.org/rfc/rfc1918.txt

Você também pode gostar