首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux ps 命令可見命令行參數:為什麼不建議在命令行傳遞密碼

     編輯:程式設計綜合問答

直接演示

$ sleep 1000 --password=secret123 &
[1] 12345
$ ps -ef | grep sleep
user   12345  1234  0 10:00 pts/0  00:00:00 sleep 1000 --password=secret123

ps 顯示進程的完整命令行參數 (argv),同一台機器上所有用戶 (取決於權限) 均可通過 ps -ef、ps aux、cat /proc/PID/cmdline 看到。

風險場景

場景風險
MySQL 命令行 mysql -pPassword 同機器用戶可見密碼
Java -Dpassword=xxx ps 顯示 JVM 參數
腳本 ./deploy.sh --token=xxx 進程表洩露 Token
Docker ENV PASSWORD=xxx docker inspect 可見

安全替代方案

  1. 標準輸入 (stdin):
    mysql -u root -p < /dev/stdin
    echo "password" | mysql -u root -p  # 仍在歷史記錄,不推薦
    # 推薦:交互式輸入或讀取文件描述符
    
  2. 環境變量 (進程環境表 /proc/PID/environ 同樣可見,但不在 ps 默認輸出):
    export DB_PASSWORD=secret
    mysql -u root -p"$DB_PASSWORD"
    
  3. 配置文件 (權限 600):
    # ~/.my.cnf
    [client]
    password=secret
    # chmod 600 ~/.my.cnf
    
  4. 密鑰管理服務:HashiCorp Vault、AWS Secrets Manager、Azure Key Vault。
  5. 應用層讀取加密文件:啟動時解密內存中使用,不落盤明文。

歷史記錄補充

  • history 僅記錄當前用戶 Shell 會話命令。
  • ps 顯示**所有用戶**的**當前運行進程**參數,實時性更強、範圍更廣。
  • 進程結束後 ps 不再顯示,但審計日志 (auditd) 可能已記錄 execve 參數。

最佳實踐原則

敏感信息永不以命令行參數形式傳遞給進程。 採用「配置文件 + 文件權限控制」或「環境變量 + 進程隔離」或「密管平台」三種模式之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved