Help us understand the problem. What is going on with this article?

多段sshを行うときに、ローカルの秘密鍵を参照し続ける

More than 3 years have passed since last update.

目的: sshを使い複数のサーバーにログインする

要請

  • 複数のサーバーを経由した場合でも楽に目的のサーバーにログインしたい
  • ユーザー名,ホスト名の入力を省略したい
  • 鍵認証を利用する場合目的のサーバーによって鍵を自動で使い分けたい
  • 多段sshで鍵を利用するときに、常に自分のローカルマシンの秘密鍵を参照したい ((A→B→C)でログインするときにCはBではなくAの鍵を参照するようにしたい)
  • 長時間サーバーにログインしていても通信が切れないようにしたい
  • X11を利用したい
  • 2つ目の接続は1つ目の接続を利用し認証をスキップしたい

※公開鍵認証とはパスワード認証ではない認証方式である(安全性が高い)。

公開鍵の概念http://www.adminweb.jp/web-service/ssh/index4.html
公開鍵の利用http://qiita.com/lasta/items/41e95a2fdded18c34dae

ssh設定ファイルの構造

ファイル名 役割
~/.ssh/config ssh設定ファイル
~/.ssh/id_rsa 秘密鍵(鍵の役割)
~/.ssh/id_rsa.pub 公開鍵(鍵穴の役割)
~/.ssh/authorized_keys 公開鍵の鍵束(実際、公開鍵の中身がテキストで羅列してある)
~/.ssh/known_hosts 過去に利用したサーバーのリスト

鍵穴(公開鍵)をサーバ設置して、手元の鍵(秘密鍵)でログインする

解決策

~/.ssh/configの設定

設定

各マシーン

ローカルPC = macbook
サーバーA : ユーザー名=usernama1 ドメイン=aaa.ac.jp
サーバーB : ユーザー名=username2 ドメイン=bbb.ac.jp

つまりサーバーAにログインするには

shell
ssh username1@aaa.ac.jp

公開鍵と秘密鍵(macbook 上で生成)

秘密鍵:macbook_rsa
公開鍵:macbook_rsa.pub

やりたいこと

ローカルPC → サーバーA
ローカルPC → サーバーA → サーバーB

config
Host A
HostName aaa.ac.jp
User username1
IdentityFile ~/.ssh/macbook_rsa
ForwardAgent yes
ForwardX11 yes
ServerAliveInterval 300
ForwardX11Timeout 596h
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 30m

Host B
HostName bbb.ac.jp
User username2
ProxyCommand ssh A nc %h %p
IdentityFile ~/.ssh/macbook_rsa
ForwardAgent yes
ForwardX11 yes
ServerAliveInterval 300
ForwardX11Timeout 596h
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 30m

※Hostは自由に名前をつけて下さい

使い方

まず鍵をssh-agentに鍵を登録する

shell
sudo ssh-add ~/.ssh/macbook_rsa

Aにログイン

shell
ssh A

Aを経由してBにログイン

shell
ssh B

解説

変数 意味
Host サーバーのニックネーム
IdentityFile 使用する秘密鍵を指定
ForwardAgent yes ssh-agentを利用する
ForwardX11 yes X11の転送を行う
ProxyCommand ssh A nc %h %p Bに行くときはまずAを経由する
ServerAliveInterval 300 300秒おきにシグナルを送り通信が自動で切断されるのを防ぐ
ForwardX11Timeout 596h X11のタイムアウト時間を596時間にして、自動でX11の転送が途切れるのを防ぐ
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 30m
同じサーバーに2つ目のsshを行った時に、1つ目のsshを利用して接続時間を高速にする(認証をスキップ)。
注:ControlPersist 30mを使い30mでタイムアウトを設定しておかないと、sshをログアウトした後も裏で通信が続いている状態になる

ssh-agent http://www.unixuser.org/~euske/doc/openssh/book/chap4.html#make-life-easy-with-ssh-agent
ssh-agentの注意点 [4.4.4. 認証エージェントを使う際の注意を参照] http://www.unixuser.org/~euske/doc/openssh/book/chap4.html#notice-with-ssh-agent
ControlMaster http://d.hatena.ne.jp/tmatsuu/20120707/1341677472

ymd_
機械学習やってます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away