Uso de grupos de seguridad de AD para el control de acceso de Aurora PostgreSQL - Amazon Aurora

Uso de grupos de seguridad de AD para el control de acceso de Aurora PostgreSQL

A partir de las versiones 14.10 y 15.5 de Aurora PostgreSQL, el control de acceso de Aurora PostgreSQL se puede administrar mediante AWS Directory Service para los grupos de seguridad de Microsoft Active Directory (AD). Las versiones anteriores de Aurora PostgreSQL admiten la autenticación basada en Kerberos con AD solo para usuarios individuales. Cada usuario de AD tenía que estar aprovisionado de forma explícita en el clúster de base de datos para poder obtener el acceso.

En lugar de aprovisionar explícitamente a cada usuario de AD en un clúster de base de datos en función de las necesidades empresariales, puede aprovechar los grupos de seguridad de AD, tal como se explica a continuación:

  • Los usuarios de AD son miembros de varios grupos de seguridad de AD en un Active Directory. No los determina el administrador del clúster de base de datos, sino que se basan en los requisitos empresariales y los gestiona un administrador de AD.

  • Los administradores de clústeres de bases de datos crean roles de base de datos en las instancias de base de datos en función de los requisitos empresariales. Estos roles de base de datos pueden tener permisos o privilegios diferentes.

  • Los administradores de clústeres de bases de datos configuran un mapeo entre los grupos de seguridad de AD y los roles de base de datos por clúster de base de datos.

  • Los usuarios de bases de datos pueden acceder a los clústeres de bases de datos con sus credenciales de AD. El acceso se basa en la pertenencia a un grupo de seguridad de AD. Los usuarios de AD obtienen o pierden el acceso automáticamente en función de su pertenencia a grupos de AD.

Requisitos previos

Asegúrese de tener lo siguiente antes de configurar la extensión para los grupos de seguridad de AD:

Configuración de la extensión pg_ad_mapping

Aurora PostgreSQL ahora ofrece una extensión pg_ad_mapping para administrar el mapeo entre los grupos de seguridad de AD y los roles de base de datos en el clúster de Aurora PostgreSQL. Para obtener más información sobre las funciones que proporciona pg_ad_mapping, consulte Uso de las funciones de la extensión pg_ad_mapping.

Para configurar la extensión pg_ad_mapping en el clúster de base de datos de Aurora PostgreSQL, primero debe agregar pg_ad_mapping a las bibliotecas compartidas en el grupo de parámetros del clúster de base de datos personalizado para su clúster de base de datos de Aurora PostgreSQL. Para obtener información acerca de cómo crear un grupo de parámetros del clúster de base de datos personalizado, consulte Grupos de parámetros para Amazon Aurora. A continuación, instale la extensión pg_ad_mapping. Los procedimientos de esta sección le muestran cómo hacerlo. Puede utilizar la AWS Management Console o la AWS CLI.

Debe tener permisos como el rol rds_superuser para realizar todas estas tareas.

En los pasos siguientes se supone que su clúster de base de datos de Aurora PostgreSQL está asociado a un grupo de parámetros de clúster de base de datos personalizado.

Para configurar la extensión pg_ad_mapping
  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon RDS en https://console.aws.amazon.com/rds/.

  2. En el panel de navegación, elija la instancia del escritor del clúster de base de datos de Aurora PostgreSQL.

  3. Abra la pestaña Configuración para su instancia de escritor del clúster de base de datos de Aurora PostgreSQL. Entre los detalles de la instancia, busque el enlace del grupo de parámetros.

  4. Elija el enlace para abrir los parámetros personalizados asociados al clúster de base de datos de Aurora PostgreSQL.

  5. En el campo de búsqueda Parametes (Parámetros), escriba shared_pre para buscar el parámetro shared_preload_libraries.

  6. Seleccione Edit parameters (Editar parámetros) para acceder a los valores de las propiedades.

  7. Añada pg_ad_mapping a la lista en el campo Values (Valores). Utilice una coma para separar los elementos de la lista de valores.

    Imagen del parámetro shared_preload_libaries con pgAudit añadido.
  8. Reinicie la instancia de escritor de su clúster de base de datos de Aurora PostgreSQL para que se aplique el cambio en el parámetro shared_preload_libraries.

  9. Cuando la instancia esté disponible, verifique si se ha inicializado pg_ad_mapping. Use psql para conectarse a la instancia de escritor de su clúster de bases de datos de Aurora PostgreSQL y, a continuación, ejecute el siguiente comando.

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pg_ad_mapping (1 row)
  10. Con pg_ad_mapping inicializado, ahora ya puede crear la extensión. Debe crear la extensión después de inicializar la biblioteca para empezar a utilizar las funciones que proporciona la extensión.

    CREATE EXTENSION pg_ad_mapping;
  11. Cierre la sesión de psql.

    labdb=> \q
