Livro "Linux em Ação"

Livro "Linux em Ação" Olá, residentes de Khabro! No livro, David Clinton descreve 12 projetos da vida real, incluindo a automatização do seu sistema de backup e recuperação, a configuração de uma nuvem de arquivos pessoais no estilo Dropbox e a criação do seu próprio servidor MediaWiki. Você explorará virtualização, recuperação de desastres, segurança, backup, DevOps e solução de problemas de sistema por meio de estudos de caso interessantes. Cada capítulo termina com uma revisão das melhores práticas, um glossário de novos termos e exercícios.

Trecho “10.1. Criando um túnel OpenVPN"

Já falei muito sobre criptografia neste livro. SSH e SCP podem proteger dados transferidos por meio de conexões remotas (Capítulo 3), criptografia de arquivos pode proteger dados enquanto estão armazenados no servidor (Capítulo 8) e certificados TLS/SSL podem proteger dados transferidos entre sites e navegadores de clientes (Capítulo 9) . Mas às vezes seus dados precisam ser protegidos em uma variedade maior de conexões. Por exemplo, talvez alguns membros da sua equipe trabalhem em trânsito enquanto se conectam ao Wi-Fi por meio de pontos de acesso públicos. Definitivamente, você não deve presumir que todos esses pontos de acesso são seguros, mas seu pessoal precisa de uma maneira de se conectar aos recursos da empresa – e é aí que uma VPN pode ajudar.

Um túnel VPN adequadamente projetado fornece uma conexão direta entre clientes remotos e o servidor de uma forma que oculta os dados enquanto eles trafegam por uma rede insegura. E daí? Você já viu muitas ferramentas que podem fazer isso com criptografia. O verdadeiro valor de uma VPN é que, ao abrir um túnel, você pode conectar redes remotas como se fossem todas locais. De certa forma, você está usando um desvio.

Usando esta rede estendida, os administradores podem realizar seu trabalho em seus servidores de qualquer lugar. Mas o mais importante é que uma empresa com recursos espalhados por vários locais pode torná-los visíveis e acessíveis a todos os grupos que deles necessitam, onde quer que estejam (Figura 10.1).

O túnel em si 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 sobre a qual você já leu. OpenVPN não é a única opção de tunelamento disponível, mas é uma das mais conhecidas. É considerado um pouco mais rápido e seguro do que o protocolo de túnel alternativo da Camada 2 que usa criptografia IPsec.

Você deseja que todos em sua equipe se comuniquem com segurança enquanto estão na estrada ou trabalhando em edifícios diferentes? Para fazer isso, você precisa criar um servidor OpenVPN para permitir o compartilhamento de aplicativos e acesso ao ambiente de rede local do servidor. Para que isso funcione, basta executar duas máquinas virtuais ou dois contêineres: uma para atuar como servidor/host e outra para atuar como cliente. Construir uma VPN não é um processo simples, então provavelmente vale a pena dedicar alguns minutos para ter uma visão geral.

Livro "Linux em Ação"

10.1.1. Configuração do servidor OpenVPN

Antes de começar, darei alguns conselhos úteis. Se você for fazer isso sozinho (e eu recomendo fortemente que você faça), provavelmente trabalhará com várias janelas de terminal abertas em sua área de trabalho, cada uma conectada a uma máquina diferente. Existe o risco de em algum momento você inserir 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á. Depois de fazer isso, você precisará sair do servidor e fazer login novamente para que as novas configurações tenham efeito. Isto é o que parece:

Livro "Linux em Ação"
Seguindo essa abordagem e dando nomes apropriados a cada uma das máquinas com as quais você trabalha, você pode facilmente saber onde está.

Depois de usar o nome do host, você pode encontrar mensagens irritantes de Unable to Resolve Host OpenVPN-Server ao executar comandos subsequentes. Atualizar o arquivo /etc/hosts com o novo nome de host apropriado deve resolver o problema.

Preparando seu servidor para OpenVPN

Para instalar o OpenVPN no seu servidor, você precisa de dois pacotes: openvpn e easy-rsa (para gerenciar o processo de geração de chave de criptografia). Os usuários do CentOS devem primeiro instalar o repositório epel-release se necessário, como você fez no Capítulo 2. Para poder testar o acesso ao aplicativo do servidor, você também pode instalar o servidor web Apache (apache2 no Ubuntu e httpd no CentOS).

