カテゴリー
ソフトウェア

gitoliteでプライベートGitサーバーを構築する

はじめに

個人でプライベートに使用するための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アカウント管理などを経験している方にとっては逆にやりやすいかもしれませんね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください