Debian 10 + nftables + fail2ban

はじめに

インストールはこちら

nftablesを使ったアクセス制御はこちら

fail2banとは

ログを監視してTCPで提供されているサービスに過剰にアクセスしてくるIPアドレスを一定時間アクセスさせないようにするソフトウェア。

Debian 10での注意点

Debian 9まではiptablesで動いており、Debian 10でもデフォルトの設定はiptablesベースになっている。このため、nftablesを使ってアクセス制御をしている場合には、適宜設定変更をしてあげないといけない。

fail2banのインストールと設定

インストールする。

% sudo apt install fail2ban

設定ファイルは /etc/fail2ban以下におかれる構成は以下の通り。

% ls -1
action.d/ 
fail2ban.conf
fail2ban.d/
filter.d/
jail.conf
jail.d/
paths-arch.conf
paths-common.conf
paths-debian.conf
paths-opensuse.conf

jail.conf を編集する。 ignoreipで監視対象外のIPアドレスを指定し、banactionとbanaction_allportsでiptablesからnftablesを使うように設定を変更する。

% cd /etc/fail2ban
% sudo cp -p jail.conf jail.conf.org
% sudo vi jail.conf
% iff jail.conf.org jail.conf
54a55
> ignoreip = 127.0.0.1/8 ::1 XXX.XXX.XXX.XXX/24  # 監視対象外のIPアドレス
167,168c168,171
< banaction = iptables-multiport
< banaction_allports = iptables-allports
---
> #banaction = iptables-multiport
> banaction = nftables-multiport
> #banaction_allports = iptables-allports
> banaction_allports = nftables-allports

Debian 10では標準でsshがfail2banの監視対象となっている。どのポート(サービス)を監視するのかは jail.confにサービスと設定の一覧があるので、それを利用する。たとえば、 SMTP, SMTP AUTH, POP3, POP3Sなどをまとめて監視する postfix-sasl は /etc/jail.conf に以下のように定義されている。

[postfix-sasl]

filter   = postfix[mode=auth]
port     = smtp,465,submission,imap,imaps,pop3,pop3s
# You might consider monitoring /var/log/mail.warn instead if you are
# running postfix since it would provide the same log lines at the
# "warn" level but overall at the smaller filesize.
logpath  = %(postfix_log)s
backend  = %(postfix_backend)s

これを有効にする場合には以下のように /etc/jail.d/以下にファイルをおき、有効にする。

% cd jail.d/
% sudo touch postfix-sasl.conf
% sudo vi postfix-sasl.conf

postfix-sasl.confの内容は以下のように記載する。

[postfix-sasl]
enabled = true


繰り返しBanされるIPを長期間Banする。

% sudo touch recidive.conf
% sudo vi recidive.conf

recidive.conf内容は以下のとおり。

[recidive]
enabled = true

ただし、nftablesを使っている場合は上記の設定のままではうごかない(nftablesが /etc/services に記載されているポート名を参照しているため。postfix-saslの
ルールの場合 "465"というポート名が /etc/services に存在しない)

自分用のルールを /etc/jail.localとして記載する。

% sudo touch /etc/fail2ban/jail.local
% sudo vi /etc/fail2ban/jail.local

jail.localの内容を以下のようにする。(postfix-saslから 465, imap, imapsを除いている)

[postfix-sasl-custom]

filter   = postfix[mode=auth]
port     = smtp,submission,pop3,pop3s
logpath  = %(postfix_log)s
backend  = %(postfix_backend)s

postfix-sasl.confの内容を以下のように編集する。

[postfix-sasl-custom]
enabled = true

fail2banを再起動する。

% sudo systemctl stop fail2ban
% sudo systemctl start fail2ban

しばらくたつと、fail2banがnftablesに自動的にルールを追記してくれる。fail2banの再起動時のログをみる。

