20.6. Autenticação GSSAPI #

O GSSAPI é um protocolo padrão da indústria para autenticação segura definido no RFC 2743 [135]. O PostgreSQL oferece suporte ao GSSAPI para autenticação, encriptação de comunicações, ou as duas coisas. O GSSAPI fornece login único (single sign-on) [136] para os sistemas onde possui suporte. A própria autenticação é segura. Se for usada a encriptação GSSAPI ou SSL, os dados enviados pela conexão do banco de dados serão encriptados; caso contrário, não serão.

O suporte ao GSSAPI deve ser ativado quando o PostgreSQL é construído; veja Instalação a partir do código-fonte para obter mais informações.

Quando o GSSAPI usa o Kerberos, ele usa o nome principal [137] de serviço padrão (identidade de autenticação) no formato nome_do_serviço/nome_do_hospedeiro​@domínio. O nome principal usado por uma instalação específica não é codificado no servidor PostgreSQL de forma alguma; em vez disso, é especificado no arquivo keytab que o servidor lê para determinar sua identidade. Se estiverem listados vários principais no arquivo keytab, o servidor aceitará qualquer um deles. O nome do domínio (realm) do servidor é o domínio preferencial especificado no(s) arquivo(s) de configuração do Kerberos acessíveis ao servidor.

Ao se conectar, o cliente deve conhecer o nome principal do servidor ao qual pretende se conectar. A parte nome_do_serviço do principal é normalmente postgres, mas pode ser selecionado outro valor através do parâmetro de conexão krbsrvname da libpq. A parte nome_do_hospedeiro é o nome completo do hospedeiro ao qual a libpq deve se conectar. O nome do domínio é o domínio preferencial especificado no(s) arquivo(s) de configuração do Kerberos acessíveis ao cliente.

O cliente também terá um nome principal para sua própria identidade (e deve ter um bilhete válido para este principal). Para usar GSSAPI para autenticação, o principal do cliente deve estar associado a um nome de usuário do banco de dados PostgreSQL. O arquivo de configuração pg_ident.conf pode ser usado para mapear principais para nomes de usuário; por exemplo, pgusername@domínio pode ser mapeado para apenas pgusername. Como alternativa, pode-se usar o principal username@domínio completo como o nome da função de banco de dados (identificador de autorização/role) no PostgreSQL sem nenhum mapeamento.

O PostgreSQL também oferece suporte ao mapeamento de principais de clientes para nomes de usuários apenas removendo o domínio do principal. Este método tem suporte para manter a compatibilidade com versões anteriores, sendo fortemente desencorajado, porque é impossível distinguir diferentes usuários com o mesmo nome de usuário, mas provenientes de domínios diferentes. Para ativar, include_realm deve ser definido como 0. Para instalações simples de domínio único, fazer isto combinado com a configuração do parâmetro krb_realm (que verifica se o domínio do principal corresponde exatamente ao que está no parâmetro krb_realm) ainda é seguro; mas esta é uma abordagem menos capaz em comparação com a especificação de um mapeamento explícito no arquivo pg_ident.conf.

O local do arquivo keytab do servidor é especificado pelo parâmetro de configuração krb_server_keyfile. Por motivos de segurança, é recomendável usar um arquivo keytab em separado, apenas para o servidor PostgreSQL, em vez de permitir que o servidor leia o arquivo keytab do sistema. Certifique-se de que o arquivo keytab do servidor seja legível (e de preferência apenas legível, sem escrita) pela conta do servidor PostgreSQL. (Veja também A conta de usuário do PostgreSQL.)

O arquivo keytab é gerado usando o software Kerberos; veja a documentação do Kerberos para obter detalhes. O exemplo a seguir mostra como fazer isto usando a ferramenta kadmin da implementações do MIT Kerberos:

kadmin% addprinc -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org

As seguintes opções de autenticação têm suporte pelo método de autenticação GSSAPI:

include_realm

Se definido como 0, o nome do domínio do principal do usuário autenticado é removido antes de ser passado pelo mapeamento de nome de usuário (veja Mapas de nome de usuário). Isto é desencorajado, estando disponível principalmente para manter a compatibilidade com as versões anteriores, porque não é seguro em ambientes multi-domínio, a menos que também seja usado krb_realm. Recomenda-se deixar include_realm definido com o valor padrão (1), e fornecer um mapeamento explícito no arquivo pg_ident.conf para converter nomes de principais em nomes de usuário do PostgreSQL.

map

Permite o mapeamento dos principais dos clientes para nomes de usuário do banco de dados. Veja Mapas de nome de usuário para obter detalhes. Para os principais de GSSAPI/Kerberos, tal como username@EXAMPLE.COM (ou, menos comumente, username/hostbased@EXAMPLE.COM), o nome de usuário usado para mapeamento é username@EXAMPLE.COM (ou username/hostbased@EXAMPLE.COM, respectivamente), a menos que include_realm tenha sido definido como 0, caso em que username (ou username/hostbased) é o que é visto como o nome de usuário do sistema durante o mapeamento.

krb_realm

Define o domínio para corresponder aos nomes principais do usuário. Se este parâmetro estiver definido, apenas os usuários desse domínio serão aceitos. Se não estiver definido, os usuários de qualquer domínio podem se conectar, sujeito a qualquer mapeamento de nome de usuário realizado.

Além dessas configurações, que podem ser diferentes para diferentes entradas no arquivo pg_hba.conf, existe o parâmetro de configuração para todo o servidor krb_caseins_users. Se estiver definido como verdade, os principais dos clientes serão correspondidos às entradas do mapa do usuário sem distinção entre letras maiúsculas e minúsculas. A opção krb_realm, se definida, também será correspondida sem distinção entre letras maiúsculas e minúsculas.



[135] RFC 2743: O Generic Security Service Application Program Interface (GSS-API), versão 2, conforme definido no RFC-2078, fornece serviços de segurança para quem chama de uma maneira genérica, compatível com uma variedade de mecanismos e tecnologias subjacentes e, portanto, permitindo portabilidade de aplicações para diferentes ambientes. (N. T.)

[136] Single sign-on (SSO): é um esquema de autenticação que permite ao usuário fazer login com um único ID em qualquer um dos vários sistemas de software relacionados, porém independentes. Wikipedia – Single sign-on (N. T.)

[137] principal: a cadeia de caracteres que dá o nome de uma entidade específica, à qual pode ser atribuído um conjunto de credenciais. How Kerberos Works – Definitions (N. T.)