Linuxコンソール上で秘密鍵を分割しておいてsshコマンド実行時に複合化+ログインを行う
Pocket

ふと、秘密鍵を分割して別々のとこに置いておき、それを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
Sponsored Links

で、接続時に以下のように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'

 

うーん…
鍵ファイルを複数回読み込みさえなければプロセス置換でいけたのだけど、こればかりはしょうがないかな…

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*