VPSを新規に借りた直後にすべきセキュリティ設定

2017年5月25日

Time4VPSでサーバーを開設した直後にすべき、セキュリティを高める初期設定についてまとめています。

なお、Time4VPSのVPSだけでなく、どこの会社のVPSでも同じ設定できます。

この設定を行わない場合、悪意ある第三者にVPSサーバーを操作される可能性が高くなるので、絶対にセキュリティを高める初期設定を行ってください。

SSH接続を行う

まずは、【Time4VPS】SSH接続の設定方法を参考にして、SSH接続を行ってください。

下のような画面が表示されたらOKです。

ルートパスワードの変更

現段階では、管理者権限を持つ「root」というユーザーが存在しており、そのユーザーのパスワード(ルートパスワードという)は「Time4VPS」がランダムに生成した文字列となっています。

ここではルートパスワードを変更しましょう。

まず、「passwd」と打ち込んでエンターキーを押してください。

[root@**** ~]# passwd

そして「New password:」のあとに新しいパスワード(ある程度長くて推測不可能なもの)を入力してください。

※入力するパスワードは表示されないので、キーボードを丁寧に押してください
※必ずパスワードはノートやメモ帳などにメモして失念しないようにしてください

もう一度パスワードの入力を求められるので、「Retype new password:」のあとに再度入力してください。

※これも入力するパスワードは表示されません

「all authentication tokens updated successfully.」と表示されればルートパスワードの変更は完了です。

一般ユーザーの追加

rootユーザーはとても強力な管理権限を持っているので、通常のVPS設定作業を行うユーザーとして適していません。

そのため、「一般ユーザー」を追加して、その一般ユーザーで設定作業を行うようにしましょう。

まず、「useradd ***」(「***」の部分はお好きなユーザー名にしてください)と打ち込んでエンターキーを押してください。

[root@**** ~]# useradd ***

次に、「passwd ***」(「***」の部分は上で指定したもの)と入力し、

[root@**** ~]# passwd ***

パスワードの入力を2回求められるので、そのユーザーのパスワードを入力してください。

「all authentication tokens updated successfully.」と表示されれば一般ユーザーの追加は完了です。

「sudo」の設定

「一般ユーザー」でVPSの設定を変更する場合、「root権限」が必要な場合が出てきます。

その都度「root」ユーザーでログインするのはセキュリティ上の問題があるので、一般ユーザーにコマンド毎に「root権限」を付与できる「sudo」の設定が必要です。

ここでは、「wheel」グループに一般ユーザを所属させた後、「wheel」グループに所属するユーザが「sudo」を利用できるように設定します。

まず、「usermod -G wheel ***」(「***」の部分は「sudo」を設定したいユーザー名)と打ち込んでエンターキーを押してください。

[root@**** ~]# usermod -G wheel ***

次に、「visudo」と入力し、エンターキーを押してください。

[root@**** ~]# visudo

すると、ばばばーと文字情報が出てくるので、マウスのコロコロで下に降りていき、

## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

の部分を探し、キーボードの「i」を押して編集モードにして「# 」の部分を削除して

## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL

のようにして、「エスケープキー」を押して編集モードを終了させてください。

そしてキーボードで「:wq」を入力してエンターキーを押してください。

「sudo」の利用方法

「sudo」を設定した一般ユーザーでVPSサーバーにSSH接続して、実行したいコマンドの前に「sudo 」をつけるだけです。

[root@**** ~]# sudo shutdown -h now

上では、「shutdown」コマンドの前に「sudo 」をつけています。

「公開鍵認証」にする

VPSサーバーにSSH接続をする際、「パスワード認証」の場合、パスワードが悪意ある第三者に漏れた場合、サーバーにログインされてしまいます。

これを避けるために、SSH接続の認証方式をパスワード認証から公開鍵認証に変更します。

現在、TeraTermを開いている場合は、いったん閉じて、再度起ち上げて「キャンセル」ボタンを押してください。

そして、「設定」→「SSH鍵生成」をクリックします。

下の画像のように設定して、「生成」をクリックします。

「鍵のパスフレーズ」に任意のパスワードを入力し、「パスフレーズの確認」に入力したパスワードと同じものを入力して、「公開鍵の保存」「秘密鍵の保存」をそれぞれクリックしてください(保存場所はお好きな場所でOKです)。

ちなみに、「公開鍵」「秘密鍵」は次の名前でPCに保存されます。

  • 公開鍵:id_rsa.pub
  • 秘密鍵:id_rsa

ここまで終わったら、いったんTeraTermを閉じてください。

「公開鍵認証」の設定

次に、再度TeraTermを起ち上げて、公開鍵認証を設定したい一般ユーザー(上で登録したもの)でVPSサーバーにSSH接続します。

そして、下の画像のようにTeraTermの黒い部分に「公開鍵」のファイルをドラック&ドロップします。

すると、「ファイル転送を行いますか?」と聞かれるので、次のように入力「~/」して「SCP」ボタンをクリックしてください。

そして、次のコマンドを順に行ってください。

[***@**** ~]$ mkdir .ssh

[***@**** ~]$ chmod 700 .ssh

[***@**** ~]$ cat id_rsa.pub > .ssh/authorized_keys

[***@**** ~]$ chmod 600 .ssh/authorized_keys

[***@**** ~]$ rm -f id_rsa.pub

次に現在の一般ユーザーからスーパーユーザー(rootユーザー)になるために「su –」と入力して、

[***@**** ~]$ su –

ルートパスワードを入力してください。

