quarta-feira, 28 de março de 2012

VPN site-to-site utilizando OpenBSD e isakmpd

Devido a surpreendente quantidade de emails que continuo recebendo, mesmo depois de 6 anos, decidi resgatar esse post que fiz no falecido SecForum em 2006.

"Este manual tem o objetivo de demonstrar a criação de uma VPN simples para interligar dois escritórios através da Internet com segurança. Serão utilizados neste procedimento: OpenBSD, isakmpd, openssl e certpatch."


Serão necessárias duas máquinas, uma em cada site, com IP real e fixo na Internet, pois estes serão utilizados internamente pelas chaves de autenticação. Foi utilizada a versão 3.9 do OpenBSD neste manual, mas outras podem ser usadas.

Considerações para este tutorial:

IP real da máquina alpha: 10.0.100.10
Rede interna da sede alpha: 10.0.1.0/24
IP real da máquina beta: 10.0.100.11
Rede interna da sede beta: 10.0.2.0/24

Criação da Certificate Authority (CA)

Os próximos passos descrevem a criação de um Certificate Authority, necessário para assinar as chaves geradas pelos gateways do tutorial. A máquina utilizada para geração da CA necessita dos softwares openssl e certpatch.

Gerando chave privada para o CA:

openssl genrsa -out /etc/ssl/private/ca.key 1024

Após criação da chave privada, gere uma requisição para que o próprio CA assine:

openssl req -new -key /etc/ssl/private/ca.key -out /etc/ssl/private/ca.csr

Os dados inseridos neste passo devem ser replicados na hora da geração das chaves dos clientes, com excessão do Common Name. Preencha os campos Country Name, State or Province Name, Locality Name, Organization Name e Organizational Unit Name de acordo com o arquivo isakmpd.policy, descrito abaixo. Exemplo:

