2017년 7월 3일 월요일

SSH を用いてパスワードなしで GIT リポジトリにアクセスする

http://blog.saku-lab.net/2012/07/ssh-git.html

備忘録とか言いながら何にも書いてなかったので,ちょくちょく書いていきたいね.

パスワード入力なしで GIT にアクセスする

Gitを使って開発してると,push や pull の度にパスワード入力するのめんどいよね.
そこで,公開鍵認証を使ってパスワード入力なし,かつ安全にリポジトリにアクセスする方法.

今まで

今までは HTTP を使って,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# リポジトリをクローン
$ git clone https://git.saku-lab.net/git/homura.git
# 編集作業とコミット
$ vim madoka.html
...
$ git add .
$ git commit -am " てきとーに編集しちゃったよ ウフフ☆おっけー♪ "
# 競合を確認し,変更をプッシュ
$ git pull
Already up-to-date.
$ git push
(ユーザ名とパスワードを入力)
とかやってて,非常にめんどくさい.

前提条件

  • SSHでGITサーバにログインできる
  • GITサーバは Linux とする
    • テスト環境は CentOS ですが,他のディストリビューションでも変わりません
  • GITサーバで管理者権限にスイッチできる
  • SSHの鍵ペアを生成できる環境
    • Windows : cygwin など
    • Mac, Linux : デフォルトでインストール済み
  • コマンドラインでは,以下の内容を自身の環境で適度に置き換える
    • GITサーバのホスト名は「 git.saku-lab.net 」とする
    • GITサーバへアクセスするユーザ名は「 sakura 」とする
  • プロンプトは以下を意味する
    • c$ : クライアントでの操作
    • s$ : サーバでの操作
    • [cs]$ は一般ユーザを示す
    • [cs]% は特権ユーザを示す

やりかた

鍵ペアの作成・サーバへの登録

まずは,サーバにログインする為の鍵ペアを生成する.
そして,生成された公開鍵をサーバに登録する事で,パスワード認証なしでサーバにログインできるようにする.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# SSHの鍵ペアを生成する
c$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sakura/.ssh/id_rsa): [Enter]
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]
Your identification has been saved in /home/sakura/.ssh/id_rsa.
Your public key has been saved in /home/sakura/.ssh/id_rsa.pub.
...
# サーバに公開鍵鍵を転送し,登録する
c$ scp ~/.ssh/id_rsa.pub sakura@git.saku-lab.net:/home/sakura
(パスワードを入力)
c$ ssh sakura@git.saku-lab.net
sakura@git.saku-lab.net's password:
(パスワードを入力)
s$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys && rm ~/id_rsa.pub
s$ exit
# 秘密鍵でのログインを確認する
c$ ssh sakura@git.saku-lab.net -i ~/.ssh/id_rsa
s$ ■
これで秘密鍵を使ってパスワード認証なしで,サーバにログインできるようになったはず.

公開鍵暗号方式については,興味があったら「PKI」や「RSA」ってキーワードでてきとーにググるとよくわかると思います.

SSHコンフィグの編集

SSHコンフィグを編集し,接続先や秘密鍵を予め設定しておく.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# SSHコンフィグの編集
c$ vim ~/.ssh/config (なければ,新規作成)
Host GITREPO
   HostName         git.saku-lab.net
   IdentityFile     ~/.ssh/id_rsa
   User             sakura
(上記を自分の環境に置き換えて編集して保存)
# SSHコンフィグの反映を確認
c$ ssh GITREPO
s$ ■
これでコンフィグ内の [Host] を指定するだけで,SSHでアクセスする際にコンフィグの内容を適用してくれます.

SSHでGITリポジトリにアクセス!

では,Gitリポジトリへのアクセスに SSH を使用してみます.
1
2
3
4
5
6
7
# コマンド構文
c$ git clone ssh://[Host名]/[リポジトリまでの絶対パス]/[リポジトリ名].git
# SSHでクローンする
c$ git clone ssh://GITREPO/var/gitrepo/homura.git
※ サーバの [/var/gitrepo] にリポジトリが存在している場合
あとは,普通に作業するだけ.
クローンした際にリポジトリの [.git/config] に接続先 (origin) などが記録される為 クローン以降の pull, push は自動的に秘密鍵を使ってアクセスしてくれるわけです.

すでにSSHでアクセスできる環境がある場合は,すごく簡単ですね.これで色々と捗ります.

パーミッションについて

一つ注意として,上記の方法でアクセスした場合,当然アクセスするユーザは秘密鍵で認証されたユーザとなります.
つまり,Gitリポジトリにそのユーザの読み取り権限がなければ git clone, pull が,書き込み権限がなければ git push が出来ません.

一番楽なのは,Gitリポジトリのパーミッションをフルアクセスにしてしまう事ですが,セキュリティ上好ましくはありません.
なので,アクセスさせたいユーザをGitの管理ユーザと同じグループに所属させ,グループへのパーミッションを変更するとアクセス出来るようになります.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 特権ユーザとなり,ユーザをグループに追加
s$ su
s% vigr (viが立ち上がる)
root:x:0:
...
git-user:x:33:gitman,sakura    # ← ユーザ追加(複数の場合はカンマで区切る)
...
※ Gitリポジトリのグループが [git-user] の場合
# パーミッションを変更
s% chmod -R 770 /var/gitrepo
グループは複数追加出来るので,上手く使えば特定のリポジトリへのアクセス制御にも使えます.

なお,グループの定義ファイルは [/etc/group] なので,それを直接編集しても大丈夫です.
しかし,そうすると定義ファイルの再読み込みが必要になるので,[vigr]コマンドを使った方が楽だと思います.
([vigr]コマンドは終了時に[/etc/group]を再読み込みしてくれる)

ファイアウォール

上記の方法で [ssh://] として,SSHプロトコルを使用した場合は標準でtcp/22 が使用されます.
なので,普通に tcp/22 のポートを開ければアクセスが可能です.

ちなみに,GITプロトコルはデフォルトでtcp/9418, HTTPはtcp/80,HTTPSは tcp/443を使用します.

また,セキュリティ上の理由で SSH のポートを変更している場合は,SSHコンフィグにポート番号を指定する事でアクセスが可能です.
1
2
3
4
5
6
7
8
9
10
# SSHコンフィグの編集
c$ vim ~/.ssh/config
Host GITREPO
   HostName         git.saku-lab.net
   Port             12345              # ← ポート番号を指定
   IdentityFile     ~/.ssh/id_rsa
   User             sakura
(上記を自分の環境に置き換えて編集して保存)
また,今回の作業で使用ユーザの公開鍵が登録されたはずなので,サーバ側の [/etc/ssh/sshd_config] の設定でパスワードによるログインを禁止しておく事を強くオススメします.

ローカル環境だけなら良いですが,外にSSHを開いていると1日大体5回くらいは知らないところから接続要求が来ます.
(デフォルトポートなら尚更です.)
もし,これでパスワードログインが破られれば,不正にサーバにログインされます.
1
2
3
4
5
6
7
8
9
10
11
# SSHの設定を編集
s% vim /etc/ssh/sshd_config
...
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no            # ← yes を no に変更する
...
:wq (保存する)
# SSH のサービスを再起動する
s% service sshd restart
これでパスワードによるログインが禁止になりました.
公開鍵を指定せずにアクセスを試みると,アクセスが拒否されます.


それでは,またお会いしましょう. とぅっとぅる~

댓글 없음:

댓글 쓰기