해결 방법
RDS for PostgreSQL DB 인스턴스의 활동을 기록하기 위해 설정할 수 있는 다양한 파라미터가 있습니다. pgAudit 확장을 활성화한 후 특정 데이터베이스, 역할, 테이블 및 열을 감사하도록 pgaudit.log 파라미터를 구성할 수 있습니다. 먼저 데이터베이스, 역할 또는 테이블의 파라미터 그룹에서 pgaudit.log 파라미터 값을 none으로 설정하십시오.
> show pgaudit.log;+---------------+
| pgaudit.log |
|---------------|
| none |
+---------------+
SHOW
pgAudit 확장을 사용하여 데이터베이스 감사
다음 단계를 완료하십시오.
- 다음 명령을 실행하여 사용 중인 데이터베이스에서만 pgaudit.log 파라미터의 시스템 구성을 재정의합니다.
ALTER DATABASE test_database set pgaudit.log='All';
참고: test_database를 사용 중인 데이터베이스 이름으로 바꾸십시오. 이전 명령은 pgAudit가 test_database만 감사하도록 pgaudit.log 파라미터의 값을 All로 변경합니다.
- 데이터베이스에 연결한 후 다음 쿼리를 실행하여 데이터베이스를 감사합니다.
select * from aud_table;
참고: 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>
관련 정보
Amazon RDS for PostgreSQL의 일반적인 DBA 작업
pgAudit를 사용하여 데이터베이스 활동 기록