Idéias para proteger o OpenVPN em um roteador OpenWrt

2

Eu coloquei um servidor OpenVPN na porta 1194 em um roteador OpenWrt 10.03:

echo "nameserver 8.8.8.8" > /etc/resolv.conf; opkg update; opkg install luci-app-openvpn openvpn openssl-util openssh-sftp-server ntpd
vim /etc/ssl/openssl.cnf # modify a few lines
[ CA_default ]
dir             = /etc/openvpn
new_certs_dir   = $dir/certs
certificate = $dir/ca.crt
private_key = $dir/ca.key

touch /etc/openvpn/index.txt; touch /etc/openvpn/serial; echo 01 > /etc/openvpn/serial
openssl req -nodes -new -x509 -keyout /etc/openvpn/ca.key -out /etc/openvpn/ca.crt -days 3650 # give a common name, like: vpnserver
openvpn --genkey --secret /etc/openvpn/ta.key
openssl req -nodes -new -keyout /etc/openvpn/server.key -out /etc/openvpn/server.csr # give a common name, like: vpnserver
mkdir -p /etc/openvpn/certs; mkdir -p /etc/openvpn/private
openssl ca -out /etc/openvpn/server.crt -in /etc/openvpn/server.csr
time openssl dhparam -out /etc/openvpn/dh1024.pem 1024 # it could take 10 minutes!

# generate certs for clients [X = client number]
openssl req -nodes -new -keyout /etc/openvpn/clientX.key -out /etc/openvpn/clientX.csr # give a common name! it will be the user name
openssl ca -out /etc/openvpn/clientX.crt -in /etc/openvpn/clientX.csr
# e.g.: 
openssl req -nodes -new -keyout /etc/openvpn/client1.key -out /etc/openvpn/client1.csr # give a common name! it will be the user name
openssl ca -out /etc/openvpn/client1.crt -in /etc/openvpn/client1.csr

vim /etc/config/openvpn
config 'openvpn' 'openvpn_server'
    option 'enable' '1'
    option 'port' '1194'
    option 'proto' 'udp'
    option 'dev' 'tap'
    option 'ca' '/etc/openvpn/ca.crt'
    option 'cert' '/etc/openvpn/server.crt'
    option 'key' '/etc/openvpn/server.key'
    option 'tls_auth' '/etc/openvpn/ta.key 0' # server: 0
    option 'dh' '/etc/openvpn/dh1024.pem'
    option 'comp_lzo' '1'
    option 'server' '10.20.30.0 255.255.255.0'
    option 'keepalive' '10 120'
    option 'persist_key' '1'
    option 'persist_tun' '1'
    option 'mute' '20'
    option 'verb' '3'
    option 'client_to_client' '1'
    list 'push' 'dhcp-option DNS 10.20.30.1'
/etc/init.d/openvpn enable
/etc/init.d/openvpn start
ifconfig -a | less
ping 10.20.30.1

# here comes the firewall part
vim /etc/config/firewall # modify it
config 'include'
    option 'path' '/etc/firewall.user'

config 'redirect'
    option 'src' 'wan'
    option 'proto' 'udp'
    option 'src_dport' '1194'
    option 'dest_port' '1194'
    option '_name' 'OpenVPN'

vim /etc/firewall.user # modify it
iptables -t nat -A prerouting_rule -i $WAN -p udp --dport 1194 -j ACCEPT
iptables -A input_rule -i $WAN -p udp --dport 1194 -j ACCEPT
iptables -A forwarding_rule -i tap+ -o br-lan -j ACCEPT
iptables -A forwarding_rule -i br-lan -o tap+ -j ACCEPT
iptables -A input_rule -i tap+ -j ACCEPT
iptables -A output_rule -o tap -j ACCEPT

/etc/init.d/firewall restart

