Amazon RDS for PostgreSQL에서 비밀번호를 로그 파일에 일반 텍스트로 기록하지 않도록 하려면 어떻게 해야 하나요?

3분 분량
0

PostgreSQL용 Amazon Relational Database Service(RDS)를 사용하여 CREATE USER 또는 ALTER USER 명령문을 실행하고 싶습니다. 이렇게 하면, PostgreSQL이 내 비밀번호를 로그 파일에 일반 텍스트로 기록합니다.

간략한 설명

log_statement 매개 변수를 ddl 또는 모두로 설정한 후 다음 명령 중 하나를 실행할 수 있습니다.

  • 역할/사용자 생성... 비밀번호로...;
  • 역할/사용자 변경... 비밀번호로...;,

이렇게 하면, PostgreSQL은 PostgreSQL 로그에 항목을 생성합니다. PostgreSQL은 암호를 일반 텍스트로 기록하므로 잠재적인 보안 위험이 발생할 수 있습니다.

PostgreSQL은 민감한 정보를 식별하지 않습니다. 이는 예상된 동작이며 PostgreSQL 엔진 설계에 따른 것입니다.

이 예제에서는 암호를 사용하여 역할 생성문을 실행한 다음, 로그에 암호를 일반 텍스트로 표시합니다.

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'

이 예제에서는 암호를 사용하여 역할 변경문을 실행한 다음, 로그에 암호를 일반 텍스트로 표시합니다.

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 로그에서 비밀번호를 삭제할 수 있습니다.

  1. Amazon RDS for PostgreSQL 인스턴스에 대해 pgaudit를 활성화하세요.
  2. 사용자 지정 파라미터 그룹에서 pgaudit.log 파라미터를 설정하여 기록하려는 명령문 클래스를 지정합니다. 이 매개변수는 DDL, 역할, 쓰기, 읽기 등의 여러 값을 취합니다.

**참고:**pgAudit.log='DDL'과 log\ _Statement='DDL'의 주요 차이점은 pgaudit과 DDL은 포스트그레스 로그에 CREATE/ALTER ROLE 쿼리를 기록하지 않는다는 것입니다.

역할 생성/변경 로그를 기록하려면 pgaudit.log에 역할을 추가합니다. 이렇게 하면 비밀번호가 삭제됩니다.

로그 출력:

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.loglog_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'

\암호 명령 사용

PostgreSQL을 사용하는 경우, PostgreSQL 클라이언트에 내장된 \password 함수를 사용할 수 있습니다. 기존 역할 암호를 만들거나 변경할 때, 새 암호를 입력하라는 메시지가 표시됩니다. PostgreSQL은 암호에 대한 해시만 기록합니다.

**참고:**이 솔루션은 Postgres 로그에도 암호 해시를 표시하지만, 일반 텍스트로 기록하지는 않습니다.

\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 인스턴스를 감사하려면 어떻게 해야 하나요?

댓글 없음