pgAudit를 사용하여 데이터베이스 활동 로깅 - Amazon Aurora

pgAudit를 사용하여 데이터베이스 활동 로깅

금융 기관, 정부 기관 및 많은 업계에서는 규제 요구 사항을 충족하기 위해 감사 로그를 보관해야 합니다. Aurora PostgreSQL DB 클러스터와 함께 PostgreSQL Audit 확장(pgAudit)을 사용하면 감사자가 일반적으로 필요로 하거나 규제 요구 사항을 충족하는 데 필요한 세부 레코드를 캡처할 수 있습니다. 예를 들어 특정 데이터베이스 및 테이블의 변경 내용을 추적하고 변경한 사용자 및 기타 여러 세부 정보를 기록하도록 pgAudit 확장을 설정할 수 있습니다.

pgAudit 확장은 네이티브 PostgreSQL 로깅 인프라의 기능을 기반으로 로그 메시지를 더 자세히 확장한 것입니다. 즉, 다른 로그 메시지를 보는 것과 동일한 접근 방식을 사용하여 감사 로그를 볼 수 있습니다. PostgreSQL 로깅에 대한 자세한 내용은 Aurora PostgreSQL 데이터베이스 로그 파일 섹션을 참조하세요.

pgAudit 확장은 일반 텍스트 암호와 같은 민감한 데이터를 로그에서 삭제합니다. Aurora PostgreSQL DB 클러스터Aurora PostgreSQL DB 클러스터에 쿼리 로깅을 활성화합니다.에 설명된 대로 데이터 조작 언어(DML) 문을 로깅하도록 구성된 경우 PostgreSQL Audit 확장을 사용하여 일반 텍스트 암호 문제를 방지할 수 있습니다.

매우 구체적으로 데이터베이스 인스턴스에 대한 감사를 구성할 수 있습니다. 모든 데이터베이스와 모든 사용자를 감사할 수 있습니다. 또는 특정 데이터베이스, 사용자 및 기타 객체만 감사하도록 선택할 수 있습니다. 특정 사용자 및 데이터베이스를 감사에서 명시적으로 제외할 수도 있습니다. 자세한 내용은 감사 로깅에서 사용자 또는 데이터베이스 제외 섹션을 참조하세요.

캡처할 수 있는 세부 정보의 양을 고려하여 pgAudit를 사용하는 경우 스토리지 사용량을 모니터링하는 것이 좋습니다.

pgAudit 확장은 사용 가능한 모든 Aurora PostgreSQL 버전에서 지원됩니다. Aurora PostgreSQL 버전에서 지원되는 pgAudit 버전 목록을 보려면 Aurora PostgreSQL 릴리스 정보의 Extension versions for Amazon Aurora PostgreSQL(Amazon Aurora PostgreSQL 확장 버전)을 참조하세요.

pgAudit 확장 설정

Aurora PostgreSQL DB 클러스터에 pgAudit 확장을 설정하려면 먼저 Aurora PostgreSQL DB 클러스터용 사용자 지정 DB 클러스터 파라미터 그룹의 공유 라이브러리에 pgAudit을 추가해야 합니다. 사용자 지정 DB 클러스터 파라미터 그룹을 만드는 방법에 관한 자세한 내용은 파라미터 그룹 작업 섹션을 참조하세요. 다음으로 pgAudit 확장을 설치합니다. 마지막으로, 감사하려는 데이터베이스 및 객체를 지정합니다. 이 섹션에 절차가 설명되어 있습니다. AWS Management Console 또는 AWS CLI를 사용할 수 있습니다.

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

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

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

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

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

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

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

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

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

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

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

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
  10. pgAudit가 초기화되었으므로 이제 확장을 생성할 수 있습니다. 확장은 라이브러리를 초기화한 후에 생성해야 합니다. pgaudit 확장이 데이터 정의 언어(DDL) 문 감사를 위한 이벤트 트리거를 설치하기 때문입니다.

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

    labdb=> \q
  12. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  13. 목록에서 pgaudit.log 파라미터를 찾아 사용 사례에 적합한 값으로 설정합니다. 예를 들어, 다음 이미지처럼 pgaudit.log 파라미터를 write로 설정하면 로그에 대한 삽입, 업데이트, 삭제 및 기타 유형의 변경 사항이 캡처됩니다.

    pgaudit.log 파라미터의 설정 이미지.

    pgaudit.log 파라미터에 다음 값 중 하나를 선택할 수도 있습니다.

    • 없음 - 기본값입니다. 데이터베이스 변경 사항이 로깅되지 않습니다.

    • 모두 - 모든 항목(읽기, 쓰기, 함수, 역할, ddl, 기타)을 로깅합니다.

    • ddl - ROLE 클래스에 포함되지 않은 모든 데이터 정의 언어(DDL) 문을 로깅합니다.

    • 함수 - 함수 호출 및 DO 블록을 로깅합니다.

    • 기타 – 기타 명령(예: DISCARD, FETCH, CHECKPOINT, VACUUM, SET)을 로깅합니다.

    • 읽기 – 원본이 관계(예: 테이블) 또는 쿼리인 경우 SELECTCOPY를 로깅합니다.

    • 역할 - 역할 및 권한과 관련된 문을 로깅합니다(예: GRANT, REVOKE, CREATE ROLE, ALTER ROLE, DROP ROLE).

    • 쓰기 - 대상이 관계(테이블)인 경우 INSERT, UPDATE, DELETE, TRUNCATE, COPY를 로깅합니다.

  14. 변경 사항 저장을 선택합니다.

  15. https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  16. 데이터베이스 목록에서 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 선택한 다음, 작업 메뉴에서 재부팅을 선택합니다.

