SSHとは?Linuxサーバーへリモート接続する方法を初心者向けに解説
ここまでの記事では、Linuxでさまざまなコマンドを学んできました。
しかし実際のサーバー運用では、
サーバー本体の前に座って直接操作する
とは限りません。
たとえば、
自分のPC
│
│ ネットワーク
↓
Linuxサーバー
のように、自分のPCからネットワーク経由でLinuxサーバーへ接続して操作することがあります。
そこでよく利用されるのがSSHです。
今回はSSHの仕組みを理解しながら、実際にLinuxサーバーへリモートログインする方法を学んでいきます。
SSHとは?
**SSH(Secure Shell)**は、ネットワークを経由して別のコンピューターへ安全に接続し、操作するための仕組みです。
Linuxサーバーでは特によく利用されます。
たとえば、自分のPCからLinuxサーバーへSSH接続すると、
自分のPC
│
│ SSH
↓
Linuxサーバー
│
├── ls
├── cd
├── systemctl
└── その他のLinuxコマンド
のように、自分のPCからLinuxサーバー上のコマンドを実行できます。
つまり、
離れた場所にあるLinuxをターミナルから操作できる
ということです。
なぜSSHは「Secure」なの?
SSHの名前は、
Secure Shell
の略です。
SSHでは通信内容を暗号化してやり取りします。
イメージすると、
PC
│
│ 暗号化された通信
↓
Linuxサーバー
となります。
ログイン情報やコマンド、通信内容などをネットワーク上でそのまま平文として送るのではなく、安全に通信するための仕組みが用意されています。
サーバーを遠隔操作するうえで非常に重要なポイントです。
SSHクライアントとSSHサーバー
SSHを理解するときに覚えておきたいのが、
- SSHクライアント
- SSHサーバー
です。
接続する側がSSHクライアントです。
接続される側がSSHサーバーです。
たとえば、
自分のPC
SSHクライアント
│
│ SSH接続
↓
Linuxサーバー
SSHサーバー
という関係になります。
Linux側では、SSH接続を受け付けるためのSSHサーバーが動いている必要があります。
代表的な実装としてOpenSSHがあります。
SSHでは22番ポートがよく利用される
SSHでは標準的にTCP 22番ポートが利用されます。
前回の記事で、ポート番号は、
「どのサービスへ通信するのかを識別する番号」
と学びました。
たとえば、
Linuxサーバー
192.168.1.10
│
├── TCP 22
│ └── SSH
│
├── TCP 80
│ └── HTTP
│
└── TCP 25565
└── Minecraft
というイメージです。
SSH接続の場合は、
PC
│
│ TCP 22
↓
Linuxサーバー
│
↓
SSHサーバー
という通信になります。
SSHサーバーが動いているか確認する
Linux側でSSHサーバーが動いているか確認してみましょう。
systemdを利用している環境では、
systemctl status ssh
またはディストリビューションによって、
systemctl status sshd
などで確認できます。
ここで以前学んだsystemctlが登場します。
active (running)
などと表示されていれば、サービスが動作していることを確認する材料になります。
サービス名はディストリビューションや環境によって異なるため、自分の環境に合わせて確認しましょう。
22番ポートを確認してみよう
SSHサービスが起動しているだけでなく、実際にポートで待ち受けているか確認することもできます。
前回学んだssを使います。
ss -tln
SSHの22番ポートに絞るなら、
ss -tln | grep ':22'
などで確認できます。
たとえば、
LISTEN 0 128 0.0.0.0:22
などと表示されれば、TCP 22番ポートで待ち受けていることを確認できます。
ここまでで、
systemctl
↓
SSHサービスは動いている?
ss
↓
22番ポートは待ち受けている?
という2つの視点から確認できます。
LinuxサーバーのIPアドレスを確認する
SSH接続するためには、接続先となるLinuxサーバーを指定する必要があります。
そこでIPアドレスを確認します。
ip addr
または、
ip a
を実行します。
たとえばLinuxサーバーに、
192.168.1.10
というIPアドレスが設定されていたとします。
このIPアドレスを使って、別のPCからSSH接続します。
sshコマンドの基本
SSH接続の基本形は、
ssh ユーザー名@接続先
です。
たとえば、
ユーザー名
user01
Linuxサーバー
192.168.1.10
なら、
ssh user01@192.168.1.10
と実行します。
意味を分解すると、
ssh
↓
SSHで接続する
user01
↓
Linuxへログインするユーザー
192.168.1.10
↓
接続先Linuxサーバー
となります。
初回接続時にメッセージが表示されることがある
初めてSSH接続すると、
The authenticity of host ... can't be established.
...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
のようなメッセージが表示されることがあります。
これは、
「この接続先をまだ信頼済みとして登録していません」
という確認です。
SSHでは接続先サーバーのホスト鍵を使って、接続先を識別する仕組みがあります。
実際の業務環境では、表示されたフィンガープリントが正しい接続先のものか確認してから登録することが重要です。
確認して接続を続けると、接続先の情報がクライアント側に記録されます。
パスワードでログインする
SSHサーバー側でパスワード認証が許可されている場合、接続時にパスワードの入力を求められます。
PC
│
│ ssh user01@192.168.1.10
↓
Linuxサーバー
│
│ パスワードを確認
↓
ログイン
認証に成功すると、Linuxサーバーへログインできます。
ここから、
pwd
ls
whoami
など、これまで学んだLinuxコマンドを実行できます。
whoamiで確認してみよう
SSH接続できたら、
whoami
を実行してみましょう。
たとえば、
user01
と表示されれば、
user01としてLinuxサーバーへログインしている
ことが確認できます。
さらに、
hostname
を実行すると、現在操作しているLinuxのホスト名を確認できます。
SSHを使って複数のサーバーを操作するときには、
「今どのサーバーを操作しているのか」
を意識することがとても重要です。
SSH接続を終了する
SSH接続を終了して自分のPCへ戻る場合は、
exit
を実行します。
すると、
Linuxサーバー
↓
SSH接続終了
↓
自分のPC
という形で接続が終了します。
Ctrl + Dでシェルを終了する方法もありますが、まずはexitを覚えておけばOKです。
SSH接続できないときは?
SSH接続できない場合、いきなり設定を変更するのではなく、一つずつ確認していきます。
たとえば、
SSH接続できない
↓
① LinuxのIPアドレスは正しい?
↓
② ネットワーク的に到達できる?
↓
③ SSHサービスは動いている?
↓
④ TCP 22番で待ち受けている?
↓
⑤ ファイアウォールなどで遮断されていない?
↓
⑥ ユーザー・認証情報は正しい?
という流れです。
これまで学んだコマンドを使うと、
IPアドレス
↓
ip addr
通信確認
↓
ping
サービス
↓
systemctl status
ポート
↓
ss -tln
のように確認できます。
これまでの記事の知識がここでつながります。
Connection refusedとは?
SSH接続時に、
Connection refused
と表示されることがあります。
これは、接続先まで到達できていても、指定したポートで接続を受け付けていない場合などに発生します。
確認するポイントとして、
- SSHサービスが起動しているか
- 22番ポートなどで待ち受けているか
- SSHが別のポートを利用していないか
などがあります。
Linux側では、
systemctl status ssh
や、
ss -tln
などを使って確認できます。
Connection timed outとは?
一方、
Connection timed out
となることもあります。
この場合は、
- 接続先IPアドレス
- ネットワーク経路
- ファイアウォール
- セキュリティ設定
なども確認対象になります。
つまり、
Connection refused
と、
Connection timed out
では、原因を考える方向が少し違います。
エラーメッセージをそのまま流さず、
「どの段階で通信できていないのか」
を考えることが大切です。
SSHには公開鍵認証もある
ここまではパスワードを使ってログインする方法を見てきました。
SSHにはもう一つ、よく利用される認証方法があります。
それが公開鍵認証です。
公開鍵認証では、
- 秘密鍵
- 公開鍵
という2つの鍵を利用します。
イメージすると、
自分のPC
└── 秘密鍵
│
│ SSH認証
↓
Linuxサーバー
└── 公開鍵
という構成です。
公開鍵と秘密鍵
公開鍵認証では、鍵の扱いが非常に重要です。
公開鍵
接続先のLinuxサーバー側へ登録する鍵です。
名前の通り、秘密鍵とは異なり、秘密に保持する必要がある情報ではありません。
秘密鍵
SSH接続する側が保持する重要な鍵です。
秘密鍵は他人へ渡してはいけません。
イメージすると、
公開鍵
→ サーバーへ登録
秘密鍵
→ 自分で安全に保管
となります。
公開鍵認証の大まかな流れ
細かい暗号技術はいったん置いて、初心者の段階では次の流れを理解しておきましょう。
① クライアントで鍵ペアを用意
↓
② 公開鍵をLinuxサーバーへ登録
↓
③ クライアントが秘密鍵を使って認証
↓
④ サーバー側が登録済みの公開鍵を使って確認
↓
⑤ 認証成功
↓
⑥ SSHログイン
パスワードそのものをネットワーク越しの認証情報として毎回入力する方式とは異なる認証方法です。
ssh-keygenとは?
SSH用の鍵ペアを作成するときによく利用されるのが、
ssh-keygen
です。
たとえば現在のOpenSSH環境では、Ed25519鍵を作成する方法として、
ssh-keygen -t ed25519
などがあります。
実行すると、秘密鍵と公開鍵が作成されます。
鍵の保存場所やパスフレーズなどを設定できます。
ただし、公開鍵認証については設定項目も増えるため、このシリーズではSSHの基本として仕組みを理解し、実際のサーバー構築時に必要に応じて詳しく扱います。
rootで直接SSH接続すればいい?
Linuxにはrootユーザーがあります。
では、
ssh root@192.168.1.10
で常にrootとしてログインすれば楽なのでは?
と思うかもしれません。
しかし、rootはLinux上で非常に強い権限を持っています。
そのため一般的には、
一般ユーザーでログイン
↓
必要な操作だけ
↓
sudo
という考え方が重要です。
また、SSHサーバー側の設定によってはrootによる直接ログインが禁止されている場合もあります。
以前学んだ、
必要なユーザーに必要な権限だけ与える
という考え方が、SSHでも重要になります。
Minecraftサーバーではどう使う?
今後構築するMinecraftサーバーでもSSHを利用できます。
たとえば、
自分のPC
192.168.1.20
│
│ SSH
│ TCP 22
↓
Linuxサーバー
192.168.1.10
│
└── Minecraft Server
TCP 25565
という構成です。
自分のPCから、
ssh adminuser@192.168.1.10
でLinuxサーバーへ接続します。
その後、
systemctl status minecraft
でMinecraftサーバーの状態を確認したり、
ss -tln
でポートの状態を確認したり、
cd /opt/minecraft
でMinecraftサーバーのディレクトリへ移動したりできます。
つまり、
自分のPC
↓
SSH
↓
Linuxサーバーへログイン
↓
Linuxコマンドで管理
↓
Minecraftサーバーを操作
という形になります。
これが、実際のサーバー管理にかなり近い操作方法です。
SSHとMinecraftの通信は別物
ここは少し注意しましょう。
SSHとMinecraftは、同じLinuxサーバーを利用していても別の通信です。
Linuxサーバー
192.168.1.10
│
├── TCP 22
│ └── SSH
│
└── TCP 25565
└── Minecraft
SSHは、
Linuxサーバーを管理するための通信
です。
Minecraftの25565番ポートは、
MinecraftクライアントがMinecraftサーバーへ接続するための通信
です。
同じIPアドレスでも、ポート番号によって接続するサービスが変わります。
実際にSSH接続してみよう
Linuxサーバー側でIPアドレスを確認します。
ip addr
たとえば、
192.168.1.10
だったとします。
次にSSHサービスを確認します。
systemctl status ssh
または環境によって、
systemctl status sshd
です。
続いてポートを確認します。
ss -tln | grep ':22'
準備できたら、自分のPCから接続します。
ssh user01@192.168.1.10
ログインできたら、
whoami
hostname
pwd
を実行してみましょう。
最後に、
exit
でSSH接続を終了します。
これで、
LinuxのIPを確認
↓
SSHサービスを確認
↓
22番ポートを確認
↓
PCからSSH接続
↓
Linuxを操作
↓
exitで切断
という一連の流れを体験できます。
🍯 はちみつメモ
SSHは「離れたLinuxを操作するための入口」!
SSHを使えば、Linuxサーバー本体を直接触らなくても、自分のPCからネットワーク経由で操作できます。
SSH接続できないときは、
IPアドレス → ネットワーク → SSHサービス → ポート → 認証
の順番で確認してみましょう。
これまで学んだ
ip addr、ping、systemctl、ssが全部つながってきます。
まとめ
今回はSSHについて学びました。
この記事で覚えること
- SSHはネットワーク経由で別のコンピューターを安全に操作する仕組み
- SSHの通信は暗号化される
- 接続する側がSSHクライアント
- 接続される側がSSHサーバー
- SSHでは標準的にTCP 22番ポートが利用される
ssh ユーザー名@IPアドレスで接続できるwhoamiでログインユーザーを確認できるhostnameで操作中のLinuxを確認できるexitでSSH接続を終了できる- SSHにはパスワード認証と公開鍵認証がある
- 公開鍵認証では公開鍵と秘密鍵を利用する
- 秘密鍵は安全に管理する
- rootで直接操作し続けるのではなく、一般ユーザーと
sudoを使い分ける考え方が重要 - SSH接続できないときはIP・サービス・ポート・認証などを順番に確認する
SSHを使えるようになると、
「Linuxを触っている」
という段階から、
「Linuxサーバーをリモートで管理している」
という段階へ一気に近づきます。
このあとMinecraftサーバーを構築するときも、基本的には自分のPCからSSHでLinuxへ入り、コマンドを使って構築・管理する流れを体験していきます。
次におすすめ
次は**「Linuxでテキストを編集・検索する方法」**について学びます。
サーバー構築では、
設定ファイルを開く
↓
設定を書き換える
↓
保存する
↓
サービスを再起動する
という操作を頻繁に行います。
次の記事では、
nanovi/vimgrepfindheadtail- パイプ
| - リダイレクト
>>>
などを使いながら、Linux上で設定ファイルやログを扱うための基本操作を学びます。
Minecraftサーバーのserver.propertiesを編集したり、ログからエラーを探したりするときにも、そのまま使う知識です。