CentOSによるサーバー構築忘備録

RedHatLinuxは有償版しか無くなってしまったのでCentOSで構築する事にします。

CentOS 8 を早々にインストール

Server World
UnixPower on Networking
さんを参考する事にしました。
Server Worldさん、UnixPower on Networkingさん 先人の方々に感謝します。
とても親切に分かり易く解説されていますのでそのまままねしてもOKなくらいです。

Red Hat Enterprise Linux release 8.1 Beta
RHEL8.1 Betaを試してみた
RHEL8でHAIKは動くのかな?
RHEL8 TLSのバージョンはどうなの
オープンソースの顧客管理システムL03

CentOS 7 をインストール
DNSサーバー(bind) をインストール
Sophos Anti-Virus for Linux をインストール
OpenLDAP のインストール
独自CAの認証書
Postfix スパム対策の設定
Postfix バーチャルメールボックスの設定
CentOS 7 Apache http/2 対応
顧客管理システムのカスタマイズ備忘録
CentOS 7 FTPサーバー
CentOS 7 メールサーバーのまとめ
DB冗長化 MySQL
DB冗長化 PostgreSQL
postfixのバーチャルメールボックス環境でコマンド実行させる方法
DKIM (Domainkeys Identified Mail)
SpamAssassinで迷惑メールを拒否する

CentOSによるサーバー運用忘備録

DataBaseのバックアップ、リストアについて
バックアップは比較的に取ると思いますが、リストアの機会があまりないので備忘録です。

バックアップ

PostgreSQL

# su - postgres

フルバックアップ
$ pg_dumpall -f backup.sql

特定のデータベースのみの場合
$ pg_dump testdb > testdb.sql
or
$ pg_dump testdb -f testdb.sql

Mysql

特定のデータベースのみの場合
# mysqldump -u root -p -B testdb >testdb.sql
# mysqldump -u root -p -x --allow-keywords mysql >user.sql

フルバックアップ
# mysqldump -u root -p -A >backup.sql

リストア

PostgreSQL

# su - postgres
$ psql -f bakup.sql
or
$ psql < bakup.sql

$ dropdb testdb
$ createdb -E [文字コード] -U [user] testdb 
$ psql -e testdb -f testdb.sql
or
$ psql -e testdb < testdb.sql

Mysql

特定のデータベース
# mysql -u root -p < testdb.sql
# mysql -u root -p mysql < user.sql

フルリストア
# mysql -u root -p < backup.sql

CentOS 7 でiptables

CentOS7からファイアウォールサービスがiptablesからFirewalldに変更されました。
Firewalldは内部的に従来の iptablesを使用しているようなのですが、ファイアウォールルール数が増えて7000ぐらいになってからCPU使用率が異常に上がり、さらにはReloadに時間がかかってしまうようになりました。
そこで、旧来のiptablesに戻すことにしました。iptablesもルール数が4000を超えるとスループットが下がるそうですが、20000ルールエントリしてもCPU使用率が上がっていないので結果的ですがシステム全体のスループットが改善されました。
これは主に中国からの攻撃が日増しに増えて該当のIPを自動登録するように対応していた背景があり、これに対する処置です。

まずはiptablesを利用できるようにします。

# yum -y install iptables-services

基本的なルールを追加します。

$LOCALNET=xxx.xxx.xxx.xxx/32    # 自ホストのIPアドレス
$IPTABLES_CONFIG=/tmp/iptables

echo "*filter" >> $IPTABLES_CONFIG # iptablesを作成するテンポラリ

# 基本ポリシー # 受信、通過はすべて破棄、送信はすべて許可
echo ":INPUT DROP [0:0]" >> $IPTABLES_CONFIG
echo ":FORWARD DROP [0:0]" >> $IPTABLES_CONFIG
echo ":OUTPUT ACCEPT [0:0]" >> $IPTABLES_CONFIG

# 指定した国からのアクセスを破棄
echo ":DROP_COUNTRY - [0:0]" >> $IPTABLES_CONFIG
# Ping of Death攻撃はログを記録して破棄
echo ":LOG_PINGDEATH - [0:0]" >> $IPTABLES_CONFIG

# 自ホストからのアクセスをすべて許可
echo "-A INPUT -i lo -j ACCEPT" >> $IPTABLES_CONFIG

# 内部からのアクセスをすべて許可
echo "-A INPUT -s $LOCALNET -j ACCEPT" >> $IPTABLES_CONFIG

# フラグメント化されたパケットはログを記録して破棄
echo "-A INPUT -f -j LOG --log-prefix \"[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 \"[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

