PortSentry: Melhorando a segurança do seu Linux

O PortSentry é um projeto já bem antigo de IDS/Firewall. Trata-se de um software muito interessante, flexível e bem fácil de se lidar. Vamos ver como barrar PortScanning e tentativas de ataques matando a conexão com o atacante e ao mesmo tempo criar uma espécie de Honey Pot para ficar livre de possíveis atacantes. Tudo de forma simples.

[ Hits: 70.274 ]

Por: Anderson L Tamborim em 29/04/2004 | Blog: http://y2h4ck.wordpress.com


Instalando e configurando



Primeiro passo é baixar a versão mais recente do PortSentry. Vamos baixar a versão direto do site do projeto, já tive umas experiências com RPMs no Conectiva e meu amigo, não foram muito interessantes.

Pegue o .tar.gz que ele compila sem muitos traumas e a instalação é bem rápida.

Vamos lá! Vamos baixar o PortSentry de um dos mirrors que temos na página, o arquivo tem apenas 47 Kb:

http://easynews.dl.sourceforge.net/.../portsentry-1.2.tar.gz
/* esse link e bem rápido */

Muito bem, vamos criar uma pastinha para nosso amigo:

$ mkdir /security
$ mv portsentry-1.2.tar.gz /security
$ cd /security
$ tar -xzvf portsentry-1.2.tar.gz
$ ./configure ; make ; make install


e voilá, teremos o PortSentry instalado em nosso sistema ;)

Configurando


Essa é a parte mais divertida porque garanto que cada um após observar o arquivo de configuração do PS vai ver configurações que lhe chamarão mais a atenção devido às suas opções totalmente inusitadas.

Vou dar um exemplo de configuração de bloqueio para atacantes que tentam portscanning e um pequeno honey pot.

Vamos dar uma olhada na pasta /usr/local/psionic/portsentry. Teremos alguns arquivos dentro dela, vamos utilizar o portsentry.conf.

Vamos ver as primeiras configurações interessantes que devemos fazer:

# Un-comment these if you are really anal:
# TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,,[..]
# UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,518,[..]
#
# Use these if you just want to be aware:

TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,[..]"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,[..]"
#
# Use these for just bare-bones
# TCP_PORTS="1,11,15,110,111,143,540,635,1080,1524,2000,12345,[..]"
# UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,[..]"

Aqui estão as portas TCP/UDP que o PortSentry vai "guardar". Analise as portas que tem em cada lista, as portas verdadeiras de seu sistema não devem constar nesta lista, OK? Caso contrário, o PS vai bloquear as tentativas de conexão nelas.

Como vocês viram, o segundo conjunto de portas está habilitado, vamos utilizar ele como teste, depois podemos refinar essas portas e tudo mais que vocês queiram.

Vamos continuar nossa análise no arquivo de conf:

IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore"
HISTORY_FILE="/usr/local/psionic/portsentry/portsentry.history"
BLOCKED_FILE="/usr/local/psionic/portsentry/portsentry.blocked"

Bom, o primeiro arquivo são os hosts que o PortSentry deve ignorar, ou seja, os hosts que estiverem nesta list não serão analisados por ele.

O segundo é o history, ou seja, tudo que o PS já fez, desde analisar conexões até bloquear, tudo estará listado neste arquivo. Equivale a um ~/.bash_history.

O terceiro é a lista negra do PortSentry, os atacantes bloqueados por ele e os hosts que ele considera como perigosos. Nessa lista você deve ficar esperto porque às vezes alguém pode cair aí por engano de um falso positivo, então fique sempre analisando esta lista para não ficar sem determinados serviços de comunicação.

Vamos ver agora uma opção muito maneira do Port Sentry que é a KILL_ROUTE. Esta função como já diz o nome, killa a rota do atacante, passando a ignorar todo e qualquer pacote e requisição feita por ele pelo tempo que você determinar (logo mostraremos como).

Como usamos Linux, a opção que vamos habilitar será a:

KILL_ROUTE="/usr/local/sbin/iptables -I INPUT -s $TARGET$ -j DROP"

Como você pode ver, é uma regra simples, você pode melhorar a regra do jeito que achar melhor e tudo mais, iptables meu amigo, tem 10001 possibilidades.

OBS: $TARGET$ = ip do atacante que ele detectou.

