VPSのセキュリティ設定!契約したらすぐにやるべきこと

この記事は、シリーズ「VPSでdiscord.py Bot開発&運営」の一部です。( 4 / 5 )

この記事の内容

VPSを借りたあと、使用をはじめるまえに行うべき設定について説明します。
これだけやれば絶対安心というわけではありませんが、基本的なポイントはおさえてあります。
VPSをレンタルする手順や、レンタルしたVPSにSSH接続する手順については連載一覧にある記事で紹介していますので、そちらもあわせてご覧ください。

手順がおおくて面倒くさい!

気持ちはわかりますが、省くとあとあと不安な思いをすることになります。
コマンドを叩けば終わるようになっていますので、なんとか頑張って挑戦してみてください。

事前に知っておいてほしいこと

Vimについて

本チュートリアルでは、テキストファイルの編集にVimを使います。
慣れないうちはどう触っていいかわからず難しいかもしれませんが、慣れると非常に便利なので、頑張って使ってみましょう。

Vimには、ノーマルモードインサートモードがあります。
インサートモードは、文字を入力したり削除したり、編集作業をするモードです。
ノーマルモードは、保存したり置換したり、編集以外の作業をするモードです。
Vimを起動すると、ノーマルモードで立ち上がります。
ここからインサートモードに入るには、「Insertのi」を入力します。
ノーマルモードに戻るには、「Esc」キーを入力します。
ノーマルモードでは、:w[Enter]で保存、:q[Enter]で終了することが出来ます。

#$について

説明の中で、下記のような表記がでてきます。

# ls
または
$ ls

この#$は、プロンプトを示すものであり、操作するときに入力するものではありません。
実際のプロンプトは、例えば以下のようなものです。見覚えがありますよね。

root@v0-0-0-0:~#

一般的に、#はrootログイン時のプロンプト、$はそれ以外のプロンプトとして使われていることが多いです。

事前準備

事前に決めておくこと

作業ユーザの名前とパスワード

すでにVPSにはrootという名前のユーザが存在しますが、このrootユーザは、サーバにおけるすべての権限を持っています。
そのため、ふだんの作業に使うには不適切ですので、手順の中で作業用ユーザを追加します。
作業用ユーザの名前を決めておきましょう。userでもOKです。

SSH ポート

SSH通信は、通常ポート22で行います。このため、ポート22は攻撃の標的となります。
ポートを変更するだけで攻撃が激減しますので、手順の中で変更します。
49152~65535のあいだで、任意の数字をひとつ選んでください。

事前に調べておくこと

ネットワークインターフェース名

VPSが外部との通信をしているネットワークインターフェース名を調べておきましょう。これはファイアウォール設定で必要になります。
たとえば、eth0や、venet0等という名前であることが多いです。調べ方は以下のとおりです。

  • ifconfigコマンドを実行する。
  • inetアドレス=自分が接続しているVPSのアドレス、であるものを見つける。

パッケージのアップデート

実際に設定を行っていきます。
SSHでrootログインしている状態で次に進んで下さい。

セットアップしたOSは付属ソフトウェア等が古くなっていることがあります。
一度すべてを更新しておきましょう。

$ apt-get update
$ apt-get upgrade

ファイアウォールの設定

まずは、ファイアウォールを設定し、パケットレベルでのセキュリティを強化しましょう。

重要!ファイアウォールの設定とSSH設定は、必ずセットで行い、途中で中断しないようにしましょう
設定の途中でログアウトしたり、SSHタイムアウトになったりしてしまうと、サーバにログインできなくなるおそれがあります。注意してください。

設定ファイル作成

Ubuntuの場合、ファイアウォールには設定ファイルが必要です。
まずはこの設定ファイルを作成しましょう。

iptables.rulesの作成

Linuxではファイアウォールの実装としてiptablesが提供されています。
iptablesはコマンドでも設定することができますが、説明を簡単にするために、ここではファイル形式で設定を行います。

# vim /etc/iptables.rules

iptables.rulesの内容

「ポリシー」とは、iptablesの基本ルールです。
基本的に入ってくるパケットはすべて破棄し、追加で記述されたものについてのみ通信を許可するという記述内容になっています。

*filter
# ポリシー:入ってくるパケットは破棄(DROP)
:INPUT DROP [0:0]
# ポリシー:転送パケットは破棄(DROP)
:FORWARD DROP [0:0]
# ポリシー:出ていくパケットは許可(ACCEPT)
:OUTPUT ACCEPT [0:0]
# すでに確立済みの通信は許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Pingを許可
-A INPUT -p icmp -j ACCEPT
# ローカル通信を許可
-A INPUT -i lo -j ACCEPT
# ローカル通信をよそおった通信は拒否
-A INPUT -i <ネットワークインターフェース名> -s 127.0.0.1/8 -j DROP
-A INPUT -i <ネットワークインターフェース名> -s 10.0.0.0/8 -j DROP
-A INPUT -i <ネットワークインターフェース名> -s 172.16.0.0/12 -j DROP
-A INPUT -i <ネットワークインターフェース名> -s 192.168.0.0/16 -j DROP
-A INPUT -i <ネットワークインターフェース名> -s 192.168.0.0/24 -j DROP
# SSHのみ許可
-A INPUT -m state --state NEW -p tcp -m tcp --dport <SSHポート番号> -j ACCEPT
COMMIT

さらにセキュリティを強化する

iptablesの記述方法や、さらにセキュリティを強化するには、下記のサイトが非常に参考になります。
コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう
iptablesの設定ファイルをシェルスクリプトを利用して動的に作成

起動時ファイル読み込み設定

次に、OSの起動時に/etc/ipconfig.rulesを読み込むよう設定します。

スクリプトファイルの作成

サーバ起動時、通信が開始する前に何かの処理を実行したい場合、/etc/network/if-pre-up.dディレクトリ内にスクリプトファイルを置きます。

# cd /etc/network/if-pre-up.d/
# vim iptables_start

iptables_startの内容

iptables-restoreコマンドに、先程作成した/etc/iptables.rulesを読み込ませるスクリプトです。

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
exit 0

実行権限を付与

作成したスクリプトファイルに、実行権限を付与します。

# chmod a+x iptables_start

続いて、そのままSSH設定を行います。

SSH設定

重要!ファイアウォールの設定とSSH設定は、必ずセットで行い、途中で中断しないようにしましょう
設定の途中でログアウトしたり、SSHタイムアウトになったりしてしまうと、サーバにログインできなくなるおそれがあります。注意してください。

SSH設定ファイルを開く

今回は、SSH接続を待ち受けるサーバとしての設定を行いますので、sshd_configを編集します。同じフォルダにあるssh_configはクライアントとしての設定で、今回は関係ないので気をつけてください。

# vim /etc/ssh/sshd_config

ポートの変更

設定ファイルの冒頭に、Portという項目がありますので、以下のように変更します。
このポートが、iptablesでACCEPT設定にしたSSHポートと一致していることを必ず確認してください。

# What ports, IPs and protocols we listen for
# Port 22(もとの設定をコメントアウト)
Port <SSHポート>

パスワードログインの禁止

もしPasswordAuthenticationyesとなっていたら、必ずnoに変更しましょう。
また、この行がコメントアウトされていたら、以下のようにno設定になるようにしておきましょう。

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

SSHサービスの再起動

変更した設定を反映するために、SSHを再起動します。

# service ssh restart

設定の確認

ファイアウォールとSSH設定が済んだら、一旦一段落です。
SSHが正常に設定できていることを確認するために、一度あたらしくSSH接続を作ってみましょう。

接続先の設定

SSHクライアント(Putty等)の設定を変更します。
接続先サーバのポートを、先程設定したSSHポートに変更し、接続します。
新しい設定で接続に成功したら、SSHの設定は正常にできています。

再起動後、再度SSHログイン

rebootコマンドでサーバを再起動します。

# reboot

自動的にSSHクライアントの画面が閉じますので、しばらく待ってから、再度SSH接続します。
接続に成功したら、ファイアウォール設定・SSH設定は完了です。

次のステップに進みましょう。

作業用ユーザ設定

ここまでずっとrootユーザで作業をしてきました。ここで、今後の作業をするためのユーザを追加します。

