step-caでプライベート認証局(CA)を構築:LAN内のセキュリティ警告とはおさらば

Security tutorial - IT technology blog
Security tutorial - IT technology blog

「この接続ではプライバシーが保護されません」という煩わしさ

以前のプロジェクトで10台以上の内部サーバーのセキュリティ監査を行った際、ある事実に気づきました。それは、エンジニアの90%が管理ダッシュボードに依然としてHTTPを使用しているか、自己署名証明書(オレオレ証明書)を使用しているという実態です。問題は、誰もその有効期限を覚えておらず、更新が行われないことです。

管理画面にアクセスするたびに、ブラウザに赤い斜線が表示されるのは非常に非専門的に感じられます。しかし、内部ネットワークでLet’s Encryptを使用するのは極めて面倒です。DNS-01チャレンジを設定するか、インターネットにポートを開放する必要がありますが、分離されたネットワーク(Isolated Network)ではそれが許可されないことがほとんどです。そこで、私は step-ca に辿り着きました。

内部SSL管理手法の比較

最終的な手法を決定する前に、いくつかの方法を試しました。その結果を以下にまとめます。

1. OpenSSL(手動管理)

これは伝統的な方法です。Root CAを作成し、それを使用して証明書署名要求(CSR)に署名します。

  • メリット: 複雑なサーバー設定が不要。
  • デメリット: 管理が地獄。50個のマイクロサービスがある場合、それぞれの有効期限を覚えて手動で署名するのは、ミスが起きやすく、事実上不可能です。

2. HashiCorp Vault(エンタープライズ向け)

Vaultには非常に強力なPKIエンジンと充実したAPIがあります。

  • メリット: 企業レベルのセキュリティ、極めて豊富な機能。
  • デメリット: 重すぎる。数台の内部サーバーにSSLを発行するためだけにVaultクラスターをセットアップするのは、買い物に行くのにトラクターを使うようなものです。

3. Smallstep (step-ca) – バランスの取れた選択

これは、私が現在中規模プロジェクトや個人のホームラボで採用しているソリューションです。

  • メリット: Let’s Encryptと全く同じACMEプロトコルをサポートしています。CLIを通じて発行と更新を100%自動化でき、非常にスムーズです。
  • デメリット: CAサービスを維持するために、わずかなリソース(VPSまたはコンテナ)が必要です。

なぜstep-caを使う価値があるのか?

`step-ca` の最大の利点は、NginxやCaddyなどのツールを「騙せる」点にあります。これらのウェブサーバーはLet’s Encryptと通信していると思い込みますが、実際にはLAN内にある自前のCAサーバーに接続しています。インターネットにポートを公開することなく、自動化の恩恵を受けることができます。

step-caの構築手順

ステップ 1: step-cliのインストール

まず、コマンドラインツール `step` が必要です。Ubuntuでは以下のコマンドを実行します。

wget https://github.com/smallstep/cli/releases/download/v0.24.4/step-cli_0.24.4_amd64.deb
sudo dpkg -i step-cli_0.24.4_amd64.deb

次に、メインサーバーをインストールします。

wget https://github.com/smallstep/certificates/releases/download/v0.24.2/step-ca_0.24.2_amd64.deb
sudo dpkg -i step-ca_0.24.2_amd64.deb

ステップ 2: 認証局の初期化

初期化コマンドを実行し、ガイドに従って情報を入力します。

step ca init

以下の重要なパラメータに注意してください。

  • Deployment Type: `Standalone` を選択。
  • CA Name: 例:`Lab-Internal-CA`。
  • DNS Names: CAサーバーのIPまたはドメインを入力(例:`ca.internal.lan`)。
  • Password: ルートキーを保護するためのパスワードです。絶対に忘れないでください。

ステップ 3: CAサーバーの運用

以下のコマンドでCAを起動できます。

step-ca $(step path)/config/ca.json

実務上のアドバイス:`systemd` サービスとして設定してください。tmuxなどで一時的に実行するのは避けるべきです。サーバーがクラッシュしたことに気づかないと、その後のSSL更新がすべて失敗してしまいます。

ステップ 4: ルート証明書のインストール

ブラウザでエラーが出ないように、クライアント端末に `root_ca.crt` ファイルをインストールする必要があります。このファイルは `~/.step/certs/root_ca.crt` にあります。

他のLinuxマシンでの最も簡単な方法は、以下のコマンドを使用することです。

step certificate install root_ca.crt

ACMEによる完全自動化

新しいサービスを追加するたびにコマンドを打たなくて済むよう、ACME機能を有効にします。

step ca provisioner add acme --type ACME

Caddyを使用している場合、設定は以下のように非常にシンプルになります。

app.internal.lan {
    reverse_proxy localhost:8080
    tls {
        ca https://ca.internal.lan:9000/acme/acme/directory
        ca_root /path/to/root_ca.crt
    }
}

Caddyが証明書の取得と更新を自動的に処理します。深夜に証明書の期限が切れる心配をすることなく、安心して眠ることができます。

内部CA管理における重要な注意点

しばらく運用してみて、3つの大きな教訓を得ました。

  1. ルートキーのバックアップ: ルートキーを紛失すると、CAを再構築し、すべてのクライアントで再度信頼設定を行う必要があります。Bitwardenや安全なUSBメモリに保管してください。
  2. 有効期限の調整: デフォルトでは、`step-ca` はセキュリティ向上のため24時間有効な証明書のみを発行します。自動更新システムが不安定な場合は、`ca.json` ファイルで90日などに延長してください。
  3. CAサーバーのセキュリティ: これはシステムの心臓部です。SSHアクセスを制限し、不要なポートはすべて閉じてください。CAが乗っ取られた場合、攻撃者はネットワーク内のあらゆるドメインを偽装できてしまいます。

まとめ

適切なツールを選べば、内部CAの構築は決して難しくありません。`step-ca` はシステムをよりプロフェッショナルにするだけでなく、LAN内のセキュリティ問題を根本的に解決します。ホームラボや社内システムを管理している方は、ぜひ導入を検討してみてください。

Share: