リモートサーバーを管理する際、秘密鍵を用いるSSHログインは必須の設定となってきています。
VPS等を利用してサーバー管理を行う場合、まず取り掛かる作業が今回紹介するSSHログイン設定となるでしょう。
さくらのVPS  サーバーなどでは、OSインストールをインストールする際に、利用する秘密鍵を指定することで、SSHログインの設定も同時に行ってくれるサービス等もありますが、リリースが新しいバージョンのOSインストールでは、自分で設定する必要があります。
サーバーなどでは、OSインストールをインストールする際に、利用する秘密鍵を指定することで、SSHログインの設定も同時に行ってくれるサービス等もありますが、リリースが新しいバージョンのOSインストールでは、自分で設定する必要があります。
この記事では、UbuntuのSSHログイン設定時に必要となるターミナル作業を順追って解説します。
以下の開発環境で動作を確認しています。
・さくらVPSサーバー:メモリ 512M, ストレージ:SSD 25GB, CPU:1コア
・OS:Ubuntu 20.04 amd64
macで秘密鍵と公開鍵の生成
SSHログインには、ローカル側で利用する秘密鍵と、リモートサーバー側に設置する公開鍵の準備が必要です。
ローカルmacのターミナルでコマンド作業を行います。
まずは、秘密鍵、公開鍵を生成するディレクトリを作成します。
| 1 2 3 | $ mkdir ~/.ssh | 
上記のコマンドで作成したディレクトリに移動します。
| 1 2 3 | $ cd ~/.ssh | 
下記のコマンドで鍵を生成します。
| 1 2 3 | $ ssh-keygen -t rsa | 
サーバーごとに秘密、公開鍵を使い分けるなど複数のペアを作る際、名前を指定して作成する場合は、-f オプションをつけて実行します。
| 1 2 3 | ssh-keygen -t rsa -f <id_rsa_name> | 
下記のメッセージが表示されるので、ENTER
| 1 2 3 4 | Generating public/private rsa key pair. Enter file in which to save the key (/Users/username/.ssh/id_rsa): | 
次にパスフレーズと、確認用のパスフレーズを聞かれるので、必要な場合は入力。(今回はどちらもENTERでパスフレーズ無しの設定とします)
| 1 2 3 4 | Enter passphrase (empty for no passphrase): Enter same passphrase again: | 
これで、秘密鍵と公開鍵が生成されたので、lsコマンドで確認します。
| 1 2 3 | $ ls | 
下記のように確認できればOKです。
| 1 2 3 | id_rsa    id_rsa.pub | 
id_rsa がローカル側で利用する秘密鍵
id_rsa.pub がリモート側で利用する公開鍵です。
これで、鍵作成の作業は終了です。
リモートサーバー[Ubuntu]のセキュリティー設定
秘密鍵、公開鍵の準備ができたので、リモートサーバー[Ubuntu]の設定を行います。
ここでは主に以下の3つ作業を中心に行います。
・秘密鍵を用いたログインの設定
・パスワードを用いたログインの禁止
rootユーザーでのログイン禁止
すでに独自ドメインを取得しており、すでに紐付け作業が終了している場合は、xxx.xxx.xxx.xxx の場所をexamle.com のようにドメインにする事も可能です。
| 1 2 3 | $ ssh username@xxx.xxx.xxx.xxx | 
下記の内容が表示される場合は対応します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxx. Please contact your system administrator. Add correct host key in /Users/user/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /Users/user/.ssh/known_hosts:3 ECDSA host key for xxx.xxx.xxx.xxx has changed and you have requested strict checking. Host key verification failed. | 
- ローカルの秘密鍵を保管しているディレクトリUsers/user/.ssh 内に移動(.sshディレクトリが表示されない場合は、shift + command + . で表示します。)
- known_hosts のファイルを削除
- もう一度接続$ ssh username@xxx.xxx.xxx.xxx
| 1 2 3 4 5 | The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])? | 
と表示が出た際(2回目以降のログインでは表示されなくなります)は、yes を入力してENTER
その後、パスワードを入力してENTER
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-52-generic x86_64)  * Documentation:  https://help.ubuntu.com  * Management:     https://landscape.canonical.com  * Support:        https://ubuntu.com/advantage The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. | 
上記のように表示されれば、ログイン成功です。
新しい管理ユーザーの追加
各サーバー会社の設定でroot, ubuntu などデフォルトのユーザー名が指定されていますので、新たなユーザーを作成します。
| 1 2 3 | $ sudo adduser NEWUSER | 
以下のような表示が出るので、まずはパスワードを設定します。
| 1 2 3 4 5 6 7 8 9 | Adding user `NEWUSER' ... Adding new group `NEWUSER' (1001) ... Adding new user `NEWUSER' (1001) with group `nakajima' ... Creating home directory `/home/NEWUSER' ... Copying files from `/etc/skel' ... New password:  Retype new password: | 
パスワードの設定が終わると以下のような表示が出ます。
途中の設定は指定せずENTERで良いでしょう。
| 1 2 3 4 5 6 7 8 9 10 11 | passwd: password updated successfully Changing the user information for NEWUSER 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] | 
もしくは
| 1 2 3 | $ sudo gpasswd -a NEWUSER sudo | 
登録したuserに管理者権限付与
| 1 2 3 | $ sudo usermod -aG sudo NEWUSER | 
| 1 2 3 | $ sudo cp -arp /home/ubuntu/.ssh /home/NEWUSER | 
| 1 2 3 | $ sudo chown -R NEWUSER /home/NEWUSER/.ssh | 
EC2を利用の場合は、これまでの新ユーザーの設定を行い、SSHでログインしようとすると、以下のようなメッセージが出ます。
| 1 2 3 | NEWUSER@ec2-3-13-8-82.us-east-2.compute.amazonaws.com: Permission denied (publickey). | 
デフォルトのユーザーで再度、ログインし以下のコマンドを実行し権限者ファイルを変更します。
| 1 2 3 | $ sudo visudo -f /etc/sudoers.d/90-cloud-init-users | 
| 1 2 3 4 5 | # User rules for ec2-user # ec2-user ALL=(ALL) NOPASSWD:ALL NEWUSER ALL=(ALL) NOPASSWD:ALL | 
ここまでの作業が完了したら、デフォルトユーザーをログアウトします。
新たに作成したユーザーでログインし、root権限が利用できるか確認します。
| 1 2 3 | $ sudo su | 
vimを使うためにアップデート
| 1 2 3 | $ sudo apt update | 
以下のように表示が変わればOKです。
$ →#
新ユーザーの権限が確認できたので、デフォルトユーザー(ubuntuの場合)を削除します。
| 1 2 3 | sudo userdel -r ubuntu | 
※-rをオプションとしてつける事でhomeディレクトリも一緒に削除されます。
vimのインストール
| 1 2 3 | $ sudo apt install vim | 
Rootユーザーのログインを禁止するために、sshd_config の編集
| 1 2 3 | $ sudo vim /etc/ssh/sshd_config | 
34行目あたりの下記のコードを変更(# を削除する事をお忘れなく)
| 1 2 3 | #PermitRootLogin prohibit-password → PermitRootLogin no | 
ファイルの更新(システムリロード)
| 1 2 3 | $ sudo systemctl reload sshd | 
| 1 2 3 | $ sudo ufw allow ssh | 
| 1 2 3 | $ sudo ufw allow 80 | 
| 1 2 3 | $ sudo ufw allow 443 | 
| 1 2 3 | $ sudo ufw enable | 
| 1 2 3 | $ sudo ufw status | 
| 1 2 3 4 5 6 7 8 9 10 11 12 | Status: active To                         Action      From --                         ------      ---- 22/tcp                     ALLOW       Anywhere                   80                         ALLOW       Anywhere                   443                        ALLOW       Anywhere                   22/tcp (v6)                ALLOW       Anywhere (v6)              80 (v6)                    ALLOW       Anywhere (v6)              443 (v6)                   ALLOW       Anywhere (v6) | 
秘密鍵でにログイン設定
| 1 2 3 | $ cd ~ | 
.sshディレクトリ作成
| 1 2 3 | $ mkdir .ssh | 
リモートサーバーの接続解除
| 1 2 3 | $ exit | 
ローカル macで作業
ローカル(mac)から秘密鍵(id_rsa.pub)の転送
| 1 2 3 | $ scp ~/.ssh/id_rsa.pub username@xxx.xxx.xxx.xxx:~/.ssh/id_rsa.pub | 
もう一度リモートサーバーへログイン
| 1 2 3 | $ ssh username@xxx.xxx.xxx.xxx | 
秘密鍵の追記
| 1 2 3 | $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys | 
.sshディレクトリへ移動
| 1 2 3 | $ cd .ssh | 
Id_rsa.pub鍵の削除
| 1 2 3 | $ sudo rm id_rsa.pub | 
| 1 2 3 | $ chmod 600 authorized_keys | 
リモートサーバーの接続解除
| 1 2 3 | $ exit | 
| 1 2 3 | $ ssh -i ~/.ssh/id_rsa username@xxx.xxx.xxx.xxx | 
ログインが確認できたら、そのまま、リモートサーバーでの作業
パスワードを用いたログインの禁止
| 1 2 3 | $ sudo vim /etc/ssh/sshd_config | 
| 1 2 3 | #PasswordAuthentication yes  => PasswordAuthentication no | 
以上で、秘密鍵を用いたSSHログイン設定の完了です。