Amazon RDS for PostgreSQL がパスワードをクリアテキストでログファイルに記録しないようにする方法を教えてください。

所要時間2分
0

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 ログからパスワードを編集します。

  1. Amazon RDS for PostgreSQL インスタンスの pgaudit を有効にします
  2. カスタムパラメータグループで、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.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'

「\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 インスタンスを監査する方法を教えてください。

コメントはありません

関連するコンテンツ