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はバージョンアップを含め、とても運用しやすい仕組みになっていますので、利用を進めていきたいと思います。