você está aqui: Home → Arquivo de Mensagens
Colaboração: José Messias Alves da Silva
Data de Publicação: 02 de abril de 2008
Atualmente, vivemos em uma contínua guerra virtual, onde tentativas de invasão são frequentes não só em ambientes corporativos como também em ambientes domésticos. Assim, pretende-se mostrar aqui como se pode implementar um pequeno firewall pessoal como base no iptables
, o filtro de pacotes instalado por padrão em todas as distribuições de GNU/Linux, com o intuito de aumentar a segurança das estações de trabalho de usuários domésticos. Para tanto, utilizar-se-á apenas a tabela filter
do iptables
, visto que para este caso as demais tabelas são desnecessárias.
Vale ressaltar que nessa dica não há uma rigidez na construção das regras para o firewall, visto que o que pode ser bom para um certo usuário pode não ser bom para outro.
Entretanto, a intenção aqui é procurar apresentar um conjunto comum de regras aplicáveis a todos, podendo posteriormente, de acordo com o usuário, ser realizado apenas algumas adaptações.
A dica baseia-se na distribuição Debian, porém, pode ser utilizada para todas as distribuições. Como requerimentos, caso ainda não estejam carregados, será necessário o acréscimo dos módulos do Kernel ip_tables
e ipt_LOG
# modprobe ip_tables # modprobe ipt_LOG
O primeiro passo é verificar quais são os serviços que estão sendo executados na estação já que, em geral, de acordo com a instalação de uma dada distribuição, certos serviços já estarão rodando, tais como:
sshd | Secure Shell Server, serviço de terminal remoto seguro. |
http | Servidor web Apache |
rpcbind | utilizado por alguns serviços de arquivos, como NFS. Seu uso deve ser evitado. |
Para tanto, pode-se fazer uso das ferramentas netstat
ou nmap
.
Tendo nmap
instalado na máquina, pode-se executar o seguinte comando para identificar os serviços e portas abertas na estação:
# nmap -sS Nome_da_sua_Maquina ou Seu_endereco_IP
Starting Nmap 4.50 ( http://insecure.org ) at 2008-03-18 17:18 BRT Interesting ports on Sua_Maquina (Seu endereco_IP): Not shown: 1704 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 111/tcp open rpcbind 113/tcp open auth Nmap done: 1 IP address (1 host up) scanned in 0.671 seconds
Pela saída do comando, podemos observar que há na estação os serviços ssh
, o servidor web Apache (http
), o serviço rpcbind
(Remote Procedure Call, Chamada Remota de Procedimentos), utilizado pelo NFS para montar uma unidade remotamente. Há, também, o serviço auth
, que é utilizado para identificação e autorização, muito freqüentemente usado por servidores de notícias, IRC (Internet Relay Chat) ou Correio.
Todos esse serviços da estação estão abertos a conexões provenientes de outras máquinas e, em geral, não se necessita disponibilizá-los, exceto feita ao
o serviço ssh
, que poderá ser necessário para se conectar a partir de uma outra máquina e que se costuma liberar apenas se esta tiver um endereço IP fixo.
Assim, é necessário apenas escolher quais serviços se deseja disponiblizar o acesso externo. Para esta dica foi escolhido o seguinte esquema de filtragem:
localhost
ou endereço IP 127.0.0.1
.
rcpbind
, http
e auth
devem ser bloqueadas.
192.168.0.10
.
new
, established
e related
, relacionados ao protocolo TCP. TCP é um protocolo orientado a Conexão. Por Orientado a Conexão entende-se que todos os pacotes chegarão ao destino, sem qualquer perda de pacotes em trânsito. Caso um pacote seja perdido, há a retransmissão do mesmo. Essas propriedades são obtidas por meio de um conjunto de flags. As principais flags são SYN
(SYNchronize, Sincronizar) e ACK
(ACKnowledge, Confirmar). Por exemplo, quando se clica em um determinado link no navegador, seu computador envia um pacote SYN
para o servidor remoto que hospeda o link. Esse processo é o ínicio de nova conexão, representado por NEW
.
Quando o servidor recebe o pedido que tem a flag SYN
, envia um aviso de confirmação de volta para a sua máquina, fixando a ele uma flag SYN-ACK
. Podemos chamar essa etapa de "relacionamento" da conexão, representada por RELATED
. Assim que a sua máquina recebe o pacote SYN-ACK
, ela responde com um pacote ACK
final, que informa a máquina remota que o pacote foi realmente recebido. Nesse momento, a conexão está estabelecida, o que se representa por ESTABLISHED
.
Esse mecanismo é chamado de Three-Way-Handshake.
NEW
) para a estação a partir de uma máquina remota, ou seja, conexões só devem ser iniciadas pela estação.
Permitir a localhost
acesso a tudo
iptables -A INPUT -s 127.0.0.1 -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -j ACCEPT
Permitir todas conexões tcp estabelecidas e já relacionadas a alguma conexão para a máquina
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
Permitir acesso pelo protocolo udp apenas para o servidor DNS, supondo que este seja 192.168.0.1
iptables -A INPUT -p udp -s 192.168.0.1 -j ACCEPT
Permitir acesso SSH apenas a partir do IP 192.168.0.10
iptables -A INPUT -p tcp -s $IP_LIBERADO --dport 22 -j ACCEPT
Permitir todas as conexões de saída a partir da máquina
iptables -A OUTPUT -j ACCEPT
Deste ponto em diante, colocar-se-á Regras de Negação.
Negar todas as novos conexões tcp a partir de máquinas remotas, registrando as tentativas.
iptables -A INPUT -p tcp -m state --state NEW -j LOG iptables -A INPUT -p tcp -m state --state NEW -j DROP
Bloquear a porta 80 do servdior web Apache da máquina e, da mesma forma, também registrar as tentativas de conexão.
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j LOG iptables -A INPUT -p tcp -s 0/0 --dport 80 -j DROP
Nota: A regra LOG
sempre deve anteceder a respectiva regra de filtragem.
Bloquear os demais acessos a SSH para a máquina, registrando tentativas.
iptables -A INPUT -p tcp -s 0/0 --dport 22 -j LOG iptables -A INPUT -p tcp -s 0/0 --dport 22 -j DROP
Por fim, negar tudo que não se enquadrar em nenhuma das regras.
iptables -A INPUT -j DROP iptables -A FORWARD -j DROP
Para automatizar, cria-se um arquivo em /etc/init.d/firewall
com o seguinte contéudo:
#!/bin/sh # # Exemplo de script Firewall Pessoal para GNU/Linux 2.6.x e iptables # # por Jose' Messias Alves da Silva # # LO_IFACE="lo" LO_IP="127.0.0.1" IP_LIBERADO="192.168.0.10" DNS="192.168.0.1" IPTABLES="/sbin/iptables" case "$1" in start) echo -e 'Iniciando Firewall Pessoal..\n' # Carregando os Modulos do Kernel modprobe ip_tables modprobe ipt_LOG # LocalHost - Aceita todos os pacotes $IPTABLES -A INPUT -s $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -s $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -j ACCEPT $IPTABLES -A INPUT -p udp -s $DNS -j ACCEPT $IPTABLES -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -p tcp -m state --state NEW -j LOG $IPTABLES -A INPUT -p tcp -m state --state NEW -j DROP $IPTABLES -A INPUT -p tcp -s 0/0 --dport 80 -j LOG $IPTABLES -A INPUT -p tcp -s 0/0 --dport 80 -j DROP # Permitir acesso SSH apenas a partir do IP 192.168.0.10 $IPTABLES -A INPUT -p tcp -s $IP_LIBERADO --dport 22 -j ACCEPT #As demais tentativas a SSH, negar $IPTABLES -A INPUT -p tcp -s 0/0 --dport 22 -j LOG $IPTABLES -A INPUT -p tcp -s 0/0 --dport 22 -j DROP # Negar tudo que nao se enquadrar nas regras anteriores $IPTABLES -A INPUT -j DROP $IPTABLES -A FORWARD -j DROP echo -e 'Firewall Pessoal Iniciado ..\n' ;; stop) echo -e 'Parando Firewall Pessoal ..\n' # Limpando regras $IPTABLES -F ;; restart) echo -e 'Reiniciando Firewall Pessoal, aguarde ..\n' $0 stop sleep 2 $0 start ;; *) echo "Sintaxe: $0 [ start | stop | restart ]" ;; esac
Após a criação do arquivo, é necessário torná-lo executável:
# chmod +x /etc/init.d/firewall
Por fim, digita-se o seguinte comando para criar os links simbólicos nos diretórios de inicialização:
# update-rc.d firewall defaults
Para iniciar o firewall, basta executar:
# /etc/init.d/firewall start
ou
# invoke-rc.d firewall start
Enfim, após a inicialização/execução do script as regras estarão carregadas no kernel, tendo se implementado um excelente firewall pessoal. Pode-se verificar se as regras foram corretamente aplicadas executando novamente o comando nmap, que mostrará que as portas estão filtradas pelo firewall:
# nmap -sS Nome_da_sua_Maquina ou Seu_endereco_IP -p 22,80,111,113
Ou simplesmente listando as regras utilizadas por meio do comando:
# iptables -L
Ademais, essa dica serve para os usuários perceberem a importância da segurança também em suas estações, incentivar e estimular a criação de firewalls pessoais bem mais poderosos.
José Messias Alves da Silva é Matemático, Cientista da Computação pela UFPI, Especialista em Administração em Redes Linux e Coordenador Geral do Grupo de Usuários Debian do Piauí.
Colaboração: Rodrigo Amorim
A Microsoft revelou ontem informações sobre sua colaboração com a Fundação Eclipse. As duas organizações estão trabalhando para habilitar o uso da tecnologia Eclipse para a construção de aplicações Java para o Windows Vista. Detalhe: a colaboração não inclui as ferramentas de Código Aberto da fundação.
Parte dessa colaboração está na gerência de identidade, conectando o Projeto Eclipse de Higgins à tecnologia CardSpace da Microsoft. O projeto Higgins é um framework de integração de informações de identidade, descrições e relações sociais, por meio de diferentes sites, aplicações e dispositivos. Essa interoperabilidade do framework irá criar mais confiança na gerência de identidade.
Os esforços da Microsoft foram detalhados pelo diretor de estratégia de tecnologia de plataforma, Sam Ramji, na conferência EclipseCon 2008, nos EUA (que termina hoje). Ramji mostrou o quanto a Microsoft tem se esforçado pelo mundo do Código Aberto. Dentre os exemplos, citou as acomodações para o PHP, JBoss e o Xen hypervisor da Novell. Saiba mais em http://www.linuxmagazine.com.br/noticia/eclipse_na_microsoft