Amazon Relational Database Service(Amazon RDS) for PostgreSQL을 사용하여 CREATE USER 또는 ALTER USER 명령문을 실행하려고 합니다. 이렇게 하면 PostgreSQL이 내 암호를 로그 파일에 일반 텍스트로 로깅합니다.
간략한 설명
log_statement 파라미터를 ddl 또는 모두로 설정한 후 다음 명령 중 하나를 실행할 수 있습니다.
- CREATE ROLE/USER ... WITH PASSWORD ... ;
- ALTER ROLE/USER ... WITH PASSWORD ... ;,
이렇게 하면 PostgreSQL은 PostgreSQL 로그에 항목을 만듭니다. PostgreSQL은 암호를 일반 텍스트로 로깅하므로 잠재적인 보안 위험이 발생할 수 있습니다.
PostgreSQL은 중요한 정보를 식별하지 않습니다. 이는 예상된 동작이며 PostgreSQL 엔진 설계에 따른 것입니다.
이 예제에서는 암호를 사용하여 CREATE ROLE 문을 실행한 다음, 로그에 암호를 일반 텍스트로 표시합니다.
USER@postgresdb:pg> CREATE ROLE test_role WITH PASSWORD 'test123';
CREATE ROLE
Time: 0.003s
로그 출력:
2020-04-15 14:57:29 UTC:x.x.x.x(42918):USER@pg:[13790]:LOG: statement: CREATE ROLE test_role WITH PASSWORD 'test123'
이 예제에서는 암호를 사용하여 ALTER ROLE 문을 실행한 다음, 로그에 암호를 일반 텍스트로 표시합니다.
USER@postgresdb:pg> ALTER ROLE test_role WITH PASSWORD 'test';
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
ALTER ROLE
Time: 0.004s
로그 출력:
2020-04-15 14:59:45 UTC:x.x.x.x(42918):USER@pg:[13790]:STATEMENT: ALTER ROLE test_role SET PASSWORD 'test'
해결 방법
pgaudit 플러그 인 사용
pgaudit 확장을 사용하여 PostgreSQL 로그에서 암호를 삭제합니다.
- Amazon RDS for PostgreSQL 인스턴스에 대해 pgaudit를 활성화합니다.
- 사용자 지정 파라미터 그룹에서 pgaudit.log 파라미터를 설정하여 로깅하려는 명령문 클래스를 지정합니다. 이 파라미터는 DDL, 역할, 쓰기, 읽기 등의 여러 값을 사용합니다.
참고: pgaudit.log='DDL'과 log_statement='DDL'의 주요 차이점은 pgaudit, DDL은 PostgreSQL 로그에 CREATE/ALTER ROLE 쿼리를 기록하지 않는다는 것입니다.
CREATE/ALTER ROLE을 로깅하려면 pgaudit.log에 ROLE을 추가합니다. 이렇게 하면 암호가 삭제됩니다.
로그 출력:
2020-07-09 13:33:50 UTC:x.x.x.x(58670):grysa@pg:[26513]:LOG: AUDIT: SESSION,3,1,ROLE,CREATE ROLE,,,CREATE ROLE test_role WITH LOGIN
PASSWORD <REDACTED>,<not logged>
트랜잭션 블록 내 세션 수준에서 log_statement를 ‘없음’으로 설정
PostgreSQL이 작업을 완전히 기록하지 못하도록 하려면 트랜잭션 블록 내의 세션 수준에서 log_statement 파라미터를 없음으로 설정하십시오.
참고: pgaudit.log 및 log_statement가 모두 DDL로 설정된 경우 세션 레벨에서 log_statement를 없음으로 설정해야 합니다.
예시:
BEGIN;SET LOCAL log_statement = 'none';
ALTER ROLE ... WITH PASSWORD ...;
COMMIT;
로컬에서 암호 해시 만들기
로컬에서 암호 해시를 만든 다음, 역할 또는 사용자 암호를 만들거나 변경하는 경우 해시를 사용합니다.
참고: 명령문을 실행하기 위해 만들어 사용하는 해시는 여전히 로그에 표시됩니다. 이 해시는 해독할 수 있지만 일반 텍스트로 로깅되지는 않습니다.
예시:
[ec2-user@ip-x.x.x.x ~]$ username='test_1'; dbpass='test123'; echo -n "${dbpass}${username}" | md5sum | awk '{print "md5" $1}'md574e183386ccb9039d0537aeb03c03db9
USER@postgresdb:pg> CREATE ROLE test_1 WITH PASSWORD 'md574e183386ccb9039d0537aeb03c03db9';
CREATE ROLE
Time: 0.003s
로그 출력:
2020-04-15 15:12:08 UTC:x.x.x.x(42918):grysa@pg:[13790]:LOG: statement: CREATE ROLE test_1 WITH PASSWORD 'md574e183386ccb9039d0537aeb03c03db9'
\password 명령 사용
PostgreSQL을 사용하는 경우 PostgreSQL 클라이언트에 내장된 \password 함수를 사용할 수 있습니다. 기존 역할 암호를 만들거나 변경하면 새 암호를 입력하라는 메시지가 표시됩니다. PostgreSQL은 암호에 대한 해시만 로깅합니다.
참고: 이 솔루션은 PostgreSQL 로그에도 암호 해시를 표시하지만 일반 텍스트로 로깅하지는 않습니다.
\password 함수를 사용하려면 다음 명령을 실행합니다.
pg=> CREATE ROLE test_role NOLOGIN;CREATE ROLE
pg=> \password test_role
Enter new password:
Enter it again:
pg=> ALTER ROLE test_role LOGIN;
ALTER ROLE
pg=>
로그 출력:
2020-04-09 12:29:29 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: CREATE ROLE test_role NOLOGIN;
2020-04-09 12:30:02 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: show password_encryption
2020-04-09 12:30:02 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: ALTER USER test_role PASSWORD 'md5175cad7c36a640b1fcfa0144056923f5'
2020-04-09 12:30:30 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: ALTER ROLE test_role LOGIN;
관련 정보
Amazon RDS for PostgreSQL 데이터베이스 로그 파일
Amazon RDS 및 Amazon Aurora PostgreSQL 호환 버전 로그를 사용한 작업: 1부
pgaudit 확장을 사용하여 PostgreSQL을 실행하는 Amazon RDS DB 인스턴스를 감사하려면 어떻게 해야 합니까?