quinta-feira, 21 de maio de 2009

Artigo - Squid com Autenticação manual facilitado por script

Neste artigo vamos instalar um script muito simples para manipular o squid em uma pequena rede. Este script nos ajudará de forma bem simples e objetiva fazer as tarefas mais comuns como adicionar/excluir usuário, definir a senha do usuário, adicionar e remover sites proibidos, permitidos e sites para o horário de almoço.

Primeiramente vamos instalar os pacotes

# apt-get update
# apt-get install squid squidview dialog

Edite seu squid.conf, comente a linha "http_access deny all" e insira as linhas abaixo ao final do arquivo( verifique o caminho do arquivo ncsa_auth da sua distribuição)

# vim /etc/squid/squid.conf
# -------------------------------------------------------------------------
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/autenticacao
auth_param basic children 5
auth_param basic realm Digite seu usuário e senha

authenticate_ttl 1 minute
authenticate_ip_ttl 5 minutes

acl updates url_regex -i "/etc/squid/updates"
acl usuariosliberados proxy_auth "/etc/squid/usuariosliberados"
acl usuariosexcecao proxy_auth "/etc/squid/usuariosexcecao"
acl sitesproibidos url_regex -i "/etc/squid/sitesproibidos"
acl usuarioslimitados proxy_auth "/etc/squid/usuarioslimitados"
acl sitespermitidos url_regex -i "/etc/squid/sitespermitidos"
acl sitesalmoco url_regex -i "/etc/squid/almoco"
acl happyh time MTWHF 11:30-13:30

http_access allow updates !sitesproibidos
http_access allow usuarioslimitados happyh sitesalmoco !sitesproibidos
http_access allow usuarioslimitados sitespermitidos !sitesproibidos
http_access allow usuariosexcecao !sitesproibidos
http_access allow usuariosliberados
http_access deny all
#--------------------------------------------------------FIM----------------

Edite o arquivo squidadm e cole o script abaixo dentro dele

# vim /usr/local/bin/squidadm

# ---------------------------------------------------------------------------
#!/bin/bash
# Autor: Gelber de Arruda Junior juniorwinfor@yahoo.com.br
# Data: 15/05/2009
# Função do Script: Administrar squid com autenticação
#
# Este programa é um software livre que pode ser copiado e distribuído
# nos termos da Licença Pública Geral GNU (GNU General Public License -
# GPL) versão 2 da licença ou, a seu critério, qualquer versão posterior.
# Este programa foi criado na expectativa de ser útil, porém NÃO POSSUI
# NENHUMA GARANTIA, EXPRESSA, IMPLÍCITA OU DE ATENDIMENTO A ALGUMA
# DETERMINADA FINALIDADE.
Usuariosliberados=/etc/squid/usuariosliberados
Usuarioslimitados=/etc/squid/usuarioslimitados
Usuariosexcecao=/etc/squid/usuariosexcecao
Sitesperm=/etc/squid/sitespermitidos
Sitespro=/etc/squid/sitesproibidos
Sitesupdates=/etc/squid/updates
Siteshappy=/etc/squid/almoco
Arqusu=/etc/squid/cadusuarios
Arqsenhas=/etc/squid/autenticacao
Listusu="$Arqusu"
TMPFILE1=/tmp/tmp1
TMPFILE2=/tmp/tmp2
TMPFILE3=/tmp/tmp3
TMPFILE4=/tmp/tmp4

Squidmenu() {
while : ; do
resposta=
resposta=$( dialog --stdout \
--title 'Administração de Navegação' \
--ok-label 'OK' \
--cancel-label 'Voltar' \
--menu 'Opções:' 0 0 0 1 'Exibir Listagem' 2 'Manipular Usuários' 3 'Sites de Updates' 4 'Sites Liberados' \
5 'Sites Bloqueados' 6 'Sites Almoço' 7 'SquidView' 9 'Aplicar' )
[ $? -ne 0 ] && break
case "$resposta" in
1) Mostrarlistagem ;;
2) titulo="Usuários"
listusu=$Arqusu
Manipusu ;;
3) titulo=Sites_de_Updates
listsite=$Sitesupdates
Manipsites ;;
4) titulo="Sites_Permitidos"
listsite=$Sitesperm
Manipsites ;;
5) titulo="Sites_Bloqueados"
listsite=$Sitespro
Manipsites ;;
6) titulo="Sites_Almoço"
listsite=$Siteshappy
Manipsites ;;
7) squidview ;;
9) Aplicalist ;;
0) break ;;
esac
done
}

