ファイアウォール

iptablesによるファイアウォールを設定する。
iptablesについてはたくさん資料があるのでそのあたりも参考にしつつ、以下のように設定した。

LOCALNET=192.168.11.0/255.255.255.0
MY_SSHD_CONFIG=/etc/ssh/sshd_config
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Loopback
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 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

# フラグメント化されたパケットはログを記録して破棄
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP

# 外部とのNetBIOS関連、Dropbox関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445,17500 -j DROP
iptables -A INPUT -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445,17500 -j DROP
iptables -A OUTPUT -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445,17500 -j DROP
iptables -A OUTPUT -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445,17500 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# ポートスキャン対策
iptables -N LOG_PORTSCAN
iptables -A LOG_PORTSCAN -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A LOG_PORTSCAN -j LOG --log-level info --log-prefix '[IPTABLES PORTSCAN] '
iptables -A LOG_PORTSCAN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j LOG_PORTSCAN

# 不正パケット対策
iptables -N LOG_NEWSYNCHECK
iptables -A LOG_NEWSYNCHECK -j LOG --log-prefix '[IPTABLES NEWSYNCHECK] '
iptables -A LOG_NEWSYNCHECK -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG_NEWSYNCHECK

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# 確立に成功した tcp 接続は許可
iptables -A INPUT  -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# Ping 送受信
iptables -A INPUT  -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT  -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

# DNS 送信
iptables -A INPUT  -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
# DHCP 許可
iptables -A INPUT -p udp --sport 68 -j ACCEPT

# HTTP, HTTPS, POP3(SSL), IMAP, SMTP(TLS/STARTTLS, SSL), git, hkp, whois 送受信
iptables -A OUTPUT -p tcp -m state --state NEW -m multiport --dports 80,443,995,993,587,465,9418,11371,43 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m multiport --dports 80,443,995,993,587,465,9418,11371,43 -j ACCEPT
# HTTP 受信
#iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT

# SSH 受信 / ブルートフォース攻撃対策
# sshd_config ファイルの中からポート番号を指定している箇所を探す
SSHD_LISTEN_PORT=`sed -e 's/^Port\s\+\([0-9]\+\)/\1/p' -e d $MY_SSHD_CONFIG`
iptables -N LOG_SSHBRUTEFORCE
iptables -A LOG_SSHBRUTEFORCE -m limit --limit 3/min --limit-burst 4 -j ACCEPT
iptables -A LOG_SSHBRUTEFORCE -j LOG --log-level info --log-prefix '[IPTABLES SSHBRUTEFORCE] '
iptables -A LOG_SSHBRUTEFORCE -j DROP
if [ $SSHD_LISTEN_PORT = ""];then
	echo "SSHD_LISTEN_PORT is null"
else
	iptables -A INPUT -p tcp -m state --state NEW --dport $SSHD_LISTEN_PORT -j LOG_SSHBRUTEFORCE
fi
# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        iptables -I INPUT -s $ip -j DROP
    done
fi

# 上記のルールにマッチしなかったアクセスで外部からのものはログを記録(その後自動的に破棄)
iptables -A INPUT -s $LOCALNET  -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES NOMATCHINPUT] '

実際はこの設定とは少し違います。
各自の環境に合わせて適宜修正すれば十分利用できると思います。

最近はNftablesがあるみたいなので、そっちも調べてみようと思っています。

特定のユーザーだけに許可を与える

PAM の pam_wheel.so は wheel グループに入っているユーザーだけに su を使用したログインを許可する。
/etc/pam.d/su
/etc/pam.d/su-l
の両方を編集して次の行をアンコメントする。

# Uncomment the following line to require a user to be in the "wheel" group.
auth		required	pam_wheel.so use_uid

3回ログインを失敗したユーザーをロックアウトする

指定した回数ログインに失敗したらロックアウトすることでセキュリティを高める。
/etc/pam.d/system-loginを編集することで設定できる。
3回ログインを失敗したユーザーを10分間ログインできないようにする。

auth required pam_tally.so onerr=succeed file=/var/log/faillog

コメントアウトし、

auth required pam_tally.so deny=2 unlock_time=600 onerr=succeed file=/var/log/faillog

