Integrar o suporte a grupos do Active Directory com o AlloyDB Omni

Selecione uma versão da documentação:

Nesta página, descrevemos como configurar e gerenciar a autenticação e a autorização baseadas em grupos do Active Directory no AlloyDB Omni. O suporte baseado em grupos do Active Directory automatiza o gerenciamento de associações de papéis do PostgreSQL com base nas associações ao grupo de um usuário no Active Directory, o que simplifica o gerenciamento de usuários e garante que as permissões estejam sincronizadas.

Para mais informações, consulte Visão geral do Active Directory.

Fluxo de trabalho de integração do Active Directory

A integração do Active Directory é implementada usando uma extensão do PostgreSQL (google_pg_auth), conforme mostrado no seguinte fluxo de trabalho:

  1. Login do usuário: um usuário se autentica no AlloyDB Omni usando as respectivas credenciais padrão do Active Directory com o GSSAPI.
  2. Criação automática de papéis: se um papel correspondente do PostgreSQL para o usuário não existir, o sistema vai criar um automaticamente. Por exemplo, CREATE ROLE "user@REALM" WITH LOGIN;.
  3. Verificação de grupo do LDAP: o sistema se conecta com segurança ao Active Directory usando o LDAP para recuperar as associações ao grupo atuais do usuário.
  4. Sincronização de associação: o sistema compara os grupos do Active Directory do usuário com os mapeamentos configurados.
    • Se o usuário estiver em um grupo mapeado do Active Directory, mas não no grupo correspondente do PostgreSQL, ele vai receber a associação.
    • Se o usuário não estiver em um grupo mapeado do Active Directory, mas estiver no grupo correspondente do PostgreSQL, a associação dele será revogada.
  5. Login concluído: a conexão do usuário é finalizada, e ele faz login no banco de dados. As permissões do usuário são determinadas pelos papéis do PostgreSQL aos quais ele pertence, que estão sincronizados com o status do grupo do Active Directory.

Essa sincronização acontece automaticamente a cada login do usuário, o que garante que os direitos de acesso do PostgreSQL reflitam o estado atual do Active Directory.

Antes de começar

Antes de integrar o suporte a grupos do Active Directory com o AlloyDB Omni, verifique se você atende aos requisitos a seguir.

  • Autenticação GSSAPI: a autenticação baseada em GSSAPI precisa ser configurada e estar funcionando na sua instância do AlloyDB Omni. Para mais informações, consulte Integrar o Active Directory ao AlloyDB Omni.
  • Papéis de grupo do PostgreSQL: é necessário criar manualmente os papéis de grupo do PostgreSQL que você quer mapear para grupos do Active Directory, conforme mostrado no seguinte exemplo:

    CREATE ROLE 'postgres_developers';
    CREATE ROLE 'postgres_read_only';
    
  • Permissões: você precisa atribuir manualmente as permissões do banco de dados, por exemplo, SELECT e INSERT, a esses papéis de grupo do PostgreSQL. A integração gerencia apenas a participação, mas não os privilégios dos próprios grupos, conforme mostrado no seguinte exemplo:

    GRANT SELECT ON ALL TABLES IN SCHEMA sales TO postgres_read_only;
    GRANT USAGE ON SCHEMA finance TO postgres_developers;
    GRANT USAGE ON SCHEMA sales TO postgres_read_only;
    GRANT SELECT, INSERT ON finance.transactions TO postgres_developers;
    

Configurar o suporte a grupos do Active Directory

