Aurora PostgreSQL 액세스 제어를 위한 AD 보안 그룹 사용 - Amazon Aurora

Aurora PostgreSQL 액세스 제어를 위한 AD 보안 그룹 사용

Aurora PostgreSQL 14.10 및 15.5 버전부터 Microsoft Active Directory(AD) 보안 그룹용 AWS Directory Service를 사용하여 Aurora PostgreSQL 액세스 제어를 관리할 수 있습니다. 이전 버전의 Aurora PostgreSQL은 개별 사용자에 대해서만 AD를 통한 Kerberos 기반 인증을 지원합니다. 액세스 권한을 얻으려면 각 AD 사용자를 DB 클러스터에 명시적으로 프로비저닝해야 했습니다.

비즈니스 요구 사항에 따라 각 AD 사용자를 DB 클러스터에 명시적으로 프로비저닝하는 대신, 아래 설명과 같이 AD 보안 그룹을 활용할 수 있습니다.

  • AD 사용자는 Active Directory에 있는 다양한 AD 보안 그룹의 구성원입니다. 이는 DB 클러스터 관리자가 지시하는 것이 아니라 비즈니스 요구 사항을 기반으로 하며, AD 관리자가 처리합니다.

  • DB 클러스터 관리자는 비즈니스 요구 사항에 따라 DB 인스턴스에 DB 역할을 생성합니다. 이러한 DB 역할은 서로 권한이 다를 수 있습니다.

  • DB 클러스터 관리자는 DB 클러스터별로 AD 보안 그룹에서 DB 역할로의 매핑을 구성합니다.

  • DB 사용자는 AD 보안 인증 정보를 사용하여 DB 클러스터에 액세스할 수 있습니다. 액세스는 AD 보안 그룹 구성원 자격을 기반으로 합니다. AD 사용자는 AD 그룹 구성원 자격에 따라 자동으로 액세스 권한을 얻거나 잃습니다.

필수 조건

AD 보안 그룹의 확장을 설정하기 전에 다음 사항이 준비되었는지 확인하세요.

pg_ad_mapping 확장 설정

Aurora PostgreSQL은 이제 Aurora PostgreSQL 클러스터에서 AD 보안 그룹과 DB 역할 간의 매핑을 관리할 수 있는 pg_ad_mapping 확장을 제공합니다. pg_ad_mapping에서 제공하는 함수에 대한 자세한 내용은 pg_ad_mapping 확장의 함수 사용 섹션을 참조하세요.

Aurora PostgreSQL DB 클러스터에 pg_ad_mapping 확장을 설정하려면 먼저 Aurora PostgreSQL DB 클러스터용 사용자 지정 DB 클러스터 파라미터 그룹의 공유 라이브러리에 pg_ad_mapping을 추가해야 합니다. 사용자 지정 DB 클러스터 파라미터 그룹 생성에 대한 자세한 내용은 파라미터 그룹 작업 섹션을 참조하세요. 다음으로 pg_ad_mapping 확장을 설치합니다. 이 섹션에 절차가 설명되어 있습니다. AWS Management Console 또는 AWS CLI를 사용할 수 있습니다.

이 모든 작업을 수행하려면 rds_superuser 역할의 권한이 있어야 합니다.

다음 단계에서는 사용자의 Aurora PostgreSQL DB 클러스터가 사용자 지정 DB 클러스터 파라미터 그룹에 연결되어 있다고 가정합니다.

pg_ad_mapping 확장 설정 방법
  1. https://console.aws.amazon.com/rds/에서 AWS Management Console에 로그인한 후 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 선택합니다.

  3. Aurora PostgreSQL DB 클러스터 라이터 인스턴스의 구성 탭을 엽니다. 인스턴스 세부 정보 중에서 파라미터 그룹 링크를 찾습니다.

  4. 링크를 선택하여 Aurora PostgreSQL DB 클러스터와 연결된 사용자 지정 파라미터를 엽니다.

  5. 파라미터 검색 필드에 shared_pre를 입력하여 shared_preload_libraries 파라미터를 찾습니다.

  6. 파라미터 편집을 선택하여 속성 값에 액세스합니다.

  7. 필드의 목록에 pg_ad_mapping를 추가합니다. 쉼표를 사용하여 값 목록에서 항목을 구분합니다.

    pgAudit가 추가된 shared_preload_libaries 파라미터 이미지.
  8. Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 shared_preload_libraries 파라미터 변경 사항이 적용되도록 합니다.

  9. 인스턴스를 사용할 수 있게 되면 pg_ad_mapping가 초기화되었는지 확인합니다. psql을 사용하여 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 연결하고 다음 명령을 실행합니다.

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pg_ad_mapping (1 row)
  10. pg_ad_mapping이 초기화되었으므로 이제 확장을 생성할 수 있습니다. 라이브러리를 초기화한 후에 확장을 생성해야 이 확장에서 제공되는 함수를 사용할 수 있습니다.

    CREATE EXTENSION pg_ad_mapping;
  11. psql 세션을 닫습니다.

    labdb=> \q
