proxmox mail gateway 初體驗

偏安太久, 直到遇上了 節神(節省工具箱)

前一陣子偶花很多時間將 esxi 重心改成proxmox ve, 好不容易告一段落.

但是節神又丟出來 mail gateway 這個怪獸,

原來是 proxmox mail gateway(PMG) 開源了(open-source software license GNU AGPL,v3).

這很不得了!

早在 2007 咖啡偶就開始使用 mail gateway 這個概念來過濾郵件, 過濾後才丟到公司內部郵件伺服器.

偶們公司的 mail gateway 使用 linux + postfix + amavisd-new 的方式,

設定極其複雜,  當時還無法透過套件安裝 , 要自行下載甚至編譯 perl 相關模組, 才能使用,

過了幾年為了能達到公司 SSO(single sign on) 的要求, 還研究好久 , 讓 mail gateway 與公司的網域主控站結合,

慘的是公司網域使用工號登入, 工號與郵件名稱又不一樣, 設定起來夭壽雜亂, 設定好之後就不敢動, 也怕動.

但還有些好處, 新人來的時候, 可以拿這個威風一下,  瀟灑地把秘笈丟過去.

現在裝了proxmox mail gateway 5.2 (pmg) , 真想罵髒話(哎喲, 我是彰化人...) ,  居然可以輕易取代公司目前使用的mg.

這裡記下一些設定上的眉角:

1.  綁定網域主控站( ldap )

但是要注意一些相關屬性, 例如Base DN(確認帳號是否存在), BaseDN for Groups(確認是否有此群組) , Email 存放在哪個屬性

2.1 設定Who Objects, 這將用來查詢帳號是否在ldap 裡面

新增一個who物件, 於這個物件中綁定步驟1的ldap設定 , 並且務必指定 Unknow LDAP address, 代表無此帳號的意思

2.2. 設定aliases, 因為原本mail gateway 並沒有aliases這個機制, 但公司的郵件伺服器有aliases, 這時候可以這樣做

2.3 設定危險內容(exe, java ,或是副檔名是vbs, shs, 偶是額外加上ace這個副檔名)

3. 新增規則

規則號碼越高,越優先執行,rules with higher priority are executed first

以下範例, 請依現況調整優先順序(但是aliases必須要在ldap之前),  

Rule: 100 若符合aliases就通過

Rule: 99  若在ldap搜尋不到該email , 就阻擋 

Rule: 98 若符合危險內容就阻擋

4. 設定Relay Domains

5.

5.設定轉寄到內部郵件伺服器

6.

6. 取消灰名單, 以前的經驗告訴偶, 不要啟用這東西, 因為跟公司往來的客戶或廠商, 並不見得有好的mail server

7. 取消寄發到使用者的報表,別讓使用者覺得困擾

8. 一般來說,初體驗會很high, 但是久了就淡了, 因此可以考慮取消各式各樣的報表 status report , 有空再來看就好了

systemctl stop pmgreport.timer

9. 設定 TLS 讓pmg的網頁, 與郵件傳輸使用TLS加密的方式傳輸

9.1 確認是否有DNS CAA

pmg網站需要設定一個對外ip, 與對應dns名稱, 並確保有Certificate Authority Authorization (CAA)功能, 請參閱這裡

9.2 ssh 登入pmg

9.3 取得憑證

安裝工具以便取得免費的證書 LetsEncrypt

apt-get install certbot

certbot certonly --standalone --preferred-challenges http -d <主機dns名稱>

ps. 成功後會在 /etc/letsencrypt/live/<主機名稱>  找到相關的證書, 需要有fullchain.pem , privkey.pem

9.4. 設定憑證

將 fullchain.pem , privkey.pem 合併成一個pem檔案, 並且取代/etc/pmg/pmg-tls.pem  , /etc/pmg/pmg-apt.pem

新增並修改renew.sh內容如下

vi /etc/pmg/renew.sh

#!/bin/bash

/usr/bin/certbot renew

/bin/cat /etc/letsencrypt/live/<主機dns名稱>/fullchain.pem /etc/letsencrypt/live/<主機dns名稱>/privkey.pem  > /etc/pmg/pmg-tls.pem
/bin/cat /etc/letsencrypt/live/<主機dns名稱>/fullchain.pem /etc/letsencrypt/live/<主機dns名稱>/privkey.pem  > /etc/pmg/pmg-api.pem
/bin/chmod 600 /etc/pmg/pmg-tls.pem
/bin/chmod 640 /etc/pmg/pmg-api.pem
/bin/chown root:root /etc/pmg/pmg-tls.pem
/bin/chown root:www-data /etc/pmg/pmg-api.pem

/bin/systemctl restart pmgproxy

讓renew.sh變成可以執行的屬性 chmod +x /etc/pmg/renew.sh

9.5. 設定排程

我是設定1個月,但理論上3個月執行就可以了

crontab -e

輸入

0 0 1 * * /etc/pmg/renew.sh

9.6 啟用TLS

到pmg網頁, Configuration: Mail Proxo : TLS 勾選啟用

9.7.確認是否啟用startssl ,

請輸入 telnet localhost 25   , 再輸入 ehlo localhost , 即可查詢是否有starttls功能

9.8. 測試是否有加密連線

使用gmail寄信, 觀查 /var/log/mail.log 是否出現 starttls=1 字樣

Apr 16 17:43:24 pmg postfix/smtpd[13252]: disconnect from mail-pg1-f170.google.com[209.85.215.170] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7

10. /etc/postfix/main.cf 加上拒絕反查無主機名稱的郵件伺服器IP

smtpd_sender_restrictions =
...
...
        reject_unknown_reverse_client_hostname

然後重啟postfix ,

systemctl restart postfix

11. 還沒想到

amavisd 如何設定才能讓spamassassin擋下來的信件寄到管理者信箱

找出 /etc/amavisd/amavisd.conf 或是 /etc/amavisd.conf
修改

$QUARANTINEDIR = '/var/spool/amavisd/quarantine';
$spam_quarantine_method = 'local:spam-%b-%i-%n';
$spam_admin = "xxx.yyy\@$mydomain";
$mailfrom_to_quarantine = 'xxx.yyy\@mydomain';