pgAudit 확장을 사용하여 Amazon RDS for PostgreSQL DB 인스턴스를 감사하려면 어떻게 해야 합니까?

4분 분량
0

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 확장을 사용하여 데이터베이스 감사

다음 단계를 완료하십시오.

  1. 다음 명령을 실행하여 사용 중인 데이터베이스에서만 pgaudit.log 파라미터의 시스템 구성을 재정의합니다.
    ALTER DATABASE test_database set pgaudit.log='All';
    참고: test_database를 사용 중인 데이터베이스 이름으로 바꾸십시오. 이전 명령은 pgAudit가 test_database만 감사하도록 pgaudit.log 파라미터의 값을 All로 변경합니다.
  2. 데이터베이스에 연결한 후 다음 쿼리를 실행하여 데이터베이스를 감사합니다.
    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';

참고: test1test2를 원하는 역할 이름으로 바꾸십시오.

역할 수준에서 수정이 이루어졌는지 확인하려면 다음 쿼리를 실행하십시오.

> 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

참고: test1test2를 원하는 역할 이름으로 바꾸십시오.

역할의 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>
...

test2pgaudit.log 파라미터가 DDL로만 설정되어 있기 때문에 test2 예제 출력에는 SELECT 쿼리에 대한 감사 항목이 없습니다. 이 테스트에서는 test2 역할이 DDL 작업만 기록하는지 확인합니다.

pgAudit 확장을 사용하여 테이블 감사

참고: pgAudit 확장에서는 SELECT, INSERT, UPDATEDELETE 명령만 기록할 수 있습니다. 해당 확장에서는 TRUNCATE를 감사할 수 없습니다.

테이블을 감사하려면 다음 명령을 실행하여 명령에 대한 액세스 권한을 rds_pgaudit 역할에 부여하십시오.

grant select, delete on test_table to rds_pgaudit;

참고: 위의 명령을 사용하면 rds_pgaudit 역할이 SELECTDELETE에 액세스할 수 있습니다. selectdelete를 감사하려는 명령으로 바꾸십시오.

감사 로깅이 올바르게 구성되었는지 확인하려면 테이블에서 명령문을 실행하십시오. 다음 예제 명령은 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를 사용하여 데이터베이스 활동 기록