SSH を使用したリモート Linux サーバーへの接続

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Secure Shell(SSH)プロトコルを使用してリモート Linux サーバーに接続し、管理するための不可欠なスキルを習得します。まず、OpenSSH サーバーパッケージのインストールと設定を行い、リモート環境をセットアップすることから始めます。サーバーが接続を受け入れられる状態になったことを確認した後、クライアントマシンから接続を確立するために不可欠なステップである IP アドレスの取得方法を学びます。

サーバーの設定が完了したら、SSH を介したリモート操作の 2 つの主要な方法を練習します。1 つ目は、完全な対話型シェルセッションを確立し、リモートマシンのコマンドラインにフルアクセスする方法です。2 つ目は、完全な対話型セッションを開始せずに、リモートサーバー上で特定の単一コマンドを実行する方法を学びます。この手法は、スクリプト作成や自動化タスクにおいて非常に効果的です。

OpenSSH サーバーのインストールと設定

このステップでは、システムが外部からの SSH 接続を受け入れられるように、OpenSSH サーバーパッケージをインストールします。SSH(Secure Shell)は、安全でないネットワークを介してネットワークサービスを安全に操作するための暗号化ネットワークプロトコルです。openssh-server パッケージには、SSH サーバーをホストするためのコアコンポーネントが含まれています。

まず、最新バージョンのソフトウェアを確実に入手するために、システムのパッケージリストを更新するのが良い習慣です。labex ユーザーは sudo 権限を持っており、これはシステム全体のパッケージ管理に必要です。

次のコマンドを実行してパッケージインデックスを更新します。

sudo apt-get update

リポジトリからパッケージリストが取得されていることを示す、次のような出力が表示されます。

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Fetched 1,845 kB in 2s (1,040 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up-to-date.

次に、apt-get を使用して openssh-server パッケージをインストールします。-y フラグは、すべてのプロンプトに対して自動的に「yes」と回答するため、対話なしでインストールを進行できます。

sudo apt-get install -y openssh-server

コマンドが完了すると、openssh-server とその依存関係のインストールおよびセットアップを確認する出力が表示されます。

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  ncurses-term openssh-sftp-server ssh-import-id
...
Setting up openssh-server (1:8.9p1-3ubuntu0.1) ...
...
Creating SSH2 ECDSA key; this may take some time ...
Creating SSH2 ED25519 key; this may take some time ...
...

sshd という名前の OpenSSH サーバーサービスは、インストール後に自動的に開始されるはずです。systemd のシステムおよびサービスマネージャーを制御するツールである systemctl コマンドを使用して、そのステータスを確認できます。

SSH サービスのステータスを確認します。

sudo systemctl status ssh

出力にサービスが active (running) であることが示されるはずです。これにより、SSH サーバーが接続を受け入れる準備ができていることが確認できます。

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 10:30:00 UTC; 5s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1234 (sshd)
      Tasks: 1 (limit: 4617)
     Memory: 1.2M
        CPU: 8ms
     CGroup: /system.slice/ssh.service
             └─1234 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

...

キーボードの q キーを押してステータス表示を終了し、コマンドプロンプトに戻ります。

素晴らしい!これで OpenSSH サーバーがインストールされ、システムで実行されました。次のステップでは、SSH デモンストレーション用の新しいユーザーを作成し、サーバーの IP アドレスを確認して接続する方法を学びます。

SSH デモンストレーション用の新規ユーザー作成

このステップでは、SSH 接続に使用する新しいユーザーアカウントを作成します。デフォルトの labex ユーザーは sudo 権限を持っていますが、SSH 認証用のパスワードが不明なため、このデモンストレーション用にパスワードが既知の専用ユーザーを作成する必要があります。

まず、adduser コマンドを使用して sshuser という名前の新しいユーザーを作成します。このコマンドはユーザーアカウントを作成し、パスワードやその他の詳細設定を求めるプロンプトを表示します。

sudo adduser sshuser

新しいユーザーのパスワードを入力し、確認するように求められます。この実験では、パスワードとして password123 を使用してください。フルネームや部屋番号などの追加情報も求められますが、これらのフィールドは Enter キーを押してスキップして構いません。

Adding user `sshuser' ...
Adding new group `sshuser' (1001) ...
Adding new user `sshuser' (1001) with group `sshuser' ...
Creating home directory `/home/sshuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sshuser
Enter the new value, or press ENTER for the default
 Full Name []:
 Room Number []:
 Work Phone []:
 Home Phone []:
 Other []:
Is the information correct? [Y/n] Y

次に、/etc/passwd ファイルを確認して、ユーザーが正常に作成されたことを確認します。

grep sshuser /etc/passwd

次のような出力が表示されるはずです。

sshuser:x:1000:1000:,,,:/home/sshuser:/bin/bash

これにより、sshuser アカウントが /home/sshuser にホームディレクトリを持ち、bash シェルを使用するように作成されたことが確認できます。正確な UID(ユーザー ID)と GID(グループ ID)の番号は、システム上の既存のユーザーによって異なる場合があります。

また、ユーザーのホームディレクトリが作成されたことも確認できます。他のユーザーのホームディレクトリにアクセスするには sudo 権限が必要であることに注意してください。

sudo ls -la /home/sshuser

出力には、ユーザーのホームディレクトリの内容が表示されます。

total 20
drwxr-x--- 2 sshuser sshuser 4096 Jun 30 09:26 .
drwxr-xr-x 5 root    root    4096 Jun 30 09:26 ..
-rw-r--r-- 1 sshuser sshuser  220 Jun 30 09:26 .bash_logout
-rw-r--r-- 1 sshuser sshuser 3771 Jun 30 09:26 .bashrc
-rw-r--r-- 1 sshuser sshuser  807 Jun 30 09:26 .profile

ホームディレクトリの権限が制限されている(drwxr-x---)ことに注目してください。これは、所有者(sshuser)と同じグループのユーザーのみがアクセスできることを意味します。そのため、内容をリスト表示するには sudo が必要になります。

完璧です!これで、以降のステップで SSH 接続に使用できる、パスワード password123 を持つユーザーアカウント sshuser が用意できました。

SSH サーバーの IP アドレスの取得

このステップでは、SSH サーバーの IP アドレスを確認する方法を学びます。IP アドレスは、通信にインターネットプロトコルを使用するコンピュータネットワークに接続された各デバイスに割り当てられる、一意の数値ラベルです。SSH 接続を確立するには、クライアントマシンは接続先サーバーの IP アドレスを知る必要があります。

2 台の別々のマシンを使用する一般的なシナリオでは、この IP アドレスを使用してクライアントから接続します。しかし、この実験では、SSH サーバーと SSH クライアントの両方の役割を果たす 1 台の仮想マシン上で作業しています。自身のマシンで動作している SSH サーバーに接続するには、127.0.0.1 という特別な IP アドレス(localhost とも呼ばれます)を使用できます。このアドレスは常にローカルマシン自体を指します。

それでも、マシンのネットワーク向け IP アドレスを確認する方法を知っておくことは不可欠なスキルです。Linux でこれを行うための現代的なコマンドは ip です。

システム上のすべてのネットワークインターフェースに関する情報を表示するには、ip addr コマンドを使用します。

ip addr

出力には、lo(ループバックインターフェース)、eth0(主要なイーサネットインターフェース)、および場合によっては docker0(Docker ブリッジインターフェース)などのすべてのネットワークインターフェースがリストされます。通常、eth0 であるメインネットワークインターフェースの下にある inet エントリを探します。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:82:ae brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.114/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159625sec preferred_lft 1892159625sec
    inet6 fe80::216:3eff:fe01:82ae/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:86:fe:f0:88 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

上記の例では、eth0 インターフェースのプライマリ IP アドレスは 172.16.50.114 です。システムに Docker がインストールされている場合は、docker0 インターフェースも表示されることがあります。

マシンの IP アドレスのみを表示するより簡単なコマンドは hostname -I です。

hostname -I

このコマンドは、マシンの IP アドレスをスペース区切りのリストで出力します。

172.16.50.114 172.17.0.1

出力には、プライマリネットワークインターフェースの IP(172.16.50.114)と Docker ブリッジの IP(172.17.0.1)の複数の IP アドレスが表示されています。

これでマシンの IP アドレスを確認する方法がわかりました。次のステップでは、localhost アドレス(127.0.0.1)を使用して、この同じマシンで実行されている SSH サーバーに接続します。

リモートサーバーへの対話型 SSH セッションの確立

このステップでは、ssh クライアントを使用して、設定した OpenSSH サーバーとの対話型セッションを確立します。対話型セッションでは、リモートサーバーのコマンドラインプロンプトが表示され、あたかも物理的にそのマシンにログインしているかのようにコマンドを実行できます。

接続するには、ssh <ユーザー名>@<ホスト名またはIP> という形式で、ssh コマンドの後にユーザー名とサーバーのアドレスを指定します。今回は、自分自身のマシン(localhost)で動作しているサーバーに sshuser として接続するため、IP アドレス 127.0.0.1 を使用します。

ターミナルを開き、次のコマンドを実行します。

ssh sshuser@127.0.0.1

新しい SSH サーバーに初めて接続するとき、SSH クライアントはサーバーの公開鍵のフィンガープリントを表示し、その真正性を確認するように求めます。これは「中間者攻撃」を防ぐためのセキュリティ対策です。yes と入力して Enter キーを押し、続行してください。

The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts.

ホストキーを確認した後、リモートサーバー上の sshuser ユーザーのパスワードを求められます。ユーザー作成時に設定したパスワード password123 を入力します。

sshuser@127.0.0.1's password:

正しいパスワードを入力すると、ログインが完了し、サーバーのウェルカムメッセージと新しいコマンドプロンプトが表示されます。プロンプトがリモートホスト上にいることを示すように変化していることに注目してください。

Welcome to Ubuntu 22.04.x LTS (GNU/Linux x.x.x-xx-generic x86_64)

* Documentation:  https://help.ubuntu.com
* Management:     https://landscape.canonical.com
* Support:        https://ubuntu.com/advantage

sshuser@ubuntu:~$

リモートセッションにいることを確認するために、pwd などのコマンドを実行して現在の作業ディレクトリを表示できます。

pwd

出力には、リモートマシン上のホームディレクトリが表示されます。

/home/sshuser

対話型 SSH セッションを終了してローカルマシンのシェルに戻るには、単に exit と入力して Enter キーを押します。

exit

接続が閉じられたことを確認するメッセージが表示され、元のコマンドプロンプトに戻ります。

logout
Connection to 127.0.0.1 closed.

これで、対話型 SSH セッションの確立と終了に成功しました。

SSH 経由でのリモート単一コマンドの実行

このステップでは、完全な対話型セッションを開始せずに、リモートサーバー上で単一のコマンドを実行する方法を学びます。これは SSH の強力な機能であり、リモートマシンで情報を素早く取得したりタスクを実行したりして、すぐに切断できるため、スクリプトや自動化で広く使用されています。

この構文は、通常の ssh 接続文字列の最後に、実行したいコマンドを追加するだけです。ローカルシェルがコマンドを解釈するのを防ぐために、リモートコマンドを引用符で囲むのが良い習慣です。

リモートサーバーで hostname コマンドを実行してみましょう。このコマンドはシステムのホスト名を出力します。

ssh sshuser@127.0.0.1 "hostname"

以前と同様にパスワード(password123)を求められます。入力すると、リモートサーバーで hostname コマンドが実行され、その出力がターミナルに表示され、SSH 接続は自動的に閉じられます。

sshuser@127.0.0.1's password:
iZrj91w6gb8osv0mra83hdZ

exit と入力しなくても、すぐにローカルのコマンドプロンプトに戻ることに注目してください。

より複雑なコマンドも実行できます。例えば、ls -l / を使用してリモートサーバーのルートディレクトリ(/)の内容をリスト表示してみましょう。

ssh sshuser@127.0.0.1 "ls -l /"

再度、プロンプトが表示されたらパスワード password123 を入力します。出力には、リモートサーバーのルートファイルシステムにあるファイルとディレクトリの詳細なリストが表示されます。

sshuser@127.0.0.1's password:
total 72
lrwxrwxrwx   1 root root     7 Apr 21  2022 bin -> usr/bin
drwxr-xr-x   4 root root  4096 May 30  2023 boot
drwxr-xr-x  19 root root  4080 Jun 30 09:23 dev
drwxr-xr-x 137 root root 12288 Jun 30 09:26 etc
drwxr-xr-x   5 root root  4096 Jun 30 09:26 home
lrwxrwxrwx   1 root root     7 Apr 21  2022 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib32 -> usr/lib32
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib64 -> usr/lib64
lrwxrwxrwx   1 root root    10 Apr 21  2022 libx32 -> usr/libx32
drwx------   2 root root 16384 Dec 28  2022 lost+found
drwxr-xr-x   2 root root  4096 Apr 21  2022 media
drwxr-xr-x   2 root root  4096 Apr 21  2022 mnt
drwxr-xr-x   5 root root  4096 Feb 27  2023 opt
dr-xr-xr-x 231 root root     0 Jun 30 09:22 proc
drwx------   8 root root  4096 Jun 30 09:26 root
drwxr-xr-x  35 root root  1060 Jun 30 09:30 run
lrwxrwxrwx   1 root root     8 Apr 21  2022 sbin -> usr/sbin
drwxr-xr-x  10 root root  4096 Feb 18  2023 snap
drwxr-xr-x   2 root root  4096 Apr 21  2022 srv
dr-xr-xr-x  13 root root     0 Jun 30 09:22 sys
drwxrwxrwt  18 root root  4096 Jun 30 09:30 tmp
drwxr-xr-x  14 root root  4096 Apr 21  2022 usr
drwxr-xr-x  13 root root  4096 Apr 21  2022 var

この方法は、複数のサーバーを管理したり、リモート操作をローカルのシェルスクリプトに統合したりする際に非常に効率的です。これで、対話型セッションと単一コマンドの実行という、SSH を使用する 2 つの主要な方法を習得しました。

まとめ

この実験では、リモートサーバー管理のために Secure Shell(SSH)を有効にして使用するための基本的な手順を学びました。まず、sudo apt-get update を使用してパッケージリポジトリインデックスを更新し、次に openssh-server パッケージをインストールして、リモート Linux サーバーを準備しました。このプロセスにより、システムは外部からの SSH 接続を安全に受け入れられるように設定され、sshd サービスが自動的に開始されました。

次に、SSH 認証用の専用ユーザーアカウント(sshuser)を既知のパスワード(password123)で作成しました。これは、デフォルトの labex ユーザーが sudo 権限を持ちながら SSH 接続用のパスワードを持っていないためです。ユーザーの作成を確認し、ホームディレクトリが適切に設定されていることを確認しました。

サーバーとユーザーアカウントの準備が整った後、クライアントが接続を開始するために不可欠な情報であるサーバーの IP アドレスを取得する方法を学びました。その後、SSH を使用する 2 つの主要な方法を実践しました。1 つはリモートサーバーで直接作業するための完全な対話型コマンドラインセッションの確立、もう 1 つはスクリプト作成や自動化タスクに非常に効率的なリモートでの単一の非対話型コマンドの実行です。