下記のような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する
## Same thing without a password
%deploy ALL=(ALL) ALL,NOPASSWD:/usr/sbin/apachectl
deployとwheelグループのみsuコマンドを実行許可する。
下記行を追加
auth required pam_wheel.so use_uid group=deploy
rootユーザーのSSHログインを無効にする
PermitRootLogin no
SSHのポートを狙った攻撃を回避するため、ポート番号を変更する。
Portの後ろに変更したいポート番号を入れる
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のみ許可
*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のみ許可
*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の設定ファイルを下記のように設定
[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アドレス
search conoha.local
nameserver xxx.xxx.xxx.xxx
mydnsのconfファイルに先ほど作ったmydns用ユーザー情報を追加
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