บทนำ
บทช่วยสอนนี้แสดงให้เห็นถึงเซิร์ฟเวอร์อีเมลแบบเต็มรูปแบบที่ทำงานบน OpenBSD โดยใช้ OpenSMTPD, Dovecot, Rspamd และ RainLoop OpenSMTPD เป็นเซิร์ฟเวอร์อีเมลเริ่มต้นสำหรับ OpenBSD เลือกอินสแตนซ์ Vultr Compute Cloud ที่มีพื้นที่เก็บข้อมูลมากมายสำหรับจำนวนผู้ใช้ที่คาดหวัง
ขั้นตอนเบื้องต้น
ตั้งค่าบัญชีผู้ใช้ของคุณเพื่อทำงานเป็นรูท
su -
usermod -G wheel <username>
echo "permit nopass keepenv :wheel" > /etc/doas.conf
exit
ตั้งค่าที่เก็บแพ็กเกจสำหรับ OpenBSD
doas su
echo "https://cdn.openbsd.org/pub/OpenBSD" > /etc/installurl
exit
เพิ่มแพ็คเกจที่จำเป็น
doas pkg_add opensmtpd-extras opensmtpd-filter-rspamd dovecot dovecot-pigeonhole rspamd redis
ตามค่าเริ่มต้น OpenSMTPD จะฟังเฉพาะที่ localhost เท่านั้น ต้องกำหนดค่าอย่างชัดเจนเพื่อฟังบนอินเตอร์เฟสภายนอก ควรกำหนดค่าให้ใช้ผู้ใช้เสมือนแทนผู้ใช้ระบบเพื่อความปลอดภัย
สำรองข้อมูล/etc/smtpd.conf
ไฟล์เริ่มต้นและสร้างใหม่ตั้งแต่เริ่มต้น
cd /etc/mail
mv smtpd.conf smtpd.conf.default
สร้างใหม่smtpd.conf
ตามที่แสดงด้านล่าง แทนที่example.com
ด้วยโดเมนของคุณ การกำหนดค่าเริ่มต้นนี้ไม่เปิดใช้งานตัวกรอง rspamd ขณะทดสอบ OpenSMTP ตัวกรองสแปมจะเปิดใช้งานในภายหลัง
pki "mail" cert "/etc/ssl/mail.crt"
pki "mail" key "/etc/ssl/private/mail.key"
table aliases file:/etc/mail/aliases
table credentials passwd:/etc/mail/credentials
table virtuals file:/etc/mail/virtuals
filter "rspamd" proc-exec "/usr/local/libexec/smtpd/filter-rspamd"
# To accept external mail, replace with: listen on all
# listen on all tls pki "mail" hostname "mail.example.com"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
auth <credentials>
action "local_mail" mbox alias <aliases>
action "domain_mail" maildir "/var/vmail/example.com/%{dest.user}" \
virtual <virtuals>
action "outbound" relay
# Uncomment the following to accept external mail for domain "example.org"
# match from any for domain "example.com" action "domain_mail"
match from local for local action "local_mail"
match from local for any action "outbound"
match auth from any for any action "outbound"
สร้างไฟล์ / etc / หนังสือรับรอง
OpenSMTPD และ Dovecot สามารถแชร์ฐานข้อมูลการพิสูจน์ตัวตน ฐานข้อมูลนี้มีลักษณะคล้ายกับไฟล์รหัสผ่านระบบในรูปแบบโดยมีสองฟิลด์พิเศษสำหรับ Dovecot สองฟิลด์พิเศษกำหนดโฮมไดเร็กทอรีเสมือนและตำแหน่งเมล รหัสผ่านอยู่ในรูปแบบปักเป้า บทช่วยสอนนี้สร้างผู้ใช้ตัวอย่างสามคน
สร้างรหัสผ่านและต่อรหัสเข้ากับ/etc/mail/credentials
ไฟล์
doas su
smtpctl encrypt example_password1 >> /etc/mail/credentials
smtpctl encrypt example_password2 >> /etc/mail/credentials
smtpctl encrypt example_password3 >> /etc/mail/credentials
exit
ผลลัพธ์มีลักษณะคล้ายกับสิ่งนี้:
$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6
$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e
$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq
แก้ไข/etc/mail/credentials
เพื่อเพิ่มฟิลด์ที่จำเป็น แต่ละบรรทัดแผนที่ไปยังบัญชีระบบVmailกับ UID และ GID ของ2000 แทนที่ example.com ด้วยโดเมนของคุณ ชื่อผู้ใช้เสมือนคือที่อยู่อีเมลที่สมบูรณ์
[email protected]:$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6:vmail:2000:2000:/var/vmail/example.com/john::userdb_mail=maildir:/var/vmail/example.com/john
[email protected]:$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e:vmail:2000:2000:/var/vmail/example.com/adam::userdb_mail=maildir:/var/vmail/example.com/adam
[email protected]:$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq:vmail:2000:2000:/var/vmail/example.com/natalie::userdb_mail=maildir:/var/vmail/example.com/natalie
สร้างบัญชีเมลเสมือนและตั้งค่าความปลอดภัย
สร้างการแมปผู้ใช้เสมือน
สร้าง/etc/mail/virtuals
เพื่อกำหนดที่อยู่อีเมลที่ถูกต้อง
สร้างคีย์สาธารณะ / ส่วนตัวสำหรับ OpenSMTPD
ตัวอย่างนี้ใช้ใบรับรองแบบลงนามด้วยตนเอง ใช้ใบรับรองที่ลงชื่อที่ถูกต้องหากคุณมี เมื่อได้รับพร้อมต์สำหรับชื่อสามัญตรวจสอบให้แน่ใจว่าตรงกับ FQDN ของเซิร์ฟเวอร์ ตัวอย่างนี้ใช้ mail.example.com
doas su
cd /etc/ssl
openssl genrsa -out private/mail.key 4096
openssl req -x509 -new -nodes -key private/mail.key -out mail.crt -days 3650 -sha256
chmod 0400 /etc/ssl/private/mail.key
exit
ทดสอบเซิร์ฟเวอร์
ใช้ตัวตรวจสอบไวยากรณ์การกำหนดค่า OpenSMTPD หากไม่พบปัญหาให้รีสตาร์ท smtpd daemon
doas smtpd -n
doas rcctl restart smtpd
จากบัญชีอีเมลภายนอกให้ส่งอีเมลทดสอบไปยังผู้ใช้คนใดคนหนึ่ง
- OpenSMTPD จะสร้างโครงสร้างของโฟลเดอร์ Maildir ด้านล่างและส่งจดหมายไปยัง
/var/vmail
/var/vmail/example.com/<username>/new
1576339842.4d64757b.example.com:2,
ในฐานะที่เป็นผู้ใช้รากเรียกดูไปยังสถานที่แห่งนี้และยืนยันได้ว่าคุณมีไฟล์ชื่อที่คล้ายกันนี้:
-
ตรวจสอบเนื้อหาของไฟล์รวมถึงส่วนหัวจดหมายทั้งหมดเพื่อตรวจสอบว่าการส่งอีเมลทำงานได้อย่างถูกต้อง
Return-Path: <n0244e80da3-54b1ed125c5342fc-adam===example.org@bounce.example.org>
Delivered-To: [email protected]
Received: from spruce-goose-ba.twitter.com (spruce-goose-ba.twitter.com [199.59.150.96])
by mail.example.com (OpenSMTPD) with ESMTPS id 75b514d3 (TLSv1.2:ECDHE-RSA-AES256-GCM- SHA384:256:NO)
for <[email protected]>;
Sat, 14 Dec 2019 11:10:40 -0500 (EST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=twitter.com;
s=dkim-201406; t=1576339839;
bh=jhKB5/w9v87GaXSuizT576ntJ/72gvLRDhsqmGQQrCE=;
h=Date:From:To:Subject:MIME-Version:Content-Type:List-Unsubscribe:
Message-ID;
b=TWn/QVUJ1VDlWiweWoanwHLABCL1nqmm0+TBzh3PjmYNm0quRMXB7QL2ykzHGME5A
DTz/JFHa0cOvQsrdhxxbjOLFKimK0nF+Ou5kI+2HzTzfVNZS0qGnTVP/tZyaIsWjjl
an5EiR6HFOHG4iClOOEOJW4oLDEZfPTefrlW+378bmHGIRUNDvVKrbXKunL9fJFAb3
JSrhWQNwbrF/aARFzw4nKfb1I7vTRSrN1eXE5JxzGwI2XAjqDIWdR5ExwUNbJH5ZPs
wQ85j8KLZEEgQkbH9CypgeUMJWsVK95FqOCCaqKMS10M7intGMb3aeiiFcB7yDHi9t
u7rVESm4eGp/g==
X-MSFBL: DM7pSZns+YDRgNEmGNre9aPjZTtc1tDlN97w5rQDBts=|eyJ1IjoibWF0dEBnb2J
sYWNrY2F0LmNvbUBpaWQjIzU0YjFlZDEyNWM1MzQyZmNiNThiMzVmNzI0NDZlMGF
mQHVzYiMjNkAyNDRAMTA4MjgwNTAxMDYzNzk1MDk3NkAwQDA4MjY5ZWI4OTI3YzR
kNTFiNTZkMjY3YzY2OGRmN2IwY2Y4M2ExZGIiLCJyIjoibWF0dEBnb2JsYWNrY2F
0LmNvbSIsImciOiJCdWxrIiwiYiI6InNtZjEtYmd4LTM0LXNyMS1CdWxrLjE4NiJ
9
Date: Sat, 14 Dec 2019 16:10:39 +0000
...
ตั้งค่าคลาสเข้าสู่ระบบ
Dovecot ต้องการความสามารถในการเปิดไฟล์จำนวนมากขึ้นสำหรับการอ่านและการเขียนมากกว่าคลาสเริ่มต้นที่อนุญาต การไม่ทำเช่นนี้จะทำให้เกิดข้อผิดพลาดที่แก้ไขได้ยาก
กำหนดคลาสล็อกอินสำหรับ Dovecot daemon ที่ด้านล่างของ/etc/login.conf
เพิ่มบรรทัดต่อไปนี้
dovecot:\
:openfiles-cur=1024:\
:openfiles-max=2048:\
:tc=daemon:
สร้างไฟล์การกำหนดค่า Dovecot
/etc/dovecot/local.conf
สร้าง
auth_mechanisms = plain
first_valid_uid = 2000
first_valid_gid = 2000
mail_location = maildir:/var/vmail/%d/%n
mail_plugin_dir = /usr/local/lib/dovecot
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapsieve vnd.dovecot.imapsieve
mbox_write_locks = fcntl
mmap_disable = yes
namespace inbox {
inbox = yes
location =
mailbox Archive {
auto = subscribe
special_use = \Archive
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
prefix =
}
passdb {
args = scheme=CRYPT username_format=%u /etc/mail/credentials
driver = passwd-file
name =
}
plugin {
imapsieve_mailbox1_before = file:/usr/local/lib/dovecot/sieve/report-spam.sieve
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_name = Junk
imapsieve_mailbox2_before = file:/usr/local/lib/dovecot/sieve/report-ham.sieve
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_from = Junk
imapsieve_mailbox2_name = *
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
sieve_pipe_bin_dir = /usr/local/lib/dovecot/sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
}
protocols = imap sieve
service imap-login {
inet_listener imaps {
port = 0
}
}
service managesieve-login {
inet_listener sieve {
port = 4190
}
inet_listener sieve_deprecated {
port = 2000
}
}
ssl_cert = </etc/ssl/mail.crt
ssl_key = </etc/ssl/private/mail.key
userdb {
args = username_format=%u /etc/mail/credentials
driver = passwd-file
name =
}
protocol imap {
mail_plugins = " imap_sieve"
}
แก้ไขข้อบกพร่อง Dovecot
มีข้อผิดพลาดใน Dovecot ที่ssl_cert
และssl_key
การตั้งค่าไม่ถูกแทนที่ในlocal.conf
ไฟล์ดังนั้นเราจึงต้องแสดงความคิดเห็นออก หากคุณพลาดขั้นตอนนี้ Dovecot จะล้มเหลวในการเริ่มต้นอย่างถูกต้อง
แก้ไข/etc/dovecot/conf.d/10-ssl.conf
ตามที่แสดง
...
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
#ssl_cert = </etc/ssl/dovecotcert.pem
#ssl_key = </etc/ssl/private/dovecot.pem
...
สร้างสคริปต์ Sieve
สคริปต์ตะแกรงฝึก Rspamd บนสแปมและแฮม การย้ายอีเมลเข้าและออกจากโฟลเดอร์ขยะจะทำให้เกิดเหตุการณ์ในการฝึกอบรม Rspamd
/usr/local/lib/dovecot/sieve
ไฟล์เหล่านี้จะตั้งอยู่ที่
สร้างreport-ham.sieve
ไฟล์
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
if environment :matches "imap.mailbox" "*" {
set "mailbox" "${1}";
}
if string "${mailbox}" "Trash" {
stop;
}
if environment :matches "imap.user" "*" {
set "username" "${1}";
}
pipe :copy "sa-learn-ham.sh" [ "${username}" ];
สร้างreport-spam.sieve
ไฟล์
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
if environment :matches "imap.user" "*" {
set "username" "${1}";
}
pipe :copy "sa-learn-spam.sh" [ "${username}" ];
รวบรวมไฟล์
sievec report-ham.sieve
sievec report-spam.sieve
สร้างเชลล์สคริปต์สองตัวต่อไปนี้ใน /usr/local/lib/dovecot/sieve
เพิ่มรายการต่อไปนี้เพื่อ sa-learn-ham.sh
#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_ham
เพิ่มรายการต่อไปนี้เพื่อ sa-learn-spam.sh
#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_spam
ทำให้ไฟล์ปฏิบัติการได้
chmod 0755 sa-learn-ham.sh
chmod 0755 sa-learn-spam.sh
เปิดใช้งานและเริ่ม Dovecot
rcctl enable dovecot
rcctl start dovecot
ตรวจสอบว่า Dovecot เริ่มต้นอย่างถูกต้อง
ps ax | grep dovecot
88005 ?? I 0:00.11 /usr/local/sbin/dovecot
69640 ?? I 0:00.03 dovecot/anvil
91207 ?? I 0:00.03 dovecot/log
98178 ?? I 0:00.19 dovecot/config
34712 ?? I 0:00.06 dovecot/stats
96674 ?? I 0:00.03 dovecot/imap-login
8891 ?? S 0:00.02 dovecot/imap
ตรวจสอบว่า Dovecot สามารถอ่านได้อย่างถูกต้อง /etc/mail/credentials
doveadm user [email protected]
field value
uid 2000
gid 2000
home /var/vmail/example.com/john
mail maildir:/var/vmail/example.com/john
ตรวจสอบว่าผู้ใช้จดหมายสามารถเข้าสู่ระบบ
doveadm auth login [email protected]
Password: ********
passdb: [email protected] auth succeeded
extra fields:
[email protected]
userdb extra fields:
[email protected]
mail=maildir:/var/vmail/example.com/john
uid=2000
gid=2000
home=/var/vmail/example.com/john
auth_mech=PLAIN
ตั้งค่า Rspamd
นี่คือการกำหนดค่าพื้นฐาน Rspamd อ้างอิงเอกสารทางการสำหรับรายละเอียดเพิ่มเติม ตัวอย่างนี้สร้างคำนิยามสำหรับโดเมนของเราเพื่อเปิดใช้งานการลงนาม DKIM
สร้างพับบลิคสาธารณะ / ส่วนตัวใน/etc/mail/dkim
และตั้งค่าการอนุญาตที่ถูกต้อง
doas su
mkdir /etc/mail/dkim
cd /etc/mail/dkim
openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key
chmod 0440 private.key
chown root:_rspamd private.key
สร้างระเบียน DNS สำหรับ DKIM ที่มีรหัสสาธารณะ อ้างถึงผู้ให้บริการ DNS ของคุณสำหรับรายละเอียดวิธีสร้างระเบียน DKIM คัดลอกเนื้อหาจาก/etc/mail/dkim/public.key
และวางไว้หลังp=
ส่วนของระเบียน DKIM ดังที่แสดงด้านล่าง หมายเหตุตัวอย่างนี้ยังสร้างระเบียน SPF
default._domainkey.example.com. IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClcuK3FV3Ug64li8iFsuJ2ykgb7FMZsujk9uG79ppPUp57vCfjzO7F+HBfx5qIwvlGxv2IJXK86FZwhpUX+HFCDUtfB2z0ZNGerWcZfNzM1w1Bru/fdMd2tCYkiHEa5RWIkLfs/Fm+neXxRZfAG2UDWmAghNbgzYv7xViwgufDIQIDAQAB"
example.com. IN TXT "v=spf1 a ip4:192.0.2.1 mx ~all"
สร้างระเบียน DMARC
_dmarc.example.com. IN TXT "v=DMARC1;p=none;pct=100;rua=mailto:[email protected]"
สร้าง/etc/rspamd/local.d/dkim_signing.conf
ไฟล์กำหนดค่า
เปิดใช้งานและเริ่ม Rspamd
doas rcctl enable redis rspamd
doas rcctl start redis rspamd
เปลี่ยนบรรทัดด้านล่าง/etc/mail/smtpd.conf
และรีสตาร์ท OpenSMTPD เพื่อเปิดใช้งาน Rspamd
...
listen on all tls pki "mail" hostname "mail.example.com" filter "rspamd"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
auth <credentials> filter "rspamd"
...
rcctl restart smtpd
ทดสอบเซิร์ฟเวอร์อีเมลด้วยไคลเอนต์อีเมล POP3 หรือ IMAP หากคุณไม่ต้องการใช้เว็บเมลให้หยุดที่นี่
ติดตั้งแพคเกจข้อกำหนดเบื้องต้น
เมื่อได้รับแจ้งโปรดเลือก PHP เวอร์ชันล่าสุด
pkg_add php php-curl php-pdo_sqlite php-zip pecl73-mcrypt zip unzip wget curl
เรียก RainLoop เว็บเมล tarball /var/www/htdocs/
และแยกไป
ใช้ Standard Edition ซึ่งรวมถึงตัวอัปเดตอัตโนมัติ
cd /tmp
wget https://www.rainloop.net/repository/webmail/rainloop-latest.zip
unzip rainloop-latest.zip -d /var/www/htdocs/rainloop
chown -R www:www /var/www/htdocs
สร้าง Let's Encrypt SSL Certificate
- คัดลอก
/etc/examples/acme-client.conf
ไปยัง/etc
-
เพิ่มบรรทัดต่อไปนี้ที่ด้านล่างของไฟล์:
domain webmail.example.com {
domain key "/etc/ssl/private/webmail.example.com.key"
domain full chain certificate "/etc/ssl/webmail.example.com.crt"
sign with letsencrypt
}
กำหนดค่า httpd
- สร้างรายการ DNS (ระเบียน CNAME หรือ A) สำหรับโดเมนย่อย
webmail.example.com
-
แก้ไข/etc/httpd.conf
ตามตัวอย่างด้านล่าง
prefork 3
types { include "/usr/share/misc/mime.types" }
server "default" {
listen on egress port 80
root "/htdocs"
directory index index.html
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
}
รันการตรวจสอบไวยากรณ์ httpd
httpd -n
เปิดใช้งานและเริ่ม httpd
rcctl enable httpd
rcctl start httpd
ขอใบรับรองการเข้ารหัสของ Let's
acme-client -v webmail.example.com
เพิ่มคำจำกัดความเซิร์ฟเวอร์สำหรับ RainLoop /etc/httpd.conf
server "webmail.example.com" {
listen on egress port 80
block return 302 "https://$SERVER_NAME$REQUEST_URI"
}
server "webmail.example.com" {
listen on egress tls port 443
root "/htdocs/rainloop"
directory index "index.php"
tcp { nodelay, backlog 10 }
tls {
certificate "/etc/ssl/webmail.example.com.crt"
key "/etc/ssl/private/webmail.example.com.key"
}
hsts {
max-age 31556952
preload
}
# Value below is 25MB in bytes. 1MB = 1048576 bytes
connection max request body 26214400
location "/data*" {
block return 403
}
location "*.php*" {
fastcgi socket "/run/php-fpm.sock"
}
}
กำหนดค่า PHP เพื่อให้สามารถแนบได้สูงสุด 25 เมกะไบต์ ทำการเปลี่ยนแปลงต่อไปนี้ใน/etc/php-7.3.ini
:
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 25M
...
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 29M
เปิดใช้งานโมดูล PHP ที่จำเป็นโดยการคัดลอกไฟล์กำหนดค่าไปที่ /etc/php-7.3/
cp /etc/php-7.3.sample/* /etc/php-7.3/.
ตรวจสอบไวยากรณ์ของ /etc/httpd.conf
httpd -n
เปิดใช้งานและเริ่มต้น httpd และ php-fpm
rcctl reload httpd
rcctl enable php73_fpm
rcctl start php73_fpm
สอบปลายภาค
https://webmail.example.com/?admin
เรียกดูเพื่อ
ชื่อผู้ใช้เริ่มต้นคือ: ผู้ดูแลระบบ
รหัสผ่านเริ่มต้นคือ: 12345
เรียกดูแต่ละส่วนการกำหนดค่าและทำการเปลี่ยนแปลงที่คุณต้องการ เมื่อคุณตั้งค่าเสร็จแล้วให้เข้าสู่เว็บเมลที่https://webmail.example.com