RPL_LSF’s blog

RPL LSFの日々のメモブログ

自宅CentOSServer再作成メモ

自宅CentOSServer再作成メモ

この資料について


この資料はほとんどすべてにおいて他所からのコピペで成り立っています。
この資料は、次回のサーバー立ち上げ時に調べなおさないで済むための私の作業のログであり、 正しいことを保証するようなものではありません。
資料の参考にさせていただいたサイトを以下に記載いたします。

手順後の不具合とか適当なメモ


手順実行後に起きた問題について書く

  • なぜかSSHipv6でしかアクセスできない…
  • sshのポート変更を行ってもなぜか外部からアクセスできない…iptableは設定済み

/etc/sysconfig/network-scripts/ifcfg-enp3s0

DEVICE="enp3s0"
ONBOOT="yes"
TYPE="Ethernet"

#BOOTPROTO="dhcp"
BOOTPROTO="static"
IPADDR=192.168.0.12
NETMASK0=255.255.255.0
DHCP_FQDN="ドメイン名を書く"

インストールと初期設定


最小構成でCentOS7をインストール

サーバーに対してCentOS7をインストールする。

  • 構成設定を最小構成
  • ネットワークは、ON
  • ユーザーアカウントを管理者カウントとして作成

初期設定

rootになれるユーザーを管理者のみにする

例として、管理者用の一般ユーザー名をcentosとする

[root@centos ~]# usermod -G wheel centos
 ↑ 管理者ユーザーをwheelグループに追加
[root@centos ~]# vi /etc/pam.d/su
#auth       required     pam_wheel.so use_uid
↓
auth       required     pam_wheel.so use_uid
 ↑ コメント解除

管理者用一般ユーザーからはrootになれて、管理者以外の一般ユーザーからはrootになれないことを確認

パッケージ管理システム設定

RPMパッケージのインストール・アンインストールを行うyumの初期設定を行う

[root@centos ~]# yum -y update
 ↑ インストール済パッケージの一括アップデート
**※大量のパッケージのダウンロード/アップデートを行うため時間がかかる  **
[root@centos ~]# yum -y install yum-cron
 ↑ yum-cronインストール
[root@centos ~]# vi /etc/yum/yum-cron.conf
 ↑ yum-cron設定
# Whether updates should be applied when they are available.  Note
# that download_updates must also be yes for the update to be applied.
apply_updates = yes
 ↑ ダウンロード&アップデートを自動で行うようにする
[root@centos ~]# systemctl start yum-cron
 ↑ パッケージ自動更新起動
[root@centos ~]# systemctl enable yum-cron
 ↑ パッケージ自動更新自動起動設定
[root@centos ~]# yum -y groupinstall base "Development tools"
 ↑ ベース、開発ツールパッケージ群インストール

root宛メールを転送する

システムからroot宛に重要なメールが送られてくるので、root宛メールを普段使用しているメールアドレス宛に転送するようにする

メールサーバーのOP25B対策(Postfix編)

Gmailのメールサーバーから送信するメールはOP25Bの影響は受けないため、 全ての送信メールをGmailを経由して送信するようにする。

Postfix設定
[root@centos ~]# vi /etc/postfix/main.cf
 ↑ Postfix設定ファイル編集
以下を最終行へ追加
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
SMTP認証情報設定
[root@centos ~]# echo [smtp.gmail.com]:587 Gmailアドレス:Gmailパスワード > /etc/postfix/sasl_passwd
 ↑ SMTP認証情報設定
[root@centos ~]# chmod 640 /etc/postfix/sasl_passwd
 ↑ root以外参照できないようにパーミッション変更
[root@centos ~]# postmap /etc/postfix/sasl_passwd
 ↑ SMTP認証情報のデータベース化
Postfix設定反映
[root@centos ~]# systemctl reload postfix
 ↑ Postfix設定反映
メール転送設定
[root@centos ~]# sed -i '/^root:/d' /etc/aliases
 ↑ 旧root宛メール転送設定削除
[root@centos ~]# echo "root: hoge@nifty.com" >> /etc/aliases
 ↑ root宛メールを普段使用しているメールアドレス(例:hoge@nifty.com)宛に転送する
