Ubuntu Weekly Recipe

第636回 LXD MosaicでLXDをウェブブラウザーから操作する

この記事を読むのに必要な時間:およそ 4.5 分

証明書の設定

LXD Mosaicではインストール直後の状態だと,自己署名証明書が設定されています。これはapache2パッケージをインストールした際に一緒にインストールされたssl-certパッケージが作成した証明書です。

この証明書は次の2種類のプロセスから使われています。

  • apache2:LXD MosaicのUI部分を担うはApacheとPHPで作られています。
  • node:UIのフロントエンドは,WebSocket経由でバックエンドで動くNodeJSにLXDの状態を問い合わせています。

ApacheだけでなくNodeJSも証明書の設定が必要なことに注意してください。

まずはApacheの設定から。/etc/apache2/sites-enabled/lxd_manager.confで次のように参照されています。

SSLEngine on

SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key

正しい証明書をコンテナからアクセスできる場所に保存したら,上記の値を変更し,systemctl restart apahce2を実行してください。

$ lxc exec lxdMosaic systemctl restart apahce2

次にNodeJSのほうです。これは/var/www/LxdMosaic/.envの中で次のように設定しています。

CERT_PATH=/etc/ssl/certs/ssl-cert-snakeoil.pem
CERT_PRIVATE_KEY=/etc/ssl/private/ssl-cert-snakeoil.key

こちらも単にファイルを変更し,NodeJSのプロセスを再起動します。

$ lxc exec lxdMosaic pm2 restart all

あとは正しい証明書を用意するだけです。方法はいくつかありますが,おそらく次のいずれかになるでしょう。

  1. Let⁠s Encryptなどを利用してlxdMosaicインスタンスから証明書を自動生成する
  2. Let⁠s Encryptなどを利用してホストから証明書を自動生成した上で,lxdMosaicからそのファイルを参照する
  3. Let⁠s Encryptなどを利用してホストから証明書を自動生成し,ホスト上で動いているリバースプロキシ経由でlxdMosaicにアクセスする
  4. 手作業で証明書を作成し更新する

おそらく今回の例だと1か2が一番簡単です。1はlxdMosaicインスタンスの中にcertbotをインストールすれば良いのですが,HTTP-01チャレンジを使うなら外部から作成する証明書のドメイン名経由でlxdMosaicに80番ポートでアクセスできる必要があります。これは前述のプロキシデバイスの追加で実現可能ではありますが,ホスト上で別のサービスに80番ポートを使っていると使用できません。

また,lxd_manager.confは80番ポートへのアクセスをすべてHTTPにリダイレクトしてしまっているので,1のケースではRewriteCond %{REQUEST_URI} !(^/.well-known/)のような/.well-known/はHTTPSにリダイレクトしない設定を追加する必要があります。

それを考えると2のほうがまだ簡単かもしれません。ホストが80番ポートを使っているなら,おそらくすでに証明書を取得している可能性が高いでしょう。そうすると,その証明書をコンテナの中からも使えると手間が少なくなります。ホストのファイルをそのままコンテナの中に見せるには,証明書のあるディレクトリをbind mountする方法が一番簡単です。詳細は第479回のLXDコンテナとホストの間でファイルを共有する方法にある「ホストのディレクトリーツリーをbind mountする」を参照してください。

ひとつ注意しなければならないのは,Let⁠s Encryptのようなサービスを利用して証明書を自動更新する場合,Apacheなどのウェブサーバーも更新時に再起動する必要があります。2の方法だと「更新された」タイミングが通知されるわけではないので,systemdのタイマーユニットなどを使って30日ごとに再起動するようなタイマーを動かしておくと良いでしょう。

3はホスト上にリバースプロキシとなるサーバーをインストールしておいて,ホストとコンテナ間はHTTP通信にしてしまうという方法です。大抵のサービスはこの方法が一番簡単かつ確実です。ただしLXD Mosaicの場合,lxd_manager.confの中身がWebSocketも含めてHTTPS通信することを期待しているため,⁠きちんと動く」ようにするためにはlxd_manager.confの中身をそれなりに変更する必要があります。将来的なアップグレードも考えると,少し手間が増えてしまうかもしれません。具体的な設定例はたとえば第610回のNextcloud Talkでリモートミーティングなどを参照してください。

4については,たとえば組織内の認証局を利用したり,自動化できないサービスの証明書を作成・利用する場合の選択肢となります。とは言え完全に手動でやるのはあまりおすすめしません。Ansibleなどの構成管理ツールとセットで設定することになるでしょう。ちなみに証明書の作り方などは,第387回のUbuntuでSSLを利用したサービスを構築するの手順が参考になります。

いずれにせよ,証明書の作成ポリシーに合わせて設定は多岐に渡ります。ここで説明していないもっと良い方法もあるかもしれません。そのあたりは各自の環境に合わせてベストな方法を模索してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。