匿名パイプの権限をどのように変更しますか?

匿名パイプの権限をどのように変更しますか?

パブリックストアにプライベートファイルを保持しないように、CI環境のスクリプトの一部として変数からSSHキーをロードするスクリプトがありますが、ssh-add権限エラーについて文句を言います。周りを見渡せないようです。)。だから私のアプローチは、動的に生成された匿名パイプの権限を変更する方法を見つけることでした。

たとえば、

$ stat <(:)
  File: ‘/dev/fd/63’
  Size: 0           Blocks: 0          IO Block: 512    fifo
Device: 397f3928h/964639016d    Inode: 818277067   Links: 0
Access: (0660/prw-rw----)  Uid: (  501/  kenorb)   Gid: (   20/   staff)
Access: 2015-10-10 22:33:30.498640000 +0100
Modify: 2015-10-10 22:33:30.498640000 +0100
Change: 2015-10-10 22:33:30.498640000 +0100
 Birth: 2015-10-10 22:33:30.498640000 +0100

権限を表示します0660。私は確認してみましたが、umaskあまり関係はないようです。

これは簡単なテストです(デフォルトではOS X、0660)。

$ ssh-add <(cat ~/.ssh/id_rsa)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0660 for '/dev/fd/63' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

0500Linuxではデフォルトで動作しているようです。この権限はどこで制御されますか?

明らかに、匿名パイプを使用したいので、ファイルの権限を変更したくありません。

問題は次のとおりです。

パイプの権限を一時的に変更する方法は?

答え1

これまで、名前付きFIFOを使用して次の解決策を見つけました。

$ mkfifo -m 600 fifo
$ cat ~/.ssh/id_rsa >fifo | ssh-add fifo
Identity added: fifo (fifo)

このオプションは-mFIFO権限を設定します。

答え2

パスまたはファイル記述子で操作を実行するssh-addプログラムでそれらをカプセル化できます。chmod/dev/fd/Nfchmod

たとえば、Linux システムでは、ssh-add基本権限の使用に関する苦情は受け付けられず、次のようにエラーを再現できました。

perl -e 'chmod 0777, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

問題を再現すると問題が解決します。

perl -e 'chmod 0600, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

chmod同様のパス名が提供されますが、/proc/self/fd/11実際のパイプinodeの権限が変更されます(chmodがシンボリックリンクで機能しないため)。これは同じ効果を持つはずですが、fchmodを使用するだけです。

perl -e 'open P, "<", $ARGV[0]; chmod 0600, \*P;close P;exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

これは、fchmodを使用し、さらに開くことを避けるために、パス名が予測可能な形式であるという事実を利用して同じ効果を持つ必要があります。

perl -e '$ARGV[0] =~ m,^(?:/proc/self|/dev)/fd/(\d+)\z, and $^F=$1 and open P, "<&=$1" and chmod 0600, \*P;exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

これらのPerlスクリプトはCプログラムほど見苦しくありません。ターゲット環境に適したものが何であるかを決定したら、変換するのは簡単です。

関連情報