Bash:檢查是否可以使用 sshpass 在遠端主機上執行 sudo;密碼有多“暴露”?
我正在使用下面的 bash 腳本來測試
sudo
遠端主機上是否可用。我正在從使用者輸入中獲取密碼。我知道(在有限的程度上)在腳本中使用密碼會涉及安全權衡,所以我有一個關於這個特定方面的問題。
請參閱下面的腳本,該腳本使用
sshpass
然後測試使用者是否能夠sudo --stdin --validate
成功執行。為了減少暴露密碼(據我所知?)我選擇使用
sshpass
with-e
而不是-p
,但只是想知道第二部分——該echo \"${SSHPASS}\" | sudo --stdin --validate
行。執行此腳本然後
history
在遠端主機上查看後,無論是在使用者帳戶中還是以 root 身份,我都無法在命令行上看到密碼“回顯”。所以我的問題是:在遠端端這樣的回顯是否會在任何地方暴露密碼(如果是,在哪裡?),還是這種方法低於“相當安全”?
兩端使用者環境為 Ubuntu 18 或 20。
#!/bin/bash # obtain username and host from user input read -p "Enter username@host: " remote # obtain password from user input read -r -s -p "Enter password: " SSHPASS # set password as environment variable for `sshpass` below, it requires this for `-e` export SSHPASS echo echo -n "Testing if can sudo on ${remote}... " if result=$( sshpass -e ssh -o PasswordAuthentication=yes "${remote}" "echo \"${SSHPASS}\" | sudo --stdin --validate" 2>&1 ); then echo "YES!" else echo "FAILED" echo "${result}" fi unset SSHPASS
雖然看起來不像,但密碼實際上暴露在本地和遠端伺服器上。
這兩種情況的原因是它是程序命令行的一部分,
sshpass
或者更隱含bash -c
,如下所述。當您通過 執行命令時
ssh <host> <command>
,命令部分通過 傳遞給登錄 shell-c
。這意味著任何能夠列出程序的使用者都可以看到bash -c "echo "<password>" | sudo --stdin --validate"
。如果您想對其進行測試,那麼
while ! ps aux | grep '[s]udo'; do :; done
與遠端系統中的任何其他使用者一樣簡單應該可以工作。請注意,這是一個活動的等待循環,會導致 CPU 使用率飆升。要解決這個問題,您應該回顯密碼並將其通過管道傳輸到您的 SSH,而不是遠端回顯:
echo "${SSHPASS}" | sshpass -e ssh -o PasswordAuthentication=yes "${remote}" "sudo --stdin --validate" 2>&1
.