プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

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_rsaid_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
  • HostSSH接続設定の名称。
  • HostNameは接続先のホスト名、IPアドレス
  • Userは接続先との認証で使用するユーザ名。

これで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接続を利用するツールを導入するときもスムーズです。 今後、新しい接続先が増えたときも同じようにしていきたいと思います。