Nginx+SSLクライアント証明書とSSHプロトコルを利用した環境でGitBucketのGitLFSを使うには
アットウェアでは開発プロジェクトでGitのホストティングに幾つかのツールを利用しております。その中でも、GitBucketは弊社の業務形態や利用ユースケースにマッチしている事が多く、幾つかのプロジェクトで利用しています。
今回は、クライアント証明を設定して利用したいというようなユースケースがあり、且つGitLFSを使おうとした時にGitLFSの内部仕様にあわせて、幾つか必要な設定があったので、紹介したいと思います。
本題
今回の構成として、GitBucketへhttpアクセスする際に、GitBucketの手前にNginxを配置しリバースプロキシさせてGitBucketへアクセスさせます。更に、NginxにSSLクライアント認証設定をしておくことで、クライアント証明書ファイルを取得できる限られたユーザのみがアクセスできるようにします。
sshプロトコルでGitLFSを使ったコミットを含む内容をPushした場合に、git-lfs-authenticateでエラーが発生しました。ログを元にGitLFSの仕様を調べたところ、sshプロトコルで接続された場合でも、GitLFS内部でhttp通信が発生し、http通信周りでエラーが発生していることがわかりました。
細かいGitLFS仕様については下記のサイトで解説されているので、参照ください。
GitBucketとNginx設定のポイント
- GitLFS内部でhttp通信するのでGitBucketのBASE_URLはクライアントからアクセスできる適切なURLを設定しておく必要がある
- GitBucketのBASE_URLへのアクセスする際に、クライアント証明設定がされたサーバを通過する設定されている場合、git configで設定が必要である
- Nginxのファイルアップロード容量制限値に引っかかる場合があるので、clientmaxbody_size を適切なサイズで設定しておく必要がある
git confgへ設定手順
pfxファイルからクライアント証明書、秘密鍵、CA証明書を取り出します。
$openssl pkcs12 -in exsample.com.pfx -clcerts -nokeys -out ~/exsample.com.cert
$openssl pkcs12 -in exsample.com.pfx -nocerts -nodes -out ~/exsample.com.key
$openssl pkcs12 -in exsample.com.pfx -cacerts -nokeys -out ~/exsample.com.ca-bundle
git configへ証明書関連の設定を行います。
$cd yourrepo
$git config --local http.sslcert ~/exsample.com.cert
$git config --local http.sslkey ~/exsample.com.key
$git config --local http.sslcainfo ~/exsample.com.ca-bundle
上記の設定を実施後に、sshプロトコル経由で適切なリポジトリへPushした際にGitBucketのGitLFS内部で適切にクライアント証明が行われ、結果がセントラルへ反映されます。
最後に
ある程度制約を加えた環境での、GitBucket Tipsでした。
GitBucketはバージョンアップを含め、とても運用しやすい仕組みになっていますので、利用を進めていきたいと思います。