FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

ESXi6.5でOS再起動時に公開鍵が消える問題の対処方法

コンテンツ・メディア第1事業部インフラ課の橋本です。

弊社では仮想サーバをオンプレ環境で構築するための基盤(ホスト)OSとして、一部ではESXiを利用しています。

概ね便利に使えるESXiサーバには、困った特徴というか仕様がありまして、/etc 以下であるとか /bin 以下の階層に配置したファイルが、OS再起動時に初期化(クリア)されてしまいます。

接続を便利にしてくれる公開鍵なんかも、ESXiサーバを再起動するたびに消えてしまいます。

/etc/ssh/keys-●●/authorized_keys

●●は接続ユーザ名。公開鍵(hoge.pub)をauthorized_keysという名前にして配置しておくと動作する。
たとえばrootで接続したい場合は/etc/ssh/keys-root/authorized_keysとなる。見事に/etc階層下である。

そして、以前のESXi(バージョン5.5や6.0において)で使えたいくつかの対処法は、検証した限りでは使えなくなっています。(そればかりか、再起動時にパープルスクリーンで固まってしまい、OSが起動しなくなったりさえします。なんということでしょう!)

そのため、今回ご紹介する対処方法も、これまでの方法と同様にバージョン互換性がない可能性が大いに有り得ます。具体的にはESXi6.5以外のバージョンで使えるという保障はございません。あらかじめ、ご了承いただきたく思います。

追記:ESXiの新バージョン(6.7以降?)では、このディスククリアを無効化する設定が追加されるそうです! やった……!!

対処方法

「そもそも消されないようにする」というのが実現困難でしたので、今回は「再起動時に配置しなおす」というアプローチです。

大まかな手順はふたつです。

ひとつめ、鍵をバックアップする。

ふたつめ、再起動時に展開されるようにする。

公開鍵のバックアップをとる

以下はEXSiサーバ上での操作です。sshなどで接続します。

まずは、公開鍵ファイルをバックアップするスクリプトを用意しましょう。

#!/bin/sh
  
cd /
main()
{
   local files_to_save=
 
   if [ ! -d /bootbank ] ; then
       esxcfg-init --alert "Bootbank cannot be found at path '/bootbank'"
       exit 1
   fi
 
   files_to_save=$(find /etc -follow -type f -name 'authorized_keys' 2>/dev/null |
                   sed -e 's,^/,,'  |
                   while read name ; do [ -f "${name}" ] && echo "${name}" ; done;
                   echo "bin/keys-backup.sh")
 
   tar cfz /bootbank/sshkeys.tgz -C / ${files_to_save}
}
 
main "${@}"

13〜16行目にあたる部分で、authorized_keys をリストアップし、tarで固めています。

ここで、16行目でbin/keys-backup.sh(このスクリプト自身)をも含めているのは、このスクリプトを/binに配置しているので再起動によって容赦無く消されるためですむごい。

authorized_keysではなく、自前のスクリプトや他のファイルを保持しておきたいという場合は、この13行目〜16行目の探索条件を調整してみてくださいね。

なお、tarで圧縮する際は相対パスで指定するようにお気をつけください。

絶対パスで指定すると、展開時にも絶対パスで展開されるので、えらい目に遭うことがあります。

上記スクリプトで、わざわざ3行目に cd / の後、14行目で相対パスに直してアーカイブしているのは、そのためです。

次に、実行権限をつけておきます。

chmod +x /bin/keys-backup.sh

keys-backup.sh を実行すると、/bootbank/sshkeys.tgzが出来ているはずです。

念のため、アーカイブの中身を確認してみましょう。

tar tfz /bootbank/sshkeys.tgz

authrized_keys 各種とkeys-backup.shがアーカイブされていれば成功です。

新しくauthrized_keysを配置したときには、併せてkeys-backup.shを実行するようにしましょう。

再起動時にアーカイブを展開させる

あと少しです。再起動時にsshkeys.tgzを展開するように仕込みを行います。

cd /
tar xfz /bootbank/sshkeys.tgz

exit 0

/etc/rc.local.d/local.sh はEXSi6.5ではもともと配置されているファイルです。

ファイル内に

# Note: modify at your own risk!

と記述がありますように、運用にはご注意ください。

このファイルのexit 0の前に、1, 2行目の内容を挿入しておきます。

これで、再起動が完了後に/bootbank/sshkeys.tgzが展開されるようになります。

/bin/auto-backup.sh にも似たような仕組みがもともと存在するのですが、拡張を意図されていない既存のコードはなるべく変更を加えたくないなぁ……という思いから、今回は別のスクリプトで手動実行する方式としています。