Manipusu() {
while : ; do
[ -s "$listusu" ] || echo "usuario|limitado|senha" >> $listusu
resposta3=$( \
dialog --stdout \
--title ''$titulo'' \
--ok-label 'Adicionar' \
--extra-button \
--extra-label 'Editar' \
--cancel-label 'Voltar' \
--menu '' 0 60 0 \
$(for lnusu in `cat $listusu`; do
nmusu=`echo $lnusu | awk -F "|" '{print $1}'`
catusu=`echo $lnusu | awk -F "|" '{print $2}'`
echo "$nmusu $catusu"
done))
bt="$?"
case "$bt" in
0) usuadicionando=$( dialog --stdout \
--title 'Adicionar Usuários' \
--ok-label 'Adicionar' \
--cancel-label 'Cancelar' \
--inputbox 'Digite o novo usuário a ser adicionado:' \
0 0 )
if [ -z "$usuadicionando" ]; then
sleep 0
else
senhaadicionando=$( dialog --stdout \
--title 'Senha:' \
--ok-label 'OK' \
--cancel-label 'Cancelar' \
--inputbox 'Digite uma senha para o novo usuário:' \
0 0 )
if [ -z "$senhaadicionando" ]; then
sleep 0
else
echo "$usuadicionando|Limitado|$senhaadicionando" >> $listusu
fi
fi
;;
1) break ;;
3) resposta2=
resposta2=$( dialog --stdout \
--title 'Editar Usuário' \
--ok-label 'OK' \
--cancel-label 'Voltar' \
--menu 'Selecione uma opção para o Usuário '$resposta3'' 0 0 0 1 'Definir Senha' 2 'Definir Categoria' \
3 'Excluir' )
if [ $? -ne 0 ]; then
sleep 0
else
case "$resposta2" in
1) senhaeditando=$( dialog --stdout \
--title 'Senha:' \
--ok-label 'OK' \
--cancel-label 'Cancelar' \
--inputbox 'Digite uma senha para o usuário '$resposta3':' \
0 0 "$senhausu" )
if [ -z "$senhaeditando" ]; then
sleep 0
else
[ -e $TMPFILE1 ] && rm $TMPFILE1
for lnusu in `cat $listusu`; do
nmusu=`echo $lnusu | awk -F "|" '{print $1}'`
catusu=`echo $lnusu | awk -F "|" '{print $2}'`
senhausu=`echo $lnusu | awk -F "|" '{print $3}'`
if [ "$nmusu" = "$resposta3" ]; then
echo "$nmusu|$catusu|$senhaeditando" >> $TMPFILE1
else
echo $lnusu >> $TMPFILE1
fi
done
senhausu=
mv $TMPFILE1 $listusu
fi ;;
2) Defcategusu ;;
3) [ -e $TMPFILE4 ] && rm $TMPFILE4
dialog \
--title 'Confirma exclusão?' \
--yesno "Tem certeza que deseja excluir o usuário "$resposta3"?
" 0 0
if [ "$?" -ne 0 ]; then
sleep 0
else
egrep -v "$resposta3" $Arqusu > $TMPFILE4
mv $TMPFILE4 $Arqusu
fi
;;
esac
fi
;;
esac
done
}

Mostrarlistagem() {
echo " Usuário | Categoria | Senha |" > $TMPFILE3
echo " | | |" >> $TMPFILE3
for cli in `cat $Arqusu`; do
echo $cli | awk -F "|" '{printf"%15s | %13s | %14s |\n" ,$1,$2,$3}' >> $TMPFILE3
done
echo "" >> $TMPFILE3
dialog \
--title 'Listagem de Usuários' \
--textbox $TMPFILE3 \
0 0
}


Defcategusu() {
[ -s "$listusu" ] || echo "usuario|senha" >> $listusu
resposta4=
resposta4=$( dialog --stdout \
--title 'Categoria de Usuário' \
--ok-label 'OK' \
--cancel-label 'Sair' \
--menu 'Selecione uma categoria para o usuário '$resposta3'' 0 0 0 1 'Limitado' \
2 'Exceção' 3 'Liberado' )
[ $? -ne 0 ] && break
[ -e $TMPFILE2 ] && rm $TMPFILE2
for lnusucad in `cat $Arqusu`; do
senhausu=`echo "$lnusucad" | awk -F "|" '{print $3}'`
catcli=`echo "$lnusucad" | awk -F "|" '{print $2}'`
clinome=`echo "$lnusucad" | awk -F "|" '{print $1}'`
if [ "$clinome" = "$resposta3" ]; then
[ "$resposta4" = "1" ] && echo "$clinome|Limitado|$senhausu" >> $TMPFILE2
[ "$resposta4" = "2" ] && echo "$clinome|Exceção|$senhausu" >> $TMPFILE2
[ "$resposta4" = "3" ] && echo "$clinome|Liberado|$senhausu" >> $TMPFILE2
else
echo "$lnusucad" >> $TMPFILE2
fi
done
mv $TMPFILE2 $Arqusu
}

Aplicalist() {
echo "NenhumNomePodeSerCompatívelcomEssaLinha93453489347" > $Usuariosliberados
echo "NenhumNomePodeSerCompatívelcomEssaLinha93453489347" > $Usuarioslimitados
echo "NenhumNomePodeSerCompatívelcomEssaLinha93453489347" > $Usuariosexcecao
[ -e $Arqsenhas ] && rm $Arqsenhas
touch $Arqsenhas
for linecli in `cat $Arqusu`; do
senhausu=`echo "$linecli" | awk -F "|" '{print $3}'`
catcli=`echo "$linecli" | awk -F "|" '{print $2}'`
clinome=`echo "$linecli" | awk -F "|" '{print $1}'`
[ "$catcli" = "Liberado" ] && echo "$clinome" >> $Usuariosliberados
[ "$catcli" = "Limitado" ] && echo "$clinome" >> $Usuarioslimitados
[ "$catcli" = "Exceção" ] && echo "$clinome" >> $Usuariosexcecao
param=
[ -s "$Arqsenhas" ] || param="-c"
htpasswd -b $param $Arqsenhas $clinome $senhausu
clear
done
squid -k reconfigure
}

