Como instalar PRM (Process Resource Monitor)

O que é e como funciona PRM (Process Resource Monitor) ?

Em poucas palavras:

PRM monitora a tabela de processos ativos. Caso algum destes processos ultrapasse o recurso definido (memória, cpu ou numero de processos), um e-mail é enviado ao administrador e como opção o processo é interrompido.”Killado”.

As configurações do prm no arquivo “conf.prm” irão determinar algumas ações do PRM. Na pasta rules alguns processo são tratados separadamente com definições particulares aos mesmos.

O PRM (Process Resource Monitor) é  sem duvida alguma muito util para evitar alguns tipos de abusos e principalmente sobrecargas desnecessárias ao servidor.
Vamos a instalação:

No SSH root, faça o download do PRM:

 wget http://www.rfxnetworks.com/downloads/prm-current.tar.gz

Descompacte o arquivo:

 tar xvfz prm-current.tar.gz

Acesse a pasta e instale:

cd prm-0.5/
./install.sh

Neste ponto o PRM já estará instalado, agora vamos configurá-lo:

Edite o arquivo de configuração:

pico /usr/local/prm/conf.prm

Na opção:

# enable kernel logging [0=disabled,1=enabled]
USE_KLOG="0"

Mude para:

# enable kernel logging [0=disabled,1=enabled]
USE_KLOG="1"

Na opção:

# enable user e-mail alerts [0=disabled,1=enabled]
USR_ALERT="0"

Mude para:

# enable user e-mail alerts [0=disabled,1=enabled]
USR_ALERT="1"

**A função USR_ALERT “1” irá habilitar o envio de e-mails de alerta ao Administrador caso algum processo ultrapasse o recurso definido.

Em:

# e-mail address for alerts
USR_ADDR="root"

Mude para:

# e-mail address for alerts
USR_ADDR="seuemail@dominio.com.br"

Na maioria das situações não será necessário fazer nenhuma outra modificação, abaixo estarei apenas fazendo uma descrição das funções (apesar de algumas serem bastante óbvias)

# path to user e-mail message file
USR_MSG="$INSPATH/usr.msg"

Este é o caminho do template para o “corpo do e-mail” de alerta que será enviado ao administrador.

# subject of e-mail alerts
SUBJ="Process status report from $HOSTNAME"

Este será o assunto do e-mail de alerta enviado ao administrador.
(A variável $HOSTNAME irá retornar o hostname de seu servidor.)

# check 5,10,15 minute load average. [1,2,3 respective of 5,10,15]
LC="1"

Este será o tempo que o PRM irá verificar o numero de processos ativos. Sendo:
1 = 5 minutos
2 = 10 minutos
3 = 15 minutos

# min load level required to run (decimal values unsupported)
MIN_LOAD="1"

Esta opção define o load mínimo para que o PRM seja ativado.

# seconds to wait before rechecking a flaged pid (pid's noted resource
# intensive but not yet killed).
WAIT="12"

Segundos para aguardar uma nova “rechecagem” de pids dos processos ativos.

# counter limit that a process must reach prior to kill. the counter value
# increases for a process flaged resource intensive on rechecks.
KILL_TRIG="3"

Limite que um processo precisa ser executado para que as regras do PRM sejam checadas.

# argument to pass onto kill commands
KARG="9"

Qual o argumento para o comando kill (padrão e recomendado 9).

# Max CPU usage readout for a process - % of all cpu resources (decimal values unsupported)
MAXCPU="40"

Máximo de CPU (em percentual) para iniciar a leitura das regras

# Max MEM usage readout for a process - % of system total memory (decimal values unsupported)
MAXMEM="20"

Máximo de Memoria (em percentual) para iniciar a leitura das regras

# Max processes for a given command - this is not max processes for user but rather the executable
MAXPS="25"

Máximo de processos para iniciar a leitura das regras.

Para finalizar , salve (ctrl+x y ) e saia do pico.

Germano P Ferreira
Administrador Linux

Como saber o numero de conexões ao servidor por ip

Esta é uma dica muito simples, porém acredito ser muito útil quando desejamos saber o numero de conexões ativas no servidor e assim killar possíveis abusos.

Digite no prompt de comando :

netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Você verá uma lista como esta:

2 xx.xx.xxx.xxx.1
5 xx.xx.xxx.xxx.2
8 xx.xx.xxx.xxx.3
12 xx.xx.xxx.xxx.4
16 xx.xx.xxx.xxx.6
...

