搭建完整郵件系統(postfix+dovecot+clamAV+Spamassassin+amavisd-new)

============================

相關軟件:

1. 發送郵件 --- postfix
2. 身份認證 --- sasl2

3. 接收郵件 --- dovecot

4. 防病毒郵件 --- clamAV

5. 防垃圾郵件 --- spamassassin

6.控制病毒及垃圾郵件掃描程序 --- amavisd-new

============================

待完善的問題:

1. 羣發郵件的權限設置

2. 用戶郵箱的配額限制

============================


完整郵件系統架構簡介

我們知道,一個完整的郵件系統應該包括以下幾個重要功能:

基本功能:      發送郵件、收取郵件

安全性功能:  收發郵件的身份認證、防病毒、防垃圾

完整的郵件系統架構流程圖如下:



相關軟件的安裝及配置

1. 安裝postfix,同時讓postfix支持mysql查詢
   # aptitude install postfix postfix-mysql
2. 查看postfix是否支持外部數據庫mysql認證
   # postconf -m
      btree
      cidr
      environ
      hash
      internal 
      mysql
      nis
      proxy
      regexp
      sdbm
      static
      tcp
      unix


3. 查看postfix支持的sasl認證類型
        # postconf -a
        cyrus
        dovecot

4. 安裝cyrus sasl認證
   # aptitude install sasl2-bin libsasl2-modules-sql
5. 修改/etc/default/saslauthd
   START=no  ====> START=yes
6. 重啓saslauthd,並驗證saslauthd正常工作
   # /etc/init.d/saslauthd restart
   # testsaslauthd -u {username} -p {password}
   若出現如下結果,表示saslauthd已正常運行,並可進行認證服務,否則請檢查username和password並重試
   0: OK "Success."

   注:{username},{password}是登錄linux系統的用戶名和密碼


7. postfix啓用sasl認證
   編輯/etc/postfix/main.cf,在最後添加如下內容:
   smtpd_sasl_auth_enable = yes
   broken_sasl_auth_clients = yes
   smtpd_sasl_security_options = noanonymous


8. 修改/etc/postfix/master.cf,禁止postfix啓用chroot
   smtp      inet  n       -       -       -       -       smtpd
   rewrite   unix  -       -       -       -       -       trivial-rewrite
   cleanup   unix  n       -      -       -       0       cleanup
   ==========>>>>>>
   smtp      inet  n       -       n       -       -       smtpd
   rewrite   unix  -       -       n       -       -       trivial-rewrite
   cleanup   unix  n       -       n       -       0       cleanup
   

    這樣設置的原因:如果不這麼設置,則在發送郵件時,總是報如下錯誤,且郵件無法發送成功:

    postfix/trivial-rewrite[10698]: warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 
    postfix/trivial-rewrite[10698]: fatal: mysql:/etc/postfix/mysql_virtual_alias_maps.cf(0,lock|fold_fix): table lookup problem
    postfix/smtpd[10394]: warning: problem talking to service rewrite: Success
    postfix/master[10386]: warning: process /usr/lib/postfix/trivial-rewrite pid 10698 exit status 1
    postfix/smtpd[10697]: warning: problem talking to service rewrite: Connection reset by peer
    postfix/master[10386]: warning: /usr/lib/postfix/trivial-rewrite: bad command startup -- throttling

9. 安裝mysql並創建數據庫和表,同時插入數據
   # aptitude install mysql-client mysql-server
   # mysql -u root -p
     輸入密碼
   # sql> create database mail;
   # sql> create table mail.users( id in(8) primary key auto_increment, username varchar(50), password varchar(50), domain varchar(50), quota int(10), maildir varchar(200));
   # sql> insert into mail.users(username,password,domain,maildir,quota) values('test','test','tiddy.com','tiddy.com/test/',16000);
   # sql> commit;

