如何防止 Amazon RDS for PostgreSQL 將我的密碼以純文字形式記錄在日誌檔案中?
我想要使用 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 執行 CREATE USER 或 ALTER USER 陳述式。當我執行此操作時,PostgreSQL 會將我的密碼以純文字形式記錄在日誌檔案中。
簡短說明
您可以將 log_statement 參數設為 ddl 或 all,然後執行以下其中一個命令:
- 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、role、write 和 read。
**注意:**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.log 和 log_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 資料庫日誌檔案
相關內容
已提問 3 年前
已提問 2 年前
已提問 2 年前
