Pesquisa de site

Crie hosts virtuais, diretórios protegidos por senha e certificados SSL usando "Nginx Web Server" no Arch Linux


O artigo anterior do Arch Linux ‘LEMP’ cobriu apenas coisas básicas, desde a instalação de serviços de rede (Nginx, banco de dados MySQL e PhpMyAdmin) e configuração de segurança mínima necessária para o servidor MySQL e PhpMyadmin.

Este tópico está estritamente relacionado à instalação anterior do LEMP no Arch Linux e irá guiá-lo na definição de configurações mais complexas para a pilha LEMP, especialmente configurações de servidor web Nginx, como a criação de hosts virtuais , use Diretórios protegidos por senha, crie e configure HTTP Secure Sockets Layer, redirecionamentos HTTP inseguros para HTTPS e também apresentará alguns scripts Bash úteis que facilitará o trabalho de ativação de hosts virtuais e geração de certificados e chaves SSL.

Requisitos

Instale LEMP com banco de dados MariaDB no Arch Linux

Etapa 1: habilitar hosts virtuais no Nginx

Um dos métodos mais simples para habilitar Hosts Virtuais é usar instruções include no arquivo de configuração principal do Nginx, o que torna o trabalho de configurações adicionais mais simples e eficiente porque você pode criar arquivos simples para cada novo host e mantenha o arquivo de configuração principal mais limpo.

Esta abordagem funciona da mesma maneira que no Apache Web Server, a primeira coisa que você precisa fazer é especificar o novo caminho URI onde o Nginx deve ler as diretivas do arquivo.

1. Portanto, abra o arquivo principal nginx.conf localizado no caminho do sistema /etc/nginx/ e na parte inferior, antes da última chave “ }” adicione o caminho onde os futuros arquivos de configuração do Host Virtual residirão.

sudo nano /etc/nginx/nginx.conf

Na parte inferior, adicione a seguinte declaração.

