跳到主要內容
節省工具箱Jason Tools
經驗分享

Zimbra 通訊群組清單限制寄件者

Jason Cheng 發布
Zimbra 通訊群組清單限制寄件者
本文目錄
  1. 運作原理
  2. 啟用 milter
  3. 用網頁設定可寄件者
  4. 用指令設定可寄件者
  5. 查詢目前的設定
  6. 停用 milter
  7. 結論
  8. 參考資料

企業裡的「全公司」「全體主管」這類通訊群組清單(Distribution List),如果誰都能寄,很快就會變成垃圾信或詐騙信的最佳管道:外部寄一封信給 all@,全公司一起收到。

Zimbra 可以限制只有特定帳號、群組或網域才能寄信給某個通訊群組清單,但前提是要先啟用 milter 服務,而且每次改完權限都要記得重新載入。這篇整理網頁與指令兩種設定方式,以及停用時要注意的地方。

運作原理

Zimbra 的通訊群組寄件限制,是用 sendToDistList 權限來控制,由 MTA 上的 Zimbra milter 在收信時檢查:寄件者有權限就放行,沒有就退信。

所以有兩件事都要做到:

  1. 啟用 milter 服務
  2. 在通訊群組清單上授予 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 都要啟用。

用網頁設定可寄件者

通訊群組清單的擁有者可以在網頁信箱自己設定,不用每次都找管理者:

  1. 管理者先在管理介面把通訊群組清單的擁有者設給某個使用者
  2. 該使用者登入網頁信箱,到「通訊錄」找到這個通訊群組清單,編輯群組
  3. 在設定的最下方,選擇「只有下列使用者可以寄信到此清單」,加入允許的帳號

適合交給部門窗口自己管理的清單。

用指令設定可寄件者

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 要先改設定再停服務。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