如何通过 SSH 安全传输密码以供远程命令使用

如何通过 SSH 安全传输密码以供远程命令使用

在本地服务器上,我有一个程序将密码存储在预定义的环境变量(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是一个 java 程序,它从System.in.

它就像一个魅力。

答案1

它可由remote_user和读取root。没有别的,除非remote_command将其写入全局可读文件或类似的文件。

/proc您可以检查文件系统中进程的环境/proc/$pid/environ。您要么需要与euidof是同一用户$pid,要么需要是root,因为该文件的权限似乎默认为-r-- --- ---

除了使用环境之外,您还可以通过stdin管道传递密码 via ssh。如果您通过管道进入 ssh,据我所知,只有 root 和目标程序(及其子程序)才能访问它(假设$(cat /proc/sys/kernel/yama/ptrace_scope) == 1)。

相关内容