Mudanças entre as edições de "Projeto Integrador - 2009.2 - Dicas de GER"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(13 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
==Organização==
+
__TOC__
 +
=Organização=
 
* Usem [http://www.mindmeister.com mapas mentais] ou [http://www.graphviz.org grafos direcionados] (dígrafos) para ver/compreender a relação entre camadas e serviços de rede. Exemplo:
 
* Usem [http://www.mindmeister.com mapas mentais] ou [http://www.graphviz.org grafos direcionados] (dígrafos) para ver/compreender a relação entre camadas e serviços de rede. Exemplo:
 
<graphviz>
 
<graphviz>
Linha 5: Linha 6:
 
{
 
{
 
splines = true
 
splines = true
 
subgraph clusterEnlace
 
{
 
label = "Enlace"
 
RADIUS
 
}
 
  
 
subgraph clusterRede
 
subgraph clusterRede
Linha 28: Linha 23:
 
}
 
}
  
RADIUS -> DHCP -> DNS -> HTTP
+
DHCP -> DNS -> HTTP
 
MySQL -> HTTP -> MySQL
 
MySQL -> HTTP -> MySQL
 
DNS -> SMTP -> HTTP
 
DNS -> SMTP -> HTTP
Linha 36: Linha 31:
  
 
==Integração entre Aplicações==
 
==Integração entre Aplicações==
* Integrem as aplicações Web com programas ligados ao S.O. Por exemplo, uma página em PHP pode ser agendada para realizar operações de manipulação de arquivos. Exemplo: arquivo <tt>/etc/crontab</tt>:
+
À espera da necessidade dos alunos :-)
...
+
 
00  */12  *  *  *  root  php -q /var/www/hotel/manipula_arquivo_de_usuarios.php
+
 
* Sugestão de integração:
+
 
** A aplicação Web controla todas as operações sobre os outros serviços em rede. No banco de dados, ficam armazenadas informações estáticas (nome, endereço) e dinâmicas (entradas, saídas). Já na aplicação do RADIUS, ficam replicados estes usuários, a fim desta aplicação poder autenticá-los conforme o padrão IEEE 802.1x. A integração pode ser feita de forma automatizada, agendando as manipulações de usuários em horários predeterminados. A título de exemplo: todas as entradas e saídas de hospedagem ocorrem às 12h; portanto, é nesse horário específico que usuários ficam (des|h)abilitados a usar a rede com e sem fio.
+
=''Scripts''=
** A aplicação RADIUS pode utilizar bases remotas de usuários, como por exemplo LDAP ou bancos de dados (MySQL, por exemplo). Entretanto, pela dificuldade de implementação a curto prazo, é aconselhável o uso de arquivos em formato texto próprios do RADIUS ([http://wiki.freeradius.org/EAP/MD5_HOWTO#User_configuration_.28users.29 clientes] e [http://wiki.freeradius.org/Clients.conf usuários]).
+
==''Firewal''==
<graphviz>
+
<syntaxhighlight lang=bash>
digraph Integração
+
#!/bin/bash
 +
 
 +
 
 +
# Variáveis: MEXA aqui!
 +
#
 +
# Interfaces
 +
EXTERNA_IFACE="eth0"
 +
DMZ_IFACE="eth0:0"
 +
LAN="eth0:1"
 +
#
 +
# Redes
 +
EXTERNA_REDE="200.135.37.0/24"
 +
DMZ_REDE="172.31.0.16/30"
 +
LAN_REDE="172.31.0.0/28"
 +
#
 +
# Servidores
 +
ROTEADOR="200.135.37.82"
 +
DMZ_WEB="172.31.0.17"
 +
#
 +
# Portas
 +
PORTAS_TCP_SERVIDOR="22"
 +
PORTAS_UDP_SERVIDOR=""
 +
PORTAS_TCP_WEB="25 80"
 +
PORTAS_UDP_WEB="53"
 +
 
 +
 
 +
limpa_regras()
 +
{
 +
echo "- Antigas regras de NAT."
 +
iptables -t nat -F
 +
 +
echo "- Antigas regras de filtro de pacotes."
 +
iptables -F
 +
}
 +
 
 +
politica_padrao()
 +
{
 +
echo "- Política padrão para NAT."
 +
iptables -t nat -P PREROUTING ACCEPT
 +
iptables -t nat -P POSTROUTING ACCEPT
 +
iptables -t nat -P OUTPUT ACCEPT
 +
 +
echo "- Política padrão para filtro de pacotes."
 +
iptables -P INPUT ACCEPT
 +
iptables -P FORWARD ACCEPT
 +
iptables -P OUTPUT ACCEPT
 +
}
 +
 
 +
 
 +
regras_basicas()
 +
{
 +
echo "- Regras básicas:"
 +
echo "  - Loopback."
 +
iptables -A INPUT -i lo -j ACCEPT
 +
echo "  - Conexões ativas."
 +
iptables -A INPUT  -m state --state RELATED,ESTABLISHED -j ACCEPT
 +
}
 +
 
 +
roteamento()
 +
{
 +
echo "- Roteamento."
 +
sysctl -w net.ipv4.ip_forward=1 > /dev/null
 +
}
 +
 
 +
nat()
 +
{
 +
echo "- NAT para as redes internas."
 +
iptables -t nat -A POSTROUTING -o ${EXTERNA_IFACE} -j MASQUERADE
 +
}
 +
 
 +
redir_portas()
 +
{ echo "- De externa para o servidor Web:"
 +
for porta in ${PORTAS_TCP_WEB}; do
 +
echo "  - Redireciona porta ${porta}/TCP."
 +
iptables -t nat -A PREROUTING -d ${ROTEADOR} -p tcp \
 +
--dport ${porta} -j DNAT --to ${DMZ_WEB}
 +
done
 +
for porta in ${PORTAS_UDP_WEB}; do
 +
echo "  - Redireciona porta ${porta}/UDP."
 +
iptables -t nat -A PREROUTING -d ${ROTEADOR} -p udp \
 +
--dport ${porta} -j DNAT --to ${DMZ_WEB}
 +
done
 +
 +
}
 +
 
 +
filtro_local()
 +
{
 +
echo "- Filtro de pacotes:"
 +
for porta in ${PORTAS_TCP_SERVIDOR}; do
 +
echo "  - Libera porta ${porta}/TCP."
 +
iptables -A INPUT -p tcp --dport ${porta} -j ACCEPT
 +
done
 +
for porta in ${PORTAS_UDP_SERVIDOR}; do
 +
echo "  - Libera porta ${porta}/UDP."
 +
iptables -A INPUT -p udp --dport ${porta} -j ACCEPT
 +
done
 +
echo "  - Bloqueia o resto."
 +
iptables -P INPUT DROP
 +
}
 +
 
 +
filtro_roteamento()
 +
{
 +
echo "- Filtro de pacotes:"
 +
echo "  - Bloqueia da DMZ para a LAN interna."
 +
iptables -A FORWARD -s ${DMZ_REDE} -d ${LAN_REDE} -j DROP
 +
echo "  - Libera o resto."
 +
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
 +
}
 +
 
 +
status()
 
{
 
{
HTTP -> Cron [label="Agendamento"]
+
echo "#####################"
Cron -> RADIUS [label="Manipulação de usuários"]
+
echo "# Filtro de pacotes #"
HTTP -> MySQL [label="Cadastro de Usuários"]
+
echo "#####################"
MySQL -> HTTP
+
iptables -L -n -v
HTTP -> RADIUS
+
echo
 +
echo
 +
echo "#######"
 +
echo "# NAT #"
 +
echo "#######"
 +
iptables -t nat -L -n -v
 
}
 
}
</graphviz>
 
  
= Segurança via Filtro de Pacotes =
+
case ${1} in
O reforço da segurança via filtro de pacotes é relativamente fácil e rápido de se implementar. Por isso, e pelo resultado aceitável em servidores expostos na rede, é recomendado o seu uso. Entretanto, nunca deve ser considerado como elemento único ou final da proteção. Combinações com IDS e outras aplicações proativas são quase uma obrigatoriedade hoje em dia :-)
+
"start"|"restart")
 +
clear
 +
echo
 +
echo "Removendo:"
 +
limpa_regras
 +
echo
 +
echo "Aplicando:"
 +
politica_padrao
 +
echo
 +
echo "Para o acesso direto ao servidor:"
 +
regras_basicas
 +
filtro_local
 +
echo
 +
echo "Para o roteamento:"
 +
roteamento
 +
nat
 +
redir_portas
 +
filtro_roteamento
 +
echo
 +
echo "Pronto!"
 +
;;
 +
"stop")
 +
clear
 +
echo
 +
echo "Removendo:"
 +
limpa_regras
 +
echo
 +
echo "Aplicando:"
 +
politica_padrao
 +
roteamento
 +
nat
 +
echo
 +
echo "Pronto!"
 +
;;
 +
"status")
 +
