Bash

如何通過 SSH 安全地傳輸密碼以供遠端命令使用

  • June 15, 2015

在本地伺服器上,我有一個程序將密碼儲存在預定義的環境變數 ( SPECIAL_PASSWORD) 中。

在遠端伺服器上,我有一個程序從預定義的環境變數 ( SPECIAL_PASSWORD) 中讀取和使用密碼。

我想在遠端伺服器上執行程序並提供已經在我的本地環境中設置的密碼。

我的嘗試如下所示:

local_command # produces the SPECIAL_PASSWORD Env Var
ssh -l remote_user remote_server <<EOSSH
export SPECIAL_PASSWORD=${SPECIAL_PASSWORD} # Transfer Env Var
remote_command # consumes SPECIAL_PASSWORD Env Var
EOSSH

它似乎也按預期工作:

  1. Unixps似乎沒有洩露密碼
  2. 只有目前程序或其子程序才能訪問密碼。

但是這樣做真的安全嗎……密碼在任何時候都可讀嗎?有更好的選擇嗎?

我可能會更改sshd_config( AcceptEnv) 和ssh_config( SendEnv) 以允許在沒有上述技巧的情況下傳輸環境變數的子集。但是,系統受到嚴格控制,並且 sshd_config 需要管理員干預。就我而言,似乎不可能更改sshd_config.

更新

我正在使用通過將數據管道傳輸到遠端 ssh 命令來提供的不同解決方案。請注意,此語法不再與 HERE 文件結合使用。

sendEnv() {
 echo "var1=${var1}"
 echo "var2=${var2}"
 ...
}

sendEnv | ssh -l remote_user remote_server "receiving_command".

在我的例子中,這receiving_command是一個從System.in.

它就像一個魅力。

remote_user它可以被and讀取root。沒有其他,除非remote_command將其寫入全域可讀文件或類似文件。

您可以/proc/proc/$pid/environ. 您要麼需要是與 of 相同的使用者,euid要麼$pid需要是root,因為該文件的權限似乎預設為-r-- --- ---.

除了使用環境之外,您還可以通過stdin管道將密碼傳遞到ssh. 如果您通過管道進入 ssh,據我所知(假設),只有 root 和目標程序(以及它的子程序)才能訪問它$(cat /proc/sys/kernel/yama/ptrace_scope) == 1

引用自:https://unix.stackexchange.com/questions/206215