HomeLabにおけるSSLの問題
「詳細設定」をクリックして「(安全ではないが)続行」を押すのはもうやめましょう。HomeLabのサービスが10個を超えている場合、自己署名証明書を管理したり、ブラウザの警告を無視したりすることは、単に煩わしいだけでなく、セキュリティ上の欠陥となります。Jellyfinのようなメディアサーバーや新しいダッシュボードをデプロイするたびに、あの真っ赤な警告画面に直面していました。長い間、私はその不便さを我慢してきましたが、ラボが25個以上のコンテナに拡大するにつれ、手動での管理コストは限界に達しました。
なぜ Let’s Encrypt を使わないのか不思議に思うかもしれません。Let’s Encrypt は公開ウェブサイトにとってはゴールドスタンダードですが、パブリックDNSレコードと、検証用のオープンポートが必要になることがよくあります。ローカルのみの環境において、証明書のためだけに内部インフラを外部に晒すのは不必要なリスクです。独自の公開鍵基盤(PKI)の管理方法を学ぶことで、外部への依存なしに、本番環境さながらのセキュリティを再現できます。
Step-caとは?
Step-ca(Smallstep社提供)は、オープンソースのプライベート認証局(CA)です。Let’s Encryptのローカル版のように機能します。ACMEプロトコルをサポートしているため、Nginx、Caddy、Apacheなどのサーバーは証明書を自動的にリクエストおよび更新できます。非常に軽量で、通常120MB未満のRAMしか消費しません。パブリックドメインやインターネットアクセスを必要とせずに、完全な自動化を実現できます。
フェーズ1:Step CLI and CAのインストール
専用のLinux VMまたはProxmoxのLXCコンテナで実行するのが最も安定した方法です。まずは、証明書管理のメインツールとなるstep CLIのインストールから始めます。
1. Step CLIのインストール
wget https://github.com/smallstep/cli/releases/download/v0.28.2/step-cli_0.28.2_amd64.deb
sudo dpkg -i step-cli_0.28.2_amd64.deb
2. Step CAサーバーのインストール
wget https://github.com/smallstep/certificates/releases/download/v0.28.1/step-ca_0.28.1_amd64.deb
sudo dpkg -i step-ca_0.28.1_amd64.deb
フェーズ2:プライベートCAの初期化
設定は、内部階層の定義から始まります。名前とローカルDNSアドレスを指定してCAを初期化する必要があります。競合を避けるために、.internalや.lanのような専用のローカルドメインを使用することをお勧めします。
step ca init \
--name "HomeLab-Root-CA" \
--provisioner "[email protected]" \
--dns "ca.lab.internal" \
--address ":443"
インストーラーは、ルートCAキーを保護するためのパスワードを求めてきます。これはパスワードマネージャーに安全に保管してください。完了すると、設定ファイルは~/.stepに保存されます。デフォルトでは、これらのルート証明書の有効期限は10年ですが、リーフ証明書は、頻繁かつ自動的なローテーションを促すために通常24時間で失効します。
ACMEプロビジョナーの有効化
Step-caはデフォルトでパスワードベースのシステムを使用します。Let’s Encryptのような自動更新を可能にするには、次のコマンドでACMEプロビジョナーを有効にする必要があります。
step ca provisioner add acme --type ACME
フェーズ3:Step-caをシステムサービスとして実行
自動化を実現するには、再起動後もCAが確実に起動する必要があります。バックグラウンドでプロセスを実行し続けるために、systemdサービスを使用します。
# サービスファイルの作成
sudo nano /etc/systemd/system/step-ca.service
以下の設定を使用してください。パスは実際のユーザー名に置き換えてください:
[Unit]
Description=Step-ca サービス
After=network.target
[Service]
User=yourusername
Group=yourusername
ExecStart=/usr/bin/step-ca /home/yourusername/.step/config/ca.json --password-file=/home/yourusername/.step/password.txt
Restart=on-failure
[Install]
WantedBy=multi-user.target
CAパスワードを記述したpassword.txtファイルを作成し、chmod 600を使用して権限を制限します。環境変数を好む人もいますが、制限付きのファイルを使用するのがHomeLabのセットアップでは最も実用的です。
フェーズ4:ルート証明書の信頼設定
デバイスは、認識しているソースからの証明書のみを信頼します。ラボにアクセスするすべてのラップトップ、スマートフォン、タブレットにルートCA証明書をインストールする必要があります。これは、緑色の鍵アイコンという「魔法」を有効にするための一度限りのセットアップです。
ルート証明書は~/.step/certs/root_ca.crtにあります。LinuxまたはmacOSマシンでは、すぐに信頼関係をブートストラップできます:
step ca bootstrap --ca-url https://ca.lab.internal --fingerprint [あなたのフィンガープリント]
フェーズ5:Caddyとのシームレスな統合
Caddyは、内部ACME CAをネイティブに処理できるため、DevOpsコミュニティで人気があります。Caddyfileはクリーンで読みやすい状態を保てます:
# CaddyをローカルCAに向ける
{
acme_ca https://ca.lab.internal/acme/acme/directory
acme_ca_root /path/to/root_ca.crt
}
proxmox.lab.internal {
reverse_proxy 192.168.1.10:8006
}
media.lab.internal {
reverse_proxy 192.168.1.15:8096
}
これで、Caddyは自動的にStep-caにアクセスし、ACME経由で本人確認を行い、署名済み証明書を取得するようになります。もう90日ごとの手動更新は必要ありません。ただ動く、それだけです。
最後に
数個のサービスのためにプライベートCAを構築するのは、やりすぎのように思えるかもしれません。しかし、20分のセットアップで得られる安心感にはそれだけの価値があります。パブリックDNSの認証という複雑さや、自己署名証明書のリスクを伴わずに、エンタープライズ級のセキュリティを手に入れることができます。Vaultwardenのような機密性の高いサービスに拡張する場合、このPKI基盤があることは大きな強みになります。ログを監視して、すべてが正常であることを確認してください:
journalctl -u step-ca -f
さあ、今すぐすべてを暗号化しましょう!

