- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!ユーザ単位のログイン制限
SSHによる不正侵入対策としてログイン制限を加える。基本的な戦略としては、hostの制限はTCPwrapper(/etc/hosts.allow)を用い、ユーザ制限はloginで行うことにする。
loginの制限は/etc/login.access に
-:ALL EXCEPT wheel hogehoge :ALL EXCEPT LOCAL 192.168.
としてリモートログインできるユーザをwheelグループとhogehogeに限定。
SSHはデフォではloginを用いないので、/etc/ssh/sshd_config に
UseLogin yes
として、sshでloginを使うようにする。
::直接SSHに設定
/etc/ssh/sshd_config に
UseLogin no
AllowUsers user1 user2 ...
と記述する。
!メールサーバの不正中継
このサイトで不正中継のチェックが可能
http://www.rbl.jp/svcheck.php
その他のブラックリストチェックも可能
http://www.rbl.jp/
!Spamメール対策
Postfixの設定 main.cf に
smtpd_helo_restrictions = permit_mynetworks,
reject_invalid_hostname
を追加してみる
Amavisd-new の設定 /usr/local/etc/amavisd.conf
# add spam info headers if at, or above that level
$sa_tag_level_deflt = 2.0;
# add 'spam detected' headers at that level
$sa_tag2_level_deflt = 8.5;
# triggers spam evasive actions
$sa_kill_level_deflt = 13.0;
# spam level beyond which a DSN is not sent
$sa_dsn_cutoff_level = 15;
このへんでレベルの調整。誤検出を防ぐためにはこの程度かな?
!テストウイルスコード(EICAR)
ウイルススキャナー各社共通テストウイルス(無害)
http://www.trendmicro.co.jp/download/test-virus.asp
http://www.eicar.org/anti_virus_test_file.htm
あたりで入手可能
!IMAPでSSL認証
/usr/ports/mail/imap-uw でSSLを有効にしてimapdをインストールした場合、
make install の後に
# make cert
を実行してオレオレ証明書を作っておく。
imap-uw から dovecot2 への移行を図る。(2017/06)
証明書作成は、cd /usr/local/share/examples/dovecot/ と移動して dovecot-openssl.cnf を編集し、
# mkdir -p /etc/ssl/private
# mkdir -p /etc/ssl/certs
# cd /usr/local/share/examples/dovecot/
# sh ./mkcert.sh
を実行する。
/etc/ssl/private, /etc/ssl/certs に dovecot.pem が作られる。
年1回更新の必要(8月末〜9月初め頃)古いのは mkcert.sh の実行前に削除する必要
pkg または ports から、mail/dovecot2 をインストール。portsならTCP wrapper を有効にできるが、pkg だと有効になっていない。しかたがないので、pf でアクセス制御することにする。グローバル側からは、imapsのみ受け付け、pop3, imap, pop3s は落とす。
設定ファイルはとりあえず、/usr/local/etc/dovecot/example-config/ の中身を、/usr/local/etc/dovecot/ にコピーする。設定ファイルは多数のファイルに分割されている。
exampleからイジったファイルは以下。
dovecot.conf
protocols = imap pop3
pop3s, imaps も含む。
conf.d/auth-system.conf.ext
passdb {
driver = pam
args = %s
}
これで認証の際、/etc/pam.d/imap,pop3 を参照するようになる。
conf.d/10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_access_groups = mail
imap-uw では各ユーザのホームが見えていたが、この設定では ~/mail 以下が購読可能となるので、移行の際は注意。
conf.d/10-ssl.conf
ssl = yes
local 192.168.0.0/16 {
protocol pop3 {
ssl = no
disable_plaintext_auth = no
}
}
グローバルで一旦、sslを有効にする必要がある。プライベートネットワークではsslを使わず、平文パスワードでPOP3ができるように上書き。
dovecot2.3への対応 (2018/08)
conf.d/10-ssl.conf でパラメータの変更
ssl_dh_parameters_length = 1024
が廃止され、
ssl_dh = </usr/local/etc/dovecot/dh.pem
が加わった。dh.pemを作るのはコメントにあるように、
# openssl dhparam -out /usr/local/etc/dovecot/dh.pem 4096
とする。また、
ssl_protocols = !SSLv3
も廃止され、代わりに
ssl_min_protocol = TLSv1
というのが加わった。

