はじめに
この実験では、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
一部の LabEx 環境では、インストール中に Ubuntu がサービス再起動のダイアログを表示することがあります。その場合は、vncserver を再起動しないでください。再起動するとブラウザデスクトップとの接続が切断され、画面がグレーアウトする可能性があります。代わりに以下の安全なオプションのいずれかを使用してください。
Tabキーを押して<Cancel>を選択し、Enter キーを押します。- または、
Spaceキーを押してvncserverの選択を解除し、<Ok>を選択します。
ブラウザデスクトップがグレーアウトした場合は、LabEx ページを更新してセッションに再接続し、実験を続行してください。
コマンドが完了すると、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
これで、ホームディレクトリが /home/sshuser で、bash シェルを使用する sshuser アカウントが作成されたことが確認できました。正確な 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 クライアントの両方として機能する単一の仮想マシン上で作業しています。自分のマシンで実行されている SSH サーバーに接続するには、localhost とも呼ばれる特別な IP アドレス 127.0.0.1 を使用できます。このアドレスは常にローカルマシン自身を指します。
それでも、マシンのネットワークに面した 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 アドレスが表示されます。プライマリネットワークインターフェースの IP (172.16.50.114) と Docker ブリッジの IP (172.17.0.1) です。
これで、マシンの IP アドレスを見つける方法がわかりました。次のステップでは、localhost アドレス (127.0.0.1) を使用して、同じマシン上で実行されている SSH サーバーに接続します。
リモートサーバーへの対話型 SSH セッションの確立
このステップでは、ssh クライアントを使用して、設定した OpenSSH サーバーとの対話型セッションを確立します。対話型セッションでは、リモートサーバー上でコマンドラインプロンプトが提供され、物理的にログインしているかのようにコマンドを実行できます。
接続するには、ssh <user>@<hostname_or_ip> の形式で ssh コマンドの後にユーザー名とサーバーのアドレスを指定します。自分のマシン(localhost)で実行されているサーバーに sshuser として接続するため、IP アドレス 127.0.0.1 を使用します。
ターミナルを開き、次のコマンドを実行します。
ssh sshuser@127.0.0.1
新しい SSH サーバーに初めて接続するとき、SSH クライアントはサーバーの公開鍵のフィンガープリントを表示し、その真正性を確認するよう求めます。これは「中間者攻撃(man-in-the-middle attack)」を防ぐためのセキュリティ対策です。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 認証用の既知のパスワード (password123) を持つ専用のユーザーアカウント (sshuser) を作成しました。デフォルトの labex ユーザーには sudo 権限がありますが、SSH 接続用のパスワードがないためです。ユーザー作成を検証し、ホームディレクトリが適切に確立されていることを確認しました。
サーバーとユーザーアカウントの準備が整った後、クライアントが接続を開始するために不可欠な情報であるサーバーの IP アドレスを取得する方法を学びました。その後、SSH を使用する2つの主要な方法を練習しました。1つはリモートサーバーで直接作業するための完全な対話型コマンドラインセッションの確立、もう1つはスクリプトや自動化タスクに非常に効率的な、リモートでの単一の非対話型コマンドの実行です。



