前回記事「CentOS8 + Apache + Nginx + MariaDBでVPSサーバーに環境構築をする(#1:サーバーの契約・OSのインストール)」に引き続き今回もVPSサーバーの環境構築についてまとめていきます。前回はOSをインストールしたところまででしたのでここからは正しく使えるように色々な設定を行なっていく流れになります。そのままにしておくと重大なセキュリティリスクがあるので注意しましょう。
1. 事前準備
まずはその前にコンソールからSSHでログインできるか確認しておきます。前回はサーバーの管理画面内にあるコンソールでしたが、ここではSSHクライアントのアプリケーションを使います。下記コマンドを入力しrootユーザーでサーバーにログインします。
$ ssh root@[HOSTNAME]
初回は下記のようなメッセージが表示されますので、そのまま「yes」と入力します。するとさくらのVPSサーバーにログインできるようになります。
The authenticity of host '***.**.***.*** (***.**.***.***)' can't be established. ECDSA key fingerprint is SHA256:*****************************************************. Are you sure you want to continue connecting (yes/no)? yes SAKURA Internet [Virtual Private Server SERVICE] Last login: Sun Jul 5 20:11:24 2020 [root@tk*-****-***** ~]#
ログインしたら下記のコマンドで、念のためOSにインストールされているプログラムを最新版に更新しておきます。
# dnf update
「dnf」コマンドはCentOS8から使えるコマンドで、以前に使われていた「yum」コマンドに代わるものとなります。実行するとバージョンが古いものは一括で更新されていきます。
Upgraded: .................... Installed: .................... Complete!
また、CentOSではデフォルトのエディタが「Vi」になります。ここでもし必要であれば普段使っているエディタをインストールしておきます。今回は「Vim」を新たにインストールしてみます。下記コマンドを入力しインストールを進めていきます。
# dnf -y install vim-enhanced
インストールができれば、コマンドのエイリアスを設定しておきます。設定ファイルの場所まで移動し、エディタで開きます。
# cd /etc # vi profile
設定ファイルの最終行に下記を追加し、保存をしておきます。
【/etc/profile】
.................... // 最終行に追記 alias vi='vim'
追加した設定を反映させるために下記のコマンドを実行します。
# source profile
続けてOSのタイムゾーンを設定しておきます。要件によっては必須でないかもしれませんが設定しておくと良いでしょう。
# timedatectl set-timezone Asia/Tokyo
これらの作業は行わなくても問題ない場合もありますが、環境を整えておく上では重要なので是非済ませておきましょう。
2. 一般ユーザーの作成
現在はrootユーザーでしかログインできない状況のため、ログイン用の一般ユーザーも作成しておきます。基本的に一般ユーザーでログインすることが多いと思います(後述するセキュリティ上の理由より)まずは下記コマンドでユーザーを追加します。任意のユーザー名を指定します。
# adduser [USERNAME]
続けて、作成したユーザーに対応するパスワードも設定しておきます。確認のため2回入力することになります。完了するとメッセージが表示されます。
# passwd [USERNAME] New password: [PASSWORD] Retype new password: [PASSWORD] passwd: all authentication tokens updated successfully.
作成した一般ユーザーを使って、SSHでサーバーにログインできるか試してみます。パスワードを入力しログインができたら、rootユーザーでは「#」だったのが「$」に変わっているのが確認できます。
$ ssh [USERNAME]@[HOSTNAME] SAKURA Internet [Virtual Private Server SERVICE] [USERNAME@tk*-****-***** ~]$
一般ユーザーでログインした後は、下記のコマンドを入力後にrootユーザーのパスワードを入れるとrootユーザーに切り替えることができます。
$ su - Password: [PASSWORD] Last login: Sun Jul 5 20:27:39 JST 2020 from 60.138.246.21 on pts/0 [root@tk*-****-***** ~]#
これで、管理者の権限が必要となるコマンドも実行できるようになります。
3. rootユーザーのログイン禁止
先ほど一般ユーザーを作成しましたので、ログインできるユーザーはrootユーザーと合わせて2つとなりますが、rootユーザーでログインできるのはセキュリティ上問題があるので、その対策としてrootユーザーのログインを禁止しておくのが一般的です。まずはrootユーザーでサーバーにログインします。
$ ssh root@[HOSTNAME]
そしてSSHの設定ファイルの場所まで移動し、設定ファイルのバックアップを取っておきます。続けてエディタでSSHの設定ファイルを開きます。
# cd /etc/ssh # cp sshd_config sshd_config.copy # vim sshd_config
SSHの設定ファイルを下記のように編集し、保存します。
【/etc/ssh/sshd_config】
// 変更前 # Authentication: ....... PermitRootLogin yes ↓ // 変更後 # Authentication: ....... PermitRootLogin no
設定ファイルを保存したらsshdを再起動し、設定を反映させます。
# systemctl restart sshd
これでrootユーザーでのログインができなくなりました。念のためrootユーザーでのパスワードログインを試してみると、このようにエラーが返ってきます。
$ ssh root@[HOSTNAME] root@[HOSTNAME]'s password: Permission denied, please try again.
4. SSHのポート番号変更
続いてセキュリティ対策としてSSHのポート番号を変更していきます。SSHのポート番号はデフォルトでは22番が当てられているため、ここを狙われることがあります。そのため独自のポート番号に変更しておくことが有効な対策となります。先ほどと同じくSSHの設定ファイルの場所まで移動し、エディタで開きます。
# cd /etc/ssh # vim sshd_config
SSHの設定ファイルを下記のように編集し、保存します。ここでは新しいSSHのポート番号を22222としています。
【/etc/ssh/sshd_config】
// 変更前 #Port 22 ↓ // 変更後(空いている任意のポート番号を指定) Port 22222
編集後は念のため編集前の内容と差分をチェックします。これまでの変更した内容が差分として表示されていればOKです。
# diff sshd_config.copy sshd_config 17c17 < #Port 22 --- > Port 22222 46c46 < PermitRootLogin yes --- > PermitRootLogin no
続いて設定ファイルの記述エラーが無いかどうかもチェックします。下記のコマンドを入力するだけでOKです。問題がある場合にはエラーが返ってきます。
# sshd -t
問題がなければsshdを再起動させて変更を反映させます。
# systemctl restart sshd
これでさらにサーバーへのセキュリティが強化されましたが、この後も引き続き対策を行なっていきます。
5. SSHのFirewall設定
SSHのポート番号が変更されたことに伴い、外部からのアクセスを遮断する「Firewall」を解放します。これにより、新しいポート番号でサーバーへアクセスすることが可能になります。下記のコマンドでFirewallのポート番号を解放します。
# firewall-cmd --add-port=22222/tcp --zone=public success
もし「FirewallD is not running」とエラーが表示された場合には下記のコマンドでfirewalldを起動させる必要があります。
# systemctl start firewalld.service
新しいSSHのポート番号が解放されているかを下記のコマンドで確認します。リスト形式で表示されますので、該当する表記があるかをチェックします。
# firewall-cmd --list-all .............. ports: 22222/tcp ..............
ここまでできたらポート番号の解放を恒久的に設定し直します。下記のコマンドを実行するだけでOKです。
# firewall-cmd --add-port=56789/tcp --zone=public --permanent success
firewalldを再読み込みして変更した内容を反映させていきます。
# firewall-cmd --reload success
最後に「SELinux」の設定を行なっていきます。最初に「policycoreutils-python-utils」というもののインストールが必要になります。後は続けて下記のコマンドを実行していきます。
# dnf install -y policycoreutils-python-utils # semanage port --add --type ssh_port_t --proto tcp 22222 # semanage port --list | grep ssh ssh_port_t tcp 22222, 22
同じくsshdを再起動させて変更を反映させます。
# systemctl restart sshd
これで新しいポート番号が有効になりました。試しにポート番号を指定してSSHでログインできるか確認してみます。
$ ssh -p 22222 [USERNAME]@[HOSTNAME]
6. 公開鍵認証の設定
rootユーザーログインの禁止、SSHのポート番号変更とセキュリティ対策を行なってきましたが、ログイン方法を「公開鍵認証」にすることでより強固なセキュリティ対策とすることができます。これはあらかじめ用意されたキーペアが存在しないとログインできないというものになります。
まずはクライアント側のPC内で、ルートディレクトリ直下に「.ssh」フォルダを作成(すでに存在する場合には不要)し、パーミッションを下記の通り変更しておきます。
$ mkdir .ssh $ chmod 700 .ssh
その後、念のためパーミッションが正しく変更できているかをチェックします。
$ ls -a -l drwx------ (中略) .ssh
sshフォルダに移動し、下記コマンドで秘密鍵と公開鍵のキーペアを作成します。この時に鍵の名前を省略するとデフォルトでは「id_rsa」「id_rsa.pub」という名前で作成されます。
$ cd ~/.ssh/ $ ssh-keygen -f [KEYNAME] -t rsa -b 2048
途中でパスワードの設定を求められますので、設定する場合には忘れずに控えておきます。そのままEnterを叩くとパスワード無しで設定することができます。
Enter passphrase (empty for no passphrase): [PASSWORD] Enter same passphrase again: [PASSWORD] Your identification has been saved in [KEYNAME] Your public key has been saved in [KEYNAME].pub.
キーペアができたら、下記のコマンドで公開鍵を表示させてその中身を全てコピーしておきます。これは後で必要となるので控えておきます。
$ cat [KEYNAME].pub
続けてサーバー側の作業に移ります。まずは一般ユーザーでログインします。その後ユーザーの「home」ディレクトリ直下に「.ssh」フォルダを作成し、クライアント側と同じ要領でパーミッションを変更しておきます。
$ mkdir .ssh $ chmod 700 .ssh
作成した、.sshフォルダの中に移動し、新たに「authorized_keys」という名前でファイルを作成します。その中に先ほどクライアント側で作成した公開鍵のコピーした中身を全てペーストし保存しておきます。
$ cd ~/.ssh $ vim authorized_keys
下記のコマンドで、authorized_keysファイルのパーミッションを変更します。
$ chmod 600 authorized_keys
ここまでできれば、サーバーにログインした状態のままで新たにコンソールを開き、クライアント側から公開鍵認証を使ったログインができるか確認してみます。
$ ssh -i .ssh/[KEYNAME] -p 22222 [USERNAME]@[HOSTNAME]
問題なくログインができれば、rootユーザーに切り替えてパスワード認証でのログインができないようにしておきます。
$ su - # cd /etc/ssh # vim sshd_config
SSHの設定ファイルを下記のように変更して保存します。
【/etc/ssh/sshd_config】
// 変更前 PasswordAuthentication yes ↓ // 変更後 PasswordAuthentication no
同じくsshdを再起動させて変更を反映させます。
# systemctl restart sshd
先ほどと同じくサーバーにログインした状態のままで新たにコンソールを開き、クライアント側からパスワード認証でのログインができなくなっているかをチェックします。
$ ssh -p 22222 [USERNAME]@[HOSTNAME] [USERNAME]@[HOSTNAME]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
正しく設定できていればエラーは表示されます。これでサーバーへのログインには公開鍵認証が必要となりましたので、セキュリティ的にも安心ですね。
今回はOSインストール後からの、主にセキュリティ対策を目的としたSSHなどの設定を行いました。ここまでセキュリティ対策を行なっているとひとまずは大丈夫なのではないでしょうか。面倒ですがしっかりと済ましておきたいですね。引き続きウェブサーバーなどのミドルウェア・アプリケーションをインストールしていきます。