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