私たちのチームはいくつかの秘密鍵を共有して保存する必要があります。渡すリポジトリ。
したがって、キーを抽出してファイルシステムにプレーンテキストとして保存するのではなく、復号化されたバージョンのみをメモリにしばらく保持する方法を探しています。
$ sftp -i <(pass foo) user@host
Warning: Identity file /dev/fd/63 not accessible: No such file or directory.
sftpがなぜ一時ファイル記述子を読み取れないのか知っていますか?どうすれば修正できますか?
ベストアンサー1
sftp
一時ファイル記述子を読み取れないのはなぜですか?
いくつかの事実:
- プロセス
<(pass foo)
置換によってbash
パイプが生成され、コマンドが非同期的に実行され、その出力がパイプの書き込み端に接続され、パイプの読み取り端を参照するファイル記述子を持つ形式のパスに置き換えられますpass foo
。<(...)
/dev/fd/63
63
- これは
/dev/fd/63
、プロセスがstat()
そのファイル記述子の1つが参照するファイルを再度開くことを可能にする特別なパスです。 - シェルは +execs を分岐し、それ自体
sftp
でsftp
分岐と execs をssh
実行し、63
ファイル記述子を継承を通じて渡します。 ssh
〜するすべてのファイル記述子を閉じます。この機能を使用すると、0、1、2を除外しますclosefrom()
。 fdも閉じます63
。
63
これはプロセスの開かれたファイル記述子ではないssh
ため、OPのエラーによりstat()
onが失敗します。/dev/fd/63
どうすれば修正できますか?
キーをメモリ内ファイルシステムに一時保存します。私のDebiansystemd
でtmpfsを提供しました。/run/user/<myUID>
。マウントポイントは私(もちろんルートを含む)以外は誰にもアクセスできません。
このファイルは、ユーザー(またはルート)で実行されている悪意のあるプロセスから読み取られる可能性があります。ただし、これらのプロセスはsshd
元の方法でファイル記述子から読み取ることもできます。63
または、セキュリティtmpfsが利用できない場合:
一時FIFOを生成します。この操作は
mktemp
直接行うことはできません。安全なアプローチは、一時的な個人アカウントを作成することです。目次それmkfifo
から。FIFO自体の権限が狭いことを確認してください。それ以外の場合は
ssh
エラーが報告されます。走る
sftp -i "/temp_dir/the_fifo" user@host
並列に実行します
pass foo > "/temp_dir/the_fifo"
。 1つの珍しい点:やるべきこと二重;私のDebianでキーを少なくとも2回読んでくださいssh
。私のテストでは、次のコマンドが機能しているようです。cat ~/.ssh/id_rsa > "/temp_dir/the_fifo" && cat ~/.ssh/id_rsa > "/temp_dir/the_fifo"
。同様の繰り返しコマンドが役に立ちます。pass foo > "/temp_dir/the_fifo" && pass foo > "/temp_dir/the_fifo"
以前はバックグラウンドで実行できます
sftp
(pass
対話的に使用しない限り、そのツールにはまったく慣れていません)。最後に、fifoとディレクトリを削除します。
それにもかかわらず、ユーザー(またはルート)で実行される悪意のあるプロセスはまだssh
FIFOからデータを最初に読み取ることができます。