novembro 2017
D S T Q Q S S
« ago    
 1234
567891011
12131415161718
19202122232425
2627282930  

Checklist de segurança para servidores RedHat/CentOS 5

Servidores baseados em RedHat e CentOS (versão gratuita do RedHat) instalam por padrão diversos serviços e pacotes desnecessários, além de uma configuração padrão um tanto permissiva. Para isto criei este pequeno checklist pós-instalação para adicionar um pouco mais de segurança ao ambiente, além de uma configuração básica de firewall. Lembre-se de instalar o servidor utilizando apenas o grupo server, desabilite quaisquer interface gráfica, além de consumir memória, espaço em disco e ser inútil, instala diversos arquivos que podem vir a ser vulneráveis no sistema.

Muitas destas dicas também trazem melhorias de performance e liberam recursos, principalmente memória, desativando serviços desnecessários.

Vamos ao checklist:

  1. Nunca utilize o super usuário root diretamente, crie usuários comuns:
    Devemos sempre evitar o compartilhamento da senha do super usuário, e obrigatoriamente bloquear quaisquer uso direto do mesmo. Para isto, devemos primeiramente adicionar os usuários administradores do sistema. Isto deve-se ao fato de que quando se permite o acesso remoto como super usuário, estamos vulneráveis a uma senha apenas, além de não termos muitas informações registradas. Quando se utiliza usuários comuns que se tornam super usuários, fica registrado quem utilizou e quando estes poderes.
  2. Alterando o algoritmo de criptografia de senhas
    Por padrão, o RedHat/CentOS utilizam o algorítimo de criptografia MD5 para guardar as senhas, o que é considerado fraco. Você pode utilizar SHA512, que é um algorítimo muito mais forte. Basta você utilizar o comando abaixo, e alterar as senhas novamente dos usuários já existentes para recriá-las:

    authconfig --passalgo=sha512 --update
  3. Restringir o uso do comando “su”:
    Para uma melhor segurança do super usuário root, restrinja o uso do comando “su” apenas para usuários que estão no grupo wheel. Para isto, edite o arquivo /etc/pam.d/su e descomente (retire o sustenido, a.k.a. #) a linha:

    auth		required	pam_wheel.so use_uid

    Lembre-se de possuir um usuário neste grupo antes de realizar este bloqueio. Para adicionar um usuário no grupo wheel, utilize o seguinte comando:

    gpasswd -a USUÁRIO wheel

    Para remover um usuário do grupo wheel, utilize o seguinte comando:

    gpasswd -d USUÁRIO wheel
  4. Bloqueando recursos do SSH:
    O serviço de SSH é bem antigo, e possui diversos recursos que são desnecessários ou trazem uma relativa insegurança ao serviço. Devemos forçar o uso apenas da segunda versão do protocolo, não permitir usuários sem senha (senha em branco), autenticações baseadas em host, acesso direto como super usuário e nos servidores, evitar a permissão de redirecionamento de tráfego e redirecionamento X11. Para isto, devemos editar o arquivo /etc/ssh/sshd_config, alterando (ou adicionando, caso não existam) as seguintes configurações:

    Protocol 2
    HostbasedAuthentication no
    PermitRootLogin no
    PermitEmptyPasswords no
    UsePrivilegeSeparation yes
    AllowTcpForwarding no
    X11Forwarding no
    StrictModes yes

    Outra opções que devem ser levada em consideração, mas que gera uma possível manutenção posterior, é a limitação dos usuários que podem utilizar este serviço, através da opção AllowUsers. Ou seja, basta adicionar no arquivo de configuração:

    AllowUsers FULANO BELTRANO CICLANO...

    Depois de feita as alterações, force a atualização do serviço utilizando o comando:

    service sshd reload
  5. Desabilite o acesso remoto a serviços portmap:
    Na grande maioria das vezes, não utilizamos o serviço 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 serviço, editando o arquivo /etc/hosts.deny e adicionando a seguinte linha:

    portmap:	ALL

    Agora liberamos o acesso apenas para o próprio servidor, ou seja, localhost, editando o arquivo /etc/hosts.allow e adicionando as seguintes linhas:

    portmap:	localhost
    portmap:	127.0.0.1

    Caso você utilize este serviço, adicione no arquivo de permissões o endereço e o IP do cliente.

  6. Remover serviços desnecessários:
    A seguinte lista de serviços 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 serviços podem apresentar erro, por não estarem inicializados ou mesmo instalados, ou seja, não se preocupe com as mensagens de erro.

  7. Remova pacotes desnecessários:
    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 não ser removidos por existirem dependência, ou nem estarem instalados.

  8. Resolução de nomes de máquinas:
    Você deve certificar-se que o próprio 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 não esteja listado, adicione. Edite também o arquivo /etc/host.conf e altere a ordem de pesquisa para respeitar primeiramente o arquivo de hosts local, depois utilizar o DNS externo. Além disto, devemos habilitar o retorno de múltiplas respostas e a proteção de spoof. O arquivo deve ficar assim:

    order hosts,bind
    multi on
    nospoof on

    A proteção contra spoof funciona realizando uma pesquisa do endereço retornado pela pesquisa de reversa de IP, e caso estes não combinem, a resposta é descartada.

  9. Caso você não utilize IPv6, desabilite o mesmo:
    A utilização de IPv6 em servidores que não o utilizam apenas utiliza recursos. Para desabilitar, altere o arquivo /etc/sysconf/network e altere a opção NETWORKING_IPV6 para no:

    NETWORKING_IPV6=no

    Crie o arquivo /etc/modprobe.d/disable-ipv6, e caso seu RedHat ou CentOS seja versão 5.3 ou anterior, inclua o seguinte conteúdo:

    alias ipv6 off
    alias net-pf-10 off

    Caso seja versão 5.4 ou superior, inclua o seguinte conteúdo:

    options ipv6 disable=1

    Caso o servidor ainda não esteja em produção, é aconselhável a reinicialização do mesmo para que todos os serviços inicializem sem suporte a IPv6.
    Vale lembrar que não estou sendo contra a utilização de IPv6, pelo contrário, creio ser o futuro da Internet, e apoio toda e qualquer iniciativa para sua utilização, apenas não devemos habilitá-lo se não formos utilizar.

  10. Caso você possua partição separada para /tmp e /home:
    É interessante alterar o arquivo /etc/fstab e alterar as opções para a montagem destes diretórios alterando a opção de default para as opções noexec,nodev,nosuid. Elas bloqueiam a execução de quaisquer arquivo nestes pontos de montagem, evita também a utilização de arquivos suid root e a criação e utilização de arquivos de dispositivos.
    Aqui segue um exemplo de como é uma configuração padrão no /etc/fstab:

    /dev/VolGroup00/LogVol01 /tmp                       ext3    defaults        1 1
    /dev/VolGroup00/LogVol02 /home                      ext3    defaults        1 1

    E como deve ficar após a alteração:

    /dev/VolGroup00/LogVol01 /tmp                       ext3    noexec,nodev,nosuid        1 1
    /dev/VolGroup00/LogVol02 /home                      ext3    noexec,nodev,nosuid        1 1

    Para remontar novamente estas partições sem reinicializar o servidor, utilize o comando:

    mount -o remount /tmp
    mount -o remount /home
  11. Desabilite consoles desnecessários:
    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 forçar as alterações realizadas, utilize o comando:

    telinit q
  12. Habilite o sincronismo de hora:
    Manter os relógios dos servidores sincronizados é essencial para a boa saúde dos seus sistemas, e mais ainda para a saúde mental do auditor (e do técnico que vai escrever um relatório para ele) em caso de auditorias. Não é necessário possuir um servidor NTP em sua rede, visto que hoje em dia as conexões de internet são muito confiáveis e rápidas, podemos utilizar o próprio 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 serviço, sincronize o relógio 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 serviço 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 serviço para sua rede de servidores. Para isto, você deve incluir o endereço da sua rede no arquivo /etc/ntp.conf, adicionando a seguinte informação:

    restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap

    Alterando a rede e a máscara para a sua configuração. Lembre-se de reinicializar o serviço 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 parâmetro.

  13. Escondendo informações no servidor HTTP
    Se você utiliza Apache 2 (serviço httpd), é interessante alterar a configuração do servidor para que não exponha que você utiliza certa versão do Linux (RedHat, CentOS, ou outros). Edite o arquivo /etc/httpd/conf/httpd.conf, localize a opção ServerTokens, altere para ProductOnly, e caso não exista esta opção, apenas adicione no contexto global, ficando assim:

    ServerTokens ProductOnly

    Se você utiliza PHP, desabilite a exposição da informação de versão do PHP, e também a informação que você possui PHP habilitado. Edite o arquivo /etc/php.ini, localize a opção expose_php e altere para Off, ficando assim:

    expose_php = Off

    Lembre-se também de nunca habilitar mensagens de erro em servidores de produção, pois estas mensagens expõe a estrutura organizacional de arquivos do seu servidor, além de outras informações que podem ser utilizadas para realizar ataques ao servidor. Procure sempre que possível utilizar a restrição de diretórios do PHP através da opção open_basedir e desabilitar funções e classes que possam executar binários ou alterar processos através das opções disable_functions e disable_classes.

  14. Filtrando spoof e combinações TCP inválidas:
    Devemos filtrar quaisquer tráfego recebido com IP’s da rede 127.0.0.0/8 que não seja na interface loopback (lo), e combinações de flags TCP inválidas. Para isto, utilize os comandos:

    /sbin/iptables -N logspoof
    /sbin/iptables -A logspoof -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "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 alterações feitas no iptables sejam mantidas quando reinicializado o servidor, devemos gravá-las utilizando o seguinte comando:

    service iptables save
  15. Bloqueando tráfego de redes privadas:
    Por que permitir tráfego de redes privadas (listadas na RFC 1918) em servidores com tráfego exclusivo de internet? Para bloquear este tráfego, utilize:

    /sbin/iptables -N loginternal
    /sbin/iptables -A loginternal -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "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 alterações realizadas no firewall utilizando o comando:

    service iptables save
  16. Bloqueando ataques de força bruta:
    Hoje em dia, ataques de força bruta contra serviços tipo SSH são 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 serviço (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 máximo entre as tentativas, que neste caso é de 1 minuto (60 segundos). Não custa lembrar novamente de salvar as alterações realizadas no firewall utilizando o comando:

    service iptables save
  17. Limitando tipos de pacotes ICMP:
    Devemos restringir os tipos de pacote ICMP recebidos pelo servidor. Os pacotes que devemos permitir, são:

    • 0: Resposta a echo (echo-reply);
    • 3: Destino inalcançável (destination-unreachable);
    • 8: Requisição 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

    Não custa lembrar novamente de salvar as alterações realizadas no firewall utilizando o comando:

    service iptables save
  18. Firewall restritivo:
    É extremamente aconselhável que você utilize o firewall em modo restritivo, ou seja, o descarte de pacotes sendo o padrão, e habilitando o acesso aos serviços aos clientes ou redes que devem acessá-los. Este tipo de configuração normalmente requer um maior conhecimento na manutenção e utilização de firewall’s com iptables, mas vale o esforço.
    Vale lembrar que o arquivo padrão de iptables no RedHat/CentOS fica em /etc/sysconfig/iptables. Caso você altere manualmente e quiser carregar as alterações, utilize o seguinte comando:

    service iptables start

    Sempre que você alterar alguma configuração através do comando iptables, e quiser manter esta configuração mesmo após a reinicialização 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 através 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 conexão a quaisquer outra porta que não 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 permissão após este comando, deve-se alterar manualmente o arquivo de regras e posicioná-la como última regra de entrada, caso contrário irá registrar todos pacotes de regras que estiverem abaixo dela também.

Por enquanto estas são as dicas que conheço, e com o tempo vou alterando este post para atualizações ou inclusão de novas dicas. Caso você tenha uma dica para incluir, envie como comentário que será muito bem vindo!

Histórico:

  • 1.0 – 13/Dez/2010 – Primeira versão.
  • 1.1 – 14/Dez/2010 – Adicionado item sobre Apache e PHP.
  • 1.2 – 20/Dez/2010 – Adicionado item sobre algorítimo de criptografia de senhas.

2 comentários para Checklist de segurança para servidores RedHat/CentOS 5

  • Rodrigo Mangini

    Excelente artigo, fundamental para quem quer montar um servidor seguro, e com um pouco de estudo dá pra adaptar pra outras distribuições, valeu …

  • cara, excepcional esse artigo, muito bom para quem precisa montar um servidor seguro como eu e não tem tanta experiência em linux.
    obrigado!