企業裡的「全公司」「全體主管」這類通訊群組清單(Distribution List),如果誰都能寄,很快就會變成垃圾信或詐騙信的最佳管道:外部寄一封信給 all@,全公司一起收到。
Zimbra 可以限制只有特定帳號、群組或網域才能寄信給某個通訊群組清單,但前提是要先啟用 milter 服務,而且每次改完權限都要記得重新載入。這篇整理網頁與指令兩種設定方式,以及停用時要注意的地方。
運作原理
Zimbra 的通訊群組寄件限制,是用 sendToDistList 權限來控制,由 MTA 上的 Zimbra milter 在收信時檢查:寄件者有權限就放行,沒有就退信。
所以有兩件事都要做到:
- 啟用 milter 服務
- 在通訊群組清單上授予
sendToDistList權限
只授權不開 milter,限制不會生效;只開 milter 不授權,則是不限制(任何人都能寄)。
啟用 milter
網頁管理介面
- 全域:「首頁 → 設定 → 全域設定 → MTA → Milter Server」勾選啟用
- 單一伺服器:「首頁 → 設定 → 伺服器 → 選擇伺服器 → MTA → Milter Server」
指令
su - zimbra
# 全域啟用
zmprov modifyConfig zimbraMilterServerEnabled TRUE
# 或只對這台伺服器啟用
zmprov modifyServer `zmhostname` zimbraMilterServerEnabled TRUE
# 這個設定需要重新啟動 MTA
zmmtactl restart
# 啟動並確認 milter
zmmilterctl start
zmmilterctl status
zimbraMilterServerEnabled 預設是 FALSE,屬性定義裡標明修改後要重新啟動 MTA 才會生效。多台 MTA 的環境,每台 MTA 都要啟用。
用網頁設定可寄件者
通訊群組清單的擁有者可以在網頁信箱自己設定,不用每次都找管理者:
- 管理者先在管理介面把通訊群組清單的擁有者設給某個使用者
- 該使用者登入網頁信箱,到「通訊錄」找到這個通訊群組清單,編輯群組
- 在設定的最下方,選擇「只有下列使用者可以寄信到此清單」,加入允許的帳號
適合交給部門窗口自己管理的清單。
用指令設定可寄件者
zmprov grantRight(縮寫 grr)授予權限,revokeRight(rvr)撤銷,語法是:
zmprov grr dl <通訊群組清單> <授權對象類型> <授權對象> sendToDistList
授權對象類型
| 類型 | 意義 | 範例 |
|---|---|---|
usr | 單一使用者 | usr user1@example.com |
grp | 某個群組的所有成員 | grp managers@example.com |
dom | 某個網域的所有使用者 | dom example.com |
all | 這台伺服器上所有已驗證的使用者 | all |
pub | 所有人,包含外部寄件者 | pub |
授權給使用者
zmprov grr dl all@example.com usr user1@example.com sendToDistList
zmmtactl reload
授權給群組
例如只有主管群組的成員可以寄給全公司:
zmprov grr dl all@example.com grp managers@example.com sendToDistList
zmmtactl reload
授權給整個網域
只允許內部同仁寄,擋掉外部:
zmprov grr dl all@example.com dom example.com sendToDistList
zmmtactl reload
撤銷
zmprov rvr dl all@example.com usr user1@example.com sendToDistList
zmmtactl reload
注意:每次授權或撤銷之後,都要執行 zmmtactl reload,milter 才會讀到新的權限。這是最常忘記的一步,改完發現沒生效,九成是忘了重新載入。
查詢目前的設定
查某個通訊群組清單的授權
zmprov getGrants -t dl all@example.com
會列出這個清單上所有的授權,包含授權對象的名稱,比較直覺。
也可以看清單的 zimbraACE 屬性,不過裡面存的是授權對象的 Zimbra ID,要再查一次才知道是誰:
zmprov gdl all@example.com zimbraACE
# 輸出例如:zimbraACE: 91ff958e-xxxx-xxxx-xxxx-51baf37c4880 usr sendToDistList
zmprov sa zimbraId=91ff958e-xxxx-xxxx-xxxx-51baf37c4880
檢查某個人有沒有權限
zmprov checkRight dl all@example.com user1@example.com sendToDistList
checkRight(縮寫 ckr)只是檢查,不會改變任何設定,回傳 ALLOWED 或 DENIED。
一次列出所有通訊群組清單的限制
for dl in $(zmprov gadl); do
grants=$(zmprov getGrants -t dl "$dl" 2>/dev/null | grep sendToDistList)
echo "== $dl"
if [ -n "$grants" ]; then
echo "$grants" | sed 's/^/ /'
else
echo " (沒有設定 sendToDistList,任何人都可以寄)"
fi
done
定期跑一次,可以檢查有沒有重要的清單忘了設限制。
停用 milter
如果之後不需要寄件限制,要停用 milter,順序很重要:
# 1. 先把設定改成停用(也可以在管理介面把勾拿掉並儲存)
zmprov modifyConfig zimbraMilterServerEnabled FALSE
# 或
zmprov modifyServer `zmhostname` zimbraMilterServerEnabled FALSE
# 2. 重新啟動 MTA,讓 Postfix 不再經過 milter
zmmtactl restart
# 3. 再停止 milter 服務
zmmilterctl stop
注意:不能直接 zmmilterctl stop 就結束。設定還是啟用時,Postfix 仍然會把信送給 milter 檢查,milter 停了就連不上,結果是整台伺服器寄不出、收不到信。一定要先改設定、重新啟動 MTA,最後才停 milter。
結論
全公司、全體主管這類大型通訊群組,我建議一律設定寄件限制,至少限制只有內部網域可以寄,最好再收斂到特定窗口。設定本身不難,記住兩件事就好:改完權限要 zmmtactl reload、停用 milter 要先改設定再停服務。
參考資料
- Zimbra Wiki:Enabling and administering the Zimbra milter
https://wiki.zimbra.com/wiki/Enabling_and_administering_the_Zimbra_milter - Zimbra 常用 CLI 指令整理
https://blog.jason.tools/2021/05/zimbra-cli.html - Zimbra Forums:Restrict sending to distribution list
https://forums.zimbra.org/viewtopic.php?t=65592