特定の国ごと拒否するルールを作成

# 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

# DROP_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成
IP_LIST=/tmp/cidr.txt
CHK_IP_LIST=/tmp/IPLIST
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 \"[DENY_COUNTRY] : \"" >> $IPTABLES_CONFIG
        echo "-A DROP_COUNTRY -s $addr -j DROP" >> $IPTABLES_CONFIG
    done
    grep ^$1 $IP_LIST >> $CHK_IP_LIST
}

# 拒否したい国コードを指定して作成する 
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

各種サービスを公開するルール

# DNSサーバー(DOMAIN)
echo "-A INPUT -p tcp --dport 53 -j ACCEPT" >> $IPTABLES_CONFIG
echo "-A INPUT -p udp --dport 53 -j ACCEPT" >> $IPTABLES_CONFIG

# Webサーバー(HTTP)
echo "-A INPUT -p tcp --dport 80 -j ACCEPT" >> $IPTABLES_CONFIG
 
# Webサーバー(HTTPS)
echo "-A INPUT -p tcp --dport 443 -j ACCEPT" >> $IPTABLES_CONFIG
 
# FTPサーバー(ACTIVE)
echo "-A INPUT -p tcp --dport 20 -j ACCEPT" >> $IPTABLES_CONFIG
echo "-A INPUT -p tcp --dport 21 -j ACCEPT" >> $IPTABLES_CONFIG
# FTPサーバー(PASSIVE)
echo "-A INPUT -p tcp --dport 12000:14000 -j ACCEPT" >> $IPTABLES_CONFIG

# SMTPサーバー(SMTP)
echo "-A INPUT -p tcp --dport 25 -j ACCEPT" >> $IPTABLES_CONFIG

# SMTPサーバー(SUBMISSION)
echo "-A INPUT -p tcp --dport 587 -j ACCEPT" >> $IPTABLES_CONFIG

# SMTPSサーバー(SMTPS)
echo "-A INPUT -p tcp --dport 465 -j ACCEPT" >> $IPTABLES_CONFIG

# POP3サーバー(POP3)
echo "-A INPUT -p tcp --dport 110 -j ACCEPT" >> $IPTABLES_CONFIG

# POP3Sサーバー(POP3S)
echo "-A INPUT -p tcp --dport 995 -j ACCEPT" >> $IPTABLES_CONFIG

# IMAPサーバー(IMAP)
echo "-A INPUT -p tcp --dport 143 -j ACCEPT" >> $IPTABLES_CONFIG

# IMAPSサーバー(IMAPS)
echo "-A INPUT -p tcp --dport 993 -j ACCEPT" >> $IPTABLES_CONFIG

# NTPサーバー(TIME)
echo "-A INPUT -p udp -m udp --dport 123 -j ACCEPT" >> $IPTABLES_CONFIG

特定のホストのみ許可するルール

# SSH
echo "-A INPUT -p tcp -s xxx.xxx.xxx.xxx/32 --dport 22 -j ACCEPT" >> $IPTABLES_CONFIG

ルールにマッチしない場合はログを記録して破棄

echo "-A INPUT -m limit --limit 1/s -j LOG --log-prefix \"[IPTABLES INPUT DROP] : \"" >> $IPTABLES_CONFIG
echo "-A INPUT -j DROP" >> $IPTABLES_CONFIG
echo "-A FORWARD -m limit --limit 1/s -j LOG --log-prefix \"[IPTABLES FORWARD DROP] : \"" >> $IPTABLES_CONFIG
echo "-A FORWARD -j DROP" >> $IPTABLES_CONFIG

# ルール確定
echo "COMMIT" >> $IPTABLES_CONFIG

ファイアウォール設定反映

cat $IPTABLES_CONFIG > /etc/sysconfig/iptables
rm -f $IPTABLES_CONFIG

# systemctl stop firewalld
# systemctl start iptables
# systemctl enable iptables
# systemctl disable firewalld

謝辞

特定の国からの通信をDROPするルール等は下記サイトを参考にさせて頂きました。(先人に感謝です)

参考にさせて頂きましたサイト
Office Nami 世界の国別 IPv4 アドレス割り当てリスト
MAKIZOU.COM サーバー設定 iptables(中韓越遮断)編 – さくらのVPS
植草家のホームページ 国別: IPリスト, でもって, 念のため, 掲載 - 巻き戻し中。(2012-09-09)

参考になるサイト
 @police 警視庁セキュリティーポータル
 インターネット定点観測 直近1週間の状況
 インターネット定点観測 前月の状況
 Microsoft Developer Network
 国名と国コードの対応表