10. 修改postfix通過sasl的認證方式(pam/shadow/sql/ldap),在/etc/postfix/sasl目錄下新建文件smtpd.conf,內容如下:
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: root
sql_passwd: tiddy
sql_database: mail
sql_select: SELECT password FROM users WHERE username = '%u'

11. 在postfix上安裝telnet並進行測試
   # aptitude install telnet
   # telnet localhost 25
     Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.tiddy.com ESMTP Postfix (Debian/GNU)
auth login
334 VXNlcm5hbWU6
dGVzdA==
334 UGFzc3dvcmQ6
dGVzdA==
235 2.7.0 Authentication successful
mail from:<[email protected]>
250 2.1.0 Ok
rcpt to:<[email protected]>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: alskdjlasd
lasdjflasdf
.
250 2.0.0 Ok: queued as 4C1FB440E6

postfix sasl mysql認證成功


注意:上述紅色標記的文字表示經過BASE64編碼的用戶名(test)和密碼(test)

12. 安裝POP3軟件dovecot
    # aptitude install dovecot-pop3d


13. 創建虛擬用戶(以便該用戶有權限訪問郵件存放目錄)
    # groupadd -g 5000 vmail
    # useradd -u 5000 -g 5000 vmail -d /var/vmail -m

14. 配置dovecot
    修改/etc/dovecot/dovecot.conf,主要修改如下部分
    1) 去掉註釋符號(#)
       base_dir = /var/run/dovecot
    2) dovecot所使用的協議
       protocols = pop3 pop3s
    3) dovecot所監聽的端口(*:監聽所有網絡端口)
       listen = *
    4) 打開明文密碼認證(採用pop3協議收取郵件時,採用明文密碼認證)
       disable_plaintext_auth = no
    5) 日誌文件
       log_path = /var/log/dovecot.log
    6) debug日誌文件
       info_log_path = /var/log/dovecot.info
    7) 每行日誌輸出的前綴
       log_timestamp = "%Y-%m-%d %H:%M:%S "
    8) 客戶端用pop3協議收取郵件時的服務器收取路徑
       mail_location = maildir:/var/vmail/%d/%n/
    9) 是否開啓debug(測試階段使用,正式投入使用後,最好關閉)
       mail_debug = yes

   10) dovecot的pop3認證

       auth default {
            #認證方式
            mechanisms = plain login
            #認證過程中的密碼查詢方式(採用sql查詢)
            passdb sql {
                    # Path for SQL configuration file
                    args = /etc/dovecot/dovecot-sql.conf
            }
            #認證過程中的用戶查詢方式(採用sql查詢)
            userdb sql {
                    # Path for SQL configuration file
                    args = /etc/dovecot/dovecot-sql.conf
            }
            #監聽客戶端socket以便隨時發現客戶端發起的用戶身份認證
            socket listen {
                    client {
                      path = /var/spool/postfix/private/auth
                      mode = 0660
                      user = postfix
                      group = postfix
                    }
            }


       }

15. 修改/etc/dovecot/dovecot-sql.conf
    1) 數據庫驅動
       driver = mysql
    2) 數據庫連接信息
       connect = host=localhost dbname=mail user=root password=tiddy
    3) 數據庫密碼的加密方式(PLAIN:明文方式,不加密)
       default_pass_scheme = PLAIN
    4) 數據庫查詢語句
       password_query = SELECT username, domain, password FROM users WHERE username = '%n'
       user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM users WHERE username = '%n'


16. 重新修改/etc/postfix/main.cf(注意:有的內容已經存在或添加過,請務必不要重複添加)
######################## 基本配置 ##########################
myhostname = postfixsvr
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = tiddy.com
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
#我們使用虛擬網域virtual_mailbox_domains變量來決定哪些網域的郵件可以被投遞,此處註釋掉
#relay_domains = tiddy.com
#mydestination = tiddy.com


##################### 啓用SASL Auth ########################

# 設定 Postfix 使用 SASL 認證。
smtpd_sasl_auth_enable = yes


