はじめに
個人でプライベートに使用するためのGitサーバーをAmazonLinux(EC2)に構築してみました。Gitサーバーにはgitoliteを採用しました。
( 参考: https://github.com/sitaramc/gitolite )
Gitリポジトリの管理は管理用リポジトリgitolite-adminにリポジトリ設定ファイル(リポジトリ名やアクセスできるユーザーの対応付け)やユーザー鍵(ユーザー毎のSSH公開鍵)を作成・更新・削除することで対応します。
構築手順
Gitリポジトリ管理用ユーザーのSSH鍵作成
管理用リポジトリgitolite-adminを操作できる管理ユーザーのSSH鍵(秘密鍵と公開鍵)を生成します。鍵の生成はGitサーバーではなくクライアント側で実施します。
$ ssh-keygen
private key -> /home/user/.ssh/gitolite-admin@git-server
public key -> /home/user/.ssh/gitolite-admin@git-server.pub
Gitサーバー構築
$ sudo yum install git
$ sudo groupadd -g 942 gitolite
$ sudo useradd -g gitolite -u 943 gitolite
$ sudo su - gitolite
$ cat << 'EOF' > $HOME/gitolite-admin.pub
(ここにクライアント側で作成した gitolite-admin@git-server.pub の内容を貼り付ける。下記のような文字列。)
ssh-rsa AAAA...
EOF
$ git clone git://github.com/sitaramc/gitolite
$ mkdir -p $HOME/bin
$ gitolite/install -to $HOME/bin
$ gitolite setup -pk $HOME/gitolite-admin.pub
管理用リポジトリのclone
管理用リポジトリをクライアント環境にcloneして、最初の一般リポジトリを追加してみます。
gitクライアント環境初期化
ここで設定したメールアドレスやユーザー名は $HOME/.gitconfig に記載されます。変更するには、コマンドを再度実行します。
$ git config --global user.email 'user@localhost'
$ git config --global user.name 'User'
クライアント側ではcloneしたgitリポジトリは$HOME/git以下に保存するようにしてみます。
$ mkdir -p $HOME/git
$ cd $HOME/git
管理用のリポジトリをcloneします。
$ git clone gitolite@git-server.example.com:gitolite-admin
$ cd gitolite-admin/
一般リポジトリの追加
サンプルとして myfirstrepo を追加してみます。また、Gitリポジトリ管理用ユーザーではなく、このリポジトリのみ参照できる一般ユーザーuserを追加してみます。
リポジトリ追加
gitolite-admin と testing はデフォルトで設定されているリポジトリです。この設定の下に、今回追加する myfirstrepo を追加します。新しい一般ユーザーuserはすべての操作ができるようにRW+で記載します。~/git/gitolite-admin/conf/gitolite.conf
repo gitolite-admin
RW+ = gitolite-admin
repo testing
RW+ = @all
repo myfirstrepo
RW+ = user
ユーザー追加
リポジトリの設定は終わりましたが、ユーザーuser用のSSH鍵(公開鍵)をまだ作成していません。ここで、新しいSSH鍵のペア(秘密鍵・公開鍵)を作成して、このうち公開鍵をリポジトリgitolite-adminに追加します。
$ ssh-keygen
private key -> /home/user/.ssh/id_rsa-user@git-server
public key -> /home/user/.ssh/id_rsa-user@git-server.pub
$ cp $HOME/.ssh/id_rsa-user@git-server.pub \
$HOME/git/gitolite-admin/keydir/user.pub
適用
リポジトリ情報(gitolite.conf)とユーザーのSSH鍵(公開鍵)を追加したので、これらをローカルでadd、commitして、Gitサーバーにpushします。
$ git add conf
$ git add keydir
$ git commit -m 'added myfirstrepo, gave access to user'
$ git push
今回、git add により一括でaddしてしまっていますが、より丁寧に操作するには、ローカルで git status の結果を確認して、適用したいファイルのみ明示的に指定してadd、commitするのがよいでしょう。
(リポジトリgitolite-adminの状況確認)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: conf/gitolite.conf
Untracked files:
(use "git add <file>..." to include in what will be committed)
keydir/user.pub
no changes added to commit (use "git add" and/or "git commit -a")
(keydir/user.pubが管理対象外のままなのでaddします)
$ git add keydir/user.pub
(もう一度確認します)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: keydir/user.pub
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: conf/gitolite.conf
(コミットするファイルを明示的に指定します)
$ git commit keydir/user.pub conf/gitolite.conf \
-m 'added myfirstrepo, gave access to user'
(Gitサーバーにpushします)
$ git push
一般リポジトリのclone
一般リポジトリ myfirstrepo をクライアント側に clone してみましょう。ユーザー user のSSH鍵(秘密鍵)を使ってGitサーバーに簡単にアクセスできるように、SSH接続設定を作成します。
SSH接続設定の作成
gitコマンドはデフォルトでSSH接続に対応しています。今回、ユーザー user でGitサーバーに簡単に接続できるよう、SSH接続設定に書き出しておくことにします。この設定はGitサーバー特有のものではなく、SSHの基本的な機能を使用します。~/.ssh/config
Host git-server
HostName git-server.example.com
IdentityFile ~/.ssh/id_rsa-user@git-server
User gitolite
Host には好きな名前を付けられます。gitコマンド実行時はこの名前を指定するだけでユーザー名、ホスト名および秘密鍵を指定したことになります。HostNameはGitサーバーのFQDNやIPアドレスなどを指定します。IdentityFileにはクライアント側で作成した一般ユーザーのSSH鍵(秘密鍵)を指定します。秘密鍵のファイルパーミッションは600にする必要があるでしょう。644など、他のユーザーからも読み取ることができる場合、SSH接続の際に警告が表示されて接続に失敗するかもしれません。UserはGitサーバー側のLinuxユーザー名gitoliteを指定します。
一般ユーザーのSSH鍵(公開鍵)はGitサーバーのOS(Linux)にログインするための鍵ではなく、Gitサーバー(gitoliteが提供するサービス)専用の鍵です。Gitサーバーはクライアントから提示された秘密鍵を、Gitサーバーにある管理用リポジトリgitolite-adminに保存された公開鍵と照会して、誰がアクセスしてきかたを判別、認証しています。
clone実行
作成したSSH接続設定を使って、Gitリポジトリをcloneします。
cd ~/git
git clone git-server:myfirstrepo
おわりに
Gitサーバーの構築は思ったほど難しくないかもしれません。自前のLinuxサーバーを公開していて、SSH鍵によるLinuxアカウント管理などを経験している方にとっては逆にやりやすいかもしれませんね。