【チュートリアル】VPSを借りたらやるべき最低限のセキュリティ初期設定

インフラ

こんにちは。仁科(@nishina555)です。

VPSではレンタルサーバーと違いroot権限が利用できるため、様々なことをサーバー上で行うことができます。

一方で、強力な権限をもっているからこそセキュリティに気をつけておかないと悪意のあるユーザーにサーバーを利用される危険性があります。


もし、rootユーザーで、パスワード認証でサーバーにssh接続しているとしたらセキュリティ的に少し問題がある状態です。

今回はVPSを借りたらとりあえずやっておいたほうがいいセキリティの初期設定の手順について説明をしたいと思います。

なお、今回のVPSはConoHa、OSはUbuntu(16.04.4)を利用しています。

もしOSがCentOSの場合は、後述するファイアウォールの設定方法がUbuntuとは異なりますのでその点だけ気をつけてください。
今回のゴール
  • rootユーザーでssh接続できないようにする
  • sudo権限をもつ一般ユーザーを作成する
  • 公開鍵認証でssh接続できるようにする
  • 任意のポートをsshで利用するように変更する
  • ファイアウォールを設定する

rootユーザーでのssh接続を禁止する

まずセキュリティで一番問題になるのがrootユーザーで直接操作をしている点です。
rootユーザーで直接サーバーにssh接続できる状態はセキュリティ的によくありません。

ですので、rootユーザーで操作をしている状態を変更していきます。

sudo権限をもつユーザーを作成する

rootユーザーで操作をする代わりに、root権限を持つ一般ユーザーで操作をするように変更していきます。

まずはuseraddで一般ユーザーを作成し、passwdでユーザーのパスワードの設定を行なっていきます。
なお、-mオプションはユーザーのホームディレクトリを作るためのオプションです。

ここでは例としてisuconというユーザーを作成します。

[root]
$ useradd -m isucon
$ passwd isucon

idコマンドでユーザー情報を確認できます。

[root]
$ id isucon
uid=1000(isucon) gid=1000(isucon) groups=1000(isucon)

次に先ほど作成した一般ユーザーにroot権限を与えます。
usermodは-aオプションがないと追加ではなく上書きになるので注意が必要になります。

[root]
$ usermod -aG sudo isucon
もしくは
$ gpasswd -a isucon sudo

再度ユーザー情報を確認するとsudo権限が付与されたことがわかります。

[root]
$ id isucon
uid=1000(isucon) gid=1000(isucon) groups=1000(isucon),27(sudo)

sudo権限を持つユーザーが作成できたので、以下のコマンドでisuconユーザーに変更し、以降の設定手順はisuconユーザーで操作していきます。

[root]
$ su - isucon

一般ユーザーでパスワード認証のssh接続ができるか確認する

ssh接続の設定を変更する前に、まずは以下のコマンドで一般ユーザーでサーバーにssh接続できるか確認しておきましょう。

$ ssh -l [ユーザー名] [IPアドレス]

rootユーザーでssh接続できないように設定ファイルを変更する

一般ユーザーでssh接続できることが確認できたため、rootユーザーでssh接続できないように設定を変更していきます。

sshd_configファイルのPermitRootLoginをnoにします。

$ sudo vim /etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin no

以下のコマンドでリスタートすることで設定が反映されます。

$ sudo systemctl restart sshd
もしくは
$ sudo service sshd restart

以下のコマンドで、rootユーザーでssh接続できなければOKです。

$ ssh -l root [IPアドレス]

パスワード認証でのssh接続を禁止する

ここまででrootユーザーでssh接続できないようにしました。

パスワード認証によるssh接続もパスワードがわかってしまうと誰でもサーバーにログインできるようになってしまうためセキュリティ的にはよくありません。

そこで次に、ssh接続の方式をパスワード認証から公開鍵認証に変更する設定をします。

公開鍵認証でssh接続する

ここでは例としてconoha-isucon-keyという秘密鍵とconoha-isucon-key.pubという公開鍵のペアを作成し、conoha-isuconと名付けたVPSに公開鍵認証でssh接続できるようにする手順を説明します。

コマンドの意味などの詳細は以下の記事を参考にしてみてください。

リモートサーバーに公開鍵認証でssh接続するための手順

まずは鍵のペアをローカル環境で作成をし、秘密鍵をサーバーに配置します。

$ cd ~/.ssh
$ ssh-keygen -t rsa -f conoha-isucon
$ chmod 600 conoha-isucon
$ ssh-copy-id -i ~/.ssh/conoha-isucon.pub isucon@[IPアドレス]

次にsshの設定ファイルを変更します

$ vim ~/.ssh/config
Host conoha-isucon
  Hostname [IPアドレス]
  User isucon
  IdentityFile ~/.ssh/conoha-isucon
  Port 22

上記の設定をすることで、以下コマンドでisconユーザーとしてVPSにログインできるようになります。

$ ssh conoha-isucon

