Instal dan Konfigurasi Mail Server pada CentOS 7

Seperti pembahasan saya sebelumnya terkait penggunaan dan kebutuhan email sangatlah penting ya, maka dari itu pada sesi kali ini saya akan membahas detail terkait mail server itu sendiri. Kenapa harus membangun email server sendiri ?

Karena jika Anda memiliki private mail server, Anda bisa mengelola mail server Anda secara full dan jika mail server sudah jadi Anda dapat melakukan kustomisasi dengan fleksibel dan mudah. Selain itu data privacy email tersebut secara penuh milik Anda dan hal ini tentunya lebih aman daripada menggunakan public mail server. Namun perlu diketahui bahwa Anda harus memiliki keahlian dalam mengelola mail server tersebut, jika tidak mail server Anda bisa tersusupi oleh pihak yang tidak bertanggung jawab dan akhirnya server yang Anda miliki compromised.

Sebelum memulai instalasi dan konfigurasi private mail server, alangkah baiknya memahami konsep dan cara kerja mail server terlebih dahulu seperti pada post yang saya share sebelumnya disini.

Persyaratan

  • Menggunakan OS CentOs 7 dan dalam kondisi Fresh OS
  • Sudah menginstall LEMPP Stack , jika belum bisa melihat post berikut.
  • Spek Server/VM minimum : 1 Core vCPU, RAM 1 GB, Storage 10 GB
  • Pointing record A dan MX untuk mail Anda :
    a. example.id A 1.2.3.4
    b. mail A 10 1.2.3.4
    b. example.id MX 10 mail.example.id

Instalasi dan Konfigurasi

  1. Ganti hostname server Anda terlebih dahulu secara FQDN menjadi mail.example.id, semisal : mail.nuya.my.id
    sudo hostnamectl --static set-hostname mail.nuya.my.id

Ket :
Ganti mail.nuya.my.id dengan domain Anda (contoh : mail.example.id)

  1. Install sertifikat SSL untuk mail server Anda, disini saya contohkan menggunakan Let's Encrypt. Gunanya SSL ini akan mengautentikasi mail server ke user dan enkripsi transmisi data antara mail client user dan mail server.
    Aktifkan repositori EPEL terlebih dahulu :
sudo yum install epel-release
sudo yum update

Karena web server yang kali ini kita gunakan adalah Nginx maka install certbot untuk Nginx :

sudo yum install python2-certbot-nginx
sudo certbot --nginx

Certbot akan menanyakan beberapa informasi untuk website yang digunakan :

# sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: example.id
2: www.example.id
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Karena disini saya menggunakan mail.nuya.id maka silakan input mail.nuya.id.

Ket :
Ganti mail.nuya.my.id dengan domain Anda (contoh : mail.example.id)

Kemudian certbot juga akan menanyakan apakah aksesnya dilakukan redirect secara otomatis ke HTTPS atau tidak, silakan pilih opsi redirect secara otomatis.

Jika instalasi sudah selesai, maka file private key (privkey.pem) dan certificate (fullchain.pem) akan disimpan pada folder /etc/letsencrypt/live/$domain.

Dan sebagai tambahan informasi disini saya tidak mengaktifkan firewall dari sisi OS nya, dan jangan lupa matikan selinux atau mode permissive ya. Jika Anda menggunakan firewall tambahan dari sisi router silakan allow port, seperti vm yang saya gunakan disini menggunakan openstack maka saya buka port dari sisi security group. Adapun port yang dibutuhkan nantinya adalah 25, 587, 993. 995, dan port 22 serta port 80, 443.

  1. Kemudian install postfix dan dovecotnya beserta paket tambahan :
sudo yum install postfix dovecot dovecot-mysql

Karena saya sudah informasikan sebelumnya untuk install LEMPP terlebih dahulu maka tidak saya jelaskan kembali untuk cara install nginx maupun mariadb nya ya.

Start service dan enable jika perlu serta pastikan servicenya berstatus running.

sudo systemctl status postfix
enter image description here

sudo systemctl status dovecot
enter image description here

  1. Langkah selanjutnya buatlah database beserta usernya untuk keperluan storage user dan emailnya nanti.

