DTIのServersMan@VPS(仮想専用サーバーのレンタル)を使い始めたので、初期設定などのメモ。
さしあたって最低限度の設定のみなので、詳しい人はもっと色々設定すると思います。
セキュリティの勉強始めたら、もうちょっと色々やってみます。
公式のマニュアルは「ServersManマニュアル スタートアップ ~まずはじめに~」です。
上記のマニュアルを確認しつつ、私は以下の設定を行いました。
①ユーザー追加:自分が操作するためのユーザーを作成
②管理者権限制限:sudoやsu – root等の管理者(root)権限の使用を制限
③SSH設定:セキュリティ対応(接続ポート変更/root接続拒否)
④FW設定:必要な通信のみ許可
⑤更にSSH設定:セキュリティ対応(公開鍵接続)
ちなみに今回はレンタルしたサーバーのディストリビューション(CentOS)環境での設定になっており、一部Debian系では実行できない操作が入っています。あと問題なければあらかじめ「yum update」(パッケージ更新)をやっておいても良いかも。
①ユーザー追加
まず、契約時に通知されるrootユーザーは何でもできる強力な権限(管理者権限)を持つユーザーなので、通常はそのまま使いません。操作用のユーザーを用意する必要があります。
初回はrootでSSH接続すると思うので、TeraTerm等を使ってrootユーザーで接続した状態を前提とします。まずは以下コマンドでユーザーを作成。
adduser ユーザーID
パスワードも設定。
passwd ユーザーID
ついでに以下コマンドで、rootユーザー(自分)のパスワードも変えましょう。
passwd
※通常は使わないので、難解なパスワードを付けておきましょう
②管理者権限設定
次に、今のままだとどのユーザーもsu – root等でrootユーザーに昇格したり、sudoを使った管理権限実行が可能な状態になっています。それぞれ、許可されたユーザー(グループ)のみ可能となるような制限を加えます。
・rootユーザーへの昇格を制限
制限するのにRedhat系ディストリビューションでは、wheelグループを利用したPAMというモジュールを利用した制限が可能です。まずは、「①ユーザー追加」で作成したユーザーをwheelグループに入れてあげます。wheelをサブグループとして指定するコマンドは以下。
usermod -G wheel ユーザーID
で、以下コマンドでPAMの設定を編集します。
vi /etc/pam.d/su
以下の記述がある場所のコメントアウト(先頭の#)を除去して、保存します。
auth required pam_wheel.so use_uid
・sudoの実行を制限
以下コマンドでsudoの設定を変更します。
visudo
以下の記述がある場所のコメントアウト(先頭の#)を除去して、保存します。
%wheel ALL=(ALL) ALL
③SSH設定
次はSSH接続の設定変更として、以下を行います。
・接続ポート変更:デフォ(22)だとバレバレで不正アクセスされるかもだから
・root接続禁止:rootで不正アクセスが成功したら被害が甚大だから
まず以下コマンドでエフェメラルポートを確認。
cat /proc/sys/net/ipv4/ip_local_port_range
多分、32768 61000とか出ると思うので、この範囲の中からSSH接続ポートを決めます。
以下のファイルを編集して、SSHの設定を変更します。
vi /etc/ssh/sshd_config
変更内容は以下。元々の設定はコメントアウト等しておくとよいでしょう。
2つめのPermitRootLoginでrootによるSSH接続を拒否しています。
Port 新しく設定するSSH接続ポート番号
PermitRootLogin no
SSH再起動。
systemctl restart sshd.service
※CentOS7からサービス管理がinit→Systemdに変更になっており、上記のようにsystemctlを使います
この時点でroot接続が不可能になったので、心配な人は今のSSH接続を閉じずに、TeraTerm等のSSH接続ツールをもう1つ起動し、「①ユーザー追加」で作成したユーザーでSSH接続できるか確認しておくと良いでしょう。万一繋げなかった時は設定を見直します。
公開鍵接続も強制にしておくとなおセキュリティ的によろしいのですが、鍵の受け渡し等が必要になるので、一応ここでは省いて「⑤更にSSH設定」で記します。
④FW設定
次にFWの設定です。CentOS7はfirewalldというサービスがありますが、ServersManのVPSはOpenVZを用いているため使えません。Dockerも使えないみたいです。ハイパバイザー型がハードウェアレベルの仮想化であるのに対して、OpenVZはOSレベルの仮想化なので自由度が低いようです。その分、安価で高速な環境を提供して貰えているとのこと。
閑話休題。
とりあえずiptablesでFWの設定を行います。
オプション「-A」はチェイン(検査ルール)の指定、「-m」はマッチングモジュール指定。
・localhostから(内部)の通信許可
iptables -A INPUT -i lo -j ACCEPT
・ping許可
iptables -A INPUT -p icmp -j ACCEPT
※pingのプロトコルはICMP
・HTTP許可
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
※HTTPのポートは80番
・HTTPS許可
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
※HTTPS(HTTPS(SSL))のポートは443番
・SSH接続許可
iptables -A INPUT -p tcp -m tcp --dport SSHポート番号 -j ACCEPT
※自分で設定したSSH接続ポート番号
・派生の通信許可
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
・内向きの通信拒否(上記以外)
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
・外向きの通信許可
iptables -P OUTPUT ACCEPT
・設定保存
service iptables save
・設定確認
cat /etc/sysconfig/iptables
iptables -L
この設定後、当然ですが許可したポート以外は通信不可能な状態になります。SSHポート番号が間違っていたりすると、以後リモート操作(SSH)ができず、サーバーリセットという事態になりかねませんので注意しましょう。
⑤更にSSH設定:セキュリティ対応(公開鍵接続)
SSHはパスワードによる認証ではなく、公開鍵を使った認証が可能です。ペアとなる秘密鍵を作ることで、自身の持つ秘密鍵と相手の持つ公開鍵で認証が可能となります。
linuxやmacでは「ssh-keygen」コマンドが利用できますが、クライアントがWindowsの場合は別途「ssh-keygen」のプログラムを入手する必要があります。
私は以下の記事を参考にしてGitをダウンロードし、その中にある「ssh-keygen.exe」を使用しました。
(「WindowsでSSHの鍵を作る – Qiita」)
※記事と異なり、「ssh-keygen.exe」の場所は「C:\Program Files\Git\usr\bin\ssh-keygen.exe」でした
鍵の作り方は、コマンドプロンプトを起動して上記の「ssh-keygen.exe」を実行するだけです。「C:\Users\ユーザー名\.ssh」フォルダ直下に「id_rsa」(秘密鍵)と「id_rsa.pub」(公開鍵)が出来上がるかと思います。ちなみに秘密鍵の方は漏えいさせないように、個人でしっかり管理しましょう。
パスフレーズはあった方がよいですが、なくても接続自体は可能です。
ftpコマンドやツールを使い、サーバーに公開鍵を送ります。私はツール(WinSCP)を使って転送しました。とりあえずユーザーのホームディレクトリに公開鍵を配置したものとして、以降の手順を記述します。
フォルダ作成。
mkdir ~/.ssh
公開鍵移動。
mv id_rsa.pub ~/.ssh/
公開鍵を別ファイルに追記。
cd ~/.ssh cat id_rsa.pub >> authorized_keys rm id_rsa.pub
パーミッション変更。
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
※上記の公開鍵設置は、SSHログインしたいユーザー全てに対して実施する
SSHでパスワードログインを不許可に設定。
vi /etc/ssh/sshd_config
設定内容を以下として、ファイルを保存。
PasswordAuthentication no
SSH再起動。
systemctl restart sshd.service
以降、SSH接続は秘密鍵を使ったものしか許可されなくなります。
秘密鍵は漏えい、紛失しないよう注意しましょう。