使ってますか? SSH Config
はじめに
本稿は「株式会社オープンストリーム "小ネタ" Advent Calendar 2020」の14日目です。
過去2年ほど14日目を担当してたのでこの日を選んだのですが、特に思い入れはありません。
概要
サーバにSSHログインする時にテキストファイルに書いたものをコピペとかしてませんか? テキストファイルではなくそれ用の設定ファイルに特定の書式で記載しておけばsshコマンドがお手軽に利用できるようになります。
最初に基本的な使い方を説明し、その後に私が良く使う小技をご紹介していきます。
基本的な使い方
~/.ssh/config に必要な情報を記述するだけでsshコマンドが楽になります。
まずは例を見てみましょう。
Host serverA
Hostname 12.34.56.78
User server-user
IdentityFile ~/.ssh/id_rsa.pem
このファイルがある状態でコマンドラインで
$ ssh serverA
と打つだけで下記のコマンドと同じことができます。
$ ssh -i ~/.ssh/id_rsa.pem server-user@12.34.56.78
簡単に解説すると、Hostでコマンドラインで指定するためのホスト名(エイリアス的なもの)を、HostnameにサーバのIPアドレス、Userにユーザ名、IdentityFileに秘密鍵ファイルを指定します。
設定可能な項目の完全なリストはmanページ(本家 / (日本語版)を参照してください。
落とし穴
上記の例のままファイルを作成しても正しく動かないと思います。それはファイルのパーミッションに問題があります。
パーミッションを600にしておきましょう。
chmod 600 ~/.ssh/config
オートコンプリート
正しく設定ファイルが配置されるとsshコマンドでアクセス先のオートコンプリートが効くようになります。
Hostを適切に命名することで便利に利用することができます。
小技
ここからは私が使っている便利だと思っている小技をご紹介します。
踏み台をプロキシする
サーバ環境に直接ログインするのではなく、踏み台を経由することはしばしばあります。踏み台サーバに秘密鍵置いたりしてませんよね?
Host bastion-server
Hostname 11.22.33.44
User bastion-user
IdentityFile ~/.ssh/bastion.pem
Host server
Hostname 10.0.0.1
User server-user
IdentityFile ~/.ssh/server.pem
ProxyCommand ssh -W %h:%p bastion-server
踏み台サーバに関しては普通にログインするための記述をします。
その先にあるサーバのHostnameは踏み台サーバから見たローカルIPアドレスを指定し、ProxyCommandで踏み台サーバにログインするためのコマンドを記述します。
秘密鍵はどちらもクライアント側に配置します。
Includeでファイルを分割する
Includeを使うと設定ファイルを分割することが可能です。
Include conf.d/hosts/*
Host serviceA-server1
Host serviceA-server2
Host serviceB-server1
Host serviceB-server2
Host serviceA-server1
Hostname 12.34.56.78
User server-user
IdentityFile ~/.ssh/serviceA-server.pem
Host serviceA-server2
Hostname 12.34.56.79
User server-user
IdentityFile ~/.ssh/serviceA-server.pem
Host serviceB-server1
Hostname 23.45.67.89
User server-user
IdentityFile ~/.ssh/serviceB-server.pem
Host serviceB-server2
Hostname 23.45.67.90
User server-user
IdentityFile ~/.ssh/serviceB-server.pem
~/.ssh/configにHostのみ記述しているのはオートコンプリートを効かせるようにするためです。
ディレクトリ構成は手元にあっただけなのでこの構成である必要はありません。
ワイルドカードを活用する
先ほどの例を見ると、UserやIdentityFileの設定値が繰り返されているのが気になります。
ユーザ名や秘密鍵ファイル名が変わることはそうそう無いとは思いますが、サーバが増設される場合を考えると省けるものは省きたいですね。
このような場合はワイルドカードを用いてまとめて記述することができます。
ワイルドカードはHostで使用可能で、アスタリスク(*)は任意の文字列、クエスチョンマーク(?)は任意の1文字を表します。
先ほどのファイルをワイルドカードを用いたものに書き換えてみます。
Host serviceA-*
User server-user
IdentityFile ~/.ssh/serviceA-server.pem
Host serviceA-server1
Hostname 12.34.56.78
Host serviceA-server2
Hostname 12.34.56.79
2つのサーバで異なるのはHostnameのみなのでそこは個別に書き、共通のUserとIdentityFileはワイルドカードで記述しています。
例では記載していませんが、ProxyCommandもワイルドカードを用いた設定に記述することもできます。
まとめ
以上です。皆さんもSSH Configを活用して快適なSSHライフを満喫してください。