「@」より前が「root」に切り替われば、「root」に変更されています。

そして、次のように入力してください。

[root@**** ~]# vi /etc/ssh/sshd_config

すると、ばばばーと文字情報が出てくるので、キーボードの「i」を押して編集モードにして、次の部分を修正します。

#Port22

の部分を

Port1022

に変更します(これで、SSH接続の際のポートを1022にします)。

#PermitRootLogin yes

の部分を

PermitRootLogin no

に変更します(これで、rootユーザーでのログインを無効にします)。

#PasswordAuthentication yes

の部分を

PasswordAuthentication no

に変更します(これで、パスワード認証を無効にします)。

そして、「エスケープキー」を押して編集モードを終了させ「:wq」で保存してください。

これらの変更を有効にするために、次の操作を行います。

CentOS6の場合は以下。

[root@**** ~]# /etc/init.d/sshd restart

CentOS7の場合は以下。

[root@**** ~]# systemctl restart sshd.service

「公開鍵認証」でのログイン

TeraTermを再起動し、次のように「TCPポート」を「1022」にしてOKをクリックします。

「ユーザー名」には公開鍵認証を設定した一般ユーザー名を、「パスフレーズ」には公開鍵認証の設定の時に指定したパスフレーズを入力し、「RSD/DSA~鍵を使う」をクリックし、PC内に保存しておいた「秘密鍵(id_rsa)」を選択し、OKボタンを押してください。

「OK」をクリック後、ログインできれば「公開鍵認証でログイン」は完了です。

ファイヤーウォールの設定

現在、VPSサーバーではすべての通信が許可された状態です。不正なアクセスをシャットアウトするために「iptables(サーバーへの接続ルール)」を利用してファイヤーウォールを設定しましょう。

現在、一般ユーザーになっていると思いますので、ルート権限を持つrootユーザーに次のようにして変更してください。

[***@**** ~]$ su –

ルートパスワードを入力してください。

「@」より前が「root」に切り替われば、「root」に変更されています。

そして、次のように入力してください。

一気にやるときは以下をコピペしてエンターキーを押す。

iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP
iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m tcp –dport 1022 -j ACCEPT
iptables -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp –dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp –dport 10000 -j ACCEPT
iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
service iptables save

上の詳しい説明は①~⑦を参照してください。

①データを持たないパケットの接続を破棄する

[root@**** ~]# iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP

②SYNflood攻撃と思われる接続を破棄する

[root@**** ~]# iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP

③ステルススキャンと思われる接続を破棄する

[root@**** ~]# iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP

④localhostからの通信とpingを許可する

[root@**** ~]# iptables -A INPUT -i lo -j ACCEPT
[root@**** ~]# iptables -A INPUT -p icmp -j ACCEPT

⑤1022ポート(SSH)、80ポート(HTTP)、443ポート(HTTPS)、10000ポート(Webmin用)を許可する

[root@**** ~]# iptables -A INPUT -p tcp -m tcp –dport 1022 -j ACCEPT
[root@**** ~]# iptables -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
[root@**** ~]# iptables -A INPUT -p tcp -m tcp –dport 443 -j ACCEPT
[root@**** ~]# iptables -A INPUT -p tcp -m tcp –dport 10000 -j ACCEPT

なお、許可するポートはサーバーの用途によって違うため、下記の表を参考にして設定してください。

プロトコル ポート番号
HTTP 80
HTTP(SSL) 443
SMTP 25
SMTP(SSL) 465
POP3 110
POP3(SSL) 995
IMAP 143
IMAP(SSL) 993
SSH 22→1022(上で変更したため)

⑥確立済みの通信を許可する

[root@**** ~]# iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

⑦許可した通信以外のサーバーから受信するパケットを拒否し、サーバーから送信するパケットを許可する。

[root@**** ~]# iptables -P INPUT DROP
[root@**** ~]# iptables -P OUTPUT ACCEPT

iptablesの設定を設定ファイルに保存する

[root@**** ~]# service iptables save

なお、IPテーブルの編集にミス等が生じた場合、次のように直接編集を試みても良いと思います。

[root@**** ~]# vi /etc/sysconfig/iptables

システムのアップデート

VPSサーバーにあるソフトウェアが最新の状態でない場合、ソフトウェアの脆弱性を狙った攻撃を受ける可能性があるので、定期的にシステムのアップデートを行う必要があります。

ルート権限を持つrootユーザーで次のコマンドを行います。

[root@**** ~]# yum update -y

途中で[y/n]が表示された場合は、「y」を選択します。

「Complete!」と表示されれば、「システムのアップデート」は完了です。

ディレクトリ丸見え回避

各ディレクトリに「index.html」や「index.php」などのインデックスファイルがない場合、外部からディレクトリにアクセスされた場合、次のようにディレクトリ内が丸見えになります。

サーバー管理者としてこの丸見え状態は気持ちの良いものではないので、次のようにして回避しましょう。

vi /etc/httpd/conf/httpd.conf

そして、次のような記述を探して赤文字を追記してください。

<Directory “/var/www/html”>
#
# Possible values for the Options directive are “None”, “All”,
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that “MultiViews” must be named *explicitly* — “Options All”
# doesn’t give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be “All”, “None”, or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None

#
# Controls who can get stuff from this server.
#
Require all granted
Options Includes FollowSymLinks
</Directory>

これでディレクトリ内のファイル構成等を外部者から見られずに済みます。

以上で、Time4VPSでレンタルしたVPSのセキュリティを高める初期設定は終了です。