Manipsites() {
[ -s "$listsite" ] || echo "www.sitecadastrado.com" >> $listsite
catt=
while : ; do
resposta3=$( \
dialog --stdout \
--title ''$titulo'' \
--ok-label 'Adicionar' \
--extra-button \
--extra-label 'Remover' \
--cancel-label 'Voltar' \
--menu '' 30 70 27 \
$(for st in `cat $listsite`; do
mostrar=`echo $st | awk -F "|" '{print $1}'`
catt=`echo $st | awk -F "|" '{print $2}'`
[ -z "$catt" ] && catt="-"
echo "$mostrar" "$catt"
done))
bt="$?"
case "$bt" in
0) siteadding=$( dialog --stdout \
--title 'Adicionar Site' \
--ok-label 'Adicionar' \
--cancel-label 'Cancelar' \
--inputbox 'Digite o novo site a ser adicionado:' \
0 0 )
if [ -z "$siteadding" ]; then
sleep 0
else
echo $siteadding >> $listsite
fi
;;
1) break ;;
3) dialog \
--title 'Confirma exclusão?' \
--yesno "Tem certeza que deseja excluir o site "$resposta3"?
" 0 0
if [ "$?" -ne 0 ]; then
sleep 0
else
egrep -v "$resposta3" $listsite > $TMPFILE4
mv $TMPFILE4 $listsite
fi
;;
esac
done
}

Squidmenu
# ----------------------------------------FIM-------------------------------------

Dê permissão de executável para o script

# chmod +x /usr/local/bin/squidadm

Chame o script e entre em todas as opções começando da 1 até a 9 para que ele crie todos os arquivos necessários para o squid iniciar e inicie o squid.

# squid &

Este script em conjunto com as configurações no squid.conf trabalha da seguinte forma:

- Trabalha com 4 lista de sites
Proibidos - Sites proibidos a todos exceto usuários liberados
Permitidos - Sites permitidos a todos exceto sem autenticação
Almoço - Sites permitidos aos usuários limitados no horário de almoço
Updates - Sites liberados sem autenticação para atualizar sistema e antivirus e fazer alguns acessos java a bancos

- Trabalha com 4 tipos(categorias) de usuários
Sem autenticação(não loga como usuário) - Somente tem acesso a lista de sites updates
Usuarios limitados - Tem acesso aos sites permitidos durante o tempo todo e acesso aos sites permitidos + sites almoço durante o horário de almoço
Usuários exceção - Tem acesso a todos os sites exceto os sites proibidos
Usuário liberados - Tem acesso a todos os sites

- Em "manipular usuários" você pode
Adicionar usuários
Editar mudando a senha ou o tipo (categoria)
Excluir o usuário

Para uma melhor compreensão veja a planilha abaixo.

Não se esqueça de colocar o proxy configurado manualmente nas estações que irão passar pelo proxy. Uma boa dica para que os usuários não retirem essa configuração burlando o proxy é colocar a seguinte linha no script de firewall:

iptables -t nat -A PREROUTING -i eth1 -p tcp -d ! 200.201.174.207 --dport 80 -j REDIRECT --to-port 3128

Bom proveito!!!

Artigo - OpenVPN + Web GUI

Pra quem procura um software livre para implantar uma VPN, fácil de configurar, com ótimo desempenho, e compatível com a criptografia TLS/SSL(ou seja, muito seguro), minha dica de hoje é o OpenVPN. Neste artigo vamos aprender a configurar esse poderoso software pra quem quer interligar redes de filiais com gateway VPN(servidor linux) e pra quem quer tambem estações autônomas espalhadas pelo mundo com um link de internet.E vamos instalar um software que permitirá o administrador da rede acompanhar as conexões da VPN em uma interface web amigável, o OpenVPN Web GUI.

Distribuição Usada:

Ubuntu Server 8.04 (mas deve funcionar em qualquer uma)

Pacotes necessários:

OpenVPN-2.09
lzo-2.03
openssl
libssl-dev
apache2


Considerações:

Matriz
Internet 201.58.xxx.xx
Rede - 192.168.0.0/24
Gateway VPN - eth1 - 192.168.0.254
Túnel - 10.0.0.1

Filial
Internet - (ip qualquer)
Rede - 192.168.1.0/24
Gateway VPN - eth1 - 192.168.1.254
Túnel - 10.0.0.2

Estação autônoma(um notebook em viagem por exemplo)
Rede - (faixa qualquer)
Gateway VPN - N/A (OpenVPN Cliente Windows)
Túnel - 10.0.0.3

Etapas comuns dos gateways vpn(servidores matriz e filiais)

Instale os pacotes

# apt-get update
# apt-get install openssl libssl-dev apache2

Antes do OpenVPN instalar o LZO

# cd /usr/src
# wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
# tar xzvf lzo-2.03.tar.gz
# cd lzo-2.03
# ./configure
# make
# make install

Agora o OpenVPN

# cd /usr/src
# wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
# tar zxvf openvpn-2.0.9.tar.gz
# cd openvpn-2.0.9
# ./configure
# make && make install

No Servidor

Vamos criar a pasta de configuração do OpenVPN

# mkdir /etc/openvpn

O OpenVPN vem com um conjunto de scripts que facilitam a criação dos certificados para aumentar a segurança da nossa VPN, vamos copiar esses scripts para a pasta de configuração do OpenVPN.

# cp -R /usr/src/openvpn-2.0.9/easy-rsa /etc/openvp

Vamos criar o arquivo principal de configuração de nosso servidor

# vim /etc/openvpn/matriz.conf

# Define o ip do servidor dentro do túnel seguro
ifconfig 10.0.0.1 255.255.255.0
# Arquivo onde ficará gravado os ips dos clientes
# para fazermos um dhcp com ip fixo, uma espécie de pool dhcp.
ifconfig-pool-persist /etc/openvpn/ipp.txt
# Porta onde o servidor irá escutar
port 1194
# Protocolo usado
# dê preferencia ao UDP por ser muito mais rápido
proto udp
# Interface virtual a ser criada(túnel)
dev tap0
# Define que o servidor será autenticador de certificados.
tls-server
# Pasta onde os certificados e chaves estão com respectivos nomes
cd /etc/openvpn/easy-rsa/keys
ca ca.crt
cert servidor.crt
key servidor.key
dh dh1024.pem
# Arquivo que irá impedir conexões através de certificados revogados
crl-verify /etc/openvpn/easy-rsa/keys/crl.pem
# Proteção adicional com uma chave estática( além dos certificados)
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
user openvpn
group openvpn
mode server
max-clients 30
server 10.0.0.0 255.255.255.0
# Configurações do servidor dhcp
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option WINS 192.168.0.1"
push "default-gateway 192.168.0.254"
# Essa linha faz com que o gateway principal da estação windows(autônoma)
# conectada diretamente a vpn seja o ip do gateway da matriz
# possibilitando assim bloquear sites pelo squid da matriz por exemplo.
push "redirect-gateway def1"
# Mantem o túnel ativo mesmo em caso de inatividade
ping 10
ping-restart 120
push "ping 10"
push "ping-restart 40"
# Compactação usada
comp-lzo
status-version 2
# Configuração de Log
status /etc/openvpn/statusgwmatriz.log
verb 4
log /etc/openvpn/gwmatriz.log
log-append /etc/openvpn/appendgwmatriz.log
# Scripts que serão executados com a
# VPN subir(.up) e quando for derrubada(.down)
up /etc/openvpn/gwmatriz.up
down /etc/openvpn/gwmatriz.down
###### FIM DO ARQUIVO ##############

Crie o arquivo /etc/openvpn/gwmatriz.up com seguinte conteúdo:

#!/bin/sh
ip route add 192.168.1.0/24 via 10.0.0.2
exit 0
###### FIM DO ARQUIVO ##############

e o /etc/openvpn/gwmatriz.down com o seguinte conteúdo:

#!/bin/sh
ip route del 192.168.1.0/24 via 10.0.0.2
exit 0
###### FIM DO ARQUIVO ##############

Note que você devera adicionar uma linha dentro dos arquivos gwmatriz.up e gwmatriz.down para cada gateway vpn em filiais obedecendo a faixa em que a filial for usar e em qual IP o OpenVPN irá atribuir a ela dentro do túnel seguro, pois eles adicionaram as rotas no kernel para que os pacotes com destino a essas redes das filiais encontrem o caminho, no servidor da filial digite "ifconfig tap0" depois que a conexão estiver estabelecida para saber qual o ip que foi utilizado.

Coloque as duas linhas a seguir no arquivo "/etc/rc.local" ou qualquer outro script de inicialização:

/sbin/sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth1 -j MASQUERADE

A primeira linha habilita o roteamento de pacotes e a segunda permite que todos os pacotes provenientes da rede 192.168.1.0/24(filial) alcancem a rede da matriz, adicione uma para cada rede de filial. eth1 é a interface ligada a rede interna.

Vamos gerar uma chave estática de autenticação que é uma proteção adicional a nossa VPN

# cd /etc/openvpn
# openvpn --genkey --secret ta.key
# mv ta.key easy-rsa/keys/

Agora vamos gerar os certificados. Edite o arquivo /etc/openvpn/easy-rsa/vars para definirmos as variáveis.

# vim /etc/openvpn/easy-rsa/vars

* KEY_COUNTRY: coloque BR para Brasil;
* KEY_PROVINCE: coloque a sigla do seu estado (MG, por exemplo);
* KEY_CITY: coloque o nome ou sigla da sua cidade;
* KEY_ORG: coloque o nome da sua empresa;
* KEY_EMAIL: coloque o email do administrador do servidor.

Agora vamos carregar as variáveis definidas para gerarmos os certificados

# cd /etc/openvpn/easy-rsa/
# source vars

O próximo comando é limpar a pasta de chaves, cuidado pois apaga todos os certificados gerados, inclusive do servidor.

# ./clean-all

Vamos gerar a autoridade certificadora

# ./build-ca