Login terlebih dahulu ke mysql Anda dengan user root dan password yang sudah diset sebelumnya.
sudo mysql -u root -p

create database email;
GRANT ALL PRIVILEGES ON email.* TO "mailuser"@"localhost" IDENTIFIED BY "isiPasswordAnda";

Ket :
Ganti "isiPasswordAnda" dengan password Anda yang kompleks terdiri dari kombinasi huruf, angka dan tanda baca.

Kemudian buatlah tabel pada database tersebut :

CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
  1. Setelah itu buat empat file seperti berikut ini :
    • sudo vim /etc/postfix/mysql-virtual_domains.cf
user = mailuser
password = isiPasswordAnda
dbname = email
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
  • sudo vim /etc/postfix/mysql-virtual_email2email.cf
user = mailuser
password = isiPasswordAnda
dbname = email
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1
  • sudo vim /etc/postfix/mysql-virtual_forwardings.cf
user = mailuser
password = isiPasswordAnda
dbname = email
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
  • sudo vim /etc/postfix/mysql-virtual_mailboxes.cf
user = mailuser
password = isiPasswordAnda
dbname = email
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

Ket :
Ganti "isiPasswordAnda" dengan password Anda yang kompleks terdiri dari kombinasi huruf, angka dan tanda baca.

  1. Langkah berikutnya konfigurasi postfix Anda, buka file /etc/postfix/master.cf . Namun sebelum itu copy terlebih dahulu file originalnya agar ketika konfigurasinya gagal bisa copy dari file originalnya :
    sudo cp /etc/postfix/master.cf{,bak}

sudo vim /etc/postfix/master.cf

Modifikasi dengan menghilangkan tanda pagar didepannya menjadi seperti berikut ini :

submission inet n   -   n   -   -   smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no

Lalu copy file /etc/postfix/main.cf

sudo cp /etc/postfix/main.cf{,bak}

#myhostname = host.domain.tld
#mydomain = domain.tld
#myorigin = $myhostname
#inet_interfaces = all

Dan ubah menjadi :

myhostname = mail.example.id
mydomain = example.id
myorigin = $myhostname
inet_interfaces = all

Ket :
Ganti example.id dengan nama domain Anda (contoh : nuya.my.id)

Selanjutnya tambahkan dibaris paling bawah file tersebut :

smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.id/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.id/privkey.pem
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail

#SASL
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes

#Limit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

Ket :
Ganti example.id dengan nama domain Anda (contoh : nuya.my.id)

Restart service postfix :
sudo systemctl restart postfix

  1. Install dan Konfigurasi Dovecot
    Buat folder penyimpanan email di /home/vmail
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m
sudo chown -R vmail.vmail /home/vmail

Copy file /etc/dovecot/conf.d/10-mail.conf terlebih dahulu dan modifikasi :
sudo cp /etc/dovecot/conf.d/10-mail.conf{,.bak}

sudo vim /etc/dovecot/conf.d/10-mail.conf

#separator = 
#mail_location =

Ubah menjadi :

separator = .
mail_location = maildir:/home/vmail/%d/%n/Maildir

Kemudian copy file /etc/dovecot/conf.d/10-auth.conf dan ubah :

sudo cp /etc/dovecot/conf.d/10-auth.conf{,.bak}

sudo vim /etc/dovecot/conf.d/10-auth.conf

auth_mechanisms = plain
!include auth-system.conf.ext
#!include auth-sql.conf.ext

Ubah menjadi :

auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-sql.conf.ext

Langkah selanjutnya copy file /etc/dovecot/conf.d/10-master.conf dan ubah :
sudo cp /etc/dovecot/conf.d/10-master.conf{,.bak}

sudo vim /etc/dovecot/conf.d/10-master.conf

#unix_listener /var/spool/postfix/private/auth {
#  mode = 0666
#}

Menjadi :

unix_listener /var/spool/postfix/private/auth {
  mode = 0660
  user = postfix
  group = postfix
}

Kemudian edit file /etc/dovecot/conf.d/10-ssl.conf dan ubah :
sudo cp /etc/dovecot/conf.d/10-ssl.conf{,.bak}
sudo vim /etc/dovecot/conf.d/10-ssl.conf

ssl = required
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem

Menjadi :

ssl = yes
ssl_cert = </etc/letsencrypt/live/mail.example.id/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.id/privkey.pem

Ket :
Ganti example.id dengan nama domain Anda (contoh : nuya.my.id)

Selanjutnya copy, edit dan tambahkan konfigurasi file /etc/dovecot/conf.d/15-mailboxes.conf :
sudo cp /etc/dovecot/conf.d/15-mailboxes.conf{,.bak}

mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Trash {
    special_use = \Trash
  }
 mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }

Kemudian buat file /etc/dovecot/dovecot-sql.conf.ext

user_query = SELECT ('5000') as 'uid',('5000') as 'gid'
driver = mysql
connect = host=127.0.0.1 dbname=email user=mailuser password=isiPasswordAnda
default_pass_scheme = SHA256-CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

Langkah yang terakhir silakan buka file /etc/dovecot/conf.d/10-master.conf dan ubah :

service lmtp {
  unix_listener lmtp {
    #mode = 0666
  }

  # Create inet listener only if you can't use the above UNIX socket
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
}

Menjadi :

service lmtp {

  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    group = postfix
    user = postfix
  }

}

Restart service dovecot :
sudo systemctl restart dovecot

Supaya hasil konfigurasi dovecot bisa dikenala oleh postfix jalankan perintah :
sudo postconf virtual_transport=lmtp:unix:private/dovecot-lmtp

Lalu silakan restart service postfix :
sudo systemctl restart postfix

Lalu cek port dari dalam server Anda, pastikan port smpts, pop3s dan imaps berstatus LISTEN :

enter image description here
Anda bisa memastikan port tersebut bisa diakses dari luar server :

sudo yum install telnet -y

sudo telnet [ip-server] [port]

Ket :
Ganti [ip-server] dengan IP server yang Anda miliki
Ganti [port] dengan port server Anda

Jika berhasil maka hasilnya akan seperti berikut ini :

enter image description here

Uji Coba

Setelah konfigurasi postfix dan dovecot sudah selesai, saatnya melakukan uji coba pengiriman email dari user root server Anda ke gmail misalnya :

$ sudo mailx [email protected]
Subject: Percobaan Pengiriman Email
Ini hanya percobaan pengiriman email, silakan diabaikan!

Setelah itu tekan ctrl + D untuk kirim emailnya.

Paralel silakan buka window baru dan jalankan perintah :
sudo journalctl -f

Jika pengiriman email Anda berhasil maka akan ada log Sent seperti pada gambar berikut ini :
enter image description here

Berikut hasilnya jika dicek pada sisi gmail :
enter image description here

Nah, jika Anda menambahkan domain bisa mengikut langkah-langkah berikut ini :

  • Masuk ke mysql dengan user root terlebih dahulu :
    sudo mysql -u root -p
    use email;

Tambahkan domain :
INSERT INTO domains (domain) VALUES ('example.id');
Ket :
Ganti example.id dengan domain Anda (contoh : nuya.my.id)

Untuk service mail yang digunakan saat ini tidak ada batasan/unlimited ya tergantung dari jumlah storage yang digunakan, jadi Anda bisa menambahkan domain/subdomain sebanyak-banyaknya.

  • Lalu tambahkan akun email :
    INSERT INTO users (email, password) VALUES ('[email protected]', ENCRYPT('PASSWORD'));

Ket :
Ganti [email protected] dengan akun email Anda (contoh : [email protected])
Ganti PASSWORD dengan password yang Anda inginkan pastikan bersifat komplesk.

Jika Anda ingin menambahkan akun kembali bisa menjalankan perintah diatas, namun apabila ingin menambahkan akun email dengan berbeda domain maka Anda harus menambahkan domainnya terlebih dahulu seperti langkah sebelumnya.
Dan untuk penambahkan akun email ini bersifat unlimited ya, jadi Anda tidak perlu kuatir untuk hal tersebut.

Nah itulah cara instalaasi dan konfigurasi private mail server, saat ini Anda sudah memiliki private mail server dan bisa menggunakannya dengan baik. Hal itu tentunya masih belum cukup agar Anda bisa merasakannya menggunakan mail client seperti Webmail.
Cara instalasi webmail bisa melihat post saya pada link ini ya.

Semoga bermanfaat.