Além de bloquear pelo iptables você também pode utilizar TCP Wrappers para isso:

KILL_HOSTS_DENY="ALL: $TARGET$ # PortSentry blocked"

Não recomendo a seção de Droping Route porque dá mais trabalho de liberar IPs bloqueados. KILL_ROUTE já é mais que suficiente.

External Command


Essa parte permite você realizar um comando externo ao PortSentry para reagir ao ataque ou para escrever algum log especial.

# KILL_RUN_CMD="/some/path/here/script $TARGET$ $PORT$"

Como podem ver, a sintaxe padrão é como se fosse executar um "contra ataque", mas isso não é muito interessante não é mesmo?

Creio que para nós seria mais interessante escrever um log com os IPs atacantes e tal. Bom, fica a seu critério, onde $PORT$ é a mesma porta onde você foi atacado.

Port Banner Section


Essa é a parte mais legal do PortSentry. Como você viu lá em cima, ele fica analisando várias portas, se alguém passar um scan de portas e não for barrado por algum motivo, ele vai tentar conectar em alguma porta chamativa como 79 5555 e terá uma surpresa:

PORT_BANNER="** Unauthorized Access Prohibited ** Your Connection attempt has been logged . . . GO AWAY!!"

Ele irá ver essa mensagem em seu cliente telnet por exemplo e sua rota será killada.

Coloque algo ao seu gosto:

"Cai fora seu inxirido!!! aqui está o seu ip $TARGET$"

Fica ao seu gosto :)

Página anterior     Próxima página

Páginas do artigo
   1. PortSentry: Uma alternativa eficiente
   2. Instalando e configurando
   3. Considerações finais
Outros artigos deste autor

Segurança extrema com LIDS: novos recursos

Race condition - vulnerabilidades em suids

Carnivore e Altivore: Os predadores do FBI

PHLAK :: [P]rofessional [H]acker's [L]inux [A]ssault [K]it

PaX: Solução eficiente para segurança em Linux

Leitura recomendada

Verificação de integridade de arquivos - Ferramenta OSSEC

Escondendo banners de serviços

SmoothWall - Linux para gateway

OpenPGP - Tradução da man page

Backup automatizado e seguro usando SSH / SCP / SFTP

  
Comentários
[1] Comentário enviado por naoexistemais em 29/04/2004 - 01:32h

Parabens pelo artigo Spawn, cuidado com os invejosos...(risos), e Fabio cada dia mais qualidade neste excelente portal...(VOL)

Caso alguém deseja conhecer outra solução similar o PortSentry, acesse o Link: http://www.linuxit.com.br/modules.php?name=Sections&op=viewarticle&artid=149
SNORT + GUARDIAN PARA MAIOR CONFIABILIDADE

[2] Comentário enviado por y2h4ck em 29/04/2004 - 08:00h

Wrochal obrigado :) hueh pode ter certeza que vou tomar cuidado eheh vc tambem cara vc precisa amarrar uma fitinha vermelha pra tirar o quebrante que os maluco coloca no seu projeto ahuahah :D
[]s a todos.

[3] Comentário enviado por cvs em 29/04/2004 - 08:35h

Essas ferramentas são boas, infelizmentes consomem muita memoria ram. legal o artigo.

[4] Comentário enviado por ryu em 29/04/2004 - 11:30h

são ferramentas obrigatórias em servidores... pela falta delas e de uma boa configuracao por parte dos admins eh q o linux lidera as estatisticas de SO mais invadido em servidores...

[5] Comentário enviado por removido em 29/04/2004 - 11:59h

Qual a diferença entre o Snort e o PortSentry? Me parece que eles têm a mesma função...

[6] Comentário enviado por naoexistemais em 29/04/2004 - 12:44h

Caro Virtualboy,

Snort é IDS e apenas gera LOGS e o PortSentry é um IDS que bloqueia acesso restristo (portscan). Mas no caso do Snort tem o Guardian q bloqueia.

[7] Comentário enviado por ygorth em 29/04/2004 - 21:35h

Vou por em pratica!

[8] Comentário enviado por removido em 30/04/2004 - 09:42h

wrochal, muito obrigado!! :)
Vou passar a utilizar apenas o PortSentry ao invés do snort + guardian... me pareceu uma solução mais fácil e confiável.