Nunca apague esses arquivos gerados senão terá que gerar todos os certificados novamente, pois são assinados digitalmente por essas chaves

Para gerar o certificado do servidor digite

# ./build-key-server servidor

Onde "servidor" é o nome do seu servidor de vpn( preencha o campo "Common Name" o nome do seu servidor. Para uma autenticação automática com os certificados não digite senha ao criar o certificado e responde "y" nas perguntas finais.

Agora vamos gerar os parametros DH para criptografia com o comando:

# ./build-dh

Os arquivos para uso do TLS no servidor estão prontos, agora vamos gerar certificados para os clientes.
Toda vez que for criar um novo certificado para os clientes digite:

# cd /etc/openvpn/easy-rsa/
# source vars
# ./buld-key filial

Onde "filial" é o nome do certificado de cliente. Preencha os dados corretamente e responda sim as duas últimas perguntas. É melhor que o certificado não tenha senha para que nossa VPN fique menos dependente de interação humana desnecessária.

Para revogar o certificado use

# cd /etc/openvpn/easy-rsa/
# source vars
# ./revoke-full filial

Onde "filial" é o nome do certificado a revogar

Antes de subir a VPN crie um certificado de cliente qualquer e revogue em seguida para que o script gere um arquivo crl.pem(que define os certificados revogados) válido para nossa vpn começar a funcionar.

Vamos criar um usuário para o OpenVPN

# adduser --system --disabled-password --disabled-login --group openvpn

e dar permissão para ele de acessar a pasta onde estão os certificados

# chown -R /etc/openvpn/easy-rsa/keys/

Agora vamos fazer "subir" nossa VPN no servidor

# openvpn --config /etc/openvpn/matriz.conf &

Para acompanhar o log e verificar possíveis erros digite

# tail -f /etc/openvpn/gwmatriz.log

Vamos verificar se a interface virtual do túnel está de pé

# ifconfig tap0

Servidores Filiais( gateways VPN)

Após concluir os passos da seção "Etapas comuns", vamos criar a pasta de configuração do OpenVPN

# mkdir /etc/openvpn

Vamos criar o arquivo de configuração de nossa filial

# vim /etc/openvpn/filial.conf

com o seguinte conteúdo:

# ip do servidor(ip real, pode se usar nome ex. vpnserver.no-ip.org)
remote 201.58.xxx.xx
proto udp
# especifica que o servidor irá verificar o certificado
ns-cert-type server
port 1194
# tenta infinitamente autenticar mesmo depois de nao conseguir
auth-retry nointeract
client
dev tap
comp-lzo
# mantem o túnel de pé por "echo request"
keepalive 10 120
# utilização da chave estática
tls-client
tls-auth ta.key 1
# certificado raiz e certificado da filial gerado no servidor
ca ca.crt
cert filial.crt
key filial.key
up /etc/openvpn/filial.up
down /etc/openvpn/filial.down
log /etc/openvpn/filial.log
###### FIM DO ARQUIVO ##############

Crie o arquivo /etc/openvpn/filial.up com seguinte conteúdo:

#!/bin/sh
ip route add 192.168.0.0/24 via 10.0.0.1
exit 0
###### FIM DO ARQUIVO ##############

e o /etc/openvpn/filial.down com o seguinte conteúdo:

#!/bin/sh
ip route del 192.168.0.0/24 via 10.0.0.1
exit 0
###### FIM DO ARQUIVO ##############

Coloque as duas linhas a seguir no arquivo "/etc/rc.local" ou qualquer outro script de inicialização:

/sbin/sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE

A primeira linha habilita o roteamento de pacotes e a segunda permite que todos os pacotes provenientes da rede 192.168.0.0/24(matriz) alcancem a rede da filial. eth1 é a interface ligada a rede interna.

Para se conectar a VPN precisamos copiar 4(quatro) arquivos que geramos para autenticação, para isso procure utilizar um método seguro, no exemplo utilizaremos o "scp".

scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn/
scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/filial.key /etc/openvpn/
scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/filial.crt /etc/openvpn/
scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/ta.key /etc/openvpn/

Agora vamos subir o lado da filial da VPN

# openvpn --config /etc/openvpn/filial.conf &

Para acompanhar o log e verificar possíveis erros digite

# tail -f /etc/openvpn/filial.log

Vamos verificar tentar pingar por dentro do túnel os ips da matriz.

# ping 10.0.0.1
# ping 192.168.0.254

Para você conseguir pingar os ips das estações na matriz elas devem ter como gateway o ip do gateway vpn(192.168.0.254) assim também acontece na filial, o gateway das estações na filial deve ser 192.168.1.254.



Estações Windows autônomas

Baixe e instale http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe

Dentro da pasta C:\Arquivos de programas\OpenVPN\config\ crie um arquivo qualquer com extenção .ovpn(Ex. cliwindows.ovpn) com o seguinte conteúdo:

remote 201.58.xxx.xx # ip do nosso servidor(pode se usar nome ex. vpnserver.no-ip.org)
proto udp
ns-cert-type server
port 1194
auth-retry nointeract
client
# a linha abaixo faz com que se aplique as
# configurações "push" no conf do servidor.
pull
dev tap
comp-lzo
keepalive 10 120
tls-client
tls-auth ta.key 1
# A linha abaixo adiciona a rota para a rede da matriz
route 192.168.0.0 255.255.255.0 10.0.0.1
ca ca.crt
cert cliwindows.crt
key cliwindows.key
###### FIM DO ARQUIVO ##############

No servidor da VPN gere e copie os certificados para o cliente windows, no exemplo utilizaremos o certificado "cliwindows" que geramos apartir do script ./build-key em nosso servidor. Coloque-o na mesma pasta (C:\Arquivos de programas\OpenVPN\config)
Agora basta dar dois cliques sobre o ícone do OpenVPN GUI na barra de tarefas para a conexão ser iniciada.

Instalação do OpenVPN Web GUI

Voltando ao servidor da matriz vamos instalar um pacote necessário

# apt-get install smarty

Crie a pasta para o OpenVPN Web GUI

# mkdir /var/www/owg
# cd /var/www/owg

Vamos baixar o pacote e descompactar

# wget http://hivelocity.dl.sourceforge.net/sourceforge/openvpn-web-gui/openvpn-web-gui-0.3.2b.tgz
# tar zxvf openvpn-web-gui-0.3.2b.tgz

De as permissões necessárias para o funcionamento

# chown -R www-data /var/www/owg
# chmod 755 /etc/openvpn/statusgwmatriz.log
# chmod -R 755 /etc/openvpn/easy-rsa/keys/

Para funcione no ubuntu é necessário que se modifique os scripts php nos seguintes arquivos:

/var/www/owg/action-buildcertificate.inc
/var/www/owg/action-downloadconfigfile.inc
/var/www/owg/action-certificates.inc
/var/www/owg/action-newcertificate.inc
/var/www/owg/action-config.inc
/var/www/owg/action-status.inc
/var/www/owg/action-downloadcertificate.inc
/var/www/owg/action-viewcertificate.inc
/var/www/owg/plugins/systemcheck/action.inc

Encontre dentro de cada um dos arquivos a expressão "Smarty.class.php" e mude pra "/usr/share/php/smarty/Smarty.class.php" de acordo com sua distribuição

Vamos substituir o arquivo config.inc por outro acertando os caminhos de acordo com sua distro.

# mv /var/www/owg/config.inc /var/www/owg/config.inc.original

# vim /var/www/owg/config.inc

Cole o conteúdo acertando os caminhos e arquivos em vermelho:

/var/www/owg/plugins/';

// If there are no plugins
// $config['Plugins'] = NULL;
// Otherwise, follow this example:
//$config['Plugins']['PLUGINMANE']['Folder'] = 'FOLDERNAME';

// The post-install helper plugin. Shows if PHP5 has the neccessary functions available
$config['Plugins']['systemcheck']['Folder'] = 'systemcheck';

// OPENVPN ________________________________

// Change: the configuration directory
$config['openvpn']['folder'] = '/etc/openvpn/';
// Change: configuration and status file names
$config['openvpn']['config'] = $config['openvpn']['folder'] .'matriz.conf';
$config['openvpn']['status'] = $config['openvpn']['folder'] .'statusgwmatriz.log';

// OPENSSL ________________________________

// Change: openssl keys directory
$config['openssl']['folder'] = '/etc/openvpn/easy-rsa/keys/';
// Change: different folders for Public Certificates, Certificate Requests and Private Keys.
// NOTE: openssl somehow respects only newpem folder (for Public Certificates).
$config['openssl']['pubfolder'] = '/usr/local/etc/openvpn/keys/newpem/';
$config['openssl']['reqfolder'] = '/usr/local/etc/openvpn/keys/newpem/';
$config['openssl']['prvfolder'] = '/usr/local/etc/openvpn/keys/newpem/';
// Change: openssl CA private and public keys
$config['openssl']['CA']['priv'] = 'file://'. $config['openssl']['folder'] .'ca.key';
$config['openssl']['CA']['pub'] = 'file://'. $config['openssl']['folder'] .'ca.crt';
// Change: openssl serial file
$config['openssl']['serial'] = $config['openssl']['folder'] .'serial';
// Change: openssl database
$config['openssl']['database'] = $config['openssl']['folder'] .'index.txt';
// Change: openssl configuration
$config['openssl']['config'] = array ('config' => $config['openvpn']['folder'] .'openssl.cnf',
'encrypt_key' => 0);
// NEW OPENSSL CERTIFICATE DEFAULTS _________

// Change all of them as it is done in your easy-rsa/vars
$config['openssl']['default']['expiration'] = 3560;
$config['openssl']['default']['countryName'] = 'CA';
$config['openssl']['default']['stateOrProvinceName'] = 'Ontario';
$config['openssl']['default']['localityName'] = 'Mississauga';
$config['openssl']['default']['organizationName'] = 'Home';
$config['openssl']['default']['organizationalUnitName'] = 'Enter Department Name';
$config['openssl']['default']['commonName'] = 'Enter First and Last names';
$config['openssl']['default']['emailAddress'] = 'Enter user@home.on.ca';

?>



Depois de feito acesse em seu navegador o endereço

http://192.168.0.254/owg


Pronto. Espero ter ajudado.

sábado, 16 de maio de 2009

Artigo - Imspector um proxy de IM

Neste artigo nós vamos aprender a administrar o MSN messenger através do proxy de mensagens instantâneas IMSPECTOR que até o presente momento se encontra na versão 0.8. Como essa ferramenta podemos especificar exatamente as Live IDS que poderam "conversar" no Messenger e também com quais LIVE IDS nossa rede poderá se comunicar, bloquear tranferencia de arquivos ou chat por webcam. Além disso iremos visualisar os relatórios de conversas das "vitimas" numa interface web amigável, e colocar o pequeno script para administrar o IMSPECTOR(apenas contatos).

Distribuição Usada:

Ubuntu Server 8.04 (mas deve funcionar em qualquer uma)

Pacotes necessários:

imspector-0.8.tar.gz
openssl
libssl-dev
apache2

Considerações:

O nosso imspector está rodando no gateway da rede.

Instale os pacotes

# apt-get update
# apt-get install openssl libssl-dev dialog apache2

# cd /usr/src
# wget http://www.imspector.org/downloads/imspector-0.8.tar.gz
# tar zxvf imspector-0.8.tar.gz
# cd imspector-0.8
# make
# make install

Agora vamos configurar o imspector.conf

# vim /usr/etc/imspector/imspector.conf

Vamos desativar os plugins que não usaremos. Procure as linhas a seguir:

icq_protocol=on
irc_protocol=on
msn_protocol=on
yahoo_protocol=on
gg_protocol=on
jabber_protocol=on

e modifique para:(ou a seu gosto)

icq_protocol=off
irc_protocol=off
msn_protocol=on
yahoo_protocol=off
gg_protocol=off
jabber_protocol=off


Caso deseje bloquear o uso da webcam e/ou transferencia de arquivos deixe as linhas abaixo desta forma:

# Block all filetransfers? (transferencia de arquivos)
block_files=on

# Block webcams?
block_webcams=on

Antes de iniciar, insira a seguinte linha ao seu script de firewall e restart seu script.

iptables -t nat -A PREROUTING -p tcp --destination-port 1863 -j REDIRECT --to-ports 16667

Agora vamos iniciar o imspector no modo debug para ver se ocorreu algum erro

# imspector -d &

Para monitorar as conversas vamos pegar um script cgi que se encontra na pasta /usr/src/imspector-0.8/contrib/ e disponibiliza-la para o apache. Verifique o caminho da pasta de scripts cgi da sua distribuiçao.

# mkdir /usr/lib/cgi-bin/imspector
# cp /usr/src/imspector-0.8/contrib/imspector.cgi /usr/lib/cgi-bin/imspector/

Defina as permissões

# chmod 744 -R /usr/lib/cgi-bin/imspector/

Para testar acesse no seu navegador:

http://IPDOSEUGATEWAY/cgi-bin/imspector/imspector.cgi

Agora vamos utilizar um pequeno shell script para manipular facilmente as acl's do imspector. Como ele trabalha?

Contatos Internos:
São os contatos que terão acesso por trás do gateway em questão, todos os outros serão bloqueados. Esses poderão ser da categoria "Aberto" que podem conversar com qualquer contato ou "Fechado" que estarão limitados a lista "Contatos externos". Todos os contatos internos podem conversar entre sí.

Mudar Categoria:
Alterna os contatos internos entre "Aberto" e "Fechado"

Contatos Externos:
É a lista de contatos no qual seus contatos internos da categoria "Fechado" podem conversar.

Aplicar mudanças:
Gera o arquivo acl.txt para o imspector, mata e reinicia o processo. Note que os Clientes Messenger perderão a conexão e terão que se reconectarem, o que normalmente acontece automaticamente.


Crie e edite o arquivo /usr/local/bin/imadmin

# vim /usr/local/bin/imadmin

Copie e cole o conteudo do arquivo abaixo:

#!/bin/bash
#Autor: Gelber de Arruda Junior juniorwinfor@yahoo.com.br
#Data: 15/05/2009
#Função do Script: Manipular Live IDS facilmente para acl's do imspector 0.8
#
# ATENÇÃO: instalar o dialog e psmisc( apt-get install dialog psmisc)
#
# Este programa é um software livre que pode ser copiado e distribuído
# nos termos da Licença Pública Geral GNU (GNU General Public License -
# GPL) versão 2 da licença ou, a seu critério, qualquer versão posterior.
# Este programa foi criado na expectativa de ser útil, porém NÃO POSSUI
# NENHUMA GARANTIA, EXPRESSA, IMPLÍCITA OU DE ATENDIMENTO A ALGUMA
# DETERMINADA FINALIDADE.

lvd=/usr/etc/imspector/liveids
lvdex=/usr/etc/imspector/liveidsex
acls=/usr/etc/imspector/acl.txt
TMPFILE1=/tmp/tmpf1
TMPFILE4=/tmp/tmpf4

Msnmenu() {
while : ; do
resposta=
resposta=$( dialog --stdout \
--title 'Administração Messenger' \
--ok-label 'OK' \
--cancel-label 'Voltar' \
--menu 'Opções:' 0 0 0 1 'Contatos Internos' 2 'Definir Categoria' 3 'Contatos Externos' \
4 'Aplicar Mudanças' )
[ $? -ne 0 ] && break
case "$resposta" in
1) lista="$lvd"
titulo=Lista_de_Contatos_Internos
Manipliveids
;;
2) Defcateg
;;
3) lista="$lvdex"
titulo=Lista_de_Contatos_Externos
Manipliveids
;;
4) Criaacltxt
killall imspector
imspector &
;;
0) break ;;
esac
done
}