% tail /var/log/fail2ban.log
2019-11-18 14:19:22,813 fail2ban.server         [30494]: INFO    Starting Fail2ban v0.10.2
2019-11-18 14:19:22,819 fail2ban.database       [30494]: INFO    Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2019-11-18 14:19:22,820 fail2ban.jail           [30494]: INFO    Creating new jail 'sshd'
2019-11-18 14:19:22,828 fail2ban.jail           [30494]: INFO    Jail 'sshd' uses pyinotify {}
2019-11-18 14:19:22,830 fail2ban.jail           [30494]: INFO    Initiated 'pyinotify' backend
2019-11-18 14:19:22,830 fail2ban.filter         [30494]: INFO      maxLines: 1
2019-11-18 14:19:22,852 fail2ban.server         [30494]: INFO    Jail sshd is not a JournalFilter instance
2019-11-18 14:19:22,853 fail2ban.filter         [30494]: INFO    Added logfile: '/var/log/auth.log' (pos = 10278741, hash = e1979e4153ef60220060b0b8d7d29f43e947154f)
2019-11-18 14:19:22,853 fail2ban.filter         [30494]: INFO      encoding: UTF-8
2019-11-18 14:19:22,854 fail2ban.filter         [30494]: INFO      maxRetry: 5
2019-11-18 14:19:22,854 fail2ban.filter         [30494]: INFO      findtime: 600
2019-11-18 14:19:22,855 fail2ban.actions        [30494]: INFO      banTime: 600
2019-11-18 14:19:22,857 fail2ban.jail           [30494]: INFO    Creating new jail 'recidive'
2019-11-18 14:19:22,857 fail2ban.jail           [30494]: INFO    Jail 'recidive' uses pyinotify {}
2019-11-18 14:19:22,860 fail2ban.jail           [30494]: INFO    Initiated 'pyinotify' backend
2019-11-18 14:19:22,863 fail2ban.server         [30494]: INFO    Jail recidive is not a JournalFilter instance
2019-11-18 14:19:22,863 fail2ban.filter         [30494]: INFO    Added logfile: '/var/log/fail2ban.log' (pos = 3405917, hash = 6fcbaf803079b747ecdbd1658eb6884f5241503f)
2019-11-18 14:19:22,865 fail2ban.filter         [30494]: INFO      encoding: UTF-8
2019-11-18 14:19:22,866 fail2ban.filter         [30494]: INFO      maxRetry: 5
2019-11-18 14:19:22,866 fail2ban.filter         [30494]: INFO      findtime: 86400
2019-11-18 14:19:22,866 fail2ban.actions        [30494]: INFO      banTime: 604800
2019-11-18 14:19:22,869 fail2ban.jail           [30494]: INFO    Creating new jail 'postfix-sasl-custom'
2019-11-18 14:19:22,870 fail2ban.jail           [30494]: INFO    Jail 'postfix-sasl-custom' uses pyinotify {}
2019-11-18 14:19:22,872 fail2ban.jail           [30494]: INFO    Initiated 'pyinotify' backend
2019-11-18 14:19:22,877 fail2ban.server         [30494]: INFO    Jail postfix-sasl-custom is not a JournalFilter instance
2019-11-18 14:19:22,878 fail2ban.filter         [30494]: INFO    Added logfile: '/var/log/mail.log' (pos = 11829048, hash = 5f203d2833f79fe76e8db1a83af3c1419b8708dd)
2019-11-18 14:19:22,879 fail2ban.filter         [30494]: INFO      encoding: UTF-8
2019-11-18 14:19:22,880 fail2ban.filter         [30494]: INFO      maxRetry: 5
2019-11-18 14:19:22,880 fail2ban.filter         [30494]: INFO      findtime: 600
2019-11-18 14:19:22,881 fail2ban.actions        [30494]: INFO      banTime: 600
2019-11-18 14:19:22,885 fail2ban.jail           [30494]: INFO    Jail 'sshd' started
2019-11-18 14:19:22,889 fail2ban.jail           [30494]: INFO    Jail 'recidive' started
2019-11-18 14:19:22,891 fail2ban.jail           [30494]: INFO    Jail 'postfix-sasl-custom' started
2019-11-18 14:19:29,395 fail2ban.filter         [30494]: INFO    [postfix-sasl-custom] Found 46.38.144.32 - 2019-11-18 14:19:29
〜省略〜

Debian 10 (buster)のnftablesでアクセス制御 - 発声練習で設定したとおりに/etc/nftable.confを設定しておくと、banしたIPアドレスが存在したときに fail2banが勝手に nftにルールを追加してくれる。たとえば以下のとおり。

# nft list ruleset
table inet filter {
	set f2b-postfix-sasl-custom {                                     # fail2banが自動追加
		type ipv4_addr                                                  # fail2banが自動追加
		elements = { 46.38.144.32, 46.38.144.179 }    # fail2banが自動追加
	}

	chain input {
		type filter hook input priority 0; policy accept;
		tcp dport { smtp, pop3, submission, pop3s } ip saddr @f2b-postfix-sasl-custom reject   # fail2banが自動追加
	}

	chain forward {
		type filter hook forward priority 0; policy accept;
	}

	chain output {
		type filter hook output priority 0; policy accept;
	}
}
〜 以下、略 〜

現時点でbanされているIPアドレスをみる場合は以下のコマンドで調べる。たとえば、私の環境では以下のようになった。

% sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:	

% sudo fail2ban-client status postfix-sasl-custom
Status for the jail: postfix-sasl-custom
|- Filter
|  |- Currently failed:	5
|  |- Total failed:	66
|  `- File list:	/var/log/mail.log
`- Actions
   |- Currently banned:	5
   |- Total banned:	12
   `- Banned IP list:	46.38.144.57 46.38.144.146 92.118.38.38 46.38.144.17 92.118.38.55

トラブルシューティング: nftableへの切替設定ミス

nftablesでアクセス制限しているのに、/etc/jail.conf では iptables-multiport, iptables-allportを設定していると以下のようなエラーログが/var/log/fail2ban.logにでる。

2019-11-15 22:28:39,154 fail2ban.utils          [440]: Level 39 7f65406a1e68 -- exec: iptables -w -n -L INPUT | grep -q 'f2b-sshd[ \t]'
2019-11-15 22:28:39,154 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: "iptables v1.8.2 (nf_tables): table `filter' is incompatible, use 'nft' tool."
2019-11-15 22:28:39,154 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: ''
2019-11-15 22:28:39,154 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- returned 1
2019-11-15 22:28:39,154 fail2ban.CommandAction  [440]: ERROR   Invariant check failed. Trying to restore a sane environment
2019-11-15 22:28:39,217 fail2ban.utils          [440]: Level 39 7f65406a1e68 -- exec: iptables -w -n -L INPUT | grep -q 'f2b-sshd[ \t]'
2019-11-15 22:28:39,218 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: "iptables v1.8.2 (nf_tables): table `filter' is incompatible, use 'nft' tool."
2019-11-15 22:28:39,218 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: ''
2019-11-15 22:28:39,218 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- returned 1
2019-11-15 22:28:39,218 fail2ban.CommandAction  [440]: CRITICAL Unable to restore environment
2019-11-15 22:28:39,218 fail2ban.actions        [440]: ERROR   Failed to execute ban jail 'sshd' action 'iptables-multiport' info 'ActionInfo({'ip': '2
22.186.180.147', 'family': 'inet4', 'ip-rev': '147.180.186.222.', 'ip-host': None, 'fid': '222.186.180.147', 'failures': 9, 'time': 1573824514.0, 'matches': 'Nov 15 22:28:10 ホスト名 sshd[985]: Failed password for root from 222.186.180.147 port 3320 ssh2\n
〜省略〜
': 9, 'ipjailfailures': 9})': Error banning 222.186.180.147

トラブルシューティング: nftablesに設定しているルールセットと一致していないとき

デフォルトでは「chain input」であることが記載されているがnftablesに設定しているルールセットで「chain INPUT」と設定されていると以下のサイトのようなエラーがでる。

トラブルシューティング: jail.conf で設定されているルールのサービスが /etc/services に存在しない

fail2banがnftablesへのルールセットにルールを追加する際に'Error: Could not resolve service: Servname not found in nft services list'というエラーがでている。

