sshを使ったGitアクセス
Gitではコマンドラインからサーバーにいくつかの方法でアクセスすることが出来ますが、 認証を要する接続では鍵認証を使ったsshの接続が一番良く使われています。
~/.ssh/git_rsaの様な鍵を用意しておいて、 同時に作ったgit_rsa.pubをサーバー側に登録し 以下の様な設定を~/.ssh/configに加えます。
1 2 3 4 |
|
そうすると
$ ssh -T github.com
Hi rcmdnk! You've successfully authenticated, but GitHub does not provide shell access.
の様にきちんと鍵で認証できることが確認でき、git clone
などもsshプロトコルを通して
行うことができる様になります。
GitHubなどではユーザーはすべてgit
ですが、
認証時に鍵を通じて各ユーザーを判断していることがわかります。
多段ssh
GitHubであれば通常どこからでもアクセスできますが、 自前で立ち上げているGitサーバーで外部から直接アクセスできない様な所にある サーバーもあるかと思います。
この様な場合に、外からgit clone
しようと思うと直接は出来ませんが、
多段sshを使うことで操作できる様になります。
多段sshを行うためには、内部サーバーにアクセスでき、かつ外側にオープンになっている 踏み台サーバーが必要になります。
直接アクセスしようとすると
$ ssh -T git.example.com -p 7000
ssh: connect to host git.exaple.com port 7000: Operation timed out
ssh_exchange_identification: Connection closed by remote host
となって繋がれない。
Gitのサーバーがgit.exmaple.com、外からアクセスできる踏み台サーバーがlogin.exmaple.comだとすると 以下の様な設定をすることで一発でアクセスできる様になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
ここで、login_rsaはlogin.example.com用の鍵、git_rsaはgit.example.com用の鍵になります。 この場合login.example.comには鍵を置いておく必要はありません。
追記: 2018/11/18
ここではProxyCommand
として-W
オプションを使って設定しています。
このオプションはOpenSSHが5.4から有効ですが今はほとんど場合入っていると思います。
もし古いバージョンだったり、下に書くように-W
が使えない状況の場合、
コメントアウトしてある方のnc
コマンドを使った設定が使えます。
この場合、nc
が踏み台用サーバーにインストールされている必要があります。
追記ここまで
これで
$ ssh -T git.example.com
Welcome to GitLab, @rcmdnk!
みたいな感じでアクセスできる様になります(この表示はGitLabの場合)。
git clone
/git push
なども内部サーバーからやるのと同じ様にできる様になっているはずです。
ssh -W
オプションは使えない?
OpenSSHでは5.4から-W
というオプションが出来て、これを使って
ProxyCommand ssh login.example.com -W %h:%p
と言った設定をすることで通常のsshでは多段接続できる様になっています。
これにより踏み台サーバー側にnc
がインストールされてなくても多段接続できます。
ただ、この設定でGitサーバーにアクセスしようとしてみたところ
$ ssh -T git.exaple.com
Stdio forwarding request failed: Session open refused by peer
ssh_exchange_identification: Connection closed by remote host
の様な感じに失敗してしまいます。
メッセージ的にはポート指定が間違ってる様な感じなのですが、
ちょっと原因が分かりませんでした。
もしかしたら試したサーバー特有のものかもしれませんが、とりあえずnc
を使えばうまく行っているのでそれでOKとしています。
追記: 2018/11/18
-W
オプションが使えないのはGitサーバーだからではなく、
踏み台サーバーの/etc/ssh/sshd_configの設定で
AllowTcpForwarding=no
が設定されていることが原因でした。
実際、この踏み台サーバーを経由して通常の他のサーバーにログインしようと同じ現象が起きましたし、
これをyes
にしたらGitでもうまくいきました。
このサーバーではポートフォワードを許したくないのでこの設定を入れていたので、
やはりnc
を使った方法を行うことにします。
通常の多段sshを行う際にも踏み台サーバーでポートフォワーディングを許可していない場合には
-W
は使えいのでnc
を使った方法を行う必要があります。
-W
オプションもnc
を使った方法も、ProxyCommand
に書くと似たような設定になりますが、
実際に行っていることはちょっと違って、
- ssh -W: 踏み台経由でポートフォワードを行い、そこにアクセスする
- nc: 踏み台経由でncコマンドを実行して目的のサーバーにアクセスする
という感じ。
最近のsshを使っていて踏み台サーバーがポートフォワードを許可しているのであれば
-W
を使ったほうが簡単です。
ポートフォワードが許可されてない場合、nc
を使う必要がありますが、
この場合には踏み台サーバー側にnc
コマンドがインストールされている必要があります。
追記ここまで
まとめ
Gitのサーバーに対しても多段sshを使ったアクセスが可能です。
ただし、sshのオプションである-W
をProxyCommandに設定するとうまくいかない場合があり、
その場合はnc
コマンドを指定することで通常のsshの様にアクセスすることができるようになります。