clear
 +
status
 +
;;
 +
*)
 +
echo "Use: ${0} (start|stop|restart|status)"
 +
exit -1
 +
;;
 +
esac
 +
</syntaxhighlight>
 +
 
 +
==Controle de Tráfego==
 +
* Sugestão do Prof. Emerson:
 +
 
 +
[[Imagem:PT_2009-2_Classe-tc.png|thumb|350px|Imagem descritiva]]
 +
 
 +
<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 
 +
# variaveis
 +
 
 +
TAXA=4000 # 4Mbps
 +
UMPOR=`expr $TAXA / 100`
 +
 
 +
OURO=`expr $UMPOR \* 60` # 60% da taxa de transmissao
 +
PRATA=`expr $UMPOR \* 25` # 25% da taxa de transmissao
 +
BRONZE=`expr $UMPOR \* 15` # 15% da taxa de transmissao
 +
 
 +
DEV=eth1
 +
 
 +
# ----------- TC ------------------#
 +
# eliminando as regras anteriores
 +
tc qdisc del dev ${DEV} root 2>/dev/null
 +
 
 +
# adicionando a disciplina de fila na raiz
 +
tc qdisc add dev ${DEV} root handle 1:0 htb default 12
 +
 
 +
# criando a classe pai para limitar a velocidade
 +
