「保護されていない通信」警告を解消:ACMEを使用してVMware ESXiにLet’s Encryptを導入する方法

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

なぜブラウザの赤い警告を放置し続ける必要があるのでしょうか?

ESXiを長年使っている方なら、ログインするたびに表示される赤い斜線の入った鍵アイコンに見覚えがあるはずです。見慣れてしまったとはいえ、NET::ERR_CERT_AUTHORITY_INVALIDエラーは、自動化や監視システムの統合において非常に厄介です。筆者も以前、8台のESXiホストを管理し始めた当初は「内部ネットワークだから大丈夫だろう」と見過ごしていました。しかし、自己署名(セルフサイン)証明書は、LAN内に侵入された場合、中間者攻撃(MitM)の隙を与えることになります。

最近のブラウザはセキュリティに対してますます厳しくなっています。「本物の」証明書を導入することで、システムがプロフェッショナルに見えるだけでなく、API呼び出しもスムーズになります。高価な証明書を購入する代わりに、ACMEプロトコルを使用してLet’s Encryptを完全無料で利用する方法を紹介します。発行から更新まで、すべてを自動化します。

ツールの準備

ESXiはBusyBoxベースで動作しているため、スクリプトをホストに直接インストールするのは得策ではありません。ファームウェアのアップデートや再起動のたびにスクリプトが消去される可能性があるからです。最善の解決策は、中間マシン(UbuntuやDebianのVM)を使用して証明書取得スクリプトを実行し、それを SSH経由でESXiに転送する方法です。

1. 管理用マシンにACME.shをインストールする

Linuxの中間マシンにacme.shをインストールします。これは現在、Let’s Encryptを扱うための最も軽量で強力なツールです。

curl https://get.acme.sh | sh -s [email protected]
source ~/.bashrc

2. ESXiのアクセス許可設定

まず、ESXiホストでSSHを有効にします。Manage > Services > TSM-SSH に移動し、Start をクリックします。また、ホストのIPを指すDNSレコード(Aレコード)を作成しておくことを忘れないでください(例:esxi01.yourdomain.com)。

証明書の発行とデプロイの設定

ESXiホストは通常、安全なゾーンに配置されポート80が開放されていないため、DNS-01チャレンジを使用します。この方法は、TXTレコードを通じてドメインの所有権を検証するもので、手間がかからず安全です。

ステップ 1: DNSプロバイダーのAPI接続

レコードの反映が非常に速いため、Cloudflareの使用をお勧めします。GoDaddyやNamecheapを使用している場合は、対応する環境変数を調べてください。Cloudflareの場合は、以下の情報をエクスポートするコマンドを実行します。

export CF_Token="your_cloudflare_api_token"
export CF_Account_ID="your_account_id"

ステップ 2: 新規証明書のリクエスト

以下のコマンドを実行して証明書を取得します。ドメイン名は実際の運用環境に合わせて変更してください。

acme.sh --issue --dns dns_cf -d esxi01.yourdomain.com

完了すると、証明書ファイルは ~/.acme.sh/esxi01.yourdomain.com/ ディレクトリに保存されます。

ステップ 3: ESXiホストへの証明書の転送

ESXiはSSL証明書を /etc/vmware/ssl/rui.crtrui.key という2つのファイル名で保存しています。リスクを避けるため、上書きする前に古いファイルをバックアップしておきましょう

# ESXi上でのクイックバックアップ
ssh root@esxi-ip "cp /etc/vmware/ssl/rui.crt /etc/vmware/ssl/rui.crt.bak && cp /etc/vmware/ssl/rui.key /etc/vmware/ssl/rui.key.bak"

中間マシンから新しいファイルをコピーします。

# 証明書とキーのコピー
scp ~/.acme.sh/esxi01.yourdomain.com/fullchain.cer root@esxi-ip:/etc/vmware/ssl/rui.crt
scp ~/.acme.sh/esxi01.yourdomain.com/esxi01.yourdomain.com.key root@esxi-ip:/etc/vmware/ssl/rui.key

ステップ 4: 変更の適用

サーバー全体を再起動せずにESXiに新しい証明書を認識させるには、管理サービスを再起動するだけで十分です。この操作で実行中の仮想マシンが停止することはありません。

ssh root@esxi-ip "/sbin/services.sh restart"

ウェブインターフェースの接続が約30秒間切断されます。その後、通常通り再度ログインできるようになります。

結果の確認と自動化

ESXiの管理ページをリロードしてください。緑色の鍵アイコンとLet’s Encryptの情報が表示されれば成功です。ただし、この証明書の有効期限は90日間です。

ここでのコツは、小さなスクリプトを作成し、毎月実行するようにcronjobを設定することです。スクリプトが自動的に証明書を issue(再発行)し、ホストに scp(転送)します。

# 更新スクリプトのサンプル renew-esxi.sh
#!/bin/bash
acme.sh --renew -d esxi01.yourdomain.com
scp ~/.acme.sh/esxi01.yourdomain.com/fullchain.cer [email protected]:/etc/vmware/ssl/rui.crt
scp ~/.acme.sh/esxi01.yourdomain.com/esxi01.yourdomain.com.key [email protected]:/etc/vmware/ssl/rui.key
ssh [email protected] "/sbin/services.sh restart"

経験上、DNS-01チャレンジは非常に安定しているため、常にこれを使用することをお勧めします。ファイアウォールのポート開放や複雑なNAT設定を気にする必要がありません。数十台のホストを管理している場合は、Ansibleを使用して一括でデプロイすれば、大幅な時間の節約になります。

Share: