こんにちは。仁科(@nishina555)です。
VPSではレンタルサーバーと違いroot権限が利用できるため、様々なことをサーバー上で行うことができます。
一方で、強力な権限をもっているからこそセキュリティに気をつけておかないと悪意のあるユーザーにサーバーを利用される危険性があります。
もし、rootユーザーで、パスワード認証でサーバーにssh接続しているとしたらセキュリティ的に少し問題がある状態です。
今回はVPSを借りたらとりあえずやっておいたほうがいいセキリティの初期設定の手順について説明をしたいと思います。
なお、今回のVPSはConoHa、OSはUbuntu(16.04.4)を利用しています。
- 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接続できるようにする手順を説明します。
コマンドの意味などの詳細は以下の記事を参考にしてみてください。
まずは鍵のペアをローカル環境で作成をし、秘密鍵をサーバーに配置します。
$ 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を利用してファイアウォールの設定を進めていきます。
今回は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)のフォローもよろしくお願いします!