リモートサーバーを管理する際、秘密鍵を用いるSSHログインは必須の設定となってきています。
VPS等を利用してサーバー管理を行う場合、まず取り掛かる作業が今回紹介するSSHログイン設定となるでしょう。
さくらのVPS サーバーなどでは、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ログイン設定の完了です。