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

최종 업데이트 날짜: 2019년 10월 3일

모든 데이터베이스, 역할, 관계 또는 열을 감사하고 각 역할에 서로 다른 수준의 감사를 제공하려고 합니다. PostgreSQL을 실행하는 Amazon Relational Database Service(Amazon RDS) DB 인스턴스에서 다양한 역할 수준에 대해 pgaudit 확장을 구성하려면 어떻게 해야 합니까?

간략한 설명

PostgreSQL DB 인스턴스에서 활동을 로깅하기 위해 설정할 수 있는 파라미터는 다양합니다. 다양한 데이터베이스, 역할, 테이블 또는 열을 감사하기 위해 pgaudit 확장을 사용할 수 있습니다. pgaudit 확장을 활성화한 후 특정 데이터베이스, 역할, 테이블 및 열을 감사하도록 pgaudit.log 파라미터를 구성할 수 있습니다.

​해결 방법

PostgreSQL을 실행하는 Amazon RDS 인스턴스에서 pgaudit 확장 활성화

1.    다음 명령을 실행하여 rds_pgaudit라는 특정 데이터베이스 역할을 생성합니다.

CREATE ROLE rds_pgaudit;
CREATE ROLE

2.    pgaudit를 포함하는 공유 라이브러리를 사용하도록 DB 인스턴스와 연결된 DB 파라미터 그룹을 수정하고 파라미터 pgaudit.role을 설정합니다. 그런 다음, pgaudit.role을 생성한 역할인 rds_pgaudit로 설정합니다.

3.    파라미터 그룹에 대한 변경 사항이 인스턴스에 적용되도록 인스턴스를 재부팅합니다.

4.    다음 명령을 실행하여 pgaudit 초기화 여부를 확인합니다.

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

5.    다음 명령을 실행하여 pgaudit 확장을 생성합니다.

CREATE EXTENSION pgaudit;
CREATE EXTENSION

6.    다음 명령을 실행하여 pgaudit.rolerds_pgaudit로 설정되어 있는지 확인합니다.

show pgaudit.role;
pgaudit.role 
------------------
rds_pgaudit

7.    pgaudit.log 파라미터를 구성하여 다음을 감사합니다.

  • ALL은 다음 명령을 감사합니다.
  • MISC_SET은 SET ROLE과 같은 기타 SET 명령을 감사합니다.
  • MISC는 DISCARD, FETCH, CHECKPOINT, VACUUM, SET와 같은 기타 명령을 감사합니다.
  • DDL은 ROLE 클래스에 포함되지 않은 모든 데이터 설명 언어(DDL)를 감사합니다.
  • ROLE은 GRANT, REVOKE, CREATE/ALTER/DROP ROLE과 같은 역할 및 권한과 관련된 명령문을 감사합니다.
  • FUNCTION은 함수 호출 및 DO 블록을 감사합니다.
  • WRITE는 대상이 관계일 때 INSERT, UPDATE, DELETE, TRUNCATE 및 COPY를 감사합니다.
  • READ는 원본이 관계 또는 쿼리일 때 SELECT 및 COPY를 감사합니다.

감사할 대상에 따라 데이터베이스, 역할 또는 테이블에 대한 pgaudit.log 파라미터의 값을 설정합니다.

pgaudit 확장을 사용하여 데이터베이스 감사

1.    데이터베이스, 역할 또는 테이블에 대해 pgaudit.log 파라미터의 값을 설정하려면 파라미터 그룹 수준에서 pgaudit.log 파라미터를 none으로 설정합니다.

> show pgaudit.log
+---------------+
| pgaudit.log   |
|---------------|
| none          |
+---------------+
SHOW

2.    다음 명령을 실행하여 이 데이터베이스에서만 이 파라미터에 대한 시스템 구성을 재정의합니다.

ALTER DATABASE test_database set pgaudit.log='All';

이렇게 하면 파라미터 pgaudit.log의 값이 All로 변경되므로 test_database가 RDS DB 인스턴스에서 감사되는 유일한 데이터베이스가 됩니다.

3.    test_database에 연결하고 다음 쿼리를 실행합니다.

select * from test_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 파라미터에 대해 다른 값을 갖도록 수정됩니다. 다음 예제 명령에서 역할 test1test2가 서로 다른 pgaudit.log 구성을 갖도록 변경됩니다.

1.    다음 명령을 실행하여 test1test2에 대한 pgaudit.log 파라미터에 다른 값을 설정합니다.

ALTER ROLE test1 set pgaudit.log='All';
ALTER ROLE test2 set pgaudit.log='DDL';

2.    다음 쿼리를 실행하여 역할 수준에서 수정되었는지 확인합니다.

> 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 

3.    test1test2 모두에 대해 다음 쿼리를 실행합니다.

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 전용으로 구성되었기 때문에 SELECT 쿼리에 대한 감사 항목은 없습니다.

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

pgaudit.log 파라미터 구성은 특정 관계에 영향을 미치는 명령문을 감사 및 로깅합니다. pgaudit 확장에서는 SELECT, INSERT, UPDATEDELETE 명령만 로깅할 수 있습니다. TRUNCATE는 객체 감사 로깅에 포함되지 않습니다. rds_pgaudit 역할에 감사하려는 테이블 작업(예: SELECT, DELETE, INSERT, 또는 UPDATE)에 대한 액세스 권한을 부여할 경우, 권한 감사는 해당 명령문을 기록합니다. 다음 예제에서는 test_table의 모든 SELECTDELETE 명령문이 감사되도록 rds_pgaudit 역할에 SELECT DELETE에 대한 액세스 권한을 부여합니다.

1.    다음 명령을 실행하여 rds_pgaudit 역할에 SELECTDELETE에 대한 액세스 권한을 부여합니다.

grant select, delete on test_table to rds_pgaudit;

2.    test_table에서 DELETE 명령문을 실행하여 감사 로깅이 올바르게 구성되었는지 테스트합니다.

Time: 0.008s 
DELETE 1
>delete from test_table where pid=5050;

DELETE 명령문의 출력은 다음과 비슷합니다.

2019-06-25 17:13:02 
UTC: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
);

1.    rds_pgaudit 역할에 급여 열의 SELECT에 대한 액세스 권한을 부여하여 이 열의 모든 SELECT가 감사를 받도록 합니다.

grant select (salary)  on payroll to rds_pgaudit;

2.    급여 열을 포함하여 테이블의 모든 열이 SELECT입니다.

select * from payroll;

다음 예제 출력에서는 급여열이 포함된 SELECT가 감사됩니다. 하지만 급여 열이 포함되지 않은 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>

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?