Country Name (2 letter code) [BR]: BR
State or Province Name (full name) [Sao Paulo]: Sao Paulo
Locality Name (eg, city) [Sao Paulo]: Sao Paulo
Organization Name (eg, company) [Teste Ltd]: Teste Ltd
Organizational Unit Name (eg, section) [VPN Auth]: VPN Auth
Common Name (eg, your name or your server's hostname) []: Teste CA
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Assine as chaves 10.0.100.10.csr e 10.0.100.11.csr, que serão geradas e enviadas pelos gateways:

openssl x509 -req -days 365 -in 10.0.100.10.csr -CA /etc/ssl/ca.crt -CAkey /etc/ssl/private/ca.key -CAcreateserial -out 10.0.100.10.crt

openssl x509 -req -days 365 -in 10.0.100.11.csr -CA /etc/ssl/ca.crt -CAkey /etc/ssl/private/ca.key -CAcreateserial -out 10.0.100.11.crt

certpatch -i 10.0.100.10 -k /etc/ssl/private/ca.key 10.0.100.10.crt 10.0.100.10.crt

certpatch -i 10.0.100.11 -k /etc/ssl/private/ca.key 10.0.100.11.crt 10.0.100.11.crt

Após modificar as chaves com o certpatch, envie as três chaves (ca.crt, 10.0.100.10.crt e 10.0.100.11.crt) para os gateways OpenBSD.


Gateways OpenBSD

Primeiramente, iremos ativar o IP forwarding de pacotes nos servidores, já que serão gateways entre redes. Executar:

sysctl net.inet.ip.forwarding=1

O próximo passo é desnecessário para o OpenBSD, pois uma chave local é gerada na instalação padrão. Caso queira criar uma nova chave, execute o seguinte comando:

openssl genrsa -out /etc/isakmpd/private/local.key 1024

Gere uma chave de requisição para o CA assinar:

openssl req -new -key /etc/isakmpd/private/local.key -out /etc/isakmpd/private/10.0.100.10.csr

Os dados inseridos neste passo devem ser os mesmos utilizados pelo CA e isakmpd.policy, com excessão do Common Name.

Exemplo para o gateway 10.0.100.10:

Country Name (2 letter code) [BR]: BR
State or Province Name (full name) [Sao Paulo]: Sao Paulo
Locality Name (eg, city) [Sao Paulo]: Sao Paulo
Organization Name (eg, company) [Teste Ltd]: Teste Ltd
Organizational Unit Name (eg, section) [VPN Auth]: VPN Auth
Common Name (eg, your name or your server's hostname) []: VPN-LADO-ALPHA
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Enviar o arquivo 10.0.100.10.csr para o CA assinar, procedimento explicado no início deste tutorial. Posteriormente, você receberá três chaves do CA: ca.crt, 10.0.100.10.crt e 10.0.100.11.crt. Copie a primeira chave para o diretório /etc/isakmpd/ca e as outras para o diretório /etc/isakmpd/certs.

Repita o mesmo processo no outro gateway, modificando apenas o Common Name.

Abaixo segue o arquivo /etc/isakmpd/isakmpd.policy utilizado pelos gateways:


KeyNote-Version: 2
Authorizer: "POLICY"
Licensees: "DN:/C=BR/ST=Sao Paulo/L=Sao Paulo/O=Teste Ltd/OU=VPN Auth/CN=TesteCA"
Conditions: app_domain == "IPsec policy" &&
esp_present == "yes" &&
esp_enc_alg != "null" -> "true";


Arquivo /etc/isakmpd/isakmpd.conf do gateway 10.0.100.10:

[General]
Retransmits= 5
Exchange-max-time= 120
Listen-on= 10.0.100.10
Check-interval= 1

[X509-certificates]
CA-directory= /etc/isakmpd/ca/
Cert-directory= /etc/isakmpd/certs/
Private-key= /etc/isakmpd/private/local.key

[Phase 1]
10.0.100.11= omega

[Phase 2]
Connections= alpha-omega

[omega]
Phase= 1
Transport= udp
local-address= 10.0.100.10
Address= 10.0.100.11
Configuration= Default-main-mode

[alpha-omega]
Phase= 2
ISAKMP-peer= omega
Configuration= Default-quick-mode
Local-ID= Net-alpha
Remote-ID= Net-omega

[Net-alpha]
ID-type= IPV4_ADDR_SUBNET
Network= 10.0.1.0
Netmask= 255.255.255.0

[Net-omega]
ID-type= IPV4_ADDR_SUBNET
Network= 10.0.2.0
Netmask= 255.255.255.0

[Default-main-mode]
DOI= IPSEC
EXCHANGE_TYPE= ID_PROT
Transforms= 3DES-SHA

[Default-quick-mode]
DOI= IPSEC
EXCHANGE_TYPE= QUICK_MODE
Suites= QM-ESP-3DES-SHA-PFS-SUITE

[3DES-SHA]
ENCRYPTION_ALGORITHM= 3DES_CBC
HASH_ALGORITHM= SHA
AUTHENTICATION_METHOD= RSA_SIG
GROUP_DESCRIPTION= MODP_1024


Arquivo /etc/isakmpd/isakmpd.conf do gateway 10.0.100.11:

[General]
Retransmits= 5
Exchange-max-time= 120
Listen-on= 10.0.100.11
Check-interval= 1

[X509-certificates]
CA-directory= /etc/isakmpd/ca/
Cert-directory= /etc/isakmpd/certs/
Private-key= /etc/isakmpd/private/local.key

[Phase 1]
10.0.100.10= alpha

[Phase 2]
Connections= alpha-omega

[alpha]
Phase= 1
Transport= udp
Local-address= 10.0.100.11
Address= 10.0.100.10
Configuration= Default-main-mode

[alpha-omega]
Phase= 2
ISAKMP-peer= alpha
Configuration= Default-quick-mode
Local-ID= Net-omega
Remote-ID= Net-alpha

[Net-omega]
ID-type= IPV4_ADDR_SUBNET
Network= 10.0.2.0
Netmask= 255.255.255.0

[Net-alpha]
ID-type= IPV4_ADDR_SUBNET
Network= 10.0.1.0
Netmask= 255.255.255.0

[Default-main-mode]
DOI= IPSEC
EXCHANGE_TYPE= ID_PROT
Transforms= 3DES-SHA

[Default-quick-mode]
DOI= IPSEC
EXCHANGE_TYPE= QUICK_MODE
Suites= QM-ESP-3DES-SHA-PFS-SUITE

[3DES-SHA]
ENCRYPTION_ALGORITHM= 3DES_CBC
HASH_ALGORITHM= SHA
AUTHENTICATION_METHOD= RSA_SIG
GROUP_DESCRIPTION= MODP_1024


Após adicionar as chaves nos seus respectivos diretórios e configurar seus arquivos corretamente, inicie o isakmpd. Você pode iniciar o daemon de diversos modos para poder depurar caso aconteça algum erro. Os dois modos que utilizei:

Monitorar o arquivo /var/log/messages para as mensagens que aparecerao sobre o daemon:

# isakmpd

Daemon em modo debug. Muita informação aparecerá na tela mas servirão para saber se algo está com problema. DA significa o nivel de depuração, podendo ir até o numero 99, onde todas as diretivas da negociaão das chaves e autenticação são impressas na tela:

# isakmdp -d -DA=10

Para testar o funcionamento a partir do gateway 10.0.100.10:

ping -I 10.0.50.1 10.0.99.1
ssh -b 10.0.50.1 root@10.0.99.1

É possível implementar algumas regras do pf para proteger a VPN e limitar o acesso. Basta adicionar as seguintes regras no arquivo /etc/pf.conf de 10.0.100.10:


GATEWAY_A = "10.0.100.10"
GATEWAY_B = "10.0.100.11"
NETWORK_A = "10.0.1.0/24"
NETWORK_B = "10.0.2.0/24"

ext_if="pcn0"

block log on { enc0, $ext_if } all

pass in on $ext_if proto tcp to ($ext_if) port ssh keep state

pass in proto esp from $GATEWAY_B to $GATEWAY_A
pass out proto esp from $GATEWAY_A to $GATEWAY_B

pass in on enc0 proto ipencap from $GATEWAY_B to $GATEWAY_A

pass in on enc0 from $NETWORK_B to $NETWORK_A
pass out on enc0 from $NETWORK_A to $NETWORK_B

pass in on $ext_if proto udp from $GATEWAY_B port = 500 to $GATEWAY_A port = 500
pass out on $ext_if proto udp from $GATEWAY_A port = 500 to $GATEWAY_B port = 500


Arquivo pf.conf do gateway 10.0.100.11:


GATEWAY_A = "10.0.100.10"
GATEWAY_B = "10.0.100.11"
NETWORK_A = "10.0.1.0/24"
NETWORK_B = "10.0.2.0/24"

ext_if="pcn0"

block log on { enc0, $ext_if } all
pass in on $ext_if proto tcp to ($ext_if) port ssh keep state

pass in proto esp from $GATEWAY_A to $GATEWAY_B
pass out proto esp from $GATEWAY_B to $GATEWAY_A

pass in on enc0 proto ipencap from $GATEWAY_A to $GATEWAY_B

pass in on enc0 from $NETWORK_A to $NETWORK_B
pass out on enc0 from $NETWORK_B to $NETWORK_A

pass in on $ext_if proto udp from $GATEWAY_A port = 500 to $GATEWAY_B port = 500
pass out on $ext_if proto udp from $GATEWAY_B port = 500 to $GATEWAY_A port = 500


Em ambas as máquinas, você deve ativar o pf com os seguintes comandos:

# pfctl -e
# pfctl -f /etc/pf.conf

Para finalizar, caso você queira que todas as configurações sejam carregadas ao iniciar o gateway, edite o arquivo /etc/rc.conf e substitua isakmpd_flags=NO por isakmpd_flags="". Substitua também a linha pf=NO por pf=YES. Adicione, ou descomente, a linha net.inet.ip.forwarding=1 em /etc/sysctl.conf.


Fontes

http://hem.passagen.se/hojg/isakmpd/
http://resin.csoft.net/cgi-bin/man.cgi?section=8&topic=isakmpd
http://resin.csoft.net/cgi-bin/man.cgi?section=5&topic=isakmpd.conf
http://resin.csoft.net/cgi-bin/man.cgi?section=5&topic=isakmpd.policy
http://www.secureops.com/vpn/ipsecvpn.html
http://www.unixlike.com.br/?page_id=97

Nenhum comentário:

Postar um comentário