[root@centos ~]# newaliases
 ↑ 転送設定反映
セキュリティ設定の変更

Gmailを利用する場合は、安全性の低いアプリの許可を許可に変更する。

[root@centos ~]# echo test|mail root
 ↑ テストメールをroot宛に送信する

テストメールが転送先メールアドレス宛に届いていることを確認する

SELinuxの無効化

[root@centos ~]# getenforce
 ↑ SELinux状態確認
Enforcing
 ↑ SELinux有効
[root@centos ~]# setenforce 0
 ↑ SELinux無効化
[root@centos ~]# getenforce
 ↑ SELinux状態確認
Permissive
 ↑ SELinux無効
[root@centos ~]# vi /etc/sysconfig/selinux
 ↑ SELinux設定ファイル編集
SELINUX=enforcing
↓
SELINUX=disabled
 ↑ システム起動時にSELinuxを無効化

nkfコマンドインストール

日本語処理に必要なnkfコマンドをインストールする

[root@centos ~]# wget "http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fnkf%2F59912%2Fnkf-2.1.3.tar.gz" -O nkf-2.1.3.tar.gz
 ↑ nkfダウンロード
[root@centos ~]# tar zxvf nkf-2.1.3.tar.gz
 ↑ nkf展開
[root@centos ~]# cd nkf-2.1.3/
 ↑ nkf展開先ディレクトリへ移動
[root@centos nkf-2.1.3]# make && make install
 ↑ nkfインストール
[root@centos nkf-2.1.3]# cd
 ↑ nkf展開先ディレクトリを抜ける
[root@centos ~]# rm -rf nkf-2.1.3
 ↑ nkf展開先ディレクトリを削除
[root@centos ~]# rm -f nkf-2.1.3.tar.gz
 ↑ ダウンロードしたnkfを削除
[root@centos ~]# ln -s /usr/local/bin/nkf /usr/bin/nkf
 ↑ /usr/local/bin/nkfから/usr/bin/nkfへリンクをはる

システムの再起動

[root@centos ~]# reboot
 ↑ システム再起動する場合

仮想マシンにかかわる設定


KVM構築

仮想化関連パッケージインストール

[root@host ~]# yum -y groupinstall "Virtualization Host"
 ↑ 仮想化関連パッケージインストール
[root@host ~]# yum -y install virt-install virt-top
 ↑ 仮想マシンインストールコマンド等インストール
[root@host ~]# yum -y install '*guestf*'
 ↑ オフラインゲスト編集ツールインストール

仮想マシン制御起動

[root@host ~]# systemctl start libvirtd
 ↑ 仮想マシン制御起動

仮想化設定

[root@host ~]# systemctl stop NetworkManager
 ↑ NetworkManager停止(ブリッジ未対応のため)
[root@host ~]# systemctl start network
 ↑ netowork起動
[root@host ~]# systemctl disable NetworkManager
 ↑ NetworkManager自動起動解除
[root@host ~]# systemctl enable network
 ↑ network自動起動設定
[root@host ~]# sed -i 's/IPADDR0/IPADDR/g' /etc/sysconfig/network-scripts/ifcfg-enp3s0
 ↑ LANインタフェース設定ファイル編集(IPADDR0をIPADDRへ変更)
[root@host ~]# sed -i 's/PREFIX0/PREFIX/g' /etc/sysconfig/network-scripts/ifcfg-enp3s0
 ↑ LANインタフェース設定ファイル編集(PREFIX0をPREFIXへ変更)
[root@host ~]# sed -i 's/GATEWAY0/GATEWAY/g' /etc/sysconfig/network-scripts/ifcfg-enp3s0
 ↑ LANインタフェース設定ファイル編集(GATEWAY0をGATEWAYへ変更) 
[root@host ~]# virsh iface-bridge enp3s0 br0
 ↑ ブリッジインタフェースbr0作成&起動
ブリッジ br0 を作成して、デバイス eth0 に接続しました
ブリッジインターフェース br0 が起動しました
[root@host ~]# vi /etc/sysconfig/libvirt-guests
 ↑ libvirt-guests編集
ON_BOOT=start
 ↑ 再起動前にサスペンドされたゲストを自動起動する
ON_SHUTDOWN=suspend
 ↑ ホスト停止時にゲストをサスペンドさせる
SHUTDOWN_TIMEOUT=600
 ↑ ゲスト停止監視時間※この時間を超えてもゲストが停止しない場合はゲストを強制停止する

KVM管理ソフトのインストール

X Window System のインストール

[root@host ~]# yum -y groupinstall "X Window System"
 ↑ GUI表示を行う
[root@host ~]# yum -y install vlgothic-*
 ↑ 日本語文字化け防止
[root@host ~]# systemctl set-default graphical.target
 ↑ 起動モードを変更
[root@host ~]# shutdown -r now
 ↑ 再起動

VirtManagerのインストール

[root@host ~]# yum -y install virt-manager

セキュリティ強化


アンチウイルスソフト導入

Clam AntiVirusインストール

[root@centos ~]# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
 ↑ EPELリポジトリ導入
[root@centos ~]# yum -y install clamav clamav-server clamav-server-systemd clamav-update clamav-scanner
 ↑ Clam AntiVirusインストール

ウイルス定義ファイル最新化

[root@centos ~]# vi /etc/freshclam.conf
 ↑ ウイルス定義ファイル更新設定ファイル編集
# Comment or remove the line below.
#Example
 ↑ 行頭に#を追加してコメントアウト(ウイルス定義ファイル更新機能の有効化)
# Send the RELOAD command to clamd.
# Default: no
#NotifyClamd /path/to/clamd.conf
NotifyClamd /etc/clamd.d/scan.conf
 ↑ 追加(ウイルス定義ファイル更新をclamdに通知する)
[root@centos ~]# vi /etc/sysconfig/freshclam
 ↑ ウイルス定義ファイル自動更新設定ファイル編集
#FRESHCLAM_DELAY=
 ↑ 行頭に#を追加してコメントアウト
[root@centos ~]# freshclam
 ↑ ウイルス定義ファイル最新化
ClamAV update process started at Sat Sep  3 13:22:28 2016
…中略…
Database updated (4793967 signatures) from database.clamav.net (IP: 69.12.162.28)
ERROR: Please edit the example config file /etc/clamd.d/scan.conf
ERROR: NotifyClamd: Can't find or parse configuration file /etc/clamd.d/scan.conf

※以後のウイルス定義ファイルのアップデートは、/etc/cron.d/clamav-updateにより定期的に自動で行われる

Clam AntiVirus設定

[root@centos ~]# vi /etc/clamd.d/scan.conf
 ↑ Clam AntiVirus設定ファイル編集
# Comment or remove the line below.
#Example
 ↑ 行頭に#を追加してコメントアウト
# Run as another user (clamd must be started by root for this option to work)
# Default: don't drop privileges
#User clamscan
 ↑ 行頭に#を追加してコメントアウト(root権限で動作するようにする)
# Path to a local socket file the daemon will listen on.
# Default: disabled (must be specified by a user)
LocalSocket /var/run/clamd.scan/clamd.sock
 ↑ 行頭の#を削除

Clam AntiVirus起動

[root@centos ~]# systemctl start clamd@scan
 ↑ clamd起動
[root@centos ~]# systemctl enable clamd@scan
 ↑ clamd自動起動設定

ウイルススキャンテスト

ウイルススキャンテスト(ウイルスなしの場合)

[root@centos ~]# clamdscan -c /etc/clamd.d/scan.conf --remove
/root: OK
----------- SCAN SUMMARY -----------
Infected files: 0
 ↑ ウイルスは検知されなかった
Time: 1.924 sec (0 m 1 s)

ウイルススキャンテスト(ウイルスありの場合)

[root@centos ~]# wget http://www.eicar.org/download/eicar.com
 ↑ テスト用ウイルスをダウンロード
[root@centos ~]# wget http://www.eicar.org/download/eicar.com.txt
 ↑ 〃
[root@centos ~]# wget http://www.eicar.org/download/eicar_com.zip
 ↑ 〃
[root@centos ~]# wget http://www.eicar.org/download/eicarcom2.zip
 ↑ 〃
[root@centos ~]# clamdscan -c /etc/clamd.d/scan.conf --remove
/root/eicar.com: Eicar-Test-Signature FOUND
 ↑ ウイルス検知