Manipliveids() {
[ -s "$lista" ] || echo "exemplo@hotmail.com|Aberto" >> $lista
while : ; do
resposta3=
resposta3=$( \
dialog --stdout \
--title ''$titulo'' \
--ok-label 'Adicionar' \
--extra-button \
--extra-label 'Remover' \
--cancel-label 'Voltar' \
--menu '' 0 60 16 \
$(cont=0
for llvd in `cat $lista`; do
cont=`expr "$cont" + 1`
idlvd=`echo "$llvd" | awk -F "|" '{print $1}'`
[ -z "$idlvd" ] && idlvd=vazio
echo "$cont" "$idlvd"
done))
bt="$?"
case "$bt" in
0) lvdadding=$( dialog --stdout \
--title 'Adicionar Live ID' \
--ok-label 'Adicionar' \
--cancel-label 'Cancelar' \
--inputbox 'Digite a nova Live ID a ser adicionada:' \
0 0 )
if [ -z "$lvdadding" ]; then
sleep 0
else
echo "$lvdadding""|Fechado" >> $lista
fi
;;
1) break ;;
3) dialog \
--title 'Confirma exclusão?' \
--yesno "Tem certeza que deseja excluir Live ID de número "$resposta3"?
" 0 0
if [ "$?" -ne 0 ]; then
sleep 0
else
cont=0
[ -e $TMPFILE4 ] && rm $TMPFILE4
for exllvd in `cat $lista`; do
cont=`expr "$cont" + 1`
if [ "$resposta3" -eq "$cont" ]; then
sleep 0
else
echo "$exllvd" >> $TMPFILE4
fi
done
mv $TMPFILE4 $lista
fi
;;
esac
done
}
Defcateg(){
while : ; do
resposta=
resposta=$( dialog --stdout \
--title 'Definir categoria dos contatos' \
--ok-label 'Alterar' \
--cancel-label 'Voltar' \
--menu 'Selecione:' 0 0 0 $(
for llvd in `cat $lvd`; do
cadalvd=`echo $llvd | awk -F "|" '{print $1}'`
catlvd=`echo $llvd | awk -F "|" '{print $2}'`
echo "$cadalvd $catlvd"
done ))
[ $? -ne 0 ] && break
[ -e $TMPFILE1 ] && rm $TMPFILE1
while : ; do
resposta2=
resposta2=$( dialog --stdout \
--title 'Categoria para o contato' \
--ok-label 'OK' \
--cancel-label 'Voltar' \
--menu 'Selecione uma categoria para o contato '$resposta'' 0 0 0 1 'Aberto' 2 'Fechado')
[ $? -ne 0 ] && break
for llvd in `cat $lvd`; do
cadalvd=`echo $llvd | awk -F "|" '{print $1}'`
catlvd=`echo $llvd | awk -F "|" '{print $2}'`
if [ "$cadalvd" = "$resposta" ]; then
if [ "$resposta2" -eq "1" ]; then
echo ""$cadalvd"|Aberto" >> $TMPFILE1
else
echo ""$cadalvd"|Fechado" >> $TMPFILE1
fi
else
echo "$llvd" >> $TMPFILE1
fi
done
mv $TMPFILE1 $lvd
break
done
done
}

