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 보안 그룹의 확장을 설정하기 전에 다음 사항이 준비되었는지 확인하세요.
-
PostgreSQL DB 클러스터에 대한 Kerberos 인증 설정. 자세한 내용은 PostgreSQL DB 클러스터에 대한 Kerberos 인증 설정을 참조하세요.
참고
AD 보안 그룹의 경우 이 설정 절차에서 ‘7단계: Kerberos 보안 주체를 위한 PostgreSQL 사용자 생성’ 단계를 건너뛰세요.
도메인에서 DB 클러스터 관리. 자세한 내용은 도메인에서 DB 클러스터 관리를 참조하세요.
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 클러스터 파라미터 그룹 생성에 대한 자세한 내용은 Amazon Aurora의 파라미터 그룹 섹션을 참조하세요. 다음으로 pg_ad_mapping
확장을 설치합니다. 이 섹션에 절차가 설명되어 있습니다. AWS Management Console 또는 AWS CLI를 사용할 수 있습니다.
이 모든 작업을 수행하려면 rds_superuser
역할의 권한이 있어야 합니다.
다음 단계에서는 사용자의 Aurora PostgreSQL DB 클러스터가 사용자 지정 DB 클러스터 파라미터 그룹에 연결되어 있다고 가정합니다.
pg_ad_mapping
확장 설정 방법
https://console.aws.amazon.com/rds/
에서 AWS Management Console에 로그인한 후 Amazon RDS 콘솔을 엽니다. -
탐색 창에서 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 선택합니다.
-
Aurora PostgreSQL DB 클러스터 라이터 인스턴스의 구성 탭을 엽니다. 인스턴스 세부 정보 중에서 파라미터 그룹 링크를 찾습니다.
-
링크를 선택하여 Aurora PostgreSQL DB 클러스터와 연결된 사용자 지정 파라미터를 엽니다.
-
파라미터 검색 필드에
shared_pre
를 입력하여shared_preload_libraries
파라미터를 찾습니다. -
파라미터 편집을 선택하여 속성 값에 액세스합니다.
-
값 필드의 목록에
pg_ad_mapping
를 추가합니다. 쉼표를 사용하여 값 목록에서 항목을 구분합니다. Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여
shared_preload_libraries
파라미터 변경 사항이 적용되도록 합니다.인스턴스를 사용할 수 있게 되면
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;
psql
세션을 닫습니다.labdb=>
\q
pg_ad_mapping 설정 방법
AWS CLI를 사용하여 pg_ad_mapping을 설정하려면 다음 절차와 같이 modify-db-parameter-group 작업을 호출하여 사용자 지정 파라미터 그룹에 이 파라미터를 추가합니다.
다음 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" \ --regionaws-region
-
다음 AWS CLI 명령으로 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 pg_ad_mapping이 초기화되도록 합니다.
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
인스턴스를 사용할 수 있게 되면
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;
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 databaseaccounts-db
toaccounts-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)