tc class add dev ${DEV} parent 1:0 classid 1:1 htb rate ${TAXA}kbps ceil ${TAXA}kbps
 +
 
 +
# criando 3 classes (ouro, prata e bronze)
 +
tc class add dev ${DEV} parent 1:1 classid 1:10 htb rate ${OURO}kbps ceil ${TAXA}kbps
 +
tc class add dev ${DEV} parent 1:1 classid 1:11 htb rate ${PRATA}kbps ceil ${TAXA}kbps
 +
tc class add dev ${DEV} parent 1:1 classid 1:12 htb rate ${BRONZE}kbps ceil ${TAXA}kbps
 +
 
 +
# adicionando qdisc para cada classe
 +
tc qdisc add dev ${DEV} parent 1:10 handle 10: sfq perturb 10
 +
tc qdisc add dev ${DEV} parent 1:11 handle 11: sfq perturb 10
 +
tc qdisc add dev ${DEV} parent 1:12 handle 12: sfq perturb 10
 +
 
 +
# criando os filtros para direcionar os trafegos para cada classe de acordo com o IP
 +
# de destino
 +
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.1 flowid 1:10 # vai para ouro
 +
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.2 flowid 1:11 # vai para prata
 +
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.3 flowid 1:12 # vai para bronze
 +
</syntaxhighlight>
 +
 
 +
==Teste de Servidor DNS==
 +
<syntaxhighlight lang=python>
 +
#!/usr/bin/python
 +
 
 +
import os
 +
 
 +
def limpar(equipe, registro, servidor):
 +
enter=''
 +
print("Tecle ENTER...")
 +
raw_input(enter)
 +
os.system('clear')
 +
print('@' + servidor + ' ' + registro + ' ' + equipe)
  
Para o projeto, a configuração abaixo pode ser útil:
+
def main():
#!/bin/bash
+
equipes = {}
+
prefixo = '200.135.37'
# Caso geral
+
dominio = 'sj.ifsc.edu.br'
#
+
equipes.update({'iguana':'111'})
# Bloqueia tudo
+
equipes.update({'mlwnetworks':'112'})
iptables -P INPUT DROP
+
equipes.update({'technet':'113'})
#
+
equipes.update({'urano':'114'})
# Apaga as linhas antigas
+
equipes.update({'epsilon':'115'})
iptables -F
 
#
 
# Libera o mínimo: interface local (loopback) e conexões já estabelecidas
 
iptables -A INPUT -i lo -j ACCEPT
 
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
 
# Libera aplicações TCP
 
#
 
# SSH
 
iptables -A INPUT -p tcp --dport 22 --syn -j ACCEPT
 
#
 
# HTTP
 
iptables -A INPUT -p tcp --dport 80 --syn -j ACCEPT
 
 
# Libera aplicações UDP
 
#
 
# DHCP
 
iptables -A INPUT -p udp --dport 67 -j ACCEPT
 
#
 
# Autenticação RADIUS (via proxy proxy.sj.ifsc.edu.br)
 
