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
.
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
nome_do_serviço/nome_do_hospedeiro@domíniokeytab, 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.orgkadmin%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_realmDefine 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.)