Git はファイルの変更履歴を管理するための、バージョン管理システムです。ソフトウェア開発チームなど、複数の人で Git を使ってソースコードを共有するには、Git リモートリポジトリサーバが必要になります。リポジトリサーバのアカウントの管理は、「git」というユーザを作成し、このユーザの鍵登録用ファイル(authorized_keys)に、各クライアントの SSH公開鍵を登録/破棄することで実現します。
しかしこの管理方法は、アカウントの共有になるため、セキュリティ的に望ましくありません。そこで今回は「git」ユーザの権限を必要最低限のものに限定し、ログインに使われた SSH公開鍵によって、どのクライアントからの接続かを特定できるように設定してみました。
Git リポジトリサーバのOS
CentOS 6.6 です。初期状態で Git はインストールされていると思います。もしインストールされていないようでしたら、下記を実行して Git をインストールしておきましょう。
git ユーザの作成
・「git」ユーザを作成します。※「git-shell」は Git に関する作業しかできない、制限付きシェルです。そのため「git」ユーザは通常のSSH接続はできません。
・SSH公開鍵の登録用ファイルを作成します。
・オーナーを「git」ユーザに変更し、適切なパーミッションを設定します。
・Git リポジトリ格納用のディレクトリを作成しておきます。
Git リモートリポジトリの作成
・リポジトリ用のディレクトリを作成します。
・リポジトリを作成(初期化)します。
※リモートリポジトリは、ベアリポジトリ(作業ディレクトリを持たないリポジトリ)として作成する必要があるため「--bare」オプションを指定しています。
・リポジトリのオーナーを「git」ユーザに変更します。
クライアントのSSH公開鍵の登録
・クライアントPCでSSH鍵を作成します。(すでにSSH鍵がある場合はこの手順は不要です)
ssh-keygen -t rsa -C "your_email@example.com"
ssh-keygen -t rsa -C "your_email@example.com"
・SSH公開鍵をクリップボードにコピーしておきます。
cat ~/.ssh/id_rsa.pub
---(下記をコピー)---------------------------
ssh-rsa AAAAB3NzaC1yc(〜中略〜)n7lN8DaJdgf your_email@example.com
------------------------------
cat ~/.ssh/id_rsa.pub
---(下記をコピー)---------------------------
ssh-rsa AAAAB3NzaC1yc(〜中略〜)n7lN8DaJdgf your_email@example.com
------------------------------
・Git リポジトリサーバのSSH公開鍵の登録用ファイルにペーストします。
vi /home/git/.ssh/authorized_keys
vi /home/git/.ssh/authorized_keys
このアカウント共有問題の対策
このアカウント管理方法では「git」ユーザを各クライアントが共有するため、誰がリポジトリサーバに接続したのかを確認することができません。 そこで、sshd のログレベル上げて、どの公開鍵(=誰が)で接続されたのかを出力するように、設定を変更しておきます。
vi /etc/ssh/sshd_config
---(下記を変更)---------------------------
#LogLevel INFO
↓
LogLevel DEBUG
------------------------------
---(下記を変更)---------------------------
#LogLevel INFO
↓
LogLevel DEBUG
------------------------------
・sshd を再起動
service sshd restart
service sshd restart
デバッグレベルのため、かなりズラズラと出力されてしまいますが(^^;)「authorized_keys」の何行目に登録されている公開鍵で 接続したかを確認することができます。
tail -f /var/log/secure
tail -f /var/log/secure
動作確認
・クライアントPCから Git リポジトリサーバへ「git」ユーザでSSHログインができないことを確認します。
ssh git@gitserver
--(下記のような表示であればOKです)---------------------------
fatal: What do you think I am? A shell?
Connection to gitserver closed.
------------------------------
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
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」でリモートリポジトリにプッシュできます。
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 リポジトリサーバのアカウントを管理する方法をご紹介いたしました。もし、この記事が少しでも皆さんのご参考になれば幸いです。
댓글 없음:
댓글 쓰기