開源郵件系統安全
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
第一章 電子郵件基礎知識
系統組成 1、郵件分發代理(mail delivery agent MDA) 在本地郵件服務器上將郵件分發給用戶。郵件文件/var/spool/mail or $home/mail or郵件目錄??蛇M行自動郵件過濾,自動回復,自動觸發程序等功能。開源的MDA程序有:binmail(is mail),procmail。 2、郵件傳送代理(mail transfer agent MTA) 負責郵件的傳送和接收。開源MTA有:sendmail,qmail,postfix。 3、郵件用戶代理(mail user agent MUA) 在unix郵件模型中,用戶使用一個本地郵箱來存放自已的郵件。MUA程序向用戶提供了讀取存在他們郵箱中郵件的操作界面。它并不接收郵件,它只是顯示已經有用戶郵箱中存在的郵件。開源的MUA程序,文本方式的binmail,圖形方式的pine,kmail。 郵件安全 避免開放式轉發,防止垃圾郵件,防范病毒。 第二章 SMTP協議 基本命令 1、HELO HELO hostname 從客戶端打開問候信息,使用SMTP服務器識別客戶機的身份。但客戶機可隨意修改這個hostname。存在安全問題,如果真要知道客戶機的身份,可使用反向域名解析系統,根據客戶機的IP地址查詢其DNS名字。如果不符可拒絕訪問。 2、MAIL 標識發件人,MAIL FROM:XXX@EXAMPLE.COM 3、RCPT 標識收件人,RCPT TO:XXX@EXAMPLE.COM 4、DATA 標識郵件開始,命令后的所有內空為郵件的正文。以單行的“.”號為結束標記。 5、SEND 直接把郵件發送到登錄用戶的終端,只在用戶登錄進來時有用,通常會彈出一條信息。有點類似于UNIX的write命令。該命令有一個很大的安全隱患,外部使用者使用該命令不需登錄進計算機就可以知道有哪些用戶登錄進了系統。黑客利用這一點在互聯網上搜錄受害者ID和登錄時間而不被發覺。絕大多數SMTP軟件都不再支持這個命令。 6、SOML(SEND OR MAIL) 發送或郵寄。如果接收都當前登錄到系統上,就執行SEND,如果不在就執行MAIL,同樣有以上安全問題,通常禁用。 7、SAML(SEND AND MAIL) 發送和郵寄。同時完成兩個功能。同樣有以上安全問題,通常禁用。 8、RSET 即重置。如果客戶機在接收服務器的響應時出現了混亂,認為當前的SMTP連接不再同步,就可以通過發該命令使連接回到HELO狀態。 9、VRFY 在進入SMTP模式前,可以使用這個命令來判斷一個SMTP服務器是否能將郵件發送到某個接收者。VRFY username。它是一個很好的故障排除工具。但存在可被黑客和垃圾郵件發送者利用的缺陷,因此很多站點都禁用這個命令。 10、EXPN 即擴展,用來向SMTP服務器查詢郵件列表和別名。郵件列表是一種只使用一個地址向一群人發送郵件的快捷方式。EXPN address。通常禁用。 11、HELP 幫助命令。 12、NOOP 什么都不做,只是返回一個大于零的應答碼。通常用于檢測連接是否能建立。 13、QUIT 退出系統。 14、TURN 允許兩臺計算機在一個TCP連接中進行雙向郵件傳輸。有安全問題,通常禁用。在ESMTP中有ETRN命令。 服務器應答 1、錯誤返回碼 500 語法錯誤 501 參數中語法錯誤 502 不支持該命令 503 命令序列錯誤 504 不支持該命令參數 2、信息返回碼 211 系統狀態,或系統幫助 214 幫助信息 3、服務返回碼 220 服務已準備好 221 服務正在關閉傳輸通道 421 服務不可用 4、操作返回碼 250 所請求的郵件操作已進行完畢 251 非本地用戶,需要發送至<forward-path> 354 開始郵件輸入,以單行“.”號結束。 450 所請求的郵件操作未進行,郵箱不可用。 451 所請求的操作被中止,發生處理錯誤。 452 所請求的操作未進行,系統存儲空間不足。 550 所請求的操作未進行,郵箱不可用。 551 非本地用戶,請嘗試<forward-path> 552 所請求的郵件操作被中止,超過存儲空間。 553 所請求的操作未進行,郵箱名被禁止使用。 554 事務處理失敗。 詳情可參見:MTA的錯誤信息代碼 1982年RFC821定義第一版的SMTP協議,1995年RFC1869定義了一套擴展SMTP功能的方法。使用擴展SMTP的標志是把最初版本中的問候命令HELO用新的問候命令EHLO代替。一旦服務器接收到這條命令,它意識到客戶機有能力發送擴展的SMTP命令。新的命令有: 1、DSN(Delivery Status Notification),用來提示用戶某封特定郵件的狀態。 2、ETRN。允許客戶端請求同服務器建立另一條smtp連接來傳送郵件。它僅僅開始另一個會話,并不用原來的已經存在的會話傳輸數據。這樣SMTP服務器就可以用DNS域名解析方法同客戶進行聯系。不依賴于客戶聲明的身份。 3、AUTH。它允許SMTP客戶機使用用戶ID AND PASSWORD或其他認證技術向服務器正確標識自己的身份。認證機制參數如下: PLAIN 使用文本方式的用戶名和認證id和口令。 LOGIN 使用基于64位密鑰加密的用戶名和口令。 GRAM-MD5 使用基于MD5加密的用戶名和口令。 DIGEST-MD5 使用基于MD5加密的用戶名和口令的摘要值。 KERBEROS_V4 使用基于Kerberos認證密鑰。 GSSAPI 使用普通安全服務(Generic Security Service,GSS)認證密鑰。 郵件格式(RFC822規范定義) Received段 用來標識將郵件從最初發送者到目的地進行中間轉發的SMTP服務器 from host name by host name via physical-path with protocol id message-id for final e-mail destination Return-path:route 標識郵件發送到目的地服務器所經過和路徑 Reply to:address 郵件發出的地址 From: Sender: 標識原始郵件的作者 Date:date-time 郵件的時間 Destination段 to:address 接收方地址 Cc:address 抄送方地址 Bcc:address 密送方地址 option段 Message-ID:Message-id Resent-Message-ID:Message-id In-Reply-To:message-id References:message-id Keywords:text-list Subject:text Comments:text Encrypted:word Resent段 由于某種原因需從客戶端再次發送,該段內容在信頭的原始字段前面加上resent。 resend-reply-to resent-from resent-sender resent-cc resent-to resent-bcc resent-date 第三章 pop3協議 RFC1939定義了一個頗為流行的允許客戶機從遠程服務器上收取郵件的協議。稱為郵局協議(post office protocol,pop)?,F在使用的是該協議的第3版本,通常稱之為POP3。端口110 。 user/pass命令用于登錄pop服務器,但它是以ASCII碼格式明文傳送的,存在安全問題。apop命令登錄時是用MD5加密的。命令格式:apop name digest AUTH命令,AUTH mechanism(PLAIN,LOGIN,SKEY,GSSAPI,KERBEROS) 客戶端命令 STAT 顯示郵箱當前狀態 LIST 顯示郵箱內容列表 RETR 從郵箱取回單個郵件的文本內容,參數是LIST命令返回的郵件號 DELE 刪除郵箱中的郵件,參數是LIST命令返回的郵件號,按QUIT退出時郵件才真正刪除。 UIDL 唯一的郵件ID列表。 TOP 可選安裝的命令,它允許客戶機以手工方式來獲取郵箱郵件的概要信息 top msg n, top 10 5,表示顯示第10封5行的概要信息 NOOP 什么都不做,用于查看服務器的狀態響應情況。 RSET 重置 QUIT 退出 pop協議還存在一些缺陷,因此,近年來有一種開發更高級郵件收取協議的趨勢,例如IMAP. 第四章 IMAP IMAP(Interactive Message Access Protoclo)是由華盛頓大學開發的交互郵件訪問協議。端口143。 它允許使用者從多個地點訪問郵箱而不會把郵件分割在不同計算機上,它把郵箱都存在服務器上。供客戶隨時隨地取用。 LOGIN,文本方式的認證方法,存在安全問題 AUTHENTICATE命令 (PLAIN,LOGIN,SKEY,GSSAPI,KERBEROS) IMAP客戶端協議 IMAP提供了一系列命令對服務器上不同郵箱的郵件進行讀取,轉移和刪除。記住,IMAP把所有的郵件都存放在服務器端,下載純粹是為了顯示。用戶的缺省郵箱稱為INBOX,所有的新郵件都出現在INBOX中。用戶可以創建新郵箱,把INBOX中的郵件轉移到其它地方。郵箱中的每條郵件都有一個唯一的ID,ID在不同會話中保護不變,以便客戶端正確標識郵件。每個郵箱都有一個唯一的有效性標志(UIDVALIDITY),只要郵件的UID不發生變化,郵箱的有效性標志(UIDVALIDITY)也不會變化。如果郵箱中出現了不同的UID,那么下一次連接時的有效性標志(UIDVALIDITY)就會變大,用戶就可以迅速知道有新郵件。 IMAP郵件標志 \Seen 已被閱讀 \Answered 已被回復 \Flagged 標識為緊急 \Delete 標識為已刪除 \Draft 草稿 \Recent 新郵件 IMAP客戶端命令 select 選擇一個郵箱操作 examine 以只讀方式打開郵箱 create 創建郵箱,默認在$home目錄下 delete 刪除郵箱,而不是郵件 rename 郵箱改名 subscribe 在客戶機的活動郵箱列表中增加一個郵箱 unsubscribe 在客戶機的活動郵箱列表中去掉一個郵箱 list 顯示客戶機可用的郵件列表 list reference mailbox, reference是郵箱路徑參數相關的目錄名,如果是“”,則表示用戶登錄目錄。 可列出所有文件,包括不是郵箱文件,存在安全問題,可以lsub。 lsub 只列出用subscribe設定為活動的郵箱。 status 查詢郵箱當前狀態 messages 郵箱中的郵件總數 recent 郵箱中標志為\recent的郵件數 uidnext 可以分配給新郵件的下一個UID uidvalidity 郵箱的UID有效性標志 unseen 郵箱中沒有被標志為\SEEN的郵件數 append 向某個郵箱發送郵件。不安全,最好不要使用 check 在郵箱中設置一個檢查點,任何未完成的操作,都會被做完以保護郵箱的一致性。 同unix系統的sync close 關閉郵箱,所有\delete標志郵件就會被物理刪除, 在打開另一個郵箱時, 當前郵箱隱式地調用close。 expunge 在不關閉郵箱的情況下刪除所有標志為刪除的郵件。 search 搜索郵件,有很多搜索關鍵字,書上有,筆記沒列出,可查詢相關資料。 fetch 用于讀取郵件,fetch messageset datanames(ALL,BODY AND BODY[section])。 BODY[section]會設置\seen標志。 BOOY.PEEK[section]不會設置\seen標志。 store 用來修改郵件相關的信息。store messageset dataname datavalue。 例如:store 1 +flags \deleted設置刪除標志。 copy 把郵件從一個郵箱復制到另一個郵箱。copy messageset mailboxname。 uid 同fetch,copy,store or search一起使用,以標識uid號。 capability 返回請求返回imap服務器支持的功能列表。 noop 什么都不做,用來向服務器發送自動命令,防止因長時間處于不活動狀態而導至連接中斷。 logout 退出并關閉所有郵箱。任何作了\deleted標志的郵件將在這個時候被刪除。 第五章 MIME協議 向互聯網上的遠程主機傳輸二進制數據的最流行的編碼方法是uuencode and MMIE(Multipurpose Internet Mail Extension多用途互聯網郵件擴展)格式。 Unencode—在smtp出現幾年前,unix系統管理員向調制解調器線路發送二進制數據時首先將其轉換為ASCII文本,然后嵌入郵件中,這種把二進制數據轉換成ASCII文本數據的方法稱為uuencode,其中uu代表unix to unix,是unix系統間復制協議組(UNIX TO UNIX COPY PROTOCOL)的一部份。 使用uuencode編碼/解碼 編碼:uuencode [file] name example:uuencode hello hello>hello.uue default input is stdin; default output is stdout. 解碼:uudecode [-o outfile] name example:uudecode hello.uue 可以用-o選項輸出另外一個文件名。 MMIE 很多新開發的郵件軟件都不使用uuencode,因為出了一種對二進制數據進行編碼的互聯網標準。MMIE,MMIE的報文格式在RFC2045 AND RFC2046定義。功能把UUENCODE豐富,它將關于文件的附加信息也同時傳送給解碼器。使解碼器可以自動檢測不同類型的二進制文件并解碼。 MMIE頭字段 MIME-Version 所使用的MMIE版本 Content-Transfer-Encoding 將二進制數據編碼為ASCII文本使用的編碼方案,7種: 7bit 標準的7位ASCII文本(default) 8bit 標準的8位ASCII文本 binary 原始二進制數據 quoted-printable 將數據編碼成US-ASCII字符集中的可打印字符。 base64 每6位二進制數據轉換成1個8位的可打印字符。 ietf-token RFC定義的擴展令牌編碼。 x-token 兩人字符X- or x-跟隨,沒有任何令牌產生的分隔空格 Content-ID 郵件內容部份的唯一標識,通過該標識mmie的內容可被其它mmie郵件引用 Content-Description 郵件內容部份的簡短描述 Content-Type:tyep/subtype(必須) 編碼數據中的內容類型 type為基本類型 1、text文本類型 plain子類型:表示沒有格式的普通ASCII文件 html子類型:表示使用標準的html標記來格式化文本 enriched子類型:表示文本的格式類似于很多字處理軟件中的豐富文本格式. RTF(有下劃線,粗體等)。 還應該使用字符集參數charset明確指明數據編碼時采用的字符集。如: Content-Type:text/plain;charset=us-ascii 2、message報文類型,允許郵件軟件在一條郵件發送多條RFC822郵件 rfc822子類型:表示嵌入的是一條普通的RFC822郵件 partial子類型:表示被分成幾部份的一段長郵件 external-body子類型:表示指向郵件外某位置的指針 3、image圖像類型,jpeg and gif。 事實上需用Content-Type-Encoding字段中定義的標準MIME編碼方式來編碼。 4、video視頻類型,mpeg,同上需用Content-Type-Encoding 5、audio聲音類型,basic, 采用8kHz采樣頻率編碼的單信道綜合服務數字網mu-law。 6、application應用程序類型。 postscript子類型:定義以附錄格式出現的打印文檔。 octet-stream子類型:定義包含任意二進制數據的郵件。 7、multipart混合類型 可包含多種數據類型,每種數據類型用Conten-Type來定義。 每種定義間用邊界標識符來分隔 example: Conten-Type:mulipart/mixed;boundary=bounds2 –bounds2 分隔符 Conten-Type:text/plain;charset=us-ascii –bounds2 … –bounds2– 結束符 類型有四種: mixed:表示各部份間互相獨立,應該按照它們在郵件中嵌入的順序向接收者顯示。 parallel:表示各部份間互相獨立,可按任意順序向接收者顯示。 alternative:表示各部份都是同一數據的不同表示方式,只需要使用最合適的顯示方式顯示其中一部份 digest:表示同mixed一樣的方式,但是郵件體總是rfc822格式。 S/MIME 安全MIME協議 在S/MIME Multipart中加入一個signed子類型,郵件由兩部份組成,標準郵件部份和數字簽名。數字簽名方法允許發信人使用唯一的代碼來“簽發”郵件,其他人可以使用公鑰來驗證該代碼。這種方法并不對郵件進行加密。人們創建pkcs7-mime應用子類型來提供一些郵件安全功能。每種功能使用pkcs7-mime子類型中的一個單獨的參數,通過smime-type標志來確定。 example:Conten-Type:multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1;boundary=bound1 –bound1 Conten-Type:text/plain this is a clear-signed message –bound1 Conten-Type:application/pkcs7-signature;name=smime.p7s Conten-Transfer-Encoding:base64 Content-Disposition:attachment;filename=smime.p7s … –bound1– pkcs7/mime功能 data 未加密的郵件文本在其它Content-Type部份中表示郵件內容使用了安全服務措施,但是在pkcs7-mime類型中包含的使用data功能定義的數據不被加密。 encrypted-data 加密的郵件文本在其它Content-Type部份中表示郵件內容已經加密,數據是使用公鑰加密方法加密的,加密后的數據使用某種標準的MIME編碼方法,例如base-64,轉換成ASCII文本。 signed-data 未加密的郵件文本和數字簽名???????同multipart/signed方法類似,允許發送方將普通的文本郵件連同數字簽名一起發送,不同的是application/signed-data方法使用公鑰加密方式對原始郵件進行加密和簽名。結果經base-64編碼后通過smtp發送。接收端郵件閱讀軟件必須能夠將郵件解密供收信人閱讀。 enveloped-data 加密的郵件文本向郵件提供郵件加密服務,但是不提供認證服務。 signed-and-enveloped-data 加密的郵件文本和數字簽名在一封郵件中包含了公鑰加密服務和數字簽名服務,接收端軟件必須能夠將郵件和數字簽名解密。這樣收信人不但能能夠看到郵件內容,同時也可以判斷是誰發出的郵件。 digest-data 用來認證原始郵件的經過散列運算的郵件文本用于認證郵件內容,郵件發送時,發送人使用自已的數字簽名對郵件進行散列運算。散列函數根據事先確定的算法計算出一個散列值,放到digest-data部份,該部份被加進普通郵件部份,收信人使用數字簽名對收到的郵件進行散列運算,比較結果和digest-data中的值,如果相等就認為郵件是可信的。 其中data,signed-data,enveloped-data是必須支持的S/MIME功能。 在S/MIME中加密郵件和生成數字簽名,你必須有一個有效的,唯一的數字標識密鑰。有幾家公司提供這種密鑰,通常是收費的。關于獲得數字標識密鑰的更多信息可以瀏覽verisign網站。 unix 上常用的MIME郵件處理工具:metamail and reformime 小結 使用smtp發送二進制數據是一件復雜的事,現在有二種方法可以實現,一個用uuencode程序,將二進制數據轉換成ASCII文件,收信人用uudecode解碼還原。另一種是用mime協議在郵件發送前轉換并標記二進制數據。MIME格式的郵件包含若干獨立的部份,封裝了不同類型的發送數據。普通文本不用編碼直接包含進來,二進制數據,例如圖像和可執行文件,通過base-64編碼后作為獨立部份包含在郵件中。各部份的定義存放在一個MIME郵件頭字段中,這樣接收郵件服務器就可以將各部份解碼。 S/MIME是在標準的MIME中加進了安全功能。人們通過增加幾種MIME郵件頭格式來標識簽名的郵件和加密后的郵件,郵件加密過程使用商業數字密鑰實現的。接收者郵件服務器必須能夠識別用來加密郵件的數字密鑰。 S/MIME的另一種使用方法是采用外部加密軟件,pgp程序給用戶提供了一種在郵件發送前進行加密和簽名的方法。收件人知道發信人的數字密鑰才能正確認證并解密郵件。 第六章 讀取郵件頭 to: and from:字段是代表收信人和發信人的郵件地址,但它們是可以偽造的。to:錯了郵件是不會被發送到錯誤的地方的。因為RCPT命令用來通知遠程郵件服務器將郵件發給誰,服務器使用該命令的信息而不是郵件頭中的to:字段信息來發送郵件。對于垃圾郵件,發信人使用軟件篡改了郵件頭中的to:字段,將正常的收件人地址放到了Bcc:字段或RCPT命令中。通過篡改to:字段,發信人就可以把一封同樣的郵件群發給成千上萬的顧客。決竅不在于to:字段被篡改,而在于郵件沒有使用標準的MTA程序發送。垃圾郵件發送人使用了一個特殊的MTA程序,從目標地址列表中讀取郵件地址,然后把它們放到BCC: OR SMTP中的RCPT命令中,而不是使用通常的TO:字段。 received:字段 垃圾郵件發送人的郵件主機依賴于遠程的支持開放式轉發的郵件服務器,每經一部服務器,就要在郵件頂端加一個received:字段。記錄時間戳,可以查詢郵件經過服務器的時間。 message-id:字段 該字段常常也能發現最初的發信人。它由最初發送郵件的服務器產生,通常包括服務器主機名。 使用dns程序追查郵件主機 whois nslookup dig(A 互聯網地址,SOA 從正式信息開始,NS 名稱服務器,MX 郵件服務器) 利用外部防垃圾郵件的服務 SpamCop網站 Sam Spade網站 第七章 保護UNIX服務器安全 利用syslogd日志程序 安裝防火墻(iptables) 利用Bastille工程加固linux安全 入侵檢測,安裝Tripwire。 第八章 Sendmail郵件軟件 sendmail 組成部份 sendmail 從本地和遠程接收郵件并決定怎樣進行發送 sendmail.cf 控制sendmail程序運行的配置文件 sendmail.cw 包含sendmail收取郵件的域名列表 sendmail.ct 包含可以控制sendmail的信任用戶列表 aliases 包含可以把郵件重定向給其它用戶,文件或程序的有效本地郵件地址列表 newaliases 從文本文件中創建一個新的別名數據庫文件 mailq 檢查郵件隊列,顯示所有信息 mqueue 存放待發送郵件的隊列 mailertable 用來覆蓋向指定域的路由 domaintable 用來把舊域名映射互新域名 virtusertable 用來把用戶和域名映射到其它地址 relay-domains 用來允許特定主機通過sendmail程序轉發郵件 access 用來拒絕或允許來自某個域的郵件 sendmail.cf文件包含用來分析每條郵件,并決定怎樣處理的規則集。它是由一系列的類(定義常用詞組,幫助規則集指定特定的郵件類型),宏(為減少配置文件中長字符串的輸入而設定的值),選項(定義sendmail運行的參數)和規劃集組成。 sendmail 配置文件中使用的字符 C 定義文本的類 D 定義宏 F 定義包含文本類的文件 H 定義郵件頭字段和動作 K 定義包含查詢文本的數據庫 M 定義發件人 O 定義sendmail選項 P 定義sendmail優先值 R 定義解析地址的規則集 S 定義規則集組 D行 Dx value example:DnMAILER-DAEMON 它把字符串MAILER-DAEMON分配給了宏n,規則集就可以使用宏$n來代替字符串MAILER-DAEMON。 C行 Cc phrase1 phrase2 …,c是類名,phrase1,phrase2等是希望歸為一組的單詞。example:Cwlocalhost sadrach。這個例子把單詞localhost,shdrach歸為w類,在規則集中使用$w變量時,sendmail就將會用這兩個單詞來替換該變量。 F行 Fc filename,和C行類似。但F行指向包含類中所有用來單詞列表的文件。c是單字符類名,filename是包含單詞列表的全路徑名文件。 K行 定義sendmail中用來查詢不同類型信息的特殊的映射數據庫。Kmapname mapclass arguments。mapname是配置文件中使用的數據庫名,mapclass是生成的數據庫類型(dbm,btree,hash等)grguments用來幫助sendmail創建數據庫??梢杂胢akemap命令從文本文件中創建映射數據庫,不同的unix版本使用不同的默認映射庫,目前,linux的makemap只支持btree and hash類型的映射類。地者中hash常用。命令例子:makemap mapclass outputfile < textfile H行 定義sendmail加到郵件中的郵件頭中的行的格式。H[?mflags?]hname:htemplate,mflags是宏標志,必須定義。hname是郵件頭中行的名字,htemplate是使用宏的郵件頭行的格式。 M行 定義一個sendmail用來發送郵件的發送程序。每種不同類型的發送程序都必須有一個M行定義,這樣sendmail才知道怎樣使用它們。Mprog,[field=value]…。prog是發送程序的名字,每個field=value對定義sendmail使用該發送程序所需要的屬性。 P行 定義優先值。每個RFC822格式的郵件都可以使用郵件頭中的Precedence:字段來定義郵件的緊急程序。Ptext=value。text是Precedence:中的字符串,value是sendmail根據Precedence中的文本字符串分配數字優先值。Pfirst-class=0;Pspecial-delivery=100;Plist=-30。 O行 定義控制sendmail運行的選項。這些選項也可以在sendmail程序啟動時用-O or -o設置。 O option=value。 規則集行是配置文件的核心,它們指示sendmail怎樣獲取接收郵件并決定怎樣將郵件發給相應的接收人。規則集使用R 和 S行。R行定義對郵件進行的實際操作,S行定義規則集分組。 R行 R行用令牌處理發來的郵件,以確定正確的收件人和將郵件發給收件人的方法,每一個R行代表一個獨立的規則。每條規則由兩部份組成,左手邊(left-hand side,LHS)和右手邊(right-hand side,RHS),LHS定義在發來的郵件中尋找哪些令牌或單詞,RHS定義怎樣基于LHS發現的令牌重寫地址。格式如下:Rlhs rhs comments字段間至少使用一個制表符分隔。規則集中使用的任何宏和類都被展開以匹配獲取的信息。LHS定義特殊的符號來分析郵件, LHS 符號 $* 匹配0個或更多個令牌 $+ 匹配1個或更多個令牌 $- 只匹配1個令牌 $@ 匹配0個令牌 $=x 匹配x類中的所有條目 $-x 匹配所有不在x類中的條目 RHS 重寫郵件時所使用的符號 $n 從LHS中替代令牌n $[name$] 主機的正式域名(FQDN) $(map key $@ arguments $:Default $) 通用的密鑰映射功能 $>n “調用”規則集n $#mailer 解析郵件發送程序名 $@host 指定主機 $:user 指定用戶 S行 標識一組通常用數字表示的組成規則集規則。sendmail共有六個標準的規則集,分別是: 0 解析郵件發送程序,主機和用戶 1 應用于所有發件人地址 2 應用于所有的收件人地址 3 把地址轉換成正式的域名格式 4 將內部地址翻譯為外部地址 5 應用于所有沒有別名的本地地址 典型的郵件通過標準規則集的路徑:所有郵件都首先通過規則集3,把主機名轉換成FQDN格式,將地址“清除”。通過規則集3后,規則集0從地址中解析出發件人,主機名和用戶名。然后郵件被交給由M行定義的相應的郵件系統。同樣,規則集1用來改寫發送人地址,規劃集2用來改寫收件人地址。這些信息然后被交給規則集4,用來把地址轉換成外部格式。可用-bt選項來運行sendmail,以監視不同規則的動作。 m4預處理器 m4預處理器用來從一組宏文件中創建sendmail配置文件。宏文件作為輸入被讀進來。宏被展開,然后寫到一個輸出文件。 sendmail 宏定義 divert(n) 為m4定義一個緩沖動作,當n=1時緩沖被刪除,n=0時開始一個新緩沖 OSTYPE 定義宏所使用的操作系統,該宏允許m4程序增加同相關操作系統相關的文件 Domain 定義MTA將使用哪些域來傳輸郵件 Feature 定義配置文件中使用的一個特定的功能集 Define 定義配置文件中的一個特定的選項值 MASQUERADE_AS 定義sendmail來應答郵件的其它主機名 MAILER 定義sendmail使用的郵件傳輸方法 啟動sendmail。sendmail -bd -q30m 該命令以后臺進程方式(-bd)運行,并使其每隔30分鐘(-q30m)輪詢一次未發送郵件隊列,檢查是否有新郵件。 保障sendmail安全 文件權限 正確設置文件權限是sendmail系統重要的一部份,如果文件、目錄或用戶的權限設置不當,會給黑客有機可乘。如果違背了sendmail的文件權限策略,sendmail將會產生警告信息?,F在的sendmail程序中對文件和目錄又增加了很多新約束,絕大多數限制都歸結為以下兩種常常被忽視的情況: 1、對于同組中用戶或全局用戶可寫的文件sendmail不能讀、寫和執行。 2、對于同組中用戶或全局用戶可寫的目錄下的文件sendmail不能讀,寫和執行。 這兩種情況覆蓋了絕大多數缺乏經驗的郵件管理員所遇到的問題。 如果必須存在組可寫或全局用戶可寫的文件或目錄的郵件環境,你可以使用sendmail.cf配置文件中的DonBlamesendmail選項參數禁止sendmail發出警告。O DonBlamesendmail = option。option是你所希望開放程度的一個或多個參數名,缺省值為safe。表示嚴格的策略。 如果希望sendmail訪問位于組可寫目錄下的文件,可以用如下格式: O DonBlamesendmail=GroupWritableDirPathSafe(注意,故障排除時可用該選項,正式工作服務器不應該這樣設置) sendmail用戶 sendmail能識別三種特殊用戶,這三種用戶在sendmail.cf文件中被定義成選項值: TrustedUser DefaultUser RunAsUser 缺省情況下,sendmail假定root用戶將被用來運行sendmail并擁有所有特殊的sendmail文件。如sendmail.cf and sendmail.cw??梢允褂靡韵逻x項來修改sendmail使用的用戶值。 TrustedUser選項允許你指定一個或多個用戶作為sendmail訪問的文件屬主,可以用T行來設置信任用戶Troot,Tdaemon等,也可以用Ft行來定義。DefaultUser允許sendmail使用root以外的用戶名來運行獨立的郵件程序。如(procmail)。 缺省時,sendmail將會以mailnull來運行所有的郵件程序。除非它在系統中找不到該用戶名時才會使用root來啟動郵件程序。RunAsUser選項指定了運行sendmail的用戶名的權限。 sendmail必須用root用戶啟動才能訪問smtp端口,此后,它可以使用setuid功能轉變為系統中的另一個用戶。這個用戶必須能訪問下面列出的服務器上的同sendmail相關的區域。1、對/var/spool/mqueue目錄有寫權限;2、對/var/log/maillog文件有寫權限;3、對sendmail.cf 文件以及其它用來的sendmail列表有讀權限。 受信應用 作為更高級別安全控制,sendmail允許你在基于別名或.forward文件發送郵件時指定所使用的可執行的程序。使用受限shell(smrsh)。 第九章 qmail 第十章 postfix 第十一章 防止開放式轉發 配置選擇性轉發 sendmail 8.9版本以后,sendmail在缺省配置時禁止進行開放式轉發,你需要指定哪些主機、網絡或域被允許通過你的郵件服務器轉發郵件。下面介紹通過配置sendmail進行選擇性轉發。 1、使用訪問列表 sendmail允許你創建一張訪問列表,記錄可以訪問你的郵件服務器的主機。host active。Host可以是主機,子網或域名。active可以是Ok–遠程主機可以向你的郵件服務器發送郵件; RELAY–允許中轉;REJECT–不能向你的郵件服務器發郵件和不能中轉;DISCARD–發來的郵件將被丟棄,同時并不向發送者返回錯誤信息。nnn text– 發來的郵件將被丟棄,但sendmail將會向發送者返回nnn確定的smtp代碼和text變量確定的文本描述。 下面是一個訪問列表的例子: 192.168 RELAY XXX.NET OK XXX.COM REJECT XXX.COM 550 SORRY,WE DON’T ALLOW SPAMMERS HERE XXX.ORG DISCARD 2、在配置中加進訪問列表 如果使用m4宏預處理器,把以下命令加進sendmail.mc腳本。FEATURE(`access_db’)。如果沒有m4,你必須手工添加一條K配置行來定義訪問列表。Kaccess hash /etc/mail/access。 3、創建訪問列表 makemap /etc/mail/access < /etc/mail/access.txt 4、其它選擇式轉發選項 可在m4的FEATURE命令中配置 relay_host_only 只允許訪問列表中的列出的主機 relay_entrie_domain 允許所有聲明是你的域中的遠程服務器進行轉發 relay_base_on_MX 允許向主機維護的域中轉發 relay_local_from 允許來自本地網絡中所有主機的轉發 loose_relay_check 不進行對郵件主機的祥細的路由檢查 promiscuous_relay 進行開放式轉發 注意:使用relay_entrie_domain 和relay_local_from時要小心,黑客很容易對SMTP會話地址進行偽裝。 避免開發式轉發 比好的做法是既不作開放式轉發,也不接收來自已知開發轉發服務器的郵件。很多MTA軟件都有辦法使郵件服務器與MAPS RBL(郵件濫用預防系統的實時黑洞列表)相連接,確定某個遠程郵件服務器是否為開放式轉發,如果列表中發現了該主機地址,那么來自該主機的郵件將被認為是垃圾郵件,并被擋在服務器之外。 配置sendmail使用MAPS RBL 如果使用m4,加入以下條目:FEATURE(‘DNSBL’,'HOST’)。host指向另一個rbl服務器,如果你希望使用標準的RBL服務器,可以忽略該參數。 第十二章 阻擋垃圾郵件 有三種方法比較流行 1、拒收來自已知主機的郵件。建立訪問列表,具體設置見上文。 2、對由遠程主機提供的SMTP會話信息進行確認。通過DNS查詢以確定客戶的正確性。 在sendmail 8.9.3版起,增加了以下smtp驗證規則,默認已配置好。 如果MAIL FROM:命令參數是未解析的域名則拒收郵件。 如果MAIL FROM:命令參數不FQDN格式則拒收郵件。 拒收來自發送空的HELO OR EHLO命令的主機的郵件可以通過以下命令修改: FEATURE(‘accept_unresolvable_domains’)dnl FEATURE(‘accept_unqualified_senders’)dnl define(‘confALLOW_BOGUS_HELO’,'True’)dnl 3、通過查找已知的垃圾郵件的記號來過濾進入的信息。 創建規則集,對進入的每一個郵件頭進行檢查過濾。用H行定義,一個常用方法是創建包含在郵件Subject:的頭字段中可找到的垃圾郵件詞語的文件,bad_subject文件,包含一些垃圾郵件常用的主題詞。接著配置sendmail對,該文件中的詞語進行過濾。首先在H行尾加一句:HSubject:$>Check_Subject。下一步是創建規則集。這需要加入三行。一個S行確定規則,一個F行確定bad_subject文件路徑,一個R行確定所要采取的實際動作。例如 SCheck_Subject F{Header}/etc/mail/bad_subject R$={Header} $* $#error $: 553 we don’t like spam here 第十三章 過濾病毒 有兩種較流行的方法 1、基于已知短語的過濾。(方法同過濾垃圾郵件) 2、對附件進行掃描。步驟較多,一般有以下幾步 判定該信件是否含有MIME或者未編碼附件; 提取出MIME或者未編碼文件的二進制文檔; 確定這個二進制文檔是否已被壓縮,如果是壓縮,將其取出; 掃描所有的未壓縮文件,尋找已知病毒; 如果沒病毒,就讓信息如常發送,如果有病毒,通知發信者、本地郵件管理員和可能的接收者。 設置病毒掃描 除常規MTA程序外,還需要兩個程序 1、用于發現和取出信件中的二進制文檔附件的軟件; 2、用于檢查二進制文件中是否具有已知病毒的軟件。 AMaViS(A MAIL VIRUS SCANNER)是一個著名的且被廣泛使用的開源軟件。它能取出信件中的附件文檔,解壓任何壓縮文檔,并且用反病毒軟件對它們進行掃描。在unix平臺上暫時還沒有開源的防病毒軟件,要使用商用軟件。 配置sendmail使用amavis define(‘LOCAL_MAILER_PATH’,'/usr/sbin/amavis’)dnl define(‘LOCAL_MAILER_ARGS’,CONCAT(‘amavis $f$u/usr/bin/’,LOCAL_MAILER_ARGS))dnl MODIFY_MAILER_FLAGS(‘LOCAL’,'-m’)dnl 第十四章 使用郵件防火墻 關閉一些SMTP命令,建立郵件防火墻,可使郵件服務器免受探查和攻擊。 禁用VRFY AND EXPN命令。O option PrivacyOptions = novrfy,noexpn。如果是M4: define(‘confPRIVACY_FLAGS’,'novrfy,noexpn’) 使用郵件防火墻,它是一臺專用的郵件服務器,專門用來轉發發往你的內部郵件服務器和從其發出郵件。經過配置,郵件防火墻接收發往你的域中的郵件,將它們直接發給通常在內部的網絡中的真正的域郵件服務器。同樣,郵件防火墻也轉發從內部郵件服務器發往互聯網的郵件,理想狀態下,郵件防火墻不應該接收所有發往內部任何用戶的郵件,也不應該禁止所有發往內部郵件服務器的郵件。如果郵件服務器失效,黑客也不能訪問用戶的郵箱。如果你決定使用郵件防火墻,有3個地方可以放置。位于網絡防火墻的機器中,位于DMZ中,位于內網。不管郵件防火墻放在什么地方,它的配置都是一樣的。它必須從外部網絡接收郵件然后發給內部郵件服務器,真正的用戶郵箱位于其上。反過來,內部郵件服務器也必須被配置成將所有的外發郵件都交給由郵件防火墻來轉發。 sendmail防火墻 配置sendmail郵件防火墻時,使用稱為虛擬用戶列表的對照表將本地域的郵件地址映射到內部郵件服務器。虛擬用戶列表為文本文件,包含你的郵件環境中需要的地址映射關系。內部的郵件服務器必須配置成使用郵件防火墻作為轉發主機。增加一條指向新表的記錄,如果使用M4,則:FEATURE(‘virtusertable’,'db[options]‘),db是數據庫映射類型,選項中默認的數據庫文件位置為/etc/mail/virtusertable。如果手工添加:Kvirtuser hash /etc/mail/virtusertable。數據庫文本文件格式如下:alias location。文件中,alias是郵件防火墻接收郵件用的虛擬別名,location是sendmail轉發郵件至的內部郵件服務器的主機名或郵件地址。為了把所有發給ispnet1.net域中用戶的郵件重新定向給內部郵件服務器上的同一個用戶,可以使用下面的表記錄:@ispnet1.net %1@mailserver.ispnet1.net。所有接收到的發給ispnet1.net域中用戶的郵件都被轉發給mailserver.ispnet1.net主機上的同一個用戶,郵件防火墻上不儲存任何郵件。生成虛擬用戶列表后,要通過以下方法轉換:makemap hash /etc/mail/access < /etc/mail/access.txt。完成配置以后,還必須在/etc/mail/local-host-names文件中加入你用來接收郵件的域名(在這個例子中是ispnet1.net)。該文件用來定義sendmail接收郵件的主機。 配置內部郵件服務器。將所有郵件都通過郵件防火墻轉發,通過配置智能主機實現。如果使用m4,可以這樣配置:define(‘SMART_HOST’,'firewall.ispnet1.net’)dnl,也可以用ip。配置智能主機后,還要配置回信地址指向域名而不是內部郵件服務器。配置如下: MASQUERADE_AS(domain) FEATURE(‘masquerade_envelope’) 第十五章 使用SASL SASL(簡單認證和安全層協議)定義了一套任何網絡應用程序都可用來對遠程用戶進行認證的機制。很多開源MTA都用它來實現AUTH命令。 要sendmail支持SASL需重新編譯sendmail。編譯前要修改源碼的位置配置文件。 site.config.m4位于源碼目錄樹的devtools/Site。文件中應包含以下行: APPENDDEF(`confENVDEF’,`-DSASL’) APPENDDEF(`conf_sendmail_LIBS’,`-lsasl’) APPENDDEF(`confLIBDIRS’,`-L/usr/local/lib’) APPENDDEF(`confINCDIRS’,`-I/usr/local/include’) 前二行指示sendmail在可執行程序中包含SASL支持,后兩行定義SASL庫文件和頭文件位置。接著可以進行編譯。下一步是在sendmail配置文件中加入SASL支持。 TRUST_AUTH_MECH(`LOGIN PLAIN CRAM-MD5′)dnl define(`confAUTH_MECHANISMS’,`LOGIN PLAIN CRAM-MD5′)dnl 如果是手工編輯sendmail.cf文件,則加入: C{TrustAuthMech}LOGIN PLAIN CRAM-MD5 O AuthMechanisms=LOGIN PLAIN CRAM-MD5 為確保CYRUS-SASL函數庫知道怎樣驗證所收來的SASL認證請求,必須創建一個SASL的配置文件來把MTA程序定義成一個SASL應用。配置文件名為Sendmail.conf,位于/usr/lib/sasl目錄下,在該文件中你必須定義你希望使用的認證數據庫方法:pwcheck_method:PAM,這個例子使用PAM系統用戶名數據庫來驗證認證請求。 第十六章 安全的pop3 and imap服務器 使用ssl協議,允許網絡主機在發送數據之前將其加密,在接收端由接收主機將數據解密成正常格式。 生成證書:openssl req -new -x509 -nodes -out imapd.pem -keyout imapd.pem -days 3650 這個命令創建了一個名為imapd.pem的x509證書,(記住證書名需與應用名匹配),將證書和私鑰放于同一文件中,并保證其在10年內有效。運行命令時,會提幾個問題,其中Common name應該鍵入主機名。否則一些客戶端要么警告用戶這個證書不是發給服務器的,要么拒絕接受該證書。生成證書后,要應用于不同程序。需要拷貝 cp imapd.pem /usr/local/ssl/certs/imapd.pem cp imapd.pem /usr/local/ssl/certs/ipop3.pem 在ssl基礎上使用UW IMAP. ===================================================== 作者:肥肥世家(http://www.ringkee.com/) 原文地址:http://www.ringkee.com/jims/read_folder/books/OpensoureMailSecurity ===================================================== 該文章在 2012/2/17 0:25:49 編輯過 |
關鍵字查詢
相關文章
正在查詢... |