mount.cifs は、パスワード検証に PASSWD 変数を使用できます。
次の例は問題を示しています。
export PASSWD=mysecret; ssh foreignhost "echo $PASSWD"
有効です。つまり、環境変数 PASSWD の値が表示されます。素晴らしい、
export PASSWD=mysecret; ssh foreignhost "mount -t cifs //server/path /mnt -o username=myuser"
パスワードを尋ねる
export PASSWD=mysecret; ssh foreignhost "PASSWD=$PASSWD mount -t cifs //server/path /mnt -o username=myuser"
パスワードは必要ありませんが、認証には PASSWD 値が使用されます。しかし、なぜ?セキュリティの問題は、パスワードがプロセスリストにプレーンテキストで表示されることです。
答え1
export PASSWD=mysecret; ssh foreignhost "echo $PASSWD"
PASSWD
これは、ローカルシェル(およびローカルシェルによって開始された子プロセスの環境)でシェル変数を設定します。次にecho mysecret
コマンドを実行しますforeignhost
。ローカルシェルは二重引用符の間のテキスト"echo $PASSWD"
に対して変数拡張を実行します。パスワード文字列はリモートシェルのコマンドラインに表示されるため、プロセスリストに表示されます。
export PASSWD=mysecret; ssh foreignhost "mount -t cifs //server/path /mnt -o username=myuser"
PASSWD
これは、ローカルシェル(クライアントプロセスを含むローカルシェルによって開始された子プロセスの環境)にシェル変数を設定しますssh
。クライアントとサーバーの構成によっては、SSHクライアントは特定の環境変数をサーバーに送信でき、サーバーはそれを受け入れたり受け入れたりしないことがあります。通常、ユーザー(またはディストリビューション)がSSHクライアントから送信するように設定されていない限り、許可された環境変数(ローカル変数LANG
と特別な処理を受ける変数をLC_*
含む)だけがSSHを介して渡されます。 SSHサーバーが許可し、リモートシェルに環境変数が設定されていません。TERM
PASSWD
PASSWD
PASSWD
export PASSWD=mysecret; ssh foreignhost "PASSWD=$PASSWD mount -t cifs //server/path /mnt -o username=myuser"
最初の場合と同様に、リモートシェルコマンドにはパスワード(PASSWD=mysecret mount …
)があるため、プロセスリストに表示されます。
多くのディストリビューションでは、名前が一致するすべての環境変数を送信および受け入れるように SSH を構成するため、LC_*
独自の環境変数を定義してデータを渡すことができます。
LC_ENV_PASSWD=mysecret ssh foreignhost 'export PASSWD="$LC_ENV_PASSWD"; mount …'
パラメータの周囲に一重引用符がありますssh
。このように、リモートホストで実行されるシェルコマンドはexport PASSWD="$LC_ENV_PASSWD"; mount …
パスワードが含まれていません。
または、標準入力を介してパスワードを渡します。
echo mysecret | ssh foreignhost 'IFS= read -r PASSWD; export PASSWD; mount …'