Para configurar pg_ad_mapping

Para configurar pg_ad_mapping mediante la AWS CLI, llame a la operación modify-db-parameter-group para agregar este parámetro a su grupo de parámetros personalizado, tal como se muestra en el siguiente procedimiento.

  1. Utilice el siguiente comando AWS CLI para añadir pg_ad_mapping al parámetro shared_preload_libraries.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pg_ad_mapping,ApplyMethod=pending-reboot" \ --region aws-region
  2. Utilice el siguiente comando AWS CLI para reiniciar la instancia de escritura del clúster de base de datos de Aurora PostgreSQL para que se inicialice la biblioteca pg_ad_mapping.

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  3. Cuando la instancia esté disponible, puede verificar si pg_ad_mapping se ha inicializado. Use psql para conectarse a la instancia de escritor de su clúster de bases de datos de Aurora PostgreSQL y, a continuación, ejecute el siguiente comando.

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pg_ad_mapping (1 row)

    Con pg_ad_mapping inicializado, ahora ya puede crear la extensión.

    CREATE EXTENSION pg_ad_mapping;
  4. Cierre la sesión de psql para poder utilizar AWS CLI.

    labdb=> \q

Recuperación del SID del grupo de Active Directory en PowerShell

Se utiliza un identificador de seguridad (SID) para identificar de forma exclusiva una entidad principal de seguridad o un grupo de seguridad. Siempre que se crea un grupo o una cuenta de seguridad en Active Directory, se le asigna un SID. Para obtener el SID del grupo de seguridad de AD desde Active Directory, puede usar el cmdlet Get-ADGroup desde un equipo cliente Windows que esté unido a ese dominio de Active Directory. El parámetro Identity especifica el nombre del grupo de Active Directory para obtener el SID correspondiente.

En el siguiente ejemplo, se devuelve el SID del grupo de AD adgroup1.

C:\Users\Admin> Get-ADGroup -Identity adgroup1 | select SID SID ----------------------------------------------- S-1-5-21-3168537779-1985441202-1799118680-1612

Asignación del rol de base de datos al grupo de seguridad de AD

Debe aprovisionar explícitamente los grupos de seguridad de AD en la base de datos como un rol de base de datos de PostgreSQL. Un usuario de AD que forme parte de al menos un grupo de seguridad de AD aprovisionado tendrá acceso a la base de datos. No debe conceder rds_ad role a un rol de base de datos basado en un grupo de seguridad de AD. La autenticación Kerberos para el grupo de seguridad se activará mediante el sufijo del nombre de dominio, como user1@example.com. Este rol de base de datos no puede usar la autenticación por contraseña o IAM para acceder a la base de datos.

nota

Los usuarios de AD que tengan un rol de base de datos correspondiente en la base de datos y el rol rds_ad concedido no pueden iniciar sesión como parte del grupo de seguridad de AD. Obtendrán acceso a través del rol de base de datos como usuarios individuales.

Por ejemplo, accounts-group es un grupo de seguridad de AD y querría aprovisionar este grupo de seguridad en Aurora PostgreSQL como accounts-role.

Grupo de seguridad de AD Rol de base de datos de PosgreSQL
accounts-group accounts-role

Al asignar el rol de base de datos al grupo de seguridad de AD, debe asegurarse de que el rol de la base de datos tenga el atributo LOGIN establecido y el privilegio CONNECT en la base de datos de inicio de sesión requerida.

postgres => alter role accounts-role login; ALTER ROLE postgres => grant connect on database accounts-db to accounts-role;

