วันจันทร์ที่ 24 กุมภาพันธ์ พ.ศ. 2557

เริ่มติดตั้งซอฟท์แวร์ บน ubuntu

เริ่มติดตั้งซอฟท์แวร์
ในการติดตั้งไม่ควรติดตั้งพร้อมกันทั้งหมด แต่แนะนำให้ติดตั้งเป็นกลุ่ม ๆ หรือติดตั้งซอฟท์แวร์แพ็คเกจทีละอันที่กล่าวมาข้างต้น
ถ้าต้องการข้อมูลเพิ่มเติมสำหรับแต่ละแพ็คเกจให้ใช้คำสั่งในการค้นหา ด้วยการรันคำสั่งการติดตั้งเป็น root
ให้เข้าเป็น root ด้วยการใช้คำสั่ง sudo -i
sudo -i
ค้นหาข้อมูลของแพ็คเกจที่ต้องการ เช่นกรณีของแพ็คเกจ postfix ให้คำสั่ง apt-cache search
apt-cache search postfix
หรือหากต้องการใช้คำสั่ง grep ในการหาแพ็คเกจที่ติดตั้งไปแล้ว ให้ใช้คำสั่ง dpkg --list
dpkg --list | grep postfix
การติดตั้งแพ็คเกจบางอันอาจมีการสอบถามข้อมูลการติดตั้ง เช่น PostFix จะทำการถามประเภทของเซอร์เวอร์ที่จะสร้าง
ซึ่งเป็นการใส่ข้อมูลเบื้องต้นซึ่งเราจะเข้าไปแก้ไขค่าของ config ต่อไปได้อีกในภายหลัง
โปรแกรม clamav อาจถามว่าจะสร้างไดเร็กทอรี่หรือไม่
โปรแกรม Courier จะถามว่าจะติดตั้งเว็บ admin หรือไม่หรือการติดตั้ง TLS เป็นต้น
หลาย ๆ แพ็คเกจจะต้องติดตั้งแพ็คเกจอื่น ๆ เพ่ิมเติมเพื่อโปรแกรมทำงานได้อย่างสมบูรณ์
ติดตั้งแพ็คเกจหลาย ๆ แพ็คเกจพร้อม ๆ กันด้วยคำสั่ง apt-get install และต่อท้ายด้วยแพ็คเกจ หลาย ๆ แพ็คเกจ
apt-get install package-name, another-package-name, etc
ตัวอย่างการติดตั้งแพ็คเกจของ postfix ให้ใช้คำสั่ง apt-get install ดังต่อไปนี้
apt-get install  postfix,  postfix-tls,  postfix-mysql
ให้ทำการติดตั้งซอฟท์แวร์แพ็คเกจที่กล่าวข้างต้นให้ครบก่อนที่จะปฏิบัติในขั้นตอนต่อไป
[แก้ไข]
การปรับแต่งค่า
ในขั้นตอนนี้สมมติว่าได้ทำการติดตั้งซอฟท์แวร์ที่จำเป็นจนครบเรียบร้อยแล้ว
ขั้นตอนต่อไปเป็นการปรับแต่งค่าสำหรับซอฟท์แวร์ต่าง ๆ ที่เกี่ยวข้อง
[แก้ไข]
ระบบปฏิบัติการ OS (Ubuntu)
การปรับแต่งค่าที่สำคัญสำหรับเมล์เซอร์เวอร์คือการติตตั้งไฟร์วอลล์ (ในที่นี้ Shorewall) สำหรับการใช้งาน ค่าการปรับแต่งจะอยู่ที่ไฟล์ /etc/shorewall ซึ่งเราจะทำการปรับแต่งค่าต่าง ๆ เช่น interfaces, hosts zones, policy และ rules
การปรับแต่งค่า basic zones file โดยทั่วไป
#zone display comment loc Local Local network
net Net Tinternet
การปรับแต่งค่า interface file ตามปกติ
net eth0 detect
การปรับแต่งค่าของไฟล์ hosts
loc eth0:192.168.0.0/24
การปรับแต่างค่าของไฟล์ policy
fw loc ACCEPT
fw net ACCEPT
loc all DROP info
net all DROP info
all all REJECT info
การปรับแต่งค่าโดยทั่วไปของไฟล์ rules สำหรับเมล์เซอร์ฟเวอร์
AllowPing loc fw
AllowSSH loc fw
#AllowSMTP loc fw
#ACCEPT loc fw tcp 465,587 -
#AllowIMAP loc fw #AllowPing  net fw
#AllowSSH loc fw
#AllowSMTP net fw
#ACCEPT net fw tcp 465,587 -
#AllowIMAP net fw
เพื่อความปลอดภัยการเข้า SMTP จากทุก ๆ ที่จะถูกตัดทิ้งไปด้วยการใส่ comment (#) ไว้ข้างหน้าคำสั่ง
นอกจากนั้นยังยกเลิก IMAP และ TLS SMTP ไว้ชั่วคราวก่อน และอาจจำเป็นต้องเปิด SSH ภายใน
จากนั้นให้แก้ไขไฟล์ /etc/default/shorewall
startup=1
และเปิดเซอร์วิสให้ไฟร์วอลล์รันขึ้นมา
 /etc/init.d/shorewall restart
[แก้ไข]
โปรแกรมรับ-ส่งเมล์ MTA (Postfix)
โปรแกรม Postfix ใช้พื้นที่ในไดเร็กทอรี่ /etc/postfix
ค่าโดยปริยายของโพสท์ฟิกส์จะมีความปลอดภัยค่อนข้างสูง โดยอาศัย chroot jail
อย่างไรก็ตาม ในการติดตั้งโพสท์ฟิกส์นั้น chroot อาจทำให้เกิดปัญหาขณะติดตั้ง
หากโปรแกรมไม่ทำงานให้ตรวจสอบดูใน master.cf จะมีคำสั่งที่เกี่ยวข้องกับโมดูลและข้อจำกัดของ jail
ในไฟล์ main.cf เป็นการกำหนดว่าโพสท์ฟิกส์จะทำงานอย่างไร ซึ่งแต่ละรุ่นของโพสท์ฟิกส์มีการติดตั้งต่างกันไป
โดยทั่วไปแล้วค่าในการติดตั้งจะคล้าย ๆ กันมาก
[แก้ไข]
การแก้ไขไฟล์ main.cf
ขั้นต้นให้ตั้งค่า "ชื่อเครื่อง" ซึ่งต้องสอดคล้องกับชื่อที่ตั้งใน DNS MX record ให้แก้ไขไฟล์ main.cf
 myhostname = mail.crma.ac.th
่จากนั้นให้ตัดสินใจว่าจะใส่ข้อความในการต้อนรับอย่างไร เพื่อให้มีข้อมูลที่เป็นประโยชน์ต่อผู้ใช้เมล์ (ไม่ใช่แฮ็คเกอร์)
 smtpd_banner = $myhostname ESMTP $mail_name
จากนั้นต้องให้เลือกว่าจะส่งเมล์ออกทั้งหมดไปยังเซอร์ฟเวอร์ SMTP ตัวอื่น หรือจะส่งเอง ซึ่งบางครั้งหากเรามีเซอร์เวอร์ ของไอเอสพีอยู่แล้วก็สามารถส่งต่อไปได้เลย หากเลือกส่งเองก็จะไม่ขึ้นอยู่กับเมล์เซอร์เวอร์อื่น อย่างไรก็ตาม อาจมีความเสี่ยงต่อการเปิดเผยสู่สาธารณะ และอาจถูกบล็อกจาก spam blocker โดยไม่ได้ตั้งใจ หลาย ๆ เมล์เซอร์ฟเวอร์ จะปฏิเสธการใช้ dynamic DNS ให้เลือกการเซ็ทค่าที่เหมาะสม
 # leave blank to do it yourself
 relayhost =
 # or put it an accessible smtp server
 relayhost = smtp.yourisp.com
ต่อไปให้เลือกค่ารายละเอียดของเน็ตเวอร์ค โดยทั่วไปแล้วจะเปิดให้เข้าถึงได้จากทุกเครื่องแต่จะไว้ใจเฉพาะเครื่องนี้เท่านั้น
 inet_interfaces = all
 mynetworks_style = host
จากนั้นสามารถทำการ masquerade แอดเดรสขาออก (outgoing addresses) บางอัน
เช่น ชื่อเครื่องของเราคือ "mail.crma.ac.th" เราคงไม่อยากให้เมล์ที่ออกไปเป็น user@mail.crma.ac.th
ตรงกันข้าม เราต้องการให้ออกไปเป็น user@crma.ac.th
เรายังสามารถเลือกกำหนดว่าจะ masquerade โดเมนใด หรือ ผู้ใช้ที่ไม่ต้องการให้ทำ masquerade
หากใช้ dynamic DNS ก็คือชื่อเครื่องก็คือชื่อ subdomain
 masquerade_domains = sub.domain.com !sub.dyndomain.com
 masquerade_exceptions = root
เนื่องจากเราจะใช้เวอร์ช่วลโดเมน เราจะปล่อยให้ฟีลด์นี้ว่างไว้
 local_recipient_maps =
 mydestination =
[แก้ไข]
การตั้งค่าตัวเลขต่าง ๆ ใน main.cf
# ช่วงเวลาในการเตือนผู้่ส่งหากเมล์ไม่สามารถส่งได้
delay_warning_time = 4h
# เป็น error แบบถาวร หรือแบบชั่วคราว
unknown_local_recipient_reject_code = 450
# เวลาในการเก็บข้อความเมล์ในเมล์คิว ก่อนที่จะตอบกลับไปว่าไม่สำเร็จ
# บางที่อาจใช้ 3 วัน, ผู้เขียนใช้ 16 เนื่องจากทำการสำรองข้อมูลให้ผู้ใช้ด้วย
# ใครที่จะขึ้นไว้ว่า on holiday เมื่อปิดเครื่องเมล์เซอร์ฟเวอร์
maximal_queue_lifetime = 7d
# ค่าต่ำสุดและสูงสุดเป็นวินาทีระหว่างการรอที่จะส่งใหม่ถ้าการส่งไม่สำเร็จ
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
# เวลาในการรอเมื่อเซอร์ฟเวอร์เชื่อมต่อก่อนที่จะรับข้อมูลทั้งหมด
smtp_helo_timeout = 60s
# จำนวนแอดเดรสที่จะใช้ได้ในหนึ่งข้อความ
# การหนดค่านี้มีผลต่อ mass spammers แต่ก็อาจทำให้จำกัดการใช้เมล์ภายในได้
smtpd_recipient_limit = 16
# จำนวนครั้งของ error ก่อนที่จะหยุดส่งเมล์
smtpd_soft_error_limit = 3
# จำนวนครั้งของ error ก่อนที่จะปิดกั้นการรับเมล์นั้น
smtpd_hard_error_limit = 12
[แก้ไข]
การกำหนดสิทธิและข้อห้ามต่าง ๆ
จากนั้นเราสามารถกำหนดข้อห้ามหรือสิทธิต่าง ๆ ได้
ควรใช้ความระมัดระวังในการแก้ไข ให้ค่าการเซ็ทอยู่ในบรรทัดเดียวเท่านั้น
# Requirements for the HELO statement
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, 
                                  reject_invalid_hostname, permit
# Requirements for the sender details
smtpd_sender_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_sender,
                                     reject_unknown_sender_domain, reject_unauth_pipelining, permit
# Requirements for the connecting server
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client relays.ordb.org,
                                   reject_rbl_client blackholes.easynet.nl, reject_rbl_client dnsbl.njabl.org
# Requirement for the recipient address
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, reject_non_fqdn_recipient,
                                       reject_unknown_recipient_domain, reject_unauth_destination, permit
ในกรณีการติดตั้งนี้ ผู้เขียนใช้เซอร์ฟเวอร์ spam detection ซึ่งเรียกว่า RBL: Real-time blackhome list เซอร์ฟเวอร์เหล่านี้จะตรวจว่าเซอร์ฟเวอร์ที่เชื่อมต่อนี้เป็นเครื่องที่เปิด relay ที่ถูกใช้โดย spammer หรือไม่ โปรแกรม SpamAssassin ใช้การตรวจสอบแบบ RBL ในการให้คะแนน ้การกำหนดข้อห้ามต่าง ๆ เพิ่มเติม
# require proper helo at connections
smtpd_helo_required = yes
# waste spammers time before rejecting them
smtpd_delay_reject = yes
disable_vrfy_command = yes
จากนั้นเราต้องตั้งค่าสำหรับ maps และ lookups สำหรับเวอร์ช่วลโดเมน
# not sure of the difference of the next two
# but they are needed for local aliasing
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
# this specifies where the virtual mailbox folders will be located
virtual_mailbox_base = /var/spool/mail/virtual
# this is for the mailbox location for each user
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf
# and their user id
virtual_uid_maps = mysql:/etc/postfix/mysql_uid.cf
# and group id
virtual_gid_maps = mysql:/etc/postfix/mysql_gid.cf
# and this is for aliases
virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
# and this is for domain lookups
virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
# this is how to connect to the domains (all virtual, but the option is there)
# not used yet
# transport_maps = mysql:/etc/postfix/mysql_transport.cf
จากนั้นเราต้องเตรียมไฟล์ alias ซึ่งสามารถทำได้ด้วยการสำเนามาจาก /etc/aliases
cp /etc/aliases /etc/postfix/aliases
จากนั้นให้ตรวจสอบค่าต่าง ๆ ให้ถูกต้องในไฟล์ main.cf และไฟล์ /etc/postfix/alienn แล้วรันคำสั่ง
postalias /etc/postfix/aliases
[แก้ไข]
Virutal User
ขั้นต่อไปต้องสร้างโฟลเดอร์ที่อยู่สำหรับ Virtual Mail ซึ่งบางครั้ง apt-get จะติดตั้งให้เรียบร้อยเลย
หากยังไม่มีผู้ใช้ชื่อ virtual ให้ทำการสร้าง user ใหม่ให้สำหรับ virtual ด้วยคำสั่งต่อไปนี้
mkdir /var/spool/mail/virtual
groupadd virtual -g 5000
useradd virtual -u 5000 -g 5000
chown -R virtual:virtual   /var/spool/mail/virtual
หากมีอยู่แล้วให้ทำการแก้ไขด้วยคำสั่งต่อไปนี้
groupmod -g 5000 virtual
usermod -g virtual -u 5000 virtual
chown -R virtual:virtual /var/spool/mail/virtual
[แก้ไข]
mysql_mailbox.cf
จากนั้นต้องสร้างไฟล์ต่าง ๆ สำหรับการค้นหาในฐานข้อมูล ซึ่งในขั้นนี้จะเซ็ทบางอย่างที่จำเป็นก่อน ส่วนที่เหลือจะเซ็ททีหลังเมื่อจำเป็น ให้แก้ไขไฟล์ /etc/postfix/mysql_mailbox.cf
vi /etc/postfix/mysql_mailbox.cf
ด้วยการเซ็ทค่า ต่าง ๆ ไว้เรียบร้อยแล้ว
user=mail
password=apassword
dbname=maildb
table=users
select_field=maildir
where_field=id
hosts=127.0.0.1
additional_conditions = and enabled = 1
[แก้ไข]
mysql_uid.cf
จากนั้นแก้ไขไฟล์ /etc/postfix/mysql_uid.cf ให้มีข้อความดังต่อไปนี้
user=mail
password=apassword
dbname=maildb
table=users
select_field=uid
where_field=id
hosts=127.0.0.1
[แก้ไข]
mysql_gid.cf
แก้ไขไฟล์ /etc/postfix/mysql_gid.cf ให้มีข้อความดังต่อไปนี้
user=mail
password=apassword
dbname=maildb
table=users
select_field=gid
where_field=id hosts=127.0.0.1
[แก้ไข]
mysql_alias.cf
แก้ไขไฟล์ /etc/postfix/mysql_alias.cf ให้มีเนื้่อหาดังต่อไปนี้
user=mail
password=apassword
dbname=maildb
table=aliases
select_field=destination
where_field=mail
hosts=127.0.0.1
additional_conditions = and enabled = 1
[แก้ไข]
mysql_domains.cf
แก้ไขไฟล์ /etc/postfix/mysql_domains.cf ให้มีรายละเอียดังต่อไปนี้
user=mail
password=apassword
dbname=maildb
table=domains
select_field=domain
where_field=domain
hosts=127.0.0.1
additional_conditions = and enabled = 1
จะเห็นได้ว่าสามบรรทัดแรกจะเหมือนกันมาก มีบางฟิลด์เท่านั้นที่เปลี่ยน
หากกำหนด IP ในไฟล์ hosts (แทนที่จะใช้ localhost) การเชื่อมต่อจะทำผ่าน TCP และไม่ใช่ mysql SOCKET
[แก้ไข]
Database (MySQL)
ในการใช้งานเมล์ผ่านฐานข้อมูล เราจะต้องติดตั้ง MySQL และสร้าง user สำหรับการค้นหา นอกจากนั้นยังต้องสร้างฐานข้อมูล (database)
ถ้ายังไม่ได้ทำ ให้เซ็ทรหัสผ่านของ root ของ mysql ด้วยคำสั่ง
 mysqladmin -u root password new_password
จากนั้น login เป็น root ด้วยคำสั่ง
 mysql -u root -p
ให้ใส่รหัสผ่านของ root (ของ MySQL ที่เพิ่งเปลี่ยน) เมื่อถาม Enter password:
[แก้ไข]
สร้างฐานข้อมูล maildb และ mail user
หมายเหตุ -- คำสั่งของ mysql จะจบด้วยเซมิคอล่อน ;
สร้างฐานข้อมูล maildb ด้วยคำสั่ง
 mysql> create database maildb;
สร้าง user ใหม่ชื่อว่า mail
 mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON maildb.* TO 'mail'@'localhost'
           IDENTIFIED by 'apassword';
 mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON maildb.* TO 'mail'@'%'
           IDENTIFIED by 'apassword';
 mysql> exit;
[แก้ไข]
สร้างตาราง aliases, domains, และ users
ในฐานข้อมูล maildb นี้เราต้องสร้างตารางเบื้่องต้น (tables) ขึ้นมา 3 ตารางคือ
   * aliases
   * domains
   * users
เราจะสร้างตารางอื่นๆ ด้วยในการขยายขีดความสามารถการทำงานของเมล์
ให้ login เป็น user ใหม่ที่เราสร้างขึ้นชื่อ 'mail'
 mysql -u mail -p maildb
ให้ใส่รหัสผ่านเดียวกับที่ได้ตั้งไว้ในคำสั่ง GRANT (apassword)
จากนั้นสร้างตารางด้วยคำสั่งใน mysql
 mysql> CREATE TABLE `aliases` ( `pkid` smallint(3) NOT NULL auto_increment, `mail` varchar(120)
           NOT NULL default , `destination` varchar(120) NOT NULL default , `enabled` tinyint(1)
           NOT NULL default '1', PRIMARY KEY (`pkid`), UNIQUE KEY `mail` (`mail`) ) ;
 mysql> CREATE TABLE `domains` ( `pkid` smallint(6) NOT NULL auto_increment, `domain` varchar(120)
           NOT NULL default , `transport` varchar(120) NOT NULL default 'virtual:', `enabled` tinyint(1)
           NOT NULL default '1', PRIMARY KEY (`pkid`) ) ;
 mysql> CREATE TABLE `users` ( `id` varchar(128) NOT NULL default , `name` varchar(128)
           NOT NULL default , `uid` smallint(5) unsigned NOT NULL default '5000', `gid` smallint(5) unsigned
           NOT NULL default '5000', `home` varchar(255) NOT NULL default '/var/spool/mail/virtual',
           `maildir` varchar(255) NOT NULL default 'blah/', `enabled` tinyint(3) unsigned NOT NULL
           default '1', `change_password` tinyint(3) unsigned NOT NULL default '1', `clear` varchar(128)
           NOT NULL default 'ChangeMe', `crypt` varchar(128) NOT NULL default 'sdtrusfX0Jj66',
           `quota` varchar(255) NOT NULL default , `procmailrc` varchar(128) NOT NULL default ,
           `spamassassinrc` varchar(128) NOT NULL default , PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) ;
ฟิลด์ท้าย ๆ ตอนนี้ยังไม่มีความจำเป็นต้องใช้แต่จะสร้างเผื่อไว้สำหรับการติดตั้งซอฟท์แวร์อื่นในภายหลัง
[แก้ไข]
แก้ไขไฟล์ my.cnf
ให้แก้ไขไฟล์ my.cnf ซึ่งใน Ubuntu จะสร้างไฟล์นี้่ขึ้นมาโดยอัตโนมัติ ให้แก้ไขไฟล์ /etc/mysql/my.cnf ด้วยคำสั่ง vi หรือ pico
 vi /etc/mysql/my.cnf
## In Hoary you needed to comment out this line
#skip-networking
## however in breezy this has changed to
bind-address = 127.0.0.1
## which is fine
## Make sure this is set
log = /var/log/mysql/mysql.log
## Then in a few weeks comment it out
## when everything is working, as it slows mysql down
การแก้ไขข้างต้นเป็นการเพ่ิมการเข้าถึงผ่านระบบเครือข่ายให้กับ MySQL
แต่เรายังควบคุมว่าใครบ้างที่จะเชื่อมต่อเข้ามา ด้วยไฟร์วอลล์ และ user ที่สร้างขึ้นมา
นอกจากนั้นยังสามารถเชื่อมต่อเข้าตรง ๆ กับ socket ได้เลยซึ่งจะมีความปลอดภัยสูงขึ้นอีก
ให้เริ่มการทำงานของ MySQL ใหม่ตามค่าติดตั้งที่ได้เปลี่ยนไป ด้วยคำสั่ง
 sudo /etc/init.d/mysql restart
[แก้ไข]
การปรับแต่งค่าของ IMAP (Courier)
แก้ไขไฟล์ /etc/courier/authdaemonrc โดยให้เปลี่ยนบรรทัดของโมดูลดังนี้
 authmodulelist="authmysql"
แก้ไขไฟล์ authmysqlrc ให้มีค่าการติดตั้งดังต่อไปนี้ --ให้ระวัง space ที่ท้ายของไฟล์ทำให้การทำงานผิดพลาดได้
MYSQL_SERVER localhost
MYSQL_USERNAME mail
MYSQL_PASSWORD apassword
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE maildb
MYSQL_USER_TABLE users
# comment out this field,
# as I now longer use the encrypted pw options
#MYSQL_CRYPT_PWFIELD crypt
MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD id
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat(home,'/',maildir)
MYSQL_WHERE_CLAUSE enabled=1
จากนั้นให้แก้ไขไฟล์ imapd
# set how many connections to use per person. Easy to underestimate
# if you have 6 mailboxes set up.
MAXPERIP=20
# high debug to start with
DEBUG_LOGIN=2
IMAPDSTART=YES
จากนั้นให้แก้ไขให้เหมือนกันใน pop และ ssl ถ้าต้องการติดตั้งและใช้งาน
หากทำการติดตั้งได้อย่างครบถ้วนและไม่มีข้อผิดพลาดมาจนถึงขึ้น เมล์เซอร์ฟเวอร์ควรจะทำงานได้แล้ว
อาจลัดขั้นตอนไปยังส่วนข้อมูล (data) หรือการทดสอบเมล์ เพื่อดูว่าเมล์ทำงานได้ถูกต้องแล้วหรือยัง
อย่างไรก็ตามเซอร์ฟเวอร์ในขั้นนี้ยังมีช่องโหว่ที่ไม่ปลอดภัย และยังไม่มีการป้องกันสแปม ให้ทำการติดตั้งขั้นตอนต่อไป
[แก้ไข]
การตรวจสอบเนื้อความ - Content Checks (amavisd-new)
ใน Ubuntu dapper การติดตั้ง amavisd จะแยกไฟล์คอนฟิกไว้ที่ /etc/amavis/conf.d หากมีเวอร์ชั่นเก่าให้เปลี่ยนชื่อ /etc/amavis/amavis.conf ให้เป็น amavis.conf.disabled แก้ไขไฟล์ชื่อ 50user ใน /etc/amavis/conf.d เพื่อเพิ่มค่าการเปลี่ยนแปลง (จาก 50-user Tip โดย Donald Goodman)
$mydomain 'yourdomain.com';
$daemon_user= 'virtual';
$daemon_group= 'virtual';
@local_domains_acl = qw(.);
$inet_socket_port = 10024;
$forward_method = 'smtp:127.0.0.1:10025';
# @bypass_virus_checks_acl = qw( . );
# @bypass_spam_checks_acl = qw( . );
และเพิ่ม/เปลี่ยนค่าต่อไปนี้
$TEMPBASE = "$MYHOME/tmp";
# Whilst debugging $log_level = 2;
$warnbannedrecip = 1;
$warn_offsite = 1;
$warnvirusrecip = 1;
$spam_quarantine_to = "spam-quarantine\@$mydomain";
$virus_quarantine_to = "virus-quarantine\@$mydomain";
$sa_local_tests_only = 0;
ในส่วนของ av_scanner ให้ทำการ enable/disable แสกนเนอร์ไวรัสที่จะใช้ ในกรณีนี้เราใช้ ClamAV ดังนั้นให้เอาคอมเมนต์ระหว่างบรรทัด @av_scanners( จนถึงวงเล็บปีกกาของ av_scanners. ทำเช่นเดียวกันกับ @av_scanners_backup. ใน @av_scanner ให้เอาคอมเมนต์ออก สำหรับบรรทัดของ Clam จากนั้นให้ตรวจสอบว่าโฟลเดอร์ $TEMPBASE มีอยู่หรือไม่และมี $daemon_user เป็นเจ้าของ และให้ทำเช่นเดียวกันกับโฟลเดอร์ของไวรัส จากนั้นปฏิบัติตามขั้นตอนต่อไปนี้
cd /var/lib/amavis
mkdir tmp
chown virtual:virtual tmp
chown virtual:virtual virusmails
chown -R virtual:virtual /var/run/amavis
ในสคริปต์เริ่มการทำงานของ amavis ต้องตรวจสอบให้แน่ใจว่าเป็นเจ้าของโดย amvis และมีกลุ่มเป็น amavis เช่นกัน ให้แก้ไขไฟล์ /etc/init.d/amavis ซึ่งเป็นสคริปต์
#edit about line 31
#chown -c -h "$1:$2" "$4"
chown -c -h "virtual:virtual" "$4"
จากนั้นให้กำหนดการเชื่อมต่อกับอินเทอร์เน็ตสำหรับ plugin สำหรับการตรวจสอบ ให้แก้ไขไฟล์ master.cf ใน /etc/postfix โดยแก้ไขจากค่าดีฟอลท์ของ master.cf เพิ่มเซอร์วิสที่ต้องการ. (หมายเหตุ - บรรทัดที่ขึ้นต้นด้วย -o ต้องมีแท็บนำหน้า หรือเสปซสองครั้งเนื่องจากเป็นข้อความต่อจากบรรทัดก่อนหน้า)
#smtp inet n - n - - smtpd
smtp inet n - - - - smtpd -o cleanup_service_name=pre-cleanup
#cleanup unix n - - - 0
cleanup cleanup unix n - - - 0 cleanup -o mime_header_checks=
     -o nested_header_checks=
     -o body_checks=
     -o header_checks=
amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200
     -o smtp_send_xforward_command=yes
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_client_restrictions=
     -o smtpd_helo_restrictions= -o smtpd_sender_restrictions=
     -o smtpd_recipient_restrictions=permit_mynetworks,reject
     -o strict_rfc821_envelopes=yes -o mynetworks=127.0.0.0/8
     -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001
     -o smtpd_hard_error_limit=1001
pre-cleanup unix n - - - 0 cleanup -o virtual_alias_maps=
     -o canonical_maps= -o sender_canonical_maps=
     -o recipient_canonical_maps= -o masquerade_domains=
จากนั้นแก้ไขไฟล์ main.cf ใน /etc/postfix เพิ่มบรรทัดต่อไปนี้
content_filter = amavis:[127.0.0.1]:10024
#receieve_override_options = no_address_mapping
[แก้ไข]
Anti Virus (ClamAV)
การปรับเปลี่ยนค่าของ ClamAV นั้นไม่ยุ่งยาก ตรวจสอบให้แน่ใจว่า ClamAV นั้นรันโดย user เดียวกันกับ amavisd-new จากนั้นให้ปรับค่าคอนฟิกของ fresclam option เพื่อให้แน่ใจว่าได้มีการอัพเดทไวรัสอยู่เสมอ แก้ไขไฟล์ /etc/clamav/clamd.conf เปลี่ยน user ให้เป็น amavisd-new
# User clamav User virtual
เปลี่ยน ownership ของรันไทม์โฟลเดอร์
chown virtual:virtual /var/run/clamav
และให้แก้ไขไฟล์ freshclam.conf
# how frequent per day. default is once an hourwhich is a bit excesive.
# once per day should do.
Checks 1
เป็นอันเสร็จการปรับค่าของ ClamAV
[แก้ไข]
โปรแกรมต่อต้านเมล์ขยะ Anti Spam (SpamAssassin)
ค่าการติดตั้งของ SpamAssassin สามารถใช้ได้งานได้ หากต้องการปรับแต่งค่าการรันให้เข้าไปแก้ไขไฟล์ /etc/spamassassin/local.cf โดยเปรียบเทียบกับค่าปริยาย (default) ที่ /usr/share/spamassassin/ ยกตัวอย่างเช่นหากต้องการเพิ่มหรือลดระดับในการตัดสินใจว่าจะรับ หรือไม่รับอีเมล์ ให้ทำการแก้ไขไฟล์ local.cf.
skip_rbl_checks 0
use_razor2 0
use_dcc 0
use_pyzor 0
use_bayes 1
bayes_path /etc/spamassassin/bayes
bayes_file_mode 0770
หลังจากที่โปรแกรมรวบรวมข้อมูลเกี่ยวกับสแปม (ประมาณ 200 หรือมากกว่า) เราสามารถให้โปรแกรมเรียนรู้ด้วยการใช้ Bayes filterใน SpamAssassin สำหรับอีเมล์เหล่านั้น
1. ตัวอย่างการใช้งานเบย์ฟิลเตอร์
sa-learn --showdots -C /etc/spamassassin --spam /var/spool/mail/virtual/quarantine/.spam/*
sa-learn --showdots -C /etc/spamassassin --ham /var/spool/mail/virtual/mine/cur/*
หากสังเกตุว่ายังมีสแปมหลุดเข้ามาในเมล์เซอร์ฟเวอร์มากเกินไป (มี false postives มากเกิน อีเมล์จริงถูกโยนทิ้ง) สามารถปรับแต่งค่าเพิ่มเติมได้ ด้วยการลดระดับการตรวจสอบลง ค่าโดยทั่วไปของ SpamAssassin น่าจะสามารถดักจับสแปมได้ประมาณ 97% ของสแปมทั้งหมด. โดยอาจมีประมาณ 1 ใน 1000 ครั้งทำงานผิดพลาด (false positives) ให้ค้นหาข้อมูลที่มีประโยชน์เพ่ิมเติมจากเว็บไซต์ของ SpamAssassin และมีหัวข้อที่น่าสนใจต่าง ๆ เช่น automatic learning การใช้ cronjobs เรียนรู้ spam และ ham ที่ระบุโดยผู้รับอีเมล์.
[แก้ไข]
การควบคุมนโยบาย Policy (Postgrey)
การติดตั้ง Postgrey จะช่วยให้การทำงานของระบบเมล์ดีขึ้น Ubuntu เองก็ขยายข้อมูลและโมดูลเกี่ยวกับการใช้งาน Postgrey ด้วยการติดตั้งใน /etc/postgrey (whitelist configuration) ผู้เขียนไม่แนะนำให้แก้ไขไฟล์นี้ เนื่องจากอาจทำให้เกิดความเสียหายต่อเมล์เซอร์ฟเวอร์ของท่านได้ อย่างไรก็ตามเราจำเป็นต้องแก้ไขไฟล์ main.cf เพื่อเพิ่มมาตรการสำหรับการรับเมล์
#adding the postgrey policy:
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, reject_non_fqdn_recipient,
                                       reject_unknown_recipient_domain, reject_unauth_destination,
                                       check_policy_service inet:127.0.0.1:60000, permit
ค่าปริยายสำหรับเวลาก่อนที่เซอร์ฟเวอร์จะลองส่งเป็น 300 วินาที (หรือ 5 นาที) เราอาจเปลี่ยนค่านี้ได้ เช่นการต้องการให้เร็วขึ้นอาจเปลี่ยนให้เป็น 1 นาที ให้แก้ไขไฟล์ /etc/default/postgrey
POSTGREY_OPTS="--inet=127.0.0.1:60000 --delay=60"
#POSTGREY_TEXT="Your customized rejection message here"ใ
สามารถใส่ข้อความบอกเหตุผลในการไม่รับเมล์ได้ในตัวแปร POSTGREY_TEXT
[แก้ไข]
Authentication (SASL)
การตรวจสอบสิทธิการใช้งานสามารถใช้โปรแกรม Cyrus SASL ซึ่งมีระบบรักษาความปลอดภัยในการตรวจสอบผู้ใช้งานเมล์เซอร์เวอร์ การตรวจสอบจะกระทำ 2 วิธี คือ ด้วย postfix เมื่อทำการส่งเมล์ และโดย Courier เมื่อทำการับเมล์. ขั้นแรกให้ปรับแต่งค่าของ postfix เพิ่มบรรทัดต่อไปนี้ใน main.cf
# modify the existing smtpd_recipient_restrictions
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated,
                                       reject_non_fqdn_recipient, reject_unauth_destination,
                                       check_policy_service inet:127.0.0.1:60000, permit
# modify the existing smtpd_sender_restrictions
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_sender,
                                     reject_unknown_sender_domain, reject_unauth_pipelining, permit
และเพิ่มบรรทัดต่อไปนี้เข้าไป
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_path = /etc/postfix/sasl:/usr/lib/sasl2
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
จากนั้นให้สร้างไฟล์คอนฟิกของ sasl (อาจมีไดเร็กทอรี่นี้อยู่แล้ว) สร้างไดเร็กทอรี่ด้วยคำสั่ง
mkdir /etc/postfix/sasl
แก้ไขไฟล์ smtpd.conf ด้วยคำสั่ง
vi /etc/postfix/sasl/smtpd.conf
ให้มีข้อความต่อไปนี้
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail
sql_passwd: apasswd
sql_database: maildb
sql_select: select
clear from users where id='%u@%r' and enabled = 1
หากจบขั้นตอนดังกล่าวข้างต้นเป็นอันว่าการปรับแต่งค่าเมล์ และส่วนที่เกี่ยวข้องต่าง ๆ ได้เสร็จสมบูรณ์ อย่างไรก็ตามเมล์เซอร์ฟเวอร์จะสามารถใช้งานได้อย่างปลอดภัย และมีการเข้ารหัสข้อมูลควรทำขั้นตอนต่อไปด้วยการการปรับแต่งค่าของ Courier (สำหรับการอ่านเมล์) โดยจะทำงานผ่านการตรวจสอบ (authenticate) ผ่าน SASL เช่นกัน ใน Ubuntu จะมีการติดตั้งให้อยู่แล้ว เราจำเป็นต้องแก้ไขเพียงเล็กน้อยใน /etc/courier/imapd ดังนี้
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT
                           THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"
(หมายเหตุ - หากต้องการใช้งาน POP ให้กระทำการปรับแต่งเช่นเดียวกัน)
[แก้ไข]
Encryption (TLS)
การใช้ SASL เป็นการเข้ารหัสสำหรับการตรวจสอบสิทธิของผู้ใช้งานอีเมล์ อย่างไรก็ตามเนื้อความของอีเมล์ยังคงถูกส่งเป็นข้อความธรรมดา ซึ่งสามารถถูกแกะดูด้วยด้วยโปรแกรมบางประเภท เช่น sniffer ต่าง ๆ โปรแกรม TLS เป็นการพัฒนาเพิ่มต่อจาก SSL เพื่อที่จะเข้ารหัสของข้อความที่ส่งโดย postfix และอ่านโดย courier ระหว่างเครื่องเมล์เซอร์ฟเวอร์ โปแกรม TLS เป็นระบบเข้ารหัสระหว่างผู้ส่งกับผู้รับ ไม่ได้เป็นโปรแกรมประเภท client เพียงอย่างเดียว (รายละเอียดเพิ่มเติมดู GNuPG และ S/MIME) ขั้นแรกต้องทำการสร้าง certificates สำหรับ postfix และ courier ในกรณีของ postfix เราต้องสร้าง certificate (มีอายุ 3 ปี) ด้วยคำสั่ง
cd /etc/postfix (เครื่องหมาย '\' แสดงว่าเป็นบรรทัดเดียวกัน)
openssl req -new -outform PEM -out \
     postfix.cert -newkey rsa:2048 -nodes -keyout \
     postfix.key -keyform PEM -days 999 -x509
ในไฟล์ /etc/postfix/main.cf ให้เพิ่มบรรทัดต่อไปนี้
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/postfix.cert
smtpd_tls_key_file = /etc/postfix/postfix.key
smtpd_data_restrictions = reject_unauth_pipelining
ในไฟล์ master.cf เพิ่ม/ปรับเปลี่ยนค่าต่อไปนี้ (ค่าบางค่าอาจมีอยู่แล้ว)
tlsmgr unix - - n 300 1 tlsmgr smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o
smtpd_sasl_auth_enable=yes
587 inet n - n - - smtpd -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
โปรแกรมที่เครื่องลูกข่ายบางอันอาจ (เช่น Novel Evolution) มีความจำเป็นต้องใช้พอร์ต 465 นอกเหนือจากพอร์ต 25 ที่ใช้โดยเมล์อยู่แล้ว ถ้าหากไม่สามารถรัน STARTTLS ได้ เดเบียนแพ็คเกจต่าง ๆ ใน Ubuntu สร้าง certificate สำหรับ coเurier ให้โดยอัตโนมัติ ในกรณีที่ไม่สามารถหา certificate ได้ให้ใช้คำสั่ง
openssl req -x509 -newkey rsa:1024 -keyout imapd.pem -out \
     imapd.pem -nodes -days 999
จากนั้นแก้ไขไฟล์ /etc/courier/imapd-ssl และตรวจสอบดูว่าเป็น path สำหรับ certificate.
TLS_CERTFILE=/etc/courier/imapd.pem
เมื่อทำการแก้ไขเสร็จและเร่ิมใช้งาน TLS แล้วจะมีการเข้า/ถอดรหัสในการรับ-ส่งเมล์ ผู้ใช้อาจถูกถามให้รับ certificate เพื่อเป็นการแลกเปลี่ยนกุญแจในการเข้า-ถอดรหัส ปัญหาในการใช้ SALS และ TLS ในเวลาเดียวกัน อาจมาจากการที่ข้อความของอีเมล์ทั้งหมดถูกเข้ารหัสอยู่แล้วทำให้การใช้งาน SASL มีความจำเป็นน้อยลง
[แก้ไข]
การปรับแต่งค่าของ Webmail SquirrelMail
SquirrelMail เป็นโปรแกรมเว็บเมล์ที่เขียนด้วยภาษา PHP สามารถดาวน์โหลดได้ฟรีจาก sourceforge
เมื่อติดตั้งใน Ubuntu จะวางไว้ที่ไดเร็กทอรี่ /usr/share ดังนั้นเราต้องนำมาไว้ที่เว็บ root ที่ /var/www
  ln  -s   /usr/share/squirrelmail   /var/www/squirrelmail
จากนั้นให้เซ็ทค่า URL เพื่อเข้าใช้ SquirrelMail ด้วยการเรียกผ่านเว็บบราวเซอร์โดยใช้ URL
 http://mail.crma.ac.th/squirrelmail
ในกรณีนี้เราเข้าเป็นแบบ subfolder ซึ่งหากสามารถทำเป็น virtual host แล้วจะทำให้สามารถใช้งานได้สะดวกขึ้น
ใน Ubuntu ให้แก้ไขไฟล์ /etc/apache2/sites-available/webmail
<VirtualHost *>
  ServerAdmin webmaster@yourdomian.com
  ServerName webmail.yourdomain.com
  DocumentRoot /var/www/squirrelmail
  <Directory /var/www/squirrelmail>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride AuthConfig
      Order allow,deny
      allow from all
  </Directory>
  ErrorLog /var/log/apache2/error-webmail.log
  LogLevel warn
  CustomLog /var/log/apache2/access-webmail.log combined
  ServerSignature On
</VirtualHost>
จากนั้นทำการ enable และเปิดใช้งานด้วยคำสั่ง
 ln -s /etc/apache2/sites-available/webmail /etc/apache2/sites-enabled/810-webmail
หรือใช้คำสั่ง
 a2ensite webmail
เริ่มการทำงานของเว็บเซอร์ฟเวอร์ด้วยคำสั่ง
 sudo /etc/init.d/apache2 reload
โฟลเดอร์ config ของ SquirrelMail เป็นเพียงแค่ symbolic link ไปยัง /etc/squirrelmail
ดังนั้นถ้ารัน SquirrelMail หลาย ๆ ตัวจ่าจะสำรองไฟล์ด้วยการก็อปปี้เพิ่มอีก
SquirrelMail มีคอนฟิกไฟล์อยู่สามไฟล์คือ
config_default.php เป็นค่า default ไม่ต้องทำการแก้ไข.
config.php จะ overrides ค่า defaults ได้ -- ไม่ต้องแก้ไขไฟล์นี้เนื่องจากสร้างขึ้นโดยอัตโนมัติโดย conf.pl
conf_local.php แก้ไขไฟล์นี้ได้เพื่อที่จะเพ่ิมเติมหรือเปลี่ยนแปลงค่าที่กำหนดไว้เป็น default.
ในการเปลี่ยนแปลงค่าของ SquirrelMail ให้รันสคริปต์
 /var/www/squirrelmail/config/conf.pl
เป็นโปแกรมที่เป็นเมนู และสามารถแก้ไขรายละเอียดต่าง ๆ ได้ง่าย ให้ใช้ความระมัดระวังในการเปลี่ยนค่า
ระวังอย่าให้มี spaces ในคำสั่งหรือท้ายคำสั่ง ซึ่งอาจทำให้การทำงานไม่ถูกต้องได้
ให้เลือก Database ตัวเลือกที่ 9 จากเมนู
จากนั้นเลือก 1 เพื่อแก้ไข DNS สำหรับ address book ให้ใส่
 mysql://username:password@127.0.0.1/database
จากนั้นเลือก 3 สำหรับ preferences และใส่ข้อมูลเหมือนเดิม
 mysql://username:password@127.0.0.1/database
มี global address เป็นตัวเลือกถ้าจะใช้ก็สามารถตั้งค่านี้ได้
จากนั้นให้เลือก 's' เพื่อบันทึก (save) ค่าที่เปลี่ยนแปลงไป แล้วกด 'r' เพื่อกลับไปยังเมนูหลัก
กด 'q' เพื่อออกจากโปรแกรม
[แก้ไข]
ตัวอย่างไฟล์ config_local.php
อ่านไฟล์ default สำหรับคำอธิบายในรายละเอียด
$org_name = "CRMA webmail";
$org_logo = 'http://flurdy.com/images/flurdy.gif';
$org_logo_width = '212';
$org_logo_height = '108';
$org_title = "webmail by flurdy";
$provider_name = 'flurdy';
$provider_uri = 'http://www.flurdy.com/';
$smtp_auth_mech = 'none';
$default_use_javascript_addr_book = true;
$hide_sm_attributions = true;
$edit_identity = false;
$edit_name = true;
$imap_server_type = 'courier';
$default_folder_prefix = 'INBOX.';
$trash_folder = 'Trash';
$sent_folder = 'Sent';
$draft_folder = 'Drafts';
$show_prefix_option = false;
$default_sub_of_inbox = false;
$show_contain_subfolders_option = false;
$delete_folder = true;
$optional_delimiter = '.';
$force_username_lowercase = true;
$allow_thread_sort = true;
$allow_server_sort = true;
$addrbook_dsn = 'mysql://username:password@localhost/database';
$prefs_dsn = 'mysql://username:password@localhost/database';
$addrbook_global_dsn = 'mysql://username:password@localhost/database';
$addrbook_global_writeable = false;
$addrbook_global_listing = false;
$theme_default = 18;
$theme_css = '/themes/css/verdana-10.css';
จากนั้นให้สร้างตาราง (tables) สำหรับการทำงานของ SquirrelMail
สร้าง user ใหม่สำหรับ SquirrelMail หรือใช้ user 'mail' เดิมที่ได้สร้างไว้แล้ว
สร้างฐานข้อมูลใหม่สำหรับ SquireMail หรืออาจใช้ฐานข้อมูลเดิมของ maildb ที่ได้สร้างไว้แล้ว
รายละเอียดการสร้างให้ดูตัวอย่างในส่วนของ MySQL
แก้ไขไฟล์ config.php ให้มีค่าสอดคล้องกับฐานข้อมูล และ user ที่ใช้
จากนั้นให้ login เข้าไปยัง mysql
 mysql -u username -p database
ป้อนรหัสผ่านที่ใช้ให้ถูกต้อง แล้วใช้คำสั่งของ mysql เพื่อสร้างตารางที่ต้องการใช้
 mysql> CREATE TABLE `address` ( `owner` varchar(128) NOT NULL default , `nickname` varchar(16)
           NOT NULL default , `firstname` varchar(128) NOT NULL default , `lastname` varchar(128)
           NOT NULL default , `email` varchar(128) NOT NULL default , `label` varchar(255)
           default NULL, PRIMARY KEY (`owner`,`nickname`), KEY `firstname` (`firstname`,`lastname`) ) ;
 mysql> CREATE TABLE `userprefs` ( `user` varchar(128) NOT NULL default , `prefkey` varchar(50)
           NOT NULL default , `prefval` varchar(255) default NULL, `modified` timestamp(14)
           NOT NULL, PRIMARY KEY (`user`,`prefkey`) ) ;
 mysql> CREATE TABLE `global_abook` ( `owner` varchar(128) NOT NULL default , `nickname`
           varchar(16) NOT NULL default , `firstname` varchar(128) NOT NULL default , `lastname`
           varchar(128) NOT NULL default , `email` varchar(128) NOT NULL default , `label`
           varchar(255) default NULL, PRIMARY KEY (`owner`,`nickname`),
           KEY `firstname` (`firstname`,`lastname`) );
หลังจากสร้างเสร็จแล้วให้ทดลอง SquirrelMail ด้วยการเปิดเว็บบราวเซอร์ไปที
 http://your-squirrelmail-location/src/configtest.php