Archive for the ‘segurança’ 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.
usando ssh para criar um tunel reverso
Semana passada estavamos (eu e meus amigos de irc) tentando ajudar um colega que estava com um determinado problema. Como ele estava utilizando uma máquina atrás de um firewall e ele não tinha acesso para fazer qualquer redirecionamento para esta máquina, falamos para ele criar um tunel reverso com ssh para conectarmos na máquina que ele estava e poder ajudá-lo com o problema que ele enfrentava.
Baseado no relato acima, vamos supor que tenho um servidor remoto cujo ip é 187.10.223.67, que a porta do ssh é a 22 (padrão) e que meu usuário remoto é but3k4, iremos utilizar as seguintes opções do ssh:
C - usa compactação de todos os dados que serão trafegados, muito útil para economizar banda. N - não executa comandos no servidor remoto, portanto o usuário não precisa ter shell. f - logo após conectar, coloca a conexão em background. R - especifica qual porta irei ouvir no servidor remoto, em qual ip ela será listada e para qual porta do servidor local ela será redirecionada.
Agora, sabendo tudo que irei utilizar, peço para meu amigo digitar:
ssh -C -N -f -R 4444:localhost:22 but3k4@187.10.223.67
Com o comando acima, a porta 22 da máquina local, será listada automaticamente no loopback (127.0.0.1), na porta 4444 do ip 187.10.223.67.
Com isso, eu poderei conectar na máquina dele digitando:
ssh -p 4444 localhost -l root
Simples né? Túneis ssh são muito úteis e seu funcionamento como você mesmo viu é bem simples. Então, bom proveito.
Port knocking utilizando iptables
Port Knocking é uma técnica que consiste em enviar uma sequência pré-determinada de pacotes em portas específicas para abrir conexão com algum host.
Não vou me aprofundar sobre o assunto, caso queira fazer isto, o google é seu amigo =). O que irei fazer é demonstrar como utilizar o iptables para realizar esta tarefa.
Supondo que a sua política padrão é DROP e que a porta do ssh é 22 (porta padrão), vamos criar uma regra para liberar o ssh por 20 segundos quando chegar uma conexão tcp na porta 65535:
iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 22 -m recent --rcheck --seconds 20 --name SSH --rsource -j ACCEPT iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 65535 -m recent --set --name SSH --rsource -j DROP
Supondo que o ip do servidor onde você acabou de implementar as regras acima seja 187.10.223.67, digite:
telnet 187.10.223.67 65535
Logo em seguida, pressione CTRL + C e tente conectar no ssh, você terá somente 20 segundos após ter utilizado o telnet.
Simples né? com estas duas regras acima, você criou um port knocking em iptables :).