Hyper-V 仮想マシン内で、動作させる Git システム Forgejo を HTTPS 対応 – Intel N100 ミニ PC で構築する開発環境(11日目)

ミニPC (CPU: Intel n100) を購入しました。Windows でも Ubuntu でも使えるようにして、「Intel N100 ミニ PC で構築する開発環境(2日目) | hiro345」で紹介した環境を用意していくつもりです。

 今回は、Hyper-V 仮想マシン内で、動作させる Git システム Forgejo を HTTPS 対応してみました。

サーバ証明書

 HTTPS を使ってアクセスできるようになれば、それで良いというレベルなら自己署名のサーバ証明書を用意すれば良いです。本格的な Web アプリの開発環境を用意したい場合は、プライベート CA の構築と、それを使ったサーバ証明書を生成できる環境も用意しておきたいところです。

 ちなみに、HTTPS を使った通信では、通信開始時に接続先が正しいかどうかを確認して安全性を確保しています。ここで、自己署名のサーバ証明書やプライベート CA 署名のサーバ証明書を使うとクライアント側で警告もしくはエラーとなります。このチェックを無視する設定をして通信することはできますが、そうすると開発時はチェックを無視する設定とし、実際の運用時はチェックする設定とする必要があります。こういったセキュリティに関連する設定については、できるだけ差がないようにしておいた方が好ましいので、開発環境でも警告やエラーとならないようにしておきたいところです。そうした場合は、開発環境でプライベート CA による署名について、警告やエラーが出ないように設定しておくのが良いです。そうすれば、プライベート CA で署名した開発用のサーバ証明書については、警告やエラーが出ないようになるからです。自己署名のサーバ証明書だと、新しいサーバ証明書を作成するたびに個別対応が必要になり手間が増えます。

 サーバ証明書の作成について、基本は OpenSSL を使うのですが、プライベート CA の構築と、それを使ったサーバ証明書を生成するための設定が難しい印象があります。自己署名のサーバ証明書であれば手軽に作れるので、とりあえずの動作確認でサーバ証明書が必要な場合は便利です。

 有名なものとしては、FiloSottile/mkcert が手軽に使えます。ただし、これを使うマシンの証明書環境も更新されます。勝手に更新されてしまうと困る場合は使えません。自分は、これを使うときは、Docker コンテナを使って証明書ファイルの生成をしてから、それらのファイルを手動で使う環境へ設置しています。こうすると、自分がわかる範囲で設定するので安心して使えます。

 他には何があるか調べてみたところ、CloudFlare が Go で開発している cloudflare/cfssl もよく使われています。同じく Go で開発されている、jsha/minica というものもあります。Ubuntu なら OpenVPN/easy-rsa が便利そうです。Go 環境も Ubuntu 環境も Docker で用意できるので、今回用意した開発環境なら、どちらも使えそうです。

 ここでは自分が使ったことのある mkcert を使うことにしました。cfssl の方が mkcert よりも多機能なので、そちらも使ってみたいところですが、そちらは Forgejo の HTTPS 対応の設定が終わってからにしようと考えています。

Web サーバの検討

 Forgejo は自前の Web サーバを使って動作します。この Forgejo に組み込まれている Web サーバには HTTPS に対応するための機能があるので、それを使うと単体で HTTPS 対応ができそうです。ただ、その設定についての説明資料が英語のものしかないのと、わかりやすく説明しているものがすぐにいは見当たりませんでした。ということで、きちんと動作することを確認するのに手間がかかりそうです。

 別途 Web サーバを起動して、それと Forgejo を連携させるという手もあります。Apache HTTP Server か Nginx で HTTPS 対応の Web サーバを用意して、そこからリバースプロキシーで Forgejo サーバへ接続するという方法が汎用性があって良いです。自分もこちらはよく設定したことがあるので慣れています。ただし、Web サーバを Forgejo とは別に稼働させる必要が出てくる点が大きなデメリットとしてあります。

 今回はできるだけ軽く使えるようにしたいので、Forgejo 単体で HTTPS 対応するようにしてみることにします。

Foregejo の HTTPS 設定

 mkcert で CA と Web サーバの証明書を作成してから、Hyper-V の仮想マシンへプライベート CA の公開鍵を登録しました。また、Web サーバ用の証明書は Forgejo 用の Docker コンテナが使う Docker ボリュームへ持っていき、設定ファイルで参照するようにしました。設定ファイルでは HTTP ではなく HTTPS を使う指定もしました。

 ホスト名については、forgejo.example.jp といったものにして、ポートも HTTPS 用の 443 を使うようにして、https://forgejo.example.jp といった URL でアクセスできるようにしました。また、Hyper-V の仮想マシンの hosts ファイルへ forgejo.example.jp のエントリを登録して名前解決ができるようにしました。

 ちなみに、ここで、Forgejo は rootless の Docker イメージを使って動作させるので大丈夫ですが、root 権限で実行される Docker コンテナの場合は、root 権限が奪取可能な脆弱性があった場合に大きな問題となります。そういったもので Web アプリを動作させる場合は、HTTPS 対応だけでなく、クライアント証明書によるアクセス制限を追加して、より安全な環境にするといったことも考える必要が出てきます。

 ということで、本日はここまで。

同じタグの記事: Forgejo
同じタグの記事: Intel N100
同じタグの記事: Ubuntu
同じカテゴリの記事: Linux
同じカテゴリの記事: Win