gitlabのsshアクセスがうまくいかない!って人は見てください

この記事は約7分で読めます。
スポンサーリンク

gitlabをjenkinsに統合してビルドを自動化、とかする過程で、そもそもgitlabのsshアクセスで色々気になったので、検証してみました。

検証した結果の仮説がメインでして、決して全ての仕様が確認できているわけではないので、その辺ご了承ください。

また、間違ってたら指摘していただけると非常に助かります。gitエキスパートではないので・・・

ちなみに、githubでも同じなはずです。(githubの場合は自分でインフラを構築しないので、ここまで細かい事を考える必要がそもそもない)

まず、私の環境

サーバー、クライアントOS共にCentOS7。

クライアントからのCloneまでの流れ

基本デフォルトでgitlabを入れた場合、リモートからのアクセスは以下のようにする、と、色んなサイトで書いているはず。

クライアント側:

  1. ssh-keygen -f gitlab -t rsaとかで、公開鍵・秘密鍵ペアの作成
  2. .ssh/configにサーバーの情報を登録
  3. gitの導入(yum install -y gitとか)

サーバー側のgit WebGUIで(rootで):

  1. プロジェクト作成(just-bashとリポジトリを名づける)
  2. ユーザ作成(dummy1とする)
  3. ユーザをプロジェクトのリポジトリにアサイン

サーバー側のgit WebGUIで(dummy1で)

  1. クライアント側で作成した公開鍵を設定

クライアント側:

  1. git config –global user.name “dummy1”
  2. git config –global user.email “dummy1@mylabo.local”
  3. クローン! 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

参照:Github SSH Config

では、本題に入ります。

まず、「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でもてる。

なので、おそらく、こんな流れかと。

  1. gitユーザでのsshログイン要求がきた。通常のsshシーケンス。の結果として、公開鍵認証を採用。
  2. gitユーザでログインが成立。利用した公開鍵のフィンガープリントを確認。
  3. 利用した公開鍵フィンガープリントが登録されているユーザをgitが確認。今回はdummy1に登録されていることを確認。
  4. dummy1ユーザとしてgitは解釈する。

とすると、同じ公開鍵は複数ユーザで使いまわせない?

まぁ、普通は絶対にやらない事ですが、もし「公開鍵そのものとユーザ紐付けで、ユーザのIdentityを確認している」のであれば、同じ公開鍵を複数のユーザに登録できない。ということになります。

やってみました。(git WebGUI上でdummy2作成時に、dummy1に登録した公開鍵の登録を試みてみた)

結論は、、、出来ませんでした。これからも、上記の仮説は正しいのでは?と思っています。

まとめ、OSユーザとgitのユーザは別物と考える

これが正しいはずです。

てか、普通はこんなことを考える必要はないです。でも、jenkins連携とかセキュリティとか、色々設定していくと不安になったりしますよね。

コメント

タイトルとURLをコピーしました