Git はファイルの変更履歴を管理するための、バージョン管理システムです。ソフトウェア開発チームなど、複数の人で Git を使ってソースコードを共有するには、Git リモートリポジトリサーバが必要になります。リポジトリサーバのアカウントの管理は、「git」というユーザを作成し、このユーザの鍵登録用ファイル(authorized_keys)に、各クライアントの SSH公開鍵を登録/破棄することで実現します。
しかしこの管理方法は、アカウントの共有になるため、セキュリティ的に望ましくありません。そこで今回は「git」ユーザの権限を必要最低限のものに限定し、ログインに使われた SSH公開鍵によって、どのクライアントからの接続かを特定できるように設定してみました。
Git リポジトリサーバのアカウント管理の概要
Git リポジトリサーバのOS
CentOS 6.6 です。初期状態で Git はインストールされていると思います。もしインストールされていないようでしたら、下記を実行して Git をインストールしておきましょう。
yum install -y git
git ユーザの作成
・「git」ユーザを作成します。※「git-shell」は Git に関する作業しかできない、制限付きシェルです。そのため「git」ユーザは通常のSSH接続はできません。
useradd -s /usr/bin/git-shell git
・SSH公開鍵の登録用ファイルを作成します。
mkdir /home/git/.ssh touch /home/git/.ssh/authorized_keys
・オーナーを「git」ユーザに変更し、適切なパーミッションを設定します。
chown -R git:git /home/git/.ssh chmod 700 /home/git/.ssh chmod 600 /home/git/.ssh/authorized_keys
・Git リポジトリ格納用のディレクトリを作成しておきます。
mkdir /opt/git
Git リモートリポジトリの作成
・リポジトリ用のディレクトリを作成します。
mkdir /opt/git/sample.git
・リポジトリを作成(初期化)します。
cd /opt/git/sample.git/ git init --bare
※リモートリポジトリは、ベアリポジトリ(作業ディレクトリを持たないリポジトリ)として作成する必要があるため「--bare」オプションを指定しています。
・リポジトリのオーナーを「git」ユーザに変更します。
chown -R git:git /opt/git/sample.git/
クライアントのSSH公開鍵の登録
・クライアントPCでSSH鍵を作成します。(すでにSSH鍵がある場合はこの手順は不要です)
ssh-keygen -t rsa -C "your_email@example.com"
・SSH公開鍵をクリップボードにコピーしておきます。
cat ~/.ssh/id_rsa.pub
---(下記をコピー)---------------------------
ssh-rsa AAAAB3NzaC1yc(〜中略〜)n7lN8DaJdgf your_email@example.com
------------------------------
・Git リポジトリサーバのSSH公開鍵の登録用ファイルにペーストします。
vi /home/git/.ssh/authorized_keys
---(下記をペースト)--------------------------- ssh-rsa AAAAB3NzaC1yc(〜中略〜)n7lN8DaJdgf your_email@example.com
このアカウント共有問題の対策
このアカウント管理方法では「git」ユーザを各クライアントが共有するため、誰がリポジトリサーバに接続したのかを確認することができません。 そこで、sshd のログレベル上げて、どの公開鍵(=誰が)で接続されたのかを出力するように、設定を変更しておきます。
vi /etc/ssh/sshd_config
---(下記を変更)---------------------------
#LogLevel INFO
↓
LogLevel DEBUG
------------------------------
・sshd を再起動
service sshd restart
デバッグレベルのため、かなりズラズラと出力されてしまいますが(^^;)「authorized_keys」の何行目に登録されている公開鍵で 接続したかを確認することができます。
tail -f /var/log/secure
(略) Mar 12 04:13:48 gitserver sshd[4447]: debug1: userauth-request for user git service ssh-connection method publickey Mar 12 04:13:48 gitserver sshd[4447]: debug1: attempt 1 failures 0 Mar 12 04:13:48 gitserver sshd[4447]: debug1: test whether pkalg/pkblob are acceptable Mar 12 04:13:48 gitserver sshd[4445]: debug1: temporarily_use_uid: 10001/10001 (e=0/0) Mar 12 04:13:48 gitserver sshd[4445]: debug1: trying public key file /home/git/.ssh/authorized_keys Mar 12 04:13:48 gitserver sshd[4445]: debug1: fd 4 clearing O_NONBLOCK Mar 12 04:13:48 gitserver sshd[4445]: debug1: matching key found: file /home/git/.ssh/authorized_keys, line 1 Mar 12 04:13:48 gitserver sshd[4445]: Found matching RSA key: d4:fb:7e:81:ae:9b:d2:f1:11:2f:e3:7e:67:76:20:bb Mar 12 04:13:48 gitserver sshd[4445]: debug1: restore_uid: 0/0 Mar 12 04:13:48 gitserver sshd[4447]: Postponed publickey for git from 172.16.1.1 port 52620 ssh2 (略)
動作確認
・クライアントPCから Git リポジトリサーバへ「git」ユーザでSSHログインができないことを確認します。
ssh git@gitserver
--(下記のような表示であればOKです)---------------------------
fatal: What do you think I am? A shell?
Connection to gitserver closed.
------------------------------
・リモートリポジトリをクローン(ダウンロード)できることを確認します。
git clone ssh://git@gitserver/opt/git/sample.git
・ファイルを追加して、リモートリポジトリにプッシュ(アップロード)できることを確認します。
cd sample/
echo 'test' > test.txt
git add test.txt
git commit -m 'test'
git push origin master
--(下記のような表示であればOKです)---------------------------
Counting objects: 3, done.
Writing objects: 100% (3/3), 216 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@gitserver/opt/git/sample.git
* [new branch] master -> master
------------------------------
次回からは「git push」でリモートリポジトリにプッシュできます。
終わりに
最近ではセキュリティポリシーで「アカウントの共有」が禁止されていることが多いかと思います。上でも書きましたが「アカウントの共有」による一番の問題は、「誰が」「いつ」サーバに接続したのかの確認ができなくなることです。情報セキュリティの国際規格 ISO27001 でも「すべての利用者は、各個人の利用ごとに一意な識別子(利用者ID)を保有しなければならない」と規定されています。
しかし、なんでもセキュリティでかんじがらめにして、利便性を損なうことも大きな問題だと私は思います。そこで今回は、セキュリティを確保しつつ、Git リポジトリサーバのアカウントを管理する方法をご紹介いたしました。もし、この記事が少しでも皆さんのご参考になれば幸いです。
コメント