/root/eicar.com: Removed.
 ↑ ウイルス削除
/root/eicar.com.txt: Eicar-Test-Signature FOUND
 ↑ ウイルス検知
/root/eicar.com.txt: Removed.
 ↑ ウイルス削除
/root/eicar_com.zip: Eicar-Test-Signature FOUND
 ↑ ウイルス検知
/root/eicar_com.zip: Removed.
 ↑ ウイルス削除
/root/eicarcom2.zip: Eicar-Test-Signature FOUND
 ↑ ウイルス検知
/root/eicarcom2.zip: Removed.
 ↑ ウイルス削除
----------- SCAN SUMMARY -----------
Infected files: 4
 ↑ 4つのウイルスを検知した
Time: 23.913 sec (0 m 23 s)

ウイルススキャン定期自動実行設定

[root@centos ~]# vi /etc/cron.daily/clamdscan
 ↑ ウイルススキャン日次実行スクリプト作成
#!/bin/sh
# 設定ファイル
CONFIG=/etc/clamd.d/scan.conf
# スキャン実行
# ※ウイルス検知時は隔離ディレクトリへ隔離
CLAMSCANLOG=`mktemp`
QUARANTINEDIR=/tmp/clamdscan-quarantinedir-$(date +%Y%m%d)
mkdir -p ${QUARANTINEDIR}
clamdscan -c ${CONFIG} --move=${QUARANTINEDIR} / > ${CLAMSCANLOG} 2>&1
# ウイルス検知時のみroot宛にメール通知
if [ -z "$(grep FOUND$ ${CLAMSCANLOG})" ]; then
    rm -rf ${QUARANTINEDIR}
else
    grep -A 1 FOUND$ ${CLAMSCANLOG} | mail -s "Virus Found in `hostname` => ${QUARANTINEDIR}" root
fi
# スキャンログをシスログに出力
cat ${CLAMSCANLOG} | logger -t $(basename ${0})
rm -f ${CLAMSCANLOG}
[root@centos ~]# chmod +x /etc/cron.daily/clamdscan
 ↑ ウイルススキャン日次実行スクリプトへ実行権限付加
[root@centos ~]# echo ExcludePath ^/proc/ >> /etc/clamd.d/scan.conf
 ↑ 例として/procディレクトリをスキャン対象外にする
[root@centos ~]# echo ExcludePath ^/sys/ >> /etc/clamd.d/scan.conf
 ↑ 例として/sysディレクトリをスキャン対象外にする
[root@centos ~]# systemctl restart clamd@scan
 ↑ clamd再起動(スキャン除外設定反映)

これで、毎日定期的に全ファイルのウイルススキャンが行われ、ウイルスを検知した場合のみroot宛にメールが送られてくるようになる。

ファイアウォール構築(iptables)

概要

Linuxサーバー上にファイアウォールを構築する。
ここでは、Linuxのパケットフィルタリング機能であるiptablesを使用して、Web等外部に公開するサービス以外のポートへのアクセスをブロックするようにする。
※通常はルーター側にもファイアウォール機能があるため、Linuxサーバー上でファイアウォールを構築後にポートを開放する場合は、ルーター側とLinuxサーバー側の2箇所でポート開放を行う必要があることに注意

iptables設定

[root@centos ~]# systemctl stop firewalld
↑ ファイアウォール停止
[root@centos ~]# systemctl disable firewalld
↑ ファイアウォール自動起動解除

[root@centos ~]# yum -y install iptables-services
 ↑ iptables-servicesインストール
[root@centos ~]# vi iptables.sh
 ↑ ファイアウォール設定スクリプト作成
