2014年12月18日木曜日

luksパスフレーズ入力を自動化 (2枚目SoftLayer Advent Calendar 2014 第18日目)

2枚目 SoftLayer Advent Calendar 2014 (http://qiita.com/advent-calendar/2014/softlayer2) の第18日目になります。


前回、前々回で、ルートパーティション暗号化後、起動時に必要となるパスフレーズ入力をリモートから ssh で接続しパスフレーズを入力することで、コンソール操作を不要にしました。しましたが、この部分も自動化したくなるのが自然の成りゆきです。セキュリティ対策も大事ですが、利便性が失われすぎると使われなくなってしまいます。
単体では無理 (暗号化した意味がなくなる) ですが、パスフレーズ送信専用サーバを作り、そちらからパスフレーズ入力を自動化することにします。


パスフレーズ送信専用サーバの安全をどう守るかについては述べません。
セキュアな Linux サーバが用意できたところからの説明となります。
root での操作例を示します。

まず、公開暗号鍵を作成します。秘密鍵のファイル名、パスワードは空のままエンターキーを押します。秘密鍵の管理は厳重に行ってください。公開鍵の漏えいは問題ないことになっています。


ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
4f:54:9e:a3:35:72:fd:7c:35:86:f8:ff:98:72:aa:fc root@key.example.com
The key's randomart image is:
+--[ RSA 2048]----+
|            .    |
|           o.o.  |
|          o.B..o.|
|         . =.o.oo|
|        S o  .  +|
|         o    . .|
|          .    . |
|         .  . .o.|
|          ooE+o .|
+-----------------+


作成された公開鍵を、パスフレーズ入力する必要があるサーバ (10.123.45.6 で例示) へコピーし、初期 RAM ディスクに組み込みます。カーネルバージョン等は読み替えてください。


scp -p .ssh/id_rsa.pub 10.123.45.6:/usr/share/dracut/modules.d/40earlyssh/authorized_keys
The authenticity of host '10.123.45.6 (10.123.45.6)' can't be established.
RSA key fingerprint is 0e:e4:e6:17:f4:3c:52:92:54:dc:6e:27:b2:7e:20:34.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.123.45.6' (RSA) to the list of known hosts.
root@10.123.45.6's password: ********
id_rsa.pub                                    100%  402     0.4KB/s   00:00

ssh 10.123.45.6 mkinitrd --force /boot/initramfs-2.6.32-504.el6.x86_64.img 2.6.32-504.el6.x86_64
root@10.123.45.6's password: ********


パスフレーズを送信するスクリプトを cron に組み込み、1分おきに起動します。


OLD_UMASK=$(umask)
umask 0077
mkdir -p /etc/cron.minutely

cat << 'EOF' | tee /etc/cron.d/0minutely
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
* * * * * root run-parts /etc/cron.minutely
EOF

cat << 'EOF_' | tee /etc/cron.minutely/10.123.45.6
#!/bin/sh
ssh -o "StrictHostKeyChecking no" -p 222 root@10.123.45.6 luks << 'EOF' > /dev/null 2>&1
******** ******** ******** ********
EOF
:
EOF_
chmod 700 /etc/cron.minutely/10.123.45.6

umask $OLD_UMASK


※ 事前に手動で 10.123.45.6:222 へ ssh 接続し、ホスト公開鍵を known_hosts へ登録しておくと、「-o "StrictHostKeyChecking no"」 オプションを外せるのでよりセキュアになります。「-i 秘密鍵」 オプションを追加しておくと、複数の公開鍵への対応ができるようになります。

動作確認のため、パスフレーズ入力する必要があるサーバを再起動します。


ssh 10.123.45.6 reboot
root@10.123.45.6's password: ********


自動的に再起動されれば成功です。

0 件のコメント:

コメントを投稿