を追加する。
書き換えでも問題ないと思うが、設定を戻したくなったときに元が何かわからないと困るため、コメントアウトしておく。

対策

kworkerの中でも何がCPUの使用率を上げているのか調べる。

grep . -r /sys/firmware/acpi/interrupts/

私の場合は以下のように出力された。

/sys/firmware/acpi/interrupts/ff_gbl_lock:       0   enabled
/sys/firmware/acpi/interrupts/gpe15:       0   invalid
/sys/firmware/acpi/interrupts/gpe4F:       0   invalid
/sys/firmware/acpi/interrupts/gpe43:       0   invalid
/sys/firmware/acpi/interrupts/gpe7D:       0   invalid
/sys/firmware/acpi/interrupts/gpe71:       0   invalid
/sys/firmware/acpi/interrupts/gpe05:       0   invalid
/sys/firmware/acpi/interrupts/gpe3F:       0   invalid
/sys/firmware/acpi/interrupts/gpe33:       0   invalid
/sys/firmware/acpi/interrupts/gpe6D:       0   disabled
/sys/firmware/acpi/interrupts/gpe61:       0   enabled
/sys/firmware/acpi/interrupts/gpe2F:       0   invalid
/sys/firmware/acpi/interrupts/gpe23:       0   invalid
/sys/firmware/acpi/interrupts/gpe5D:       0   invalid
/sys/firmware/acpi/interrupts/gpe51:       0   invalid
/sys/firmware/acpi/interrupts/gpe1F:       0   invalid
/sys/firmware/acpi/interrupts/gpe13:       0   invalid
/sys/firmware/acpi/interrupts/gpe4D:       0   invalid
/sys/firmware/acpi/interrupts/gpe41:       0   invalid
/sys/firmware/acpi/interrupts/gpe7B:       0   invalid
/sys/firmware/acpi/interrupts/gpe0F:       0   invalid
/sys/firmware/acpi/interrupts/gpe03:       0   invalid
/sys/firmware/acpi/interrupts/gpe3D:       0   invalid
/sys/firmware/acpi/interrupts/gpe31:       0   invalid
/sys/firmware/acpi/interrupts/gpe6B:       0   invalid
/sys/firmware/acpi/interrupts/gpe2D:       0   invalid
/sys/firmware/acpi/interrupts/gpe21:       0   invalid
/sys/firmware/acpi/interrupts/gpe5B:       0   invalid
/sys/firmware/acpi/interrupts/gpe1D:       0   invalid
/sys/firmware/acpi/interrupts/gpe78:       0   invalid
/sys/firmware/acpi/interrupts/gpe11:       0   invalid
/sys/firmware/acpi/interrupts/gpe4B:       0   invalid
/sys/firmware/acpi/interrupts/ff_pwr_btn:       0   enabled
/sys/firmware/acpi/interrupts/ff_slp_btn:       0   invalid
/sys/firmware/acpi/interrupts/gpe0D:       0   invalid
/sys/firmware/acpi/interrupts/gpe68:       0   invalid
/sys/firmware/acpi/interrupts/gpe01:       0   invalid
/sys/firmware/acpi/interrupts/ff_pmtimer:       0   invalid
/sys/firmware/acpi/interrupts/gpe3B:       0   invalid
/sys/firmware/acpi/interrupts/gpe58:       0   invalid
/sys/firmware/acpi/interrupts/gpe2B:       0   invalid
/sys/firmware/acpi/interrupts/gpe48:       0   invalid
/sys/firmware/acpi/interrupts/gpe1B:       0   invalid
/sys/firmware/acpi/interrupts/gpe76:       0   invalid
/sys/firmware/acpi/interrupts/gpe38:       0   invalid
/sys/firmware/acpi/interrupts/gpe0B:       0   invalid
/sys/firmware/acpi/interrupts/gpe66:       0   enabled
/sys/firmware/acpi/interrupts/gpe28:       0   invalid
/sys/firmware/acpi/interrupts/gpe56:       0   invalid
/sys/firmware/acpi/interrupts/gpe18:       0   invalid
/sys/firmware/acpi/interrupts/gpe46:       0   invalid
/sys/firmware/acpi/interrupts/gpe74:       0   invalid
/sys/firmware/acpi/interrupts/gpe08:       0   invalid
/sys/firmware/acpi/interrupts/sci: 2513869
/sys/firmware/acpi/interrupts/gpe36:       0   invalid
/sys/firmware/acpi/interrupts/gpe64:       0   invalid
/sys/firmware/acpi/interrupts/gpe26:       0   invalid
/sys/firmware/acpi/interrupts/error:       0
/sys/firmware/acpi/interrupts/gpe54:       0   invalid
/sys/firmware/acpi/interrupts/gpe16:       0   invalid
/sys/firmware/acpi/interrupts/gpe44:       0   invalid
/sys/firmware/acpi/interrupts/gpe7E:       0   invalid
/sys/firmware/acpi/interrupts/gpe72:       0   invalid
/sys/firmware/acpi/interrupts/gpe06:       0   invalid
/sys/firmware/acpi/interrupts/ff_rt_clk:       0   disabled
/sys/firmware/acpi/interrupts/gpe34:       0   invalid
/sys/firmware/acpi/interrupts/gpe6E:       0   invalid
/sys/firmware/acpi/interrupts/gpe62:       0   enabled
/sys/firmware/acpi/interrupts/gpe24:       0   invalid
/sys/firmware/acpi/interrupts/gpe5E:       0   invalid
/sys/firmware/acpi/interrupts/gpe52:       0   invalid
/sys/firmware/acpi/interrupts/gpe14:       0   invalid
/sys/firmware/acpi/interrupts/gpe4E:       0   invalid
/sys/firmware/acpi/interrupts/gpe42:       0   invalid
/sys/firmware/acpi/interrupts/gpe7C:       0   invalid
/sys/firmware/acpi/interrupts/gpe70:       0   invalid
/sys/firmware/acpi/interrupts/gpe04:       0   invalid
/sys/firmware/acpi/interrupts/gpe3E:       0   invalid
/sys/firmware/acpi/interrupts/gpe32:       0   invalid
/sys/firmware/acpi/interrupts/gpe6C:       0   invalid
/sys/firmware/acpi/interrupts/gpe60:       0   invalid
/sys/firmware/acpi/interrupts/gpe2E:       0   invalid
/sys/firmware/acpi/interrupts/gpe22:       0   invalid
/sys/firmware/acpi/interrupts/gpe5C:       0   invalid
/sys/firmware/acpi/interrupts/gpe50:       0   invalid
/sys/firmware/acpi/interrupts/gpe1E:       0   invalid
/sys/firmware/acpi/interrupts/gpe79:       0   invalid
/sys/firmware/acpi/interrupts/gpe12:       0   invalid
/sys/firmware/acpi/interrupts/gpe4C:       0   invalid
/sys/firmware/acpi/interrupts/gpe40:       0   invalid
/sys/firmware/acpi/interrupts/gpe7A:       0   invalid
/sys/firmware/acpi/interrupts/gpe0E:       0   invalid
/sys/firmware/acpi/interrupts/gpe69:       0   disabled
/sys/firmware/acpi/interrupts/gpe02:       0   invalid
/sys/firmware/acpi/interrupts/gpe3C:       0   invalid
/sys/firmware/acpi/interrupts/gpe30:       0   invalid
/sys/firmware/acpi/interrupts/gpe6A:       0   invalid
/sys/firmware/acpi/interrupts/gpe59:       0   invalid
/sys/firmware/acpi/interrupts/gpe2C:       0   invalid
/sys/firmware/acpi/interrupts/gpe20:       0   invalid
/sys/firmware/acpi/interrupts/gpe5A:       0   invalid
/sys/firmware/acpi/interrupts/gpe49:       0   invalid
/sys/firmware/acpi/interrupts/gpe1C:       0   invalid
/sys/firmware/acpi/interrupts/gpe77:       0   invalid
/sys/firmware/acpi/interrupts/gpe10:       0   invalid
/sys/firmware/acpi/interrupts/gpe4A:       0   invalid
/sys/firmware/acpi/interrupts/gpe39:       0   invalid
/sys/firmware/acpi/interrupts/gpe0C:       0   invalid
/sys/firmware/acpi/interrupts/gpe67:       0   enabled
/sys/firmware/acpi/interrupts/gpe00:       0   invalid
/sys/firmware/acpi/interrupts/gpe3A:       0   invalid
/sys/firmware/acpi/interrupts/gpe29:       0   invalid
/sys/firmware/acpi/interrupts/gpe57:       0   invalid
/sys/firmware/acpi/interrupts/gpe2A:       0   invalid
/sys/firmware/acpi/interrupts/gpe19:       0   invalid
/sys/firmware/acpi/interrupts/gpe47:       0   invalid
/sys/firmware/acpi/interrupts/gpe1A:       0   invalid
/sys/firmware/acpi/interrupts/gpe75:       0   invalid
/sys/firmware/acpi/interrupts/gpe09:       0   invalid
/sys/firmware/acpi/interrupts/gpe37:       0   invalid
/sys/firmware/acpi/interrupts/gpe0A:       0   invalid
/sys/firmware/acpi/interrupts/gpe65:       0   invalid
/sys/firmware/acpi/interrupts/gpe27:       0   invalid
/sys/firmware/acpi/interrupts/gpe55:       0   invalid
/sys/firmware/acpi/interrupts/gpe17:       0   disabled
/sys/firmware/acpi/interrupts/gpe45:       0   invalid
/sys/firmware/acpi/interrupts/gpe7F:       0   invalid
/sys/firmware/acpi/interrupts/sci_not:       0
/sys/firmware/acpi/interrupts/gpe73:       0   invalid
/sys/firmware/acpi/interrupts/gpe07:       0   invalid
/sys/firmware/acpi/interrupts/gpe35:       0   invalid
/sys/firmware/acpi/interrupts/gpe6F: 2513871   enabled
/sys/firmware/acpi/interrupts/gpe63:       0   invalid
/sys/firmware/acpi/interrupts/gpe25:       0   invalid
/sys/firmware/acpi/interrupts/gpe5F:       0   invalid
/sys/firmware/acpi/interrupts/gpe_all: 2513871
/sys/firmware/acpi/interrupts/gpe53:       0   invalid

