Claudio Borges

Technical blog about Linux, BSD, Mac OS X, Games and etc.

Archive for the ‘Debian’ tag

Configurando um servidor de openvpn parte 1

with 8 comments

OpenVPN é um solução completa de VPN. A mesma utiliza SSL para encriptar o tráfego, possui versões para os mais diversos sistemas, tais como: Linux, Todos os BSDs e derivados (isto inclui o Mac OS X e Solaris), Windows 2000/XP/2K3/Vista/7 e sua licença é GPL.

Uma de suas principais vantagens é que você pode trabalhar com qualquer porta tcp/udp, além de poder utilizá-la através de nat. Sua configuração é simples e intuitiva e não necessita de aplicação de patch no kernel.

Este artigo é baseado em debian, mas caso queira, os procedimentos de configuração se aplicam tanto para linux quanto para os bsd, levando em conta claro parâmentos como interface, usuário, grupo e arquivos de log.

Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:

IP Externo da matriz: 189.47.25.20
Rede interna da Matriz: 192.168.0.0/24
Rede interna da filial: 192.168.1.0/24
Interface da vpn: tun0

A instalação do openvpn é bem simples, quem está acostumado com debian bastar utilizar o apt:

server:~# apt-get install -y openvpn

Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”.

Copie o diretório /usr/share/doc/openvpn/examples/easy-rsa para o seu /root/:

server:~# cp -a /usr/share/doc/openvpn/examples/easy-rsa /root/

Edite o arquivo /root/easy-rsa/vars e altere as variáveis a seu gosto:

export KEY_SIZE=2048

export KEY_COUNTRY=BR
export KEY_PROVINCE=SP
export KEY_CITY="Sao Paulo"
export KEY_ORG="Personal OpenVPN Server"
export KEY_ORGNAME="POS"
export KEY_EMAIL="but3k4@gmail.com"

Carregue as variáveis no ambiente:

server:~# cd easy-ca
server:~/easy-rsa# . ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys

Obs: é . ./ mesmo.

Rode o comando clean-all:

server:~/easy-rsa# ./clean-all

Gerando os certificados e chaves:

Certificado de autoridade (CA). Você irá verificar que os valores estão pré-estabelecidos, faltando apenas o Organizational Unit Name e Common Name:

server:~/easy-rsa# ./build-ca
Generating a 2048 bit RSA private key
.................................................+++
...............................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:
server:~/easy-rsa#

Chaves e certificados do servidor

server:~/easy-rsa# ./build-key-server server
Generating a 2048 bit RSA private key
............................................................................+++
..............+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           : PRINTABLE:'BR'
stateOrProvinceName   : PRINTABLE:'SP'
localityName          : PRINTABLE:'Sao Paulo'
organizationName      : PRINTABLE:'Personal OpenVPN Server'
organizationalUnitName: PRINTABLE:'POS'
commonName            : PRINTABLE:'server'
emailAddress          : IA5STRING:'but3k4@gmail.com'
Certificate is to be certified until Aug  9 14:41:55 2018 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
server:~/easy-rsa#

Parâmetros Diffie Hellman

Os parâmetros Diffie Hellman são utilizados para a troca encriptada de informações

server:~/easy-rsa# ./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time

....... e espere pois isso pode demorar ........

server:~/easy-rsa#

Chave compartilhada

Criando uma chave compartilhada para servir de tls:

server:~/easy-rsa# openvpn --genkey --secret keys/shared.key
server:~/easy-rsa#

Criando o /etc/openvpn/openvpn.conf:

# /etc/openvpn/openvpn.conf matriz configuration file

# diretorio onde esta os arquivos de configuracao / certificados
cd /etc/openvpn

# porta usada para os clientes conectarem no servidor
port	1194

# protocolo usado na conexao
proto	udp

# device usado pelo openvpn
dev	tun

# Habilita conexoes tls
# Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn
tls-server

# arquivo de chave compartilhada usado pelo tls-server
# O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls
tls-auth	keys/shared.key 0

# Certificado de autoridade
# Tem que ser o mesmo em todos os hosts
# que conectarem a sua vpn
ca	certs/ca.crt

# Certificado e chave privada do servidor
# Cada maquina tem que ter seu certificado e chave
cert	certs/server.crt
key	keys/server.key

# Parametros Diffie-Hellman
dh	keys/dh2048.pem

# Rede usada pelo tunel openvpn
server	10.8.0.0 255.255.255.0

# define o arquivo onde sera guardados os ips que os clientes
# obtiverem na conexao, assim os mesmos sempre irao pegar os 
# mesmos ips
ifconfig-pool-persist	ipp.txt

# define o diretorio onde irao ficar as configuracoes individuais para cada
# cliente, assim você podera habilitar as duas redes se comunicarem.
client-config-dir	ccd

# Define a rota para a rede da matriz poder enxergar a rede da filial
route 192.168.1.0 255.255.255.0

# Define a rota para a rede da filial poder enxergar a rede da matriz
push "route-delay 2 600"
push "route 192.168.0.0 255.255.255.0"

# Aceita os clientes se comunicarem entre si sem a necessidade de um outro tunnel
client-to-client

# Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz
# esta no ar, usado para manter a conexao ativa
ping-timer-rem
keepalive 10 120

# Tipo de criptografia usada
cipher	DES-EDE3-CBC

# habilita compressão no link VPN
comp-lzo

# Numero maximo de clientes (filiais)
max-clients	10

# usuário e grupo sob o qual o openvpn ira rodar
user	nobody
group	nogroup

# Permite um restart sem fechar a conexão e re-ler as chaves
persist-key
persist-tun

# Log de status das conexoes
status	/var/log/openvpn/status.log

# define um arquivo de log, pois o default é o /var/log/syslog
log	/var/log/openvpn/openvpn.log
log-append	/var/log/openvpn/openvpn.log

# Nivel de log
# 0 silencioso, exceto para erros fatais
# 4 razoavel para uso geral
# 5 e 6 podem ajudar a debugar problemas de conexoes
# 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba
verb	3

# desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia
# acima de 20, ele dropa.
mute	20

Por hoje acho que está bom, na parte 2 do artigo irei mostrar como configurar o client e fazer os ajustes finais para você ter um servidor openvpn que atenda matriz, filial e clientes remotos pelo Brasil a fora.

Written by but3k4

January 10th, 2010 at 8:22 pm

Posted in Linux

Tagged with , , ,

Transferindo arquivos com o nc

without comments

O nc (netcat) é o canivete suiço do tcp/ip, com ele é possível fazer N coisas (o ncode vai gostar de ouvir isso =P). Uma delas é fazer transferência de arquivos, ou seja, você não necessita de ssh ou scp nem tão pouco ftp, basta apenas utilizar alguma porta que esteja liberada em seu fw (caso for fazer transferências via internet).

O processo é simples, vamos supor que quero fazer o backup do /etc e automaticamente transferir para outra maquina, para isto, utilizo o nc como server:

tar -cvzpf - /etc | nc -vvv -l -p 1234

Do lado do cliente, utilizo:

nc -vvv ip_do_servidor 1234 > etc.tar.gz

As opções utilizadas foram:

-v = verbose
-l = listen
-p = port

Simples assim.

Written by but3k4

July 21st, 2009 at 10:02 am

Posted in Linux,OpenBSD

Tagged with , ,

kernel grsec no debian lenny

without comments

Grsec é um patch para o kernel que foi desenvolvido com o intúito de aumentar a segurança. Seu desenvolvimento começou em fevereiro de 2001 e teve sua primeira versão para o kernel 2.4.1. Ele possui vários tipos de recursos como por exemplo: ACLs; Proteção contra buffer-overflow; Auditoria; Suporte a sysctl; Proteção no uso chroot; Negar escrita no /dev/kmem, /dev/mem; Restrições ao /proc e dmesg; Esconder processos do kernel.