[9] Comentário enviado por removido em 30/04/2004 - 11:15h

Olá denovo! :)
Instalei e configurei o PS no Slack 9.1, mas não estou conseguindo roda-lo... não achei nada redefente ao seu comando de inicialização na web nem no site do desenvolvedor... ele só me diz: usage: portsentry [-tcp -udp -stcp -atcp -sudp -audp]. Mas eu so posso usar um de cada vez apenas... o que significa cada parametro??

[10] Comentário enviado por y2h4ck em 30/04/2004 - 11:49h

faz assim
portsentry -tcp
portsentry -udp

e ele estara rodando :)

[11] Comentário enviado por removido em 30/04/2004 - 17:50h

Pelo que percebi o PortSentry mostra como se todas as portas estivessem abertas.... eu dou um netstat -a e aparece de tudo.... assim que é feito o bloqueio?? ele nega as conexões?

[12] Comentário enviado por y2h4ck em 30/04/2004 - 19:20h

lembra que eu disse no texto que ele fica como um honey-pot....
se por acaso vc conectar numa dessas portas com o telnet
vc vai ver aquela msg que vc setou no banner :)

Em que isso te ajuda ? Se alguem estiver tentando algo contra sua maquina a primeira coisa que essa possoa vai fazer ao ver alguma dessas portas abertas e conectar pra ver se acontece algo ... dai
o portsentry faz a parte dele.

okei ... valews :)

[13] Comentário enviado por jllucca em 01/05/2004 - 16:27h

Opa,

excelente artigo! Uma pergunta o portScanner não precisa ser configurado pra apartir de quantas tentativas de conexão deve ser dada a mensagem? Pois lembro de ter lido um artigo que falava que "algo parecido"(não lembro o nome, mas funcionava da mesma forma) só mandava a mensagem depois da quarta ou quinta fez que tentassem conectar. Mais uma vez quero dizer que o artigo tá excelente :)

[]'s

[14] Comentário enviado por y2h4ck em 02/05/2004 - 00:17h

jlluca valew ae =]
Seguinte um programa que faz isso que vc esta querendo saber
para barrar portscanning e o PSAD... ele tem varios niveis que vc configura ... e cada nivel vc especifica a acao do daemon.

Estou escrevendo um textinho sobre o psad tambem pra ajudar a popularizar estas solucoes. []s

[15] Comentário enviado por cmarcelo em 02/05/2004 - 12:37h

Esse artigo está muito bom!!!

Estou c/ um probleminha, o portsentry só está fazendo efeito quando eu executo o scan local, quando tento de outro computador, o resultado é o normal

ips nomeu portsentry.ignore:
xxx.xxx.xxx.xxx (meu ip externo)
192.168.100.1 (meu ip interno)
127.0.0.1 (lo)

Carlos Marcelo

[16] Comentário enviado por y2h4ck em 03/05/2004 - 08:45h

De uma verificada em
###################
# Dropping Routes:#
###################

Verfique se o path para o iptables esta correto.
por exemplo:

KILL_ROUTE="/usr/sbin/iptables -A INPUT -s $TARGET$ --dport $PORTS$ -j DROP"

Verifique o patch do seu iptables certinho com o comando
whereis iptables

e inicie o ps:
portsentry -tcp
portsentry -udp

Depois faça o teste dinovo okei.

Valew =]

[17] Comentário enviado por cmarcelo em 05/05/2004 - 20:44h

O meu problema não é que ele está bloqueando, e sim que quando eu rodo um scan local, ele me mostra todas aquelas portas falsas, mas só local, quando rodo-o pela rede externa (eth0) ou pela interna (eth1) as portas que me aparecem no scan são as legítimas, entendeu?

agradeço desde já,
Carlos Marcelo

[18] Comentário enviado por y2h4ck em 06/05/2004 - 08:14h

Entao mas vc deve verificar se oq eu disse esta correto porque o portsentry por si soh nao faz muita coisa.. por isso ele usa o iptables e tudo mais.

Em geral ele da atencao a portas de 1 a 20 uma pequena tentativa ja e suficiente...

Entao ... tente colocar essa regra na linha de kill_route
iptables -A INPUT -i eth0 -s $TARGET$ -j DROP...