# tar the files that goes to the client1
mkdir -p /root/client1
cp /etc/openvpn/ca.crt /root/client1/; cp /etc/openvpn/client1.crt /root/client1/; cp /etc/openvpn/client1.key /root/client1/; cp /etc/openvpn/ta.key /root/client1/
cd /root/; tar -cf client1.tar client1

# configure the client
# extract the client1.tar's content to "~/.cert" on the clients pc
# if you're using e.g.: Fedora/SELinux, then
restorecon -Rv ~/.cert*
# then: 
# ca.crt: the ca certificate
# client1.crt: the users certificate
# client1.key: the users private key
# ta.key: tls authentication [1]

O que eu poderia fazer (no lado do servidor) para aumentar a segurança em relação a este servidor OpenVPN? Aqui estão algumas das minhas ideias:

  1. Eu sed 's/1194/50000/' o número da porta para um maior para tornar mais difícil para os scanners de portas encontrarem
  2. iptables? Eu só deveria permitir intervalos de IP [na cadeia de entrada] que eu usarei na realidade? + Permitir somente o endereço MAC do meu laptop
  3. Se eu não usar meu roteador (por exemplo, quando estou dormindo), basta desligá-lo.

Há algo que eu esteja perdendo? Do comando ps , vejo que o OpenVPN é executado pelo root, o que não é seguro. O que mais devo fazer para aumentar a segurança?

    
por LanceBaynes 08.03.2011 / 16:24

1 resposta

4

O OpenVPN foi projetado para ser seguro. Só permitirá clientes que tenham as chaves assinadas por você. O mais importante é manter as chaves privadas seguras. Sempre criptografá-los nos clientes e verifique as permissões no arquivo de chaves no servidor. Não mantenha as chaves privadas da CA no servidor, elas não precisam delas. Criptografe, coloque-o em um pendrive e proteja-o.

Os scanners de portas não terão problemas para encontrar o servidor em qualquer porta, mas não poderão usá-lo. Se você sabe que você só vai usá-lo a partir de um conjunto limitado de endereços IP, então desabilite tudo o mais com o iptables. No entanto, a maioria das pessoas tende a usá-lo em locais variados, por exemplo, com um laptop. Você pode banir automaticamente os IPs que tentarem chaves inválidas, mas a bruteforcing de chaves RSA como essa é inviável mesmo assim.

Se as chaves são seguras, então o maior risco é algum bug na implementação do OpenVPN, o que o torna vulnerável a ataques. Se isso acontecer, um invasor poderá executar um código arbitrário com os privilégios do processo do servidor OpenVPN. Você pode diminuir o efeito desse tipo de ataque, não executando o servidor como root. Adicione isto à configuração do seu servidor:

user nobody
group nobody

Seu arquivo de configuração parece usar uma sintaxe diferente da minha, mas algo assim deve ser suportado. Você pode experimentar o patch do grsecurity para o kernel, mas não tenho certeza se ele funciona em sistemas embarcados e seria muito ruim se você o tornasse não inicializável por acidente. Isso torna mais difícil a exploração de erros arbitrários de execução de código.

Você também pode aumentar os tamanhos das chaves. Teclas de 1024 bits podem se tornar quebráveis em um futuro próximo, se ainda não estiverem. Certifique-se de não gerá-los com o OpenSSL do Debian. :)

É minha opinião pessoal que a filtragem de endereços MAC é absolutamente inútil. É fácil falsificar e os mais válidos podem ser encontrados facilmente. Use WPA2 CCMP com uma chave aleatória longa de 63 bytes e você deve estar OK. Não deixe que as pessoas conectem cabos aleatórios.

Eu sei que não há muitos recursos disponíveis nos roteadores, mas você pode tentar fazer o log. Tenho quase certeza de que não haverá espaço suficiente no roteador, registre-o em outro host. O syslog-ng pode fazer isso facilmente. Eu não sei como é fácil instalá-lo em um roteador.

    
por 08.03.2011 / 19:37