さくらのVPSでカスタムOSインストールを利用してCentos7系の最新版をインストール、まっさらな状態から環境構築をしてみました。
WebサーバーはNginxを採用、リバースプロキシサーバーとして動作させます。バックエンドのアプリケーションサーバーはRailsアプリを動作させるためのPuma、PHPアプリを動作させるためのphp-frmという構成です。データベースは旧環境と同じMySQLです。
環境
CentOS 7.3
ユーザーの作成
まず最初に作業用ユーザーを追加します。
useradd ユーザー名 passwd ユーザー名 Changing password for user ユーザー名. New password: パスワード Retype new password:パスワードをもう一度
追加したユーザーにsudo権限を割り当てます。
usermod -G wheel ユーザー名
下記箇所のコメント(#%wheel)の#を削除します。(このバージョンでは#が付いていなかったのでそのままにしましたが。)
visudo
## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
sudo時にPATHを引き継ぐ設定もしておきます。Defaults env_keep += “xxxx” を探して、以下を追加
Defaults env_keep += "PATH"
以下をコメントアウト
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
システムを最新にアップデートします
yum update ..................................... Is this ok [y/d/N]: yを入力
日本語化しておきましょう
localectl set-locale LANG=ja_JP.utf8 localectl
System Locale: LANG=ja_JP.utf8
VC Keymap: jp106
X11 Layout: jp
日本語化の確認ができました。反映しておきます。
source /etc/locale.conf
ファイアウォールの設定
サーバー環境設定で真先にすべきことはファイアウォールの設定ですね。
CentOS7ではiptablesからfirewalldに移行していますが、今回はiptablesを使用したいので、firewalldをオフ、iptablesをオンにします。
systemctl stop firewalld systemctl disable firewalld systemctl status firewalld .......................... Active: inactive (dead)...となっているはず
iptables-serviceをインストールして、自動起動に設定します。
yum install iptables-services systemctl enable iptables systemctl start iptables systemctl status iptables .......................... Active: active (exited)...となっているはず
サーバへの攻撃対策のルールを設定します。
さくらのVPSマニュアル「iptablesの設定方法」を参考に、データを持たないパケットの接続を破棄、SYNflood攻撃と思われる接続を破棄、ステルススキャンと思われる接続を破棄
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
許可する通信の設定をします。
localhostからの通信とpingを許可に設定
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT
HTTP、HTTP(SSL)、SMTP、SMTP(SSL)、POP3、POP3(SSL)、IMAP、IMAP(SSL)、DNS、SSH、FTPの各ポート番号を許可に設定
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 25 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport xxxxx -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 50021:50040 -j ACCEPT
確立済みの通信を許可に設定
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
許可した通信以外のサーバに受信するパケットを拒否し、サーバから送信するパケットを許可に設定
iptables -P INPUT DROP iptables -P OUTPUT ACCEPT
iptablesの設定を設定ファイルに保存します。
service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
うまくいきました。確認しておきましょう。
cat /etc/sysconfig/iptables iptables -L
試しに外部から接続を行ってみます。Windowsパソコンの Bash on Ubuntu on Windows を起動して、
telnet xxx.xxx.xxx.xxx 80 Trying xxx.xxx.xxx.xxx...
固まってしまいました。許可したポートがブロックされているようです。
設定ファイルを確認したところ、-reject-with icmp-host-prohibited が許可ポート設定の前に居座っていました。これは、このルールまでにマッチしなかったパケットはicmp-host-prohibitedを返して接続拒否するものであり、問答無用に拒否されていたからです。
設定ファイルを直接編集して修正してしましょう。
vim /etc/sysconfig/iptables
*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [3:404] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited ←この行は削除して -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT ........................................... -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 50021:50040 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited ←こちらに移動 -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
systemctl reload iptables systemctl restart iptables
もう一度Windowsパソコンの Bash on Ubuntu on Windows から、
telnet xxx.xxx.xxx.xxx 80 Trying xxx.xxx.xxx.xxx... telnet: Unable to connect to remote host: Connection refused
すぐに Connection refused が返ってきました。ファイアウォールは通過していますね。まだHTTPサーバが起動していないため、コネクションが拒否されたということです。
SSH接続の設定を変更
SSHログインをパスワード認証から公開鍵認証に変更します。
さらにパスワード認証を禁止し、rootのログインも禁止にしてしまいます。
鍵のペアを生成
作業用ユーザーでログイン
mkdir ~/.ssh chmod 700 ~/.ssh cd ~/.ssh
ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/prexsoft/.ssh/id_rsa):Enterキー Enter passphrase (empty for no passphrase): パスワード Enter same passphrase again: パスワードをもう一度
秘密鍵id_rsaと公開鍵id_rsa.pubが生成されています。
公開鍵を配置します。
chmod 600 id_rsa.pub mv id_rsa.pub authorized_keys
秘密鍵id_rsaはクライアント側に転送後、サーバー側から削除しておいたほうがよいでしょう。サーバー側に保存しておきたい場合はパーミッション600としておく必要があります。
この秘密鍵はAES-128-CBCで暗号化されていましたが、DES-DES3-CBCで暗号化しておきたい場合は、変換しておきます。
cat id_rsa | openssl rsa | openssl rsa -des3 > id_rsa_des3
FileShelf PlusではDES-DES3-CBCのみ対応していたため、DES-DES3-CBC暗号化に変換した秘密鍵を使用しました。FileShelf Plus v3.3.2.5以降のバージョンでAES-128-CBCの秘密鍵でもログインできるようになりました。
ログインの制限
SELinuxは無効化しておきます。
sudo su setenforce 0
再起動の際も無効化するように設定ファイルも編集
vim /etc/selinux/config
SELINUX=disabled
SSHポート番号を22から任意の番号(49152 から 65535は自由に使用できる)に変更し、パスワードログインを禁止、さらにrootログインを禁止します。
vim /etc/ssh/sshd_config
Port 任意のポート番号 PasswordAuthentication no PermitRootLogin no
sshdを再起動します。
systemctl restart sshd
SSHログイン画面からログアウトする前に、新たにSSHターミナルを開き、秘密鍵を使用して任意のポート番号へSSH接続できるかどうか確認しておきましょう。設定ミスがあると二度とログインできなくなってしまいます。
次回はRuby/Railsのインストールです。