Rails5 on Nginx on CentOS7 環境構築 (1)

さくらの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のインストールです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする