PCサーバーにUbuntu 16.04を導入してWordPressを動かす。(3/3)
PCサーバーにUbuntu 16.04を導入してWordPress環境を構築・運用する方法を説明します。
※3/3では、サーバーの運用について説明します。
13.FireWallの設定(iptables設定用シェル)
※サイトアタックを防ぐためのFireWallを設定するシェルです。
- iptablesは設定を誤るとサーバーに接続できなくなるので、ssh接続のターミナルを2つ開いておいてから、シェルを実行してください。
- イーサネットデバイス名(enp0xxx)は自分の環境に合わせます。
- sshでsftp転送できるので、ftpは許可しません。
- ssh port 22はBrute-force attackの対象となるので使用しません。(他のport番号を使用:ここでは11111)
- vncおよびsambaはLAN環境内部でのみ使用許可します。
※nano iptables_load_wp ←以下の内容をコピペします。
※他に使用しているportがあれば、適宜行を追加してください。
#!/bin/sh
IPTABLES=”/sbin/iptables”
# rules clear
$IPTABLES -F
$IPTABLES -t nat -F
###################################################
#
# security policies for wordpress-server
# written by webmaster@mail.e-nekorakuen.net
# date :2017/05/05 for wordpress-server
# INPUT :input packets
# FORWARD:forward packets
# OUTPUT :outputs packets
#
###################################################
# default NG
$IPTABLES -P INPUT DROP
# default OK
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
####################################################
#
# INPUT
# packet chains
#
####################################################
# icmp OK
$IPTABLES -A INPUT -p icmp -j ACCEPT
# WEB OK
$IPTABLES -A INPUT -p tcp –dport 80 -j ACCEPT
$IPTABLES -A INPUT -p tcp –dport 443 -j ACCEPT
# SMTP OK
$IPTABLES -A INPUT -p tcp –dport 25 -j ACCEPT
$IPTABLES -A INPUT -p udp –dport 25 -j ACCEPT
$IPTABLES -A INPUT -p tcp –dport 587 -j ACCEPT
$IPTABLES -A INPUT -p udp –dport 587 -j ACCEPT
# SSH Port 11111 OK(FTP NG)
$IPTABLES -A INPUT -p tcp –dport 11111 -j ACCEPT
# POP OK
$IPTABLES -A INPUT -p tcp –dport 110 -j ACCEPT
# DNS OK
$IPTABLES -A INPUT -p tcp –dport 53 -j ACCEPT
$IPTABLES -A INPUT -p udp –dport 53 -j ACCEPT
# SAMBA LAN OK(WAN NG)
$IPTABLES -A INPUT -i enp0xxx -s 192.168.1.0/24 -p udp –dport 137:138 -j ACCEPT
$IPTABLES -A INPUT -i enp0xxx -s 192.168.1.0/24 -p tcp –dport 139 -j ACCEPT
$IPTABLES -A INPUT -i enp0xxx -s 192.168.1.0/24 -p tcp –dport 445 -j ACCEPT
# VNC LAN OK(WAN NG)
$IPTABLES -A INPUT -i enp0xxx -s 192.168.1.0/24 -p tcp –dport 5900 -j ACCEPT
# LAN self OK
$IPTABLES -A INPUT -i lo -j ACCEPT
# LAN others OK
$IPTABLES -A INPUT -i enp0xxx -s 192.168.1.0/24 -j ACCEPT
# established OK
$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
####################################################################
#
# FORWARD
# server thru packets
#
####################################################################
# drop packets
$IPTABLES -A FORWARD -p tcp –dport 135 -j DROP
$IPTABLES -A FORWARD -p udp –dport 135 -j DROP
$IPTABLES -A FORWARD -p tcp –dport 137:139 -j DROP
$IPTABLES -A FORWARD -p udp –dport 137:139 -j DROP
$IPTABLES -A FORWARD -p tcp –dport 445 -j DROP
$IPTABLES -A FORWARD -p udp –dport 445 -j DROP
$IPTABLES -A FORWARD -p tcp –dport 5900 -j DROP
# path MTU
$IPTABLES -A FORWARD -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –clamp-mss-to-pmtu
##########################################################################
#
# LAN to WAN IP MASQUERADE
#
##########################################################################
$IPTABLES -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE
#######################################################################
#
# OUTPUT
# server packets chains
#
#######################################################################
# drop packets
$IPTABLES -A OUTPUT -o ppp0 -p tcp –dport 135 -j DROP
$IPTABLES -A OUTPUT -o ppp0 -p udp –dport 135 -j DROP
$IPTABLES -A OUTPUT -o ppp0 -p tcp –dport 137:139 -j DROP
$IPTABLES -A OUTPUT -o ppp0 -p udp –dport 137:139 -j DROP
$IPTABLES -A OUTPUT -o ppp0 -p tcp –dport 445 -j DROP
$IPTABLES -A OUTPUT -o ppp0 -p udp –dport 445 -j DROP
$IPTABLES -A OUTPUT -o ppp0 -p tcp –dport 5900 -j DROP
- シェルを実行します。
./iptables_load_wp - iptablesに設定が反映していることを確認します。
iptables -L - 再起動してもiptablesの設定内容が反映するようにします。
apt-get install iptables-persistent ←インストール中に保存”Y”を選択します。
14.重要データ自動バックアップ
(1)NASのマウント(ネットワーク上にNASがあることを前提とします。)
http://engetu21.hatenablog.com/entry/2016/07/31/190059
- cifs-utilのインストール(Network越しのマウント)
apt-get install cifs-utils
mkdir /mnt/nas - NASのマウント
mount.cifs //192.168.1.xx/backups /mnt/nas -o username=user名
mkdir /mnt/nas/data
mkdir /mnt/nas/mysql - fstabに追記(起動時に自動マウント)
nano fstab
/etc/fstab: static file system information.
#
# Use ‘blkid’ to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during installation
UUID=9f01f300-1f94-4022-9d85-1e49c9cc4ebb / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/sda1 during installation
UUID=6D6D-3F12 /boot/efi vfat umask=0077 0 1
# swap was on /dev/sda3 during installation
UUID=f64a5e73-8629-4591-8771-db3e16c8437d none swap sw 0 0
# nas mount added 2017/05/05 ←以下、追記します。
//192.168.1.xx/backups /mnt/nas cifs username=user名,password=パスワード,uid=1000,gid=1000 0 0
(2)自動バックアップジョブの登録
- バックアップシェル1(重要データ)
nano daily_backup ←以下の内容をコピペ
## daily_backup dirs -> /mnt/nas/backups/data/weekday ##
## written by webmaster@mail.e-nekorakuen.net 2017/05/06 ##
today=`date`
day=`date +%A`
backup_dir=/mnt/nas/data/
if [ ! -d $backup_dir$day ] then
mkdir $backup_dir$day
fi
cd $backup_dir$day
echo “>>> daily_backup start: $today <<<” > daily_backup.log
for dirname in /home/www/example.com /etc /var/log
do
echo “$dirname backup start…” >> daily_backup.log
bkname=`echo $dirname | tr / _`
tar zcvf $bkname.tar.gz $dirname
done
echo “*—– backup files are —–*” >> daily_backup.log
ls -la >> daily_backup.log
echo “>>> daily_backup end: $today <<<” >> daily_backup.log - バックアップシェル2(MySQL)
nano mysql_backup ←以下の内容をコピペ
## mysql_backup /var/lib/mysql -> /mnt/nas/backups/mysql ##
## written by webmaster@mail.e-nekorakuen.net 2017/05/06 ##
backup_dir=/mnt/nas/mysql/
day=`date +%A`
if [ ! -d $backup_dir$day ] then
mkdir $backup_dir$day
fi
cd $backup_dir$day
today=`date`
echo “>>> mysql_backup start: $today <<<” > mysql_backup.log
mysqldir=/var/lib/mysql
dblist=`ls -p $mysqldir | grep / | tr -d /`
for dbname in $dblist
do
echo “$dbname backup start…” >> mysql_backup.log
tar zcvf $dbname.tar.gz $mysqldir/$dbname
done
echo “*—– backup files are —–*” >> mysql_backup.log
ls -la >> mysql_backup.log
today=`date`
echo “>>> mysql_backup end: $today <<<” >> mysql_backup.log - crontabに登録(スケジュール化)
nano /etc/crontab
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use ‘*’ in these fields (for ‘any’).#
# Notice that tasks will be started based on the cron’s system
# daemon’s notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command ←以下、追記します。
0 4 * * * /home/job/daily_backup > /dev/null &
0 5 * * * /home/job/mysql_backup > /dev/null &
<運用方法>
- 毎日4時にdaily_backupが、毎日5時にmysql_backupが起動します。バックアップ先のフォルダに曜日別に圧縮ファイル(*.tar.gz)が保管されているので、万一重要データが破損した場合や書き換えられた場合でも、以前の状態に復元することが出来ます。
- 重要データもMySQL DBも圧縮済みのデータを元のディレクトリに解凍するだけでOKです。→ tar xzvf 圧縮ファイル名.tar.gz でカレントディレクトリに解凍されます。
以上です。