LoginSignup
18
20

More than 5 years have passed since last update.

Deploy環境を構築するのに必要なサーバーセキュリティ設定

Last updated at Posted at 2014-01-19

下記のような3層構造の環境を作成するのに必要な
サーバーの基本的なセキュリティ設定です。

まだ下書きですが、とりあえず公開しました。

リバースプロキシ(DNSサーバーの機能も持つ)
   | 172.16.0.0/24
WEB ー WEB
   | 192.168.0.0/24
   DB

ログインユーザーのセキュリティ設定

初期インストールされたパッケージをアップデート

`$ sudo yum upgrade

upgradeにすると、セキュリティ更新等で不要になったモジュールを削除してくれる

ログインユーザー(deploy01)の作成

$ useradd deploy01
$ passwd  deploy01

deploy専用グループを作成

$ groupadd deploy

deploy01をdeployグループに所属させる

$ usermod –G deploy deploy01

deployグループはapachectlのみNOPASSWORDする

visudo
## Same thing without a password
%deploy ALL=(ALL)       ALL,NOPASSWD:/usr/sbin/apachectl

deployとwheelグループのみsuコマンドを実行許可する。
下記行を追加

/etc/pam.d/su
auth  required pam_wheel.so use_uid group=deploy

rootユーザーのSSHログインを無効にする

/etc/ssh/sshd_config
PermitRootLogin no

SSHのポートを狙った攻撃を回避するため、ポート番号を変更する。
Portの後ろに変更したいポート番号を入れる

/etc/ssh/sshd_config
Port 46497

※4桁はアプリケーションサーバーのポートと被る可能性があるため、5桁以上が推奨

SSHの変更を有効にするため、SSHの設定をreloadする

$ /etc/init.d/sshd reload

ホスト名の設定

ログインしたときにSHELLの表示がユーザー名@ホスト名にする

各サーバーのhostsにホスト名を先頭に追加(下記コードはrp01の場合)

127.0.0.1   rp01 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         rp01 localhost localhost.localdomain localhost6 localhost6.localdomain6
NETWORKING=yes
HOSTNAME=rp01

設定が終わったらネットワークをreload

# service network reload

再度ログインし直すと、反映されている

[deploy01@rp01 ~]$

ファイアウォールの設定

リバースプロキシ(rp01)のファイアウォール設定

外部パケットはicmp、http、https、ssh(ポートは46497)、DNSのみ許可

/etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# allow port(SSH,http,https,DNS)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25081 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80  -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53  -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

WEBサーバー(web01、web02)の設定

172.16.0.0/24のローカルネットワークのみ、apacheへの通信許可
外部パケットはsshとicmpのみ許可

/etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#------------------------------------------------------
# 80は本番環境(prod)のサイト表示
# 10000はテスト環境(test)のサイト表示
#------------------------------------------------------
-A INPUT -s 172.16.0.0/24 -p tcp --dport 80   -j ACCEPT
-A INPUT -s 172.16.0.0/24 -p tcp --dport 10000 -j ACCEPT
#------------------------------------------------------
# SSHを許可
#------------------------------------------------------
-A INPUT -m state --state NEW -m tcp -p tcp --dport 46497 -j ACCEPT
#------------------------------------------------------
# 上記に設定していないポートの接続処理を遮断
#------------------------------------------------------
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

DBサーバー(db01)の設定

172.16.0.0/24と192.168.0.0/24のローカルネットワークのみ、SSHとMYSQL接続を許可
外部パケットはicmpのみ許可

*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#------------------------------------------------------
# ローカルネットワークのみSSHとMySQL接続を許可
#------------------------------------------------------
-A INPUT -s 172.16.0.0/24  -p tcp --dport 46497 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp --dport 46497 -j ACCEPT
-A INPUT -s 172.16.0.0/24  -p tcp --dport 3306  -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp --dport 3306  -j ACCEPT
#------------------------------------------------------
# 上記に設定していないポートの接続処理を遮断
#------------------------------------------------------
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
COMMIT

iptablesの設定をリロードして反映

#service iptables relaod;

MySQLのインストール

rp01(DNSサーバー用として使う)

$ yum install mysql mysql-devel mysql-server

web01、web02(rails用にインストール)

$ yum install mysql mysql-devel

db01(mysqlデータベース用)

$ yum install mysql mysql-server

mysqlの設定

以下をサーバー4台全てに設定する

mysqlの設定ファイルをバックアップする

$ sudo cp /etc/my.cnf /etc/my.cnf.org

MySQLの設定ファイルをバックアップ

$ sudo cp /etc/my.cnf /etc/my.cnf.org

MySQLの設定ファイルを下記のように設定

/etc/my.cnf

[mysqld]
character-set-server = utf8
skip-character-set-client-handshake
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

innodb_buffer_pool_size = 512MB # サーバのメモリ7080%
innodb_log_file_size = 100MB # 100-500MB程度
innodb_flush_log_at_trx_commit = 2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid          

rootのパスワード設定

$ sudo mysqladmin -u root password 'パスワード'

mysql-serverをインストールしている
rp01とdb01のみMySQLの自動起動をONにする

$ sudo service mysqld start
$ sudo chkconfig mysqld on

MySQLにログインし、不要なユーザーとデータベースを削除する

$ mysql -u root -p ****

mysql > use mysql;
mysql > select user,password, host from user;
+------+-------------------------------------------+-------------------------+
| user | password                                  | host                    |
+------+-------------------------------------------+-------------------------+
| root | *hogehogehogehogehogehogehogehogehogehoge | localhost               |
| root |                                           | hogehogehogehogeh.ne.jp |
| root |                                           | 127.0.0.1               |
|      |                                           | localhost               |
|      |                                           | hogehogehogehogeh.ne.jp |
+------+-------------------------------------------+-------------------------+
mysql > DELETE FROM user WHERE user = '' OR ( user = 'root' AND host != 'localhost' );
Query OK, 4 rows affected (0.00 sec)

mysql > select user,password, host from user;
+------+-------------------------------------------+-----------+
| user | password                                  | host      |
+------+-------------------------------------------+-----------+
| root | *hogehogehogehogehogehogehogehogehogehoge | localhost |
+------+-------------------------------------------+-----------+
1 row in set (0.00 sec)

続いて、不要なデータベースを削除

mysql > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> DROP DATABASE test;
Query OK, 0 rows affected (0.00 sec)

文字セットの確認

show variables like 'character_set%';
# ↓ のようになっていれば成功
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

アプリケーション用データベースを作成

※db01のサーバーで作業・設定する

rails用のデータベースを追加

mysql > create database app;
mysql > create database app_test;
mysql > create database app_dev;

rails用ユーザーを追加

GRANT ALL ON app.* TO ‘deploy’@‘192.168.0.0/255.255.255.0’ IDENTIFIED BY ‘xxx(パスワードを記入)’;

ログイン出来るか確認

# mysql -u deploy -p -h localhost

mydns(DNSサーバー)のインストール

mydnsとは?

DNSの管理がMySQLのデータベースで可能

使用目的

SSH接続のホスト名解決に使う

インストール手順

※インストールはrp01で行います。

mydnsをダウンロードするためのリポジトリを追加

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

mydnsパッケージのインストール

# yum install mydns mydns-mysql mysql mysql-devel mysql-server -y

mysqlにログインし、mydns用データベースを作成

mysql > create database mydns;

ターミナルから下記コマンドを実行し、mydns用のデータベースを追加

$ mydns --create-tables | mysql -u root -p mydns

mysqlにログインし、mydns用のテーブルができているか確認

mysql > use mydns;

Database changed
mysql> show tables;
+-----------------+
| Tables_in_mydns |
+-----------------+
| rr              |
| soa             |
+-----------------+

mydns用のユーザーを作成する。
※データベースmydnsに対して、全ての権限を持ったユーザー(全てのホストからのアクセス許可)

GRANT ALL ON mydns.* TO ‘mydns’@‘localhost’ IDENTIFIED BY ‘mydns’;
Query OK, 0 rows affected (0.01 sec)

DNSゾーンとレコードの作成

※ネットワーク名をconoha.localにする
※xxx.xxx.xxx.xxxはホスト名ごとのグローバルIPアドレス

mysql> insert into soa (origin, ns) values ('conoha.local.','ns.conoha.local');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into rr (zone, name, type, data) values(1, 'rp01',   'A', 'xxx.xxx.xxx.xxx');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into rr (zone, name, type, data) values(1, ‘web01',   'A', 'xxx.xxx.xxx.xxx');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into rr (zone, name, type, data) values(1, ‘web02’,   'A', 'xxx.xxx.xxx.xxx');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into rr (zone, name, type, data) values(1, ‘db01’,   'A', 'xxx.xxx.xxx.xxx');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from rr;
+----+------+-------+---------------+-----+-------+------+
| id | zone | name  | data          | aux | ttl   | type |
+----+------+-------+---------------+-----+-------+------+
|  1 |    1 | rp01  | xxx.xx.xxx.xx  |   0 | 86400 | A    |
|  2 |    1 | web01 | xxx.xx.xxx.xxx |   0 | 86400 | A    |
|  3 |    1 | web02 | xxx.xx.xxx.xxx |   0 | 86400 | A    |
|  4 |    1 | db01  | xxx.xx.xxx.xxx |   0 | 86400 | A    |
+----+------+-------+---------------+-----+-------+------+

mysql > select * from soa;
+----+---------------+-----------------+------+--------+---------+-------+--------+---------+-------+
| id | origin        | ns              | mbox | serial | refresh | retry | expire | minimum | ttl   |
+----+---------------+-----------------+------+--------+---------+-------+--------+---------+-------+
|  1 | conoha.local. | ns.conoha.local |      |      1 |   28800 |  7200 | 604800 |   86400 | 86400 |
+----+---------------+-----------------+------+--------+---------+-------+--------+---------+-------+
1 row in set (0.00 sec)

ホスト名で通信したいすべてのサーバーで下記を設定

xxx.xxx.xxx.xxxはrp01のグローバルIPアドレス

/etc/resolv.conf
search conoha.local
nameserver xxx.xxx.xxx.xxx

mydnsのconfファイルに先ほど作ったmydns用ユーザー情報を追加

/etc/mydns.conf
db-host = localhost             # SQL server hostname
db-user = mydns                 # SQL server username
db-password = mydns             # SQL server password
database = mydns                # MyDNS database name

mydnsを起動

$ service mydns start

設定したホスト名でpingが通るか確認

ping web01
18
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20