Linuxサーバー上にGitリモートリポジトリを作成する

こんにちは。今回のテーマは『Linuxサーバー上にGitリモートリポジトリを作成する』です。プロ、アマを問わずコードを書く作業をされている方はSubversionやGit等のバージョン管理システムを活用していると思います。最近はGitHub等の便利なサービスが普及して自分でリモートリポジトリを用意する必要性も薄れてきた気がします。今回は小規模での開発に活用できるリモートリポジトリをUbuntuをサーバーとして作成してみました。


【目次】
今回Gitリポジトリを構築しようとした環境
ssh接続用のGitリポジトリを準備する
Gitリポジトリを作成する
gitユーザーパスワードによる認証
公開鍵による認証
ログインシェルを変更する

今回Gitリポジトリを構築しようとした環境

作業環境および構築しようとした設定は以下の通りです。

接続プロトコル:ssh
サーバー:Ubuntu 16.04LTS(sshサーバーは設定済み)
サーバー側のGitリポジトリの場所:/opt/git
サーバー側のGit専用ユーザーアカウント:git
クライアント:ssh接続が可能なLinuxマシン

ssh接続用のGitリポジトリを準備する

サーバー側でgit専用のユーザーアカウントを作成する
まずはサーバー側にGitリポジトリ用のユーザーアカウントを用意します。今回はgitユーザーとしました。

root# useradd git

Ubuntuの場合はユーザー作成時にパスワードを決定と思いますが、念の為以下のコマンドでパスワードを付与しておきます。

root# passwd git

そしてクライアントからアクセスされるベースとなるディレクトリを作成します。今回は/opt/gitとしました。gitユーザーで読み書き可能な権限がある場所であればどこでも良いと思います。以下の要領で作成していきます。

root# mkdir -pv /opt/git
root# chown git:git /opt/git

これでサーバー上の/opt/git以下がgitユーザーで書き込み可能となりました。

Gitリポジトリを作成する

ではサーバー上の/opt/git以下にGitリポジトリを作成していきます。

root# su git
$ cd /opt/git
$ mkdir testproject.git
$ cd testproject.git
$ git --bare --shared init

ベアリポジトリには慣例的にディレクトリ末尾に.gitを付けることになっているそうです。技術的には.gitと命名しなくてもリポジトリとしては機能します。

もし他のリポジトリをcloneしてきて/opt/git以下にクローンする場合は以下のようにします。

$ git clone --bare <外部のGitリポジトリ> 

gitユーザーパスワードによる認証

とても簡単なアクセスの承認方法としてサーバー側のgitユーザーパスワードを共有するという手法があると思います。ただし簡単な反面、パスワード管理には忘却や使い回しによる流出等のデメリットも認識する必要があります。

では作成したサーバー上のGitリポジトリをCloneしてみましょう。

$ git clone git@<サーバーIP>:/opt/git/testproject.git testproject

この際にサーバーのgitユーザーのパスワードを聞かれますので入力してcloneします。尚、gitユーザーのパスワードで認証する場合はpushする際にもパスワードを求められます。

公開鍵による認証

gitユーザーのパスワードによるアクセス認証はお手軽ですが、パスワードを知られたくないメンバーがいる場合や複数人でパスワードを管理することに危険性を感じる場合には不向きです。そのような場合には公開鍵による認証を用いることでgitユーザーのパスワードを知らずともリポジトリにアクセス出来るようになります。

公開鍵の作成と登録

クライアント側で以下の用にssh公開鍵を作成します。(今回のクライアントはArch Linuxでの作業を元に記事を書いていますが、他のLinuxまたはMacでも大差ないと思います。)

$ ssh-keygen -t rsa
(操作)公開鍵のファイル名を入力(デフォルトではid_rsa)
(操作)パスワードの設定(設定しない場合はエンターを押せば良い)
(操作)パスワードの確認(設定しない場合はエンターを押せば良い)

以上の操作で~/.ssh以下に秘密鍵と公開鍵が出来上がっています。公開鍵は.pub拡張子がある方です。今回id_rsaとid_rsa.pubを作成しました。クライアント再度のsshは接続の際にデフォルトで~/.ssh/rsa_idや~/.ssh/identity(/etc/ssh/ssh_configによる)を読みにいきますので、それ以外の名前でファイルを作成した場合には読み込むキーの指定が必要となります。

以下の設定はid_rsa以外の名称をつけた場合に設定して下さい。

$ vim ~/.ssh/config

以下のように編集します。

Host <サーバーIP>
IdentityFile ~/.ssh/<秘密鍵ファイル名>

サーバー側でのssh公開鍵の登録

クライアント側で作成したid_rsa.pubをサーバー側にメール等で送付します。sambaやftp等の手段でも構いません。サーバー側では受信した公開鍵ファイルを登録していきます。

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

クライアント側とサーバー側双方の公開鍵に関する設定が終わりました。これでサーバー上のgitユーザーにパスワードなしでssh接続が可能となります。

サーバー上のリポジトリを使用する

では準備が整いましたので準備したtestprojectをクローンしてみましょう。

$ git clone git@<サーバーIP>:/opt/git/testproject.git testproject

編集をコミットしてサーバーにプッシュする

$ cd testproject
$ touch README.md
$ git add --all
$ git commit -m "initial commit"

これで空のREADME.mdファイルを作成してコミットしました。pushしてサーバーへ変更を反映させることでサーバー上のリポジトリが基本的な機能を有していることを確認しましょう。

$ git push origin master

無事pushできればOKです。

ログインシェルを変更する

これまでの設定では認証方式がパスワードか公開鍵かに関わらず、bashでログインできてしまうため、ssh経由でgitアカウントにログインしたユーザーは付与された権限内でファイルの閲覧や読み書きができてしまいます。万一に備えてGitに関する操作以外のことができないようにログインシェルを変えておくこともできます。

サーバー側で以下の作業をします。
まずはgit-shellの場所を調べます。

$ whereis git-shell

筆者環境では/usr/bin/git-shellでした。

root# vim /etc/passwd
# gitユーザーの/bin/bash部分を編集
git:x:1002:1002:,,,:/home/git:/usr/bin/git-shell

この設定によりgitユーザーでログインした際にはgit-shellがログインシェルとなり、Gitリポジトリへのプッシュやクローン等の作業しかできなくなりました。

最後に

これまでGitHubをはじめ誰かが予め作成したリポジトリを使用する機会ばかりだったためにリモートリポジトリを作成して複数の人と作業する環境を構築しようと思い作業してみました。本当はGitLabの導入までやりたかったのですが、それはいずれ機会を見つけて記事にしたいと思います。

Sponsored Link


コメントする

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