(最終更新月:2023年4月)
✔このような方へ向けて書かれた記事となります
「SSHコマンドって何ができるのだろうか?」
「SSHコマンドの書き方・使い方を教えてほしい」
「SSHコマンドの実例が見てみたい」
✔当記事を通じてお伝えすること
- SSHコマンドの基本
- SSHコマンドの書き方やオプションについて
- SSHコマンドの実例
当記事では、SSHコマンドについての基本はもちろん、オプションの一覧やその使い方、実例まで丁寧に解説しています。
ぜひ最後までご覧ください。
SSHについての基礎知識
まずはSSHについて、どんなものなのかやそのメリットについて見ていきます。
基本的な使い方を知る前に、必ず知っておきたい内容です。
- SSHとは?
- SSHの歴史
- SSHの利点
- Telnetとの違い
- SSHの重要性
SSHとは?
SSHコマンドは、Secure Shell(SSH)プロトコルを利用して、リモートコンピュータと安全に通信するためのコマンドラインツール。
SSHコマンドを使えば、暗号化された接続経由でリモートシステム(パソコン)にログインし、コマンドの実行やファイルの転送をおこなえます。
SSHは、インターネットやネットワーク上でセキュアな通信を確立するために広く使用されており、サーバー管理やネットワーク機器の設定など、多くの場面で役立ちます。
SSHの歴史
SSHは、1995年にTatu Ylönenによって開発されました。
それまで使われていたTelnetなどのプロトコルは、通信内容が平文で送られていたため、セキュリティ上の問題がありました。
SSHは暗号化された通信を提供することで、これらの問題を解決しました。
SSHの利点
SSHの主な利点は以下の通りです。
- 通信内容の暗号化によるセキュリティの強化
- パスワード認証や鍵認証など、柔軟な認証方法の提供
- ファイル転送やポートフォワーディングなど、多様な機能のサポート
Telnetとの違い
サーバー間の通信で使われるTelnetとの違いは以下のとおり。
項目 | SSHコマンド | TELNETコマンド |
---|---|---|
暗号化 | 通信が暗号化される | 通信が暗号化されない |
認証 | 公開鍵認証やパスワード認証 | パスワード認証のみ |
ポート番号 | TCPポート22 | TCPポート23 |
セッションの確立方法 | 公開鍵暗号化を使用 | 単なるTCP接続 |
Telnetは、通信内容が平文で送られるため、第三者によるデータの盗み見や改ざんが容易になってしまうのです。
SSHの重要性
SSHコマンドは、リモートサーバーへの安全な接続を確立するためのプロトコルです。
以下にSSHコマンドの重要性についていくつかのポイントを挙げます。
- 暗号化された通信:データの暗号化によって、通信の盗聴や改ざんからデータを守る
- リモートアクセス:リモートで作業する必要がある場合や、サーバー管理を行う必要がある場合に重要な役割を果たす
- セキュアなファイル転送:SCPやSFTPなどのプロトコルを使用することで、暗号化された通信上でファイルを転送できる
- ポートフォワーディング:ポートフォワーディング機能により、リモートサーバー上のアプリケーションをローカルで実行できる
- SSHキー認証:SSHキーで認証することにより、パスワードを使用することなく、より安全な認証方法を実現
- セキュアなリモート管理:セキュアな方法でサーバーを管理し、重要なシステムのセキュリティを確保できる
SSHコマンドの基本構文
SSHコマンドの書き方は簡単です。
基本構文と少し応用した使い方までご紹介します。
- 接続するための基本コマンド
- SSHコマンドのオプション例
接続するための基本コマンド
SSHコマンドの基本構文は以下の通りです。
ssh ユーザー名@ホスト名
#ドメイン名でアクセスする例
ssh user@example.com
#IPアドレスでの接続も可能
ssh user@192.168.11.31
SSHコマンドのオプション例
SSHコマンドには、接続時の動作を変更するオプションがいくつかあります。
例えば、ポート番号を指定する場合は以下のようになります。
ssh -p ポート番号 ユーザー名@ホスト名
ssh -p 2222 user@example.com
SSHのセットアップ
PCによってはSSHのセットアップが必要な場合があります。
とくにWindowsを使っている方は、SSH接続のために事前設定は必須です。
- よく使われるSSHクライアントとサーバーの紹介
- SSHクライアントのインストール
- SSHサーバーの設定
よく使われるSSHクライアントとサーバーの紹介
まずはSSHクライアントとサーバーで、よく使われるものをご紹介します。
- Windows用SSHクライアント:PuTTY, Windows Subsystem for Linux (WSL)
- macOS用SSHクライアント::Terminal.app (標準のターミナルアプリケーション)
- Linux用SSHクライアント::OpenSSH (多くのディストリビューションで標準でインストール済み)
- オープンソースのSSHサーバー:OpenSSH Server
SSHクライアントとは、リモートサーバーに接続するためのツール。
SSHサーバーとは、SSHクライアントからの接続を受け入れる側のサーバーのこと。
SSHクライアントのインストール
SSHクライアントのインストールについては、macOSとLinuxでは不用な場合がほとんど。
Windowsでのみ、以下の手順でPuTTYなどのツールが必要になります。
- アクセス: PuTTYの公式ウェブサイト(https://www.putty.org/)にアクセス
- ダウンロードページ内の「Package files」>「putty-<version>-installer.msi」へ進みダウンロード
- インストール:インストールウィザードに従ってPuTTYをインストール
- PuTTYの起動:Windowsのスタートメニューやデスクトップに作成されたショートカットからPuTTYを起動します。
- 接続設定(ホスト):PuTTYのメインウィンドウで、「Host Name (or IP address)」欄に接続先のホスト名またはIPアドレスを入力
- 接続設定(Port):「Port」欄には、接続先のポート番号を入力(デフォルトポートは22)
- 保存と接続:セッション設定を保存する場合は、「Saved Sessions」欄にセッション名を入力し、「Save」ボタンをクリック
- ユーザー名とパスワードの入力:接続が開始されると、新しいウィンドウが表示されるので、ユーザー名・パスワードを入力
SSHサーバーの設定
SSHサーバーの設定は、主に以下の手順で行います。
- SSHサーバーのインストール
- SSHサーバーの設定ファイル (/etc/ssh/sshd_config) の編集
- SSHサーバーの再起動
Windowsでのインストール方法については、以下の記事で細かく解説しています。
SSHキーの生成と設定
SSHキーの生成とその設定方法をご覧ください。
SSHサーバーによっては、SSHキーでの接続が必要になる場合があります。
- 鍵ペアの生成
- 公開鍵の登録
- 秘密鍵の保管
鍵ペアの生成
以下のコマンドを実行して、RSA鍵ペアを生成します。
ssh-keygen -t rsa -b 4096
公開鍵のペアを作成します。
公開鍵の登録
生成された公開鍵をリモートサーバー内の、「~/.ssh/authorized_keys」ファイルに追加。
公開鍵は、「*.pub」と.pubで終わっているキーのことです。
authorized_keysには以下のように記述されています。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC9ZIR1rI41SPmXLkbEjFAFxxxxxxxxxxxxxxxxxxO3nQUs5PXEsdbXWjxxxxx/+xxxxx/xxxxxxxxxx2kbJxTlsJVMVChPQClU/TAjv+z5VrQT6pPAPd8YBSYjuT1Z9XF+UXiw4HY1JrOQgUUR4iQ01zQhqjN5jbhd+xxxxxxxxxxxxxxxxxxxxCzK0LH1TLe/REQQj0kR+qSwdSRZlrxds77EBPF49j6t5ELiTvZEpb3T98xOAjNxw5/hqoRxOJzlTeMkREz+IVxsGTqhznwCkyjlC0Xlnp+SUcceHW9gtK9LyuI7a7rwMwzygLrjtBRB8/qC/7Sh10xxxxxxxxxxxxxxx+lwds/AdokMeawDIGeJyRPAGDFQbEoqDLam/xxxxxxxxxxxxxdsMbHO0GjX0dt9dcveevRP+AYr6U= user1@randomdigit-Pro.local
ssh-rsa AAAAB3NzaC1yc2EAAAADAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+imlsZnKHdaRPPv45WXW+4SHx61hHodsfQFXIjIELMVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxj8bCmo5Qbw7JnlqC+4jeUcTAtCpeiAr5U3CMv1+xAtHCOuDiFjpCMwGfky920WO7PjEGPfclHJA031AQF/BI2XvSlJLnjeZ39axx0AqNVjthks5hmSAxxxxxxxxxxxxxxxxY4I8d1lmO3TjCl94nb7+zZjrFhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx61VUC+q3/TmPKW/DyaWABRGa7jHEXx0iHJgsaHq/RF6Y1mQ7CEL8pTiOs3WF4J/s9+FjtV0jsIDZedHadHTN2uPelKhM47eAP99dS2DDaDgi1A6QAFE+EpRgH5L+vjOoheAq1tqwBP3aegAuEVlYtxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNRUAoeE2CoXA8ckWFumJXfYucAaa7XE= xxx@homepc
※キーは一部伏せています。
秘密鍵の保管
秘密鍵は安全な場所に保管し、パスフレーズを設定して保護しましょう。
SSHでリモートサーバーに接続する方法
SSSHでリモートサーバーに接続する方法は2つ。
- パスワード認証で接続
- 鍵認証で接続
パスワード認証で接続
SSHコマンドを実行し、プロンプトに表示されるパスワード入力でリモートサーバーにアクセスします。
詳しくはこちらで解説しています。
鍵認証で接続
鍵認証を利用する場合、以下のコマンドで接続します。
ssh -i 秘密鍵のパス ユーザー名@ホスト名
詳しくはこちらで解説しています。
SSHコマンドの実践的な使い方
SSHコマンドを実際に使ってみましょう。
できることをご紹介していきます。
- ファイル転送
- ポートフォワーディング
- SSHトンネリング
ファイル転送
scpコマンドを使ってリモートサーバーとファイルを転送できます。
SSH接続が確率されたうえで、scpコマンドを実行します。
scp ローカルファイル ユーザー名@ホスト名:リモートディレクトリ
具体例も含めてこちらをご覧ください。
ポートフォワーディング
SSHを使ってポートフォワーディングをおこなえます。
主に以下の2種類あるので、それぞれご説明します。
- ローカルポートフォワーディング(Local Port Forwarding)
- リモートポートフォワーディング(Remote Port Forwarding)
ローカルポートフォワーディング(Local Port Forwarding)
クライアントマシンの特定のポートをリモートマシンの別ポートにトンネル化して転送する方法です。
リモートマシン上のサービスにセキュアにアクセスできるようになります。
SSHコマンドでローカルポートフォワーディングを行うには、以下の構文を使用します。
ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [SSHサーバーのユーザー名]@[SSHサーバーのアドレス]
例えば、ローカルマシンのポート8080をリモートマシンのポート80にフォワーディングする場合、次のように実行します。
ssh -L 8080:localhost:80 user@example.com
リモートポートフォワーディング(Remote Port Forwarding)
リモートマシンの特定のポートをクライアントマシンの別ポートにトンネル化して転送する方法。
リモートマシンからクライアントマシン上のサービスにアクセスします。
SSHコマンドでリモートポートフォワーディングを行うには、以下の構文を使用します。
ssh -R [リモートポート]:[ローカルホスト]:[ローカルポート] [SSHサーバーのユーザー名]@[SSHサーバーのアドレス]
例えばリモートマシンのポート9090をクライアントマシンのポート9000にフォワーディングする場合、次のように実行します。
ssh -R 9090:localhost:9000 user@example.com
SSHトンネリング
SSHトンネリングを使って、セキュアな接続を確立します。
ssh -D ローカルポート ユーザー名@ホスト名
SSH設定のカスタマイズ
SSHの設定をカスタマイズして、より使用環境に近づける方法を見ていきましょう。
- 接続タイムアウトの設定
- キーボードインタラクティブ認証の設定
- バナーメッセージの表示
SSHの設定ファイルは以下の場所にあることがほとんどです。
/etc/ssh/sshd_config
接続タイムアウトの設定
変数「ClientAliveInterval」「ClientAliveCountMax」を変更して、接続タイムアウトをカスタマイズします。
キーボードインタラクティブ認証の設定
変数「ChallengeResponseAuthentication」 を 「yes」に設定して、キーボードインタラクティブ認証を有効にします。
バナーメッセージの表示
「Banner」を指定したファイルパスに設定することで、SSH接続時にバナーメッセージを表示できます。
SSHコマンドのオプション一覧
SSHコマンドでは、オプションを活用することで、さまざまな接続方法を指定できます。
以下にまとましたのでご覧ください。
オプション名 | 説明 | 例 |
---|---|---|
-1 | SSHプロトコルバージョン1を強制します。 | ssh -1 ユーザー名@ホスト名 |
-2 | SSHプロトコルバージョン2を強制します。 | ssh -2 ユーザー名@ホスト名 |
-4 | IPv4アドレスのみを使用します。 | ssh -4 ユーザー名@ホスト名 |
-6 | IPv6アドレスのみを使用します。 | ssh -6 ユーザー名@ホスト名 |
-A | エージェント転送を有効にします。 | ssh -A ユーザー名@ホスト名 |
-a | エージェント転送を無効にします。 | ssh -a ユーザー名@ホスト名 |
-C | すべてのデータ通信を圧縮します。 | ssh -C ユーザー名@ホスト名 |
-c | 暗号化アルゴリズムを指定します。 | ssh -c aes128-gcm@openssh.com ユーザー名@ホスト名 |
-D | SOCKSプロキシを設定します。 | ssh -D 8080 ユーザー名@ホスト名 |
-F | 設定ファイルを指定します。 | ssh -F /path/to/config ユーザー名@ホスト名 |
-f | バックグラウンドで実行します。 | ssh -f ユーザー名@ホスト名 |
-i | 秘密鍵ファイルを指定します。 | ssh -i ~/.ssh/id_rsa ユーザー名@ホスト名 |
-L | ローカルポートフォワーディングを設定します。 | ssh -L 8080:localhost:80 ユーザー名@ホスト名 |
-l | リモートホストで使用するユーザー名を指定します。 | ssh -l ユーザー名 ホスト名 |
-N | リモートコマンドを実行せずに接続します。 | ssh -N -L 8080:localhost:80 ユーザー名@ホスト名 |
-n | データ入力を/dev/nullにリダイレクトします。 | ssh -n ユーザー名@ホスト名 |
-o | オプションを指定します。 | ssh -o “Port=2222” ユーザー名@ホスト名 |
-p | リモートホストのポート番号を指定します。 | ssh -p 2222 ユーザー |
SSHのセキュリティ上のベストプラクティス
SSHを活用するのは、セキュリティで優れているのが理由です。
よりセキュアな接続を確立するために以下の方法をご紹介します。
- 接続先ホストの確認方法
- パスワードポリシーの適用
- ブルートフォースアタック対策
接続先ホストの確認方法
ssh-keyscan コマンドを使って接続先ホストの公開鍵を取得し、信頼できるものか確認できます。
ssh-keyscan -H [接続先のIPアドレス]
パスワードポリシーの適用
強力なパスワードポリシーを適用し、ユーザーが安全なパスワードを使用することを強制しましょう。
ブルートフォースアタック対策
/etc/ssh/sshd_config ファイルを編集し、MaxAuthTries の値を制限して、ブルートフォースアタックを防げます。
fail2ban などのツールを使用して、繰り返しログイン試行を行うIPアドレスを一定期間ブロックすることも効果的です。
SSH接続のトラブルシューティング
SSH接続によるトラブルにも直面するはず。
よくあるトラブルなどをまとめました。
- よくある問題と対処方法
- SSHのセキュリティ対策
よくある問題と対処方法
- パーミッションエラー: 鍵ファイルやディレクトリのパーミッションを適切に設定
- 接続タイムアウト: ネットワーク接続を確認し、ファイアウォールの設定を見直す
SSHのセキュリティ対策
- バージョンアップ: SSHクライアントとサーバーのソフトウェアを定期的に更新し、セキュリティパッチを適用
- 公開鍵認証の利用: パスワード認証よりも安全な公開鍵認証を利用
まとめ:SSHコマンドを活用してセキュアな接続を確立
当記事の内容をまとめます。
- SSHコマンドはリモートサーバーアクセスするためのもの
- SSHコマンドはTelnetと比べてセキュアな接続が確立できる
- SSHコマンドのオプションを使えば、幅広い接続方法が可能
当記事では、SSHの概要から詳細な設定方法まで、詳しく解説してきました。
SSHはインターネット上でセキュアな通信を確立するための強力なツールです。
適切な設定とセキュリティ対策をおこなえば、SSHを安全かつ効果的に活用できます。