Artikel ini adalah tentang cara mengatur server email modern.
Postfix + Dovecot. SPF + DKIM + rDNS. Dengan IPv6.
Dengan Enkripsi TLS. Dengan dukungan untuk beberapa domain - berpisah dengan sertifikat SSL asli.
Dengan perlindungan anti-spam dan peringkat anti-spam yang tinggi pada server email lainnya.
Dengan dukungan untuk beberapa antarmuka fisik.
Dengan OpenVPN, yang terhubung melalui IPv4, dan yang memberikan IPv6.
Jika Anda tidak ingin mempelajari semua teknologi ini, tetapi ingin mengkonfigurasi server seperti itu, maka artikel ini adalah untuk Anda.
Tidak ada upaya untuk menjelaskan setiap detail dalam artikel. Penjelasannya adalah apa yang tidak dikonfigurasi secara standar atau penting dari sudut pandang konsumen.
Motivasi untuk membuat server surat adalah impian lama saya. Ini mungkin terdengar konyol, tapi IMHO, jauh lebih baik daripada memimpikan mobil baru dari merek favorit Anda.
Motivasi untuk mengkonfigurasi IPv6 adalah dua. Profesional TI perlu mempelajari teknologi baru secara terus-menerus agar dapat bertahan hidup. Saya ingin memberikan kontribusi sederhana saya untuk memerangi sensor.
Motivasi untuk mengatur OpenVPN hanya untuk IPv6 untuk bekerja pada mesin lokal.
Motivasi untuk mengatur beberapa antarmuka fisik adalah pada server saya satu antarmuka "lambat tapi tidak terbatas" dan yang lainnya "cepat, tetapi dengan tarif".
Motivasi untuk mengatur pengaturan Bind adalah bahwa penyedia saya menyediakan server DNS yang tidak stabil, dan google juga macet. Saya ingin server DNS yang stabil untuk penggunaan pribadi.
Motivasi untuk menulis artikel - draft ditulis 10 bulan yang lalu, dan saya sudah melihatnya dua kali. Jika bahkan penulis secara teratur membutuhkan ini, maka ada kemungkinan besar bahwa orang lain akan membutuhkannya.
Tidak ada solusi universal untuk server email. Tetapi saya akan mencoba menulis sesuatu seperti "lakukan seperti ini lalu, ketika semuanya berjalan sebagaimana mestinya - buang kelebihannya".
Ada server Colocation dari tech.ru. Dimungkinkan untuk membandingkan dengan OVH, Hetzner, AWS. Untuk mengatasi masalah ini, kerjasama dengan tech.ru akan jauh lebih efektif.
Debian 9 diinstal di server.
Di server 2 adalah antarmuka `eno1` dan` eno2`. Yang pertama tidak terbatas, dan yang kedua cepat, masing-masing.
Ada 3 alamat IP statis, XX.XX.XX.X0 dan XX.XX.XX.X1 dan XX.XX.XX.X2 pada antarmuka `eno1` dan XX.XX.XX.X5 pada antarmuka` eno2`.
Ada XXXX: XXXX: XXXX: XXXX :: / 64 kumpulan alamat IPv6 yang ditugaskan ke antarmuka `eno1` dan darinya XXXX: XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 atas permintaan saya ditugaskan ke` eno2`.
Ada 3 domain `domain1.com`,` domain2.com`, `domain3.com`. Untuk `domain1.com` dan` domain3.com` ada sertifikat SSL.
Ada akun google di mana Anda ingin mengikat kotak surat `vasya.pupkin @ domain1.com` (menerima surat dan mengirim surat langsung dari antarmuka gmail).
Seharusnya ada kotak surat `support @ domain2.com`, salinan surat yang ingin saya lihat di gmail saya. Dan jarang mungkin untuk mengirim sesuatu atas nama `support @ domain2.com` melalui antarmuka web.
Seharusnya ada kotak surat `ivanov @ domain3.com`, yang akan digunakan Ivanov dari iPhone-nya.
Surat yang dikirim harus mematuhi semua persyaratan anti-spam saat ini.
Seharusnya ada tingkat enkripsi tertinggi yang disediakan pada jaringan publik.
Harus ada dukungan IPv6 untuk mengirim dan menerima email.
Harus ada SpamAssassin yang tidak akan pernah menghapus email. Dan itu akan memantul atau melewati atau mengirim folder Spam ke IMAP.
Pembelajaran otomatis SpamAssassin harus dikonfigurasi: jika saya memindahkan surat ke folder Spam, saya akan belajar dari ini; jika saya memindahkan surat dari folder Spam, saya akan belajar dari ini. Hasil belajar SpamAssassin - harus memengaruhi jangkauan pesan di folder Spam.
Skrip Php harus dapat mengirim email atas nama domain apa pun di server ini.
Harus ada layanan openvpn dengan kemampuan untuk menggunakan IPv6 pada klien yang tidak memiliki IPv6.
Pertama, Anda perlu mengkonfigurasi antarmuka dan perutean, termasuk IPv6.
Maka Anda perlu mengkonfigurasi OpenVPN, yang akan terhubung melalui IPv4 dan menyediakan klien dengan alamat IPv6 statis-nyata. Klien ini akan memiliki akses ke semua layanan IPv6 di server dan akses ke sumber daya IPv6 di Internet.
Maka akan diperlukan untuk mengkonfigurasi Postfix untuk mengirim surat + SPF + DKIM + rDNS dan hal-hal sepele yang serupa.
Maka Anda perlu mengkonfigurasi Dovecot dan mengkonfigurasi Multidomain.
Maka Anda perlu mengkonfigurasi SpamAssassin dan mengkonfigurasi pelatihan.
Akhirnya, instal Bind.
============== Multi-interface ==============
Untuk mengkonfigurasi antarmuka, Anda harus mendaftarkan ini di "/ etc / network / interfaces".
Pengaturan ini dapat diterapkan pada server mana pun di tech.ru (dengan sedikit koordinasi dengan dukungan) dan itu akan segera berfungsi sebagaimana mestinya.
Jika pengalaman mengatur hal serupa untuk Hetzner, OVH - ada pacar. Lebih keras.
eno1 adalah nama kartu jaringan # 1 (lambat tapi tidak terbatas).
eno2 adalah nama kartu jaringan # 2 (cepat, tetapi dengan tarif).
tun0 adalah nama kartu jaringan virtual dari OpenVPN.
XX.XX.XX.X0 - IPv4 # 1 pada eno1.
XX.XX.XX.X1 - IPv4 # 2 pada eno1.
XX.XX.XX.X2 - IPv4 # 3 pada eno1.
XX.XX.XX.X5 - IPv4 # 1 pada eno2.
XX.XX.XX.1 - gateway IPv4.
XXXX: XXXX: XXXX: XXXX :: / 64 - IPv6 ke seluruh server.
XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 - IPv6 untuk eno2, yang lainnya masuk ke eno1 dari luar.
XXXX: XXXX: XXXX: XXXX :: 1 - gateway IPv6 (perlu dicatat bahwa Anda dapat / perlu berteman di sini. Tunjukkan sakelar IPv6).
dns-nameservers - 127.0.0.1 ditentukan (karena bind diinstal secara lokal) dan 213.248.1.6 (ini dari tech.ru).
“Table eno1t” dan “table eno2t” - arti dari aturan rute ini adalah bahwa lalu lintas yang melewati eno1 -> melewatinya, dan lalu lintas yang melewati eno2 -> melewatinya. Dan juga koneksi yang diprakarsai server akan melalui eno1.
ip route add default via XX.XX.XX.1 table eno1t
Dengan perintah ini kami menetapkan bahwa setiap lalu lintas yang tidak dapat dipahami yang jatuh di bawah aturan apa pun dengan "table eno1t" ditandai -> kirim ke antarmuka eno1.
ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t
Dengan perintah ini kami mengatur bahwa mengarahkan lalu lintas yang diprakarsai server ke antarmuka eno1.
ip rule add table eno1t from XX.XX.XX.X0 ip rule add table eno1t to XX.XX.XX.X0
Dengan perintah ini, kami menetapkan aturan untuk menandai lalu lintas sendiri.
auto eno1:2 iface eno1:2 inet static address XX.XX.XX.X2 netmask 255.255.255.0 post-up ip rule add table eno1t from XX.XX.XX.X2 post-up ip rule add table eno1t to XX.XX.XX.X2
Blok ini mendefinisikan IPv4 kedua untuk antarmuka eno1.
ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t
Dengan perintah ini kami mengatur rute dari klien OpenVPN ke IPv4 lokal kecuali XX.XX.XX.X0.
Mengapa perintah ini cukup untuk semua IPv4 - Saya masih tidak mengerti.
iface eno1 inet6 static address XXXX:XXXX:XXXX:XXXX:1:1::/64 gateway XXXX:XXXX:XXXX:XXXX::1
Ini kami atur alamat untuk antarmuka itu sendiri. Server akan menggunakannya sebagai alamat "keluar". Tidak akan lagi digunakan.
Mengapa ditunjukkan ": 1: 1 ::" sangat rumit? OpenVPN itu bekerja dengan benar dan hanya untuk ini. Lebih lanjut tentang ini nanti.
Pada topik gateway - begitulah cara kerjanya. Tetapi dengan cara yang benar - di sini Anda harus menentukan saklar IPv6 yang terhubung dengan server.
Namun, untuk beberapa alasan, IPv6 berhenti berfungsi jika saya melakukan ini. Mungkin ini beberapa masalah tech.ru.
ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
Ini menambahkan alamat IPv6 ke antarmuka. Jika Anda memerlukan seratus alamat, artinya seratus baris dalam file ini.
iface eno1 inet6 static address XXXX:XXXX:XXXX:XXXX:1:1::/64 ... iface eno2 inet6 static address XXXX:XXXX:XXXX:XXXX:1:2::/96 ... iface tun0 inet6 static address XXXX:XXXX:XXXX:XXXX:1:3::/80
Tandai alamat dan subnet semua antarmuka sehingga jelas.
id1 - harus "/ 64" - karena ini adalah kumpulan alamat kami.
tun0 - subnet harus lebih besar dari eno1. Jika tidak, Anda tidak dapat mengkonfigurasi gateway IPv6 untuk klien OpenVPN.
eno2 - subnet harus lebih besar dari tun0. Jika tidak, klien OpenVPN tidak akan bisa mendapatkan alamat IPv6 lokal.
Untuk kejelasan, saya memilih subnet langkah 16, tetapi Anda bahkan dapat mengambil langkah “1” jika Anda mau.
Dengan demikian, 64 + 16 = 80, dan 80 + 16 = 96.
Untuk kejelasan yang lebih besar:
XXXX: XXXX: XXXX: XXXX: 1: 1: YYYY: YYYY - ini adalah alamat yang harus ditetapkan ke situs atau layanan tertentu pada antarmuka eno1.
XXXX: XXXX: XXXX: XXXX: 1: 2: YYYY: YYYY - ini adalah alamat yang harus ditetapkan ke situs atau layanan tertentu pada antarmuka eno2.
XXXX: XXXX: XXXX: XXXX: 1: 3: YYYY: YYYY adalah alamat yang harus ditetapkan untuk klien OpenVPN atau digunakan sebagai alamat layanan OpenVPN.
Untuk mengkonfigurasi jaringan - harus dimungkinkan untuk me-restart server.
Perubahan IPv4 diambil selama eksekusi (pastikan untuk membungkusnya di layar - jika tidak, perintah ini hanya akan menjatuhkan jaringan di server):
/etc/init.d/networking restart
Dalam file "/ etc / iproute2 / rt_tables" tambahkan di akhir:
100 eno1t 101 eno2t
Tanpa ini, Anda tidak dapat menggunakan tabel khusus di file "/ etc / network / interfaces".
Angka-angka harus unik dan kurang dari 65535.
Perubahan IPv6 berubah dengan mudah tanpa me-reboot, tetapi untuk ini Anda perlu mempelajari setidaknya tiga perintah:
ip -6 addr ... ip -6 route ... ip -6 neigh ...
Menyiapkan "/etc/sysctl.conf"
Ini adalah pengaturan sysctl dari server saya. Saya perhatikan yang penting.
net.ipv4.ip_forward = 1
Tanpa ini, OpenVPN tidak akan berfungsi dengan cara apa pun.
net.ipv6.ip_nonlocal_bind = 1
Siapa pun yang mencoba mengikat IPv6 (misalnya nginx) segera setelah antarmuka habis akan mendapatkan kesalahan. Bahwa alamat seperti itu tidak tersedia.
Untuk menghindari situasi seperti itu, pengaturan semacam itu dibuat.
net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.all.proxy_ndp = 1
Tanpa pengaturan IPv6 ini, lalu lintas dari klien OpenVPN tidak masuk ke dunia.
Pengaturan lain tidak relevan atau saya tidak ingat mengapa itu terjadi.
Tapi untuk berjaga-jaga, saya meninggalkan "apa adanya."
Agar perubahan dalam file ini diambil tanpa me-reboot server, Anda perlu menjalankan perintah:
sysctl -p
Lebih detail tentang aturan "table":
habr.com/post/108690============== OpenVPN ==============
OpenVPN IPv4 tidak berfungsi tanpa iptables.
Saya punya iptables untuk VPN ini:
iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
YY.YY.YY.YY adalah alamat IPv4 statis saya dari mesin lokal.
10.8.0.0/24 - jaringan openvpn IPv4. Alamat IPv4 untuk klien openvpn.
Urutan aturan itu penting.
iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT ... iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p udp --dport 1194 -j DROP iptables -A FORWARD -p udp --dport 1194 -j DROP
Ini adalah batasan sehingga hanya saya yang bisa menggunakan OpenVPN dari IP statis saya.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0 -- -- iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
Untuk meneruskan paket IPv4 antara klien OpenVPN dan Internet, Anda harus mendaftarkan salah satu dari perintah ini.
Untuk kasus yang berbeda, salah satu opsi tidak cocok.
Kedua tim cocok untuk kasus saya.
Setelah membaca dokumentasi, saya memilih opsi pertama, karena makan lebih sedikit CPU.
Sehingga semua pengaturan iptables diambil setelah reboot - Anda perlu menyimpannya di suatu tempat.
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
Nama-nama seperti itu tidak dipilih secara kebetulan. Paket iptables-persistent menggunakannya.
apt-get install iptables-persistent
Menginstal paket OpenVPN utama:
apt-get install openvpn easy-rsa
Siapkan templat untuk sertifikat (ganti nilai Anda):
make-cadir ~/openvpn-ca cd ~/openvpn-ca ln -s openssl-1.0.0.cnf openssl.cnf
Mari mengedit pengaturan templat sertifikat:
mcedit vars
...
Buat sertifikat server:
cd ~/openvpn-ca source vars ./clean-all ./build-ca ./build-key-server server ./build-dh openvpn --genkey --secret keys/ta.key
Kami akan mempersiapkan peluang untuk membuat file "client-name.opvn" yang dihasilkan:
mkdir -p ~/client-configs/files chmod 700 ~/client-configs/files cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf mcedit ~/client-configs/base.conf
Kami akan menyiapkan skrip yang akan menjahit semua file menjadi satu file tunggal.
mcedit ~/client-configs/make_config.sh chmod 700 ~/client-configs/make_config.sh
Kami membuat klien OpenVPN pertama:
cd ~/openvpn-ca source vars ./build-key client-name cd ~/client-configs ./make_config.sh client-name
File "~ / client-configs / files / client-name.ovpn" dikirim ke klien.
Untuk klien iOS, Anda perlu melakukan trik:
Isi dari tag tls-auth harus tanpa komentar.
Dan juga letakkan "key-direction 1" tepat sebelum tag "tls-auth".
Konfigurasikan konfigurasi server OpenVPN:
cd ~/openvpn-ca/keys cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf mcedit /etc/openvpn/server.conf
Ini diperlukan untuk menetapkan alamat statis untuk setiap klien (tidak perlu, tetapi saya menggunakan):
Detail paling sulit dan utama.
Sayangnya, OpenVPN belum dapat mengkonfigurasi gateway IPv6 untuk klien secara independen.
Kami harus meneruskan ini secara manual untuk setiap klien.
File "/etc/openvpn/server-clientconnect.sh":
File "/etc/openvpn/server-clientdisconnect.sh":
Kedua skrip menggunakan file "/ etc / openvpn / variabel":
Mengapa itu tertulis di sini - Saya merasa sulit untuk diingat.
Sekarang kelihatannya netmask aneh = 112 (di sana seharusnya 96).
Dan awalannya aneh, tidak cocok dengan jaringan tun0.
Tapi oke, saya biarkan "apa adanya."
cipher DES-EDE3-CBC
Ini adalah amatir - saya memilih metode mengenkripsi koneksi.
Lebih lanjut tentang pengaturan OpenVPN IPv4.Lebih lanjut tentang pengaturan OpenVPN IPv6.============== Postfix ==============
Menginstal paket utama:
apt-get install postfix
Saat memasang, pilih "situs internet".
"/Etc/postfix/main.cf" saya terlihat seperti ini:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no
Mari kita pertimbangkan detail konfigurasi ini.
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
Menurut warga Khabrovsk, blok ini berisi `informasi yang salah dan tesis palsu`.Hanya 8 tahun setelah dimulainya karir saya, saya mulai memahami cara kerja SSL.
Oleh karena itu, saya akan bebas menjelaskan cara menggunakan SSL (tanpa menjawab pertanyaan "Bagaimana cara kerjanya?" Dan "Mengapa itu berfungsi?").
Dasar dari enkripsi modern adalah penciptaan pasangan kunci (dua baris karakter yang sangat panjang).
Satu "kunci" adalah pribadi, yang lain adalah "publik". Kami menjaga kunci pribadi dengan sangat rahasia. Kami mendistribusikan kunci publik kepada semua orang.
Dengan menggunakan kunci publik, Anda dapat mengenkripsi serangkaian teks sehingga hanya pemilik kunci pribadi yang dapat mendekripsi.
Ya, itulah keseluruhan basis teknologi.
Langkah # 1 - https situs.
Saat mengakses situs, browser mengetahui dari server web bahwa situs tersebut adalah https dan karenanya meminta kunci publik.
Server web memberikan kunci publik. Menggunakan kunci publik, browser mengenkripsi permintaan http dan mengirimkannya.
Konten permintaan http hanya dapat dibaca oleh seseorang yang memiliki kunci pribadi, yaitu, hanya server tempat panggilan dibuat.
Http-request setidaknya mengandung URI. Karena itu, jika negara berusaha membatasi akses tidak ke seluruh situs, tetapi ke halaman tertentu, maka untuk situs https ini tidak dapat dilakukan.
Langkah # 2 adalah jawaban terenkripsi.
Server web memberikan jawaban yang dapat dengan mudah dibaca di sepanjang jalan.
Solusinya sangat sederhana - browser secara lokal menghasilkan pasangan kunci publik-publik yang sama untuk setiap situs https.
Dan bersama dengan permintaan kunci publik dari situs, ia mengirimkan kunci publik lokalnya.
Server web mengingatnya dan, ketika mengirim tanggapan http, mengenkripsi dengan kunci publik ini dari klien tertentu.
Sekarang http-respons hanya dapat didekripsi oleh pemilik kunci pribadi browser klien (yaitu, klien itu sendiri).
Langkah nomor 3 - membuat koneksi aman melalui saluran publik.
Dalam contoh No. 2 ada kerentanan - tidak ada yang mencegah simpatisan baik dari mencegat permintaan http dan mengedit informasi kunci publik.
Dengan demikian, perantara akan melihat hampir semua konten pesan yang dikirim dan diterima sampai saluran komunikasi berubah.
Pertarungan ini sangat sederhana - cukup kirim kunci publik browser sebagai pesan yang dienkripsi dengan kunci publik dari server web.
Server web kemudian mengirim respons seperti "kunci publik Anda seperti ini" dan mengenkripsi pesan ini dengan kunci publik yang sama.
Browser melihat jawaban - jika pesan "kunci publik Anda seperti ini" diterima - maka ini adalah jaminan 100% bahwa saluran komunikasi ini aman.
Seberapa amankah itu?
Pembuatan saluran komunikasi yang aman itu sendiri terjadi pada kecepatan ping * 2. Sebagai contoh, 20 ms.
Seorang penyerang harus memiliki salah satu pihak kunci pribadi terlebih dahulu. Atau ambil kunci pribadi selama beberapa milidetik.
Meretas satu kunci pribadi modern akan memakan waktu puluhan tahun pada superkomputer.
Langkah # 4 - database publik kunci publik.
Jelas, dalam keseluruhan cerita ini ada kemungkinan penyerang duduk di saluran komunikasi antara klien dan server.
Peluang untuk klien disajikan oleh server, dan ke server untuk disajikan oleh klien. Dan meniru pasangan kunci di kedua arah.
Kemudian penyerang akan melihat semua lalu lintas dan akan dapat "mengedit" lalu lintas.
Misalnya, ubah alamat tempat mengirim uang atau menyalin kata sandi dari bank online atau memblokir konten yang “tidak menyenangkan”.
Untuk memerangi penyerang seperti itu, mereka datang dengan database publik dengan kunci publik untuk setiap situs https.
Setiap browser "tahu" tentang keberadaan sekitar 200 dari database ini. Ini sudah diinstal sebelumnya di setiap browser.
"Pengetahuan" didukung oleh kunci publik untuk setiap sertifikat. Artinya, tidak mungkin memalsukan koneksi dengan masing-masing otoritas sertifikasi tertentu.
Sekarang ada pemahaman sederhana tentang cara menggunakan SSL untuk https.
Jika Anda memindahkan otak Anda, akan menjadi jelas bagaimana layanan khusus dapat memecahkan sesuatu dalam desain ini. Tapi itu akan membebani mereka usaha yang sangat besar.
Dan organisasi yang lebih kecil dari NSA atau CIA - hampir tidak mungkin untuk memecahkan tingkat perlindungan yang ada, bahkan untuk vip.
Saya juga akan menambahkan tentang koneksi ssh. Tidak ada kunci publik, apa yang harus dilakukan. Masalah ini diselesaikan dengan dua cara.
Opsi kata sandi ssh:
Pada koneksi pertama, klien ssh harus memperingatkan bahwa di sini kita memiliki kunci publik baru dari server ssh.
Dan dengan koneksi lebih lanjut, jika peringatan "kunci publik baru dari server ssh" muncul, itu berarti mereka mencoba mendengarkan Anda.
Atau pada koneksi pertama yang Anda dengarkan, dan sekarang Anda berbicara ke server tanpa perantara.
Sebenarnya, karena fakta bahwa penyadapan mudah, cepat dan mudah terungkap, serangan ini hanya digunakan dalam kasus-kasus khusus untuk klien tertentu.
Opsi ssh kunci:
Kami mengambil flash drive, menulis kunci pribadi untuk server ssh di atasnya (untuk ini ada istilah dan banyak nuansa yang signifikan, tapi saya sedang menulis program pendidikan, bukan instruksi untuk digunakan).
Kami meninggalkan kunci publik di mesin tempat klien ssh akan berada dan kami juga merahasiakannya.
Kami membawa flash drive ke server, memasukkan, menyalin kunci pribadi, dan membakar flash drive dan menyebarkan debu dalam angin (atau setidaknya memformatnya dengan nol).
Itu saja - setelah operasi seperti itu tidak mungkin untuk memecahkan koneksi ssh seperti itu. Tentu saja, lebih dari 10 tahun Anda dapat melihat lalu lintas di superkomputer - tetapi ini adalah cerita yang berbeda.
Saya minta maaf untuk offtopic.
Jadi sekarang teorinya sudah diketahui. Saya akan bercerita tentang aliran penciptaan sertifikat ssl.
Menggunakan "openssl genrsa" kami membuat kunci pribadi dan "kosong" untuk kunci publik.
Kami mengirim "blank" ke perusahaan pihak ketiga, di mana kami membayar sekitar $ 9 untuk sertifikat paling sederhana.
Dalam beberapa jam, kami menerima kunci "publik" dari perusahaan pihak ketiga dan beberapa kunci publik lainnya.
Mengapa perusahaan pihak ketiga harus membayar untuk penerbitan kunci publik saya - masalah terpisah, kami tidak akan mempertimbangkan di sini.
Sekarang sudah jelas apa arti dari prasasti itu:
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
Dalam folder "/ etc / ssl" semua file untuk pertanyaan ssl disimpan.
domain1.com - nama domain.
2018 adalah tahun pembuatan kunci.
"Kunci" - penunjukan bahwa file tersebut adalah kunci pribadi.
Dan arti dari file ini:
smtpd_tls_cert_file = / etc / ssl / domain1.com.2018.chained.crt
domain1.com - nama domain.
2018 adalah tahun pembuatan kunci.
dirantai - sebutan bahwa ada rantai kunci publik (yang pertama adalah kunci publik kami dan sisanya adalah apa yang berasal dari perusahaan yang mengeluarkan kunci publik).crt - penunjukan bahwa ada sertifikat siap (kunci publik dengan penjelasan teknis). smtp_bind_address = XX.XX.XX.X0 smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1
Pengaturan ini tidak digunakan dalam kasus ini, tetapi ditulis sebagai contoh.Karena kesalahan dalam parameter ini akan menyebabkan pengiriman spam dari server Anda (tanpa keinginan Anda).Kemudian buktikan kepada semua orang bahwa Anda tidak bisa disalahkan. recipient_delimiter = +
Mungkin banyak yang tidak tahu, jadi ini adalah simbol standar untuk penggembalaan, dan ini didukung oleh sebagian besar server surat modern.Misalnya, jika Anda memiliki kotak surat "username@gmail.com" coba kirimkan ke "username+spam@gmail.com" - lihat apa yang terjadi. inet_protocols = ipv4
Mungkin ini akan membingungkan.Tapi ini bukan adil. Setiap domain baru secara default hanya IPv4, maka saya mengaktifkan IPv6 untuk masing-masing secara individual. virtual_transport = lmtp:unix:private/dovecot-lmtp virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Di sini kita mengatur bahwa semua surat masuk masuk ke dovecot.Dan aturan untuk domain, kotak surat, alias - lihat di database./etc/postfix/mysql-virtual-mailbox-domains.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_domains WHERE name='%s'
/etc/postfix/mysql-virtual-mailbox-maps.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_users WHERE email='%s'
/etc/postfix/mysql-virtual-alias-maps.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT destination FROM virtual_aliases WHERE source='%s'
Sekarang postfix tahu bahwa Anda hanya dapat menerima email untuk pengiriman lebih lanjut dengan otorisasi dengan dovecot.Saya benar-benar tidak mengerti mengapa ini digandakan di sini. Kami telah mengindikasikan di virtual_transport semua yang diperlukan.Tetapi sistem postfix sudah sangat tua - mungkin itu adalah kastil dari masa lalu. smtpd_recipient_restrictions = ... smtpd_helo_restrictions = ... smtpd_client_restrictions = ...
Ini dikonfigurasikan untuk setiap server email dengan caranya sendiri.Saya memiliki 3 server surat yang dapat saya gunakan dan pengaturan ini sangat berbeda karena persyaratan penggunaan yang berbeda.Anda harus mengonfigurasi dengan hati-hati - jika tidak, spam akan membanjiri Anda atau lebih buruk, spam akan membanjiri Anda.
Mengkonfigurasi beberapa jenis plugin yang terkait dengan pemeriksaan SPF terhadap pesan yang masuk.
Mengkonfigurasi bahwa semua surat keluar kita harus memberikan tanda tangan DKIM.
Ini adalah detail utama dalam perutean email saat mengirim email dari skrip php.File "/etc/postfix/sdd_transport.pcre": /^www-domain1@domain1\.com$/ domain1: /^www-domain2@domain1\.com$/ domain2: /^www-domain3@domain1\.com$/ domain3: /@domain1\.com$/ domain1: /@domain2\.com$/ domain2: /@domain3\.com$/ domain3:
— . — , .
Postfix — .
postfix — «master.cf».
4, 5, 6 — . — .
php «from». .
— nginx+fpm.
— linux-user . fpm-pool.
Fpm-pool menggunakan versi php apa saja (ini hebat ketika Anda bisa menggunakan versi php dan bahkan php.ini yang berbeda di server yang sama untuk situs tetangga).
Jadi pengguna linux tertentu "www-domain2" memiliki situs domain2.com. Situs ini memiliki kode untuk mengirim surat tanpa menentukan bidang dari.
Jadi, bahkan dalam kasus ini, surat-surat itu akan hilang dengan benar dan tidak akan pernah masuk ke spam.
"/Etc/postfix/master.cf" saya terlihat seperti ini: ... smtp inet n - y - - smtpd -o content_filter=spamassassin ... submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject ... policyd-spf unix - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf spamassassin unix - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} ... domain1 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X1 -o smtp_helo_name=domain1.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1 -o syslog_name=postfix-domain1 domain2 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X5 -o smtp_helo_name=domain2.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1 -o syslog_name=postfix-domain2 domain3 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X2 -o smtp_helo_name=domain3 -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1 -o syslog_name=postfix-domain3
File tidak sepenuhnya diberikan - sudah sangat besar.Tercatat hanya apa yang telah diubah. smtp inet n - y - - smtpd -o content_filter=spamassassin ... spamassassin unix - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Ini adalah pengaturan yang terkait dengan spamassasin, tentangnya nanti. submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
Kami memungkinkan Anda untuk terhubung ke server email melalui port 587.Untuk melakukan ini, pastikan untuk masuk. policyd-spf unix - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf
Aktifkan verifikasi SPF. apt-get install postfix-policyd-spf-python
Instal paket untuk pemeriksaan SPF di atas. domain1 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X1 -o smtp_helo_name=domain1.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1 -o syslog_name=postfix-domain1
. IPv4/IPv6 .
rDNS. rDNS — - IP .
, helo rDNS , email.
helo , — .
Helo rDNS — .
IP .
OVH — rDNS.
tech.ru — .
AWS — .
"Inet_protocols" dan "smtp_bind_address6" - ini adalah bagaimana kami mengaktifkan dukungan IPv6.
Untuk IPv6, Anda juga perlu mendaftarkan rDNS.
"Syslog_name" - dan ini untuk kenyamanan membaca log.
Saya merekomendasikan membeli sertifikat di sini .Menyiapkan banyak postfix + dovecot di sini .Pengaturan SPF.============== Dovecot ==============
apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispam
Konfigurasikan mysql, instal paketnya sendiri.File "/etc/dovecot/conf.d/10-auth.conf" disable_plaintext_auth = yes auth_mechanisms = plain login
Otorisasi hanya dienkripsi.File "/etc/dovecot/conf.d/10-mail.conf" mail_location = maildir:/var/mail/vhosts/%d/%n
Di sini kami menunjukkan lokasi surat-surat itu.Saya ingin mereka disimpan dalam file dan dikelompokkan berdasarkan domain.File "/etc/dovecot/conf.d/10-master.conf" service imap-login { inet_listener imap { port = 0 } inet_listener imaps { address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1] port = 993 ssl = yes } } service pop3-login { inet_listener pop3 { port = 0 } inet_listener pop3s { address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1] port = 995 ssl = yes } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service imap { } service pop3 { } service auth { unix_listener auth-userdb { mode = 0600 user = vmail } unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } user = dovecot } service auth-worker { user = vmail } service dict { unix_listener dict { } }
Ini adalah file pengaturan dovecot utama.Di sini kami memutuskan koneksi yang tidak aman.Dan mengaktifkan koneksi yang aman.File "/etc/dovecot/conf.d/10-ssl.conf" ssl = required ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt ssl_key = </etc/nginx/ssl/domain1.com.2018.key local XX.XX.XX.X5 { ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt ssl_key = </etc/nginx/ssl/domain2.com.2018.key }
Konfigurasikan ssl. Kami menunjukkan bahwa ssl diperlukan.
Dan sertifikat itu sendiri. Dan detail penting adalah arahan "lokal". Menunjukkan saat menyambung ke IPv4 lokal mana - ssl sertifikat yang akan digunakan.
Omong-omong, IPv6 tidak dikonfigurasi di sini, saya akan memperbaiki kelalaian ini sebagai utas nanti.
XX.XX.XX.X5 (domain2) - tidak ada sertifikat. Untuk menghubungkan klien, Anda harus menentukan domain1.com.
XX.XX.XX.X2 (domain3) - ada sertifikat, Anda dapat menentukan domain1.com atau domain3.com untuk menghubungkan klien.
File "/etc/dovecot/conf.d/15-lda.conf" protocol lda { mail_plugins = $mail_plugins sieve }
Ini akan dibutuhkan di masa depan untuk spamassassin.File "/etc/dovecot/conf.d/20-imap.conf" protocol imap { mail_plugins = $mail_plugins antispam }
Ini adalah plugin antispam. Diperlukan untuk melatih spamassasin pada saat transfer ke / dari folder Spam.File "/etc/dovecot/conf.d/20-pop3.conf" protocol pop3 { }
Hanya file seperti itu.File "/etc/dovecot/conf.d/20-lmtp.conf" protocol lmtp { mail_plugins = $mail_plugins sieve postmaster_address = admin@domain1.com }
Konfigurasikan lmtp.File "/etc/dovecot/conf.d/90-antispam.conf" plugin { antispam_backend = pipe antispam_trash = Trash;trash antispam_spam = Junk;Spam;SPAM antispam_pipe_program_spam_arg = --spam antispam_pipe_program_notspam_arg = --ham antispam_pipe_program = /usr/bin/sa-learn antispam_pipe_program_args = --username=%Lu }
Pengaturan pelatihan Spamassasin pada saat transfer ke / dari folder Spam.File "/etc/dovecot/conf.d/90-sieve.conf" plugin { sieve = ~/.dovecot.sieve sieve_dir = ~/sieve sieve_after = /var/lib/dovecot/sieve/default.sieve }
File yang menunjukkan apa yang harus dilakukan dengan email yang masuk.File "/var/lib/dovecot/sieve/default.sieve" require ["fileinto", "mailbox"]; if header :contains "X-Spam-Flag" "YES" { fileinto :create "Spam"; }
Diperlukan untuk mengkompilasi file: "sievec default.sieve".File "/etc/dovecot/conf.d/auth-sql.conf.ext" passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
Menentukan file sql untuk otorisasi.Dan file itu sendiri adalah cara otorisasi.File "/etc/dovecot/dovecot-sql.conf.ext" driver = mysql connect = host=127.0.0.1 dbname=servermail user=usermail password=password default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
Ini sesuai dengan pengaturan yang sama untuk postfix.File "/etc/dovecot/dovecot.conf" protocols = imap lmtp pop3 listen = *, :: dict { } !include conf.d/*.conf !include_try local.conf
File konfigurasi utama.Yang penting kita tentukan di sini, tambahkan protokol.============== SpamAssassin ==============
apt-get install spamassassin spamc
Instal paket. adduser spamd --disabled-login
Tambahkan pengguna atas nama siapa. systemctl enable spamassassin.service
Aktifkan layanan unduh spamassassin saat boot.File "/ etc / default / spamassassin": CRON=1
Aktifkan pembaruan aturan secara otomatis secara default.File "/etc/spamassassin/local.cf": report_safe 0 use_bayes 1 bayes_auto_learn 1 bayes_auto_expire 1 bayes_store_module Mail::SpamAssassin::BayesStore::MySQL bayes_sql_dsn DBI:mysql:sa:localhost:3306 bayes_sql_username sa bayes_sql_password password
Penting untuk membuat database "sa" di mysql dengan pengguna "sa" dengan kata sandi "kata sandi" (ganti dengan sesuatu yang memadai).report_safe - alih-alih surat, laporan tentang pesan spam akan dikirim.use_bayes adalah pengaturan pembelajaran mesin spamassassin.Pengaturan spamassassin yang tersisa diterapkan sebelumnya dalam artikel.Pengaturan umum adalah spamassassin .Tentang memindahkan email Spam baru ke folder Spam IMAP .Tentang sekelompok sederhana Dovecot + SpamAssassin .Saya sarankan membaca teori belajar spamassasin ketika memindahkan surat di folder imap (dan tidak merekomendasikannya untuk digunakan) .============== Menghubungi komunitas ==============
Saya juga ingin memberikan ide kepada masyarakat tentang cara meningkatkan tingkat keamanan surat yang diteruskan. Karena saya sangat tenggelam dalam topik surat.Sehingga pengguna dapat membuat pasangan kunci pada kliennya (pandangan, thunderbird, browser-plugin, ...). Publik dan pribadi. Umum - kirim ke DNS. Pribadi - simpan ke klien. Server email akan dapat menggunakan kunci publik untuk mengirim ke penerima tertentu.Dan untuk melindungi terhadap spam dengan email semacam itu (ya, server surat tidak akan dapat melihat kontennya) - Anda perlu memperkenalkan 3 aturan:- Wajib tanda tangan DKIM, SPF wajib, rDNS wajib.
- Jaringan saraf pada topik pelatihan antispam + DB untuk itu di sisi klien.
- Algoritme enkripsi harus sedemikian rupa sehingga pihak pengirim harus menghabiskan daya CPU 100 kali lebih banyak pada enkripsi daripada sisi penerima.
Selain surat publik - untuk mengembangkan surat undangan standar "untuk memulai korespondensi yang aman." Salah satu pengguna (kotak surat) mengirim surat ke kotak surat lain dengan lampiran. Dalam surat itu, proposal teks untuk memulai saluran komunikasi yang aman untuk korespondensi dan kunci publik dari pemilik kotak surat (dengan kunci pribadi di sisi klien).Anda bahkan dapat membuat sepasang tombol khusus untuk setiap korespondensi. Pengguna penerima dapat menerima tawaran ini dan mengirim kunci publiknya (juga dibuat khusus untuk korespondensi ini). Selanjutnya, pengguna pertama mengirim surat kontrol layanan (dienkripsi dengan kunci publik dari pengguna kedua) - setelah menerima yang pengguna kedua dapat menganggap saluran komunikasi yang dibentuk dapat diandalkan. Kemudian pengguna kedua mengirim surat kontrol - dan kemudian pengguna pertama juga dapat menganggap saluran yang dibentuk sebagai terproteksi.Untuk memerangi intersepsi kunci di jalan - perlu protokol untuk menyediakan kemungkinan mentransmisikan setidaknya satu kunci publik menggunakan flash drive.Dan yang paling penting, semuanya bekerja (pertanyaannya adalah "siapa yang akan membayarnya?"):Memperkenalkan sertifikat surat senilai mulai $ 10 selama 3 tahun. Yang akan memungkinkan pengirim untuk menunjukkan dalam dns bahwa "kunci publik saya ada di luar sana." Dan mereka akan memberikan kesempatan untuk memulai koneksi yang aman. Pada saat yang sama, ambil senyawa tersebut secara gratis.gmail akhirnya memonetisasi penggunanya. Untuk $ 10 dalam 3 tahun - hak untuk membuat saluran korespondensi yang aman.============== Kesimpulan ==============
Untuk menguji seluruh artikel, saya akan menyewa server khusus selama sebulan dan membeli domain dengan sertifikat ssl.Tapi keadaan kehidupan berkembang sehingga masalah ini berlangsung selama 2 bulan.Dan ketika waktu luang muncul lagi - saya memutuskan untuk menerbitkan artikel apa adanya, dan tidak mengambil risiko publikasi akan tertunda selama satu tahun lagi.Jika ada banyak pertanyaan seperti "tetapi ini tidak dijelaskan dalam detail yang cukup" - maka mungkin akan ada kekuatan untuk mengambil server khusus dengan domain baru dan sertifikat SSL baru dan menjelaskan lebih terinci dan yang paling penting - mengidentifikasi semua detail penting yang hilang.Saya juga ingin menerima umpan balik tentang topik gagasan tentang sertifikat surat. Jika Anda menyukai ide itu, saya akan mencoba menemukan kekuatan untuk menulis konsep untuk rfc.— .
— .
.