pg_ad_mapping 설정 방법

AWS CLI를 사용하여 pg_ad_mapping을 설정하려면 다음 절차와 같이 modify-db-parameter-group 작업을 호출하여 사용자 지정 파라미터 그룹에 이 파라미터를 추가합니다.

  1. 다음 AWS CLI 명령을 사용하여 shared_preload_libraries 파라미터에 pg_ad_mapping를 추가합니다.

    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. 다음 AWS CLI 명령으로 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 pg_ad_mapping이 초기화되도록 합니다.

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  3. 인스턴스를 사용할 수 있게 되면 pg_ad_mapping가 초기화되었는지 확인할 수 있습니다. psql을 사용하여 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 연결하고 다음 명령을 실행합니다.

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

    pg_ad_mapping이 초기화되었으므로 이제 확장을 생성할 수 있습니다.

    CREATE EXTENSION pg_ad_mapping;
  4. AWS CLI를 사용할 수 있도록 psql 세션을 닫습니다.

    labdb=> \q

PowerShell에서 Active Directory 그룹 SID 검색

보안 식별자(SID)는 보안 주체 또는 보안 그룹을 고유하게 식별하는 데 사용됩니다. Active Directory에서 보안 그룹이나 계정을 만들 때마다 SID가 할당됩니다. Active Directory에서 AD 보안 그룹 SID를 가져오려면 해당 Active Directory 도메인과 연결된 Windows 클라이언트 컴퓨터에서 Get-ADGroup cmdlet을 사용할 수 있습니다. Identity 파라미터는 해당 SID를 가져올 Active Directory 그룹 이름을 지정합니다.

다음 예제에서는 AD 그룹 adgroup1의 SID를 반환합니다.

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

DB 역할을 AD 보안 그룹에 매핑

데이터베이스의 AD 보안 그룹을 PostgreSQL DB 역할로 명시적으로 프로비저닝해야 합니다. 하나 이상의 프로비저닝된 AD 보안 그룹에 속하는 AD 사용자는 데이터베이스에 액세스할 수 있습니다. AD 그룹 보안 기반 DB 역할에 rds_ad role 역할을 부여해서는 안 됩니다. 보안 그룹에 대한 Kerberos 인증은 도메인 이름 접미사(예: user1@example.com)를 사용하여 트리거됩니다. 이 DB 역할은 데이터베이스에 액세스하기 위해 암호 또는 IAM 인증을 사용할 수 없습니다.

참고

데이터베이스에 해당 DB 역할과 rds_ad 역할이 부여된 AD 사용자는 AD 보안 그룹의 일원으로 로그인할 수 없습니다. 이들은 개별 사용자로서 DB 역할을 통해 액세스 권한을 얻게 됩니다.

예를 들어, accounts-group은 Aurora PostgreSQL에서 이 보안 그룹을 accounts-role로 프로비저닝하려는 AD의 보안 그룹입니다.

AD 보안 그룹 PostgreSQL DB 역할
accounts-group accounts-role

DB 역할을 AD 보안 그룹에 매핑할 때는 DB 역할에 LOGIN 속성이 설정되어 있고 필수 로그인 데이터베이스에 대한 CONNECT 권한이 있는지 확인해야 합니다.

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

이제 관리자는 AD 보안 그룹과 PostgreSQL DB 역할 간의 매핑을 생성할 수 있습니다.

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

AD 보안 그룹의 SID 검색에 대한 자세한 내용은 PowerShell에서 Active Directory 그룹 SID 검색 섹션을 참조하세요.

AD 사용자가 여러 그룹에 속해 있는 경우가 있을 수 있으며, 이 경우 AD 사용자는 가장 높은 가중치로 프로비저닝된 DB 역할의 권한을 상속받게 됩니다. 두 역할의 가중치가 같으면 AD 사용자는 최근에 추가된 매핑에 해당하는 DB 역할의 권한을 상속받습니다. 개별 DB 역할의 상대적 권한을 반영하는 가중치를 지정하는 것이 좋습니다. DB 역할의 권한이 높을수록 매핑 항목과 관련된 가중치도 높아야 합니다. 이렇게 하면 가중치가 같은 두 매핑의 모호성을 피할 수 있습니다.

다음 표에는 AD 보안 그룹에서 Aurora PostgreSQL DB 역할로의 샘플 매핑이 나와 있습니다.

AD 보안 그룹 PostgreSQL DB 역할 가중치
accounts-group accounts-role 7
sales-group sales-role 10
dev-group dev-role 7

다음 예제에서 user1은 가중치가 더 높기 때문에 sales-role의 권한을 상속하고, user2는 이 역할에 대한 매핑이 accounts-role 이후에 생성되었기 때문에 accounts-role과 동일한 가중치를 공유하는 dev-role의 권한을 상속합니다.

사용자 이름 보안 그룹 구성원 자격
user1 accounts-group sales-group
user2 accounts-group dev-group