2019-11-17 01:02:27,961 fail2ban.utils          [1958]: Level 39 7f4fa70e3e40 -- exec: nft add set inet filter f2b-postfix-sasl \{ type ipv4_addr\; \}
nft insert rule inet filter input tcp dport \{ smtp,465,submission,imap,imaps,pop3,pop3s \} ip saddr @f2b-postfix-sasl reject
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- stderr: 'Error: Could not resolve service: Servname not found in nft services list'
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- stderr: 'insert rule inet filter input tcp dport { smtp,465,submission,
imap,imaps,pop3,pop3s } ip saddr @f2b-postfix-sasl reject'
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- stderr: ' ^^^^'
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- returned 1
2019-11-17 01:02:27,962 fail2ban.actions        [1958]: ERROR   Failed to execute ban jail 'postfix-sasl' action 'nftables-multiport' info 'ActionInfo(
{'ip': '46.38.144.179', 'family': 'inet4', 'ip-rev': '179.144.38.46.', 'ip-host': None, 'fid': '46.38.144.179', 'failures': 5, 'time': 1573920146.0, 'matches': 
'Nov 17 00:58:02 ホスト名 postfix/smtpd[24572]: warning: unknown[46.38.144.179]: SASL LOGIN authentication failed: authentication failure\n 〜略〜', 'ipfailures': 5, 'ipjailfail
ures': 5})': Error starting action Jail('postfix-sasl')/nftables-multiport

/etc/servicesの行頭に列挙されたサービス名でないとエラーがでる。調べ方は以下のとおり。上の例では"465"がひっかからないのでエラーとなっている。

% grep ^smtp /etc/services
smtp		25/tcp		mail

% grep ^465 /etc/services

メモ:「平成24年児童手当の使途等に係る調査報告書」の修正

素晴らしい事例。記載ミスは残念だったけど修正を素早くしたのは素晴らしいと思う。

www.nikkei.com

www.shiratamaotama.com

www.shiratamaotama.com

www.mhlw.go.jp

www.shiratamaotama.com

www.asahi.com

www.nikkei.com

修正したのは世帯年収別の児童手当の使い道に関する調査。たとえばこれまで世帯年収1000万円以上の受給者は児童手当の32%を「大人のおこづかいや遊興費」に充てているとしていたが、正しくは0.9%だった。32%は「子どもの将来のための貯蓄・保険料」の誤りだった。取り違えが起きた原因は調査中としている。

これに伴い財務省も15日、財政制度等審議会(財務相の諮問機関)の資料を修正。世帯年収が高いほど児童手当が大人のお小遣いなどに使われているとの文言を「使う必要がなく残っている等の回答が多い」とした。児童手当の廃止を含む見直しを求める方針は変更なしとした。
児童手当の使い道、厚労省が調査結果修正 :日本経済新聞より)

Debian 10 (buster)のnftablesでアクセス制御

はじめに

Debian 10 のインストールはDebian 10 (buster)を用いたサーバ設定メモ - 発声練習

方針

Debian 10からアクセス制御をiptablesからnftablesで行うようになった。

  • Debian 9以前のiptablesの設定をテキストファイルに出力する
  • Debian 10上で iptables-restore-translate でiptablesの設定をnftablesの設定に変更する。
  • 編集したものを /etc/nftables.conf にコピーし、設定を反映させる。

(必要に応じて) iptablesの設定をテキストファイルに出力

% sudo iptables-save > iptables.conf

nftablesのインストール

% sudo apt install nftables
% sudo  systemctl enable nftables.service

現在の設定を表示する。

% sudo nft list ruleset

iptablesの設定をnftablesの設定へ変換

% sudo /usr/sbin/iptables-restore-translate -f iptables.conf > /tmp/nftables-temp.conf

/tmp/nftables-temp.conf を適宜編集する。/etc/nftables.conf の先頭2行は必ず追加しないといけない。編集したら/etc/nftables.confとして保存する。

% cd /etc
% sudo cp -p nftables.conf nftables.conf.org
% sudo cp /tmp/nftables-temp.conf nftables.conf
% sudo nft -f /etc/nftables.conf
% sudo nft list ruleset

設定例

元のiptablesの設定は そこそこセキュアなlinuxサーバーを作る - Qiitaを参考にしている。

#!/usr/sbin/nft -f

# 既存の設定をリセット
flush ruleset

table inet filter {
	chain input {
		type filter hook input priority 0;
	}
	chain forward {
		type filter hook forward priority 0;
	}
	chain output {
		type filter hook output priority 0;
	}
}

