Linux

使用 SSH 將本地文本文件中的字元串安全地管道傳輸到遠端命令

  • January 26, 2019

以下發生在 Ubuntu 18 上。

我需要使用 SSH 使用儲存在本地電腦上的文件中的密碼來自動**遠端播種 a 。gpg-agent

密碼片語需要以這樣的方式處理,以便其他愛管閒事的使用者無法輕易查看它 - 主要是在遠端伺服器上,但它在本地機器上也應該是安全的。

問題是一般問題,而不是特定於 GPG - 如何將字元串安全地傳遞到遠端伺服器上執行的程序中ssh

我知道在命令行上輸入密碼意味著ps -ef在本地(ssh)和遠端機器(bash -c)上都可以看到。所以我必須避免這種情況。

我也知道將密碼儲存在環境變數中意味著程序的初始環境可以被視為cat /proc/<pid>/environ並且gdb可以用於查看目前狀態。因此,如果本地環境變數被轉發,則可以在本地機器或遠端機器上看到詳細資訊。所以這並不理想,特別是因為我無法嚴格控制其他人對遠端機器上的 SSH 使用者帳戶的訪問。

經過一些閱讀和實驗後,我想出了以下內容 - 它確實有效!您可以假設在本地伺服器seed.txtchmod 400沒有 root 訪問權限的人,該文件是安全的(或至少與我的 SSH 密鑰一樣安全)。

注意 -seed.txt不存在於遠端伺服器上,僅存在於本地伺服器上,所以它的內容必鬚髮送到遠端伺服器上。

SSH 連接使用密鑰,因此不需要密碼。

#!/bin/bash
ssh -T my-server <<EOSSH > /dev/null
printf '%s\n' "$(cat seed.txt)" | /usr/lib/gnupg2/gpg-preset-passphrase -c 123456789
EOSSH

在本地機器上使用ps -ef只會產生ssh -T my-server,因為要遠端執行的實際命令通過管道傳輸到標準輸入,而不是使用ssh命令行。

同樣,cat命令行僅顯示文件名。 printf,我相信,是一個內置命令,所以不會出現在ps. 我相信printf正在遠端機器上執行?

在遠端伺服器ps上只會顯示/usr/lib/gnupg2/gpg-preset-passphrase -c 123456789密碼片語再次使用標準輸入管道輸入。

我沒有直接使用環境變數,所以這裡不應該有任何問題。我有點擔心SSH環境變數會暴露一些東西?

我的問題是 - 我的方法是否明智/簡單/安全(假設 root 訪問權限沒有受到損害),是否有任何明顯的問題,如果是,建議的解決方法是什麼?

我設法開始工作的唯一其他選項是使用expect,但考慮到兩者ssh,並且gpg-preset-passphrase似乎很樂意接受輸入作為標準輸入而不是互動方式,使用它似乎有點過頭了expect

更新

下面的一些非常有用的答案,謝謝!我想得越多,我就會稍微重新建構這個問題——也許我必須接受,如果其他使用者確定了,那麼來自該帳戶的其他使用者的單個 Linux 帳戶中的圍欄內容總是無法實現的?這似乎通常是正確的邏輯前提,但是如果我想為(該帳戶的)其他使用者啟動一個(每個帳戶)gpg-agent,而他們無法訪問憑據來自己進行實際的啟動(gpg-我認為代理始終是每個使用者?),我必須從帳戶本身中執行此操作,對嗎?如果同一帳戶的使用者無法在我正在做的事情上達到頂峰,我該如何做到這一點……簡短的答案似乎是 - 你可以讓他們難以達到頂峰,但可能永遠不可能?據我所見,播種gpg-agent不能從另一個帳戶使用另一個帳戶的使用者?

printf``sh根據遠端系統的不同,可能不是內置的。在 Linux 上將其作為內置 ( ) 執行,bash而在 OpenBSD 上則沒有。更大的擔憂是“我無法嚴格控制其他人對遠端機器上 SSH 使用者帳戶的訪問”;那些使用者(具有足夠的技能)可以在沒有 root 訪問權限的情況下做一些頑皮的事情:dash``echo 'printf --version' | ssh host``sh

  • 如果有並且他們知道您的公鑰,他們可以通過文件command="..."中的條目執行其他東西~/.ssh/authorized_keys
  • bash``printf即使使用-and- cat-free形式也會讀取 shell rc 文件,ssh host < seed.txt command因此它們可以export LD_PRELOAD=/something/naughty.so並且該庫可能會在其他地方複製標準輸入,或者在嘗試執行某些東西時做一些有趣的事情gpg-preset-passphrase

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