20.11. Autenticação RADIUS #

Este método de autenticação opera de forma semelhante ao método password, exceto por usar o RADIUS (Remote Authentication Dial-In User Service) como método de verificação da senha. O RADIUS é usado apenas para validar os pares nome de usuário/senha. Portanto, o usuário já deverá existir no banco de dados antes que o RADIUS possa ser usado para autenticação.

Ao usar a autenticação pelo RADIUS, é enviada uma mensagem de solicitação de acesso ao servidor RADIUS configurado. Esta solicitação é do tipo autenticar apenas (Authenticate Only), incluindo parâmetros para nome de usuário, senha (encriptada), e o identificador NAS (NAS Identifier). A solicitação é encriptada usando uma palavra-passe compartilhada com o servidor. O servidor RADIUS responde a esta solicitação com acesso aceito (Access Accept), ou acesso rejeitado (Access Reject). Não há suporte para contas RADIUS.

Podem ser especificados diversos servidores RADIUS e, neste caso, estes serão tentados sequencialmente. Se for recebida uma resposta negativa de um servidor, a autenticação irá falhar. Se não for recebida nenhuma resposta, será tentado o próximo servidor da lista. Para especificar vários servidores, os nomes dos servidores devem ser separados por vírgulas, e a lista colocada entre aspas. Se forem especificados vários servidores, as outras opções do RADIUS também poderão ser fornecidas como listas separadas por vírgulas, para fornecer valores individuais para cada servidor. Elas também podem ser especificadas como um único valor; neste caso, este valor será aplicado a todos os servidores.

As seguintes opções de configuração têm suporte no RADIUS:

radiusservers

Os nomes DNS ou endereços IP dos servidores RADIUS aos quais se conectar. Este parâmetro é requerido.

radiussecrets

As palavras-passe compartilhadas usadas ao se comunicar com segurança com os servidores RADIUS. Devem ter o mesmo valor nos servidores PostgreSQL e RADIUS. Recomenda-se que seja uma cadeia de caracteres com pelo menos 16 caracteres. Este parâmetro é requerido.

Nota

O vetor de encriptação usado só será criptograficamente forte se o PostgreSQL foi construído com suporte para OpenSSL. Nos outros casos, a transmissão para o servidor RADIUS deve ser considerada apenas ofuscada, não segura, e medidas externas de segurança devem ser aplicadas, se necessário.

radiusports

Os números de porta para se conectar aos servidores RADIUS. Se não for especificada nenhuma porta, será usada a porta padrão do RADIUS (1812).

radiusidentifiers

As cadeias de caracteres a serem usadas como Identificador NAS nas solicitações do RADIUS. Este parâmetro pode ser usado, por exemplo, para identificar a qual agrupamento de bancos de dados (instância) o usuário está tentando se conectar, o que pode ser útil para correspondência de política no servidor RADIUS. Se não for especificado nenhum identificador, será usado o valor padrão postgresql.

Se for necessário ter uma vírgula ou espaço em branco em um valor de parâmetro do RADIUS, isto pode ser feito colocando aspas em torno do valor, mas é entediante, porque agora são necessárias duas camadas de aspas. Um exemplo de colocação de espaço em branco em uma cadeia de caracteres de palavra-passe do RADIUS é:

host ... radius radiusservers="server1,server2" \
                radiussecrets="""secret one"",""secret two"""

Exemplo 20.3. Exemplo do tradutor

Autenticação RADIUS

Neste exemplo é instalado o freeRADIUS na mesma máquina do servidor PostgreSQL sob o sistema operacional Debian 12.

Instalação do freeRADIUS:

$ sudo apt-get install freeradius freeradius-utils

Adição do cliente POSTGRESQL ao servidor freeRADIUS:

$ sudo nano /etc/freeradius/3.0/clients.conf
client POSTGRESQL {
        ipaddr = 192.168.0.0/16
        secret = palavrapasse
}

Adição do usuário raduser ao servidor freeRADIUS:

$ sudo nano /etc/freeradius/3.0/users
raduser Cleartext-Password := "raduserpwd"

Testar o acesso ao usuário raduser no servidor RADIUS:

$ sudo systemctl restart freeradius
$ radtest raduser raduserpwd 192.168.3.5 1812 palavrapasse
Sent Access-Request Id 163 from 0.0.0.0:51678 ↵
                           to 192.168.3.5:1812 ↵
                           length 77
    User-Name = "raduser"
    User-Password = "raduserpwd"
    NAS-IP-Address = 127.0.1.1
    NAS-Port = 1812
    Message-Authenticator = 0x00
    Cleartext-Password = "raduserpwd"
Received Access-Accept Id 163 from 192.168.3.5:1812 ↵
                              to 192.168.3.5:51678 ↵
                              length 20

Adição da entrada para o usuário raduser no arquivo pg_hba.conf:

$ sudo nano /etc/postgresql/18/main/pg_hba.conf
# TYPE  DATABASE  USER     ADDRESS         METHOD
host    raduser   raduser  192.168.0.0/16  radius \
                                           radiusservers=192.168.3.5 \
                                           radiussecrets=palavrapasse

Adição do usuário raduser no servidor PostgreSQL:

$ sudo su - postgres
$ psql
psql (18.4 (Debian 18.4-1.pgdg12+1))
Digite "help" para obter ajuda.

postgres=# CREATE USER raduser;
CREATE ROLE
postgres=# CREATE DATABASE raduser WITH OWNER raduser;
CREATE DATABASE
postgres=# exit
$ systemctl restart postgresql

Acesso ao servidor PostgreSQL pelo psql com o usuário raduser:

$ psql -h 192.168.3.5 -U raduser
Senha para o usuário raduser:
psql (18.4 (Debian 18.4-1.pgdg12+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, ↵
                compression: desativado, ALPN: postgresql)
Digite "help" para obter ajuda.

raduser=>

A senha do usuario fica armazenada no servidor freeRADIUS, e não no PostgreSQL, que tem apenas a palavra-passe para acessar o servidor freeRADIUS.