Para configurar o suporte a grupos do Active Directory no AlloyDB Omni, você ativa a extensão google_pg_auth, fornece os detalhes do Active Directory no arquivo postgresql.conf e processa as credenciais com segurança.

  1. Informe a senha do LDAP.

    Você precisa informar a senha da conta de serviço ldap_bind_dn ao contêiner do AlloyDB Omni usando a variável de ambiente AD_LDAP_PASSWORD, conforme mostrado no seguinte exemplo:

    docker run -d --name CONTAINER_NAME \
              -e POSTGRES_PASSWORD=NEW_PASSWORD \
              -e AD_LDAP_PASSWORD=AD_LDAP_PASSWORD \
              -vDATA_DIR:/var/lib/postgresql/data \
              -p HOST_PORT:5432 \
              --restart=always \
              google/alloydbomni:IMAGE_TAG
    
  2. Ative a extensão google_pg_auth.

    1. No arquivo postgresql.conf, adicione ou modifique os seguintes parâmetros para ativar a extensão e configurar a conexão LDAP. O arquivo postgresql.conf está localizado no diretório de dados que você montou ao iniciar a imagem do AlloyDB Omni.

      # ---------------------------------------------------------------------------
      # ALLOYDB ACTIVE DIRECTORY INTEGRATION SETTINGS
      # ---------------------------------------------------------------------------
      
      google_pg_auth.enable_auth = on
      google_pg_auth.ldap_uri = "AD_LDAP_SERVER_HOST"
      google_pg_auth.ldap_base_dn = AD_LDAP_BASE_DN
      google_pg_auth.ldap_bind_dn = AD_LDAP_BIND_DN
      google_pg_auth.auth_cache_ttl_sec = 3600
      

      Faça as seguintes substituições:

      • AD_LDAP_SERVER_HOST: o URI do seu servidor LDAP do Active Directory, por exemplo, ldap://ad-controller.example.com.
      • AD_LDAP_BASE_DN: o Nome distinto (DN) de base para realizar pesquisas LDAP, por exemplo, DC=example,DC=com.
      • AD_LDAP_BIND_DN: o Nome distinto (DN) da conta de usuário do Active Directory que o AlloyDB Omni usa para se conectar e realizar pesquisas LDAP. Por exemplo, setupadmin@ad-example.com.
      • auth_cache_ttl_sec é o tempo decorrido até que os dados sejam armazenados em cache pelo AlloyDB Omni por usuário antes que o AlloyDB Omni tente entrar em contato com o servidor LDAP novamente. O valor de auth_cache_ttl_sec pode variar de um mínimo de 60 segundos a um máximo de 86.400 segundos (24 horas).
    2. Adicione google_pg_auth ao parâmetro shared_preload_libraries em postgresql.conf.

    3. Adicione a seguinte linha ao arquivo postgresql.conf:

      shared_preload_libraries='google_pg_auth,google_columnar_engine,google_job_scheduler,google_storage'
      
    4. Reinicie o banco de dados.

      docker restart CONTAINER_NAME
      
  3. Configure o certificado LDAPS.

    Para garantir uma conexão segura com seu servidor do Active Directory via LDAPS, você precisa de um certificado de CA.

    Coloque o arquivo de certificado LDAPS no seguinte local predefinido na imagem do AlloyDB Omni: /etc/ldap/ldap.crt.

Gerenciar mapeamentos de grupo

É possível criar e gerenciar mapeamentos entre grupos do Active Directory e papéis do PostgreSQL usando funções SQL.

Fazer login no cluster e carregar a extensão

docker exec -it CONTAINER_NAME psql -h localhost -U postgres
postgres=# CREATE EXTENSION google_pg_auth;
CREATE EXTENSION

Criar um mapeamento de grupo

Para mapear um grupo do Active Directory para um papel de grupo do PostgreSQL que você já criou, use a função map_ad_group():

SELECT google_pg_auth.map_ad_group(ad_group_name TEXT, ad_group_sid TEXT, pg_role_name TEXT);

Por exemplo, para mapear o grupo ad-developers do Active Directory para o papel pg-developers do PostgreSQL, use o seguinte comando:

SELECT google_pg_auth.map_ad_group('ad-developers', 'S-1-5-21-.....', 'postgres_read_only');

Para recuperar o SID de um grupo específico no Active Directory, use o seguinte comando no servidor do Active Directory:

C:\Users\Admin> Get-ADGroup -Identity ad-developers | select SID

             SID
-----------------------------------------------
S-1-5-21-3168537779-1985441202-1799118680-1612

Remover um mapeamento de grupo

Para remover um mapeamento, use a função unmap_ad_group(). Essa função interrompe a sincronização do grupo, mas não vai remover os usuários do grupo do PostgreSQL se eles já forem membros.

