この記事の内容
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ポート>
パスワードログインの禁止
もしPasswordAuthentication
がyes
となっていたら、必ず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を開発するための設定を行っていきます!