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の様にアクセスすることができるようになります。

