Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
pgAudit 확장을 사용하여 Amazon RDS for PostgreSQL DB 인스턴스를 감사하려면 어떻게 해야 합니까?
Amazon Relational Database Service(Amazon RDS) for PostgreSQL DB 인스턴스의 모든 데이터베이스, 역할, 관계 및 열을 감사하려고 합니다. 또한 서로 다른 역할에 여러 수준의 감사를 제공하도록 pgAudit 확장을 구성하려고 합니다.
해결 방법
RDS for PostgreSQL DB 인스턴스의 활동을 기록하기 위해 설정할 수 있는 다양한 파라미터가 있습니다. pgAudit 확장을 활성화한 후 특정 데이터베이스, 역할, 테이블 및 열을 감사하도록 pgaudit.log 파라미터를 구성할 수 있습니다. 먼저 데이터베이스, 역할 또는 테이블의 파라미터 그룹에서 pgaudit.log 파라미터 값을 none으로 설정하십시오.
> show pgaudit.log;+---------------+ | pgaudit.log | |---------------| | none | +---------------+ SHOW
pgAudit 확장을 사용하여 데이터베이스 감사
다음 단계를 완료하십시오.
- 다음 명령을 실행하여 사용 중인 데이터베이스에서만 pgaudit.log 파라미터의 시스템 구성을 재정의합니다.
참고: test_database를 사용 중인 데이터베이스 이름으로 바꾸십시오. 이전 명령은 pgAudit가 test_database만 감사하도록 pgaudit.log 파라미터의 값을 All로 변경합니다.ALTER DATABASE test_database set pgaudit.log='All'; - 데이터베이스에 연결한 후 다음 쿼리를 실행하여 데이터베이스를 감사합니다.
참고: aud_table을 감사하려는 테이블로 바꾸십시오.select * from aud_table;
오류 로그의 출력은 다음과 비슷합니다.2019-06-25 19:21:35 UTC:192.0.2.7(39330):testpar@test_database:[21638]:LOG: AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not logged>
pgAudit 확장을 사용하여 역할 감사
다른 값을 갖도록 pgaudit.log 파라미터의 역할을 수정할 수도 있습니다. 역할의 pgaudit.log 파라미터에 다른 값을 설정하려면 다음 명령을 실행하십시오.
ALTER ROLE test1 set pgaudit.log='All';
ALTER ROLE test2 set pgaudit.log='DDL';
참고: test1 및 test2를 원하는 역할 이름으로 바꾸십시오.
역할 수준에서 수정이 이루어졌는지 확인하려면 다음 쿼리를 실행하십시오.
> select rolname,rolconfig from pg_roles where rolname in ('test1',' test2'); +-----------+----------------------+ | rolname | rolconfig | |-----------+----------------------| | test1 | [u'pgaudit.log=All'] | | test2 | [u'pgaudit.log=DDL'] | +-----------+----------------------+ SELECT 2 Time: 0.010s
참고: test1 및 test2를 원하는 역할 이름으로 바꾸십시오.
역할의 pgAudit 로깅 동작을 테스트하려면 각 역할에 대해 다음 쿼리를 실행하십시오.
CREATE TABLE test_table (id int);CREATE TABLE
select * from test_table;id ---- (0 rows)
서로 다른 두 역할에 대한 로그 출력은 다음 예와 비슷합니다.
test1:
...2019-06-26 14:51:12 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG: AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id int);,<not logged> 2019-06-26 14:51:18 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG: AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not logged> ...
test2:
...2019-06-26 14:53:54 UTC:192.0.2.7(44772):test2@postgres:[5517]:LOG: AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id int);,<not logged> ...
test2의 pgaudit.log 파라미터가 DDL로만 설정되어 있기 때문에 test2 예제 출력에는 SELECT 쿼리에 대한 감사 항목이 없습니다. 이 테스트에서는 test2 역할이 DDL 작업만 기록하는지 확인합니다.
pgAudit 확장을 사용하여 테이블 감사
참고: pgAudit 확장에서는 SELECT, INSERT, UPDATE 및 DELETE 명령만 기록할 수 있습니다. 해당 확장에서는 TRUNCATE를 감사할 수 없습니다.
테이블을 감사하려면 다음 명령을 실행하여 명령에 대한 액세스 권한을 rds_pgaudit 역할에 부여하십시오.
grant select, delete on test_table to rds_pgaudit;
참고: 위의 명령을 사용하면 rds_pgaudit 역할이 SELECT 및 DELETE에 액세스할 수 있습니다. select와 delete를 감사하려는 명령으로 바꾸십시오.
감사 로깅이 올바르게 구성되었는지 확인하려면 테이블에서 명령문을 실행하십시오. 다음 예제 명령은 test_table에서 DELETE 문을 실행합니다.
Time: 0.008s DELETE 1 >delete from test_table where pid=5050;
DELETE 문의 출력은 다음과 비슷합니다.
2019-06-25 17:13:02UTC:192.0.2.7(41810):postgresql104saz@postgresql104saz:[24976]:LOG: AUDIT: OBJECT,3,1,WRITE,DELETE,TABLE,public.t1,delete from test_table where pid=5050,<not logged>
pgAudit 확장을 사용하여 열 감사
민감한 데이터가 한 열에만 있는 경우 등과 같이 특정 테이블의 열을 감사할 수 있습니다. 다음 예제 명령은 감사해야 하는 급여 데이터가 포함된 민감한 열이 있는 급여 테이블을 생성합니다.
create table payroll( name text, salary text );
급여 열을 감사하려면 먼저 다음 명령을 실행하여 salary 열의 SELECT에 대한 액세스 권한을 rds_pgaudit 역할에 부여합니다.
grant select (salary) on payroll to rds_pgaudit;
그런 다음, 아래 명령을 실행하여 salary 열을 포함한 테이블의 모든 열에 대해 SELECT를 수행합니다.
select * from payroll;
**SELECT ** 쿼리에 salary 열이 포함되어 있지 않은 경우 pgAudit는 해당 열을 감사하지 않습니다.
다음 예제 출력에서 pgAudit는 salary 열을 포함한 모든 SELECT를 감사합니다.
2019-06-25 18:25:02 UTC:192.0.2.7(42056):postgresql104saz@postgresql104saz:[4118]:LOG: AUDIT: OBJECT,2,1,READ,SELECT,TABLE,public.payroll,select * from payroll,<not logged>

