
Oi, habrozhiteli! No livro, David Clinton descreve 12 projetos do mundo real, incluindo automatizar um sistema de backup e recuperação, configurar uma nuvem de arquivos pessoal no estilo Dropbox e criar seu próprio servidor MediaWiki. Com exemplos interessantes, você aprenderá sobre virtualização, recuperação de desastres, segurança, backup, implantação do DevOps e solução de problemas do sistema. Cada capítulo termina com uma revisão de recomendações práticas, um glossário de novos termos e exercícios.
Trecho "10.1. Criando um túnel OpenVPN »
Neste livro, eu já falei muito sobre criptografia. O SSH e o SCP podem proteger os dados transmitidos por conexões remotas (capítulo 3), a criptografia de arquivos permite proteger os dados quando armazenados no servidor (capítulo 8), e os certificados TLS / SSL podem proteger os dados durante a transmissão entre sites e navegadores clientes (capítulo 9). Mas, às vezes, seus dados exigem proteção em uma ampla variedade de conexões. Por exemplo, é possível que alguns membros da sua equipe trabalhem na estrada, conectando-se à rede via Wi-Fi através de pontos de acesso público. Definitivamente, você não deve assumir que todos esses pontos de acesso são seguros, mas seu pessoal realmente precisa de uma maneira de se conectar aos recursos da empresa - nesse caso, uma VPN ajudará.
Um túnel VPN projetado corretamente fornece uma conexão direta entre clientes remotos e o servidor de forma a ocultar os dados quando eles são transmitidos por uma rede insegura. E daí? Você já viu muitas ferramentas que podem fazer isso com criptografia. O valor real das VPNs é que, ao abrir o túnel, você pode conectar redes remotas, como se todas estivessem juntas localmente. Em certo sentido, você está usando uma solução alternativa.
Usando uma rede estendida, os administradores podem trabalhar em seus servidores de qualquer lugar. Mas, mais importante, uma empresa com recursos distribuídos por várias filiais pode torná-las visíveis e acessíveis a todos os grupos que precisam deles, onde quer que estejam (Fig. 10.1).
O próprio túnel não garante segurança. Mas um dos padrões de criptografia pode ser incluído na estrutura da rede, o que aumenta significativamente o nível de segurança. Os túneis criados usando o pacote OpenVPN de código aberto usam a mesma criptografia TLS / SSL que você já leu. O OpenVPN não é a única opção disponível para tunelamento, mas uma das mais famosas. Acredita-se que seja um pouco mais rápido e seguro do que um protocolo de encapsulamento de camada 2 alternativo que usa criptografia IPsec.
Deseja que todos na sua equipe se comuniquem com segurança enquanto estão na estrada ou trabalhando em prédios diferentes? Para fazer isso, você deve criar um servidor OpenVPN para permitir o compartilhamento de aplicativos e acesso ao ambiente de rede local do servidor. Para isso funcionar, basta iniciar duas máquinas virtuais ou dois contêineres: um para atuar como servidor / host e outro para o cliente. Criar uma VPN não é um processo fácil, por isso provavelmente vale a pena levar alguns minutos para obter uma visão geral.
10.1.1 Configurando o servidor OpenVPN
Antes de começar, darei conselhos úteis. Se você vai fazer tudo sozinho (e eu recomendo isso para você), provavelmente descobrirá que está trabalhando com várias janelas de terminal abertas na área de trabalho, cada uma conectada à sua máquina. Existe o risco de que em algum momento você digite o comando errado na janela. Para evitar isso, você pode usar o comando hostname para alterar o nome da máquina exibido na linha de comando para algo que indique claramente onde você está. Assim que você fizer isso, será necessário sair do servidor e efetuar login novamente para que as novas configurações entrem em vigor. Aqui está o que parece:
Seguindo essa abordagem e atribuindo os nomes correspondentes a cada uma das máquinas com as quais trabalha, você pode acompanhar facilmente onde está.
Depois de usar o nome do host, você pode encontrar mensagens irritantes de Incapaz de resolver o host OpenVPN-Server ao executar os seguintes comandos. A atualização do arquivo / etc / hosts com o novo nome de host correspondente deve corrigir o problema.
Preparando seu servidor para OpenVPN
A instalação do OpenVPN no seu servidor requer dois pacotes: openvpn e easy-rsa (para controlar o processo de geração da chave de criptografia). Se necessário, os usuários do CentOS devem primeiro instalar o repositório epel-release, como você fez no capítulo 2. Para poder verificar o acesso ao aplicativo do servidor, você também pode instalar o servidor da web Apache (apache2 para Ubuntu e httpd no CentOS).
Enquanto você estiver configurando o servidor, aconselho a ativar um firewall que bloqueie todas as portas, exceto 22 (SSH) e 1194 (a porta OpenVPN padrão). Este exemplo ilustra como o ufw funcionará no Ubuntu, mas tenho certeza que você ainda se lembra do programa CentOS do firewall do capítulo 9:
# ufw enable # ufw allow 22 # ufw allow 1194
Para permitir o roteamento interno entre interfaces de rede no servidor, é necessário descomentar uma linha (net.ipv4.ip_forward = 1) no arquivo /etc/sysctl.conf. Isso permitirá que você redirecione clientes remotos conforme necessário após a conexão. Para fazer o novo parâmetro funcionar, execute sysctl -p:
# nano /etc/sysctl.conf # sysctl -p
Agora o ambiente do servidor está totalmente configurado, mas há outra coisa a ser feita antes de você estar pronto: você precisará seguir estas etapas (as consideraremos em mais detalhes abaixo).
- Crie um conjunto de chaves no servidor para criptografar a infraestrutura de chave pública (PKI) usando os scripts que acompanham o pacote easy-rsa. Em essência, o servidor OpenVPN também atua como sua própria autoridade de certificação (CA).
- Prepare as chaves apropriadas para o cliente
- Configure o arquivo server.conf para o servidor
- Configure seu cliente OpenVPN
- Verifique sua VPN
Geração de chave de criptografia
Para não complicar sua vida, você pode configurar sua infraestrutura de chave na mesma máquina em que o servidor OpenVPN está em execução. No entanto, as recomendações de segurança geralmente sugerem o uso de um servidor CA separado para implantações em um ambiente de produção. O processo de geração e alocação de recursos da chave de criptografia para uso no OpenVPN é ilustrado na Fig. 10.2
Quando você instalou o OpenVPN, o diretório / etc / openvpn / foi criado automaticamente, mas ainda não há nada nele. Os pacotes openvpn e easy-rsa vêm com arquivos de modelo de amostra que você pode usar como base para sua configuração. Para iniciar o processo de certificação, copie o diretório de modelos easy-rsa de / usr / share / para / etc / openvpn e mude para o diretório easy-rsa /:
# cp -r /usr/share/easy-rsa/ /etc/openvpn $ cd /etc/openvpn/easy-rsa
O diretório easy-rsa agora conterá alguns scripts. Na mesa 10.1 lista as ferramentas que você usará para criar chaves.
Essas operações requerem privilégios de root; portanto, através do sudo su, você precisa se tornar root.
O primeiro arquivo com o qual você trabalhará é chamado vars e contém as variáveis de ambiente que o easy-rsa usa ao gerar chaves. Você precisa editar o arquivo para usar seus próprios valores, em vez dos valores padrão que já existem. É assim que meu arquivo será (Listagem 10.1).
Listagem 10.1. Os principais fragmentos do arquivo / etc / openvpn / easy-rsa / vars
export KEY_COUNTRY="CA" export KEY_PROVINCE="ON" export KEY_CITY="Toronto" export KEY_ORG="Bootstrap IT" export KEY_EMAIL="info@bootstrap-it.com" export KEY_OU="IT"
A execução do arquivo vars permitirá transferir seus valores para o ambiente shell, de onde eles serão incluídos no conteúdo de suas novas chaves. Por que o comando sudo não funciona sozinho? Porque, no primeiro estágio, editamos o script chamado vars e o aplicamos. Aplicativo e significa que o arquivo vars transfere seus valores para o ambiente shell, de onde eles serão incluídos no conteúdo de suas novas chaves.
Certifique-se de executar novamente o arquivo usando o novo shell para concluir o processo inacabado. Quando isso for feito, o script solicitará que você execute outro script, clean-all, para remover qualquer conteúdo do diretório / etc / openvpn / easy-rsa / keys /:
Naturalmente, a próxima etapa é executar o script clean-all, seguido de build-ca, que usa o script pkitool para criar o certificado raiz. Você será solicitado a confirmar as configurações de autenticação fornecidas pelo vars:
# ./clean-all # ./build-ca Generating a 2048 bit RSA private key
Em seguida, vem o script build-key-server. Como ele usa o mesmo script pkitool junto com o novo certificado raiz, você verá as mesmas perguntas para confirmar a criação do par de chaves. As chaves receberão nomes com base nos argumentos que você passar, que, a menos que você inicie várias VPNs neste computador, geralmente será servidor, como no exemplo:
# ./build-key-server server [...] Certificate is to be certified until Aug 15 23:52:34 2027 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
O OpenVPN usa os parâmetros gerados pelo algoritmo Diffie-Hellman (usando build-dh) para negociar autenticação para novas conexões. O arquivo criado aqui não deve ser secreto, mas deve ser gerado usando o script build-dh para as chaves RSA atualmente ativas. Se você criar novas chaves RSA no futuro, também precisará atualizar o arquivo com base no algoritmo Diffie-Hellman:
# ./build-dh
Suas chaves do lado do servidor agora estarão no diretório / etc / openvpn / easy-rsa / keys /, mas o OpenVPN não sabe disso. Por padrão, o OpenVPN procurará as chaves em / etc / openvpn /, portanto, copie-as:
# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn # cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn # cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn
Preparando Chaves de Criptografia do Cliente
Como você já viu, a criptografia TLS usa pares de chaves correspondentes: uma está instalada no servidor e a outra no cliente remoto. Isso significa que você precisará de chaves do cliente. Nosso velho amigo pkitool é exatamente o que você precisa para isso. Neste exemplo, executando o programa no diretório / etc / openvpn / easy-rsa /, passamos o argumento do cliente para ele para gerar arquivos chamados client.crt e client.key:
# ./pkitool client
Os dois arquivos do cliente, juntamente com o arquivo ca.crt original, que ainda está no diretório keys /, agora devem ser transferidos com segurança para o seu cliente. Devido à sua afiliação e direitos de acesso, isso pode não ser tão fácil. A abordagem mais fácil é copiar manualmente o conteúdo do arquivo de origem (e nada além deste conteúdo) para o terminal em execução na área de trabalho do seu PC (selecione o texto, clique com o botão direito do mouse e selecione Copiar no menu). Em seguida, cole isso em um novo arquivo com o mesmo nome que você cria no segundo terminal conectado ao seu cliente.
Mas qualquer um pode cortar e colar. Em vez disso, pense como administrador, porque você nem sempre terá acesso à GUI, onde é possível uma operação de recortar / colar. Copie os arquivos para o diretório inicial do usuário (para que a operação scp remota possa acessá-los) e use chown para alterar o proprietário dos arquivos da raiz para um usuário não raiz regular, para que a ação scp remota possa ser executada. Verifique se todos os seus arquivos estão atualmente instalados e acessíveis. Você os moverá para o cliente um pouco mais tarde:
# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/ # cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/ # cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/client.key # chown ubuntu:ubuntu /home/ubuntu/client.crt # chown ubuntu:ubuntu /home/ubuntu/ca.crt
Com um conjunto completo de chaves de criptografia prontas para a ação, você precisa informar ao servidor como deseja criar uma VPN. Isso é feito usando o arquivo server.conf.
Reduza o número de pressionamentos de tecla
Demais para imprimir? Uma extensão entre parênteses ajudará a reduzir esses seis comandos para dois. Estou certo de que você pode estudar esses dois exemplos e entender o que está acontecendo. Mais importante, você pode entender como aplicar esses princípios a operações que envolvem dezenas ou até centenas de elementos:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
Configurando o arquivo server.conf
Como você pode saber como deve ser o arquivo server.conf? Lembre-se do modelo de diretório easy-rsa que você copiou de / usr / share /? Durante a instalação do OpenVPN, um arquivo de modelo de configuração compactado permaneceu, o qual você pode copiar para / etc / openvpn /. Vou aproveitar o fato de o modelo ter sido arquivado e apresentá-lo a uma ferramenta útil: zcat.
Você já sabe como exibir o conteúdo do texto de um arquivo usando o comando cat, mas e se o arquivo for compactado usando o gzip? Você sempre pode descompactar o arquivo e o gato exibirá com prazer, mas este é um ou dois passos mais do que o necessário. Em vez disso, como você provavelmente já adivinhou, é possível inserir o comando zcat para carregar o texto descompactado na memória em uma etapa. No exemplo a seguir, em vez de imprimir texto na tela, você o redireciona para um novo arquivo chamado server.conf:
# zcat \ /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \ > /etc/openvpn/server.conf $ cd /etc/openvpn
Deixamos de lado a documentação extensa e útil que acompanha o arquivo e vemos como ele pode parecer quando você terminar de editar. Observe que o ponto-e-vírgula (;) diz ao OpenVPN para não ler ou executar a próxima linha (Listagem 10.2).
Vamos passar por algumas dessas configurações.
- Por padrão, o OpenVPN funciona através da porta 1194. Você pode alterar isso, por exemplo, para ocultar ainda mais suas ações ou evitar conflitos com outros túneis ativos. Como o 1194 requer uma coordenação mínima com os clientes, é melhor fazer isso.
- O OpenVPN usa o TCP (Transmission Control Protocol) ou o UDP (User Datagram Protocol) para transferência de dados. O TCP pode ser um pouco mais lento, mas é mais confiável e mais provável de ser entendido pelos aplicativos em execução nas duas extremidades do túnel.
- Você pode dizer ao dev tun quando quiser criar um túnel IP mais simples e eficiente que transmita o conteúdo dos dados e nada mais. Se, por outro lado, você precisar conectar várias interfaces de rede (e as redes que elas representam) criando uma ponte Ethernet, terá que selecionar dev tap. Se você não entender o que tudo isso significa, use o argumento tun.
- As próximas quatro linhas passam os nomes OpenVPN dos três arquivos de autenticação no servidor e o arquivo de configurações dh2048 que você criou anteriormente.
- A linha do servidor define o intervalo e a máscara de sub-rede que serão usados para atribuir endereços IP aos clientes no login.
- O parâmetro push opcional "route 10.0.3.0 255.255.255.0" permite que clientes remotos acessem sub-redes privadas atrás do servidor. Para executar este trabalho, você também precisa configurar a rede no próprio servidor, para que a sub-rede privada conheça a sub-rede OpenVPN (10.8.0.0).
- A linha localhost de compartilhamento de porta 80 permite redirecionar o tráfego do cliente que passa pela porta 1194 para o servidor da web local que escuta na porta 80. (Será útil se você pretende usar o servidor da web para testar sua VPN.) Isso só funciona se quando o protocolo tcp estiver selecionado.
- O usuário ninguém e as linhas de grupo nogroup devem estar ativos - para isso, exclua o ponto e vírgula (;). Forçar os clientes remotos a trabalharem sob ninguém e nogroup garante que as sessões no servidor não sejam privilegiadas.
- log indica que as entradas de log atuais substituirão as entradas antigas toda vez que o OpenVPN for iniciado, enquanto o log-append adicionará novas entradas a um arquivo de log existente. O próprio arquivo openvpn.log é gravado no diretório / etc / openvpn /.
Além disso, o valor de cliente para cliente também é frequentemente adicionado ao arquivo de configuração, para que vários clientes possam se ver além do servidor OpenVPN. Se você estiver satisfeito com sua configuração, poderá iniciar o servidor OpenVPN:
# systemctl start openvpn
Devido à natureza mutável do relacionamento entre o OpenVPN e o systemd, às vezes pode ser necessária a seguinte sintaxe para iniciar um serviço: systemctl start openvpn @ server.
A execução de ip addr para exibir a lista de interfaces de rede do seu servidor agora deve exibir um link para uma nova interface denominada tun0. O OpenVPN o criará para atender os clientes que chegam:
$ ip addr [...] 4: tun0: mtu 1500 qdisc [...] link/none inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 valid_lft forever preferred_lft forever
Pode ser necessário reiniciar o servidor antes que tudo comece a funcionar completamente. A próxima parada é o computador cliente.
10.1.2 Configuração do cliente OpenVPN
Tradicionalmente, os túneis são construídos com pelo menos duas saídas (caso contrário, nós os chamaríamos de cavernas). Um OpenVPN configurado corretamente no servidor direciona o tráfego de e para o túnel, por um lado. Mas você também precisa de algum tipo de software do lado do cliente, ou seja, do outro lado do túnel.
Nesta seção, vou focar na configuração manual de um computador Linux de um tipo ou de outro para funcionar como um cliente OpenVPN. Mas essa não é a única maneira de disponibilizar esta oportunidade. O OpenVPN suporta aplicativos clientes que podem ser instalados e usados em computadores e laptops com Windows ou macOS, bem como em smartphones e tablets baseados no Android e iOS. Veja openvpn.net para detalhes.
O pacote OpenVPN precisará ser instalado no computador cliente, como foi instalado no servidor, embora não seja necessário o easy-rsa, pois as chaves que você usa já existem. Você precisa copiar o arquivo de modelo client.conf para o diretório / etc / openvpn / que você acabou de criar. Desta vez, o arquivo não será arquivado, portanto, o comando cp regular executará essa tarefa perfeitamente:
# apt install openvpn # cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf \ /etc/openvpn/
A maioria das configurações no seu arquivo client.conf será bem direta: elas devem corresponder aos valores no servidor. Como você pode ver no exemplo de arquivo a seguir, o parâmetro exclusivo é 192.168.1.23 1194 remoto, que informa ao cliente o endereço IP do servidor. Novamente, verifique se esse é o endereço do seu servidor. Você também deve forçar o computador cliente a autenticar o certificado do servidor para evitar um possível ataque man-in-the-middle. Uma maneira de fazer isso é adicionar o servidor remote-cert-tls da linha (Listagem 10.3).
Agora você pode ir para o diretório / etc / openvpn / e extrair as chaves de certificação do servidor. Substitua o endereço IP do servidor ou o nome de domínio no exemplo pelos seus valores:
Provavelmente nada de emocionante acontecerá até você executar o OpenVPN no cliente. Como você precisa passar alguns argumentos, você fará isso na linha de comando. O argumento --tls-client diz ao OpenVPN que você atuará como cliente e se conectará usando a criptografia TLS, e --config aponta para o seu arquivo de configuração:
# openvpn --tls-client --config /etc/openvpn/client.conf
Leia a saída do comando com atenção para garantir que você esteja conectado corretamente. Se pela primeira vez algo der errado, isso pode ser devido a uma incompatibilidade entre as configurações entre os arquivos de configuração do servidor e do cliente ou a um problema de conexão / firewall de rede. Aqui estão algumas dicas para solução de problemas.
- Leia com atenção a saída da operação OpenVPN no cliente. Muitas vezes, contém conselhos valiosos sobre o que exatamente não pode ser executado e por quê.
- Verifique as mensagens de erro nos arquivos openvpn.log e openvpn-status.log no diretório / etc / openvpn / no servidor.
- Verifique as mensagens relacionadas ao OpenVPN e apropriadas à hora nos logs do sistema no servidor e no cliente. (journalctl -ce exibirá as entradas mais recentes.)
- Verifique se você possui uma conexão de rede ativa entre o servidor e o cliente (para obter mais detalhes, consulte o capítulo 14).
Sobre o autor
David Clinton é um administrador de sistemas, professor e escritor. Ele administrou, escreveu sobre ele e criou materiais de treinamento para muitas disciplinas técnicas importantes, incluindo sistemas Linux, computação em nuvem (em particular a AWS) e tecnologias de contêineres, como o Docker. Ele escreveu o livro Learn Amazon Web Services em um mês de almoços (Manning, 2017). Muitos de seus tutoriais em vídeo podem ser encontrados no Pluralsight.com, e links para outros livros (sobre administração do Linux e virtualização de servidores) estão disponíveis em
bootstrap-it.com .
»Mais informações sobre o livro podem ser encontradas no
site do editor»
Conteúdo»
TrechoCupom de 25% de desconto para vendedores ambulantes -
LinuxApós o pagamento da versão impressa do livro, um livro eletrônico é enviado por e-mail.