# 以下、iptables-restore-translateで変換したときに 
# INPUT, FORWARD, OUTPUTが大文字だったので小文字にした。
#
# また、 counter の後ろに ”packets 数字 bytes 数字" という記述があるがこれは削っても良いので削った。
# 以下は IPv4に対する設定。
table ip filter {
	chain input {
		type filter hook input priority 0; policy accept;
		
                # ICMPを許可 
		ip protocol icmp counter accept

                # 接続確立済みのTCPパケットを許可 
		ct state established,related counter accept

                # ローカルホスト(127.0.0.1)からのアクセス許可 
		iifname "lo" counter accept

                # ipspoofing対策
		ip saddr 10.0.0.0/8 counter drop
		ip saddr 172.16.0.0/12 counter drop
		#ip saddr 192.168.0.0/16 counter drop
		counter
		ip saddr 127.0.0.0/8 counter drop
		ip saddr 169.254.0.0/16 counter drop
		ip saddr 192.0.2.0/24 counter drop
		ip saddr 224.0.0.0/4 counter drop
		ip daddr 255.255.255.255 counter drop

                # SSH(22番ポート)へのアクセスは許可
		tcp dport ssh counter accept

                # HTTP(80番ポート)、HTTPS(443番ポート)へのアクセスは許可
		tcp dport http counter accept
		tcp dport https counter accept

                # SMTP(25番)へのアクセスは許可
		tcp dport smtp counter accept

		# SMTP AUTH on TLS(465)とPOP3S(995)へのアクセスは許可
		tcp dport urd counter accept
		tcp dport pop3s counter accept

                # muninへのアクセスはXX.XX.XX.XX/24の中からのみ許可
		ip saddr XX.XX.XX.XX/24 tcp dport munin counter accept

                # ポートスキャン対策
		meter portscan size 65535 { ip saddr limit rate 10/second burst 10 packets}  counter jump portscanner

               # 上記に当てはまらないTCP, UDPのパケットは不可
		ip protocol tcp counter reject with tcp reset
		ip protocol udp counter reject
		counter reject with icmp type prot-unreachable
	}

	chain forward {
		type filter hook forward priority 0; policy accept;
		counter reject
	}

	chain output {
		type filter hook output priority 0; policy accept;
		counter accept
	}

	chain portscanner {
		counter  drop
	}
}

ポートの開き具合をチェックする。

設定したサーバ上で開いているポートを調べる。

% lsof -i

別のマシンからサーバで開いているポートを調べる(注意:これは攻撃の第一段階のポートスキャンにあたるので自分で管理しているサーバにだけおこなうこと)。なお、当該サーバのIPアドレスをYY.YY.YY.YY とする

% sudo nmap YY.YY.YY.YY  (TCPのポートをチェック)
% sudo nmap -sU YY.YY.YY.YY (UDPのポートをチェック)

Debian 10 (buster)上でPostfixとDovecotを用いてSMTP認証+TLS

はじめに

Debian 10 のインストールはDebian 10 (buster)を用いたサーバ設定メモ - 発声練習

SMTP認証の設定

SMTP認証は以下に従った。

TLSについては以下を参考にした。

必要なソフトウェアをインストールする。

% sudo apt install  postfix sasl2-bin libsasl2-modules

設定ファイルを用意する。

% cd /etc/postfix/sasl
% sudo touch smtpd.conf
% sudo vi smtpd.conf

smtpd.confの内容は以下のようにする。

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

saslauthd用の一時ファイル置き場を設定しなおす(Postfixはchrootで動くため)

% cd /etc/default
% sudo cp saslauthd saslauthd-postfix
% sudo vi saslauthd-postfix

編集した結果は以下のとおり。

diff saslauthd saslauthd-postfix 
7c7
< START=no
---
> START=yes
11c11
< DESC="SASL Authentication Daemon"
---
> DESC="SASL Auth. Daemon for Postfix"
15c15
< NAME="saslauthd"
---
> NAME="saslauthd-postf"
62c62,63
< OPTIONS="-c -m /var/run/saslauthd"
---
> #OPTIONS="-c -m /var/run/saslauthd"
> OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

さきほど設定したファイルの一時置き場を作成する。

% sudo su
# dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
# rm -rf /run/saslauthd
# ln -s /var/spool/postfix/var/run/saslauthd   /run/saslauthd
# ls -l /run/saslauthd

postfixユーザをsaslグループに追加する。

# adduser postfix sasl

saslauthdを再起動する。

% sudo systemctl restart saslauthd
% sudo systemctl status saslauthd

/etc/postfix/main.cf を編集する。

% cd /etc/postfix
% sudo cp -p main.cf main.cf.org
% sudo vi main.cf

main.cfの編集部分は以下のとおり。

# diff main.cf.org main.cf
27,28c27,29
< smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
< smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
---
> smtpd_tls_cert_file=/etc/postfix/ssl/keys/THISSEVER.crt
> smtpd_tls_key_file=/etc/postfix/ssl/keys/THISSEVER.key
> smptd_tls_CAfile=/etc/postfix/ssl/keys/nii-odca3sha2ct.cer
43c44
< mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
---
> mynetworks = 127.0.0.0/8 192.168.0.0/16 
49c50,57
< inet_protocols = all
---
> inet_protocols = ipv4
> 
> ## For SMTP AUTH with SASL2
> smtpd_sasl_local_domain = $myhostname
> smtpd_sasl_auth_enable = yes
> broken_sasl_auth_client = yes
> smtpd_sasl_security_options = noanonymous
> smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

/etc/postfix/master.cf を編集する。

