$ 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 可見 |
mysql -u root -p < /dev/stdin
echo "password" | mysql -u root -p # 仍在歷史記錄,不推薦
# 推薦:交互式輸入或讀取文件描述符
/proc/PID/environ 同樣可見,但不在 ps 默認輸出):
export DB_PASSWORD=secret
mysql -u root -p"$DB_PASSWORD"
# ~/.my.cnf
[client]
password=secret
# chmod 600 ~/.my.cnf
history 僅記錄當前用戶 Shell 會話命令。ps 顯示**所有用戶**的**當前運行進程**參數,實時性更強、範圍更廣。ps 不再顯示,但審計日志 (auditd) 可能已記錄 execve 參數。敏感信息永不以命令行參數形式傳遞給進程。 採用「配置文件 + 文件權限控制」或「環境變量 + 進程隔離」或「密管平台」三種模式之一。