#!/bin/bash
#---------------------------------------#
# 設定開始                              #
#---------------------------------------#
# 内部ネットワークアドレス定義
LOCALNET=192.168.1.0/24
#---------------------------------------#
# 設定終了                              #
#---------------------------------------#
# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
IPTABLES_CONFIG=`mktemp`
echo "*filter" >> $IPTABLES_CONFIG
echo ":INPUT DROP [0:0]" >> $IPTABLES_CONFIG       # 受信はすべて破棄
echo ":FORWARD DROP [0:0]" >> $IPTABLES_CONFIG     # 通過はすべて破棄
echo ":OUTPUT ACCEPT [0:0]" >> $IPTABLES_CONFIG    # 送信はすべて許可
echo ":ACCEPT_COUNTRY - [0:0]" >> $IPTABLES_CONFIG # 指定した国からのアクセスを許可
echo ":DROP_COUNTRY - [0:0]" >> $IPTABLES_CONFIG   # 指定した国からのアクセスを破棄
echo ":LOG_PINGDEATH - [0:0]" >> $IPTABLES_CONFIG  # Ping of Death攻撃はログを記録して破棄
# 自ホストからのアクセスをすべて許可
echo "-A INPUT -i lo -j ACCEPT" >> $IPTABLES_CONFIG
# 内部からのアクセスをすべて許可
echo "-A INPUT -s $LOCALNET -j ACCEPT" >> $IPTABLES_CONFIG
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
echo "-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT" >> $IPTABLES_CONFIG
# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done
# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done
# フラグメント化されたパケットはログを記録して破棄
echo "-A INPUT -f -j LOG --log-prefix \"[IPTABLES FRAGMENT] : \"" >> $IPTABLES_CONFIG
echo "-A INPUT -f -j DROP" >> $IPTABLES_CONFIG
# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
echo "-A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG
echo "-A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG
echo "-A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG
echo "-A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP" >> $IPTABLES_CONFIG
# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
echo "-A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT" >> $IPTABLES_CONFIG
echo "-A LOG_PINGDEATH -j LOG --log-prefix \"[IPTABLES PINGDEATH] : \"" >> $IPTABLES_CONFIG
echo "-A LOG_PINGDEATH -j DROP" >> $IPTABLES_CONFIG
echo "-A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH" >> $IPTABLES_CONFIG
# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
echo "-A INPUT -d 255.255.255.255 -j DROP" >> $IPTABLES_CONFIG
echo "-A INPUT -d 224.0.0.1 -j DROP" >> $IPTABLES_CONFIG
# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
echo "-A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset" >> $IPTABLES_CONFIG
# ACCEPT_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成
ACCEPT_COUNTRY_MAKE(){
    for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
    do
        echo "-A ACCEPT_COUNTRY -s $addr -j ACCEPT" >> $IPTABLES_CONFIG
    done
    grep ^$1 $IP_LIST >> $CHK_IP_LIST
}
# DROP_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成
DROP_COUNTRY_MAKE(){
    for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
    do
        echo "-A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix \"[IPTABLES DENY_COUNTRY] : \"" >> $IPTABLES_CONFIG
        echo "-A DROP_COUNTRY -s $addr -j DROP" >> $IPTABLES_CONFIG
    done
    grep ^$1 $IP_LIST >> $CHK_IP_LIST
}
# IPアドレスリスト取得
IP_LIST=/tmp/cidr.txt
CHK_IP_LIST=/tmp/IPLIST
if [ ! -f $IP_LIST ]; then
    wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
    gunzip -c cidr.txt.gz > $IP_LIST
    rm -f cidr.txt.gz
fi
rm -f $CHK_IP_LIST
# 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成
ACCEPT_COUNTRY_MAKE JP
# 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する
# 全国警察施設への攻撃元上位5カ国(日本・アメリカを除く)からのアクセスをログを記録して破棄
# 直近1週間の状況 http://www.npa.go.jp/cyberpolice/detect/observation.html
# 前月の状況 https://www.npa.go.jp/cyberpolice/detect/
# 国名と国コードの対応表 https://msdn.microsoft.com/ja-jp/library/ee783931(v=cs.10).aspx
DROP_COUNTRY_MAKE CN
DROP_COUNTRY_MAKE RU
DROP_COUNTRY_MAKE MX
DROP_COUNTRY_MAKE IN
DROP_COUNTRY_MAKE NL
echo "-A INPUT -j DROP_COUNTRY" >> $IPTABLES_CONFIG
#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから)               #
#----------------------------------------------------------#
# 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可
# ※SSHサーバーを公開する場合のみ
echo "-A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY" >> $IPTABLES_CONFIG
echo "-A INPUT -p tcp --dport 2222 -j ACCEPT_COUNTRY" >> $IPTABLES_CONFIG
# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
echo "-A INPUT -p tcp --dport 80 -j ACCEPT" >> $IPTABLES_CONFIG
# 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
echo "-A INPUT -p tcp --dport 443 -j ACCEPT" >> $IPTABLES_CONFIG
# 外部からのUDP500番ポート、UDP4500番ポート(L2TP over IPsec)へのアクセスを日本からのみ許可
# ※SoftEther VPN Serverを公開する場合のみ
echo "-A INPUT -p udp --dport 500 -j ACCEPT_COUNTRY" >> $IPTABLES_CONFIG
echo "-A INPUT -p udp --dport 4500 -j ACCEPT_COUNTRY" >> $IPTABLES_CONFIG
# 外部からのTCP5900番ポート(Spaice)へのアクセスを許可
echo "-A INPUT -p tcp --dport 5900 -j ACCEPT" >> $IPTABLES_CONFIG 
#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここまで)               #
#----------------------------------------------------------#
# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        echo "-I INPUT -s $ip -j DROP" >> $IPTABLES_CONFIG
    done
