Tag: rede

  • Problema: timeout em sites atrás do proxy reverso via OpenVPN

    Um dia o nginx que configurei como proxy reverso aqui passou a dar timeout ao tentar carregar o Nextcloud. Ao investigar, verifiquei que mesmo ao fazer a solicitação ao servidor Nextcloud a partir do próprio servidor que hospeda o nginx/OpenVPN, através do comando abaixo, a solicitação não completava.

    $ curl -v http://10.8.0.3

    As solicitações feitas dentro da LAN funcionavam, indicando que o problema acontecia apenas dentro da VPN. No entanto, dentro da VPN o ping funcionava, solicitações para outras páginas do Nextcloud também funcionavam, como:

    $ curl -v http://10.8.0.3/status.php

    Tentei aprofundar a investigação mas eu não sou nenhum especialista em redes, só um entusiasta que se mete profissionalmente. Uma explicação que consegui foi que o problema podia ser relacionado ao MTU (maximum transmission unit) da interface virtual de rede do OpenVPN.

    Tanto a interface virtual do OpenVPN (tun0) quanto a interface de rede da máquina (eth0) possuíam o mesmo MTU: 1500 bytes. Isso pode ser verificado com:

    $ ip a

    Diminui o MTU do tun0 para 1380, tanto no servidor quanto no cliente, que foi uma sugestão que encontrei e funcionou. Esqueci o problema até acontecer com outra instalação do Nextcloud que mantenho. Mesmo problema, mesma solução. Eventualmente retornei o MTU pra 1500 e continuou funcionando.

    O blog não existia na época da primeira ocorrência com o Nextcloud. Agora, tive o mesmo problema com o WordPress e o novo Nextcloud. E o problema parece inconsistente. Tudo funciona, até que de repende para. E em momentos diferentes, sem nenhum gatilho claro, mas claramente alguma tentativa de enviar um pacote maior que não poderia ser fragmentado falhou.

    Dessa vez parei pra investigar um pouco melhor. Já que o MTU da tun0 é 1500, um ping com tamanho de 1472 bytes (-20 do cabeçalho IP -8 do cabeçalho ICMP) deve passar sem ser fragmentado. Não passou. 100% dos pacotes perdidos. Fui baixando até encontrar o ponto onde os pings tem resposta: 1396 bytes. MTU de 1424 bytes.

    Testei então: ping sem opções definidas e com tamanhos 1396 e 1397 bytes, monitorando também com o tcpdump tanto no servidor quanto no cliente:

    $ ping 10.8.0.3
    $ ping -M do -s 1396 10.8.0.3
    $ ping -M do -s 1397 10.8.0.3

    Para o tcpdump:

    # tcpdump -i tun0 icmp

    Resultados:

    • “ping 10.8.0.3” e “ping -M do -s 1396 10.8.0.3”:
      • pra cada 10 pings, 0% de perda de pacotes.
      • tcpdump reporta 20 pacotes capturados tanto no servidor quanto no cliente: solicitação e resposta

    Ótimo. Agora:

    • “ping -M do -s 1397 10.8.0.3” e valores acima:
      • pra cada 10 pings, 100% de perda de pacotes
      • tcpdump reporta 10 pacotes capturados no servidor, 20 no cliente: o pacote sai do servidor e chega ao cliente, que responde, mas as respostas do cliente não chegam ao servidor.

    O mesmo foi feito pingando do cliente para o servidor. Mesmo sucesso para pacotes de 1396 bytes e menores. Já com

    • ping -M do -s 1397 10.8.0.1:
      • pra cada 10 pings, 100% de perda de pacotes
      • tcpdump reporta 10 pacotes capturados no cliente, 0 no servidor.

    Ou seja, o problema está no envio de pacotes dos clientes para o servidor através do túnel.

    O ping não alerta que o pacote é grande demais nem dá qualquer erro específico, apenas para pings com tamanho acima de 1472 (que resultariam num pacote acima do MTU). Em vez disso, apenas falha silenciosamente.

    Adicionalmente ao ping, fiz testes com requisições às páginas que resultavam em timeout usando curl e monitorando com tcpdump.

    Solução: baixar o valor do MTU da interface tun0 do servidor e clientes da VPN para 1424 bytes: tamanho total do maior pacote do ping que funcionou (1396 de payload, 20 do cabeçalho IP e 8 do cabeçalho ICMP).

    Isso pode ser feito de forma não persistente com:

    # ip link set dev tun0 mtu 1424

    O MTU vai voltar para 1500 quando o serviço do OpenVPN for reiniciado. Para configurar de forma persistente, inclua essa linha nos arquivos de configuração do OpenVPN do servidor e dos clientes:

    tun-mtu 1424

    Eu ainda não entendi 100% o que causa esse problema e ele não parece afetar todos os clientes igualmente ou ao mesmo tempo. O servidor recebia resposta do ping com payload de 1472 de alguns clientes sem problemas, que exibiam a página e operavam com a MTU padrão de 1500 bytes no tun0.

    Até então, após a mudança para o MTU de 1424, o problema não reincidiu. Sendo mais conservador, eu colocaria um valor mais baixo, pra deixar uma margem pra possíveis alterações que possam vir a acontecer no OpenVPN ou nos outros servidores, masss eu tô aqui pra ver o que acontece.

  • Instalação do FreeRADIUS integrado com Active Directory

    RADIUS é um protocolo de rede que oferece gerenciamento centralizado de autorização e autenticação para acesso de usuários a serviços de rede. Muito usado, por exemplo, como uma alternativa mais segura de acesso a uma rede Wi-Fi, onde cada usuário usa suas credenciais para se conectar, em vez de todos compartilharem uma única senha.

    FreeRADIUS é um sistema livre e aberto que implementa esse protocolo e pode ser configurado pra usar diferentes back-ends para autorização e autenticação, um deles é o Active Directory.

    Pra configurar esse sistema, garanta antes que o servidor RADIUS possa encontrar e ingressar no domínio – aqui tratado como exemplo.com:

    • Domínio e o controlador de domínio podem ser encontrados por consulta de DNS e são acessíveis na rede.
    • O arquivo /etc/hosts do servidor deve conter o FQDN especificado, algo como:
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.0.10 radius-server.exemplo.com radius-server

    Após isso, instale e configure o Samba, que vai ser usado para ingressar o computador no domínio. A partir daqui, as instruções são válidas para sistemas da família Red Hat, tendo sido usado o CentOS Stream 9.

    # dnf install samba

    Adapte a configuração abaixo para o seu domínio, alterando ou adicionando os seguintes parâmetros no arquivo /etc/samba/smb.conf :

    [global]
        workgroup = EXEMPLO
        security = ads
        winbind use default domain = yes
        realm = EXEMPLO.COM
    
        idmap config * : backend = tdb
        idmap config * : range = 10000-19999
    
        idmap config EXEMPLO : backend = rid
        idmap config EXEMPLO : range = 20000-99999
    

    Remova também o parâmetro a seguir para evitar o risco de conflito na autenticação:

    [global]
        passdb backend = tdbsam

    Verifique se há algum erro na sua configuração com

    # testparm

    Agora, para ingressar o servidor no domínio:

    # net ads join -U Administrator

    Instale o pacote samba-winbind-clients, habilite o serviço winbind e teste a autenticação com ntlm_auth:

    # dnf install samba-winbind-clients
    # systemctl enable --now winbind.service
    # ntlm_auth --request-nt-key --username=daniel --password='senhaqueanoteinoblocodenotas'

    Um output como

    :  (0x0)

    indica sucesso.

    Agora que o servidor já faz parte do domínio e conseguimos autenticar usuários com ntlm_auth, podemos instalar os pacotes do FreeRADIUS para então configurá-lo

    # dnf install freeradius freeradius-utils

    Pra autenticação no AD, vamos usar a combinação de protocolos PEAP/MSCHAPv2.

    Edite a o módulo mschap localizado em /etc/raddb/mods-enabled/mschap para alterar as seguintes configurações

    mschap {
        use_mppe = yes
        require_encryption = yes
        require_strong = yes
        ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
    }

    Edite o módulo eap localizado em /etc/raddb/mods-enabled/eap para alterar a seguinte configuração:

    eap {
        default_eap_type = peap
    }

    Dica: os arquivos de configuração do FreeRADIUS são extensivamente comentados. Isso é ótimo porque ajuda a entender a configuração já na hora. Mas se quiser ver só a configuração, sem os comentários e linhas em branco:

    $ grep -vE '^\s*#|^\s*$' /caminho/para/arquivo.txt

    Na pasta /etc/raddb/certs, execute o arquivo bootstrap para gerar os certificados necessários para o TLS usado no PEAP.

    Adicione o usuário radiusd ao grupo wbpriv para que o FreeRADIUS tenha acesso para ler a resposta do winbind à solicitação de autenticação, através do socket em /var/lib/samba/winbindd_privileged/pipe

    # usermod -aG wbpriv radiusd

    Abra as portas necessárias no firewall:

    # firewall-cmd --permanent --add-port=1812/udp
    # firewall-cmd --permanent --add-port=1813/udp
    # firewall-cmd --reload

    E agora basta iniciar o serviço radiusd:

    # systemctl enable --now radiusd.service

    Você pode testar a autenticação pelo FreeRADIUS com

    radtest -t mschap daniel senhaqueanoteinoblocodenotas localhost 0 testing123

    e configurar outros clientes do FreeRADIUS em /etc/raddb/clients.conf

    Alguns clientes podem não aceitar o certificado gerado com as configurações padrão do FreeRADIUS, então é recomendado ajustar as configurações pra que o certificado seja emitido corretamente para o FQDN do servidor. O Easy RSA também pode ajudar a gerar e manter os certificados.

  • Criação de um domínio com Active Directory no Windows Server

    Active Directory Domain Services é um serviço proprietário desenvolvido pela Microsoft usado para gerenciamento centralizado de um domínio de rede em ambientes corporativos, controlando a autorização e autenticação de usuários e computadores, atribuindo e impondo políticas de segurança e instalando ou atualizando softwares.

    Felizmente eu tinha um snapshot da máquina virtual anterior à criação do meu domínio e pude refazer os passos pra colocar umas imagens, porque eu sou uma negação em PowerShell.

    O sistema usado foi o Windows Server 2025 Standard. Antes de instalar o AD DS e criar o domínio, é necessário configurar o sistema com um endereço de IP fixo. Para isso, vá em

    Control Panel > Network and Internet > Network and Sharing Center > Change adapter settings

    Clique com o botão direito no adaptador de rede e clique em Propriedades. Selecione “Internet Protocol Version 4” e clique em Propriedades.

    Configure um endereço de IP estático fora da faixa do DHCP e use o mesmo IP ou 127.0.0.1 para servidor de DNS – que será configurado mais à frente.

    No Server Manager, vá em “Add roles and features”. No Wizard, selecione “Role-based or feature-based installation” e prossiga.

    Na próxima etapa, selecione o seu servidor e prossiga. Em seguida, você vai ver uma lista do que pode ser instalado. Selecione “Active Directory Domain Services” e “DNS Server”.

    O servidor precisará atuar também como servidor de DNS para que clientes possam encontrar e participar do domínio. Esse papel poderia ser delegado a outro servidor de DNS que você tenha configurado no mesmo domínio.

    Na etapa de confirmação, mantenha desmarcada a opção de reiniciar o servidor após instalação, já que só faremos isso após promover o servidor a controlador do domínio.

    Após a instalação, um sinal de atenção vai aparecer nas notificações do Server Manager, onde vai aparecer a opção de promover o servidor a controlador de domínio.

    Isso vai abrir um novo Wizard. Na primeira etapa, selecione “Add a new forest” e determine o seu domínio. Em um caso ideal, você tem nome de domínio público, como exemplo.com, e pode configurar com um subdomínio do tipo ad.exemplo.com. Alternativamente, você pode usar um como privado. Apenas tenha cuidado com possíveis conflitos com domínios externos, escolha algo como exemplo.interno.

    Sobre o nível funcional da floresta e domínio no próximo passo: isso é sobre compatibilidade de funcionalidades e protocolos. Caso não tenha outros controladores de domínio com versões antigas do Windows Server atuando, prossiga com o padrão (mais recente).

    Determine sua senha para o modo de restauração (DSRM). Isso é como o modo de segurança nas versões do Windows Home ou Pro, mas específica para controladores de domínio. Isso porque a autenticação através do AD é desabilitada no modo de restauração, então essa é a senha que você usa pra logar no Administrator.

    Pule a etapa de delegação de DNS, já que estamos configurando nosso servidor de DNS junto com o domínio.

    O nome de domínio NetBIOS é determinado automaticamente a partir do seu nome de domínio totalmente qualificado (FQDN).

    Após isso, siga com as opções padrões até o fim da instalação, onde seu servidor será reiniciado e promovido a controlador de domínio.

    Para que outros computadores possam encontrar o seu domínio e participar dele, você deve alterar as configurações de DHCP do seu roteador para usar seu Windows Server como servidor de DNS.

    Você pode gerenciar usuários e grupos do domínio com dsa.msc, políticas de grupo com gpmc.msc, e o servidor de DNS com dnsmgmt.msc.

    Sugestão de segurança: Princípio do menor privilégio.
    Por padrão, só administradores podem incluir ou remover computadores do domínio. Pra resolver isso você pode criar um usuário ou grupo e delegar as permissões do contêiner Computers em “Active Directory Users and Computers” (dsa.msc).

  • Configuração de servidor OpenVPN

    OpenVPN é um sistema de rede virtual privada (VPN), usado pra criar conexões seguras entre dispositivos, protegendo a troca de informações mesmo em trajetos não confiáveis, como a internet. Implementa tanto aplicação de servidor quanto de cliente e é distribuído sob a licença GPL-2.0.

    O sistema funciona com base em infraestrutura de chave pública (PKI). Pra configurar a autenticação de forma segura é necessário gerar certificados SSL e chaves para uma autoridade certificadora (CA), para o servidor e para os clientes da VPN.

    Felizmente, não precisamos tocar diretamente no OpenSSL, que é bem complexo. Em vez disso, a gente usa o EasyRSA, uma ferramenta que nos ajuda a gerar as chaves e certificados que a gente precisa.

    Considerando uma instalação do Debian ou Ubuntu server:

    # apt install openvpn easy-rsa

    Pra facilitar e deixar a configuração organizada, copie a pasta do EasyRSA para dentro da pasta de configuração do OpenVPN.

    # cp -r /usr/share/easy-rsa /etc/openvpn/

    Vá para a pasta /etc/openvpn/easy-rsa, edite copie o arquivo vars.example como var e descomente as linhas que quiser editar de acordo com a sua preferência. Configurações sugeridas:

    set_var EASYRSA_KEY_SIZE        4096
    set_var EASYRSA_CERT_EXPIRE     731
    set_var EASYRSA_CRL_DAYS        366
    set_var  EASYRSA_FIX_OFFSET 30

    Dessa forma, os certificados serão válidos por 2 anos, a lista de revogação de certificados (CRL) por 1 ano, e todos os certificados vão ser emitidos com validade fixa a partir de 30 de Janeiro.

    Após configurado, podemos iniciar nossa PKI e gerar o CA:

    # bash easyrsa init-pki
    # bash easyrsa build-ca

    Ao gerar a chave do CA, uma senha será pedida pra criptografar a chave do CA.

    Deve-se também gerar a chave de Diffie-Hellman, que é usada para gerar a chave simétrica da conexão de VPN a ser estabelecida.

    # bash easyrsa gen-dh

    Opcionalmente, para maior segurança, pode-se gerar uma chave de autenticação para que o servidor exija uma assinatura válida nos pacotes recebidos dos clientes.

    # openvpn --genkey secret pki/tls-auth.key

    Ao gerar o par de chaves do servidor, é uma boa ideia gerar a chave sem senha pra que o serviço possa ser iniciado junto com o sistema:

    # bash easyrsa build-server-full nome_do_servidor nopass

    A senha da chave do CA ainda será pedida para assinar o certificado do servidor.

    Assim como para o servidor, você pode escolher deixar as chaves dos clientes com senha ou não passando o parâmetro opcional nopass.

    # bash easyrsa build-client-full nome_do_cliente0 nopass

    Agora, a configuração do servidor e dos clientes vai depender do propósito da VPN: pode ser um gateway, pode ser apenas para conectar um cliente ao outro, pode ser pra conectar clientes à uma LAN.

    Crie um arquivo com extensão .conf na pasta /etc/openvpn server, como por exemplo config_do_servidor.conf com esse conteúdo de exemplo – adapte-o para a sua necessidade:

    # Configurações da conexão
    # Descomente a linha abaixo e coloque o IP do seu servidor caso ele esteja dentro de uma LAN
    ;local 192.168.0.10
    port 1194
    proto udp4
    dev tun0
    keepalive 10 120
    persist-key
    persist-tun
    
    # As linhas abaixo determinam a rede privada que seu servidor vai criar
    server 10.8.0.0 255.255.255.0
    topology subnet
    push "route 10.8.0.0 255.255.255.0"
    
    # Descomente a linha abaixo e substitua a LAN pela sua caso queira que os clientes tenham uma rota para a LAN do servidor
    ;push "route 192.168.0.0 255.255.255.0"
    
    # Descomente a linha abaixo caso queira que o cliente use o servidor de VPN como gateway
    ;push "redirect-gateway def1 bypass-dhcp"
    
    # Configura resolvedores de DNS alternativos
    ;push "dhcp-option DNS 208.67.222.222"
    ;push "dhcp-option DNS 208.67.220.220"
    
    # Permite que clientes da VPN possam alcançar outros
    ;client-to-client
    
    # Limita o número de clientes na VPN
    ;max-clients 5
    
    # Configurações do processo
    verb 3
    explicit-exit-notify 1
    status /var/log/openvpn/status-conext00.log
    # Reduz o privilégio de execução após inicialização para o usuário e grupo abaixo - em distribuições da família Fedora e Red Hat, existe um usuário openvpn próprio. O grupo nogroup não existe.
    user nobody
    group nogroup
    # Mantém clientes com o mesmo IP na VPN
    ;ifconfig-pool-persist /var/log/openvpn/ipp.txt
    
    # Certificados e chaves necessários gerados através do easy-rsa
    ca ../easy-rsa/pki/ca.crt
    cert ../easy-rsa/pki/issued/nome_do_servidor.crt
    key ../easy-rsa/pki/private/nome_do_servidor.key
    dh ../easy-rsa/pki/dh.pem
    
    # Lista opcional de revogação de certificados
    ;crl-verify ../easy-rsa/pki/crl.pem
    
    # Chave TLS opcional para maior segurança, exigindo que pacotes recebidos tenham uma assinatura válida
    ;tls-auth ../easy-rsa/pki/tls-auth.key 0
    

    Observe que as linhas do tipo

    push "algum parâmetro"

    são configurações que também podem ser especificadas no arquivo de configuração do cliente em vez do servidor.

    Precisa-se também configurar as permissões de firewall e habilitar no kernel o encaminhamento em IPv4.

    Para habilitar o encaminhamento no kernel, adicione um arquivo /etc/sysctl.d/98-ip-fwd.conf com a seguinte linha:

    net.ipv4.ip_forward=1

    Reinicie para que tenha efeito ou

    # sysctl -w net.ipv4.ip_forward=1

    No firewall, para permitir conexão de clientes:

    # ufw allow 1194/udp

    Caso use o servidor de VPN como um gateway ou estabeleça rota do cliente para a LAN em que o servidor está:

    # ufw route allow in on tun0 out on eth0
    # ufw route allow in on eth0 out on tun0

    E configure o protocolo NAT adicionando este trecho no topo do arquivo /etc/ufw/before.rules

    ### START OF MANUAL NAT CONFIG
    # NAT table rules
    *nat
    :POSTROUTING ACCEPT [0:0]
    
    # Forward traffic through eth0 - Change to match you out-interface
    -A POSTROUTING -s 10.8.0.0/24 -o tun0 -j MASQUERADE
    
    # don't delete the 'COMMIT' line or these nat table rules won't
    # be processed
    COMMIT
    ### END OF MANUAL NAT CONFIG

    Lembre-se de substituir a interface física e a rede pelas do seu servidor.

    Alternativamente ao NAT, no caso da existência de uma LAN, você pode configurar no seu roteador uma rota para 10.8.0.0/24 pelo IP privado do seu servidor.

    Agora basta habilitar e iniciar o serviço:

    # systemctl enable --now openvpn-server@config_do_servidor.service

    É isso, o servidor deve estar funcionando.

    Agora precisamos que clientes se conectem. Pra isso, eles precisam de um arquivo de configuração do mesmo tipo que foi feito para o servidor. O easy-rsa não gera esses arquivos, então eu fiz um pequeno script pra resolver esse problema, que deixo em /etc/openvpn/easy-rsa/build-client-config.sh

    Conteúdo do script:

    #!/bin/bash
    
    system=$1
    client=$2
    clients_dir=./clients
    client_template_win=./clients/client.ovpn
    client_template_lnx=./clients/client.conf
    
    
    init() {
            mkdir $clients_dir
    cat <<'EOF' > $client_template_win
    client
    dev tun
    proto udp4
    remote servidor.exemplo.com 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    remote-cert-tls server
    ;key-direction 1
    verb 3
    EOF
    
    cat <<'EOF' > $client_template_lnx
    client
    dev tun
    proto udp4
    remote servidor.exemplo.com 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    remote-cert-tls server
    ;key-direction 1
    verb 3
    user nobody
    group nogroup
    EOF
    
            if ! [[ -f ./pki/ca.crt ]]; then
                    echo "CA não encontrado. Encerrando."
                    exit 1
            else
                    echo "" | tee -a $client_template_lnx $client_template_win
                    echo "<ca>" | tee -a $client_template_lnx $client_template_win
                    cat pki/ca.crt | tee -a $client_template_lnx $client_template_win
                    echo "</ca>" | tee -a $client_template_lnx $client_template_win
            fi
    
            if [[ -f ./pki/tls-auth.key ]]; then
                    sed -i 's/;//g' $client_template_lnx $client_template_win
                    echo "" | tee -a $client_template_lnx $client_template_win
                    echo "<tls-auth>" | tee -a $client_template_lnx $client_template_win
                    cat pki/tls-auth.key | tee -a $client_template_lnx $client_template_win
                    echo  "</tls-auth>" | tee -a $client_template_lnx $client_template_win
            else
                    echo "tls-auth.key não encontrada, prosseguindo sem"
            fi
    }
    
    if ! [[ -d $clients_dir ]]; then
            init
            exit
    fi
    
    if ! [[ -f ./pki/issued/$client.crt ]]; then
            echo "Cliente não existe"
            exit 1
    fi
    
    if [[ $system == "-l" || $system == "--linux" ]]; then
            fileExt=conf
    elif [[ $system == "-o" || $system == "--outro" ]]; then
            fileExt=ovpn
    else
            echo "Sistema não especificado"
    fi
    
    targetFile=clients/$client.$fileExt
    
    cp clients/client.$fileExt $targetFile
    
    echo "" | tee -a $targetFile
    echo "<cert>" | tee -a $targetFile
    cat pki/issued/$client.crt | tee -a $targetFile
    echo "</cert>" | tee -a $targetFile
    
    echo "" | tee -a $targetFile
    echo "<key>" | tee -a $targetFile
    cat pki/private/$client.key | tee -a $targetFile
    echo "</key>" | tee -a $targetFile

    Pra inicializar, basta executar o script sem nenhum argumento

    # bash build-client-config.sh

    Ele vai criar uma pasta clients, com um template para Linux, client.conf, e outro para Windows, client.ovpn. Edite-os conforme necessário.

    Feito isso, é possível criar o arquivo de configuração para um cliente existente com

    # bash build-client-config.sh --linux nome_do_cliente0

    ou para Windows, macOS, iOS ou Android

    # bash build-client-config.sh --outro nome_do_cliente0
  • Instalação e configuração do WordPress

    WordPress é um sistema livre e aberto de gestão de conteúdo para a web, baseado em PHP e banco de dados compatíveis com MySQL. É comumente usado para criação de blogs, lojas virtuais e landing pages. O WordPress é distribuído gratuitamente sob a licença GPL-2.0, contando também com a opção de plugins e temas pagos que podem ser distribuídos sob outras licenças.

    Antes de começar o processo de instalação, é bom verificar os requisitos do WordPress pra determinar em qual versão de qual sistema operacional instalar, já que ele tem requisitos de versão mínima recomendada do interpretador PHP e dos bancos de dados MySQL e MariDB.

    Eu optei pelo CentOS Stream 10, mas as instruções podem se aplicar também a diferentes versões, bem como sistemas da mesma “família”: Fedora, RHEL, Alma Linux e Rocky Linux.

    O WordPress pode ser baixado em: https://br.wordpress.org/download/

    Comece instalando os pacotes necessários – servidor web, PHP e banco de dados:

    # dnf install httpd php php-mysqlnd php-gd mariadb-server

    Habilite e inicie os serviços.

    # systemctl enable --now httpd mariadb php-fpm

    Configure o firewall:

    # firewall-cmd --permanent --add-service=http
    # firewall-cmd --reload

    Você pode testar se o servidor web está ativo e processando PHP criando um arquivo /var/www/html/index.php com o seguinte conteúdo:

    <?php phpinfo() ?>

    Após verificar que está tudo funcionando, hora de configurar o banco de dados. Comece com o comando:

    # mysql_secure_installation

    E siga os prompts com o que for recomendado:

    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
    
    In order to log into MariaDB to secure it, we'll need the current
    password for the root user. If you've just installed MariaDB, and
    haven't set the root password yet, you should just press enter here.
    
    Enter current password for root (enter for none):
    OK, successfully used password, moving on...
    
    Setting the root password or using the unix_socket ensures that nobody
    can log into the MariaDB root user without the proper authorisation.
    
    You already have your root account protected, so you can safely answer 'n'.
    
    Switch to unix_socket authentication [Y/n] n
     ... skipping.
    
    You already have your root account protected, so you can safely answer 'n'.
    
    Change the root password? [Y/n] n
     ... skipping.
    
    By default, a MariaDB installation has an anonymous user, allowing anyone
    to log into MariaDB without having to have a user account created for
    them.  This is intended only for testing, and to make the installation
    go a bit smoother.  You should remove them before moving into a
    production environment.
    
    Remove anonymous users? [Y/n] Y
     ... Success!
    
    Normally, root should only be allowed to connect from 'localhost'.  This
    ensures that someone cannot guess at the root password from the network.
    
    Disallow root login remotely? [Y/n] Y
     ... Success!
    
    By default, MariaDB comes with a database named 'test' that anyone can
    access.  This is also intended only for testing, and should be removed
    before moving into a production environment.
    
    Remove test database and access to it? [Y/n] Y
     - Dropping test database...
     ... Success!
     - Removing privileges on test database...
     ... Success!
    
    Reloading the privilege tables will ensure that all changes made so far
    will take effect immediately.
    
    Reload privilege tables now? [Y/n] Y
     ... Success!
    
    Cleaning up...
    
    All done!  If you've completed all of the above steps, your MariaDB
    installation should now be secure.
    
    Thanks for using MariaDB!

    Depois entre no shell do MariaDB com:

    # mysql

    E crie o banco de dados e usuário que serão usados pelo WordPress e configure as devidas permissões:

    > CREATE DATABASE wordpress_db COLLATE = 'utf8mb4_unicode_ci';
    
    > CREATE USER 'wordpress_user'@'localhost' IDENTIFIED BY 'uma_senha_segura';
    
    > GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress_user'@'localhost';
    
    > FLUSH PRIVILEGES;
    
    > \q

    Com isso pronto, extraia o zip baixado do WordPress na raiz do seu servidor web, /var/www/html, ou em uma subpasta. Então acesse sua página e configure seu WordPress.

    Detalhe adicional: você provavelmente vai se deparar com um “Erro desconhecido” ao tentar adicionar outros temas ou plugins. Isso acontece porque o módulo de segurança SELinux restringe o acesso dos processos do httpd à rede.

    Para permitir o acesso de forma permanente:

    # setsebool -PV httpd_can_network_connect true

    Dicas:

    • Ajuste a permissão do arquivo wp-config.php para 400 e mova-o para fora da raiz do diretório do WordPress. Ex: WordPress está em /var/www/html, mova o arquivo para /var/www. Nenhuma configuração é requerida o WordPress funciona.
    • O WordPress não tem nenhuma proteção contra ataques de força bruta na página wp-admin. Limite o acesso por IP. No meu caso, isso foi configurado no Nginx que atua como proxy reverso, o que vai ser abordado em outro post.