NEWS

知ってるとちょっと便利なSSH周りのTIPS

開発部のSSです。

今回は知ってるとちょっと便利なSSH周りのTIPSについてです。

最近ではAWS Systems Managerや、各クラウドのBastionサービスなどが主流になり、純粋にSSHを使うことが減って来ているかもしれません。
また、クラウドネイティブの考え方が一般的になり、各所でコンテナ化なども進み、そもそもSSHを意識する事がない方もいらっしゃるかと思います。

しかし、まだまだ場所によっては必須で使われているところも多いかと思います。
また、細かいところは知らなくても、AIに聞くとだいたい自動的に設定してくれたりするかと思います。

既にあまり必要とされていない方も多いかもしれませんが、
昔自分が使っていて便利だと思ったSSH関連のTIPSなどを軽く紹介してみようと思います。

1. SSH接続が頻繁に切れる

# ~/.ssh/config に追記
`ServerAliveInterval 60`

を入れておくと、60秒に1回応答確認してくれるので切断されなくなるので設定しておくと安定します。

なお、サーバ側で ClientAliveInterval や ClientAliveCountMax が設定されている場合、そちらが優先されます。長時間接続が必要な場合はサーバ側の設定も確認してみましょう。

2. 公開鍵の登録を楽にする

新しいホストに公開鍵を登録する作業は慣れないと地味に面倒だったりしますが、
ssh-copy-id という便利なコマンドがあり、こちらを使うととても便利です。

https://www.ssh.com/academy/ssh/copy-id

$ ssh-copy-id -i new_ed25519.pub remotehost

ssh-copy-id が入っていない場合は、brew install ssh-copy-id(macOS)などでインストールできます。
macOS では Homebrew 経由で、Linux では多くのディストリビューションで標準パッケージとして利用できます。

3. SSH接続時の面倒なパスフレーズ入力をスキップする

各種サーバにログインする際に毎回パスフレーズを入力していて面倒だったりしませんでしょうか?

ssh-agent という便利なものがあり、秘密鍵のパスフレーズを記憶させることで、再接続時もパスフレーズ入力なしで SSH 接続が可能になります。

https://www.ssh.com/academy/ssh/agent

また、踏み台サーバを挟んだ多段構成になっている場合でも、ForwardAgent を利用することで、ssh先にエージェントを運んで安全にsshする事が可能になります。

### 秘密鍵を登録
$ ssh-add .ssh/id_ed25519_xxx

### 登録されている秘密鍵を確認
$ ssh-add -l

### 後はsshするだけ
$ ssh remotehost
  -> パスフレーズ無しで接続可能

$ ssh-add -l
2048 SHA256:Az2ytJzWQOF7LMnjt3RZZZJSpWPTukC3hndQ ~/.ssh/aaaa_id_rsa (RSA)
256 SHA256:3iKXTzwJgmcnyXowGAALCFwHorbPb6dq6YZeE zzzz@example.com (ED25519)
1024 SHA256:fcw0NrCOR2H2uK0BBxgDJd0onMt3UmYkhyo ~/.ssh/bbb_rsa (RSA)

macOS ではログイン時に ssh-agent が自動で起動し、UseKeychain yes を ~/.ssh/config に設定しておくと、macOSのキーチェーンにパスフレーズを保存できます。

Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_ed25519

4. Forward Agentで秘密鍵の設置を最小限に

サーバが多段構成になっている場合、各サーバに秘密鍵を置いていくのはセキュリティ的によろしくありません。

サーバA -> サーバB -> サーバC

こういった場合に、エージェントフォワードを使うと最初の sshで使用した秘密鍵を中間のサーバに設置しなくても済むようになります。

ssh-agent が有効になっているシェルで、
$ ssh -A server_B
もしくは
.ssh/config
ForwardAgent yes
とすることで、ログイン先のホストでも同じ鍵を利用することが可能になります。

https://www.ssh.com/academy/ssh/agent#ssh-agent-forwarding

ForwardAgent は便利ですが、中間サーバが信頼できる環境であることが前提です。攻撃者が中間サーバを操作できる場合、エージェント経由で署名リクエストを悪用される恐れがあります。必要な時だけ -A を付ける運用が安全です。

5. ssh接続時に WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! で怒られる

ssh接続時に以下のような出力を見たことがあるかと思います。


$ ssh se-dev1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
59:f1:87:65:0e:3d:d1:3b:d4:48:f4:1f:ba:8e:ec:db.
Please contact your system administrator.
Add correct host key in /home/xxxx/.ssh/known_hosts to get rid of this message.
Offending key in /home/xxxx/.ssh/known_hosts:362
RSA host key for se-dev1.dev has changed and you have requested strict checking.
Host key verification failed.

これは接続先のサーバがOSを再インストールしたり、IPを変えたり、ホスト名を変更したりした場合に発生します。
~/.ssh/known_hosts の該当行を削除するのでもいいのですが、もう少し楽に、

$ ssh-keygen -R remotehost`
# 再接続時に自動で新しいフィンガープリントが登録されます
$ ssh remotehost

とすると、接続先サーバの情報(フィンガープリント)を一発で削除出来るので少し楽になったりします。

known_hosts にホスト名ではなくIPアドレスで登録されている場合、同じIPを別サーバで再利用するとこの警告が出ることがあります。クラウド環境では特によくあるケースです。

6. ProxyJump (新しい多段SSH構文)

先ほど紹介した多段 SSH では、従来の -A オプションよりも安全で管理しやすい ProxyJump が近年よく使われています。
ProxyJump は SSH 7.3 以降でサポートされており、.ssh/config に設定しておくと ssh target だけで踏み台を経由できます。

Host target
  ProxyJump bastion

まとめ

SSH は長年変わらないように見えて、細かい便利機能や改善も進んでいます。
日々の業務の中で「あれ?」と思った時に少し調べてみると、意外と新しい発見があるかもしれません。

それでは。

文:開発部SS