ユーザの追加

adduserコマンドでユーザを追加します。途中、パスワードを尋ねられますので、好きな文字列を入力しましょう。

# adduser <ユーザ名>

ユーザがsudoコマンドを使えるようにするため、gpasswdコマンドで、sudoグループに追加します。
sudoコマンドがインストールされていない場合、インストールします。

# apt-get install sudo
# gpasswd -a <ユーザ名> sudo

作業用ユーザに切り替え

作成したユーザに切り替えます。ユーザの切り替えは、suコマンドで行います。
adduser実行時に入力したパスワードが必要です。

su <ユーザ名>
パスワード:(adduser実行時に入力したパスワード)

作業用ユーザのSSH設定

作業用ユーザでもSSHログイン出来るように設定します。rootでSSHログインするのはセキュリティ上リスクが高いためです。

ユーザ用SSHディレクトリの作成

SSHログイン認証用を管理するディレクトリを作ります。このディレクトリの内容を他のユーザに見られないようにするため、パーミッションを700に設定します。

$ cd ~
$ mkdir .ssh
$ chmod 700 .ssh/

SSH鍵ペアの作成

SSHログイン用に、SSH鍵ペアを作成します。鍵は、ssh-keygenコマンドで作成できます。途中、パスフレーズ等を聞かれますが、全て空白でもOKです。

$ cd .ssh/
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
34:ca:c0:a9:54:1c:17:35:06:7b:8a:96:7f:9a:75:38 user@XXXXXX
The key's randomart image is:
+--[ RSA 2048]----+
|   .o.+++        |
|   o.o o .       |
|  . + . +        |
| . . = = .       |
|  . + + S        |
|   . .   .       |
|      . E .      |
|       = o       |
|      o          |
+-----------------+

鍵の作成が完了したか確認してみましょう。

$ ls
id_rsa  id_rsa.pub 

成功していますね。id_rsaが秘密鍵(private key)、id_rsa.pubが公開鍵(public key)です。

公開鍵を認証済キーに追加

SSHサービスは、ユーザのホームディレクトリ内にある.ssh/authorized_keysファイルに含まれる公開鍵とマッチする秘密鍵を送信してきたクライアントのみに接続を許可します。
authorized_keysに、id_rsa.pubの内容を追加しましょう。

$ cat id_rsa.pub >> authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

秘密鍵をクライアント側に保存

秘密鍵の内容をcatなどで表示し、コピー&ペーストなどにより手元に保存します。
(ちなみに、Puttyではマウスで画面上の文字を選択することでコピーできます)

$ cat id_rsa
→コピーして手元に保存

ファイル名は何でも構いません。vps_id_rsa.pem等としておきましょう。

手元に保存したら、VPS側のファイルは削除しておきます。

$ rm id_rsa

SSHログイン確認

先程保存したSSH鍵ファイル(vps_id_rsa.pem)を使って、SSHログインができることを確認します。
SSHログインの手順は、rootでログインしたときと同じです。こちらの記事を参照してください。

rootによるSSHログインの禁止

沢山の設定、お疲れ様でした。いよいよ最後の設定です。
作業用ユーザのSSHログインが設定できたら、rootユーザによるSSHログインを禁止にしましょう。
かならず、作業用ユーザでのSSHログインができることを確認してから行ってください。

sshd_config編集

管理者権限がないと編集できないファイルなので、sudoを付けてvimを実行します。

$ sudo vim /etc/ssh/sshd_config

もともとwithout-passwordとなっており、まあまあ安全な設定なのですが、万全を期してnoにしておきましょう。

# PermitRootLogin without-password
PermitRootLogin no

最後にsshサービスを再起動して完了です。

$ sudo service ssh restart

まとめ

おつかれさまでした。以上で基本的な設定は完了です。
セキュリティ設定ではないので省きましたが、余力がある方には、logwatchコマンドの導入もぜひおすすめしておきます。

次回はいよいよ、discord.pyでbotを開発するための設定を行っていきます!

この記事は、シリーズ「VPSでdiscord.py Bot開発&運営」の一部です。( 4 / 5 )