faça o teste ... verifique se ele esta gerando um log ..

no EXTERNAL command
deixe ele executar

echo Ataque vindo de $TARGET$ >> /var/log/portsentry/logs.ataque

voce podera controlar melhor ... e questao de vc sentar e otimizar a .conf do seu portsentry :)

fiz desse jeito que estou te passando e ele funciona perfeitamente

[]s

[19] Comentário enviado por cmarcelo em 13/05/2004 - 20:44h

Descobri a causa do meu problema,
É que no firewall eu não estava liberando as portas falasas criadas pelo portsentry ;)
agora está funcionando redondinho

Vlw

[20] Comentário enviado por fernandoamador em 23/12/2004 - 14:30h

boa

[21] Comentário enviado por fernandoamador em 23/12/2004 - 14:30h

boa.

[22] Comentário enviado por jgama em 08/05/2005 - 22:51h

Pessoal só não entedi como instala-lo já que não tem o copilado ./configure no diretorio descompactodado?

root@servlinux portsentry_beta]# ./configure
bash: ./configure: Arquivo ou diretório não encontrado

Como faço para instalar?

Abraço

[23] Comentário enviado por reginaldo_linux em 11/05/2005 - 20:25h

Pessoal, desejo aprender a manusear o linux, mas não tenho computador, no entanto tenho onde acessar de graça todos os dias e faço voluntariado no CDI.

[24] Comentário enviado por mnoveli em 25/05/2005 - 13:14h

estou usando a versao portsentry-4.2
quando dou um make linux gera este erro veja usando a distribuicao linux
suse 9.3 prof como root
------------------------------------------------------------------------
linux:/home/oracle/portsentry-4.2/portsentry_beta # make linux
SYSTYPE=linux
Making
cc -O -Wall -DLINUX -DSUPPORT_STEALTH -o ./portsentry ./portsentry.c \
./portsentry_io.c ./portsentry_util.c
portsentry.c:1584:11: missing terminating " character
portsentry.c: In function `Usage':
portsentry.c:1585: error: syntax error before "sourceforget"
portsentry.c:1585: error: stray '\' in program
portsentry.c:1585:24: missing terminating " character
make: ** [linux] Erro 1
linux:/home/oracle/portsentry-4.2/portsentry_beta #
----------------------------------------------------------

grato pela ajuda
marcio


[25] Comentário enviado por jalexandre em 25/05/2005 - 19:11h

Hehehe... boa, cara!! Coloquei esse negocio pra funcionar e gostei muito... Parabens pelo artigo!!!

[26] Comentário enviado por tatototino em 14/05/2006 - 02:26h

no meu tá dando o mesmo erro do mnoveli será q é a versão do gcc ou é alguma outra coisa?
e tipo a minha é versão 1.2 do portsentry e ele extrai uma pasta chamada portsentry_beta e não tem o script "configure" aí vi no arquivo "readme.install"
e é instalado com make linux | make install

mas deu o mesmo erro do mnoveli

se alguem souber como arruma ou se estou fazendo errado,postem aí flw

[27] Comentário enviado por web_knows em 11/07/2006 - 18:32h

SOLUÇÃO para quem teve o seguinte erro:

portsentry.c:1584:11: missing terminating " character
portsentry.c: In function `Usage':
portsentry.c:1585: error: syntax error before "sourceforget"
portsentry.c:1585: error: stray '\' in program
portsentry.c:1585:24: missing terminating " character
make: ** [linux] Erro 1

Basta ir na linha 1584 do arquivo portsentry.c e no final dela mandar um DELETE !

Provavelmente, pra quem teve o erro ao tentar compilar, ela estava assim (com uma entrada de nova linha):