pgAudit 설정 방법

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

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

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  2. 다음 AWS CLI 명령으로 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 pgaudit 라이브러리가 초기화되도록 합니다.

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

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

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

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

    labdb=> \q
  5. 다음 AWS CLI 명령을 사용하여 세션 감사 로깅을 통해 로깅할 문의 클래스를 지정합니다. 이 예에서는 pgaudit.log 파라미터를 write로 설정하여 로그에 대한 삽입, 업데이트 및 삭제를 캡처합니다.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.log,ParameterValue=write,ApplyMethod=pending-reboot" \ --region aws-region

    pgaudit.log 파라미터에 다음 값 중 하나를 선택할 수도 있습니다.

    • 없음 - 기본값입니다. 데이터베이스 변경 사항이 로깅되지 않습니다.

    • 모두 - 모든 항목(읽기, 쓰기, 함수, 역할, ddl, 기타)을 로깅합니다.

    • ddl - ROLE 클래스에 포함되지 않은 모든 데이터 정의 언어(DDL) 문을 로깅합니다.

    • 함수 - 함수 호출 및 DO 블록을 로깅합니다.

    • 기타 – 기타 명령(예: DISCARD, FETCH, CHECKPOINT, VACUUM, SET)을 로깅합니다.

    • 읽기 – 원본이 관계(예: 테이블) 또는 쿼리인 경우 SELECTCOPY를 로깅합니다.

    • 역할 - 역할 및 권한과 관련된 문을 로깅합니다(예: GRANT, REVOKE, CREATE ROLE, ALTER ROLE, DROP ROLE).

    • 쓰기 - 대상이 관계(테이블)인 경우 INSERT, UPDATE, DELETE, TRUNCATE, COPY를 로깅합니다.

    다음 AWS CLI 명령으로 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅합니다.

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region

데이터베이스 객체 감사

Aurora PostgreSQL DB 클러스터에 pgAudit를 설정하고 요구 사항에 맞게 구성하면 PostgreSQL 로그에 더 자세한 정보가 캡처됩니다. 예를 들어 기본 PostgreSQL 로깅 구성은 데이터베이스 테이블에서 변경 사항이 적용된 날짜 및 시간을 식별하지만 pgAudit 확장을 사용하면 확장 파라미터의 구성에 따라 스키마, 변경한 사용자 및 기타 세부 정보가 로그 항목에 포함될 수 있습니다. 감사를 설정하여 다음 방법으로 변경 사항을 추적할 수 있습니다.

  • 세션마다 사용자별로 추적. 세션 수준에서 정규화된 명령 텍스트를 캡처할 수 있습니다.

  • 객체마다 사용자별, 데이터베이스별로 추적

객체 감사 기능은 시스템에서 rds_pgaudit 역할을 만든 다음, 사용자 지정 파라미터 그룹의 pgaudit.role 파라미터에 이 역할을 추가하면 활성화됩니다. 기본적으로 pgaudit.role 파라미터는 설정되어 있지 않으며 유일하게 허용되는 값은 rds_pgaudit입니다. 다음 단계에서는 pgaudit가 초기화되었고 pgAudit 확장 설정의 절차에 따라 pgaudit 확장을 만든 것으로 가정합니다.

pgAudit를 설정한 후의 PostgreSQL 로그 파일 이미지.

이 예에서 볼 수 있듯이 LOG: AUDIT: SESSION 행은 테이블 및 해당 스키마를 비롯한 세부 정보를 제공합니다.