gpe6Fが数字が大きく、enabledになっており、これがCPU使用率を上げている。

以下のコマンドを実行することで、CPU使用率は下がる。

su
echo "disable" > /sys/firmware/acpi/interrupts/gpe6F

しかしこれでは起動するたびに同じコマンドを実行してやらなければ改善されないので、crontabで起動時に自動実行されるようにする。

su
crontab -e

crontabのエディタはviらしいので、操作はviと同じ。
空のファイルが開かれるので、

@reboot echo "disable" > /sys/firmware/acpi/interrupts/gpe6F

を追加する。

Arch Linuxで一つのCPU使用率が100%付近になる問題の対策

CPU使用率をモニタリングしていたら、ある一つのCPU使用率だけ100%付近になっていました。
さくっと調べてみるとkwokerというプロセスが原因らしい。
対策方法はArch Linuxwikiにあったけど、少しハマったので記事にする。

grubでsyntax errorが出た

windows10をgrubで表示させようとして、いじっていたら何かやらかしたらしく、syntax errorが出るようになってしまった。
ちょっと調べてみると、/etc/default/grubGRUB_DISABLE_SUBMENU=yを追加すればいいらしい。

# vim /etc/default/grub

GRUB_DISABLEなんちゃらと書かれている下に、

GRUB_DISABLE_SUBMENU=y

を追加して保存。
これでも駄目だった。

もう少し調べてみると、
/boot/grub/grub.cfg.new
/boot/grub/grub.cfg
/etc/grub.d/*
をいじらないといけないらしい。

まずは/boot/grub/grub.cfg.newを編集する。

if [ "${grub_platform}" == "pc" ]; then
fi

のようになっているところを、

if [ "${grub_platform}" == "pc" ]; then
        :
fi

のようにする。「:」が抜けているのがいけないっぽい。
/boot/grub/grub.cfgと/etc/grub.d/*も同じように編集する。
/etc/grub.d/*は全てのファイルを確認すること。

これでsyntax errorが出なくなった。