Gitolite
Gitolite を使うことで複数のユーザーが扱う Git リポジトリを簡単に安全にホストすることができます。
目次
インストール
設定
gitolite をインストールすると自動的に gitolite ユーザーがシステムに追加され、ホームディレクトリ /var/lib/gitolite
が作られます。
SSH による管理者アクセス
管理者アクセスできるように、SSH 公開鍵を /var/lib/gitolite/username.pub
に追加してください (username
はあなたのユーザー名に置き換えて下さい):
# install -o gitolite -g gitolite ~/.ssh/id_rsa.pub /var/lib/gitolite/username.pub
そして gitolite ユーザーを使って Gitolite のセットアップスクリプトを実行します:
# su - gitolite $ gitolite setup -pk username.pub
これで gitolite-admin の keydir に公開鍵が配置され、あなたのユーザー名で gitolite-admin リポジトリに読み書きアクセスできるようになります。
コピーした SSH 公開鍵を削除して gitolite ユーザーシェルを終了してください:
$ rm username.pub $ exit
あなたのユーザーを使って問題が無いか確認することが可能です:
$ ssh gitolite@hostname info
hello username, this is gitolite@hostname running gitolite3 v3.6.2 on git 2.3.3 R W gitolite-admin R W testing
リポジトリやユーザーを直接 gitolite としてサーバーに追加してはいけません。特別な gitolite-admin リポジトリを複製することでサーバーを管理します:
$ git clone gitolite@hostname:gitolite-admin
詳しくは Gitolite を参照してください。
Apache による http(s) アクセスの追加 (ベーシック認証)
suEXEC ラッパースクリプトを作成する必要があります。suEXEC のセキュリティ要件を満たすために、スクリプトとディレクトリの所有者は gitolite:gitolite
である必要があり、/srv/http
以下に配置しなくてはなりません。ここでは例として、/srv/http/git/cgi-bin
ディレクトリを作成します:
# install -o gitolite -g gitolite -d /srv/http/git/cgi-bin
gitolite シェルの suEXEC ラッパーを作成してください。以下の例では、/srv/http/git/cgi-bin/gitolite-suexec-wrapper
として保存しています。
/srv/http/git/cgi-bin/gitolite-suexec-wrapper
#!/usr/bin/bash # # suEXEC wrapper for gitolite-shell # export GIT_PROJECT_ROOT=/var/lib/gitolite/repositories export GITOLITE_HTTP_HOME=/var/lib/gitolite exec /usr/lib/gitolite/gitolite-shell
ラッパーに実行可能属性を付与して所有者を gitolite:gitolite
に変更:
# chown gitolite:gitolite /srv/http/git/cgi-bin/gitolite-suexec-wrapper # chmod 0755 /srv/http/git/cgi-bin/gitolite-suexec-wrapper
空のパスワードデータベースファイルを作成、所有者は gitolite:http
:
# install -o gitolite -g http -m 0640 /dev/null /srv/http/git/htpasswd
Apache の basic 認証は ssh とは別の仕組みなので、証明書が別に必要になります。htpasswd
を使ってウェブユーザーを作成:
# htpasswd /srv/http/git/htpasswd username
以下を Apache の vhost 設定に追加してください:
SuexecUserGroup gitolite gitolite ScriptAlias /git/ /srv/http/git/cgi-bin/gitolite-suexec-wrapper/ <Directory /srv/http/git/cgi-bin> Require all granted </Directory> <Location /git> AuthType Basic AuthName "Git Access" AuthBasicProvider file AuthUserFile /srv/http/git/htpasswd Require valid-user </Location>
httpd.service
を再起動してください。
最後に、前述の gitolite-admin リポジトリの中にある、conf/gitolite.conf
を編集して http でアクセスして変更をプッシュしたい全てのリポジトリに R = daemon
アクセスルールを追加してください。
ユーザーの追加
ssh ユーザー
アクセス権を与えるユーザーに、あなたに公開鍵を送るよう頼んでください。次のコマンドで ssh の鍵ペアを生成できます:
$ ssh-keygen
それぞれの公開鍵をユーザーの名前に従ってリネームし、.pub 拡張子を付けてください。例えば itaram.pub や john-smith.pub ような形です。ピリオドやアンダースコアも利用することができます。
すべての *.pub ファイルを複製した gitolite-admin リポジトリの keydir の中にコピーしてください。サブディレクトリを使って鍵を整理することもできます。
設定ファイル (複製した gitolite-admin リポジトリの中の conf/gitolite.conf) を編集してください。設定項目や文法などの詳細は gitolite.conf のドキュメント (http://sitaramc.github.com/gitolite/admin.html#conf) を見てください。必要に応じて新しいリポジトリを追加したり、新しいユーザーを追加しパーミッションを与えたりしてください。ユーザーの名前は鍵ファイル名から .pub 拡張子を除いたものと同一にしてください。
$ nano conf/gitolite.conf
変更をコミットしプッシュしてください:
$ git commit -a $ git push
http(s) ユーザー
http(s) のユーザー管理はシングルユーザーセットアップに適しています。新しいユーザーを追加したり、存在するユーザーのパスワードを変更するには:
# htpasswd /srv/http/git/htpasswd username
Gitosis ライクな ssh ユーザー名
username@server1
と username@server2
のような同じログインのユーザーを区別したい場合は次を実行してください (gitolite 3.04-1 でテストしています):
/usr/lib/gitolite/triggers/post-compile/ssh-authkeys
を開き
$user =~ s/(\@[^.]+)?\.pub$//; # baz.pub, baz@home.pub -> baz
を
$user =~ s/\.pub$//; # baz@home.pub -> baz@home
で置き換えてください。
- authorized_keys ファイルを更新してください。(例えば gitolite-admin リポジトリにプッシュしてください)
トラブルシューティング
gitolite のアカウントでログインできない場合、あなたの ssh の設定によってアカウントがロックされているかもしれません。
SSH and locked users Article や Unix & Linux StackExchange - How to unlock account for public key ssh authorization, but not for password authorization に述べられているような SSH のセキュリティの強化がこの動作を引き起こすことがあります。
この問題を解決するために sshd_config
で PAM を許可するか、アカウントをアンロックしてください:
# usermod -p '*' gitolite
# nano /etc/passwd
... gitolite:*:16199:0:99999:7::: ...