Sendo:
xxx. será o ip cliente e o numero antes do ip é referente ao numero de conexões em seu servidor.

Germano P Ferreira
Administrador Linux

Como criar um alerta por e-mail ao acessar o SSH como root ?

Abaixo vamos criar um alerta que será enviado a sua conta de e-mail toda vez que alguém efetuar login no SSH como root em seu servidor.

Efetue login no SSH de seu servidor como root.

Edite o arquivo .bashrc

pico /root/.bashrc

Após a ultima linha cole o texto abaixo modicando SeuServidor para Nome do Seu Servidor , e voce@seudominio
pelo seu e-mail :

echo 'ALERT - Acesso ao Root (SeuServidor) em:' `date` `who` | mail -s "Alerta: Acesso ao root por `who | cut -d"(" -f2 | cut -d")" -f1`" voce@seudominio

Salve e saia do pico( ctrl+x e y).

Feito. Quando alguém efetuar login em seu ssh como root, você receberá um e-mail informando o nome do servidor, IP de quem efetuou o login, hora e data.

Muito simples e sem duvida bastante util 🙂

Germano Pires Ferreira
Administrador Linux

Como instalar BFD (Brute Force Detection)

BFD é uma ótima excelente solução para detectar e bloquear ataques do tipo “Brutal Force”

**Importante: Certifique-se de ter instalado e configurado o APF Firewall antes de instalar o BFD.

Abaixo vamos abordar a instalação e configuração deste simples porém muito util sistema.

Conecte no SSH de seu servidor como root:

cd /root/
wget http://www.rfxnetworks.com/downloads/bfd-current.tar.gz
tar -xvzf bfd-current.tar.gz
cd bfd-0.9
./install.sh

Após a instalação, vamos ao arquivo de configuração:

pico /usr/local/bfd/conf.bfd

Localize:

ALERT_USR="0"

mude para:

ALERT_USR="1"

Localize:

EMAIL_USR="root"

mude para:

EMAIL_USR="voce@dominio.com"

Salve e saia do pico (ctrl+x e y)

Para iniciar o bfd:

bfd -s

Germano P Ferreira
Administrador Linux

Como corrigir dns recursivo aberto

Uma vulnerabilidade bastante comum e que abre a possibilidade de alguns tipos de ataques, são as “Open DNS” para consultas externas.

Possíveis Riscos com “DNS Recursivo Aberto”:

• Ser vítima de ataques de envenenamento de cache (cache poisoning), que levam o servidor recursivo a armazenar informações forjadas. Tais informações podem ser usadas para comprometer a segurança de clientes que façam consultas a esse servidor.
• Ter esse servidor abusado por atacantes e utilizado para desferir ataques de negação de serviço distribuídos (DDoS), que podem implicar nas seguintes conseqüências:

– o grande número de consultas DNS forjadas recebidas e, principalmente, a quantidade de respostas grandes enviadas para a vítima, podem consumir uma quantidade considerável de banda da rede com um servidor DNS recursivo aberto;
– dependendo do contrato do provedor de conectividade, a rede com o DNS aberto sendo abusado pode ser co-responsabilizada em caso de ataque de negação de serviço contra terceiros.

Para verificar se este é o seu caso, vá em

http://www.intodns.com e digite um domínio no servidor que deseja verificar.

Se estiverem abertas, você irá ver um alerta em vermelho “Open DNS”

Para corrigir este problema siga os passos abaixo:

Efetue login como root em seu servidor pleo SSH e edite o named:

pico /etc/named.conf

Procure por:

key "rndckey" {

};