Para utilizar o sistema de ACLs, utiliza-se o software gradm, o mesmo faz um total controle do que pode ou não ser utilizado, além de ter um sistema de aprendizagem, no qual ele fica apenas monitorando o que determinado serviço utiliza e com isso pode criar configurações baseadas no que foi monitorado. Este sistema é similar ao selinux.

As atuais versões do grsecurity contam com o PAX, que é um completo sistema de proteção a memória. Sua idéia principal é proteger o sistema contra técnicas usadas para ler e gravar em determinados segmentos de memória. Para tal tarefa é utilizada técnicas como a ASLR (Address Space Layout Randomization).

Para todos aqueles que não querem compilar um kernel, o pessoal do teamix.net disponibiliza todos os pacotes do kernel 2.6.26 com suporte a grsec. Para instalar, primeiramente, baixe os pacotes:

debian:~# wget -c http://people.teamix.net/~ms/debian/lenny/grsec/linux-doc-2.6.26-grsec_2_all.deb
debian:~# wget -c http://people.teamix.net/~ms/debian/lenny/grsec/linux-headers-2.6.26-grsec_2_i386.deb
debian:~# wget -c http://people.teamix.net/~ms/debian/lenny/grsec/linux-image-2.6.26-grsec_2_i386.deb

Agora instale os pacotes:

debian:~# dpkg -i linux-doc-2.6.26-grsec_2_all.deb linux-headers-2.6.26-grsec_2_i386.deb linux-image-2.6.26-grsec_2_i386.deb

Com os pacotes grsec instalados, dê um boot no seu debian (o que você instalou o kernel grsec) e na opção do grub selecione o kernel que instalamos, após o sistema inicializar, remova o kernel antigo:

debian:~# apt-get remove --purge linux-image-2.6-686 linux-image-2.6.26-2-686

Pode ser que ocorra algum problema na hora do dpkg rodar o update-grub, caso isto ocorra, edite o /boot/grub/menu.lst e remova os outros kernels, deixando somente as opções referentes ao kernel grsec.

Se o seu debian tem postfix instalado ou qualquer outro serviço que utilize chroot, adicione as seguinte linhas no seu /etc/sysctl.conf:

# Disabilita o log do grsec
kernel.grsecurity.resource_logging = 0

# Disabilita limites do grsec execve
kernel.grsecurity.execve_limiting = 0

# Disabilita log de mount
kernel.grsecurity.audit_mount = 0

# Disabilita log de mudança de horário
kernel.grsecurity.timechange_logging = 0

Como o grsec limita acessos ao /proc, crie o grupo grsec com gid 1001. Caso este gid já exista em algum outro grupo, sugiro você alterá-lo para outro gid e após isto, criar o grupo grsec. Você deve estar pensando o porque deste grupo correto? isto é necessário porque na configuração do kernel, quem o compilou, definiu que o grupo grsec necessita ter o gid 1001 e este grupo tem acesso ao /proc. Sem este acesso, usuários comuns ficam restritos a visualizem somente seus processos.

Para adicionar usuários a este grupo utilize o comando:

gpasswd -a usuario grsec

Substitua usuario pelo usuário que você quer que tenha acesso ao /proc, como por exemplo o usuário snmp, pois caso tenha snmp rodando e o usuário não tiver acesso ao /proc ele não conseguirá coletar informações das interfaces de rede.

Caso necessite do kernel source, baixe o pacote:

debian:~# wget -c http://people.teamix.net/~ms/debian/lenny/grsec/linux-source-2.6.26-grsec_2_all.deb

Caso queira utilizar também o gradm, baixe o pacote:

debian:~# wget -c http://people.teamix.net/~ms/debian/lenny/grsec/gradm2_2.1.12-1_i386.deb

Maiores informações sobre grsec, consulte o site do desenvolvedor.

Written by but3k4

June 20th, 2009 at 10:14 pm

Posted in Linux

Tagged with ,