Tag: server

  • Instalação e configuração de servidor Nextcloud

    Nextcloud é uma solução de armazenamento de arquivos acessível via web, como Google Drive, que conta também com aplicativos de calendário, contatos, conversas e chamadas de vídeo, cliente de e-mail e suporte a compartilhamento de arquivos. Também tem suporte a integração de suíte office, através do ONLYOFFICE ou Nextcloud Office (baseado no LibreOffice).

    Além disso, Nextcloud trás também o conceito de federação: instâncias distintas do Nextcloud podem se comunicar se assim os administradores quiserem, permitindo uma rede descentralizada de servidores, onde um usuário de uma instância pode se comunicar e compartilhar arquivos com um usuário de outra.

    É software livre e aberto, licenciado sob a AGPLv3, e conta também com planos empresariais.

    No momento os sistemas recomendados para o Nextcloud são Ubuntu 24.04 e RHEL 9, mas tem suporte também a outros como OpenSUSE, Debian e Alpine. Aqui vamos usar o Ubuntu 24.04.

    O Nextcloud precisa de: um servidor web, um banco de dados e PHP. Eu segui a instalação com Apache pro servidor web e PostgreSQL pro banco de dados.

    Outras alternativas suportadas são Nginx para o servidor web e MySQL e MariaDB para o banco de dados.

    Instalação e configuração do Apache com PHP:

    # apt install apache2 php

    Caso tenha habilitado o firewall (Ubuntu traz o UFW desabilitado por padrão), permita o acesso por http:

    # ufw allow http

    Visite o seu servidor web via http e verifique que o Apache funciona. Coloque um arquivo como index.php na pasta do servidor web /var/www/html com o conteúdo

    <?php phpinfo() ?>

    e visite sua página no local /index.php para verificar que o Apache está processando PHP.

    Instalando e configurando o banco de dados:

    # apt install postgresql
    # sudo -u postgres psql

    Isso vai te levar à linha de comando do PostgreSQL, onde você pode criar o usuário e o banco de dados a ser usado no Nextcloud:

    > CREATE USER nextcloud_operator WITH PASSWORD 'senhaNoPost-it';
    > CREATE DATABASE nextcloud_db WITH OWNER nextcloud_operator TEMPLATE template0 ENCODING 'UTF8';
    > \q

    Baixe o arquivo do servidor em https://nextcloud.com/install/

    Instale o utilitário unzip com

    # apt install unzip

    Extraia o arquivo .zip na pasta /var/www. Você vai ver uma pasta nextcloud. Mude o proprietário dela e dos arquivos e subpastas para o usuário www-data, que executa o Apache:

    # chown -hR www-data:www-data /var/www/nextcloud

    Edite o arquivo de configuração do Apache,
    /etc/apache2/sites-enabled/000-default.conf
    para alterar/adicionar as seguintes configurações:

    	DocumentRoot /var/www/nextcloud
    
    	<Directory /var/www/nextcloud/>
    	Require all granted
    	AllowOverride All
    	Options Indexes FollowSymLinks MultiViews
    		<IfModule mod_dav.c>
    			Dav off
    		</IfModule>
    	</Directory>

    Instale outros módulos PHP necessário para o Nextcloud:

    # apt install php-curl php-xml php-gd php-mbstring php-zip php-pgsql 

    Reinicie seu servidor web

    # systemctl restart apache2.service

    e dê sequência à instalação pela página web. O básico já está funcionando.

    Agora existem alguns ajustes que podem ser feitos e você pode vê-los na seção de Configurações de administração > Visão geral

    Um dos principais é o limite de memória usada na execução de scripts PHP. O recomendado é pelo menos 512mb mas a configuração padrão usa 128mb.

    Outro é o limite do buffer do módulo OPcache, para o qual é sugerido um valor acima de 8mb.

    Ajuste os seguintes valores no arquivo
    /etc/php/8.3/apache2/php.ini

    memory_limit = 512M
    opcache.interned_strings_buffer=32

    E no arquivo /etc/php/8.3/cli/php.ini

    opcache.interned_strings_buffer=32

    e reinicie o Apache.

    Algumas mensagens de erro vão sugerir que você execute um script occ com algum argumento. Você pode fazer isso com

    # sudo -u www-data php /var/www/nextcloud/occ argumento_sugerido

    Sugestão de configuração adicional: os arquivos de usuários ficam na pasta /var/www/nextcloud/data, dentro da pasta raiz do Nextcloud. No caso de um bug num dos scripts PHP ou no servidor web, arquivos privados poderiam ser expostos. Então você pode querer configurar a pasta data em outro local, fora da raiz /var/www do servidor web, como por exemplo /var/nextcloud_data.

    Essas e outras questões menos críticas de configuração são abordadas também na documentação oficial do Nextcloud.

    O acesso via HTTPS será feito utilizando o servidor web Nginx atuando como proxy reverso, abordado em outra postagem.

  • 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