iptables -A INPUT -s proxy.sj.ifsc.edu.br -p udp --dport 1812 -j ACCEPT
 
  
 +
for equipe in equipes:
 +
for registro in ('SOA', 'NS', 'MX', 'A'):
 +
limpar(equipe, registro, prefixo + '.65')
 +
os.system('dig @' + prefixo + '.65 ' + registro +
 +
' ' + equipe + '.' + dominio)
 +
limpar(equipe, registro, prefixo + '.' + equipes[equipe])
 +
os.system('dig @' + prefixo + '.' + equipes[equipe] +
 +
' ' + registro + ' ' + equipe + '.' + dominio)
 +
 +
if __name__ == '__main__':
 +
main()
 +
</syntaxhighlight>
  
<center><small>[[Projeto Integrador - 2009.2#Gerência de Rede|Página principal do Projeto]]</small></center>
+
{{Voltar|Projeto Integrador - 2009.2#Gerência de Redes|Página principal do Projeto}}

Edição atual tal como às 19h49min de 8 de dezembro de 2009

Organização

<graphviz> digraph Serviços { splines = true

subgraph clusterRede { label = "Rede" DHCP }

subgraph clusterAplicacao { label = "Aplicação" DNS HTTP MySQL SMTP IMAP }

DHCP -> DNS -> HTTP MySQL -> HTTP -> MySQL DNS -> SMTP -> HTTP DNS -> IMAP -> HTTP } </graphviz>

Integração entre Aplicações

À espera da necessidade dos alunos :-)


Scripts

Firewal

#!/bin/bash


# Variáveis: MEXA aqui!
#
# Interfaces
EXTERNA_IFACE="eth0"
DMZ_IFACE="eth0:0"
LAN="eth0:1"
#
# Redes
EXTERNA_REDE="200.135.37.0/24"
DMZ_REDE="172.31.0.16/30"
LAN_REDE="172.31.0.0/28"
#
# Servidores
ROTEADOR="200.135.37.82"
DMZ_WEB="172.31.0.17"
#
# Portas
PORTAS_TCP_SERVIDOR="22"
PORTAS_UDP_SERVIDOR=""
PORTAS_TCP_WEB="25 80"
PORTAS_UDP_WEB="53"


limpa_regras()
{
	echo "- Antigas regras de NAT."
	iptables -t nat -F
	
	echo "- Antigas regras de filtro de pacotes."
	iptables -F
}

politica_padrao()
{
	echo "- Política padrão para NAT."
	iptables -t nat -P PREROUTING ACCEPT
	iptables -t nat -P POSTROUTING ACCEPT
	iptables -t nat -P OUTPUT ACCEPT
	
	echo "- Política padrão para filtro de pacotes."
	iptables -P INPUT ACCEPT
	iptables -P FORWARD ACCEPT
	iptables -P OUTPUT ACCEPT
}


regras_basicas()
{
	echo "- Regras básicas:"
	echo "  - Loopback."
	iptables -A INPUT -i lo -j ACCEPT
	echo "  - Conexões ativas."
	iptables -A INPUT   -m state --state RELATED,ESTABLISHED -j ACCEPT
}

roteamento()
{
	echo "- Roteamento."
	sysctl -w net.ipv4.ip_forward=1 > /dev/null
}

nat()
{
	echo "- NAT para as redes internas."
	iptables -t nat -A POSTROUTING -o ${EXTERNA_IFACE} -j MASQUERADE
}

redir_portas()
{	echo "- De externa para o servidor Web:"
	for porta in ${PORTAS_TCP_WEB}; do
		echo "  - Redireciona porta ${porta}/TCP."
		iptables -t nat -A PREROUTING -d ${ROTEADOR} -p tcp \
			--dport ${porta} -j DNAT --to ${DMZ_WEB}
	done
	for porta in ${PORTAS_UDP_WEB}; do
		echo "  - Redireciona porta ${porta}/UDP."
		iptables -t nat -A PREROUTING -d ${ROTEADOR} -p udp \
			--dport ${porta} -j DNAT --to ${DMZ_WEB}
	done
	
}

filtro_local()
{
	echo "- Filtro de pacotes:"
	for porta in ${PORTAS_TCP_SERVIDOR}; do
		echo "  - Libera porta ${porta}/TCP."
		iptables -A INPUT -p tcp --dport ${porta} -j ACCEPT
	done
	for porta in ${PORTAS_UDP_SERVIDOR}; do
		echo "  - Libera porta ${porta}/UDP."
		iptables -A INPUT -p udp --dport ${porta} -j ACCEPT
	done
	echo "  - Bloqueia o resto."
	iptables -P INPUT DROP
}

filtro_roteamento()
{
	echo "- Filtro de pacotes:"
	echo "  - Bloqueia da DMZ para a LAN interna."
	iptables -A FORWARD -s ${DMZ_REDE} -d ${LAN_REDE} -j DROP
	echo "  - Libera o resto."
	iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
}

status()
{
	echo "#####################"
	echo "# Filtro de pacotes #"
	echo "#####################"
	iptables -L -n -v
	echo
	echo
	echo "#######"
	echo "# NAT #"
	echo "#######"
	iptables -t nat -L -n -v
}

case ${1} in
	"start"|"restart")
		clear
		echo
		echo "Removendo:"
		limpa_regras
		echo
		echo "Aplicando:"
		politica_padrao
		echo
		echo "Para o acesso direto ao servidor:"
		regras_basicas
		filtro_local
		echo
		echo "Para o roteamento:"
		roteamento
		nat
		redir_portas
		filtro_roteamento
		echo
		echo "Pronto!"
		;;
	"stop")
		clear
		echo
		echo "Removendo:"
		limpa_regras
		echo
		echo "Aplicando:"
		politica_padrao
		roteamento
		nat
		echo
		echo "Pronto!"
		;;
	"status")
		clear
		status
		;;
	*)
		echo "Use: ${0} (start|stop|restart|status)"
		exit -1
		;;
