!ユーザ単位のログイン制限 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 = >> 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が立ち上がってしまうので気づきにくいが、ゾーンの設定読み込みに失敗するので、ネームサーバーとして機能しない。