include /etc/nginx/sites-enabled/*.conf;

Esta diretiva diz ao Nginx que ele deve ler todos os arquivos encontrados em /etc/nginx/sites-enabled/ que terminam com uma extensão .conf.

2. O próximo passo é criar o diretório sites-enabled e outro, chamado sites-available, onde você armazena todas as suas configurações de Virtual Hosts. arquivos.

sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled

3. Agora é hora de criar um novo Host Virtual. Este exemplo usará o endereço IP do sistema como nome do host virtual, então crie um novo arquivo chamado name-ip.conf.

sudo nano /etc/nginx/sites-available/name-ip.conf

Adicione o seguinte conteúdo.

## File content ##

server {
    listen 80;
    server_name 192.168.1.33;

    access_log /var/log/nginx/192.168.1.33.access.log;
    error_log /var/log/nginx/192.168.1.33.error.log;

    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }

    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

A diretiva que ativa o Virtual Host é a instrução server_name na porta de escuta. Além disso, outra diretiva importante aqui é a instrução root que aponta o Nginx Virtual Host para servir o conteúdo do arquivo do caminho do sistema /srv/http/.

4. O último passo é criar o diretório /srv/http/ e disponibilizar a configuração do arquivo name-ip.conf para leitura do Nginx (usando link simbólico) e reinicie o daemon para tornar as novas configurações visíveis.

sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

5. Para verificar isso, aponte seu navegador para o endereço IP do sistema Arch e você verá que o conteúdo da web é diferente de http://localhost. Aqui eu adicionei um pequeno script php que também verifica as configurações do FastCGI PHP como na imagem abaixo.

sudo nano /srv/http/info.php
## File content ##

<?php
phpinfo();
?>

6. Outro método que eu mesmo desenvolvi para ativar ou desativar Virtual Hosts no Nginx é mais elegante e é inspirado no script Apache a2eniste.

Para usar este método abra um editor de arquivos e crie um novo arquivo, chamado n2ensite, em seu caminho $HOME com o conteúdo abaixo, torne-o executável, execute-o com privilégios de root e passe como opção para o seu novo nome de Host Virtual sem terminar em .conf (preencha à vontade para modificá-lo de acordo com suas necessidades).

sudo nano n2ensite
## File content ##

#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
echo "-----------------------------------------------"
else
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
fi

avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`

if [ "$#" != "1" ]; then
                echo "Use script: n2ensite virtual_site"
                echo -e "\nAvailable virtual hosts:\n$site"
                exit 0
else

if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo  -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi

Torne-o executável e execute-o como mostrado.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Para desativar Hosts Virtuais, crie um novo arquivo n2dissite com o seguinte conteúdo e aplique as mesmas configurações acima.

sudo nano n2dissite
## File content ##

#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`

if [ "$#" != "1" ]; then
                echo "Use script: n2dissite virtual_site"
                echo -e "\nAvailable virtual hosts: \n$site"
                exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo  -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi

8. Agora você pode usar esses dois scripts para ativar ou desativar qualquer Host Virtual, mas se quiser aplicá-los como comandos em todo o sistema, basta copiar ambos os scripts para /usr/local/bin/ e então você pode usá-lo sem especificar o caminho.

sudo cp n2ensite n2dissite /usr/local/bin/

Etapa 2: habilitar SSL com hosts virtuais no Nginx

SSL (Secure Sockets Layer) é um protocolo projetado para criptografar conexões HTTP em redes ou Internet, que faz com que o fluxo de dados seja transmitido por um canal seguro usando chaves de criptografia simétricas/assimétricas. e é fornecido no Arch Linux pelo pacote OpenSSL.

sudo pacman -S openssl

9. Para habilitar conexões HTTPS com Nginx, a primeira coisa que você precisa fazer é gerar chaves de hosts virtuais. Além disso, para simplificar as coisas, desenvolvi pequenos scripts que geram automaticamente chaves criptográficas no caminho do diretório /etc/nginx/ssl, usando a nomenclatura do Host Virtual como nomes de chave.

Crie um arquivo chamado nginx_gen_ssl e adicione o seguinte conteúdo.

sudo nano nginx_gen_ssl
## File content ##

#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx  SSL certificate!"
read cert

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt

echo -e " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0

10. Após a criação do script, anexe as permissões de execução, execute-o e forneça suas opções de certificado, sendo a mais importante o campo Nome comum (adicione o nome de domínio oficial aqui) e deixe os campos Senha e Empresa Opcional em branco.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Ao final da tarefa de geração de chaves, uma lista com todas as chaves disponíveis no diretório SSL Nginx será exibida.

Além disso, se você quiser que este script seja usado como um comando do sistema, copie ou mova-o para /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Depois de gerarmos as chaves necessárias para o Nginx SSL Virtual Host, é hora de realmente criar o arquivo de configuração do SSL Virtual Host. Use o mesmo endereço IP do sistema para o Virtual Host acima na diretiva server_name, mas altere ligeiramente o nome do arquivo do Virtual Host anexando ssl antes de .conf, para lembrá-lo de que este arquivo significa name-ip Host Virtual SSL.

sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf

Neste arquivo, altere a instrução da porta listen para 443 ssl e forneça os caminhos dos arquivos de chave de certificado e SSL com aqueles criados anteriormente para se parecerem com o trecho abaixo.

## File content ##

server {
    listen 443 ssl;
    server_name 192.168.1.33;

       ssl_certificate     /etc/nginx/ssl/192.168.1.33.crt;
       ssl_certificate_key  /etc/nginx/ssl/192.168.1.33.key;

       ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

       ssl_ciphers  HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers  on;

    access_log /var/log/nginx/192.168.1.33-ssl.access.log;
    error_log /var/log/nginx/192.168.1.33-ssl.error.log;
    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }
    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

12. Depois que o arquivo for criado, use o script n2ensite ou a linha de comando ln para ativá-lo (cria um link simbólico do arquivo em sites -enabled) e reinicie o daemon Nginx para aplicar as configurações.

sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

13. Aponte novamente seu navegador para Arch IP URL, mas desta vez usando o protocolo HTTPS – https://192.168.1.33 no meu sistema- e um erro de segurança Conexão não confiável deve aparecer ( Adicionar e confirmar exceção de segurança para prosseguir na página).

Como você pode ver agora, seu host virtual Nginx oferece o mesmo conteúdo do host name-ip anterior, mas desta vez usando uma conexão HTTP segura.

Etapa 3: acesse o PhpMyAdmin através do host virtual

Se o Virtual Host estiver habilitado no Nginx, não teremos mais acesso ao conteúdo do caminho http://localhost (localhost geralmente serve conteúdo usando endereço IP de loopback ou endereço IP do sistema, se não estiver configurado de outra forma) porque temos usei o IP do sistema Arch como server_name então nosso caminho de conteúdo mudou.

14. O método mais simples para obter acesso ao PhpMyAdmin através da web é criar um link simbólico entre o caminho /usr/share/webapps/phpMyAdmin/ e nosso novo caminho de host virtual definido (/srv/http).

sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/

15. Depois de executar o comando acima, atualize sua página e você verá uma nova pasta phpMyAdmin aparecer, se a instrução autoindex estiver habilitada no Nginx Virtual Host ou aponte seu URL diretamente para Pasta PhpMyAdmin https://arch_IP/phpMyAdmin.

16. Se você deseja limpar a string do phpMyAdmin no navegador, edite seus arquivos de Hosts Virtuais e adicione o seguinte conteúdo no bloco do servidor.

location /phpmyadmin {
       rewrite ^/* /phpMyAdmin last;
    }

Etapa 4: ativar o diretório protegido por senha no Nginx

Ao contrário do Apache, o Nginx usa o módulo HttpAuthBasic para ativar Diretórios protegidos por senha, mas não fornece nenhuma ferramenta para criar um arquivo .htpasswd criptografado.

17. Para obter proteção por senha de diretório com Nginx no Arch Linux, instale o servidor web Apache e use suas ferramentas para gerar um arquivo .htaccess criptografado.

sudo pacman -S apache

18. Depois de instalar o Apache, crie um novo diretório em /etc/nginx/ chamado intuitivamente passwd, onde o arquivo .htpasswd será armazenado e usado Comando htpasswd com –c ativa o primeiro usuário adicionado para gerar o arquivo, então se você quiser adicionar mais usuários use htpasswd sem – c interruptor.

sudo mkdir /etc/nginx/passwd

sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user

19. Para proteger o caminho servido name-ip-ssl do Host Virtual /srv/http/ com todas as suas subpastas e arquivos abaixo adicione as seguintes instruções dentro do bloco do servidor Virtual Host sob a diretiva root e aponte para o caminho absoluto do arquivo .htpasswd.

auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;

20. Depois de reiniciar o serviço Nginx, atualize a página e um pop-up Autenticação necessária deverá aparecer exigindo suas credenciais.

Agora você ativou com sucesso o Nginx Diretórios protegidos por senha, mas esteja ciente de que ao mesmo tempo que o servidor web Apache está instalado em seu sistema, certifique-se de que ele permaneça desabilitado e de qualquer forma não o inicie, pois pode levar a portas em conflito com o Nginx.

Etapa 5: Redirecionar HTTP para HTTPS no Nginx

21. Se você deseja que os navegadores redirecionem automaticamente todas as solicitações HTTP inseguras para o protocolo HTTPS, abra e edite seu host virtual não SSL e adicione as seguintes instruções em server_name.

rewrite        ^ https://$server_name$request_uri? permanent;

Todas as configurações apresentadas neste artigo foram feitas em um sistema Arch Linux que atua como servidor, mas a maioria delas, especialmente aquelas relacionadas aos arquivos de configuração Nginx, estão disponíveis na maioria dos sistemas Linux com pequenas diferenças.