El administrador ahora puede proceder a crear la asignación entre el grupo de seguridad de AD y el rol de base de datos de PostgreSQL.

admin=>select pgadmap_set_mapping('accounts-group', 'accounts-role', <SID>, <Weight>);

Para obtener información sobre cómo recuperar el SID del grupo de seguridad de AD, consulte Recuperación del SID del grupo de Active Directory en PowerShell.

Puede haber casos en los que un usuario de AD pertenezca a varios grupos; en ese caso, el usuario de AD heredará los privilegios del rol de la base de datos, que se aprovisionó con una mayor ponderación. Si los dos roles tienen la misma ponderación, el usuario de AD heredará los privilegios del rol de base de datos correspondiente a la asignación que se efectuase más recientemente. La recomendación es especificar ponderaciones que reflejen los permisos y privilegios relativos de los roles de base de datos individuales. Cuanto mayores sean los permisos o privilegios de un rol de base de datos, mayor será la ponderación que se le deberá asociar a la entrada de la asignación. Esto evitará la ambigüedad de que dos asignaciones tengan la misma ponderación.

En la siguiente tabla se muestra un ejemplo de asignación de grupos de seguridad de AD a roles de base de datos de Aurora PostgreSQL.

Grupo de seguridad de AD Rol de base de datos de PosgreSQL Peso
accounts-group accounts-role 7
sales-group sales-role 10
dev-group dev-role 7

En el siguiente ejemplo, user1 heredará los privilegios de sales-role, ya que tiene mayor ponderación, mientras que user2 heredará los privilegios de dev-role, ya que la asignación para este rol se creó después de accounts-role, que comparte la misma ponderación que accounts-role.

Nombre de usuario Pertenencia al grupo de seguridad
user1 accounts-group sales-group
user2 accounts-group dev-group

A continuación se muestran los comandos psql para establecer, enumerar y borrar las asignaciones. En la actualidad, no es posible modificar una única entrada de asignación. Es necesario eliminar la entrada existente y volver a crear la asignación.

admin=>select pgadmap_set_mapping('accounts-group', 'accounts-role', 'S-1-5-67-890', 7); admin=>select pgadmap_set_mapping('sales-group', 'sales-role', 'S-1-2-34-560', 10); admin=>select pgadmap_set_mapping('dev-group', 'dev-role', 'S-1-8-43-612', 7); admin=>select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp -------------+----------------+--------+--------------- S-1-5-67-890 | accounts-role | 7 | accounts-group S-1-2-34-560 | sales-role | 10 | sales-group S-1-8-43-612 | dev-role | 7 | dev-group (3 rows)

Registro/auditoría de la identidad de los usuarios de AD

Utilice el siguiente comando para determinar el rol de base de datos heredado por el usuario actual o de la sesión:

postgres=>select session_user, current_user; session_user | current_user -------------+-------------- dev-role | dev-role (1 row)

Para determinar la identidad de la entidad principal de seguridad de AD, utilice el siguiente comando:

postgres=>select principal from pg_stat_gssapi where pid = pg_backend_pid(); principal ------------------------- user1@example.com (1 row)

Actualmente, la identidad del usuario de AD no está visible en los registros de auditoría. El parámetro log_connections se puede habilitar para registrar el establecimiento de la sesión de base de datos. Consulte log_connections para obtener más información. El resultado de esto incluye la identidad del usuario de AD, como se muestra a continuación. A continuación, el PID del backend asociado a este resultado puede ayudar a atribuir las acciones al usuario real de AD.

pgrole1@postgres:[615]:LOG: connection authorized: user=pgrole1 database=postgres application_name=psql GSS (authenticated=yes, encrypted=yes, principal=Admin@EXAMPLE.COM)

Limitaciones

  • El ID de Microsoft Entra conocido como Azure Active Directory no es compatible.

Uso de las funciones de la extensión pg_ad_mapping

La extensión pg_ad_mapping ofrece compatibilidad con las siguientes funciones:

pgadmap_set_mapping

Esta función establece la asignación entre el grupo de seguridad de AD y el rol de base de datos con una ponderación asociada.

Sintaxis

