Autenticação GSSAPI/SSPI (gssauth)
Usando os serviços do Windows Active Directory para autenticar usuários em um banco de dados Firebird.
O Firebird já suportava autenticação confiável do Windows no Windows. Essa capacidade foi implementada no plugin Win_SSPI para cliente e servidor. Ele usa a API SSPI do Windows e o provedor de segurança NTLM e funciona apenas no Windows.
O Windows Active Directory é amplamente suportado por sistemas Linux modernos, portanto seus serviços também podem autenticar usuários no Linux.
O Firebird implementa esse suporte no plugin de segurança gssauth. Como o nome sugere, ele usa a API GSS para se comunicar com o Active Directory. Ele está disponível tanto no Windows quanto no Linux, para o cliente Firebird e para o servidor Firebird. Na maioria dos casos, ele pode substituir o Win_SSPI, mas isso não é obrigatório — ambos os plugins podem ser executados no mesmo servidor Firebird.
Instalação
É necessária alguma preparação para usar o Active Directory. Um host Windows que executa o servidor Firebird deve ser membro de um domínio Windows. Um host Linux que executa o servidor Firebird deve estar associado ao Active Directory. É necessária uma conta de usuário de domínio para executar o serviço Firebird no Windows. Service Principal Names (SPNs) devem ser atribuídos a essa conta de domínio para que um cliente Firebird possa autenticar o servidor Firebird via Active Directory. Abaixo está um breve guia para preparar servidores Windows e Linux do lado do Firebird.
Servidor Firebird em host Windows
-
Crie uma conta de domínio para executar o serviço Firebird. Defina estas propriedades:
- O usuário não pode alterar a senha
- A senha nunca expira
-
Instale o Firebird e execute-o sob essa conta de domínio. Use
instsvccom-login, ou altere a propriedade “Log on as” de um serviço já instalado. -
Adicione dois Service Principal Names para essa conta. O nome do serviço é
FirebirdSQL. Um SPN deve usar o nome curto do host; o outro deve usar o FQDN. Se o serviço Firebird foi criado cominstsvc, ele também registra esses dois SPNs. Caso contrário, use o utilitáriosetspndo Windows:
setspn -U -S FirebirdSQL/hostname account
setspn -U -S FirebirdSQL/hostname.domain account
Por exemplo, se o domínio é example.com, o host é winfb e a conta é fbsvc:
setspn -U -S FirebirdSQL/winfb fbsvc
setspn -U -S FirebirdSQL/winfb.example.com fbsvc
- Adicione
gssauthaofirebird.conf(AuthServer):
AuthServer = Srp256, gssauth
-
Defina (ou verifique) as permissões do sistema de arquivos para a conta de domínio:
- Acesso de leitura:
firebird.confe outros arquivos.conf - Acesso total: pastas com bancos de dados;
security5.fdb;firebird.loge outros arquivos.log
- Acesso de leitura:
-
Adicione uma regra de firewall para o Firebird.
Servidor Firebird em host Linux
-
Crie uma conta de domínio em um host Windows. Defina estas propriedades:
- O usuário não pode alterar a senha
- A senha nunca expira
-
Adicione dois Service Principal Names para essa conta. O nome do serviço é
FirebirdSQL. Um SPN deve usar o nome curto do host; o outro deve usar o FQDN. Use o utilitáriosetspndo Windows:
setspn -U -S FirebirdSQL/hostname account
setspn -U -S FirebirdSQL/hostname.domain account
Por exemplo, se o domínio é example.com, o host é linuxfb e a conta é fbsvc:
setspn -U -S FirebirdSQL/linuxfb fbsvc
setspn -U -S FirebirdSQL/linuxfb.example.com fbsvc
- Crie um arquivo de tabela de chaves Kerberos para o servidor Linux com o utilitário
ktpassdo Windows:
ktpass
/out firebird.keytab
/princ FirebirdSQL/[email protected]
/mapuser [email protected]
/pass <password of fbsvc account>
-setpass
/ptype KRB5_NT_PRINCIPAL
/crypto all
Notas:
- O argumento
/princdiferencia maiúsculas de minúsculas; ele deve corresponder ao que o host Linux que executará o Firebird enxerga. -setpassé usado para que a senha da conta não seja alterada./cryptopode ser alterado para evitar algoritmos de criptografia legados.- Documentação completa do
ktpass: Microsoft ktpass.
-
Certifique-se de que
libgssapi_krb5.soesteja instalado. -
Instale o Firebird.
-
Pare o serviço Firebird.
-
Adicione
gssauthaofirebird.conf(AuthServer):
AuthServer = Srp256, gssauth
-
Copie
firebird.keytabdo host Windows para/opt/firebird(ou a pasta onde ofirebird.conffica na sua distribuição). Defina o proprietário comofirebird:firebirde as permissões de modo que apenas o usuário e o grupo possam lê-lo. -
Inicie o serviço Firebird.
Nota: use a variável de ambiente KRB5_TRACE para definir um nome de arquivo de rastreamento Kerberos para solução de problemas.
Uso
No Windows, o plugin gssauth é incorporado ao fbclient.dll, portanto nenhuma implantação especial do cliente é necessária. No Linux, gssauth é um módulo separado libgssauth.so e deve ser implantado junto com os outros binários quando necessário.
O servidor Firebird deve incluir gssauth na lista de plugins AuthServer. O cliente Firebird inclui gssauth em AuthClient por padrão.
Ferramentas do Firebird como isql, gbak e outras agora suportam a opção de linha de comando -trusted no Linux, como já fazem no Windows há muito tempo.
Crie um mapeamento no banco de dados de usuários ou no banco de dados de segurança para mapear usuários de domínio para usuários Firebird. Nota: gssauth reporta apenas nomes completos de usuários e grupos (incluindo o prefixo do domínio), enquanto Win_SSPI reporta duas formas para cada grupo (com e sem domínio) — leve isso em conta ao criar mapeamentos. Além disso, no Linux, os nomes de usuários/grupos de domínio podem aparecer em uma forma ligeiramente diferente da do Active Directory (minúsculas, sem prefixo de domínio e assim por diante). Verifique a representação exata com comandos Linux como id e groups.
Exemplos de mapeamento
Mapear todos os usuários como estão:
CREATE GLOBAL MAPPING GSS_USERS
USING PLUGIN GSSAUTH
FROM ANY USER
TO USER;
Mapear administradores de domínio como RDB$ADMIN em um servidor Linux:
CREATE GLOBAL MAPPING GSS_ADMINS
USING PLUGIN GSSAUTH
FROM GROUP 'domain admins'
TO ROLE RDB$ADMIN;
Mapear administradores de domínio como RDB$ADMIN em um servidor Windows:
CREATE GLOBAL MAPPING GSS_ADMINS
USING PLUGIN GSSAUTH
FROM GROUP 'EXAMPLE\Domain Admins'
TO ROLE RDB$ADMIN;