SELECT google_pg_auth.unmap_ad_group(ad_group_sid TEXT, pg_role_name TEXT);

Confira o seguinte exemplo:

SELECT google_pg_auth.unmap_ad_group('quinn@google.com', 'postgres_read_only');

Conectar-se ao banco de dados do AlloyDB Omni

Faça login no banco de dados do AlloyDB Omni usando o usuário do Active Directory. É necessário ativar o kinit no cliente no qual você está se conectando.

No exemplo a seguir, o pod postgres-client tem o kinit e o psql instalados e está configurado para se conectar ao cluster do AlloyDB Omni usando o cliente psql.

root@postgres-client:/# kinit AD_USER_NAME
Password for user1REALM:

root@postgres-client:/# psql -h ALLOYDB_SERVER_HOST_NAME -U AD_USER_NAME@REALM -d postgres
psql (16.6 (Ubuntu 16.6-0ubuntu0.24.04.1), server 16.3)
GSSAPI-encrypted connection
Type "help" for help.

user1=#

Seu acesso ao banco de dados do AlloyDB Omni é determinado automaticamente com base no seguinte:

  • Sua associação atual a grupos do Active Directory.
  • Os mapeamentos definidos pelo administrador entre esses grupos do Active Directory e os papéis do PostgreSQL.
  • As permissões concedidas pelo administrador a esses papéis do PostgreSQL.

Se esta for a primeira vez que você se conecta, sua função do usuário do PostgreSQL (your_ad_user@YOURDOMAIN.COM) será criada automaticamente.

Sempre que você faz login, o sistema verifica suas associações atuais a grupos do Active Directory e atualiza as associações a papéis correspondentes do PostgreSQL para correspondência. Não é necessário fazer nada para que essa sincronização aconteça.

Exemplo de conexão de banco de dados

Por exemplo, suponha que um usuário Quinn faça parte de um grupo do Active Directory chamado ad_developers. O administrador mapeou ad_developers para um papel do Postgres chamado pg_read_only. Esse papel tem acesso de leitura a uma tabela chamada sales. Quando o usuário faz login, ele pode acessar a tabela.

root@postgres-client:/# kinit quinn@REALM
Password for quinn@YOUR.REALM:

root@postgres-client:/# psql -h ALLOYDB_SERVER_HOST_NAME -U quinn@REALM -d postgres
psql (16.6 (Ubuntu 16.6-0ubuntu0.24.04.1), server 16.3)
GSSAPI-encrypted connection
Type "help" for help.

postgres=# select * from sales;
// Query will be run successfully

No exemplo a seguir, Quinn é removido do grupo ad_developers no Active Directory:

root@postgres-client:/# kinit quinn@REALM
Password for quinn@YOUR.REALM:

root@postgres-client:/# psql -h ALLOYDB_SERVER_HOST_NAME -U quinn@REALM -d postgres
psql (16.6 (Ubuntu 16.6-0ubuntu0.24.04.1), server 16.3)
GSSAPI-encrypted connection
Type "help" for help.

postgres=# select * from sales;
// Query will fail

Limitações

  • Gerenciamento manual de grupos e permissões: esse recurso automatiza apenas a associação de usuários a grupos do PostgreSQL. A criação desses grupos e a concessão das permissões continuam sendo uma tarefa administrativa manual.
  • Latência de sincronização: a associação só é sincronizada quando um usuário faz login. As alterações feitas na associação de um usuário a um grupo no Active Directory só serão refletidas no AlloyDB Omni na próxima sessão de login do usuário.
  • Desempenho: a pesquisa LDAP adiciona uma pequena quantidade de latência ao processo inicial de login do usuário. O armazenamento em cache ajuda a reduzir essa latência para logins subsequentes dentro do período de time to live (TTL) configurado (auth_cache_ttl_sec).
  • Tratamento de erros: se o servidor LDAP estiver inacessível ou se outros erros ocorrerem durante o processo de sincronização, o AlloyDB Omni vai registrar o erro. No entanto, o login do usuário ainda vai funcionar porque a autenticação GSSAPI foi bem-sucedida. Apenas a sincronização da associação ao grupo dessa sessão vai falhar.

A seguir