適用於初創公司的超輕量級smtp服務配置

背景

smtp 是一種常見的服務,提供了程序自動化郵件外發的可能。不光是用於產品向客戶的通知服務;更多的是用在企業內部的信息工具,比如我們就有 sentry / confluence / zulip 等等非常多的開源工具,都需要配置 smtp 來實現內部信息的聯動。

當前最簡單的郵箱使用方式是使用開放的郵箱服務,比如現在很多小型企業在使用的企業郵箱,可以配置一個專門的賬號來提供發信服務。但是,這種方式存在非常大的安全隱患。


問題

直接使用公開的賬號,很容易帶來安全問題:

  1. 自動化發信的程序需要用戶名和密碼,這些信息需要存儲在代碼或者配置中

  2. 有經驗的程序員知道將敏感信息分離,並且存儲在代碼庫外;然而新員工,或者安全意識不強的同事很容易將這些信息入庫

  3. 更糟糕的是,即三令五申,有些程序員還是會無意的把代碼放到github 上,這些是公開可以訪問的

  4. 然後就炸了


當郵箱賬號一泄露(一般 smtp 賬號同樣能登陸郵件賬戶或者使用 pop3 協議),郵件裏面隱藏的一些敏感信息(尤其是 confluence 的通知郵件)會帶來更多的泄露,嚴重的可能會影響到我們競選總統。





一種解決方案是,加強所謂的安全流程,同時通過一些工具來驗證輔助(比如大家都在做的 github 掃描),但這種方式過於被動,而且無法從根本上來解決問題。技術上的問題,還得尋求技術方案來解決


解決方案


其實傳統的工具就可以解決這個問題,我們就採用了 postfix 作 smtp 中轉:



  1. 配置 postfix 作爲 smtp replay 服務,將發信方與真正的郵件服務器隔離開來

  2. 發信方與 postfix 使用公司內部賬號(甚至無賬號)進行內網通信,這樣即使賬號泄露,也無法用來登陸郵箱獲取信息;同時,由於 postfix 是內部的服務,可以更靈活的配置防火牆

  3. postfix 和 smtp 服務之間仍然使用 smtp 賬號,但這裏只有系統管理員才需要知道賬戶,相對安全。另外,還需要進行自動刪信,禁用 pop3,微信登陸等手段來加強,這個 163 郵箱,qq 郵箱都有不同的配置,請自行設置


說白了,就是靠代理解耦來解決問題。熟悉我們的人估計一看就明白,因爲我們很多問題都是靠這種方式來解決。下面簡要描述下配置供參考。



sudo vim /etc/postfix/main.cf 


#####以下是main.cf配置內容

relayhost = [$SMTP_HOST]:25 

smtp_sasl_auth_enable = yes 

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd 

smtp_sasl_security_options = noanonymous

#配置重寫規則,強制修改發送郵件地址,防止smtp服務拒收郵件

ender_canonical_maps = pcre:/usr/local/etc/postfix/sender_canonical_map

#####以上是main.cf配置內容


sudo vim /etc/postfix/sender_canonical_map

#####以下是main.cf配置內容

/.*/ 發信smtp用戶名

#####以上是main.cf配置內容


sudo vim /etc/postfix/sasl_passwd 

#####以下是sasl_passwd配置內容

[$SMTP_HOST]:25     用戶名:密碼

#####以下是sasl_passwd配置內容


sudo postmap /etc/postfix/sasl_passwd

sudo service postfix resart


# done




自動化集成

添加自己的 smtp 中轉服務,還可以配置無賬號登陸的方式,這樣在命令行中調用服務將更加簡單,這也是我們搭建 postfix 的另外一個原因。這裏介紹兩種方式:

1、通過 curl 命令發送郵件

最新版的 curl 命令支持 smtp / smtps , 不過髮型版自帶的比較老,需要自己下載最新版本進行編譯安裝,使用的話相對簡單。


/usr/local/bin/curl -s -v --url "smtp://xxxx:25" --mail-from "[email protected]" --mail-rcpt "[email protected]" --upload-file mail.txt


# content of mail.txt

From:[email protected]

To:[email protected]

Subject: curl發送郵件標題


xxxxx


2、通過傳統的mailx命令來發送郵件

其實依舊是相對傳統的命令,比如 mailx 就能滿足我們的需要。不過安裝起來略顯麻煩,需要在每個發行版找各自合適的包,比如 ubuntu 就應該安裝 heirloom-mailx ,使用起來則更加簡單:


echo "test" |mail -S smtp=xxxx -r [email protected] -s subject [email protected]


上面一條命令就可以將信息通過郵件進行發送。

我們更加傾向於採用第二種,因爲比較簡單:這使得我們在大量的腳本中能很方便的集成郵件通知功能。



總結

本文描述了通過 postfix 做 smtp relay 的方式來解決賬號泄露的風險,這也再一次驗證了兩點:

  1. 代理是王道,幫懶人快速解決問題。

  2. 技術遇到的問題必須用技術來解決,這比所謂的架構 / 流程要靠譜的多。




陸文,豈安科技聯合創始人,首席產品技術官


曾擔任PayPal資深高級工程師。參與豈安科技所有產品線的架構和設計,帶領團隊在數據挖掘、多媒體分析、跨數據中心分佈式系統、高性能實時大數據計算、海量數據採集等領域進行前沿研究和產品化,推動豈安成爲國內領先的大數據解決方案提供商。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章