Netfilter/Iptables Linux como um roteador doméstico Cenário 2 • Linux como um roteador SOHO (Stands Offices and Home Offices). – A máquina Linux irá atuar como um roteador semelhante ao que temos em nossas residências. • Provendo a conexão ao Provedor Internet. • Compartilhando este acesso com as máquinas da LAN. • Normalmente os roteadores SOHO possuem uma porta WAN e portas LAN. – Equipamento local do usuário (Modem DSL). • Geralmente o provedor nos fornece um endereço IP público via DHCP. • PPPoE. – Conexões Ethernet. – Conexões sem fio. Topologia Endereços • O Roteador Linux tem: – O endereço público na interface eth0, fornecido dinamicamente pelo provedor de acesso (modo NAT). – O endereço privado 192.168.1.1/24 na interface eth1, configurado por você. • O Laptop possui o endereço 192.168.1.2. • O Desktop possui o endereço 192.168.1.11. • O PC das crianças possui o endereço 192.168.1.55. Configurando a rede • Configure as interfaces de rede e os nomes dos hosts conforme o slide anterior. • É interessante criar configurações que se mantenham após a reinicialização das máquinas. Definindo a política de segurança (1) • As crianças precisam: – Usar o navegador para pesquisar na Internet. – Não queremos que elas acessem sites pornográficos. – Não queremos que elas façam download de vírus. – Também não queremos que elas acessem conteúdos P2P. • O Laptop pode: – Acessar qualquer coisa. Definindo a política de segurança (2) • O Desktop pode: • Acessar qualquer coisa. • Conectar-se à LAN a partir da Internet, via VNC. • O Roteador Linux precisa: – Rodar SSH a partir da rede interna. Construindo o proxy • Inicialmente precisamos instalar em nossa máquina firewall, o proxy server Squid. • www.squid-cache.org. – ./configure --prefix=/squid – make all – make install Configurando o Squid (1) • Adicione as linhas abaixo no arquivo /etc/squid.conf. As entradas se referem ao usuário que irá inicializar o Squid. cache_effective_user Manager cache_effective_group Manager Configurando o Squid (2) • Para ser capaz de usar o Squid como um Transparente Proxy, temos que adicionar a seguinte informação no arquivo de configuração em /squid/etc/squid.conf. http_port 3128 transparent Criando lista de acesso no Squid • Agora, precisamos definir listas de acesso para a rede interna acessar o Squid e para proibir o acesso a sites pornográficos e a arquivos perigosos. • Faremos isso para a rede inteira, mas nós usaremos o Transparente Proxy somente para o computador das crianças. • Qualquer arquivo pode ser um vírus. O que se segue é apenas um exemplo. Criando lista de acesso no Squid (2) • Insira em squid.conf as linhas abaixo: acl all src 0.0.0.0/0.0.0.0 (pré-definida) acl porn url_regex –i sex adult porn hardcore fetish acl downloads urlpath_regex\.exe$\.rar$\.zip$\. pif$ \.src$ acl nossa_rede src 192.168.0.0/24 http_access deny porn http_access deny downloads http_access allow nossa_rede http_access deny all ACLs • A ACL chamada porn contém a lista de nomes que não são permitidas na URL. – Você não conseguirá acessar sites que possuem estas palavras na URL, via proxy. • A ACL chamada downloads contém a lista de tipos de arquivos não permitidos. – Não será possível fazer download de arquivos com estas extensões. Próximos passos • Agora que já configuramos o proxy, vamos configurar o firewall cujas regras devem casar com as políticas de segurança que nós acabamos de construir. Computador das crianças • Para o computador das crianças nós executaremos o Transparent Proxy. – Significa que o computador acessará o proxy sem precisar configurar o navegador. • Nós já configuramos o proxy server. Agora, nós precisamos que todo o tráfego para a porta 80 TCP seja redirecionado para o proxy server. • Nós também queremos que o computador das crianças acesse a porta 443 TCP (HTTPS). Configurando iptables –t nat –A PREROUTING –s 192.168.1.55 –p tcp – -dport 80 –j REDIRECT - –to-port 3128 iptables –t nat –A POSROUTING –o eth0 -s 192.168.1.55 –p tcp – -dport 443 –j MASQUERADE Computador das crianças Masquerade • Agora, vamos mascarar o computador das crianças quando ele enviar requisições DNS para nosso provedor de acesso. iptables –t nat –A POSTROUTING –o eth0 –s 192.168.1.55 –p udp – -dport 53 –j MASQUERADE • Requisições DNS usam a porta UDP 53. Yahoo! • Nós queremos que as crianças usem o “Yahoo!Messenger” somente para chat sem voz e sem transferência de arquivos. • Lendo os manuais da ferramenta, vê-se que o Yahoo! Messeger usa as portas 20, 23, 25, 80, 119, 5050, 8001 e 8002. • Também vê-se que os sites que o “Yahoo!Messenger” utiliza para Instant Messeger são: scs.msg.yahoo.com, scsa.msg.yahoo.com, scsb.msg.yahoo.com e scs.cmsg.yahoo.com. MASQUERADE • É melhor mascarar o computador das crianças quando ele acessa esses sites. Nós devemos fazer: iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.55 -d scs.msg.yahoo.com -j MASQUERADE – NOTA: Ao inserir um nome de máquina ao invés do seu endereço IP, o DNS irá resolver este nome. Se um nome é resolvido para múltiplos endereços IP, o iptables irá inserir uma regra independente para cada endereço. Proibindo o acesso aos demais hosts • Agora que nós permitimos o acesso do computador das crianças a determinados sites, devemos agora proibir o acesso a outras portas e outros sites. iptables –t nat –A POSTROUTING –o eth0 –s 192.168.1.55 –j DROP Laptops e Desktop • O Laptop e o Desktop precisam ser capazes de acessar qualquer site, então nenhuma regra é necessária a não ser o MASQUERADE para a nossa rede. iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE Protegendo o firewall • Já fizemos todas as configurações necessárias a proteção de nossa rede local. Agora vamos proteger o nosso firewall. • Em primeiro lugar nós precisamos rodar o SSH em nosso firewall para que ele possa ser administrado remotamente. • Para isto precisamos criar uma nova chain. Podemos chamá-la de SSH. • Se uma vulnerabilidade for descoberta no SSH, rapidamente haverá scanners de worms na porta padrão do SSH. A porta 22. Então devemos alterar essa porta. Criando a chain SSH • Criando a chain SSH. iptables –N SSH • Agora, vamos inserir uma regra para pedir ao kernel para checar as regras na chain SSH, para toda conexão TCP na porta 1234. iptables –A INPUT –p tcp - -dport 1234 –j SSH Inserindo regras na chain SSH • Devemos inserir uma regra na chain SSH permitindo acesso somente para hosts confiáveis. • Digamos que o endereço IP do PC do nosso escritório seja 1.2.3.4. iptables –A SSH –s 1.2.3.4 –j ACCEPT iptables –A SSH –s 192.168.1.0/27 –j ACCEPT iptables –A SSH –s 0/0 –j DROP Significado das regras • A primeira regra aceita conexões a partir do computador de nosso escritório. • A segunda regra permite conexões SSH de entrada somente oriundas de computadores com endereços no intervalo de 192.168.1.1 à 192.168.1.32. • A terceira regra descarta todos as demais conexões para a porta 1234. Finalmente... • O proxy Squid tem a sua própria segurança usando as Listas de Acesso. Mesmo assim vamos que pacotes TCP SYN, vindos da Internet estabeleçam conexão com nosso Squid/Router/Firewall, exceto na porta 1234 a partir de PC 1.2.3.4. • Vamos também, liberar todos os pacotes vindos da interface loopback para IPC (processos internos de comunicação). iptables –A INPUT –i lo –j ACCEPT iptables –A INPUT –i eth0 –p tcp - –syn –j DROP