객체 감사를 설정하는 방법
  1. psql을 사용하여 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 연결합니다.

    psql --host=your-instance-name.aws-region.rds.amazonaws.com --port=5432 --username=postgrespostgres --password --dbname=labdb
  2. 다음 명령을 사용하여 rds_pgaudit라는 데이터베이스 역할을 생성합니다.

    labdb=> CREATE ROLE rds_pgaudit; CREATE ROLE labdb=>
  3. psql 세션을 닫습니다.

    labdb=> \q

    이어질 몇 단계에서는 AWS CLI를 사용하여 사용자 지정 파라미터 그룹에서 감사 로그 파라미터를 수정합니다.

  4. 다음 AWS CLI 명령을 사용하여 rds_pgauditpgaudit.role 파라미터를 추가합니다. 기본적으로 이 파라미터는 설정되어 있지 않으며 유일하게 허용되는 값은 rds_pgaudit입니다.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.role,ParameterValue=rds_pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  5. 다음 AWS CLI 명령으로 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 파라미터 변경 사항이 적용되도록 합니다.

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  6. 다음 명령을 실행하여 pgaudit.rolerds_pgaudit로 설정되었는지 확인합니다.

    SHOW pgaudit.role; pgaudit.role ------------------ rds_pgaudit

pgAudit 로깅을 테스트하기 위해 감사하려는 몇 가지 예제 명령을 실행할 수 있습니다. 예를 들어 다음과 같은 명령을 실행할 수 있습니다.

CREATE TABLE t1 (id int); GRANT SELECT ON t1 TO rds_pgaudit; SELECT * FROM t1; id ---- (0 rows)

데이터베이스 로그에는 다음과 유사한 항목이 포함됩니다.

... 2017-06-12 19:09:49 UTC:...:rds_test@postgres:[11701]:LOG: AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1; ...

로그 확인에 대한 자세한 내용은 Amazon Aurora 로그 파일 모니터링 단원을 참조하십시오.

pgAudit 확장 프로그램에 대한 자세한 내용은 GitHub에서 pgAudit을 참조하세요.

감사 로깅에서 사용자 또는 데이터베이스 제외

Aurora PostgreSQL 데이터베이스 로그 파일에서 설명한 대로 PostgreSQL 로그는 스토리지 공간을 사용합니다. pgAudit 확장을 사용하면 추적하는 변경 사항에 따라 로그에 수집된 데이터 양이 다양한 수준으로 늘어납니다. Aurora PostgreSQL DB 클러스터의 모든 사용자 또는 데이터베이스를 감사할 필요는 없을 수도 있습니다.

스토리지에 미치는 영향을 최소화하고 불필요하게 감사 레코드를 캡처하지 않도록 사용자 및 데이터베이스를 감사에서 제외할 수 있습니다. 지정된 세션 내에서 로깅을 변경할 수도 있습니다. 다음 예에서는 그 방법을 보여줍니다.

참고

세션 수준의 파라미터 설정은 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 대한 사용자 지정 DB 파라미터 그룹의 설정보다 우선합니다. 데이터베이스 사용자가 감사 로깅 구성 설정을 우회하지 못하게 하려면 사용자의 권한을 변경해야 합니다.

Aurora PostgreSQL DB 클러스터 가 모든 사용자 및 데이터베이스에 대해 동일한 수준의 활동을 감사하도록 구성되어 있다고 가정하겠습니다. 그런데 사용자 myuser를 감사하지 않기로 결정한다면 다음 SQL 명령으로 myuser에 대한 감사를 해제할 수 있습니다.

ALTER USER myuser SET pgaudit.log TO 'NONE';

그런 다음 다음 쿼리를 사용하여 pgaudit.loguser_specific_settings 열에서 파라미터가 NONE으로 설정되었는지 확인할 수 있습니다.

SELECT usename AS user_name, useconfig AS user_specific_settings FROM pg_user WHERE usename = 'myuser';

출력은 다음과 같습니다.

user_name | user_specific_settings -----------+------------------------ myuser | {pgaudit.log=NONE} (1 row)

다음 명령을 사용하여 데이터베이스 세션 중에 특정 사용자에 대한 로깅을 해제할 수 있습니다.

ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'none';

다음 쿼리를 사용하여 pgaudit.log의 설정 열에서 특정 사용자 및 데이터베이스 조합을 확인할 수 있습니다.

SELECT usename AS "user_name", datname AS "database_name", pg_catalog.array_to_string(setconfig, E'\n') AS "settings" FROM pg_catalog.pg_db_role_setting s LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase LEFT JOIN pg_catalog.pg_user r ON r.usesysid = setrole WHERE usename = 'myuser' AND datname = 'mydatabase' ORDER BY 1, 2;

출력은 다음과 비슷합니다.

user_name | database_name | settings -----------+---------------+------------------ myuser | mydatabase | pgaudit.log=none (1 row)

myuser에 대한 감사를 해제한 후 mydatabase에 대한 변경 내용을 추적하지 않기로 결정한다면 다음 명령을 사용하여 특정 데이터베이스에 대한 감사를 해제합니다.

ALTER DATABASE mydatabase SET pgaudit.log to 'NONE';

그런 다음, 다음 쿼리를 사용하여 database_specific_settings 열에서 pgaudit.log가 NONE으로 설정되어 있는지 확인합니다.