매핑을 설정하고, 나열하고, 지우는 psql 명령은 아래와 같습니다. 현재는 단일 매핑 항목을 수정할 수 없습니다. 기존 항목을 삭제하고 매핑을 다시 만들어야 합니다.

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)

AD 사용자 ID 로깅/감사

다음 명령을 사용하여 기존 또는 세션 사용자가 상속하는 데이터베이스 역할을 확인합니다.

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

AD 보안 주체 ID를 확인하려면 아래 명령을 사용하세요.

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

현재로서는 AD 사용자 ID가 감사 로그에 표시되지 않습니다. log_connections 파라미터를 활성화하여 DB 세션 설정을 기록할 수 있습니다. 자세한 내용은 log_connections를 참조하세요. 이에 대한 출력에는 아래와 같이 AD 사용자 ID가 포함됩니다. 이 출력과 관련된 백엔드 PID는 실제 AD 사용자에게 작업을 귀속시키는 데 도움이 됩니다.

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

제한 사항

  • Azure Active Directory로 알려진 Microsoft Entra ID는 지원되지 않습니다.

pg_ad_mapping 확장의 함수 사용

pg_ad_mapping 확장은 다음 함수에 대한 지원을 제공합니다.

pgadmap_set_mapping

이 함수는 관련 가중치를 사용하여 AD 보안 그룹과 데이터베이스 역할 간의 매핑을 설정합니다.

구문

pgadmap_set_mapping( ad_group, db_role, ad_group_sid, weight)

인수

파라미터 설명
ad_group AD 그룹의 이름입니다. 값이 null 또는 빈 문자열이 될 수 없습니다.
db_role 지정된 AD 그룹에 매핑할 데이터베이스 역할입니다. 값이 null 또는 빈 문자열이 될 수 없습니다.
ad_group_sid AD 그룹을 고유하게 식별하는 데 사용되는 보안 식별자입니다. 값은 'S-1-'로 시작하며 null 또는 빈 문자열이 될 수 없습니다. 자세한 내용은 PowerShell에서 Active Directory 그룹 SID 검색 단원을 참조하십시오.
weight 데이터베이스 역할과 관련된 가중치입니다. 사용자가 여러 그룹의 구성원으로 속해 있는 경우 가중치가 가장 높은 역할이 우선합니다. 가중치의 기본값은 1입니다.

반환 타입

None

사용 노트

이 함수는 AD 보안 그룹의 새 매핑을 데이터베이스 역할에 추가합니다. rds_superuser 권한을 가진 사용자만 DB 클러스터의 기본 DB 인스턴스에서 이 함수를 실행할 수 있습니다.

예제

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

이 함수는 pgadmap_set_mapping 함수를 사용하여 설정한 AD 보안 그룹과 DB 역할 간의 매핑을 나열합니다.

구문

pgadmap_read_mapping()

인수

None

반환 타입

파라미터 설명
ad_group_sid AD 그룹을 고유하게 식별하는 데 사용되는 보안 식별자입니다. 값은 'S-1-'로 시작하며 null 또는 빈 문자열이 될 수 없습니다. 자세히 알아보려면 PowerShell에서 Active Directory 그룹 SID 검색 섹션을 참조하세요.
db_role 지정된 AD 그룹에 매핑할 데이터베이스 역할입니다. 값이 null 또는 빈 문자열이 될 수 없습니다.
weight 데이터베이스 역할과 관련된 가중치입니다. 사용자가 여러 그룹의 구성원으로 속해 있는 경우 가중치가 가장 높은 역할이 우선합니다. 가중치의 기본값은 1입니다.
ad_group AD 그룹의 이름입니다. 값이 null 또는 빈 문자열이 될 수 없습니다.

사용 노트

이 함수를 호출하여 AD 보안 그룹과 DB 역할 간에 사용 가능한 모든 매핑을 나열합니다.

예제

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

이 함수는 pgadmap_set_mapping 함수를 사용하여 설정된 하나의 매핑 또는 모든 매핑을 재설정합니다.

구문

pgadmap_reset_mapping( ad_group_sid, db_role, weight)

인수

파라미터 설명
ad_group_sid AD 그룹을 고유하게 식별하는 데 사용되는 보안 식별자입니다.
db_role 지정된 AD 그룹에 매핑할 데이터베이스 역할입니다.
weight 데이터베이스 역할과 관련된 가중치입니다.

인수가 제공되지 않으면 모든 AD 그룹과 DB 역할 매핑이 재설정됩니다. 모든 인수를 제공하거나 어떤 인수도 제공하지 않아야 합니다.

반환 타입

None

사용 노트

특정 AD 그룹과 DB 역할 매핑을 삭제하거나 모든 매핑을 재설정하려면 이 함수를 호출합니다. rds_superuser 권한을 가진 사용자만 DB 클러스터의 기본 DB 인스턴스에서 이 함수를 실행할 수 있습니다.

예제

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)