esac

Controle de Tráfego

  • Sugestão do Prof. Emerson:
Imagem descritiva
#!/bin/bash

# variaveis

TAXA=4000 # 4Mbps
UMPOR=`expr $TAXA / 100`

OURO=`expr $UMPOR \* 60` # 60% da taxa de transmissao
PRATA=`expr $UMPOR \* 25` # 25% da taxa de transmissao
BRONZE=`expr $UMPOR \* 15` # 15% da taxa de transmissao

DEV=eth1

# ----------- TC ------------------#
# eliminando as regras anteriores
tc qdisc del dev ${DEV} root 2>/dev/null

# adicionando a disciplina de fila na raiz
tc qdisc add dev ${DEV} root handle 1:0 htb default 12

# criando a classe pai para limitar a velocidade
tc class add dev ${DEV} parent 1:0 classid 1:1 htb rate ${TAXA}kbps ceil ${TAXA}kbps

# criando 3 classes (ouro, prata e bronze)
tc class add dev ${DEV} parent 1:1 classid 1:10 htb rate ${OURO}kbps ceil ${TAXA}kbps
tc class add dev ${DEV} parent 1:1 classid 1:11 htb rate ${PRATA}kbps ceil ${TAXA}kbps
tc class add dev ${DEV} parent 1:1 classid 1:12 htb rate ${BRONZE}kbps ceil ${TAXA}kbps

# adicionando qdisc para cada classe
tc qdisc add dev ${DEV} parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev ${DEV} parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev ${DEV} parent 1:12 handle 12: sfq perturb 10

# criando os filtros para direcionar os trafegos para cada classe de acordo com o IP
# de destino 
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.1 flowid 1:10 # vai para ouro
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.2 flowid 1:11 # vai para prata
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.3 flowid 1:12 # vai para bronze

Teste de Servidor DNS

#!/usr/bin/python

import os

def limpar(equipe, registro, servidor):
	enter=''
	print("Tecle ENTER...")
	raw_input(enter)
	os.system('clear')
	print('@' + servidor + ' ' + registro + ' ' + equipe)

def main():
	equipes = {}
	prefixo = '200.135.37'
	dominio = 'sj.ifsc.edu.br'
	equipes.update({'iguana':'111'})
	equipes.update({'mlwnetworks':'112'})
	equipes.update({'technet':'113'})
	equipes.update({'urano':'114'})
	equipes.update({'epsilon':'115'})

	for equipe in equipes:
		for registro in ('SOA', 'NS', 'MX', 'A'):
			limpar(equipe, registro, prefixo + '.65')
			os.system('dig @' + prefixo + '.65 ' + registro +
				' ' + equipe + '.' + dominio)
			limpar(equipe, registro, prefixo + '.' + equipes[equipe])
			os.system('dig @' + prefixo + '.' + equipes[equipe] +
				' ' + registro + ' ' + equipe + '.' + dominio)
				
if __name__ == '__main__':
	main()



Voltar para Página principal do Projeto