NetworkTips
ユーザ単位のログイン制限
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.asphttp://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
というのが加わった。
amavisd-new(デーモン化AMaVisの新しいやつ)
- スキャナー設定
ウイルススキャナーにSophosを用いる場合は/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が立ち上がってしまうので気づきにくいが、ゾーンの設定読み込みに失敗するので、ネームサーバーとして機能しない。