printf ("Copyright 1997-2003 Craig H. Rowland <craigrowland at users dot
sourceforget dot net>\n");

Mas ela deve ficar assim (tudo numa linha só):

printf ("Copyright 1997-2003 Craig H. Rowland <craigrowland at users dot sourceforget dot net>\n");

Falous !

--web_knows

[28] Comentário enviado por Tyreon em 11/07/2006 - 19:00h

Toda segurança eh pouca! Vlw cara!!

[29] Comentário enviado por removido em 06/08/2006 - 08:02h

exelente...parebenns

[30] Comentário enviado por tatototino em 26/09/2006 - 14:07h

no meu deu agora

muito legal parabéns

e vlw web_knows pela ajudinha heheh

flww

[31] Comentário enviado por tffilho em 06/04/2008 - 11:28h

Bom dia pessoal!
Estou com problemas aqui... baixei o portsentry do link acima e estou tentando instala-lo no opensuse 10.3. Quando dou o ./configure ele aparece a seguinte mesnsagem: bash: ./configure: No such file or directory, mas se eu for direto ao make vejam a mensagem :
Usage: make <systype>
<systype> is one of: linux, debian-linux, bsd, solaris, hpux, hpux-gcc,
freebsd, osx, openbsd, netbsd, bsdi, aix, osf, irix, generic
This code requires snprintf()/vsnprintf() system calls
to work. If you run a modern OS it should work on
your system with 'make generic'. If you get it to
work on an unlisted OS please write us with the
changes.
Install: make install
NOTE: This will install the package in this
directory: /usr/local/psionic
Edit the makefile if you wish to change these paths.
Any existing files will be overwritten.

dando o make install:

Creating psionic directory /usr/local/psionic
Setting directory permissions
Creating portsentry directory /usr/local/psionic/portsentry
Setting directory permissions
chmod 700 /usr/local/psionic/portsentry
Copying files
cp ./portsentry.conf /usr/local/psionic/portsentry
cp ./portsentry.ignore /usr/local/psionic/portsentry
cp ./portsentry /usr/local/psionic/portsentry
cp: cannot stat `./portsentry': No such file or directory
make: *** [install] Error 1

ele chega a criar a pasta dentro de /usr/local, mas eu nao acho o arquivo "portsentry" para iniciar o serviço...
Alguem poderia me dar uma força??

Desculpem pelo tamanho do post.

Grato.

[32] Comentário enviado por y2h4ck em 06/04/2008 - 20:11h

Isso ae acontece devido a ultima versao do codigo do portsentry.c
ter uma falha de edentação do código fonte.

Acontece uma quebra de linha durante um determinado ponto do código, que pode ser resolvido facilmente removendo esta quebra de linha.

Primeira coisa

make linux

depois make install
:)

[]s

[33] Comentário enviado por tffilho em 06/04/2008 - 21:29h

y2h4ck, Muito obrigado, funcionando perfeitamente agora, o erro que vc falou está na linha 1584, relendo os posts aqui vi o mesmo erro, peço desculpas!

Valeu pela dica (make linux), é que ainda estou iniciando no mundo linux.
Abraços a todos.

[34] Comentário enviado por Halkd em 03/08/2010 - 01:25h

Ola Pessoal.

Estou coma pulga atras da orelha, quem puder me ajudar, agradeço:

Tenho em uma máquina sob Linux centOs o portsentry instalado , ok. Fui testar se o mesmo está funcionando, e a P. me bloqueou o IP que é dedicado na net .

Okay, sei que basta remover o /etc.hosts.deny e restartar o mesmo, mas quem disse que funcionou? Lol .:)

ja removi o meu IP no /etc/hosts.deny, já fiz iptables -F & -X & -Z e nda, meu IP ta bloqueado .

Bom sei que com reboot da máquina ou SO / ou 'service restart network' aí, meu IP é liberado , mas qual a razao ?

Já removi as linhas do meu IP tb no /var/portsentry/portsentry.blocked.tcp e todas as entradas nesse diretório, mas nada,

Não posso ddar um restart network pois ele trava, sendo assim terei que solocitar um reboot la no IDC states,

Algue pode me ajudar por favor ?

Abraços !

[35] Comentário enviado por halkd em 04/08/2010 - 16:36h

Bom , pessoal , estou necessitando urgentemente dessa solução, quem puder me ajudar. fico grata.

Não posso ficar dando restart na rede a todo o momento , me ajudem .

Acima, favor ler .

[36] Comentário enviado por Halkd em 04/08/2010 - 17:40h

Pessoal só para lembrar, eu utilizo a linha no conf do meu portsentry 'KILL_HOSTS_DENY="ALL: $TARGET$ ' para bloquear via TCP Wrappers .

Este é o problema, como desbloquear via TCP Wrappers quando o portsentry bloquea um IP,

Favor ler mais acima

Grata.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts