#author("2017-10-07T16:50:53+09:00","default:nowsky","nowsky") *OpenDKIM [#o6c0f9a5] MTAにmilterとして組み込む事で、DKIMを実装出来るようになるプログラム。 OpenDKIMでメールの署名付与、署名検証が出来る。 メール送信者の詐称対策に有効なので、SPFと併せて実装しておいた方が良い。 - 参考情報 [[OpenDKIM:+http://opendkim.org/]] [[PostifxでDKIM認証する:+https://qiita.com/techno_officer/items/3c550d261b5a0c6df3a4]] [[OpenDKIMを利用したメール認証 :+https://heavy-metal-explorer.com/open_dkim_setting/]] ~ *構築環境 [#k5ecf147] 今回検証した環境はこちら -debian 8.1 x86_64 -CentOS 7.2 x86_64 -openSUSE 42.3 x86_64 ~ 他には下の内容で構築メモを作成 -OpenDKIMは"127.0.0.1:TCP/10027"で待ち受ける -汎用性を持たせる為、LocalSocketは今回利用しない -送受信の署名付与/検証を実施する -マルチドメインの検証に対応させる ~ ドメイン構成などは -メール鯖のドメイン:hoge.org -メール鯖のFQDN:mail.hoge.org -メール鯖のIPアドレス:10.0.0.1 ~ *構築(Debian) [#n01614b7] &size(16){&font(b){1. インストール};}; amavisの一部コマンドがnon-freeリポジトリを使っている為、 リポジトリを追加する事でインストール出来るようにする必要がある。 # vi /etc/apt/sources.list.d/jessie.non-free.list ================================================== deb http://ftp.jp.debian.org/debian/ jessie non-free deb http://ftp.jp.debian.org/debian/ jessie-updates non-free deb http://ftp.jp.debian.org/debian/ jessie-backports non-free # apt-get install amavisd-new spamassassin clamav-daemon # apt-get install pyzor razor libnet-dns-perl libmail-spf-perl # apt-get install arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip unzoo zip zoo ~ &size(16){&font(b){2. 設定};}; debian環境の場合は、amavisの設定ファイルが細切れになっている。 概ね機能毎に纏まっているが一部の設定は全く違うファイルにあったりするので、 該当するコンフィグが見つからない場合は、都度grepコマンドで探し出す。 # grep -r "検索文字列" ./* ~ #region(&color(#ff0000){設定内容};) &size(14){&font(b){そのまま使う設定ファイル};}; /etc/amavis/conf.d/01-debian /etc/amavis/conf.d/30-template_localization /etc/amavis/conf.d/50-user ~ &size(14){&font(b){/etc/amavis/conf.d/05-domain_id};}; < chomp($mydomain = `head -n 1 /etc/mailname`); --- > chomp($mydomain = "hoge.org"); ~ &size(14){&font(b){/etc/amavis/conf.d/05-node_id};}; < chomp($myhostname = `hostname --fqdn`); --- > chomp($myhostname = "mail.hoge.org"); ~ &size(14){&font(b){/etc/amavis/conf.d/15-av_scanners};}; ! ['ClamAV-clamd', ! \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.ctl"], ! qr/\bOK$/m, qr/\bFOUND$/m, ! qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ], --- &ask_daemonの第2引数をclamavのソケットと合わせる ~ &size(14){&font(b){/etc/amavis/conf.d/15-content_filter_mode};}; < @bypass_spam_checks_maps = ( < \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); --- > @bypass_spam_checks_maps = (1); ~ &size(14){&font(b){/etc/amavis/conf.d/20-debian_defaults};}; < $QUARANTINEDIR = "$MYHOME/virusmails"; < $quarantine_subdir_levels = 1; # enable quarantine dir hashing --- > ###$QUARANTINEDIR = "$MYHOME/virusmails"; > ###$quarantine_subdir_levels = 1; # enable quarantine dir hashing ================================================== < @keep_decoded_original_maps = (new_RE( < qr'^MAIL$', < qr'^MAIL-UNDECIPHERABLE$', < qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i, < qr'^Zip archive data', < )); --- > @keep_decoded_original_maps = (new_RE( > qr'^MAIL$', > qr'^MAIL-UNDECIPHERABLE$', > qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i, > ###qr'^Zip archive data', > )); ================================================== ! [1] $inet_socket_bind = '127.0.0.1'; ! [2] $inet_socket_port = 10026; ! [3] $forward_method = 'smtp:[127.0.0.1]:10025'; ! [4] $X_HEADER_TAG = 'X-Virus-Scanned'; ! [5] $X_HEADER_LINE = "$myproduct_name at $mydomain"; ! [6] $virus_admin = 'admin@mail.hoge.org'; ! [7] $spam_admin = 'admin@mail.hoge.org'; --- [1] amavisの待ち受けるIPアドレス [2] amavisの待ち受けるTCPポート番号 [3] ウイルス検査完了メールの転送先。例だとIP:127.0.0.1-TCP/10025に投げる [4] ウイルス検査完了メールに付与するヘッダ [5] ウイルス検査完了メールに付与するヘッダパラメータ [6] ウイルスメールの転送先アドレス。ドメイン部を$mydomainに置き換え可能 [7] スパムメールの転送先アドレス。ドメイン部を$mydomainに置き換え可能 ================================================== $banned_filename_re = new_RE( # [1] Block certain double extensions anywhere in the base name qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i, # [2] Windows Class ID CLSID, strict qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$'i, # [3] Block these MIME types qr'^application/x-msdownload$'i, qr'^application/x-msdos-program$'i, qr'^application/hta$'i, # [4] Block these file extension qr'^(?!cid:).*\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*$'i, qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)$'i, qr'^\.(exe-ms|dll)$', ); --- [1] 二重拡張子の添付ファイルを遮断 [2] OSのCLSIDパラメータを遮断 [3] 添付ファイルのMIMEタイプで遮断 [4] 添付ファイルの拡張子で遮断 ~ &size(14){&font(b){/etc/amavis/conf.d/25-amavis_helpers};}; < @mynetworks = qw( 127.0.0.1/32 ); --- > @mynetworks = qw( 127.0.0.1/32 10.0.0.1/32 ); --- @mynetworksはCIDR形式で記入する #endregion ~ &size(16){&font(b){3. 設定反映};}; 書き換えた設定をAMaViSに反映させる為にプロセスの再起動を行う。 # systemctl restart amavis.service # netstat -an | egrep -i "tcp.*10026.*LISTEN" ~ *構築(CentOS) [#v71ebad3] &size(16){&font(b){1. インストール};}; コアとなるclamavと関連ライブラリはEPELリポジトリを使っている為、 事前にEPELリポジトリを追加しておく必要がある。 # yum install amavisd-new spamassassin # yum install clamav clamav-data clamav-filesystem clamav-lib clamav-scanner-sysvinit clamav-scanner # yum install clamav-server-systemd clamav-server-sysvinit clamav-server clamav-update ~ &size(16){&font(b){2. 設定};}; CentOSの場合amavisの設定ファイルは、/etc/amavisd/amavisd.confの一つに集約されている。 /etc/clamd.d/amavisd.confにも設定があるが、こちらは使わないので放置する。 ~ #region(&color(#ff0000){設定内容};) &size(14){&font(b){/etc/amavisd/amavisd.conf};}; ! [1] @bypass_virus_checks_maps = (0); ! [2] @bypass_spam_checks_maps = (1); --- [1] ウイルスチェックを必ず実行する [2] スパムメールチェックは行わない ================================================== ! [3] $lock_file = "/var/run/amavisd/amavisd.lock"; ! [4] $pid_file = "/var/run/amavisd/amavisd.pid"; --- [3] amavisd起動時のロックファイル [4] amavisdのプロセス番号ファイル ================================================== ! [5] $log_level = 1; ! [6] $do_syslog = 1; ! [7] $syslog_facility = 'mail'; --- [5] amavisdのウイルスチェックログを記録 [6] amavisdのログをsyslogに出力 [7] syslogのfacilityを設定する ================================================== < \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamd.amavisd/clamd.sock"], --- > \&ask_daemon, ["CONTSCAN {}\n", "【clamavのソケットと同じにする】"], ================================================== < $mydomain = 'example.com'; --- > $mydomain = 'hoge.org'; > $myhostname = 'mail.hoge.org'; < $QUARANTINEDIR = undef; --- > # $QUARANTINEDIR = undef; < $db_home = "$MYHOME/db"; --- > # $db_home = "$MYHOME/db"; < @mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 ); --- > @mynetworks = qw( 127.0.0.1/32 10.0.0.1/32 ); < $inet_socket_port = 10024; --- > $inet_socket_bind = '127.0.0.1'; > $inet_socket_port = 10026; < $virus_admin = undef; --- > $virus_admin = 'admin@mail.hoge.org'; > $spam_admin = 'admin@mail.hoge.org'; < $mailfrom_notify_admin = undef; < $mailfrom_notify_recip = undef; < $mailfrom_notify_spamadmin = undef; --- > $mailfrom_notify_admin = "virusalert\@$mydomain"; > $mailfrom_notify_recip = "virusalert\@$mydomain"; > $mailfrom_notify_spamadmin = "spam.police\@$mydomain"; < # $notify_method = 'smtp:[127.0.0.1]:10025'; --- > $forward_method = 'smtp:[127.0.0.1]:10025'; > $notify_method = '$forward_method'; < $X_HEADER_TAG = 'X-Virus-Scanned'; < $X_HEADER_LINE = "$myproduct_name at $mydomain"; > $banned_filename_re = new_RE( > qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i, > qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$'i, > qr'^application/x-msdownload$'i, > qr'^application/x-msdos-program$'i, > qr'^application/hta$'i, > qr'^(?!cid:).*\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*$'i, > qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)$'i, > qr'^\.(exe-ms|dll)$', > ); #endregion ~ &size(16){&font(b){3. スクリプト書き換え};}; デフォルトのままだと、&font(b){amavisd本体};と&font(b){clamdが呼び出すamavisプロセス};の2つが動いてしまい、 2倍のメモリを消費してしまう。 起動スクリプトを調整する事で、二重起動を防止する。 ~ #region(&color(#ff0000){設定内容};) &size(14){&font(b){起動スクリプト調整};}; # vi /usr/lib/systemd/system/amavisd.service --- [Unit] Description=Amavisd-new is an interface between MTA and content checkers. Documentation=http://www.ijs.si/software/amavisd/#doc # After=network.target # Wants=clamd@amavisd.service After=clamd.scan.service network.target Wants=clamd.scan.service Before=postfix.service &size(14){&font(b){追加操作};}; # rm /etc/clamd.d/amavisd.conf # vi /usr/lib/tmpfiles.d/amavisd-new.conf # vi /usr/lib/tmpfiles.d/clamd.scan.conf #endregion ~ &size(16){&font(b){4. 設定反映};}; amavisdを一つだけにする為、関連するプログラムを再起動する 設定を間違えてamavisdが二重起動しようとしている場合や、systemdによるサービス自動再起動が動作し、 プログラムが上手く再起動出来ない(1つだけにならない)場合は下記ログがmessagesに出力される systemd: Starting clamd scanner (amavisd) daemon... clamd: ERROR: Can't open/parse the config file /etc/clamd.d/amavisd.conf systemd: clamd@amavisd.service: main process exited, code=exited, status=1/FAILURE systemd: Unit clamd@amavisd.service entered failed state. systemd: clamd@amavisd.service failed. systemd: clamd@amavisd.service holdoff time over, scheduling restart. systemd: start request repeated too quickly for clamd@amavisd.service systemd: Started clamd scanner (amavisd) daemon. ※再起動順序 amavisdがforeground引数を付けた状態で起動していたら、clamd経由でamavisが起動している(二重起動状態) --- # systemctl restart clamd # systemctl restart amavisd # netstat -an | egrep -i "tcp.*10026.*LISTEN" # ps -ef | grep amavis ~ *構築(openSUSE) [#g7ca6901] &size(16){&font(b){1. インストール};}; openSUSEではデフォルトのリポジトリだけだとOpenDKIMをインストール出来ないので、 MailServerリポジトリを追加してからインストールを行う。 リポジトリのプライオリティ、有効化は別途Yastから行っておく。 # zypper addrepo http://download.opensuse.org/repositories/server:mail/openSUSE_Leap_42.3/server:mail.repo # zypper refresh # zypper install opendkim ~ &size(16){&font(b){2. 設定};}; 証明書はOpenDKIMに付属されているツール(opendkim-genkey)を用いて生成する。 生成した証明書はOpenDKIMのコンフィグ内にディレクトリを作成して保存しておく。 セレクタはDNSレコード、メールヘッダに付与される情報なので生成した日付にする。 コンフィグは証明書を元に署名/検証の制御を実装する。 # mkdir /etc/opendkim/cert # cd /etc/opendkim/cert # opendkim-genkey -D /etc/opendkim/cert -d mail.hoge.org -s 20170101 -b 2048 # chown opendkim.root 20170101.private # chmod 400 20170101.private ~ #region(&color(#ff0000){設定内容};) &size(14){&font(b){/etc/opendkim/opendkim.conf};}; # 下記以外は全てコメントアウトする ---- [01] BaseDirectory /run/opendkim [02] Canonicalization relaxed/relaxed [03] ExternalIgnoreList refile:/etc/opendkim/TrustedHosts [04] InternalHosts refile:/etc/opendkim/TrustedHosts [05] KeyTable refile:/etc/opendkim/KeyTable [06] LogWhy yes [07] MinimumKeyBits 1024 [08] Mode sv [09] PidFile /var/run/opendkim/opendkim.pid [10] ResignAll no [11] SignatureAlgorithm rsa-sha256 [12] SigningTable refile:/etc/opendkim/SigningTable [13] Socket inet:10027@127.0.0.1 [14] SoftwareHeader no [15] StrictHeaders no [16] StrictTestMode no [17] SubDomains no [18] Syslog yes [19] SyslogFacility mail [20] SyslogSuccess yes [21] UserID opendkim:opendkim ================================================= # 概略のみ解説。詳細はコンフィグを見る ---- [01] デフォルトディレクトリの変更 [02] 署名の厳格化。simpleは改変禁止、relaxedは(SpaceをTabに変換等)多少許可 [03] 認証を行わないサーバリスト [04] 送信時に必ず認証するサーバリスト [05] 署名に利用する秘密鍵の指定 [06] 詳細ログの出力 [07] 証明書の最小ビット数 [08] 署名/検証のモード設定。s:署名、v:検証 [09] OpenDKIMのPIDファイル [10] 全メールの署名トリガー [11] 署名のアルゴリズム。現在は、RSA-SHA256しか使えない [12] 署名するメールのenvelope-fromの設定 [13] OpenDKIMの起動方法。今回はSocketではなく、TCP:10027で待ち受けを行う [14] DKIM-FILTERヘッダーを追加。バージョンが載るので今回は付与しない [15] DKIMの標準仕様(RFC5322)に沿っていないメールの処理。今回は受信する [16] ヘッダ、ボディが[CRLF]で終了してない場合は不正と判断。今回は受信する [17] サブドメインメールの署名付与。今回はサブドメインへの付与はしない [18] syslog出力の有効化 [19] syslogのファシリティ [20] 処理成功時にsyslogに出力する [21] OpenDKIMを実行するユーザの設定 &size(14){&font(b){/etc/opendkim/KeyTable};}; [セレクタ]._domainkey.[FQDN] [FQDN]:[セレクタ]:[秘密鍵] --- 20170101._domainkey.mail.hoge.org mail.hoge.org:20170101:/etc/opendkim/cert/20170101.private &size(14){&font(b){/etc/opendkim/SigningTable};}; [署名対象のユーザ]@[FQDN] [セレクタ]._domainkey.[FQDN] --- *@mail.hoge.org 20170101._domainkey.mail.hoge.org &size(14){&font(b){/etc/opendkim/TrustedHosts};}; 127.0.0.1 10.0.0.1 #endregion ~ &size(16){&font(b){3. 起動};}; MTA(Postfix)にOpenDKIMを組み込む為、milter設定を行う。 また、OpenDKIMをサービスとして登録して自動起動出来る様にする。 &size(14){&font(b){/etc/postfix/main.cf};}; # 下記を追記 ---- smtpd_milters=inet:127.0.0.1:10027 non_smtpd_milters=$smtpd_milters milter_default_action=accept &size(14){&font(b){起動処理};}; # systemctl enable opendkim # systemctl start opendkim # netstat -an | grep 10027 ~ *DNS設定 [#t37a92da] DKIMを利用する場合、権威DNSサーバにTXTレコードを登録する必要がある。 登録するレコード内容は、構築時に実行した証明書生成で自動出力されるので、 少しだけ整形した後にDNSサーバへレコードを登録する