Archive for the ‘Debian’ tag
Configurando um servidor de openvpn parte 1
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.
Transferindo arquivos com o nc
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.
kernel grsec no debian lenny
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.