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


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

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

```
リバースプロキシ（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する

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

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

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

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

```vim:/etc/ssh/sshd_config
PermitRootLogin no
```

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

```vim:/etc/ssh/sshd_config
Port 46497
```

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

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

`$ /etc/init.d/sshd reload`

##ホスト名の設定

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

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

```/etc/hosts
127.0.0.1   rp01 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         rp01 localhost localhost.localdomain localhost6 localhost6.localdomain6
```

```/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=rp01
```

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

```
# service network reload
```

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

```
[deploy01@rp01 ~]$
```

###ファイアウォールの設定

#### リバースプロキシ（rp01）のファイアウォール設定

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

```vim:/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のみ許可

```vim:/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の設定ファイルを下記のように設定

```vim:/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 # サーバのメモリ70〜80%
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アドレス

```vim:/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
```