Enquanto você configura seu servidor, recomendo ativar um firewall que bloqueie todas as portas, exceto 22 (SSH) e 1194 (porta padrão do OpenVPN). Este exemplo ilustra como o ufw funcionaria no Ubuntu, mas tenho certeza que você ainda se lembra do programa CentOS firewalld do Capítulo 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

Para habilitar o roteamento interno entre interfaces de rede no servidor, você precisa descomentar uma linha (net.ipv4.ip_forward = 1) no arquivo /etc/sysctl.conf. Isso permitirá que os clientes remotos sejam redirecionados conforme necessário, assim que estiverem conectados. Para fazer a nova opção funcionar, execute sysctl -p:

# nano /etc/sysctl.conf
# sysctl -p

Seu ambiente de servidor agora está totalmente configurado, mas ainda há mais uma coisa a fazer antes de estar pronto: você precisará concluir as etapas a seguir (abordaremos elas em detalhes a seguir).

  1. Crie um conjunto de chaves de criptografia de infraestrutura de chave pública (PKI) no servidor usando os scripts fornecidos com o pacote easy-rsa. Essencialmente, o servidor OpenVPN também atua como sua própria autoridade de certificação (CA).
  2. Prepare chaves apropriadas para o cliente
  3. Configure o arquivo server.conf para o servidor
  4. Configure seu cliente OpenVPN
  5. Verifique sua VPN

Gerando chaves de criptografia

Para simplificar, você pode configurar sua infraestrutura principal na mesma máquina onde o servidor OpenVPN está sendo executado. No entanto, as práticas recomendadas de segurança normalmente sugerem o uso de um servidor CA separado para implantações de produção. O processo de geração e distribuição de recursos de chave de criptografia para uso no OpenVPN é ilustrado na Fig. 10.2.

Livro "Linux em Ação"
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 exemplo que você pode usar como base para sua configuração. Para iniciar o processo de certificação, copie o diretório do modelo 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 tabela 10.1 lista as ferramentas que você usará para criar chaves.

Livro "Linux em Ação"

As operações acima requerem privilégios de root, então você precisa se tornar root via sudo su.

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á estão lá. Esta é a aparência do meu arquivo (Listagem 10.1).

Listagem 10.1. 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="[email protected]"
export KEY_OU="IT"

A execução do arquivo vars passará seus valores para o ambiente shell, onde serão incluídos no conteúdo de suas novas chaves. Por que o comando sudo sozinho não funciona? Porque na primeira etapa editamos o script chamado vars e depois o aplicamos. Aplicar e significa que o arquivo vars passa seus valores para o ambiente shell, onde eles serão incluídos no conteúdo de suas novas chaves.

Certifique-se de executar novamente o arquivo usando um 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/:

Livro "Linux em Ação"
Naturalmente, a próxima etapa é executar o script clean-all, seguido pelo build-ca, que usa o script pkitool para criar o certificado raiz. Você será solicitado a confirmar as configurações de identidade fornecidas por 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 serão nomeadas com base nos argumentos que você passar, que, a menos que você esteja executando múltiplas VPNs nesta máquina, normalmente serão de 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

OpenVPN usa parâmetros gerados pelo algoritmo Diffie-Hellman (usando build-dh) para negociar autenticação para novas conexões. O arquivo criado aqui não precisa ser secreto, mas deve ser gerado usando o script build-dh para as chaves RSA que estão ativas no momento. Se você criar novas chaves RSA no futuro, também precisará atualizar o arquivo Diffie-Hellman:

# ./build-dh

Suas chaves do lado do servidor agora terminarão no diretório /etc/openvpn/easy-rsa/keys/, mas o OpenVPN não sabe disso. Por padrão, o OpenVPN irá procurar por chaves em /etc/openvpn/, então 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 instalada no servidor e outra instalada no cliente remoto. Isso significa que você precisará de chaves de cliente. Nosso velho amigo pkitool é exatamente o que você precisa para isso. Neste exemplo, quando executamos o programa no diretório /etc/openvpn/easy-rsa/, passamos a ele um argumento client para gerar arquivos chamados client.crt e client.key:

# ./pkitool client

Os dois arquivos do cliente, junto 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 aos seus direitos de propriedade e acesso, isso pode não ser tão fácil. A abordagem mais simples é copiar manualmente o conteúdo do arquivo de origem (e nada além desse conteúdo) em um terminal executado na área de trabalho do seu PC (selecione o texto, clique com o botão direito nele e selecione Copiar no menu). Em seguida, cole isso em um novo arquivo com o mesmo nome que você criou em um segundo terminal conectado ao seu cliente.

