ふと、秘密鍵を分割して別々のとこに置いておき、それをsshコマンド実行時だけ結合させて利用できないかと思ったのでやってみた。 まず、事前に秘密鍵を以下のようなコマンドで暗号化、分割しておく。 (ここでは、秘密鍵ファイル「testkey」を「testkey.aa」~「testkey.ac」に分割している)
cat testkey | openssl enc -aes-128-cbc -e -base64 -pass pass:パスワード | split -l 12 - testkey.
[root@BS-PUB-CENT7-01 ~]# cat testkey | openssl enc -aes-128-cbc -e -base64 -pass pass:P@ssw0rd | split -l 12 - testkey.
[root@BS-PUB-CENT7-01 ~]# ls -la testkey.a*
-rw-r--r--. 1 root root 780 12月 29 08:58 testkey.aa
-rw-r--r--. 1 root root 780 12月 29 08:58 testkey.ab
-rw-r--r--. 1 root root 740 12月 29 08:58 testkey.ac
で、接続時に以下のようにsshコマンドを実行してみる。
[root@BS-PUB-CENT7-01 ~]# ssh -i <(cat testkey.a* | openssl enc -d -aes-128-cbc -base64 -pass pass:P@ssw0rd) root@BS-PUB-CENT7-02
Warning: Identity file /dev/fd/63 not accessible: No such file or directory.
root@bs-pub-cent7-02's password:
…ありゃ。 sshコマンドではプロセス置換で鍵ファイルは渡せないみたいだ。 であれば、「/dev/stdin」を指定してやればいけるかな?
[root@BS-PUB-CENT7-01 ~]# cat testkey.a* | openssl enc -d -aes-128-cbc -base64 -pass pass:P@ssw0rd | ssh -i /dev/stdin root@BS-PUB-CENT7-02
Pseudo-terminal will not be allocated because stdin is not a terminal.
Enter passphrase for key '/dev/stdin':
これもだめかー…。 そもそも、ここを見てるとsshコマンドでは鍵ファイルを複数回開いてるみたいだ。 つまり、一回こっきりしか利用できない標準出力での取得やプロセス置換では、2回目以降の鍵取得でこけてしまうためうまくいかないということか。
ではどうするか。 かなりムリヤリだけど、mktempでパーミッション700の一時ファイルを作成して、作業終了後にそれを削除させるという方法ならうまくいった。 (これ、ワンライナーって言えんのかなぁ…)
sh -c 'TEMP=$(mktemp);cat testkey.a* | openssl enc -d -aes-128-cbc -base64 -pass pass:P@ssw0rd > $TEMP;trap "{ rm -rf $TEMP }" 1 2 3 15;bash -c "ssh -i $TEMP root@対象サーバ";rm -rf $TEMP'
うーん… 鍵ファイルを複数回読み込みさえなければプロセス置換でいけたのだけど、こればかりはしょうがないかな…