SSH接続の近代化 - 公開鍵認証 + コマンド入力簡略化 + 踏み台サーバ対応
目的
自分のPCからSSH接続する機会自体少ないので困ってることはありませんが、環境が旧世代的な感じがしたので改善することにしました。
まず最近、廃れ気味なパスワード認証をやめて公開鍵認証方式に統一します。
踏み台サーバを経由した多段接続では今までSSHコマンドを2度実行していましたが1度で済むように変更します。
さらにコマンド入力がssh <色々なオプション> <ユーザ名>@<ホスト名 >
のように長くならないよう.ssh/config
で簡略化します。
1. 公開鍵方式導入
鍵作成
ローカルPCで公開鍵と秘密鍵を作成します。
鍵の作成にはssh-keygen
コマンドを使います。
色々とオプションを指定できますが、今回はすべてデフォルトです。
SSH接続時に入力ゼロでログインできるよう、passphraseは空にします。
% cd ~/ % ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/hoge/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/hoge/.ssh/id_rsa Your public key has been saved in /Users/hoge/.ssh/id_rsa.pub The key fingerprint is: SHA256:<変な文字列> hoge@<マシン名> The key's randomart image is: +---[RSA 3072]----+ <変なアスキーアート> +----[SHA256]-----+ %
.ssh/
にid_rsa
とid_rsa.pub
が作成されます。
% ls .ssh id_rsa id_rsa.pub known_hosts
known_hosts
は前からあったものなので無視してください。
id_rsa
が秘密鍵、id_rsa.pub
が公開鍵です。
秘密鍵が漏洩しなければ公開鍵は長期間、使い回すことができます。
鍵管理が完璧ならssh-key-gen
は滅多に実施する必要がない作業です。
公開鍵を接続するホストへ配置
作成した公開鍵を接続先のホストへSCP等で転送します。
もし接続先ホストに~.ssh
や~.ssh/authorized_keys
がない場合は作成します。
このときPermissionに気をつけましょう。
~.ssh
は700~.ssh/authorized_keys
は600
[user1@host1]$ install -m 0700 -d ~/.ssh [user1@host1]$ touch ~/.ssh/authorized_keys [user1@host1]$ chmod 600 .ssh/authorized_keys
接続先ホストの~.ssh/authorized_keys
にローカルPCから転送した公開鍵を追記します。
[user1@host1]$ cat id_rsa.pub >> .ssh/authorized_keys
公開鍵認証の動作確認
準備は完了です。
接続してみましょう。
% ssh user1@192.168.1.1 Last login: Fri May 20 15:19:30 2022 from 192.168.1.2 [user1@host1]$
成功です!
パスワードなしで接続することができました。
近代化への大きな一歩です!
2. コマンド入力簡略化
便利になりましたがssh user1@192.168.1.1
ってタイプするの少し面倒ですね。
もっと入力を短く済ませることができます。
ローカルPCで~/.ssh/config
を作成し以下のように記述します。
Host host1 HostName 192.168.1.1 User user1
これでssh host1
とするとssh user1@192.168.1.1
と同じになります。
早速、試してみましょう。
% ssh host1 Last login: Fri May 20 16:38:31 2022 from 192.168.1.2 [user1@host1]$
入力は短くなりましたが同じように接続先ホストへ入ることができました。
3. 踏み台サーバ対応
最後に踏み台サーバを介した遠隔サーバへの多段SSH接続に対応します。
先程のhost1(192.168.1.1)が踏み台サーバで、その先に遠隔サーバ remote1(172.16.1.1)がいると想定します。
今までは最初にローカルPCからhost1へ、次にhost1からremote1へ接続するためにSSHコマンドを2回入力していました。
これが一撃で完結するように変更します。
遠隔サーバへ公開鍵を配置
先程、作成した公開鍵を同じ手順で遠隔サーバにも配置します。
動作確認
ProxyCommandの前提条件が満たされたか動作確認を実施します。
ローカルPCで以下のコマンドを投入します。
% ssh -o ProxyCommand="ssh -W %h:%p host1" foo@172.16.1.1 Last login: Fri May 20 15:19:36 2022 from 172.16.1.2 [foo@remote1]$
ProxyCommandでプロキシ設定をしています。
%h
と%p
は実行時に自動でIPアドレスとポート番号に置換されます。
host1
が.ssh/config
に設定されている前提です。
一発でローカルPCからhost1の先のremote1(172.16.1.1)へ接続できました。
~/.ssh/config
編集
ローカルPCで~/.ssh/config
を開いて以下の内容を追記します。
Host remote1 HostName 172.16.1.1 User foo ProxyCommand ssh -W %h:%p host1
動作確認
動作確認します。
% ssh remote1 Last login: Fri May 20 16:57:26 2022 from 172.16.1.1 [foo@remote1]$
ssh remote1
だけでローカルPCからhost1の先のremote1へ接続できました。
結論
パスワード認証を廃して公開鍵認証方式に統一しました。 これだけでもかなり「旧世代」感を払拭できました。 一度、鍵を作成してしまえば新しい接続先を追加するのも簡単です。
またSSHのProxyCommandを利用して踏み台サーバを介した遠隔サーバへの接続手順を簡素化しました。 同じことを繰り返す馬鹿っぽさが軽減されたと思います。 遠隔サーバにSCPでファイル転送をするときには大きなメリットを感じました。
加えて.ssh/config
を利用してコマンド入力を短縮しました。
より安全に、効率的に、(一見)スマートになりました。 また、ここまで実施しておくとAnsibleなどSSH接続を利用するツールを導入するときもスムーズです。 今後、新しい接続先が増えたときも同じようにしていきたいと思います。