前回の投稿では `ssh` コマンドの基本的な使用法や便利なオプションについて解説しました。しかし、毎回複雑なIPアドレス、ユーザー名、ポート番号などを入力するのは手間がかかります。そこで **SSH Configファイル** を活用すれば、この煩わしさを一度に解消できます。まるでブックマークのように、頻繁に使用するサーバーの接続情報を保存し、**エイリアス(Alias)** を使って簡単に接続できる魔法のファイルです。 ![SSH configをブックマークのように使用する開発者のイラスト](/media/whitedec/blog_img/ssh_config_favorite_style.webp) --- ## SSH Configファイルとは何ですか? {#sec-ae967d1e4607} **SSH Configファイル** は、SSHクライアントの動作をユーザーがカスタマイズするための設定ファイルです。このファイルに特定のホストに対する接続情報(ユーザー名、ポート、使用するキーファイルなど)をあらかじめ保存しておくことで、後から短いエイリアスだけで接続できるようになります。 * **位置:** 通常、ユーザーのホームディレクトリ内の `.ssh` フォルダーに `config` という名前で存在します。 + 例: `~/.ssh/config` * **ファイル作成:** もし `~/.ssh/config` ファイルが存在しない場合は、自分で作成できます。 `bash touch ~/.ssh/config chmod 600 ~/.ssh/config # セキュリティのため、読み書き権限は所有者にのみ付与` --- ## Configファイル作成ルール {#sec-a3db0cb7ebc5} Configファイルは単純なテキストファイルで、各ホストに対する設定は `Host` キーワードで始まり、ブロック形式で記述されます。 #### 基本構造 ``` Host [エイリアス] [オプション1] [値1] [オプション2] [値2] ... ``` * **`Host [エイリアス]`**: このブロックの開始を示し、使用する**エイリアス(Alias)**を定義します。このエイリアスをSSHコマンドで使用します。エイリアスの代わりに実際のホストアドレス(IPまたはドメイン)を直接入力することもできます。ワイルドカード文字(`*`、`?`)も使用できます。 * **インデント**: `Host` 以下のオプションは**インデント**が必要です。空白やタブのどちらを使用しても構いませんが、一貫性を保つことが望ましいです。 * **オプション**: `Host` 以下には、そのエイリアスで接続する際に適用されるさまざまなSSHオプションを一覧で記述します。これらのオプションは以前 `ssh -オプション` のように使用したものと同様です。 ### よく使われるオプション {#sec-461fa4e78212} | | | | | --- | --- | --- | | **オプション** | **説明** | **例の値** | | `HostName` | 実際に接続するサーバーのIPアドレスまたはドメイン名 | `192.168.1.100` または `example.com` | | `User` | リモートサーバーに接続するユーザーアカウント名 | `ubuntu`, `ec2-user`, `root` | | `Port` | リモートサーバーのSSHポート番号(デフォルトは22) | `2222` | | `IdentityFile` | 接続時に使用する秘密鍵ファイルのパス | `~/.ssh/id_ed25519_myserver` | | `ForwardAgent` | SSHエージェントフォワーディングを有効にする(Agent Forwarding, `ssh-agent`使用時) | `yes` | | `StrictHostKeyChecking` | ホストキーの検査を厳格に行うかどうか(`yes`推奨) | `no`(初期テスト時に一時的に使用) | | `PortForwarding` | ポートフォワーディングを許可するかどうか | `yes` | | `LocalForward` | ローカルポートフォワーディングの設定(`-L`オプションと同じ) | `8080 localhost:80` | | `ServerAliveInterval` | サーバーが生きているか確認するインターバル(秒単位) | `60` (接続が切れないように) | | `ServerAliveCountMax` | サーバー確認失敗時の接続を切る前の再試行回数 | `3` | --- ## SSH Configファイル作成例 {#sec-44f411bf9d14} よく接続するいくつかのサーバーに対する設定を `~/.ssh/config` ファイルに追加してみましょう。 ``` # 最初のサーバー: ウェブサーバー(エイリアス: webserver) Host webserver HostName 192.168.1.100 User ubuntu Port 2222 IdentityFile ~/.ssh/id_ed25519_webserver # ウェブサーバー専用のキーを使用 # 二つ目のサーバー: 開発サーバー(エイリアス: devbox) Host devbox HostName dev.example.com User developer IdentityFile ~/.ssh/id_rsa_dev # RSAキーを使用 # このサーバーに接続時、ローカル8000ポートをリモートサーバーの80ポートにフォワーディング LocalForward 8000 localhost:80 # 三つ目のサーバー: 全てのAWS EC2サーバー(エイリアス: aws-*) Host aws-* User ec2-user IdentityFile ~/.ssh/aws_ec2_key.pem # 接続が切れないように定期的に信号を送ります ServerAliveInterval 60 ServerAliveCountMax 3 # 特定のIP範囲に対する一般設定(エイリアス: 10.0.0.*) Host 10.0.0.* User admin Port 22 ``` **説明:** * `webserver`: `192.168.1.100`サーバーに `ubuntu`ユーザーとして `2222`ポートと `id_ed25519_webserver`キーを使用して接続できるようになります。 * `devbox`: `dev.example.com`サーバーに `developer`ユーザーとして `id_rsa_dev`キーを使用して接続し、ローカル8000ポートをリモート80ポートにフォワーディングします。 * `aws-*`: `aws-`で始まる全てのエイリアスに適用される設定です。例えば `aws-prod`や `aws-dev`で接続すると、`User`と `IdentityFile`の設定が自動的に適用されます。`HostName`が指定されていない場合、`ssh aws-prod`のように接続すると、`aws-prod`がホスト名として使用されます。 * `10.0.0.*`: `10.0.0.x`形式のIPアドレスに接続する際に自動的に `admin`ユーザーとデフォルトの22ポートが適用されます。 --- ![SSH接続ボタンを押すとネットワークに広がる魔法のような画像](/media/whitedec/blog_img/ssh_config_network_magic.webp) ## Configファイルの使い方 {#sec-2717ae26331a} Configファイルに設定を保存したら、実際の接続はさらに簡単になります。上記の例を基に試してみましょう。 ### 1. エイリアスで接続する {#sec-2f101fd70e10} エイリアスだけを使用してSSH接続コマンドを実行します。 * **`webserver`エイリアス使用:** ``` ssh webserver Enter passphrase for key '/home/youruser/.ssh/id_ed25519_webserver': ubuntu@webserver-ip:~ $ ``` ``` このコマンドは内部的に `ssh -p 2222 -i ~/.ssh/id_ed25519_webserver ubuntu@192.168.1.100` と同じように動作します。 ``` * **`devbox`エイリアス使用:** ``` ssh devbox Enter passphrase for key '/home/youruser/.ssh/id_rsa_dev': developer@devbox-domain:~ $ ``` ``` (同時にローカル8000ポートに接続するとdev.example.comの80ポートに接続されます) ``` * **`aws-prod`(ワイルドカードエイリアス)使用:** ``` ssh aws-prod Enter passphrase for key '/home/youruser/.ssh/aws_ec2_key.pem': ec2-user@aws-prod-hostname:~ $ ``` **注意:** `aws-prod`のように、`HostName`オプションを明示的に指定していないワイルドカード `Host` の場合、`HostName`オプションを明示的に指定するか、コマンドラインでホスト名を指定する必要があります。上記の `aws-*` の例では `HostName`が指定されていないため、実際に `ssh aws-prod`を実行するとSSHクライアントは`aws-prod`をホスト名として解釈します。より明確に使用するためには、`Host prod-server`のようにエイリアスと`HostName prod.example.com`をマッピングするのが一般的です。 --- ## Configファイル使用の利点 {#sec-758cdbcd9f07} * **便利さ:** 長く複雑なSSHコマンドを短いエイリアスに置き換えることで、入力エラーを減らし、時間を節約できます。 * **生産性:** よく接続するサーバーを迅速に行き来できるため、作業効率が向上します。 * **管理の容易さ:** 接続関連の全ての設定を一箇所で管理できるため、保守が容易です。例えば、サーバーのIPアドレスが変更されてもConfigファイルだけを修正すれば対応できます。 * **セキュリティ:** 重要な情報(例:キーファイルのパス)をコマンドヒストリーに残す必要がありません。 --- ## おわりに {#sec-ca989075484a} SSH Configファイルは、SSHを使用するすべての開発者やシステム管理者にとって必須のツールです。このファイルを活用することで、SSH接続をより便利で効率的にできます。 `~/.ssh/config`ファイルを開いて、あなた自身のエイリアスを作ってみてください! SSHに関連した他の投稿もぜひ読んでみてください!右側の検索窓で「ssh」と検索すると、SSHに関するさまざまな記事を探すことができます。 疑問がある場合は、いつでもコメントで質問してください!