gitlabをjenkinsに統合してビルドを自動化、とかする過程で、そもそもgitlabのsshアクセスで色々気になったので、検証してみました。
検証した結果の仮説がメインでして、決して全ての仕様が確認できているわけではないので、その辺ご了承ください。
また、間違ってたら指摘していただけると非常に助かります。gitエキスパートではないので・・・
ちなみに、githubでも同じなはずです。(githubの場合は自分でインフラを構築しないので、ここまで細かい事を考える必要がそもそもない)
まず、私の環境
サーバー、クライアントOS共にCentOS7。
クライアントからのCloneまでの流れ
基本デフォルトでgitlabを入れた場合、リモートからのアクセスは以下のようにする、と、色んなサイトで書いているはず。
クライアント側:
- ssh-keygen -f gitlab -t rsaとかで、公開鍵・秘密鍵ペアの作成
- .ssh/configにサーバーの情報を登録
- gitの導入(yum install -y gitとか)
サーバー側のgit WebGUIで(rootで):
- プロジェクト作成(just-bashとリポジトリを名づける)
- ユーザ作成(dummy1とする)
- ユーザをプロジェクトのリポジトリにアサイン
サーバー側のgit WebGUIで(dummy1で)
- クライアント側で作成した公開鍵を設定
クライアント側:
- git config –global user.name “dummy1”
- git config –global user.email “dummy1@mylabo.local”
- クローン! git clone git@git.mylabo.local:root/just-bash.git
これで、cloneとかpushとかが出来るようになるわけです。
でも、(少なくとも私は)色んな疑問が出てきました。例えばこんな疑問です。
- git@git.mylabo.local:root/just-bash.gitの@の前の「git」ってsshでアクセスするユーザー?gitのユーザー?
(普通にsshを考えると、これはgitユーザを指していることが分かる。が、私はdummy1でgitにはログインしたいんだよね?) - なんで、dummy1@@git.mylabo.local:root/just-bash.gitじゃないの?
- そもそも、OS(CentOS)にdummy1ユーザーはいらないの?
- なんで、–global user.nameをしないといけないの?ログインに関係あるの?
- 色々こんがらがってきた。
なので、一つ一つ検証してみたのです。
繰り返しますが、軽く検証した結果だけなので、間違ってたら寧ろ教えてください。
ちなみに、少し話がそれますが、色んなサイトで.ssh/configの書き方を以下の通り解説されています。
Host git.mylabo.local HostName git.mylabo.local IdentityFile ~/.ssh/gitlab
私はこれで、以下のエラーが出ました。
[dummy1@sandbox7 just-bash]$ git push -u origin master /home/dummy1/.ssh/config: line 3: Bad configuration option: identifyfile /home/dummy1/.ssh/config: terminating, 1 bad configuration options fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
上記「IdentityFile」を「IdentifyFile」とすることで解決しました。つまり「t」ではなく「f」です。
Host git.mylabo.local HostName git.mylabo.local IdentityFile ~/.ssh/gitlab
では、本題に入ります。
まず、「OSユーザ」と「gitユーザ」は区別して考える
一般的なWebサービスと同じです。
色々試した結果としては以下の通り。
OSユーザはgitだけでいい
gitアプリのユーザはuseraddとかで追加する必要は、ない。
gitのWeb GUIで登録したユーザが自動的にOSに登録されることも、ない。
例えば、今回は「dummy1」をgitのWeb GUIで登録したが、これがOSの/etc/passwdに追加されることはなかった。
git上のユーザは、OSユーザとは関係ない
例えば、gitというユーザはgit Web GUI上には存在しない。(当然作ることは出来るけど、OSユーザとの関連はない)
では、sshでアクセスしているユーザは?
sshはOSのサービスレベルで行われるため、今回の「git@git.mylabo.local:root/just-bash.git」とかやれば、OS(サーバー)のgitユーザでログインを試みることになる。と考えるのが自然。
実際は、やはりその通りだった。確認したのは以下。
- /var/log/secureで、「git」ユーザでsshアクセスがあったログが出力されている。
ちなみに、上の「git Web GUIにて、dummy1の公開鍵を登録」では、具体的には以下をやってるっぽい。
- /var/opt/gitlab/.ssh/authorized_keysにdummy1の公開鍵を登録している
- ちなみに、上記ファイルはOSのgitユーザのauthorized_keysである。
(/etc/passwdを見ると、gitユーザのホームが/var/opt/gitlabだとわかる)
どうやって、gitユーザとOSユーザをマッピングしているの?
上記だと、(git上での)dummy1でもdummy2でもdummy3でもOSの「git」ユーザでsshアクセスすることになる。
では、どうやってgit側はdummy1かdummy2かdummy3かを区別しているのか?
2つの仮説があります。
git config –global user.nameの値を見ている
具体的には~/.gitconfigの”name”を見ている、というものです。
これ、色んなページで書いてます。例えばここ
でも、この”name”を変えても(git Web GUIに登録されていないユーザでも)普通にclone pushが出来ます。dummy1の名前のままで。
どうやら、コメントに入る名前くらいしか影響していないようです。(調査不足)
sshに利用された公開鍵を基に、git側でユーザを判断している
どうやら、これっぽいです。
つまり、そもそもの公開鍵登録はgitのWebGUIとかで行います。なので、gitのユーザと公開鍵の紐付け情報はgitでもてる。
なので、おそらく、こんな流れかと。
- gitユーザでのsshログイン要求がきた。通常のsshシーケンス。の結果として、公開鍵認証を採用。
- gitユーザでログインが成立。利用した公開鍵のフィンガープリントを確認。
- 利用した公開鍵フィンガープリントが登録されているユーザをgitが確認。今回はdummy1に登録されていることを確認。
- dummy1ユーザとしてgitは解釈する。
とすると、同じ公開鍵は複数ユーザで使いまわせない?
まぁ、普通は絶対にやらない事ですが、もし「公開鍵そのものとユーザ紐付けで、ユーザのIdentityを確認している」のであれば、同じ公開鍵を複数のユーザに登録できない。ということになります。
やってみました。(git WebGUI上でdummy2作成時に、dummy1に登録した公開鍵の登録を試みてみた)
結論は、、、出来ませんでした。これからも、上記の仮説は正しいのでは?と思っています。
まとめ、OSユーザとgitのユーザは別物と考える
これが正しいはずです。
てか、普通はこんなことを考える必要はないです。でも、jenkins連携とかセキュリティとか、色々設定していくと不安になったりしますよね。
コメント