bashプロセスを使用してsftp秘密鍵ファイルを置き換える方法は?

bashプロセスを使用してsftp秘密鍵ファイルを置き換える方法は?

私たちのチームはいくつかの秘密鍵を共有して保存する必要があります。渡すリポジトリ。

したがって、キーを抽出してファイルシステムにプレーンテキストとして保存するのではなく、復号化されたバージョンのみをメモリにしばらく保持する方法を探しています。

$ 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/6363
  • これは/dev/fd/63、プロセスがstat()そのファイル記述子の1つが参照するファイルを再度開くことを可能にする特別なパスです。
  • シェルは +execs を分岐し、それ自体sftpsftp分岐と 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が利用できない場合:

  1. 一時FIFOを生成します。この操作はmktemp直接行うことはできません。安全なアプローチは、一時的な個人アカウントを作成することです。目次それmkfifoから。

  2. FIFO自体の権限が狭いことを確認してください。それ以外の場合はsshエラーが報告されます。

  3. 走る

    sftp -i "/temp_dir/the_fifo" user@host
    
  4. 並列に実行します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"
    

    以前はバックグラウンドで実行できますsftppass対話的に使用しない限り、そのツールにはまったく慣れていません)。

  5. 最後に、fifoとディレクトリを削除します。

それにもかかわらず、ユーザー(またはルート)で実行される悪意のあるプロセスはまだsshFIFOからデータを最初に読み取ることができます。

おすすめ記事