% cd /etc/postfix
% sudo cp -p master.cf master.cf.org
% sudo vi master.cf

master.cfの編集部分は以下のとおり。

% diff master.cf.org master.cf
29c29
< #smtps     inet  n       -       y       -       -       smtpd
---
> smtps     inet  n       -       y       -       -       smtpd
31,32c31,32
< #  -o smtpd_tls_wrappermode=yes
< #  -o smtpd_sasl_auth_enable=yes
---
>   -o smtpd_tls_wrappermode=yes
>   -o smtpd_sasl_auth_enable=yes
37,38c37,38
< #  -o smtpd_recipient_restrictions=
< #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
---
>   -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
>   -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

TLS用のサーバ証明書を設置する。サーバ証明書を THISSEVER.crt、証明書作成時の鍵をTHISSEVER.key、中間証明書を nii-odca3sha2ct.cerとする。(サーバ証明書は UPKI電子証明書発行サービスで作成しているので、中間証明書がこのファイルになっている)。

% sudo mkdir -p /etc/postfix/ssl/keys
% sudo cp /path-to-directory/THISSEVER.crt /etc/postfix/ssl/keys
% sudo cp /path-to-directory/THISSEVER.key /etc/postfix/ssl/keys
% sudo cp /path-to-directory/nii-odca3sha2ct.cer /etc/postfix/ssl/keys
% chown root:root /etc/postfix/ssl/keys/*

証明書のカギのパスフレーズを外す。

% cd /etc/postfix/ssl/keys
% sudo cp -p THISSEVER.key THISSEVER.key.with_passphrase
% sudo openssl rsa -in THISSEVER.key.with_passphrase -out THISSEVER.key

証明書と中間証明書を一つにまとめる。

% sudo cp -p THISSEVER.crt THISSEVER_full.crt
% sudo cat nii-odca3sha2ct.cer >> THISSEVER_full.crt

/etc/pam.dにファイルを追加する。

% cd /etc/pam.d
% sudo cp other smtp

Dovecot による POP3SとIMAPSの設定

Dovecotは以下を参考にした

Dovecotのインストール

% sudo apt install dovecot-core dovecot-pop3d dovecot-imapd

設定ファイルの編集

% cd /etc/dovecot
% sudo cp -p dovecot.conf dovecot.conf.org
% sudo vi dovecot.conf

dovecot.confの中見は以下のとおり。

30c30
< #listen = *, ::
---
> listen = *, ::

以下 /etc/dovecot/conf.d/以下の設定ファイルを編集していく。

古いメーラーへの対応。

% sudo cp -p 10-auth.conf 10-auth.conf.org
% sudo vi 10-auth.conf
% diff 10-auth.conf.org 10-auth.conf
10a11
> disable_plaintext_auth = no
100c101,102
< auth_mechanisms = plain
---
> #auth_mechanisms = plain
> auth_mechanisms = plain login

メールボックスの形式を指定する(全メール1ファイル形式mbox、1メール1ファイル形式MailDir)

% sudo cp -p 10-mail.conf 10-mail.conf.org
% sudo vi 10-mail.conf

POP3SとIMAPSについてコメントアウトする。

% sudo cp -p 10-master.conf 10-master.conf.org
% sudo vi 10-master.conf
% diff 10-master.conf.org 10-master.conf
22,23c22,23
<     #port = 993
<     #ssl = yes
---
>     port = 993
>     ssl = yes
43,44c43,44
<     #port = 995
<     #ssl = yes
---
>     port = 995
>     ssl = yes

サーバ証明書を指定する。Postfixと共有する。

% sudo cp -p 10-ssl.conf 10-ssl.conf.org
% sudo vi 10-ssl.conf
% diff 10-ssl.conf.org 10-ssl.conf
12,13c12,13
< ssl_cert = </etc/dovecot/private/dovecot.pem
< ssl_key = </etc/dovecot/private/dovecot.key
---
> ssl_cert = </etc/postfix/ssl/keys/THISSEVER_full.crt
> ssl_key = </etc/postfix/ssl/keys/THISSEVER.key

設定を確認する。

% sudo /usr/sbin/dovecot -n

dovecotを再起動する。

% sudo systemctl restart dovecot
% sudo systemctl status dovecot

nftablesによる アクセス制限

Debian 10 (buster)のnftablesでアクセス制御 - 発声練習に従い設定する。

/etc/nftables.confに以下を追加し、ポートへのアクセスを許す。

table ip filter {
	chain input {
		type filter hook input priority 0; policy accept;
                〜省略〜

		tcp dport smtp counter accept   # 25番:他のSMTPサーバからのアクセス
		tcp dport urd counter accept   # 465番:SMTP認証+TLS
		tcp dport pop3s counter accept # 995番:POP3S
		tcp dport imaps counter accept # 993番:IMAPS

    〜省略〜

設定を反映させる。

% sudo nft -f /etc/nftables.conf
% sudo nft list ruleset

ポートの待受状態を確認する。たとえば私が設定したサーバの場合は以下のようになる。

% sudo lsof -i
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient  492     root    7u  IPv4  10027      0t0  UDP *:bootpc 
mysqld    687    mysql   21u  IPv4  16795      0t0  TCP localhost:mysql (LISTEN)
sshd      688     root    3u  IPv4  10128      0t0  TCP *:ssh (LISTEN)
sshd      688     root    4u  IPv6  10130      0t0  TCP *:ssh (LISTEN)
apache2   714     root    4u  IPv6  14298      0t0  TCP *:http (LISTEN)
apache2   715 www-data    4u  IPv6  14298      0t0  TCP *:http (LISTEN)
apache2   716 www-data    4u  IPv6  14298      0t0  TCP *:http (LISTEN)
master   5013     root   13u  IPv4  30976      0t0  TCP *:smtp (LISTEN)
master   5013     root   17u  IPv4  30979      0t0  TCP *:submissions (LISTEN)
sshd     5566     root    3u  IPv4  32942      0t0  TCP 192.168.12.4:ssh->192.168.12.3:57887 (ESTABLISHED)
sshd     5578    gotoh    3u  IPv4  32942      0t0  TCP 192.168.12.4:ssh->192.168.12.3:57887 (ESTABLISHED)
dovecot  5600     root   21u  IPv4  38020      0t0  TCP *:pop3 (LISTEN)
dovecot  5600     root   22u  IPv6  38021      0t0  TCP *:pop3 (LISTEN)
dovecot  5600     root   23u  IPv4  38022      0t0  TCP *:pop3s (LISTEN)
dovecot  5600     root   24u  IPv6  38023      0t0  TCP *:pop3s (LISTEN)
dovecot  5600     root   38u  IPv4  38064      0t0  TCP *:imap2 (LISTEN)
dovecot  5600     root   39u  IPv6  38065      0t0  TCP *:imap2 (LISTEN)
dovecot  5600     root   40u  IPv4  38066      0t0  TCP *:imaps (LISTEN)
dovecot  5600     root   41u  IPv6  38067      0t0  TCP *:imaps (LISTEN)

トラブルシューティング: DovecotのDiffie-Hellman鍵エラー

以下のようなエラーがでている。

pop3-login: Error: Diffie-Hellman key exchange requested, but no DH parameters provided. Set ssh_dh=

これはDovecot 2.3より仕様が変わったとのこと。

以前のバージョンではDiffie Hellman parametersが初回起動時に自動生成され週ごとに再生成されていたが、セキュリティ上のメリットがさほどないため廃止された。バージョン2.3からはssl_dhの指定が強制されるため、以下を必ず設定して、設定した場所にDiffie Hellman parametersファイルを配置しなければならない。

linux:postfix_dovecot [RCPS] より)

鍵を生成する。

% cd /etc/postfix/ssl/keys/
% sudo openssl dhparam 4096 -out THISSEVER.dh.pem

/etc/dovecot/10-ssl.confに以下を加える。

# For Diffie Hellman Parameters
ssl_dh = </etc/postfix/ssl/keys/THISSEVER.dh.pem

dovecotを再起動する。

% sudo systemctl restart dovecot

Debian 10 (buster)のApache 2.4でSuexec

はじめに

Debian 10 のインストールはDebian 10 (buster)を用いたサーバ設定メモ - 発声練習
Debian 8での場合はDebian/GNU Linux WheezyでSuexec - 発声練習

方針

  • パッケージを使って構築する
  • 研究室共用ページはドキュメントルートに
  • 個々人のページは/home/USER/public_html以下に
  • CGIをSuExecで許す
  • SSIも許す

Apache2のインストール

apache2-suexecだとドキュメントルートとユーザディレクトリを変更できない。そこで、apache2-suexec-customを利用する

% sudo aptitude install apache2-suexec-custom

/etc/apache2/suexec/www-data を編集し、ドキュメントルートとユーザディレクトリを変更する。

% cd /etc/apache2/suexec/
% sudo cp -p www-data www-data.org
% sudo vi www-data

編集結果は以下のとおり

% diff www-data.org www-data
2c2
< public_html/cgi-bin
---
>public_html

ユーザディレクトリの部分を変更。

SuExecを有効にする。

% sudo a2enmod suexec
% sudo systemctl restart apache2

DebianやUbuntuのApacheの設定

/etc/apache2で設定する。各種設定ファイルが sites-avaiable か mods-avaiable にあり、これを a2ensite, a2enmod, a2dissite, a2dismodのコマンドでこれらの設定ファイルを sites-enabledかmodts-enabled にシンボリックリンクする。これにより、選択された設定がApacheへ反映される。

設定ファイルを変更したり、siteやmodを付け加えた場合はApacheを再起動する。

% sudo /etc/init.d/apache2 restart

DocumentRootの設定

/etc/apache2/sites-available/default を編集する。

% cd /etc/apache2/sites-available/
% sudo cp -p default default.org
% sudo vi default

編集結果は以下のとおり

% diff default.org default
< 		Options Indexes FollowSymLinks MultiViews
< 		AllowOverride None
---
> 		Options ExecCGI MultiViews SymLinksIfOwnerMatch IncludesNoExec
> 		AllowOverride All
16,22c16,22
< 	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
< 	<Directory "/usr/lib/cgi-bin">
< 		AllowOverride None
< 		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
< 		Order allow,deny
< 		Allow from all
< 	</Directory>
---
> 	#ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
> 	#<Directory "/usr/lib/cgi-bin">
> 	#	AllowOverride None
> 	#	Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
> 	#	Order allow,deny
> 	#	Allow from all
> 	#</Directory>

方針

  • DocumentRootは管理者しかいじらないので、.htaccessでの設定はすべて許可に(AllowOverride All)
  • CGIやSSIもDocumentRootで使うのでcgi-binの設定はコメントアウト
  • DocumentRootのOptionsは以下のとおり(参考:Apache2.2ドキュメントOptions
    • Indexesは外す(ディレクトリの中身が見えるのは良くない)
    • CGI許可:ExecCGI
    • MultiViews
    • シンボリックリンクはオーナーが一緒の場合だけ許す:SymLinksIfOwnerMatch
    • SSIを#exec コマンド と #exec CGI を除き許可: IncludesNoExec
% sudo a2enmod includes
% sudo a2enmod cgid
% sudo systemctl restart apache2

ユーザディレクトリ

/etc/apache2/mods-available/userdir.confを編集

% cd /etc/apache2/mods-available/
% sudo cp -p userdir.conf userdir.conf.org
% sudo vi userdir.conf

編集結果は以下のとおり。

% diff userdir.conf.org userdir.conf
7,15c7
<                 Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<                 <Limit GET POST OPTIONS>
<                         Order allow,deny
<                         Allow from all
<                 </Limit>
<                 <LimitExcept GET POST OPTIONS>
<                         Order deny,allow
<                         Deny from all
<                 </LimitExcept>
---
>                 Options ExecCGI MultiViews SymLinksIfOwnerMatch IncludesNoExec
  • AllowOverrideはデフォルトのまま(「FileInfo AuthConfig Limit Indexes」の上書きOK。Optionsの上書きは許さない)
  • Limitは別にしなくて良いと思ったので削除(各自でやればよい)
  • OptionsはIndexesを外し、ExecCGIを追加
% sudo a2enmod userdir
% sudo systemctl restart apache2

.cgiの拡張子でCGIスクリプトが動くようにする

/etc/apache2/mods-available/mime.conf を編集する。

% cd /etc/apache2/mods-available/
% sudo cp -p mime.conf mime.conf.org
% sudo vi userdir.conf

編集結果は以下のとおり。

# diff mime.conf.org mime.conf
218c218
< #AddHandler cgi-script .cgi
---
> AddHandler cgi-script .cgi
244c244
< AddOutputFilter INCLUDES .shtml
---
> AddOutputFilter INCLUDES .shtml .html
  • 拡張子が.cgiならばCGIスクリプトとして処理する
  • SSIを有効にする拡張子として、.shtml と .htmlを指定する

Digest認証を有効にする

Digest認証を利用するためには、auth_digestモジュールを有効化する必要がある。

% sudo a2enmod auth_digest
% sudo systemctl restart apache2

関連:Apache 2.4のアクセス制御記述例メモ - 発声練習