SELECT a.datname AS database_name, b.setconfig AS database_specific_settings FROM pg_database a FULL JOIN pg_db_role_setting b ON a.oid = b.setdatabase WHERE a.datname = 'mydatabase';

출력은 다음과 같습니다.

database_name | database_specific_settings ---------------+---------------------------- mydatabase | {pgaudit.log=NONE} (1 row)

myuser의 설정을 기본 설정으로 되돌리려면 다음 명령을 사용합니다.

ALTER USER myuser RESET pgaudit.log;

데이터베이스의 설정을 기본 설정으로 되돌리려면 다음 명령을 사용합니다.

ALTER DATABASE mydatabase RESET pgaudit.log;

사용자와 데이터베이스를 기본 설정으로 초기화하려면 다음 명령을 사용합니다.

ALTER USER myuser IN DATABASE mydatabase RESET pgaudit.log;

pgaudit.logpgaudit.log 파라미터에 허용되는 다른 값 중 하나로 설정하여 특정 이벤트를 로그에 캡처할 수도 있습니다. 자세한 내용은 pgaudit.log 파라미터에 허용되는 설정 목록 섹션을 참조하세요.

ALTER USER myuser SET pgaudit.log TO 'read'; ALTER DATABASE mydatabase SET pgaudit.log TO 'function'; ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'read,function'

pgAudit 확장 프로그램에 대한 참조

이 섹션에 나열된 파라미터를 하나 이상 변경하여 감사 로그의 세부 정보 수준을 지정할 수 있습니다.

pgAudit 동작 제어

다음 표에 나열된 파라미터 중 하나 이상을 변경하여 감사 로깅을 제어할 수 있습니다.

파라미터 설명

pgaudit.log

세션 감사 로깅으로 로깅될 문의 클래스를 지정합니다. 허용되는 값에는 ddl, 함수, 기타, 읽기, 역할, 쓰기, 없음, 모두 등이 포함됩니다. 자세한 내용은 pgaudit.log 파라미터에 허용되는 설정 목록 섹션을 참조하세요.

pgaudit.log_catalog

활성화(1로 설정)하면 문의 모든 관계가 pg_catalog에 있는 경우 감사 추적에 문을 추가합니다.

pgaudit.log_level

로그 항목에 사용할 로그 수준을 지정합니다. 허용되는 값은 ebug5, debug4, debug3, debug2, debug1, 정보, 알림, 경고, 로그입니다.

pgaudit.log_parameter

활성화(1로 설정)하면 문과 함께 전달된 파라미터가 감사 로그에 캡처됩니다.

pgaudit.log_relation

활성화(1로 설정)하면 세션의 감사 로그에서 SELECT 또는 DML 문에서 참조되는 각 관계(TABLE, VIEW 등) 에 대해 별도의 로그 항목을 생성합니다.

pgaudit.log_statement_once

로깅에 문/하위 문 조합에 대한 첫 번째 로그 항목이 있는 문 텍스트 및 파라미터를 포함할지 아니면 모든 항목이 있는 문 텍스트 및 파라미터를 포함할지를 지정합니다.

pgaudit.role

객체 감사 로깅에 사용할 마스터 역할을 지정합니다. 유일하게 허용되는 항목은 rds_pgaudit입니다.

pgaudit.log 파라미터에 허용되는 설정 목록

설명

없음

이 값이 기본값입니다. 데이터베이스 변경 사항이 로깅되지 않습니다.

모두

모든 항목(읽기, 쓰기, 함수, 역할, ddl, 기타)을 로깅합니다.

ddl

ROLE 클래스에 포함되지 않은 모든 데이터 정의 언어(DDL) 문을 로깅합니다.

함수

함수 호출 및 DO 블록을 로깅합니다.

기타

기타 명령을 로깅합니다(예: DISCARD, FETCH, CHECKPOINT, VACUUM, SET).

읽기

원본이 관계(예: 테이블) 또는 쿼리인 경우 SELECTCOPY를 로깅합니다.

역할

역할 및 권한과 관련된 문을 로깅합니다(예: GRANT, REVOKE, CREATE ROLE, ALTER ROLE, DROP ROLE).

write

대상이 관계(테이블)인 경우 INSERT, UPDATE, DELETE, TRUNCATE, COPY를 로깅합니다.

세션 감사를 사용하여 여러 이벤트 유형을 기록하려면 쉼표로 구분된 목록을 사용합니다. 모든 이벤트 유형을 기록하려면 pgaudit.logALL로 설정합니다. DB 인스턴스를 재부팅하여 변경 사항을 적용합니다.

객체 감사를 사용하면 특정 관계를 사용하도록 감사 로깅을 구체화할 수 있습니다. 예를 들어 하나 이상의 테이블에서 READ 작업에 대한 감사 로깅을 지정할 수 있습니다.