はい、承知いたしました。「初心者必見!ssh コマンドの基本的な使い方を分かりやすく解説」と題し、約5000語の詳細な解説記事を作成します。記事の内容をそのまま表示します。
初心者必見!ssh コマンドの基本的な使い方を分かりやすく解説
インターネットの世界では、私たちのコンピューターは様々な他のコンピューターと通信しています。ウェブサイトを見たり、メールを送受信したり、オンラインゲームをしたり。これらはすべて、コンピューター間の通信によって成り立っています。
しかし、これらの通信の多くは、インターネット上に情報を「平文(ひらぶん)」、つまり誰でも読める形で流しているわけではありません。特に、他のコンピューターを操作したり、重要なファイルをやり取りしたりする際には、情報が盗み見られたり、改ざんされたりしないように、安全な方法で通信する必要があります。
ここで登場するのが「SSH」です。SSHは、安全にリモートのコンピューターに接続し、操作するための、まさにインターネット時代の「秘密の通路」のようなものです。この記事では、全くの初心者の方でもSSHを理解し、使えるようになることを目指して、SSHの基本的な使い方から、少し応用的な使い方まで、分かりやすく丁寧に解説していきます。
リモートサーバーへの接続、ウェブサイトの公開、プログラミング開発など、様々な場面でSSHは必須のスキルとなります。この記事を読み終える頃には、あなたはSSHの強力な世界への第一歩を踏み出しているはずです。さあ、一緒にSSHの世界を探検しましょう!
第1章:SSHとは何か? なぜSSHが必要なのか?
まずは、SSHが何であり、なぜ私たちがSSHを使う必要があるのかという根本的な部分から理解しましょう。
1.1 SSH(Secure Shell)とは?
SSHは「Secure Shell(セキュア・シェル)」の略称です。その名の通り、「安全な(Secure)」「シェル(Shell)」を提供します。
- シェル(Shell): コンピューターのOS(オペレーティングシステム)に対する命令(コマンド)を入力し、実行させるためのインターフェースのことです。WindowsでいうコマンドプロンプトやPowerShell、macOSやLinuxでいうターミナルがこれにあたります。
- セキュア(Secure): 安全であること。具体的には、通信内容を暗号化することで安全性を確保します。
つまり、SSHは「暗号化された安全な通信路を通して、遠隔にあるコンピューターのシェルを操作するためのプロトコル(通信規約)およびそのためのソフトウェア」なのです。
1.2 なぜSSHが必要なのか?
かつて、コンピューターのリモート操作にはTelnetやrloginといったプロトコルが使われていました。しかし、これらのプロトコルは通信内容を全く暗号化しませんでした。
想像してみてください。インターネット上に、あなたのユーザー名、パスワード、そして操作内容が、誰でも読める形で流れている状態を。もし悪意のある第三者がその通信を傍受したら、簡単にあなたのパスワードを知り、サーバーに不正にログインできてしまいます。これは非常に危険です。
SSHが登場したことで、この問題が解決されました。SSHは、接続が確立される前に通信路を暗号化します。これにより、たとえ通信内容が傍受されたとしても、解読することは非常に困難になります。あなたのパスワードや、サーバー上での作業内容が外部に漏れる心配が格段に減るのです。
SSHが必要な主な理由をまとめると以下のようになります。
- セキュリティ: 通信内容が暗号化されるため、盗聴や改ざんを防ぐことができます。特にリモートログイン時のユーザー名とパスワードの保護は非常に重要です。
- リモート操作: 遠隔地にあるサーバーやコンピューターに安全に接続し、まるで目の前にあるかのように操作できます。これは、クラウドサーバーの管理、自宅外からの自宅PCへのアクセス、企業のサーバー管理など、多岐にわたる用途で不可欠です。
- ファイル転送: SSHの技術を利用した安全なファイル転送方法(SCPやSFTP)が提供されています。これも暗号化されているため、重要なファイルを安全にやり取りできます。
1.3 SSHの仕組み(クライアント・サーバーモデル)
SSHは「クライアント・サーバーモデル」で動作します。
- SSHクライアント: あなたのコンピューターで動作し、接続を開始する側のソフトウェアです。WindowsのPuTTYやOpenSSHクライアント、macOSやLinuxの標準ターミナルなどがこれにあたります。
- SSHサーバー: 接続を受け付ける側のコンピューターで動作するソフトウェアです。リモート操作したいサーバーやPCにインストールされて起動している必要があります。
あなたがSSHクライアントを使ってSSHサーバーに接続しようとすると、以下のようなやり取りが行われます。
- 接続要求: クライアントがサーバーに対して接続を要求します。
- 暗号化パラメータの交換: クライアントとサーバーは、今後どのような方式で通信を暗号化するかを取り決め、そのために必要な情報を安全に交換します。
- サーバー認証: クライアントは、接続しようとしているサーバーが本物であることを確認します(後述するホスト鍵の確認など)。
- ユーザー認証: サーバーは、接続してきたユーザーが正当なユーザーであることを確認します(パスワード認証や公開鍵認証など)。
- セッション開始: 認証に成功すると、暗号化された通信路(セキュアチャネル)が確立され、クライアントはサーバー上でコマンドを実行できるようになります。
このように、SSHは接続開始から認証、そして実際の通信まで、すべての段階で安全性を考慮した設計になっています。
第2章:SSHクライアントの準備
SSHを使うには、まずあなたのコンピューターにSSHクライアントソフトウェアが必要です。OSによって準備方法が異なります。
2.1 macOS / Linux の場合
macOSやLinuxの多くのディストリビューションには、標準でOpenSSHクライアントが搭載されています。特別なインストール作業は不要で、ターミナル(端末エミュレーター)を開けばすぐにssh
コマンドが使えます。
ターミナルを開き、以下のコマンドを入力してバージョン情報が表示されれば準備完了です。
bash
ssh -V
2.2 Windows の場合
Windowsの場合、以前は別途SSHクライアントソフトウェアをインストールする必要がありました。代表的なものに「PuTTY(プティ)」があります。しかし、Windows 10の大型アップデート以降、PowerShellやコマンドプロンプトから利用できるOpenSSHクライアントがオプション機能として追加できるようになりました。
どちらの方法でもSSH接続は可能ですが、ここでは標準機能として追加されたOpenSSHクライアントを使う方法と、伝統的なPuTTYを使う方法の両方をご紹介します。
2.2.1 WindowsでOpenSSHクライアントを使う方法
-
OpenSSHクライアントのインストール確認:
- Windowsの設定を開きます。
- 「アプリ」→「オプション機能」を選択します。
- 「機能を追加」ボタンをクリックします。
- リストが表示されたら、「OpenSSH クライアント」を探します。
- もしリストになく、既にインストール済みの機能リストにもない場合は、「機能を追加」からインストールします。
- もしリストに「OpenSSH クライアント」があり、状態が「インストール済み」となっていれば、既に利用可能です。
-
コマンドプロンプトまたはPowerShellを開く:
- Windowsの検索バーに「cmd」と入力して「コマンドプロンプト」を開くか、「powershell」と入力して「PowerShell」を開きます。
- 以下のコマンドを入力してバージョン情報が表示されれば、SSHコマンドが利用可能です。
cmd
ssh -V
2.2.2 WindowsでPuTTYを使う方法
PuTTYは軽量で使いやすいSSHクライアントとして長年利用されています。
-
PuTTYのダウンロード:
- PuTTYの公式サイト(
https://www.putty.org/
)にアクセスします。 - ダウンロードページ(
https://www.putty.org/latest.html
)に移動します。 - あなたのWindowsのバージョン(32-bitか64-bit)に合った
putty.exe
をダウンロードします。インストーラー版や他のツールも同梱されたパッケージもありますが、まずはputty.exe
単体で十分です。
- PuTTYの公式サイト(
-
PuTTYの起動:
- ダウンロードした
putty.exe
ファイルをダブルクリックして起動します。インストールは不要です。
- ダウンロードした
-
PuTTYの画面説明:
- 起動すると「PuTTY Configuration」というウィンドウが表示されます。
Host Name (or IP address)
: 接続先サーバーのホスト名またはIPアドレスを入力します。Port
: SSHサーバーが待機しているポート番号を入力します。通常は22ですが、変更されている場合もあります。Connection type
: 「SSH」が選択されていることを確認します。Saved Sessions
: よく接続する設定を保存しておき、次回からすぐに呼び出せる機能です。
これで、SSHクライアントの準備は完了です。次は実際に接続してみましょう。
第3章:基本的なSSH接続方法(パスワード認証)
SSHで最も基本的な接続方法は、ユーザー名とパスワードを使った認証です。
3.1 ssh
コマンドの基本構文
macOS, Linux, Windows (OpenSSH) の場合、ターミナルまたはコマンドプロンプト/PowerShellで以下のコマンドを使用します。
bash
ssh [ユーザー名]@[ホスト名またはIPアドレス]
[ユーザー名]
: 接続先サーバーに存在するユーザーアカウント名です。[ホスト名またはIPアドレス]
: 接続先サーバーのホスト名(例:example.com
)またはIPアドレス(例:192.168.1.100
)です。
例えば、IPアドレス 192.168.1.100
のサーバーに、ユーザー名 myuser
で接続する場合のコマンドは以下のようになります。
bash
ssh [email protected]
ホスト名で接続する場合は以下のようになります。
bash
ssh [email protected]
もし、接続先サーバーのSSHポートが標準の22番ではない場合(例えば2222番)、-p
オプションを使ってポート番号を指定します。
bash
ssh -p 2222 [email protected]
-p
の後にスペースを空けずにポート番号を指定することもできますが、スペースを入れるのが一般的です。
3.2 最初の接続時のホスト鍵の確認
初めてあるサーバーにSSH接続しようとすると、以下のようなメッセージが表示されることがあります。
The authenticity of host 'example.com (XXX.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
これは、接続先のサーバーが本物であるか(なりすましでないか)を確認するためのものです。SSHクライアントは、接続先のサーバーが持つ「ホスト鍵」の情報を取得し、その「フィンガープリント(指紋)」を表示しています。
このフィンガープリントは、サーバーごとに固有のものです。クライアントは、一度接続したサーバーのホスト鍵のフィンガープリントを記録しておき(通常は~/.ssh/known_hosts
ファイル)、次回以降の接続時にサーバーから提示されたフィンガープリントと一致するかを確認します。もし一致しない場合は、サーバーが変更されたか、あるいは悪意のある第三者によってなりすましが行われている可能性を示唆します。
初めての接続の場合:
表示されたフィンガープリントが、接続先のサーバー管理者が提供する情報(サーバーの設定画面に表示されているなど)と一致することを確認するのが理想ですが、初心者の段階ではそこまで確認できないことが多いでしょう。信頼できるサーバーへの初めての接続であれば、「yes」と入力してEnterキーを押します。
これにより、そのサーバーのホスト鍵のフィンガープリントがあなたのコンピューターの~/.ssh/known_hosts
ファイルに記録されます。
Warning: Permanently added 'example.com,XXX.XXX.XXX.XXX' (ECDSA) to the list of known hosts.
二回目以降の接続で警告が出た場合:
もし、過去に接続したことがあるサーバーでこのメッセージが表示され、フィンガープリントが異なる場合は注意が必要です。なりすましの可能性があるため、安易に接続せず、サーバー管理者に確認するなど慎重に対応してください。
PuTTYの場合も同様に、初めての接続時には以下のようなセキュリティ警告が表示されます。
(上記画像はイメージです。実際の表示とは異なる場合があります。)
ここでも表示されたホスト鍵のフィンガープリントを確認し、問題なければ「はい(Y)」をクリックして接続を継続します。ホスト鍵の情報はPuTTYの設定(Registry
)に保存されます。
3.3 パスワード認証の実行
ホスト鍵の確認が終わると、パスワードの入力を求められます。
[email protected]'s password:
ここで、接続先サーバーでのmyuser
のパスワードを入力します。パスワードを入力しても画面上には文字が表示されません(カーソルも動きません)。これは、パスワードが入力文字数などから推測されないようにするためのセキュリティ対策です。
パスワードを入力したら、Enterキーを押してください。
- パスワードが正しければ: 認証に成功し、サーバー上のシェルに接続されます。プロンプト(コマンド入力待ちの状態)が表示され、サーバー上でコマンドを実行できるようになります。
- パスワードが間違っていれば: 「Permission denied, please try again.」のようなメッセージが表示され、再度パスワード入力を求められるか、数回失敗すると接続が切断されます。
3.4 接続後のシェルの操作
認証に成功すると、あなたのターミナル/コマンドプロンプトは、接続先サーバーのシェルと繋がった状態になります。ここで入力するコマンドは、あなたのローカルコンピューターではなく、接続先のリモートサーバー上で実行されます。
例えば、Linuxサーバーに接続した場合、以下のようなコマンドが使えます。
ls
: 現在のディレクトリにあるファイルやフォルダを一覧表示cd [ディレクトリ名]
: 指定したディレクトリに移動pwd
: 現在いるディレクトリのパスを表示whoami
: 現在ログインしているユーザー名を表示uname -a
: OSの情報を表示reboot
: サーバーを再起動(注意!)sudo [コマンド]
: 管理者権限でコマンドを実行(パスワードを求められることがあります)
まるで自分のコンピューターを操作しているかのように、サーバー上で様々な作業を行うことができます。
3.5 ログアウト方法
リモートサーバーでの作業が終わったら、接続を切断する必要があります。以下のいずれかの方法でログアウトできます。
- シェルで
exit
と入力してEnterキーを押す。 - シェルで
logout
と入力してEnterキーを押す。 - Ctrl + D キーを押す。
ログアウトすると、SSHセッションが終了し、あなたのターミナル/コマンドプロンプトはローカルコンピューターのシェルに戻ります。PuTTYの場合は、ウィンドウが閉じます。
3.6 パスワード認証のメリット・デメリット
メリット:
- セットアップが簡単で、特別なファイル準備が不要。ユーザー名とパスワードさえ分かれば接続できる。
デメリット:
- セキュリティリスクが高い:
- パスワードが推測されやすいものだと、ブルートフォース攻撃(総当たり攻撃)によって破られる危険性がある。
- パスワード入力時に、周囲の人に見られたり、キーロガーなどのマルウェアによって盗まれたりする可能性がある。
- 多くのサーバーに同じパスワードを使い回していると、そのパスワードが一つでも漏れると他のサーバーも危険に晒される。
- 手間がかかる: 接続するたびにパスワードを入力する必要がある。
このように、パスワード認証は手軽ですが、セキュリティ上の弱点があり、推奨される方法ではありません。より安全で便利な方法として、次に説明する「公開鍵認証」が広く使われています。
第4章:より安全で便利なSSH接続(公開鍵認証)
公開鍵認証は、パスワードを使わずにSSH接続を行う方法です。非常に安全性が高く、一度設定すればパスワード入力の手間も省けるため、SSH接続の主流となっています。
4.1 公開鍵認証の仕組み
公開鍵認証では、「鍵ペア」と呼ばれる二つのファイルを使います。
- 秘密鍵 (Private Key): あなたのローカルコンピューターに秘密にして保管しておくファイルです。文字通り「秘密」が重要で、絶対に他人に知られてはいけません。パスワード認証でいうパスワードの役割を果たしますが、パスワードよりはるかに長く複雑なデータです。
- 公開鍵 (Public Key): 秘密鍵とペアになるファイルです。こちらは「公開」しても問題ありません。接続したいリモートサーバーにこの公開鍵を配置しておきます。
接続の仕組みは以下の通りです。
- SSHクライアント(あなたのPC)が、SSHサーバー(リモートサーバー)に接続要求を送ります。
- サーバーは、受け取った接続要求に対して、クライアントに「あるデータ」を送りつけます。
- クライアントは、その受け取ったデータを自分の秘密鍵を使って複合(復号化)します。
- サーバーは、クライアントから送られてきたあなたの公開鍵を使って、クライアントが複合したデータが正しいかを確認します。
- もし、サーバーが持っている公開鍵でクライアントが複合したデータが正しく検証できれば、それはクライアントが対応する秘密鍵を持っていることの証明になります。
- 秘密鍵を持っていることが証明されれば、サーバーは認証に成功したと判断し、パスワード入力を求めずに接続を許可します。
この仕組みのポイントは、秘密鍵そのものがネットワーク上を流れることがないことです。公開鍵は公開されても問題なく、たとえ公開鍵が盗まれても、それだけでは秘密鍵を持っていない限り認証は成功しません。これにより、パスワード認証よりもはるかに安全な認証が可能になります。
たとえるなら、秘密鍵は「印鑑証明に登録した実印」、公開鍵は「その実印の印影登録情報」のようなものです。印影(公開鍵)は役所に登録しても問題ないですが、実印そのもの(秘密鍵)は厳重に保管しておかないと、印鑑証明が必要な重要な契約を悪用されてしまいます。SSHの秘密鍵も同様に厳重に保管する必要があります。
4.2 鍵ペアの生成 (ssh-keygen
コマンド)
まずは、あなたのローカルコンピューターで秘密鍵と公開鍵のペアを生成します。これには ssh-keygen
コマンドを使います。macOS, Linux, Windows (OpenSSH) のターミナルまたはコマンドプロンプト/PowerShellで実行できます。
bash
ssh-keygen -t rsa
-t rsa
: 鍵の種類を指定します。ここではrsa
という広く使われている方式を指定しています。現在ではより新しいed25519
という方式も推奨されています(例:ssh-keygen -t ed25519
)。ここでは慣習的にまだよく使われるRSAを例に説明しますが、セキュリティを重視する場合はEd25519を検討しても良いでしょう。
コマンドを実行すると、いくつか質問されます。
Generating public/private rsa key pair.
Enter file in which to save the key (/home/myuser/.ssh/id_rsa):
これは、生成される鍵ファイルをどこに保存するかを尋ねています。デフォルトの場所(例: /home/myuser/.ssh/id_rsa
や C:\Users\YourName\.ssh\id_rsa
)で問題なければ、そのままEnterキーを押します。通常、SSH関連のファイルはユーザーのホームディレクトリの.ssh
という隠しフォルダに保存されます。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
次に「パスフレーズ」の設定を求められます。パスフレーズは、秘密鍵を暗号化するためのパスワードのようなものです。
- パスフレーズを設定する場合: 秘密鍵が盗まれたとしても、このパスフレーズを知らない限り秘密鍵を使えなくなるため、セキュリティが向上します。ただし、SSH接続時に毎回このパスフレーズの入力を求められることになります。
- パスフレーズを設定しない場合 (emptyでEnter): パスフレーズの入力は不要になりますが、秘密鍵が盗まれた場合にそのまま使われてしまうリスクがあります。手軽さとのトレードオフです。セキュリティ上はパスフレーズの設定が強く推奨されます。特に、公開鍵認証だけでパスワード認証を無効化する設定にする場合は、秘密鍵の安全性が非常に重要になるため、パスフレーズは必ず設定しましょう。
パスフレーズを入力したら、再度確認のために入力します。何も入力しない場合はそのままEnterを2回押します。
鍵生成が成功すると、以下のようなメッセージが表示されます。
Your identification has been saved in /home/myuser/.ssh/id_rsa.
Your public key has been saved in /home/myuser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY myuser@mylocalpc
The key's randomart image is:
+---[RSA 3072]----+
| .+==. |
| o+*O* o |
| +=B*+*. |
|. ==.+o. |
|.E * +.S |
|. + * . |
|. + |
|. |
|.. |
+----[SHA256]-----+
これで、デフォルトの場所に2つのファイルが生成されました。
id_rsa
(またはid_ed25519
): これが秘密鍵です。絶対に他人に知られないように厳重に管理してください。id_rsa.pub
(またはid_ed25519.pub
): これが公開鍵です。サーバーに配置するために使います。
.ssh
フォルダのパーミッション(権限)は非常に重要です。.ssh
フォルダ自体は所有者のみが書き込み可能、秘密鍵ファイルは所有者のみが読み書き可能、公開鍵ファイルは所有者のみが読み書き可能、といった適切な設定になっている必要があります。ssh-keygen
は通常、自動的に適切なパーミッションを設定してくれますが、もし接続に問題がある場合は確認してみる価値があります。
4.3 公開鍵のサーバーへの配置 (ssh-copy-id
コマンド)
次に、生成した公開鍵 (id_rsa.pub
など) を、接続したいリモートサーバーに配置します。配置場所は、接続先ユーザーのホームディレクトリにある .ssh
フォルダ内の authorized_keys
というファイルです。
最も簡単で推奨される方法は ssh-copy-id
コマンドを使うことです。このコマンドは、あなたの公開鍵をリモートサーバーの適切な場所に自動でコピーしてくれます。
bash
ssh-copy-id [接続先ユーザー名]@[接続先ホスト名またはIPアドレス]
例:
bash
ssh-copy-id [email protected]
ssh-copy-id
コマンドを実行すると、まず通常のパスワード認証で一度だけサーバーに接続します。
“`
/usr/bin/ssh-copy-id: INFO: Source of key(s): “/home/myuser/.ssh/id_rsa.pub”
/usr/bin/ssh-copy-id: INFO: The key(s) to be installed:
/home/myuser/.ssh/id_rsa.pub
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘[email protected]'”
and check to make sure that only the key(s) you wanted were added.
“`
ここで、接続先ユーザーのパスワードを入力します。パスワード認証に成功すると、ssh-copy-id
が自動的に以下の処理を行ってくれます。
- 接続先サーバーの
~/.ssh
ディレクトリが存在しない場合は作成する。 ~/.ssh
ディレクトリと~/.ssh/authorized_keys
ファイルのパーミッションを適切に設定する。- あなたの公開鍵 (
~/.ssh/id_rsa.pub
の内容) を、サーバーの~/.ssh/authorized_keys
ファイルに追加する。
このコマンドは非常に便利ですが、ssh-copy-id
が利用できない環境(例えば一部のWindowsクライアントや、サーバー側の設定による制限など)もあります。その場合は、手動で公開鍵をコピーして配置する必要があります。
4.4 公開鍵の手動配置方法
ssh-copy-id
が使えない場合や、仕組みを理解するために、手動での公開鍵配置方法も知っておきましょう。
-
ローカルPCで公開鍵の内容を確認:
- macOS/Linux:
cat ~/.ssh/id_rsa.pub
コマンドでファイル内容を表示させます。 - Windows (OpenSSH):
type %USERPROFILE%\.ssh\id_rsa.pub
コマンドでファイル内容を表示させます。 - PuTTYgen (PuTTYに付属): PuTTYgenで鍵を生成した場合、画面上部に公開鍵が表示されます。そこに表示された「
ssh-rsa AAAA...
」から始まる文字列全体をコピーします。
いずれの場合も、表示される公開鍵文字列(ssh-rsa AAAA...
またはssh-ed25519 AAAA...
から始まり、最後にユーザー名@ホスト名などが付いている長い文字列)を正確にすべてコピーします。
- macOS/Linux:
-
パスワード認証でサーバーに接続:
手動でファイルを編集するため、一度パスワード認証でサーバーに接続する必要があります。
bash
ssh [email protected]
# パスワードを入力してログイン -
サーバー側で
.ssh
ディレクトリとauthorized_keys
ファイルを作成:
サーバーにログインしたら、以下のコマンドを実行します。bash
mkdir -p ~/.ssh # .ssh ディレクトリがなければ作成 (-pオプションは親ディレクトリも作成)
chmod 700 ~/.ssh # .ssh ディレクトリの権限を設定 (所有者のみ読み書き実行可能)
touch ~/.ssh/authorized_keys # authorized_keys ファイルがなければ作成
chmod 600 ~/.ssh/authorized_keys # authorized_keys ファイルの権限を設定 (所有者のみ読み書き可能)
これらのコマンドは、ホームディレクトリに.ssh
ディレクトリを作成し、その中にauthorized_keys
ファイルを作成(またはあればそのまま)し、適切な権限(パーミッション)を設定するためのものです。SSHはセキュリティを重視するため、これらのファイルやディレクトリの権限が正しく設定されていないと、公開鍵認証が機能しないことがあります。 -
authorized_keys
ファイルに公開鍵を追記:
サーバー上でテキストエディタ(nano
,vim
など)を使って~/.ssh/authorized_keys
ファイルを開き、コピーした公開鍵文字列を新しい行に追記して保存します。bash
nano ~/.ssh/authorized_keys
エディタが開いたら、ファイルの末尾に移動し、コピーした公開鍵を貼り付けます。ファイルにすでに他の公開鍵が書かれていても、新しい行に追記すれば問題ありません。例:
authorized_keys
ファイルの内容
ssh-rsa AAAA... (ここがあなたの公開鍵文字列) myuser@mylocalpc
ssh-rsa BBBB... (もし他の公開鍵も登録していればその文字列) otheruser@somehost
貼り付けたら、エディタを保存して閉じます(nanoならCtrl+X, Y, Enter)。または、以下のコマンドで公開鍵文字列を直接ファイルに追記することもできます。ローカルPCで公開鍵文字列をコピーした状態で、サーバー上で以下のコマンドを実行します。
“`bash
echo “ssh-rsa AAAA… (ここにコピーした公開鍵文字列を貼り付け)” >> ~/.ssh/authorized_keys公開鍵文字列は””で囲み、正確に貼り付けてください
>> はファイルの末尾に追記するという意味です
“`
注意点:
* 公開鍵文字列は改行せずに1行で記述します。
* ファイルに追加する際は、既存の公開鍵を消さないように注意してください。
* ファイル名の末尾に.pub
をつけないこと(サーバー側のファイル名はauthorized_keys
です)。
これで、サーバー側への公開鍵の配置は完了です。一度サーバーからログアウトしてください (exit
または logout
)。
4.5 公開鍵認証でのSSH接続
公開鍵をサーバーに配置したら、再度SSH接続を試みます。パスワード認証の時と同じコマンドを使用します。
bash
ssh [email protected]
もし鍵ペア生成時にパスフレーズを設定した場合、ここでパスフレーズの入力を求められます。
Enter passphrase for key '/home/myuser/.ssh/id_rsa':
パスフレーズを入力してEnterキーを押します。パスフレーズが正しければ、パスワード入力を求められることなく、サーバーに接続できます!
もし鍵ペア生成時にパスフレーズを設定しなかった場合は、そのままパスフレーズ入力も求められず、すぐにサーバーに接続できるはずです。
もし公開鍵認証で接続できない場合:
- パスフレーズを間違えている: 再度正確に入力してみてください。
- 公開鍵が正しく配置されていない: サーバーの
~/.ssh/authorized_keys
ファイルにあなたの公開鍵が正確に、改行されずに追記されているか確認してください。 .ssh
ディレクトリやauthorized_keys
ファイルのパーミッションが不正:chmod
コマンドで上記で説明した権限(.ssh
は700、authorized_keys
は600)になっているか確認してください。- サーバー側で公開鍵認証が無効になっている: サーバーのSSHデーモン設定ファイル (
/etc/ssh/sshd_config
) でPubkeyAuthentication yes
となっているか、あるいはPasswordAuthentication yes
が有効になっているかなどを確認する必要があるかもしれませんが、これはサーバー管理者権限が必要です。 - 秘密鍵がデフォルトの場所にない、または複数ある場合:
ssh -i [秘密鍵ファイルのパス] [email protected]
のように、-i
オプションで使う秘密鍵ファイルを明示的に指定する必要があります。
デバッグのために、-v
オプションをつけて詳細な接続プロセスを表示させてみましょう。
bash
ssh -v [email protected]
表示されるログの中に、認証プロセスに関するヒントが含まれていることがあります。
4.6 ssh-agent
と ssh-add
によるパスフレーズの管理
公開鍵認証は便利ですが、パスフレーズを設定した場合、接続するたびにパスフレーズを入力するのは少し面倒です。そこで役立つのが ssh-agent
と ssh-add
コマンドです。
ssh-agent
: 秘密鍵のパスフレーズを記憶しておき、SSH接続時に代わりに認証を行ってくれるプログラム(エージェント)です。ssh-add
: 秘密鍵をssh-agent
に登録するためのコマンドです。
使い方は以下のようになります。
-
ssh-agent
の起動:
通常、デスクトップ環境やシェル起動時に自動で起動されていることが多いですが、手動で起動する場合は以下のコマンドを実行します。環境変数が出力されるので、それをシェルに読み込ませます。bash
eval "$(ssh-agent -s)"
(macOS/Linuxの場合。Windows (PowerShell) の場合はssh-agent
で起動し、表示されたPIDを記録して$env:SSH_AUTH_SOCK
などに設定する必要があるなど、少し手順が異なります。WindowsではWindows Subsystem for Linux (WSL) を使うか、Git for Windowsなどに含まれるssh-agent
を使うのが簡単かもしれません。)起動に成功すると、以下のような出力が表示され、
SSH_AUTH_SOCK
などの環境変数が設定されます。SSH_AUTH_SOCK=/tmp/ssh-XXXXXXX/agent.XXXX; export SSH_AUTH_SOCK;
SSH_AGENT_PID=XXXX; export SSH_AGENT_PID;
echo Agent pid XXXX; -
秘密鍵を
ssh-agent
に登録:
ssh-add
コマンドを使って、パスフレーズ付きの秘密鍵をssh-agent
に登録します。bash
ssh-add
デフォルトの秘密鍵ファイル(~/.ssh/id_rsa
など)が自動的に選択されます。もし別の秘密鍵を登録したい場合は、ファイルパスを指定します。bash
ssh-add ~/.ssh/my_other_keyコマンドを実行すると、秘密鍵のパスフレーズの入力を求められます。
Enter passphrase for /home/myuser/.ssh/id_rsa:
パスフレーズを正確に入力すると、秘密鍵がssh-agent
に登録され、パスフレーズが記憶されます。Identity added: /home/myuser/.ssh/id_rsa (/home/myuser/.ssh/id_rsa)
一度 ssh-agent
に秘密鍵を登録すれば、その ssh-agent
が起動している間は、同じ秘密鍵を使うSSH接続でパスフレーズの入力を求められることはなくなります。PCを再起動したり、新しくターミナルを開いたりした場合は、再度 ssh-agent
を起動し、ssh-add
で鍵を登録する必要がある場合があります。多くのデスクトップ環境では、ログイン時に ssh-agent
が起動され、鍵も自動で登録されるような仕組みが提供されています。
ssh-add -l
コマンドで、現在 ssh-agent
に登録されている秘密鍵の一覧を確認できます。
公開鍵認証と ssh-agent
を組み合わせることで、高いセキュリティを維持しつつ、パスワード入力の手間を省いた快適なSSH接続環境を構築できます。
第5章:SSHの便利なオプションと応用テクニック
基本的なSSH接続ができるようになったら、さらに便利なオプションや応用的な使い方を学んでいきましょう。
5.1 ポート番号の指定 (-p
)
これは既に説明しましたが、SSHサーバーがデフォルトの22番ポート以外で待機している場合に必要です。
bash
ssh -p 2222 [email protected]
5.2 秘密鍵ファイルの指定 (-i
)
ssh-keygen
でデフォルト以外の名前や場所に鍵ペアを生成した場合、あるいは複数の鍵ペアを使い分けている場合に、どの秘密鍵を使うかを明示的に指定します。
bash
ssh -i ~/.ssh/my_new_key [email protected]
5.3 X11フォワーディング (-X
または -Y
)
SSH接続を通じて、リモートサーバー上で実行したGUIアプリケーションのウィンドウを、ローカルコンピューターの画面に表示させる機能です。例えば、サーバー上で動作するGUI設定ツールを使いたい場合などに便利です。
-X
: 基本的なX11フォワーディング。セキュリティ的に少し緩やかな設定になります。-Y
: 信頼されたX11フォワーディング。よりセキュリティが高く、最近はこちらが推奨されることが多いです。
bash
ssh -X [email protected] # または ssh -Y [email protected]
接続後、サーバー上でGUIアプリケーションのコマンドを実行すると、ローカルPCの画面にウィンドウが表示されます。
注意点:
- ローカルPCにXサーバー(X Window System)が必要です。LinuxやmacOSでは標準で搭載されていることが多いですが、Windowsでは別途Xサーバーソフトウェア(例: VcXsrv, Xming)をインストールする必要があります。
- サーバー側でもX11フォワーディングが許可されている必要があります。
- ネットワークの帯域幅によっては、GUIの表示が遅くなることがあります。
5.4 ポートフォワーディング(トンネル)
SSHの強力な機能の一つに「ポートフォワーディング(Port Forwarding)」、または「SSHトンネル(SSH Tunnel)」があります。これは、SSH接続を通じて、特定のポートへの通信を別の場所へ中継する機能です。暗号化されたSSHトンネルを経由させることで、本来は暗号化されていない通信(HTTP, データベース接続など)を安全に行うことができます。
主な種類として、ローカルポートフォワーディング (-L
)、リモートポートフォワーディング (-R
)、ダイナミックポートフォワーディング (-D
) があります。
5.4.1 ローカルポートフォワーディング (-L
)
ローカルコンピューターのあるポートへのアクセスを、SSHサーバーを経由して、別の宛先へ転送する機能です。ローカルPCから、ファイアウォールの内側にあるサーバー上の特定のサービスにアクセスしたい場合などに利用します。
構文:
bash
ssh -L [ローカル側のポート]:[転送先ホスト名またはIP]:[転送先ポート] [接続先ユーザー名]@[接続先ホスト名またはIPアドレス]
例: ローカルPCのポート8080へのアクセスを、SSH接続先のサーバー(example.com)を経由して、そのサーバーから見える内部ネットワーク上のWebサーバー(internal-web.local)のポート80へ転送する。
bash
ssh -L 8080:internal-web.local:80 [email protected]
このコマンドを実行すると、SSH接続が確立されます(通常、パスワードまたは公開鍵認証が必要です)。接続が確立された後、あなたのローカルPCのブラウザで http://localhost:8080
にアクセスすると、その通信はSSHクライアントによって捕捉され、example.com へのSSHトンネルを通って internal-web.local:80 へ安全に転送されます。internal-web.local からの応答も、同じSSHトンネルを通ってローカルPCのブラウザへ安全に戻ってきます。
よくある利用例:
- データベース接続: 外部からは直接アクセスできない内部データベース(例: ポート3306)に、ローカルPCのDBクライアントから安全に接続する。
bash
ssh -L 3306:internal-db.local:3306 [email protected]
ローカルPCのDBクライアントで、接続先ホストをlocalhost
、ポートを3306
として接続すれば、内部DBにSSHトンネル経由でアクセスできます。 - 内部Webアプリケーションへのアクセス: 社内ネットワークなどからのみアクセスできるWebアプリケーションに、外部からSSHトンネルを使ってアクセスする。
bash
ssh -L 8080:internal-app.local:80 [email protected]
ローカルPCのブラウザでhttp://localhost:8080
にアクセスします。
ポートフォワーディングのためだけにSSHセッションを開き、シェル操作は不要な場合は、-N
オプション(リモートコマンド実行なし)を組み合わせると良いでしょう。バックグラウンドで実行したい場合は -f
オプションも加えます。
bash
ssh -L 8080:internal-web.local:80 -Nf [email protected]
これでSSHセッションがバックグラウンドで起動し、ポートフォワーディングが有効になります。セッションを終了するには、プロセスIDを特定してkillするか、フォアグラウンドで起動した場合はCtrl+Cで終了します。バックグラウンド実行の場合、セッションを明示的に終了させる手段を用意しておくか、後述のSSH設定ファイルでControlMaster/ControlPathを設定して管理するのが望ましいです。
5.4.2 リモートポートフォワーディング (-R
)
SSHサーバー側のあるポートへのアクセスを、SSHクライアントを経由して、別の宛先へ転送する機能です。外部から直接アクセスできないローカルPC(例えば自宅や社内のPC)で動いているサービスを、外部のSSHサーバーを経由して公開したい場合などに利用します。
構文:
bash
ssh -R [リモート側のポート]:[転送先ホスト名またはIP]:[転送先ポート] [接続先ユーザー名]@[接続先ホスト名またはIPアドレス]
例: リモートSSHサーバー(example.com)のポート8888へのアクセスを、SSH接続しているローカルPCを経由して、ローカルPCで動いているWebサーバー(localhost)のポート80へ転送する。
bash
ssh -R 8888:localhost:80 [email protected]
このコマンドを実行すると、SSH接続が確立されます。接続確立後、example.com サーバー上で http://localhost:8888
にアクセスすると、その通信はSSHトンネルを通ってローカルPCへ転送され、ローカルPCのWebサーバー(localhost:80)が応答します。example.com のホスト名を使って外部からアクセスできる場合、例えば http://example.com:8888
にアクセスすることでも、SSHトンネルを経由してローカルPCのWebサーバーにアクセスできる可能性があります(これはexample.comサーバーのSSHデーモン設定 GatewayPorts
などに依存します)。
ローカルPCのWebサーバーを一時的に外部に公開したい場合などに便利です。ただし、リモートサーバー側のファイアウォール設定やSSHデーモンの設定(GatewayPorts no
だとSSHサーバー自身からしかリモートポートにアクセスできないなど)に依存するため、意図した通りに外部からアクセスできないこともあります。
こちらも -Nf
オプションと組み合わせてバックグラウンドで実行することが多いです。
bash
ssh -R 8888:localhost:80 -Nf [email protected]
5.4.3 ダイナミックポートフォワーディング (-D
)
ローカルコンピューターのあるポートをSOCKSプロキシとして動作させ、SSHサーバーを経由して任意の宛先への通信を転送する機能です。SSHサーバーを「踏み台」にして、そのサーバーからアクセス可能なネットワーク内の様々なリソースにアクセスしたい場合に利用します。VPNのような用途で使われることもあります。
構文:
bash
ssh -D [ローカル側のSOCKSポート] [接続先ユーザー名]@[接続先ホスト名またはIPアドレス]
例: ローカルPCのポート9999をSOCKSプロキシとして設定し、SSHサーバー(example.com)を経由して通信する。
bash
ssh -D 9999 [email protected]
このコマンドを実行すると、SSH接続が確立され、ローカルPCのポート9999がSOCKSプロキシとして待機状態になります。次に、ブラウザやアプリケーションのプロキシ設定で、SOCKSプロキシとして localhost
のポート 9999
を指定します。
この設定を行ったブラウザでウェブサイトにアクセスすると、その通信はポート9999でSSHクライアントに捕捉され、SSHトンネルを通って example.com へ転送されます。example.com は受け取った通信を、ブラウザが指定した本来の宛先(例えばウェブサイトのサーバー)へ転送します。応答も example.com からSSHトンネルを通って安全に戻ってきます。
これにより、ローカルPCからは直接アクセスできないが、SSHサーバーからはアクセスできるウェブサイトやサービスにアクセスできるようになります。例えば、会社の内部ネットワークにあるSSHサーバーを踏み台にして、社内ネットワーク内のイントラネットに外部からアクセスする、といった使い方が可能です。
こちらも -Nf
オプションと組み合わせてバックグラウンドで実行することが多いです。
bash
ssh -D 9999 -Nf [email protected]
ポートフォワーディングはSSHの非常に強力で応用範囲の広い機能です。これらの仕組みを理解することで、ネットワーク活用の可能性が大きく広がります。
5.5 通信の圧縮 (-C
)
ネットワーク速度が遅い環境でSSH接続を行う場合に、データ圧縮を有効にすることで通信速度を改善できることがあります。
bash
ssh -C [email protected]
ただし、既に通信内容が圧縮されている場合(例: 多くのWebサイトのコンテンツなど)や、CPUリソースが限られているサーバーでは、逆にパフォーマンスが低下することもあります。
5.6 詳細表示 (-v
)
SSH接続時に問題が発生した場合に、接続プロセスや認証の詳細を表示して原因を特定するのに役立ちます。デバッグの強力な味方です。
bash
ssh -v [email protected]
-vv
や -vvv
と複数つけることで、さらに詳細な情報を表示させることもできます。トラブルシューティングの際には必ず試してみてください。
5.7 コマンド実行なし (-N
) と バックグラウンド実行 (-f
)
-N
: 認証に成功しても、リモートコマンドを実行せず、シェルを起動しません。主にポートフォワーディングのためだけにSSHセッションを確立したい場合に利用します。
bash
ssh -N -L 8080:internal-web.local:80 [email protected]-f
: SSH接続認証が成功した後、SSHクライアントをバックグラウンドで実行します。通常、-N
オプションと組み合わせて、ポートフォワーディングセッションなどをバックグラウンドで維持するために使用します。
bash
ssh -f -N -L 8080:internal-web.local:80 [email protected]
このコマンドを実行すると、パスワードやパスフレーズ入力後にSSHクライアントがバックグラウンドに移行し、コマンドプロンプト/ターミナルがすぐに戻ってきます。
5.8 ~
エスケープシーケンス
SSH接続中に、Enterキーに続けてチルダ(~
)と特定のキーを押すことで、SSHクライアントに対して特別な操作を行うことができます。これはリモートサーバーではなく、ローカルのSSHクライアントに対する命令です。
例えば、接続がフリーズして exit
コマンドも受け付けなくなった場合などに役立ちます。
~.
: SSH接続を切断します。Control + D
やexit
が効かない場合に試してみてください。~?
: 利用可能なエスケープシーケンスの一覧を表示します。~C
: コマンドモードに入り、ポートフォワーディング設定などを動的に追加できます。
これらのエスケープシーケンスを入力するには、まずコマンド入力中でない状態(通常は行の先頭)であることを確認し、Enterキーを押してから素早く ~
、そして目的のキー(.
や ?
など)を押します。例えば切断なら、Enter
-> ~
-> .
の順に押します。画面上には何も表示されないことが多いですが、操作が実行されます。
第6章:SSHの設定ファイル (~/.ssh/config
)
頻繁にSSH接続を行う場合、毎回ユーザー名、ホスト名、ポート番号、秘密鍵のパスなどをコマンドラインで指定するのは面倒です。SSHクライアントには設定ファイル ~/.ssh/config
があり、これを利用すると接続情報を簡潔に記述し、エイリアス(短い別名)で呼び出すことができるようになります。
6.1 設定ファイルのメリット
- コマンドの簡略化: 複雑なオプション指定をファイルにまとめ、短いエイリアスで接続できるようになります。
- 設定の一元管理: 接続先ごとの設定や、SSHクライアント全体のデフォルト設定を一つのファイルで管理できます。
- ミスの削減: 毎回手入力する手間が省けるため、タイポによるエラーを防げます。
6.2 設定ファイルの場所
設定ファイルは、ローカルコンピューターのSSH設定ディレクトリに配置します。
- macOS / Linux:
~/.ssh/config
- Windows (OpenSSH):
%USERPROFILE%\.ssh\config
(例:C:\Users\YourName\.ssh\config
)
ファイルが存在しない場合は、テキストエディタで新規作成します。ファイル名は config
で、拡張子はありません。
6.3 基本的な記述方法
~/.ssh/config
は、複数の接続設定を記述できます。各設定は Host
エントリから始まり、その下にインデント(通常はスペース)された形で設定オプションを記述します。
Host [エイリアス名]
Hostname [ホスト名またはIPアドレス]
User [ユーザー名]
Port [ポート番号]
IdentityFile [秘密鍵ファイルのパス]
# その他のオプションをここに記述
例:
“`
デフォルト設定(全ての接続に適用される可能性がある設定)
Host *
ForwardAgent yes # ssh-agentを転送したい場合など
自宅サーバーへの設定
Host home-server
Hostname 192.168.1.100
User myuser
Port 22
IdentityFile ~/.ssh/id_rsa # デフォルト鍵を使わない場合
外部サーバーへの設定
Host production-web
Hostname example.com
User admin
Port 2222
IdentityFile ~/.ssh/production_key
ForwardAgent yes # この接続時にのみssh-agentを転送
ポートフォワーディング専用設定
Host internal-app-tunnel
Hostname example.com
User myuser
Port 22
IdentityFile ~/.ssh/id_rsa
LocalForward 8080 internal-app.local:80
RequestTTY no # セッション開始時に擬似端末を割り当てない(ポートフォワーディング専用なら不要)
StrictHostKeyChecking no # ホスト鍵チェックを無効化(非推奨!あくまで例)
# -Nf オプションに相当する設定は config ファイル単体では難しい(ProxyJumpなどを使えば可能だが複雑になる)
# 通常は config と ssh コマンドオプションを組み合わせて使う
“`
設定ファイルに上記の例のように記述すると、コマンドラインからは以下のように接続できるようになります。
bash
ssh home-server
ssh production-web
ssh internal-app-tunnel # このエイリアスでポートフォワーディングセッションが確立される
エイリアス名(home-server
, production-web
, internal-app-tunnel
)だけで、指定したホスト名、ユーザー名、ポート番号、秘密鍵、さらにはポートフォワーディング設定までが自動的に適用されます。
6.4 よく使う設定オプション
~/.ssh/config
で設定できるオプションは多岐にわたります。よく使われるものをいくつか紹介します。
Hostname
: 接続先ホスト名またはIPアドレス。User
: 接続に使うユーザー名。Port
: 接続に使うポート番号。IdentityFile
: 使用する秘密鍵ファイルのパス。IdentitiesOnly yes
:IdentityFile
で指定した秘密鍵のみを使い、ssh-agent
に登録されている他の鍵を試さないようにする設定。特定の鍵でしか接続できないサーバーに便利です。ForwardAgent yes
/no
:ssh-agent
の認証情報を転送するかどうか。有効にすると、接続先サーバーからさらに別のサーバーへSSH接続する際に、元のローカルPCの秘密鍵を使って認証できるようになります(多段SSH接続)。セキュリティリスクもあるため、必要な接続でのみ有効にするのが推奨されます。LocalForward [ローカルポート] [転送先ホスト]:[転送先ポート]
: ローカルポートフォワーディングを設定します。ssh -L
オプションに相当します。RemoteForward [リモートポート] [転送先ホスト]:[転送先ポート]
: リモートポートフォワーディングを設定します。ssh -R
オプションに相当します。DynamicForward [ローカルポート]
: ダイナミックポートフォワーディング(SOCKSプロキシ)を設定します。ssh -D
オプションに相当します。ServerAliveInterval [秒]
: サーバーから応答がない場合に、指定した秒数ごとにキープアライブパケットを送信します。SSHセッションが途中で切断されてしまう場合に有効です。ServerAliveCountMax [回数]
:ServerAliveInterval
で指定した間隔でキープアライブパケットを送信し、指定した回数応答がなければ接続を切断します。Compression yes
/no
: 通信の圧縮を有効にするか無効にするか。ssh -C
オプションに相当します。Protocol 2
: SSHプロトコルのバージョン2を使用することを強制します。SSHv1はセキュリティに問題があるため、通常はv2を使用します。デフォルトでv2ですが、明示的に指定することもあります。StrictHostKeyChecking yes
/no
/ask
: 接続先のホスト鍵がknown_hosts
に登録されていない場合や変更されている場合の挙動を指定します。yes
が最も安全(登録されていないホストには接続しない)ですが、初めての接続が面倒になります。ask
はデフォルトの挙動(フィンガープリントを表示して確認を求める)です。no
はチェックを行わないため非推奨です。-
ProxyJump [プロキシホスト名]
: いわゆる「踏み台サーバー」を経由して目的のサーバーに接続する設定です。例えばssh -J jump-server target-server
というコマンドをconfig
ファイルで記述できます。
“`
Host jump-server
Hostname jump.example.com
User jumpuser
IdentityFile ~/.ssh/jump_keyHost target-server
Hostname target.internal.local
User targetuser
ProxyJump jump-server # 上で定義したエイリアスを指定
``
ssh target-server
このように設定すると、とコマンドを実行するだけで、自動的に
jump.example.com経由で
target.internal.local` に接続してくれます。
~/.ssh/config
は非常に強力な機能で、SSHの利便性と安全性を大きく向上させます。ぜひ活用してみてください。設定の詳細は man ssh_config
コマンド(macOS/Linux)で確認できます。
第7章:SSH関連のファイル転送コマンド
SSHの技術は、安全なシェル接続だけでなく、安全なファイル転送にも利用されています。主なコマンドに scp
と sftp
があります。
7.1 scp
コマンド (Secure Copy)
scp
はSSHプロトコルを利用してファイルをコピーするコマンドです。基本的な使い方は、通常の cp
コマンドやWindowsの copy
コマンドに似ていますが、コピー元またはコピー先にリモートのサーバーを指定できます。
構文:
bash
scp [オプション] [コピー元] [コピー先]
コピー元とコピー先は、以下のいずれかの形式で指定します。
- ローカルファイルパス:
/path/to/local/file
- リモートファイルパス:
[ユーザー名]@[ホスト名]:/path/to/remote/file
例:
-
ローカルファイルからリモートサーバーへコピー:
bash
scp /path/to/local/file.txt [email protected]:/path/to/remote/directory/
ローカルのfile.txt
を、example.com
サーバー上のmyuser
の/path/to/remote/directory/
ディレクトリにコピーします。ファイル名を変えたい場合は、コピー先のパスにファイル名を含めます。
bash
scp /path/to/local/file.txt [email protected]:/path/to/remote/directory/newname.txt -
リモートサーバーからローカルへコピー:
bash
scp [email protected]:/path/to/remote/file.txt /path/to/local/directory/
example.com
サーバー上の/path/to/remote/file.txt
を、ローカルの/path/to/local/directory/
ディレクトリにコピーします。 -
リモートサーバー間でのコピー:
ローカルPCを経由せずに、SSHサーバーAからSSHサーバーBへ直接ファイルをコピーします。
bash
scp [email protected]:/path/to/file.txt [email protected]:/path/to/directory/
このコマンドはローカルPCから実行しますが、データ転送はサーバーAとサーバーBの間で直接行われます(ただし、ローカルPCは認証情報などを中継する役割を担う場合があります)。
よく使うオプション:
-P [ポート番号]
: リモートホストのSSHポートを指定します。(-p
ではなく-P
なので注意)-r
: ディレクトリを再帰的にコピーします。
bash
scp -r /path/to/local/directory [email protected]:/path/to/remote/parent_directory/-i [秘密鍵ファイル]
: 使用する秘密鍵ファイルを指定します。-v
: 詳細表示(デバッグに便利)。
scp
はコマンドラインで簡単にファイルコピーができるため、スクリプトなどでもよく利用されます。ただし、新しいバージョンのOpenSSHでは、sftp
の実装の上に scp
が再構築されており、パフォーマンスや機能面で sftp
の方が優れている場合もあります。
7.2 sftp
コマンド (SSH File Transfer Protocol)
sftp
はSSH上で動作するファイル転送プロトコルで、より対話的なファイル操作に適しています。FTPコマンドに似た使い勝手で、リモートサーバー上のファイルやディレクトリを操作できます。
接続方法:
“`bash
sftp [ユーザー名]@[ホスト名またはIPアドレス]
ポート指定する場合は -P オプション (scpと同じく大文字P)
sftp -P 2222 [email protected]
“`
接続に成功すると、sftp>
というプロンプトが表示されます。ここで様々なコマンドを実行できます。
よく使う sftp>
プロンプトでのコマンド:
ls
: リモートサーバーの現在のディレクトリにあるファイルやフォルダを一覧表示。lls
: ローカルPCの現在のディレクトリにあるファイルやフォルダを一覧表示。cd [リモートディレクトリ]
: リモートサーバー上でディレクトリを移動。lcd [ローカルディレクトリ]
: ローカルPC上でディレクトリを移動。get [リモートファイル]
: リモートファイルをローカルにダウンロード。
例:get remote_file.txt
put [ローカルファイル]
: ローカルファイルをリモートにアップロード。
例:put local_file.txt
get -r [リモートディレクトリ]
: リモートディレクトリをローカルに再帰的にダウンロード。put -r [ローカルディレクトリ]
: ローカルディレクトリをリモートに再帰的にアップロード。mkdir [リモートディレクトリ]
: リモートサーバー上にディレクトリを作成。rm [リモートファイル]
: リモートサーバー上のファイルを削除。help
または?
: コマンド一覧を表示。quit
またはbye
: sftpセッションを終了。
sftp
はインタラクティブな操作に向いているため、複数のファイルを操作したり、ディレクトリ構造を確認しながら作業したい場合に便利です。Windowsであれば、FileZillaなどのGUIのSFTPクライアントを使うこともできます。GUIクライアントも内部的にはSFTPプロトコルを利用しています。
第8章:SSHのセキュリティに関する注意点
SSHは安全なプロトコルですが、設定や使い方によってはセキュリティリスクが生じることがあります。安全に利用するための注意点を理解しておきましょう。
-
パスワード認証の危険性:
第3章でも述べたように、パスワード認証はブルートフォース攻撃(総当たり攻撃)に弱いです。サーバー側でこれを防ぐために、ログイン試行回数制限やログイン遅延などの対策が取られていることが多いですが、それでも十分とは言えません。- 対策: 公開鍵認証を強く推奨します。特にインターネットに公開しているサーバーでは、パスワード認証を無効化する設定にするのが理想です(サーバー側のsshd_configで
PasswordAuthentication no
に設定)。
- 対策: 公開鍵認証を強く推奨します。特にインターネットに公開しているサーバーでは、パスワード認証を無効化する設定にするのが理想です(サーバー側のsshd_configで
-
秘密鍵の管理:
公開鍵認証のセキュリティは、秘密鍵が安全に保管されているかにかかっています。秘密鍵が漏洩すると、パスフレーズを設定していない場合は誰でもあなたのユーザーとしてサーバーにログインできてしまいます。- 対策:
- 秘密鍵には必ずパスフレーズを設定する。
- 秘密鍵ファイルには所有者以外がアクセスできないよう、適切なパーミッションを設定する(
chmod 600 ~/.ssh/id_rsa
)。ssh-keygen
やssh-copy-id
は自動で設定してくれますが、手動で操作した場合は確認が必要です。 - 秘密鍵ファイルを安全な場所に保管し、不要な場所にコピーしたり置いたりしない。
- 対策:
-
SSHポート番号の変更:
SSHのデフォルトポートは22番です。多くの攻撃者はまずこのポートに対して攻撃を仕掛けます。ポート番号をデフォルト以外(例えば1024番以上の未使用のポート)に変更することで、大量の自動化された攻撃(ボットによるスキャンなど)の対象になることを避けることができます。- 対策: サーバー側のsshd_configファイルで
Port
の値を変更し、SSHデーモンを再起動します。クライアント側からは-p
オプションまたは~/.ssh/config
で新しいポート番号を指定して接続します。ただし、これはセキュリティを高める「追加の対策」であり、これだけで安全になるわけではない点に注意が必要です(ポートスキャンによってポート番号は特定され得ます)。
- 対策: サーバー側のsshd_configファイルで
-
不要なユーザーからのログイン制限:
SSHサーバーにログインできるユーザーは最小限に絞るべきです。特に root ユーザーでの直接ログインは非常に危険です。- 対策: サーバー側のsshd_configファイルで
PermitRootLogin no
に設定し、rootでの直接ログインを禁止します。root権限が必要な作業は、一度一般ユーザーでログインしてからsu
やsudo
コマンドで行います。また、必要のないユーザーアカウントからのSSHログインを禁止する設定も検討しましょう。
- 対策: サーバー側のsshd_configファイルで
-
ファイアウォールの設定:
SSHポート(デフォルト22、または変更したポート番号)へのアクセスは、必要最低限のIPアドレスからのみ許可するようにファイアウォールを設定します。- 対策: サーバー側でファイアウォール(例:
iptables
,firewalld
,ufw
)を設定し、許可された特定のIPアドレスまたはネットワーク範囲からのSSH接続のみを許可します。
- 対策: サーバー側でファイアウォール(例:
-
SSHサーバーソフトウェアの更新:
SSHサーバー(sshd)のソフトウェアに脆弱性が見つかることがあります。常に最新のバージョンを使用することで、既知の脆弱性からの攻撃を防ぐことができます。- 対策: サーバーOSのパッケージ管理システム(
apt
,yum
,dnf
など)を使って、定期的にシステム全体を更新し、SSHサーバーソフトウェアも最新の状態に保ちましょう。
- 対策: サーバーOSのパッケージ管理システム(
これらのセキュリティ対策は、特にインターネットに公開されたサーバーを運用する上で非常に重要です。SSHを安全に使いこなすためには、クライアント側の操作だけでなく、サーバー側の設定や管理に関する基本的な知識も役立ちます。
第9章:SSH接続のトラブルシューティング
SSH接続がうまくいかない場合、様々な原因が考えられます。落ち着いて一つずつ原因を探っていきましょう。
-
「Connection refused」と表示される:
これは、接続しようとしたホストの指定したポートで、SSHサーバーが起動していないか、ファイアウォールによって通信が拒否されている可能性が高いです。- 確認事項:
- ホスト名またはIPアドレスが正しいか?
- ポート番号が正しいか?
-p
オプションや~/.ssh/config
の設定を確認。 - 接続先サーバーでSSHデーモン(sshd)が起動しているか? サーバー管理者に確認するか、物理的にアクセスできるならサーバーの状態を確認。
- サーバー側のファイアウォール(
iptables
,firewalld
,ufw
など)でSSHポートが開いているか? クライアントPCのIPアドレスからの接続が許可されているか? - ネットワーク経路上のファイアウォールやルーターでSSHポートがブロックされていないか?
- 確認事項:
-
「Connection timed out」と表示される:
これは、接続要求が相手に全く届いていない、あるいは応答が全く返ってこない状態です。ネットワークレベルの問題である可能性が高いです。- 確認事項:
- ホスト名またはIPアドレスが正しいか?
- ローカルPCから接続先ホストまでネットワーク経路が通っているか?
ping [ホスト名またはIPアドレス]
コマンドで疎通を確認してみてください。ping
が通らない場合は、ネットワーク設定やルーター、ファイアウォールなどに問題がある可能性があります。 - 接続先サーバーが存在し、電源が入っているか?
- 確認事項:
-
パスワード認証が失敗する(「Permission denied, please try again.」):
ユーザー名またはパスワードが間違っています。- 確認事項:
- ユーザー名が正しいか?
- パスワードが正しいか? 大文字・小文字、全角・半角、キーボード配列(特に英語配列と日本語配列の違い)などを確認して、慎重に入力してみてください。
- サーバー側でそのユーザーからのSSHログインが許可されているか?(サーバー設定による)
- 確認事項:
-
公開鍵認証が失敗する(パスワード入力が求められる、または「Permission denied (publickey).」):
公開鍵認証の設定に問題があります。- 確認事項:
- ローカルPCの秘密鍵 (
~/.ssh/id_rsa
など) が存在し、正しいファイルか?-i
オプションや~/.ssh/config
で正しい秘密鍵が指定されているか? - 秘密鍵にパスフレーズを設定した場合、正しいパスフレーズを入力しているか?
ssh-add -l
でssh-agent
に登録されているか確認する。 - サーバー側の
~/.ssh/authorized_keys
ファイルに、あなたの公開鍵が正確に、1行で追記されているか? 余分な改行や文字化けがないか? - サーバー側の
~/.ssh
ディレクトリと~/.ssh/authorized_keys
ファイルのパーミッションが正しいか? (~/.ssh
は700、authorized_keys
は600) - サーバー側の
sshd_config
でPubkeyAuthentication yes
になっているか?
- ローカルPCの秘密鍵 (
- 確認事項:
-
ホスト鍵の警告が表示される(「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」):
接続先サーバーのホスト鍵が、あなたのローカルPCの~/.ssh/known_hosts
に記録されているものと異なっています。- 確認事項:
- 接続先サーバーが本当にそのサーバーか? IPアドレスやホスト名が間違っていないか?
- サーバー側でOSの再インストールやSSHサーバーの再設定などが行われ、ホスト鍵が変更されたか?
- 注意: もし、なりすましの可能性がないと確信できる場合は、警告メッセージに表示された行番号(
Offending key in /home/myuser/.ssh/known_hosts:N
のN
)を参考にして、known_hosts
ファイルから該当する行を削除し、再度接続して新しいホスト鍵を登録し直すことができます。
bash
ssh-keygen -R [ホスト名またはIPアドレス] # known_hosts から該当エントリを削除するコマンド
しかし、この警告はセキュリティ上の重要なサインであるため、安易にknown_hosts
の内容を削除したり、StrictHostKeyChecking no
のような設定にしたりするのは避けてください。 原因を十分に調査することが重要です。
- 確認事項:
デバッグの基本:
トラブルシューティングの際は、必ず -v
オプションを使って詳細なログを表示させましょう。
bash
ssh -v [email protected]
このログには、接続試行の各段階(DNS名前解決、TCP接続、プロトコル交換、認証試行など)の情報が表示されます。どの段階で失敗しているかが分かれば、原因を特定しやすくなります。
第10章:まとめと次のステップ
この記事では、SSHの基本的な概念から始まり、SSHクライアントの準備、パスワード認証と公開鍵認証による接続方法、便利なオプション、設定ファイル、ファイル転送コマンド、そしてセキュリティ上の注意点とトラブルシューティングまで、SSHの入門レベルの情報を網羅的に解説しました。
SSHは、安全なリモート操作とファイル転送を実現するための非常に強力で不可欠なツールです。クラウドサーバーの管理、プログラミング開発、ネットワーク管理など、様々な場面でSSHは必須となります。
この解説を通じて、あなたがSSHの基本を理解し、自信を持って使い始めるための一歩を踏み出せたなら幸いです。最初は難しく感じるかもしれませんが、実際にコマンドを入力し、試しながら学ぶことで、徐々に慣れていくはずです。
SSHには、ここで紹介しきれなかったさらに高度な機能やオプションがたくさんあります。例えば、SSHエージェント転送の詳細、プロキシコマンド、各種暗号化アルゴリズムの選択、sshd_config
によるサーバー側の詳細設定などです。
次のステップとして:
- 実際に触ってみる: クラウドサービスの無料枠などでLinuxサーバーを借りて、実際にSSH接続を試してみましょう。または、自宅内のPC同士でSSH接続を有効にして練習するのも良いでしょう。
man
コマンドを活用する: SSHクライアント (ssh
) やSSHサーバー (sshd
)、設定ファイル (ssh_config
,sshd_config
) の詳細なマニュアルは、ターミナルでman [コマンド名/ファイル名]
と入力することで参照できます。膨大な情報量ですが、分からないオプションが出てきたときに辞書のように使うと便利です。
bash
man ssh
man ssh_config
man sshd
man sshd_config- 公開鍵認証を完全に使いこなす: 公開鍵認証の仕組みをしっかりと理解し、パスフレーズ付きの鍵生成、
ssh-copy-id
または手動での公開鍵配置、ssh-agent
の活用といった一連の流れをマスターしましょう。そして、可能であればパスワード認証を無効化し、より安全な運用を目指しましょう。 - ポートフォワーディングを試す: ローカルポートフォワーディングを使って、自宅ネットワーク内のサービスに外部から安全にアクセスしたり、開発中のWebアプリケーションを一時的に外部に公開したりするなど、具体的なユースケースを想定して試してみましょう。
.ssh/config
を活用する: よく接続するサーバーはconfig
ファイルに登録し、短いエイリアスで接続できるようにしましょう。ポート番号やユーザー名、秘密鍵の指定なども自動化し、日々の作業効率を向上させましょう。
SSHは使いこなせば使いこなすほど、その真価を発揮するツールです。焦らず、一歩ずつ学習を進めていってください。
安全で快適なリモートライフを!