跳至內容

如何防止 Amazon RDS for PostgreSQL 將我的密碼以純文字形式記錄在日誌檔案中?

2 分的閱讀內容
0

我想要使用 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 執行 CREATE USER 或 ALTER USER 陳述式。當我執行此操作時,PostgreSQL 會將我的密碼以純文字形式記錄在日誌檔案中。

簡短說明

您可以將 log_statement 參數設為 ddlall,然後執行以下其中一個命令:

  • 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 日誌中遮蓋您的密碼。

  1. 為您的 Amazon RDS for PostgreSQL 執行個體開啟 pgaudit
  2. 在您的自訂參數群組中,設定 pgaudit.log 參數,以指定您要記錄的陳述式類別。此參數接受多個值,例如 DDLrolewriteread

**注意:**pgaudit.log='DDL' 與 log_statement='DDL' 之間的主要差異在於,pgaudit 的 DDL 不會在 postgres 日誌中記錄任何 CREATE/ALTER ROLE 查詢。

將 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 設為「none」(無)

若要讓 PostgreSQL 完全不記錄此作業,請在交易區塊內於工作階段層級將 log_statement 參數設為 none (無)。

**注意:**當 pgaudit.loglog_statement 都設為 DDL 時,則必須在工作階段層級將 log_statement 設為 none (無)。

範例:

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 資料庫執行個體?

AWS 官方已更新 3 年前