pgadmap_set_mapping( ad_group, db_role, ad_group_sid, weight)

Argumentos

Parámetro Descripción
ad_group Nombre del grupo de AD. El valor no puede ser una cadena vacía o nula.
db_role El rol de la base de datos que se asignará al grupo de AD especificado. El valor no puede ser una cadena vacía o nula.
ad_group_sid Identificador de seguridad que se utiliza para identificar de forma exclusiva al grupo de AD. El valor comienza por 'S-1-' y no puede ser una cadena vacía o nula. Para obtener más información, consulte Recuperación del SID del grupo de Active Directory en PowerShell.
weight Ponderación asociada al rol de la base de datos. El rol con mayor ponderación tiene prioridad cuando el usuario es miembro de varios grupos. El valor de ponderación predeterminado es 1.

Tipo de retorno

None

Notas de uso

Esta función agrega una nueva asignación del grupo de seguridad de AD al rol de la base de datos. Solo lo puede ejecutar en la instancia de base de datos principal del clúster de base de datos un usuario que tenga el privilegio rds_superuser.

Ejemplos

postgres=> select pgadmap_set_mapping('accounts-group','accounts-role','S-1-2-33-12345-67890-12345-678',10); pgadmap_set_mapping (1 row)

pgadmap_read_mapping

Esta función muestra las asignaciones entre el grupo de seguridad de AD y el rol de base de datos que se establecieron mediante la función pgadmap_set_mapping.

Sintaxis

pgadmap_read_mapping()

Argumentos

None

Tipo de retorno

Parámetro Descripción
ad_group_sid Identificador de seguridad que se utiliza para identificar de forma exclusiva al grupo de AD. El valor comienza por 'S-1-' y no puede ser una cadena vacía o nula. Para obtener más información, consulte Recuperación del SID del grupo de Active Directory en PowerShell.accounts-role@example.com
db_role El rol de la base de datos que se asignará al grupo de AD especificado. El valor no puede ser una cadena vacía o nula.
weight Ponderación asociada al rol de la base de datos. El rol con mayor ponderación tiene prioridad cuando el usuario es miembro de varios grupos. El valor de ponderación predeterminado es 1.
ad_group Nombre del grupo de AD. El valor no puede ser una cadena vacía o nula.

Notas de uso

Llame a esta función para obtener una lista de todas las asignaciones disponibles entre el grupo de seguridad de AD y el rol de base de datos.

Ejemplos

postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp ------------------------------------+---------------+--------+------------------ S-1-2-33-12345-67890-12345-678 | accounts-role | 10 | accounts-group (1 row) (1 row)

pgadmap_reset_mapping

Esta función restablece una o todas las asignaciones que se establecieron mediante la función pgadmap_set_mapping.

Sintaxis

pgadmap_reset_mapping( ad_group_sid, db_role, weight)

Argumentos

Parámetro Descripción
ad_group_sid Identificador de seguridad que se utiliza para identificar de forma exclusiva al grupo de AD.
db_role El rol de la base de datos que se asignará al grupo de AD especificado.
weight Ponderación asociada al rol de la base de datos.

Si no se proporcionan argumentos, se restablecen todas las asignaciones de roles de base de datos de los grupos de AD. Es necesario proporcionar todos los argumentos o ninguno.

Tipo de retorno

None

Notas de uso

Llame a esta función para eliminar la asignación de roles de un grupo de AD específico a la base de datos o para restablecer todas las asignaciones. Esta función solo la puede ejecutar en la instancia de base de datos principal del clúster de base de datos un usuario que tenga el privilegio rds_superuser.

Ejemplos

postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+------------------- S-1-2-33-12345-67890-12345-678 | accounts-role| 10 | accounts-group S-1-2-33-12345-67890-12345-666 | sales-role | 10 | sales-group (2 rows) postgres=> select pgadmap_reset_mapping('S-1-2-33-12345-67890-12345-678', 'accounts-role', 10); pgadmap_reset_mapping (1 row) postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+--------------- S-1-2-33-12345-67890-12345-666 | sales-role | 10 | sales-group (1 row) postgres=> select pgadmap_reset_mapping(); pgadmap_reset_mapping (1 row) postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+-------------- (0 rows)