Criaacltxt(){
dialog --infobox 'Aguarde... Montando ACLs de conversas' 0 0
[ -e $acls ] && rm $acls
touch $acls
chmod 777 $acls
for contatoin in `cat $lvd`; do
lvdin=`echo $contatoin | awk -F "|" '{print $1}'`
tplvdin=`echo $contatoin | awk -F "|" '{print $2}'`
if [ "$tplvdin" = "Fechado" ]; then
seqcontatoex=
for contatoex in `cat $lvdex`; do
idlvdex=`echo $contatoex | awk -F "|" '{print $1}'`
seqcontatoex="$idlvdex $seqcontatoex"
done
echo "allow $lvdin $seqcontatoex" >> $acls
fi
done
seqcontatoin=
for contatoin in `cat $lvd`; do
lvdin=`echo $contatoin | awk -F "|" '{print $1}'`
seqcontatoin="$lvdin $seqcontatoin"
done
echo "allow all $seqcontatoin" >> $acls


for contatosint in `cat $lvd`; do
lvdint=`echo $contatosint | awk -F "|" '{print $1}'`
tplvdint=`echo $contatosint | awk -F "|" '{print $2}'`
if [ "$tplvdint" = "Aberto" ]; then
echo "allow $lvdint" >> $acls
fi
done

echo "allow all groupchat" >> $acls
echo "deny all" >> $acls
chmod 777 $acls
chown nobody $acls
}

Msnmenu
########################################################### FIM DO SCRIPT #########################################################

Agora dê permissão ao script

# chmod +x /usr/local/bin/imadmin

Chame o script

# imadmin

Espero ter ajudado