fi
# 上記のルールにマッチしなかったアクセスはログを記録して破棄
echo "-A INPUT -m limit --limit 1/s -j LOG --log-prefix \"[IPTABLES INPUT] : \"" >> $IPTABLES_CONFIG
echo "-A INPUT -j DROP" >> $IPTABLES_CONFIG
echo "-A FORWARD -m limit --limit 1/s -j LOG --log-prefix \"[IPTABLES FORWARD] : \"" >> $IPTABLES_CONFIG
echo "-A FORWARD -j DROP" >> $IPTABLES_CONFIG
# ファイアウォール設定反映
echo "COMMIT" >> $IPTABLES_CONFIG
cat $IPTABLES_CONFIG > /etc/sysconfig/iptables
if [ -f /usr/libexec/iptables/iptables.init ]; then
    /usr/libexec/iptables/iptables.init restart
else
    /etc/rc.d/init.d/iptables restart
fi
rm -f $IPTABLES_CONFIG

IPアドレスリスト更新チェック

IPアドレスリストは頻繁に更新されるので、毎日自動でIPアドレスリストの更新有無をチェックし、更新がある場合はファイアウォール設定スクリプトを再起動するようにする。

[root@centos ~]# vi /etc/cron.daily/iplist_check.sh
 ↑ IPアドレスリストチェックスクリプト作成
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 新旧IPLIST差分チェック件数(0を指定するとチェックしない)
# ※新旧IPLIST差分がSABUN_CHKで指定した件数を越える場合はiptables設定スクリプトを実行しない
# ※新旧IPLIST差分チェック理由はhttp://centossrv.com/bbshtml/webpatio/1592.shtmlを参照
SABUN_CHK=100
[ $# -ne 0 ] && SABUN_CHK=${1}
# IPアドレスリスト取得
IP_LIST=/tmp/cidr.txt
CHK_IP_LIST=/tmp/IPLIST
wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip -c cidr.txt.gz > $IP_LIST
rm -f cidr.txt.gz
# チェック対象IPアドレスリスト最新化
rm -f IPLIST.new
for country in `awk '{print $1}' $CHK_IP_LIST |uniq`
do
    grep ^$country $IP_LIST >> IPLIST.new
done
# チェック対象IPアドレスリスト更新チェック
diff -q $CHK_IP_LIST IPLIST.new > /dev/null 2>&1
if [ $? -ne 0 ]; then
    if [ ${SABUN_CHK} -ne 0 ]; then
        if [ $(diff $CHK_IP_LIST IPLIST.new | egrep -c '<|>') -gt ${SABUN_CHK} ]; then
            (
             diff $CHK_IP_LIST IPLIST.new
             echo
             echo "iptables.sh not executed."
            ) | mail -s 'IPLIST UPDATE' root
            rm -f IPLIST.new
            exit
        fi
    fi
    /bin/mv IPLIST.new $CHK_IP_LIST
    sh /root/iptables.sh > /dev/null
else
    rm -f IPLIST.new
fi
[root@centos ~]# chmod +x /etc/cron.daily/iplist_check.sh
 ↑ IPアドレスリストチェックスクリプトに実行権限付加

※CRONより/root/iptables.sh not executed.という内容のメールが届いた場合の対処
なんらかの理由で、http://nami.jp/ipv4bycc/ から取得した最新のIPアドレスリストと、前回取得したIPアドレスリストとの差分が100件を超えたため、iptables設定スクリプトを実行しなかったことを示す。
サーバーを長時間停止していた等、前回取得したIPアドレスリストとの差分が100件を超える理由が明確な場合には、「/etc/cron.daily/iplist_check.sh 0」と実行することにより強制的にiptables設定スクリプトを実行する。

iptables起動

[root@centos ~]# sh iptables.sh
 ↑ ファイアウォール設定スクリプト実行
 ↑ ※注意 ERRORが出た場合何らかの理由により既にiptablesのデーモンが起動しているので以下のコマンドを使用して終了させてから上記のコマンドを実行しなおすこと。
 ↑ systemctl stop iptables
[root@centos ~]# systemctl enable iptables
 ↑ iptables自動起動設定

iptables確認

Shields UP! - Internet Vulnerability Profilingで「Proceed」ボタン(2つあるがどちらでもよい)をクリック⇒「All Service Ports」ボタンをクリックして、外部からのアクセスを許可または拒否応答しているポートのみOPENまたはCLOSEDで、その他のポートはSTEALTHであることを確認

外部からドメイン名でサーバーにアクセスできるようにする


概要

外部からcentossrv.dip.jpという名前(ドメイン名)でサーバーにアクセスできるようにするため、ドメイン名を取得する。 ここでは無料・ダイナミックDNS(DDNS)サービス - ieServer.Netのサービスを利用してcentossrv.dip.jpというドメイン名を取得する。 ※centossrv.dip.jpは当サイトの例なので、各自で置き換えること

ドメイン名取得

以下の要領でユーザー登録する。 ユーザー名(サブドメイン名):任意のサブドメイン名を入力※例:centossrv.dip.jpのcentossrvにあたる部分 ドメイン名:希望するドメイン名を選択※例:centossrv.dip.jpのdip.jpにあたる部分 電子メールアドレス:自分のメールアドレスを入力 パスワード:任意のパスワードを入力 パスワード(再入力):任意のパスワードを再入力

IPアドレスの自動更新

固定IPアドレス環境の場合、不定期にIPアドレスが変わってしまうが、IPアドレスが無料・ダイナミックDNS(DDNS)サービス - ieServer.Netに登録したIPアドレスと変わってしまうとcentossrv.dip.jpでサーバーにアクセスできなくなってしまう。 そこで、IPアドレスが変わった契機に自動で無料・ダイナミックDNS(DDNS)サービス - ieServer.Netへ新しいIPアドレスを更新してくれるソフトであるDiCEを使用して、常にcentossrv.dip.jpでサーバーにアクセスできるようにする。 固定IPアドレス環境の場合でも、一定期間IPアドレス更新処理が行われないとドメインが削除されてしまうため、DiCEを使用して定期的にIPアドレスの更新処理を自動で行なうようにする。

[root@centos ~]# mkdir /usr/local/ddns
[root@centos ~]# vi /usr/local/ddns/ddns-update.pl
 ↑ ipアドレス自動更新スクリプト
#!/usr/bin/perl

# ieServer.Net 専用 DDNS IP アドレス更新スクリプト - ddns-update.pl
# 作成者:山本恭弘@Agora Inc. 作成日:2004/03/24
#
# 回線割り当てグローバルIPアドレスを確認し、変化があれば新IPアドレスを
# DDNSに登録。当コマンドを一定の間隔で実行し、IPアドレスの変化を監視&
# 更新処理する。利用には perl wget cron が利用可能である必要あり。
#
# 回線に割り当てられた IPアドレス は http://ieserver.net/ipcheck.shtml
# へのアクセスによって確認。
#
# cron にて当コマンドを等間隔で実行し、回線IPを確認。変化があればDDNSに
# IPアドレスを登録。DDNSサーバーへの負荷軽減の点から実行間隔は10分以上と
# すること。
# crontab設定例(/usr/local/ddns/ddns.plにスクリプトを置き10分間隔で実行)
# 5,15,25,35,45,55 * * * * /usr/local/ddns/ddns-update.pl

# 以下2ファイルの配置ディレクトリは好みに応じ設定
# 1. 設定IPアドレスワークファイル
$CURRENT_IP_FILE = "current_ip";

#  2. 設定状況ログファイル
$LOG_FILE        = "ip_update.log";

# 回線IP確認ページURL
$REMOTE_ADDR_CHK = "http://ieserver.net/ipcheck.shtml";
# DDNS更新ページURL
# wgetをSSL接続可能でビルドしているなら、https:// での接続を推奨
$DDNS_UPDATE     = "http://ieserver.net/cgi-bin/dip.cgi";

# ieServer.Netにて取得したアカウント(サブドメイン)情報を記入
$ACCOUNT         = "     ";     # アカウント(サブドメイン)名設定
$DOMAIN          = "     ";     # ドメイン名設定
$PASSWORD        = "     ";     # パスワード設定

if(!open(FILE,"$CURRENT_IP_FILE")) {
    $CURRENT_IP = '0.0.0.0';
    } else {
    $CURRENT_IP = <FILE>;
    close FILE;
}

$NEW_IP = '0.0.0.0';
$NEW_IP = `wget -q -O - $REMOTE_ADDR_CHK`;

if ($NEW_IP ne "0.0.0.0" and $CURRENT_IP ne $NEW_IP) {

    $STATUS = `wget -q -O - '$DDNS_UPDATE?username=$ACCOUNT&domain=$DOMAIN&password=$PASSWORD&updatehost=1'`;
    
    if ($STATUS =~ m/$NEW_IP/) {    
        open (FILE ,">$CURRENT_IP_FILE");
        print FILE $NEW_IP;
        close FILE;
        $TIME = localtime;
        open (FILE ,">>$LOG_FILE");
        print FILE "$TIME $ACCOUNT.$DOMAIN Updated $CURRENT_IP to $NEW_IP\n";
        close FILE;
    } else {
        $TIME = localtime;
        open (FILE ,">>$LOG_FILE");
        print FILE "$TIME $ACCOUNT.$DOMAIN Update aborted $CURRENT_IP to $NEW_IP\n";
        close FILE;
    }
}
exit;
[root@centos ~]# dhmod 777 /usr/local/ddns/ddns-update.pl
[root@centos ~]# crontab -e
5,15,25,35,45,55 * * * * /usr/local/ddns/ddns-update.pl
 ↑ 追記する。
ドメイン名確認

設定したサーバー名で外部からアクセスできるか確認する。 ドメイン取得後24~48時間程度経過後に行うこと(すぐアクセスできる場合もある) Free Monitoring Test Toolsの「Select Test Type」欄で「HostName Test」を選択、「Enter Test Target」欄に設定したサーバー名(例:centossrv.dip.jp)を入力して「Perform Test」ボタンを押下する。 以下のような結果が表示されればOK

Hostname test results
Domain name tested: centossrv.dip.jp
Test performed from: Washington, DC
Test performed at: Thu, 02 Nov 2006 00:45:01 GMT
Known IP Addresses: XXX.XXX.XXX.XXX

仮想マシンの作成


VirtManagerを利用した仮想マシンの構築を行います。

環境設定

仮想マシン用アカウントを作成します。

[root@host ~]# useradd -m VMManager
[root@host ~]# passwd VMManager

仮想マシン用のデータ置き場を作成します。

[root@host ~]# su - VMManager
[VMManager@host ~]# mkdir /home/VMManager/writeableVirtualStorage
[VMManager@host ~]# mkdir /home/VMManager/readOnlyVirtualStorage
exit

仮想マシンの作成

WinSCPを使用して各種データのアップロードを行います。
その後Virt-Managerを使用して仮想マシンを作成しましょう。
注意点
* ディスプレイのアドレス(アクセスに使用するアドレス)はすべてのインターフェイスに設定しましょう。
* ディスプレイのポートは固定設定にしましょう。また、今回の手順では5900以外のポートは公開設定なっていません。
新しく仮想マシンを作成する際は、iptableの設定を新たに追加しなければなりません。

iptables -A INPUT -p tcp --dport 5901 -j ACCEPT