Após este código acima de options { insira:

acl "trusted" {
xxx.xxx.xxx;
xxx.xxx.xxx;
xxx.xxx.xxx;
127.0.0.1
};

onde xxx são os números de seus servidores de DNS, geralmente definidos no arquivo /etc/nameserverips

Dentro de “options {”
abaixo de:

// query-source address * port 53;

coloque o seguinte:

version "Servidor DNS Seguro";
allow-recursion { trusted; };
allow-notify { trusted; };
allow-transfer { trusted; };

Salve e feche o editor ( ctrl+x e y)

Agora, reinicie seu servidor DNS

service named restart

Se você utiliza um firewall deixe aberta a porta 53 tanto para udp quanto para tcp.

Germano P. Ferreira
Administrador Linux

Como instalar Nobody Check

Utilizar boas regras no mod_security é indispensável, porém infelizmente só isso não resolve o problema de processos maliciosos no apache devido a falhas de segurança de scripts/sistemas de clientes.

Abaixo, abordarei a instalação e configuração do nobody check, que irá ajudar bastante a manter a segurança do Apache e kilar o processo quando encontrado.

1- Efetue login em seu servidor pelo SSH.

2- Baixe o instalador

wget http://www.webhostgear.com/projects/nobodycheck/install.sh

3- Transformando install em executável

chmod +x install.sh

4 – Instalando e removendo o instalador

./install.sh
rm -f install.sh

Neste tempo, o nobody check já está instalado , agora vamos configurá-lo.

5- Editando as configurações:

pico /usr/local/nobody_check/nc.conf

Digite entre as aspas a conta de e-mail que irá receber os alertas:

to= "email@dominiodousuario.com"

em killproc mude para 1, desta forma o processo malicioso será interrompido.

Em loglvl deixe 1 para que seja enviado o relatório quando o nobody check encontrar algo de errado.

Após a instalação, será criado uma referencia no cron para rodar o nobody check de hora em hora. Na minha opinião é uma boa solução mudar o tempo para no máximo 30 em 30 minutos.

Para isso edite o cron

crontab -e

onde está

0 */1 * * * /usr/local/nobody_check/nobody_check >/dev/null 2>&1

mude para

*/30 * * * *  /usr/local/nobody_check/nobody_check >/dev/null 2>&1

a seguir salve e saia do cron (se estiver utilizando o pico – ctrl+x e y)

Dica: quando o processo malicioso for detectado veja a data e hora no e-mail do Nobody Check e investigue no mod_security se existe alguma referência neste mesmo horário.

Nem sempre funciona mas poderá ajudá-lo com algumas pistas para descobrir qual domínio gerou o problema.

Germano Pires Ferreira
Administrador Linux

Como instalar apf firewall

Abaixo segue uma abordagem de como instalar e configurar o APF Firewall utilizando as configurações padrões em servidores com WHM/cPanel.

*Importante: Eu não sugiro a instalação do APF Firewall em servidores VPS.
Efetue login como root no SSH de seu servidor linux:

Digite os comandos abaixo para baixar e instalar o APF:

cd /root/
wget http://www.rfxnetworks.com/downloads/apf-current.tar.gz
tar -xvzf apf-current.tar.gz
rm -f apf-current.tar.gz
cd apf-0.9.6-2
./install.sh

Depois de instalado vamos configurar editando o arquivo de configuração:.

cd /etc/apf
pico -w conf.apf

Localize:

USE_DS=”0″

e mude para:

USE_DS=”1″

Abaixo segue como deverá ficar cada uma das entradas(e saídas) no arquivo de configuração e a seguir uma descrição de cada uma das portas:

Localize e mude as configurações a seguir :
**Nota: digite nas mesma linha

Common ingress (inbound) TCP ports
IG_TCP_CPORTS="21,22,25,53,80,110,143,465,953,993,995,2082,2083,2084,2086,2087,2095,2096,3306,6666,7786,3000_3500"

Nota: Lembre-se , o padrão para a porta ssh é 22, porém se você modificou para outra porta, substitua 22 em “IG_TCP_CPORTS” .

Descrição de portas:
—–
21 FTP (TCP)
22 SSH (TCP)
25 SMTP (TCP)
53 DNS – Domain Name Server (TCP)
80 HTTP (TCP)
110 POP3 (TCP)
143 IMAP (TCP)
443 HTTPS (TCP)
465 sSMTP (TCP)
953 ??BIND??
993 IMAP4 – TLS/SSL (TCP)
995 POP3 – TLS/SSL (was spop3) (TCP)
2082 CPANEL (TCP)
2083 CPANEL SSL (TCP)
2084 entropychat server (não habilite esta porta se você não utilizar este serviço) (TCP)
2086 WHM (TCP)
2087 WHM SSL (TCP)
2095 WebMail (TCP)
2096 WebMail SSL
3306 mySQL acesso remoto (TCP)
6666 Melange chat Server (não habilite esta porta se você não utilizar este serviço) (TCP)
7786 Interchange (TCP)
3000_3500
5100 for ASP,
8080 and 8443 for JSP (não habilite esta porta se você não utilizar este serviço).

Common ingress (inbound) UDP ports
IG_UDP_CPORTS=”53,6277″
53 DNS – Domain Name Server
6277 SpamAssassin / DCC (email scanning)

Common ICMP (inbound)

IG_ICMP_TYPES=”3,5,11,0,30,8″
0 Echo Reply
3 Destination Unreachable
5 Destination Unreachable
8 Echo
11 Time Exceeded
30 Traceroute
—–

Common egress (outbound) TCP ports

EG_TCP_CPORTS=”21,25,37,53,80,110,113,#123,443,43,873,953,2089,2703,3306″

21 FTP
25 SMTP
37 Required for CPANEL Licensing
53 DNS – Domain Name Server
80 HTTP
110 POP3
113 Authentication Protocol (AUTH)
123 NTP (Network Time)
443 HTTPS
43 WHOIS
873 rsync (CPanel updates)
953 BIND ??
2089 Necessária para validar a licença do cPanel
2703 Razor (email scanning)
3306 mySQL acesso remoto
—–

Common egress (outbound) UDP ports
EG_UDP_CPORTS=”20,21,53,873,953,6277″
20 ftp-data
21 FTP
53 DNS – Domain Name Server
873 rsync
953 BIND ??
6277 SpamAssassin / DCC (email scanning)
—–

Common ICMP (outbound) typesEG_ICMP_TYPES=”all”==

Agora salve e saia do arquivo de configuração (ctrl+x) y

Para iniciar o APF

/usr/local/sbin/apf -s

ou simplesmente

apf -s

Os comandos para o APF são

-s start
-r restart
-f flush – stop
-l list
-st status
-a HOST allow HOST
-d HOST deny HOST

Com o APF iniciado efetue um novo login no SSH para se certificar que as configurações estão corretas. Se por algum motivo algo não funcione em seu servidor devido as configurações, não se preocupe, inicialmente o APF funciona em Devel_Mode e ficará off dentro de 5 minutos.

Se tudo está funcionando perfeitamente agora vamos desabilitar o Devel_mode para que o APF não fique off depois dos 5 minutos.

No ssh:

cd /etc/apf
pico -w conf.apf

localize:

DEVEL_MODE=”1″

e mude para

DEVEL_MODE=”0″

Salve e saia do arquivo de configuração (ctrl+x) y

Vamos agora finalmente reiniciar o APF

apf -r

Germano Pires Ferreira
Administrador Linux

Otimizando sysctl

Utilizar algumas regras no sysctl.conf é uma boa solução para tentar prevenir ataques do tipo spoofing e alguns tipos de DOS.

NOTA: Verifique se eth0 é sua interface primária, caso não seja, mude eth0 para eth1

no SSH, edite o sysctl:

pico -w /etc/sysctl.conf

Você pode simplesmente copiar e subsituir pelo código abaixo :

#Kernel sysctl configuration file for Red Hat Linux
#
# Para valores binarios 0 desabilita e 1 habilitar.
#
#

# Disables packet forwarding
net.ipv4.ip_forward=0

# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.lo.log_martians = 0
net.ipv4.conf.eth0.log_martians = 0

# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# Disables the magic-sysrq key
kernel.sysrq = 0

# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15

# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800

# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0

# Turn off the tcp_sack
net.ipv4.tcp_sack = 0

# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0

# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1

# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1

# Increases the size of the socket queue (effectively, q0).
net.ipv4.tcp_max_syn_backlog = 1024

# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 1440000

# Allowed local port range
net.ipv4.ip_local_port_range = 16384 65536

Agora, salve as alterações e saia do pico:

Para ativar:

/sbin/sysctl -p
sysctl -w net.ipv4.route.flush=1

Leitura sugerida:
http://ipsysctl-tutorial.frozentux.net/ipsysctl-tutorial.html

Germano Pires Ferreira
Administrador Linux

Como instalar rkhunter

O RKhunter é uma excelente ferramenta, muito útil para detectar trojans, rootkits e outros possíveis problemas de segurança em servidores linux.

Neste tutorial vamos abordar a instalação e a seguir, criar um relatório que será enviado para sua conta de e-mail diariamente.

Instalando:

wget http://ufpr.dl.sourceforge.net/sourceforge/rkhunter/rkhunter-1.3.0.tar.gz
tar -zxvf rkhunter-1.3.0.tar.gz
cd rkhunter-1.3.0
./installer.sh --layout default --install

Agora, vamos executar o Rkhunter:

/usr/local/bin/rkhunter -c

Para finalizar, vamos configurar o Rkhunter para ser attualizado e executado uma vez ao dia e enviar um relatório ao Administrador:

pico /etc/cron.daily/rkhunter.sh

Adicione as linhas abaixo modificando sua conta de e-mail:

#!/bin/sh
(
/usr/local/bin/rkhunter --versioncheck
/usr/local/bin/rkhunter --update
/usr/local/bin/rkhunter --cronjob --report-warnings-only
) | /bin/mail -s 'rkhunter Relatorio Diario (Nomedoseuservidor)' voce@seudominio

Feche o editor pico e salve as modificações (ctrl+x e y)

Agora vamos transformar o arquivo rhkunter.sh em executável:

chmod +x /etc/cron.daily/rkhunter.sh

Germano Pires Ferreira
Administrador Linux

Como instalar o chkrootkit

ChkrootKit é mais uma boa ferramenta para detectar sistemas de Rootkits, Worms Trojans e outros.

Neste passo a passo vamos abordar a instalação e a seguir criar uma instrução no cron para a execução diária do chkrootkit e envio de um relatório ao administrador.

– Efetue login no SSH de seu servidor como root e a seguir execute os comandos abaixo para baixar, descompactar e instalar o chkrootkit:

wget --passive-ftp ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar xvfz chkrootkit.tar.gz
cd chkrootkit-0.48/

Como opção, para deixarmos um pouco mais organizado seu servidor, vamos mover o diretório para “/usr/local/chkrootkit”

cd..
mv chkrootkit-0.48/ /usr/local/chkrootkit

Para executar manualmente :

cd /usr/local/chkrootkit
./chkrootkit

Pronto.
chkrootkit instalado.
Agora vamos criar uma instrução no cron job para que o chkrootkit seja executado diariamente em um determinado horário e a seguir enviar um relatório a sua conta de e-mail.

para acessar o cron execute:

crontab -e

na ultima linha cole o comando a seguir:

0 4 * * * (d /usr/local/chkrootkit; ./chkrootkit 2>&1 | mail -s " Relatorio do chkrootkit no servidor xx" voce@seudominio)

Salve e saia do cron job

A instrução acima irá executar o chkrootkit diariamente as 04:00 AM e enviar um relatório ao final para o e-mail informado.

Germano Pires Ferreira
Administrador Linux

Desabilitando login direto do root ao SSH e criando um super usuário

Como padrão é possível efetuar login no SSH como root. Porém, eu considero o login direto ao root uma grave falha de segurança.
Abaixo neste passo a passo vou abordar como desabilitar o login direto do root ao SSH e criar um usuário intermediário com permissão apenas para login no ssh, e a seguir efetuar login como root.

Importante: sugiro que a todo momento mantenha-se logado em uma janela de seu SSH como root e sempre faça testes em um novo terminal .

1 – Criando usuário com permissão de acesso ao ssh

Efetue login como root no ssh de seu servidor, a seguir digite(mude adminserver para outro nome que desejar) :

adduser adminserver

A seguir crie uma senha

passwd adminserver

Será solicitado que digite uma senha e a confirme após o “enter”.
**importante: para numeros , NÃO utilize o teclado numerico a esquerda de seu teclado.

Ok, agora vamos determinar que este usuário poderá efetuar login no ssh.

gpasswd -a adminserver wheel

Neste tempo você terá um novo usuário que poderá efetuar login no ssh , porém este usuário nao possui privilégios de root.

2 – Desabilitando o acesso direto ao root no SSH.
Edite o arquivo de configuração do SSH.

pico /etc/ssh/sshd_config

Mude as linhas:
De:

Protocol 2, 1

Para:

Protocol 2

e de:

PermitRootLogin yes

Para:

PermitRootLogin no

Salve as modificações(ctrl+x , y)

Reinicie o ssh:

service sshd restart

NÃO efetue logoff, tente efetuar login com o usuário e senha que criou anteriormente e a seguir, no prompt de comando digite :

su - root

(ou apenas su – , costuma funcionar em algumas distro linux)

informe a senha do root.

Se tudo correu bem , você deverá sempre efetuar login com o usuário criado e a seguir informar a senha do root.

Se algo saiu errado , edite novamente o arquivo de configuração do SSH , mude “PermitRootLogin no” para “PermitRootLogin yes” e reinicie novamente o ssh.

Germano Ferreira
Administrador Linux