::スキャナー設定
ウイルススキャナーに[Sophos|http://www.sophos.co.jp/]を用いる場合は
/usr/ports/security/p5-SAVI-Perl (perl interface module)を
インストールしておくと速くて良い。
設定は /usr/local/etc/amavisd.conf で、
@av_scanners = (
### http://www.csupomona.edu/~henson/www/projects/SAVI-Perl/
['Sophos SAVI', \&sophos_savi ],
);
のところをコメントアウトすれば SAVI がプライマリスキャナーとなる。
(2017/06/17)
SophosがFreeBSDに対応しなくなったので、ClamAVのデーモン版を使うことにする。
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
@av_scanners_backup = (
### http://www.clamav.net/ - backs up clamd or Mail::ClamAV
['ClamAV-clamscan', 'clamscan',
"--stdout --no-summary -r --tempdir=$TEMPBASE {}",
[0], qr/:.*\sFOUND$/, qr/^.*?: (?!Infected Archive)(.*)
FOUND$/ ],
# ### http://www.sophos.com/ - backs up Sophie or SAVI-Perl
['Sophos Anti Virus (sweep)', 'sweep',
'-nb -f -all -rec -ss -sc -archive -cab -tnef
--no-reset-atime {}', [0,2], qr/Virus .*? found/,
qr/^>>> Virus(?: fragment)? '?(.*?)'? found/,
],
);
セカンダリはClamAVのスキャンコマンドにする。
うまく設定できれば /var/log/maillog に
amavis[***]: Using primary internal av scanner code for ClamAV-clamd
amavis[***]: Found secondary av scanner ClamAV-clamscan at /usr/local/bin /clamscan
というログを吐く。
処理としては例えば、
$final_virus_destiny = D_DISCARD;
$final_banned_destiny = D_PASS;
$final_spam_destiny = D_BOUNCE;
$final_bad_header_destiny = D_PASS;
で、ウイルスメール捨て、禁止メール通過、スパム反射、
ヘッダの不正は通過、となる。
D_PASSは通過と行っても本文が警告文意になって、メールのボディが
マルチパートにまわされる。
::BANNED ファイルの設定
BANNED(禁止)ファイルとして、実行ファイル(EXE,COM)などが添付されて
いるのを拡張子で判断してブロックしたり警告したりする。
未知ウィルス対策としては有効だが、ブロックしてしまうのも不便
なので警告まで(D_PASS)とする。
それと、アーカイブされたものはそのまま通すこととする。
設定は /usr/local/etc/amavisd.conf で
$banned_filename_re = new_RE
### BLOCK THE FOLLOWING, EXCEPT WITHIN ARHIVES:
[ qr'^\.(zip|lha|rar|arc|arj|zoo)$'=> 0 ], # allow any within these archives
[ qr'^\.(gz|bz2)$' => 0 ], # allow any in gzip or bzip2
[ qr'^\.(rpm|cpio|tar)$' => 0 ], # allow any in Unix-type archives
### BLOCKED ANYWHERE
qr'^\.(exe-ms|dll)$', # banned file(1) types, rudimentary
qr'.\.(pif|scr)$'i, # banned extensions - rudimentary
### BLOCK THE FOLLOWING, EXCEPT WITHIN ARHIVES:
qr'^application/x-msdownload$'i, # block these MIME types
qr'^application/x-msdos-program$'i,
qr'^application/hta$'i,
# block certain double extensions in filenames
qr'\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*$'i,
#
qr'.\.(exe|vbs|pif|scr|cpl|bat|cmd|com|bat)$'i, # banned extension - basic+cmd
);
といった感じにしておいた。
ルールの適用は早い者順。
::その他
$hdr_encoding = 'iso-2022-jp'; # MIME charset
$bdy_encoding = 'iso-2022-jp';
でデフォルトを日本語にしておくと良いか?
::Postfixの場合
Portsでamavisd-newをインストールするとvscanというユーザが
登録されるので、確認。
/usr/local/etc/postfix/master.cf に
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o smtpd_milters=
-o local_header_rewrite_clients=
-o local_recipient_maps=
-o relay_recipient_maps=
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
/usr/local/etc/postfix/main.cf に
# AmaVisd-new
content_filter=smtp-amavis:[127.0.0.1]:10024
を追加する。(新しいのはフィルタ名がsmtp-amavisになってるのに注意)
!STMP-AUTH設定(SSL/TLS)
::Cyrus SASL
security/cyrus-sasl2とsecurity/cyrus-sasl2-saslauthd
をインストールして
/etc/rc.conf に
saslauthd_enable="YES"
saslauthd_flags="-a pam"
を追加して
# service saslauthd start
で起動
::SSL/TLSの設定(オレオレ証明書)
秘密鍵作成
// # openssl genrsa -des3 -out smtps.key 1024 <= 秘密鍵作成
# openssl genrsa -des3 -out smtps.key 2048 <= 時代は2048bit?
Enter pass phrase for smtps.key: <= パスフレーズ
パスフレーズを抜く
# openssl rsa -in smtps.key -out smtps.key
Enter pass phrase for smtps.key: <= 秘密鍵作成時のパスフレーズ
公開鍵作成
# openssl req -new -key smtps.key -out smtps.csr -days 3650
色々聞いてくるので入力する。
Common Nameはホスト名でよい。challenge passwordは空で良い。
サーバ用証明書の作成
# openssl x509 -in smtps.csr -out smtps.pem -req -signkey smtps.key -days 3650
とりあえず10年で。
/usr/local/etc/postfix/ssl を掘って、 *.key, *.csr, *.pem を置く。
::Postfixのインストール
portsでSASL2とTLSが有効になっているか確認
::Postfixの設定
/usr/local/etc/postfix/master.cf を修正してsubmissionポートとSMTPSを開ける
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
/usr/local/etc/postfix/main.cfに以下を追加
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = cyrus
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_client_restrictions=permit_mynetworks,warn_if_reject,permit
smtpd_tls_cert_file = /usr/local/etc/postfix/ssl/smtps.pem
smtpd_tls_key_file = /usr/local/etc/postfix/ssl/smtps.key
smtpd_tls_session_cache_database = hash:/usr/local/etc/postfix/ssl/smtpd_scache
smtpd_use_tls = yes
smtpd_tls_CAfile については
security/nss の /usr/local/share/certs/ca-root-nss.crt
を使うこともあるみたいだが、とりあえずこれで。
パスワード認証は暗号化を指定。
smtpd_sender_restrictions = reject_unknown_sender_domain
で送信者ドメイン(From設定)の制限もしたほうが良い?
/usr/local/lib/sasl2/smtpd.conf に以下を追加
pwcheck_method: auxprop
送信用のアカウントを生成
saslpasswd2 -c -u ドメイン名 ユーザID
パスワードを設定する。
システムのアカウントは別らしいので、共通の送信アカウントで良いか?
送信の認証においては、ユーザID@ドメイン名をユーザIDとして用いる。
(GMailと似た感じ)
# service postfix restart
と再起動してやると、STARTTLS(587), SSL/TLS(465)で認証が可能となる
!Postfixで忘れがちなこと
/usr/local/etc/postfix/virtual バーチャルドメインの設定を記述し、
(空文でも良い)
postmap hash:/usr/local/etc/postfix/virtual
しておく。そうしないと、ログにワーニングが出続ける。
# /usr/local/bin/newaliases
も忘れないように。
!SPFレコード
迷惑メール大作として送信ドメイン認証が普及してきているので、対策として Sender Policy Framework(SPF)レコードをDNSの正引きデータベースに追加する。
lebra.nihon-u.ac.jp. IN TXT "v=spf1 +mx +ip4:***.***.***.***/25 ~all"
といった具合。IPの指定はもう少し狭くした方が良いか? allについては認証失敗の処置は弱めにしておく。
!amavisd-newによるDKIM
amavisd-newを用いて、送信ドメイン認証(DKIM)の署名を有効にしておく。
# mkdir /var/db/dkim/
# chgrp vscan:vscan /var/db/dkim/
# amavisd genrsa /var/db/dkim/exampe-foo.key.pem
などとして、キーを作成。(example, fooは適当に変える)
Updateの際、pemファイルのオーナーがrootになって読めない場合があるので、
chown vscan /var/db/dkim/exampe-foo.key.pem
としておく。(2022/08/26)
amavisd.confを編集して
$enable_dkim_verification = 1; # enable DKIM signatures verification
$enable_dkim_signing = 1; # load DKIM signing code, keys defined by dkim_key
dkim_key('domain.example.jp', 'hostname', '/var/db/dkim/exampe-foo.key.pem');
@dkim_signature_options_bysender_maps = (
{ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );
を加える。
# amavisd showkeys
とすると、DNSのTXTレコードに加えるべきものが表示される。メールを出すドメインの正引きデータベースに
******._domainkey.***.***.**.jp. 3600 TXT (
"v=DKIM1; p="
"***************************************************************"
"***************************************************************"
"***************************************************************"
"**********************")
を追加する。確認として、
# amavisd testkeys
を実行して、TESTING#1 *** => pass となればOK。
!BINDのupgrade(9.16->9.18) (20220827)
BINDのバージョンを9.16->9.18と上げると、named.confの書式が変わるので注意
具体的には、設定ファイルを置くディレクトリ名が
master -> primary
slave -> secondary
というポリコレ的変更。修正しなくてもnamedが立ち上がってしまうので気づきにくいが、ゾーンの設定読み込みに失敗するので、ネームサーバーとして機能しない。