Mas qualquer um pode recortar e colar. Em vez disso, pense como um administrador porque você nem sempre terá acesso à GUI onde as operações de recortar/colar são possíveis. Copie os arquivos para o diretório inicial do seu usuário (para que a operação scp remota possa acessá-los) e, em seguida, use chown para alterar a propriedade dos arquivos de root para um usuário normal não root para que a ação scp remota possa ser executada. Certifique-se de que todos os seus arquivos estejam 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, você precisa informar ao servidor como deseja criar a VPN. Isso é feito usando o arquivo server.conf.

Reduzindo o número de pressionamentos de tecla

Há muita digitação? A expansão com colchetes ajudará a reduzir esses seis comandos para dois. Tenho certeza que você pode estudar esses dois exemplos e entender o que está acontecendo. Mais importante ainda, você será capaz de entender como aplicar estes 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 a aparência do arquivo server.conf? Lembra do modelo de diretório easy-rsa que você copiou de /usr/share/? Ao instalar o OpenVPN, você ficou com um arquivo de modelo de configuração compactado que pode copiar para /etc/openvpn/. Aproveitarei o fato de que o modelo está arquivado e apresentarei a você uma ferramenta útil: zcat.

Você já sabe como imprimir o conteúdo de texto de um arquivo na tela usando o comando cat, mas e se o arquivo for compactado usando gzip? Você sempre pode descompactar o arquivo e cat o exibirá com prazer, mas isso é uma ou duas etapas a mais do que o necessário. Em vez disso, como você deve ter adivinhado, você pode emitir o comando zcat para carregar o texto descompactado na memória em uma única etapa. No exemplo a seguir, em vez de imprimir o texto na tela, você irá redirecioná-lo 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

Vamos deixar de lado a extensa e útil documentação que acompanha o arquivo e ver como ele ficará quando você terminar a edição. Observe que o ponto e vírgula (;) diz ao OpenVPN para não ler ou executar a próxima linha (Listagem 10.2).

Livro "Linux em Ação"
Vamos examinar algumas dessas configurações.

  • Por padrão, o OpenVPN é executado na porta 1194. Você pode alterar isso, por exemplo, para ocultar ainda mais suas atividades ou evitar conflitos com outros túneis ativos. Como o 1194 requer coordenação mínima com os clientes, é melhor fazê-lo desta forma.
  • OpenVPN usa o Transmission Control Protocol (TCP) ou o User Datagram Protocol (UDP) para transmitir dados. O TCP pode ser um pouco mais lento, mas é mais confiável e tem maior probabilidade de ser compreendido por aplicativos executados nas duas extremidades do túnel.
  • Você pode especificar dev tun quando quiser criar um túnel IP mais simples e eficiente que transporte conteúdo de dados e nada mais. Se, por outro lado, você precisa conectar várias interfaces de rede (e as redes que elas representam), criando uma ponte Ethernet, você terá que escolher dev tap. Se você não entende o que tudo isso significa, use o argumento tun.
  • As próximas quatro linhas fornecem ao OpenVPN os nomes dos três arquivos de autenticação no servidor e do arquivo de opçõ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. Fazer isso funcionar também requer a configuração da rede no próprio servidor para que a sub-rede privada conheça a sub-rede OpenVPN (10.8.0.0).
  • A linha port-share localhost 80 permite redirecionar o tráfego do cliente que chega na porta 1194 para um servidor web local escutando na porta 80. (Isso será útil se você for usar o servidor web para testar sua VPN.) Isso só funciona. então, quando o protocolo tcp for selecionado.
  • As linhas do usuário ninguém e do grupo nogroup devem ser habilitadas removendo o ponto-e-vírgula (;). Forçar clientes remotos a serem executados como ninguém e nogroup garante que as sessões no servidor não tenham privilégios.
  • log especifica que as entradas de log atuais substituirão as entradas antigas cada vez que o OpenVPN for iniciado, enquanto log-append anexa novas entradas ao arquivo de log existente. O próprio arquivo openvpn.log é gravado no diretório /etc/openvpn/.

Além disso, um valor cliente para cliente também é frequentemente adicionado ao arquivo de configuração para que vários clientes possam ver uns aos outros, além do servidor OpenVPN. Se estiver satisfeito com sua configuração, você pode iniciar o servidor OpenVPN:

# systemctl start openvpn

Devido à natureza mutável do relacionamento entre OpenVPN e systemd, às vezes a seguinte sintaxe pode ser necessária para iniciar um serviço: systemctl start openvpn@server.