# 設定 SASL 支持非標準 E-mail Client 的認證動作。
broken_sasl_auth_clients = yes


# 不使用 ANONYMOUS 這個認證。
smtpd_sasl_security_options = noanonymous


# 對收件人,發件人的限制(允許授權認證用戶,本地網絡用戶<即mynetwork定義的網絡客戶端>,其他一律拒絕)
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject


# 客戶端限制(允許授權認證客戶端,本地網絡客戶端<即mynetwork定義的網絡客戶端>,其他一律拒絕)
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject


# 認證類型
smtpd_sasl_type = dovecot


# sasl認證路徑(注意與dovecot配置文件/etc/dovecot/dovecot.conf中的socket listen內容path末端保持一致)
smtpd_sasl_path = private/auth

############################### 虛擬郵箱 #####################################

# 虛擬郵箱的根路徑

virtual_mailbox_base = /var/vmail

# 虛擬郵箱映射表
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf


# 虛擬網域
virtual_mailbox_domains = tiddy.com

# 虛擬別名映射表(用戶郵箱別名,郵件羣組都由該參數決定,羣組也是別名的一種形式)
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf

# 哪些用戶可以訪問虛擬郵箱
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000


########################### 郵件投遞程序 #################################
virtual_transport = virtual


########################## 郵箱容量限制################################
#每封信的最大大小(10M),postfix的默認值爲10M,但這指的是郵件正文和
#編碼後附件的總和,經過base64編碼,附件的大小會增加35%左右,因此這裏設定郵件大小爲14M
message_size_limit = 14336000


# 如果使用Courier maildir++ quotas,則使用yes,默認爲no
virtual_maildir_extended = yes


virtual_create_maildirsize = yes

#默認郵箱大小限制
virtual_mailbox_limit = 16000000


#是否允許覆蓋默認的郵箱大小設置。
virtual_mailbox_limit_override = yes

# no限制整個maildir,yes只限制inbox,默認爲no
virtual_mailbox_limit_inbox = no


#針對每個用戶的限制
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

# 這個選項在未設置’virtual_maildir_limit_message_maps’時,如果用戶超出了限額的提示信息
virtual_maildir_limit_message = Sorry, overquota


# yes的話使用5xx錯誤,no使用4xx錯誤,郵件還是會被放入隊列
virtual_overquota_bounce = yes


# 是否在計算限額時加上垃圾文件夾,這個選項需要virtual_trash_name配合,默認爲no
virtual_trash_count = no
# 設置垃圾文件夾名稱,默認值爲:.Trash
virtual_trash_name = “.Trash”


17. 創建相關文件

    (1) 創建文件/etc/postfix/mysql_virtual_mailbox_maps.cf,內容如下(下面內容其實是查詢數據庫,具體語句涵義不再贅述):

          user = root
          password = tiddy
          hosts = localhost
          dbname = mail
          table = users
          select_field = maildir
          where_field = username

     (2) 創建文件/etc/postfix/mysql_virtual_alias_maps.cf,內容如下(下面內容其實是查詢數據庫,具體語句涵義不再贅述):

          user = root
          password = tiddy
          hosts = localhost
          dbname = mail
          table = alias
          select_field = goto
          where_field = address

18. 數據庫結構

       數據庫名稱:mail

       數據庫表users( id in(8) primary key auto_increment, username varchar(50), password varchar(50), domain varchar(50), quota int(10), maildir varchar(200))

       數據庫表alias( id int(8) primary key auto_increment, address varchar(100), goto varchar(5000), isgroup int(2))


    注意:

          (1) 表users中的字段maildir保存的郵件存放路徑的最後一個字符'/'有無,決定了郵件的存放方式:有'/'表示以maildir方式存放,無'/'表示以mailbox方式存放

          (2) 表alias中的字段goto表示根據別名郵箱將郵件實際轉發的目標郵箱,如果是羣組轉發,則goto字段可能保存多個郵箱地址,這些郵箱地址以分號隔開


-----------------------------------------------------------------以上是基本郵件系統的安裝及配置---------------------------------------------------------------------------------

-----------------------------------------------------------------以下是對基本郵件系統的完善(包括殺毒和防垃圾郵件的處理)---------------------------------------------------------------------------------

1. 安裝殺毒軟件(ClamAV)和防垃圾軟件(SpamAssassin)及其相關依賴包
     # apt-get install libnet-dns-perl pyzor razor arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip zip
     # apt-get install amavisd-new spamassassin clamav-daemon


2. 修改用戶權限
     # usermod -a -G clamav amavis
     # usermod -a -G amavis clamav


3. 修改spamassassin配置文件/etc/default/spamassassin
     ENABLED=0 ====> ENABLED=1
     CRON=0    ====> CRON=1


4.啓動spamassassin
    # /etc/init.d/spamassassin start


5. 修改amavis配置文件/etc/amavis/conf.d/15-content_filter_mode
    去掉如下內容註釋(目的:check病毒和垃圾郵件)
    @bypass_virus_checks_maps = (
     \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

     @bypass_spam_checks_maps = (
     \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);




6. 修改postfix配置文件/etc/postfix/main.cf,註釋掉mydestination,並添加如下內容
    # 將postfix接收到的郵件傳遞給amavis程序進行掃描

    content_filter = smtp-amavis:[127.0.0.1]:10024


7. 編輯文件/etc/postfix/master.cf,在文件最後添加如下內容(注意:-o之前必須至少有兩個空格,表示跟前面一行在邏輯上是一行
smtp-amavis     unix    -       -       -       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20


127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks


8. 在文件/etc/postfix/master.cf中的pickup行添加如下內容(注意:-o之前必須至少有兩個空格,表示跟前面一行在邏輯上是一行
      -o content_filter=
      -o receive_override_options=no_header_body_checks


9. 重啓postfix
    # /etc/init.d/postfix reload


10. amavis對相關郵件(病毒,垃圾郵件等)的處理方式,修改/etc/amavis/conf.d/20-debian_defaults

       關於如下參數的含義,詳情請參見我的另一篇文章《郵件系統之amavisd-new的簡介、安裝及配置》
    $final_spam_destiny = D_BOUNCE  ===> $final_spam_destiny = D_DISCARD
    $QUARANTINEDIR = "/data/virusmails";


11. 修改/etc/amavis/conf.d/05-node_id(若不修改成如下格式,在啓動郵件系統的一些軟件時,在/var/log/mail.log中總是報錯,且軟件無法正常啓動)
      $myhostname = "mail.tiddy.com";


12. 修改/etc/amavis/conf.d/50-user,添加如下內容(注意如下內容不能添加到最後面):

      #垃圾郵件和病毒郵件將被存放的目錄(該目錄spam-quarantine對應/etc/amavis/conf.d/20-debian_defaults文件中的變量$QUARANTINEDIR )

      #這裏的設置表示垃圾及病毒郵件的保存目錄爲/data/virusmails
      $spam_quarantine_to = "spam-quarantine";
      $virus_quarantine_to = "spam-quarantine";
      #黑白名單設置
      @whitelist_sender_maps = read_hash("/etc/amavis/whitelist");
      @blacklist_sender_maps = read_hash("/etc/amavis/blacklist");


13. 在目錄/etc/amavis下創建文件blacklist(黑名單)和whitelist(白名單)
       # touch /etc/amavis/whitelist
       # touch /etc/amavis/blacklist

14. 重啓所有服務

       # /etc/init.d/clamav-daemon restart

       # /etc/init.d/clamav-freshclam restart 

       # /etc/init.d/spamassassin restart

       # /etc/init.d/amavis restart

       # /etc/init.d/postfix restart

       # /etc/init.d/dovecot restart


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