PostgreSQL 用 Amazon Relational Database Service (Amazon RDS) を使用して CREATE USER ステートメントまたは ALTER USER ステートメントを実行したいと考えています。これを行うと、PostgreSQLはパスワードをクリアテキストでログファイルに記録します。
簡単な説明
log_statement パラメータを ddl または all に設定し、次のコマンドのいずれかを実行できます。
- ロール/ユーザーの作成...パスワード付き...;
- ロール/ユーザーの変更...パスワード付き...;,
これを行うと、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 は postgres ログに CREATE/ALTER ROLE クエリを一切記録しないことです。
pgaudit.log にロールを追加して、CREATE/ALTER 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 はパスワードのハッシュのみをログに記録します。
**注:**このソリューションでは、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 インスタンスを監査する方法を教えてください。