Executar ip addr para listar as interfaces de rede do seu servidor agora deve gerar um link para uma nova interface chamada tun0. OpenVPN irá criá-lo para atender clientes recebidos:

$ 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 reinicializar o servidor antes que tudo comece a funcionar totalmente. A próxima parada é o computador cliente.

10.1.2. Configurando o cliente OpenVPN

Tradicionalmente, os túneis são construídos com pelo menos duas saídas (caso contrário, chamaríamos de cavernas). Um OpenVPN configurado corretamente no servidor direciona o tráfego para dentro e para fora do túnel por um lado. Mas você também precisará de algum software rodando no lado do cliente, ou seja, do outro lado do túnel.

Nesta seção, vou me concentrar na configuração manual de algum tipo de computador Linux para atuar como um cliente OpenVPN. Mas esta não é a única forma de esta oportunidade estar disponível. OpenVPN oferece suporte a aplicativos clientes que podem ser instalados e usados ​​em desktops e laptops com Windows ou macOS, bem como em smartphones e tablets Android e iOS. Consulte openvpn.net para obter detalhes.

O pacote OpenVPN precisará ser instalado na máquina cliente da mesma forma que foi instalado no servidor, embora não haja necessidade de easy-rsa aqui, pois as chaves que você está usando já existem. Você precisa copiar o arquivo de modelo client.conf para o diretório /etc/openvpn/ que acabou de criar. Desta vez, o arquivo não será compactado, então o comando cp normal fará o trabalho perfeitamente:

# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf 
  /etc/openvpn/

A maioria das configurações em seu arquivo client.conf serão bastante autoexplicativas: elas devem corresponder aos valores no servidor. Como você pode ver no arquivo de exemplo a seguir, o parâmetro exclusivo é remoto 192.168.1.23 1194, que informa ao cliente o endereço IP do servidor. Novamente, certifique-se de que este seja o endereço do seu servidor. Você também deve forçar o computador cliente a verificar a autenticidade do certificado do servidor para evitar um possível ataque man-in-the-middle. Uma maneira de fazer isso é adicionar a linha remote-cert-tls server (Listagem 10.3).

Livro "Linux em Ação"
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 nome de domínio no exemplo pelos seus valores:

Livro "Linux em Ação"
Provavelmente nada de interessante acontecerá até que você execute o OpenVPN no cliente. Como você precisa passar alguns argumentos, você fará isso na linha de comando. O argumento --tls-client informa ao OpenVPN que você atuará como cliente e se conectará via criptografia TLS, e --config aponta para seu arquivo de configuração:

# openvpn --tls-client --config /etc/openvpn/client.conf

Leia a saída do comando com atenção para ter certeza de que está conectado corretamente. Se algo der errado na primeira vez, pode ser devido a uma incompatibilidade nas configurações entre os arquivos de configuração do servidor e do cliente ou a um problema de conexão de rede/firewall. Aqui estão algumas dicas de solução de problemas.

  • Leia atentamente a saída da operação OpenVPN no cliente. Muitas vezes contém conselhos valiosos sobre o que exatamente não pode ser feito e por quê.
  • Verifique as mensagens de erro nos arquivos openvpn.log e openvpn-status.log no diretório /etc/openvpn/ no servidor.
  • Verifique os logs do sistema no servidor e no cliente para mensagens cronometradas e relacionadas ao OpenVPN. (journalctl -ce exibirá as entradas mais recentes.)
  • Certifique-se de ter uma conexão de rede ativa entre o servidor e o cliente (mais sobre isso no Capítulo 14).

Sobre o autor

David Clinton - administrador de sistema, professor e escritor. Ele administrou, escreveu e criou materiais educacionais para muitas disciplinas técnicas importantes, incluindo sistemas Linux, computação em nuvem (particularmente AWS) e tecnologias de contêineres como Docker. Ele escreveu o livro Aprenda Amazon Web Services em um mês de almoços (Manning, 2017). Muitos de seus cursos de treinamento em vídeo podem ser encontrados em Pluralsight.com, e links para seus outros livros (sobre administração Linux e virtualização de servidores) estão disponíveis em bootstrap-it.com.

» Mais detalhes sobre o livro podem ser encontrados em site da editora
» Índice analítico
» Excerto

Para Khabrozhiteley 25% de desconto usando cupom - Linux
Mediante o pagamento da versão em papel do livro, será enviado um livro eletrônico por e-mail.

Fonte: habr.com

Adicionar um comentário