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

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

Jason Cheng 發布 瀏覽 4 次
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

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

關於作者 →

延伸閱讀