Networking

Bash:檢查是否可以使用 sshpass 在遠端主機上執行 sudo;密碼有多“暴露”?

  • March 13, 2022

我正在使用下面的 bash 腳本來測試sudo遠端主機上是否可用。

我正在從使用者輸入中獲取密碼。我知道(在有限的程度上)在腳本中使用密碼會涉及安全權衡,所以我有一個關於這個特定方面的問題。

請參閱下面的腳本,該腳本使用sshpass然後測試使用者是否能夠sudo --stdin --validate成功執行。

為了減少暴露密碼(據我所知?)我選擇使用sshpasswith-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.

引用自:https://serverfault.com/questions/1033657