パスワード認証を許可しないようにssh接続の設定を変更する

次にパスワード認証によるssh接続を許可しないように設定を変更します。
設定方法はrootユーザーでssh接続できないようにした時と同様です。

$ sudo vim /etc/ssh/sshd_config
# PasswordAuthentication yes
PasswordAuthentication no

リスタートして設定を反映させます

$ sudo systemctl restart sshd

以下のコマンド(認証方法にパスワード認証を指定したssh接続)でPermission deniedといわれてサーバーにログインできなければOKです。

$ ssh -l [ユーザー名] [IPアドレス] -o PreferredAuthentications=password -o PubkeyAuthentication=no

sshで利用するポート番号を変更する

sshで接続で利用するポート番号は22番と決まっており、一般的によく知られているポート番号であるため攻撃の対象とされやすいです。
そのため、sshで利用するポート番号を任意のものに変更することでセキュリティを高めることができます。

VPSのssh_configの変更

ssh接続で利用するポート番号を任意の番号に変更します。
ポート番号は、ウェルノーンポートである『0から1023』登録済みポート(レジスタードポート)である『1024から49151』以外の、49152番から65535番の間にするようにしましょう。

まずはVPS上の設定ファイルを変更します。

$ sudo vim /etc/ssh/sshd_config
# Port 22
Port [任意の番号]

リスタートして設定を反映させます

$ sudo systemctl restart sshd

ローカルのconfigの変更

次にローカル環境のssh接続の設定を変更します。Port番号を22から先ほど設定した任意の番号に変更します。

$ vim ~/.ssh/config
Host conoha-isucon
  Hostname [IPアドレス]
  User isucon
  IdentityFile ~/.ssh/conoha-isucon
# Port 22
  Port [ssh_configで設定したポート番号]

これでssh接続で利用するポート番号を変更することができました。
変更後もssh接続ができていれば設定はOKです。

ファイアウォールの設定

次にファイアウォールの設定をします。
ファイアウォールとはネットワーク通信の拒否・許可の設定をする仕組みです。

ファイアウォールを適切に設定しておくことで悪意のあるユーザの通信からサーバーを防ぐことができます。

ファイアウォールの設定はiptablesというファイルに記載されています。

Ubuntuではufw(Uncomplicated FireWall)というiptablesの設定を簡単にできるツールが用意されているので、ufwを利用してファイアウォールの設定を進めていきます。

なお、CentOSの場合はfirewalldというツールを利用してファイアウォールの設定行うため、別記事を参考にして設定をしてください。

今回はWebサーバーとして運用する前提で、ssh, http, ftp, httpsの接続のみを許可するように変更します。

まずはufwの設定状態を確認します。
status verboseでロギング設定などの詳細情報を含めた状態を確認することができます。

inactiveという結果からufwは無効であることがわかります。

$ sudo ufw status
もしくは
$ sudo ufw status verbose
Status: inactive

まずはufwを有効化します。(無効にする場合はdisableです)

$ sudo ufw enable

次にufwの設定を行なっていきます。

全てのポートを遮断した後、必要なプロトコル・ポートだけ接続を許可するように設定していきます。

まずはWebサーバーに必要なプロトコルの許可をしていきます。

# アクセスはデフォルトで拒否設定にする
$ sudo ufw default deny

# 必要なプロトコルの通信のみ許可する
$ sudo ufw allow https/tcp
$ sudo ufw allow http/tcp
$ sudo ufw allow ftp

次にsshの許可をします。先ほどと同様にufw allow sshで設定が可能ですが、普通に設定をするとsshで利用されるポートである22番を許可することになります。

sshで利用しているポート番号を変更しているため、ポート番号を直接指定して許可するようにします。

$ sudo ufw allow [sshで利用するように設定したポート番号]

ステータスを再度確認してみます。

$ sudo ufw status verbose

結果は以下のようになっているはずです。

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
443/tcp                    ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
21/tcp                     ALLOW IN    Anywhere
[sshで利用するポート]          ALLOW IN    Anywhere
443/tcp (v6)               ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
21/tcp (v6)                ALLOW IN    Anywhere (v6)
[sshで利用するポート] (v6)     ALLOW IN    Anywhere (v6)

なお、設定したルールは以下のファイルに書かれています。

$ /etc/ufw/user.rules

以下のコマンドでファイアウォールを再読み込みすることで設定が反映されます。

$ sudo ufw reload
もしくは
$ sudo /etc/init.d/ufw restart

まとめ

これでVPSを借りたらまずは行なっておきたいセキュリティの設定手順の説明を終わります。おつかれさまでした!

いろいろと設定をしましたが、なにもセキュリティ対策を行なっていない状態のサーバーをネット上に公開すると悪用される対象になってしまいます。

今回の設定は何度も設定をしなおすものでもないので、ConoHaをはじめとするVPSを借りたらしっかりとセキュリティ対策をしておきましょう。

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!