IMAPsync czyli zbawienie dla migracji serwerów pocztowych oraz kilka słów dlaczego nie warto korzystać z poczty Onetu i WP.pl

Czasami zdarza się taki moment, że nas serwer jest za stary, by go migrować i trzeba jakoś przenieść serwer, czasami admini chcą zmienić serwer pocztowy na jakieś inne rozwiązanie typu przenieść się na serwer Exchange z Postfix/Dovecot, lub po prostu zmienić dostawcę pocztowego, bo ileż można dostawać spam od Onetu czy WP? Poza takimi błahostkami jak przeniesienie prywatnej skrzynki pocztowej te narzędzie pozwala na masowe przenoszenie skrzynek. Jedyny minus rozwiązania jest taki, że trzeba zresetować wszystkim hasła na czas migracji.

Postaram się pokazać kilka scenariuszy przenoszenia skrzynek, przy czym w dużej mierze początkowa instalacja zawsze jest taka sama – jedyna różnica jest w ustawieniach programu. IMAPsync jest aplikacją, która zadziała na Windowsie i Linuksie, ale szczerze powiedziawszy miałem problem z jej działaniem spod Windowsa, więc używam Linuksa do operacji na nim. W przypadku posiadania Windowsa używam Linux Subsystem for Windows (WSL), bo dzięki temu na tym samym hoście można korzystać na wybranej dystrybucji Linuksa bez jakichkolwiek problemów.

Pierwszą rzeczą, którą należy zrobić jest włączenie funkcji w Windows 10/Windows Server 2016/Windows Server 2019:

Następnie, w przypadku Windows 10 znajdujemy w Microsoft Store aplikację o nazwie Ubuntu 18.04 (miałem problemy z działaniem IMAPsync na 20.04, prawdopodobnie ze względu na inną wersję OpenSSL) i ją instalujemy:

W Windowsie Server jest o tyle inaczej, że nie ma tam Microsoft Store. Taką paczkę należy pobrać z Internetu i zmienić jej format na .zip, bo w rzeczywistości to jest archiwum. Całość jest opisana w tym dokumencie. Na wypadek, gdyby zniknął, ściągamy z tego linku plik.

Zanim odpalimy aplikację, musimy uruchomić system ponownie. Jeśli tego nie zrobimy, najpewniej zobaczymy ten błąd:

W przypadku Windows Server należy odpalić aplikację ubuntu1804.exe, która jest wewnątrz rozpakowanego archiwum.

Po restarcie należy zdefiniować konto użytkownika i hasło:

Po tym należy wykonać polecenia, aby zainstalować IMAPsynca:

sudo apt update
sudo apt install libauthen-ntlm-perl libclass-load-perl libcrypt-ssleay-perl libdata-uniqid-perl libdigest-hmac-perl libdist-checkconflicts-perl \
libencode-imaputf7-perl libfile-copy-recursive-perl libfile-tail-perl libio-compress-perl libio-socket-inet6-perl libio-socket-ssl-perl libio-tee-perl \
libmail-imapclient-perl libmodule-scandeps-perl libnet-dbus-perl libnet-ssleay-perl libpar-packer-perl libreadonly-perl libregexp-common-perl \
libsys-meminfo-perl libterm-readkey-perl libtest-fatal-perl libtest-mock-guard-perl libtest-mockobject-perl libtest-pod-perl libtest-requires-perl \
libtest-simple-perl libunicode-string-perl liburi-perl libtest-nowarnings-perl libtest-deep-perl libtest-warn-perl make cpanminus apt-file libcrypt-openssl-rsa-perl libjson-webtoken-perl libcrypt-openssl-bignum-perl libcgi-pm-perl
sudo cpanm CGI
git clone https://github.com/imapsync/imapsync
cd imapsync/INSTALL.d
sudo ./prerequisites_imapsync

Jeśli wynik jest następujący – powinniśmy dostać mniej więcej następujący wynik:

supra@supra-pc:~/imapsync/INSTALL.d$ sudo ./prerequisites_imapsync
$SHELL says  /bin/bash
$0 gives  ./prerequisites_imapsync
ps -ef gives root     15542 15541  0 10:42 tty1     00:00:00 /bin/sh ./prerequisites_imapsync
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic
Linux supra-pc 4.4.0-19041-Microsoft #1-Microsoft Fri Dec 06 14:06:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
Ok: Found Perl 5.26.1
make: Nothing to be done for 'foo'.
Ok: Found make GNU Make 4.1
Ok: Found Perl module App::cpanminus
Ok: Found Perl module Authen::NTLM
Ok: Found Perl module CGI
Ok: Found Perl module Compress::Zlib
Ok: Found Perl module Crypt::OpenSSL::RSA
Ok: Found Perl module Data::Dumper
Ok: Found Perl module Data::Uniqid
Ok: Found Perl module Digest::HMAC
Ok: Found Perl module Digest::HMAC_MD5
Ok: Found Perl module Digest::MD5
Ok: Found Perl module Dist::CheckConflicts
Ok: Found Perl module Encode
Ok: Found Perl module Encode::Byte
Ok: Found Perl module Encode::IMAPUTF7
Ok: Found Perl module File::Copy::Recursive
Ok: Found Perl module File::Tail
Ok: Found Perl module IO::Socket::INET
Ok: Found Perl module IO::Socket::INET6
Ok: Found Perl module IO::Socket::SSL
Ok: Found Perl module IO::Tee
Ok: Found Perl module JSON
Ok: Found Perl module JSON::WebToken
Ok: Found Perl module JSON::WebToken::Crypt::RSA
Ok: Found Perl module HTML::Entities
Ok: Found Perl module LWP::UserAgent
Ok: Found Perl module Mail::IMAPClient
Ok: Found Perl module MIME::Base64
Ok: Found Perl module Module::Implementation
Ok: Found Perl module Module::Runtime
Ok: Found Perl module Module::ScanDeps
Ok: Found Perl module Net::SSLeay
Ok: Found Perl module Package::Stash
Ok: Found Perl module Package::Stash::XS
Ok: Found Perl module PAR::Packer
Ok: Found Perl module Parse::RecDescent
Ok: Found Perl module Pod::Usage
Ok: Found Perl module Readonly
Ok: Found Perl module Regexp::Common
Ok: Found Perl module Sys::MemInfo
Ok: Found Perl module Term::ReadKey
Ok: Found Perl module Test::Fatal
Ok: Found Perl module Test::Mock::Guard
Ok: Found Perl module Test::MockObject
Ok: Found Perl module Test::More
Ok: Found Perl module Test::Pod
Ok: Found Perl module Test::Requires
Ok: Found Perl module Test::Deep
Ok: Found Perl module Text::ParseWords
Ok: Found Perl module Try::Tiny
Ok: Found Perl module Unicode::String
Ok: Found Perl module URI::Escape
All needed modules are already installed
Ok: Found cpanm cpanm (App::cpanminus) version 1.7043 (/usr/bin/cpanm)

Mając to można wrócić do głównego katalogu sklonowanego repozytorium Gita i zanim odpalimy IMAPsync warto sprawdzić dane do serwera pocztowego. Aby wykonać synchronizację, należy podać dane skrzynki, z której synchronizujemy wiadomości:

  • adres serwera pocztowego (opcja --host1),
  • port serwera pocztowego (opcja --port1, często opcjonalne, bo IMAPsync w przypadku prawidłowo zdefiniowanych wpisów w DNS sam wykryje odpowiedni port),
  • nazwa konta użytkownika (opcja --user1),
  • hasło konta użytkownika (opcja --password1),
  • wymuszenie wykorzystywania SSL (opcja --ssl1).

To samo podajemy dla docelowego serwera i użytkownika, lecz wykorzystujemy parametry z numerkiem 2 na końcu (np. --host2).

Wcześniej warto sprawdzić na jakim porcie serwer pocztowy nasłuchuje. Poniżej wykonuję test dla serwera OVH, to znaczy ssl0.ovh.net:

supra@supra-pc:/mnt/r/supra/Pobrane/imapsync-imapsync-1.945$ openssl s_client -connect ssl0.ovh.net:993 --showcerts -servername ssl0.ovh.net
CONNECTED(00000003)
depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA
verify return:1
depth=0 CN = ssl0.ovh.net
verify return:1
---
Certificate chain
 0 s:CN = ssl0.ovh.net
   i:C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA
-----BEGIN CERTIFICATE-----
MIIGujCCBaKgAwIBAgIRAKNd5nTWqiwzvsziDTAPdk4wDQYJKoZIhvcNAQELBQAw
gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE
AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
QTAeFw0yMDA0MjgwMDAwMDBaFw0yMTA0MjgyMzU5NTlaMBcxFTATBgNVBAMTDHNz
bDAub3ZoLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOmVmvbx
5Wl7HnDdKosd1scDKTX+7osHcSFOMM2zPlU9NDO26SuilV0avXQjzHPKlK99GY3t
47CFaLTlvWeNXJDnYcN+KoPznM3OFdiPfLufeOYpKrLO+RJi1WDfvrLaQgctKJSw
+SipYB0HblWQaH6eJQjVp67LJA6NGqGOLxrHJEAL1a5DnzRKd8WFaXusf+5iwtEu
uSsLAflCx8kel8F0nWKI+knj1nYalb98vrUdsrcGLUkeF990ZwETrx6RI4/GWwpq
kuSn3tmxtyWXhTQgkiNh6hDz3+AVQTp1v42rxynRNgzANRc1XX37qYV8fbVEbnfj
/BGTLrMylf130QKvCXhh2xkp99KGJpHSesodkzFthl19LuTm3mp2CDdF227+QTsZ
YY0ZDPOxrpvGNPskXgfQupGMCqaxB215SbbORKNhht8fT4wcR25Z+bfpvvwlGHCh
PccIOXqaHLjHc8/dv2G8t66XPFkpmf+LGzpvR4P0RT6i6G3NUYHBr+4Adxv46nuh
BDJVwWDfcemdbxZ9di5JDfb7cRENJox0vB4roQKR23rbIrgpyCwu9MjfviWanlOr
vUuu9zgNli9YZPEXmXjpL7936tesT7uUuCEhRCCecejYG8TUeojpXUOVMCcnm9tc
ixHBA11A13lochGzdPumTlYl3pOTZm8vc/khAgMBAAGjggKGMIICgjAfBgNVHSME
GDAWgBSNjF7EVK2K4Xfpm/mbBeG4AY1h4TAdBgNVHQ4EFgQU3ms/wnSQLdy8OIWc
6MFBUpw0Z2cwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMEkGA1UdIARCMEAwNAYLKwYBBAGyMQECAgcw
JTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQIB
MIGEBggrBgEFBQcBAQR4MHYwTwYIKwYBBQUHMAKGQ2h0dHA6Ly9jcnQuc2VjdGln
by5jb20vU2VjdGlnb1JTQURvbWFpblZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5j
cnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMCkGA1UdEQQi
MCCCDHNzbDAub3ZoLm5ldIIQd3d3LnNzbDAub3ZoLm5ldDCCAQQGCisGAQQB1nkC
BAIEgfUEgfIA8AB2AH0+8viP/4hVaCTCwMqeUol5K8UOeAl/LmqXaJl+IvDXAAAB
ccEJ9CIAAAQDAEcwRQIhAO/y/kRhgbJNJjoaAvoch5wfTSwPaK2JIvrVaP1SFQmW
AiBeCdRgQqBVxGmNCFrIAP/jN4afQVhOeZJrIcHJmANV7wB2AJQgvB6O1Y1siHMf
gosiLA3R2k1ebE+UPWHbTi9YTaLCAAABccEJ9EgAAAQDAEcwRQIhAOtOEaYg+esw
zZZSL9mm8XKq2v6kRCGA7/ZNPZWE1lc6AiAdj0lzPvyJD0oc3mOHDR4mdlfnLrY9
4x5uc5xknWh9PDANBgkqhkiG9w0BAQsFAAOCAQEATmrjXr1OguegMTm5H1yHcd/2
lGyPL/Hl7uBL069XOgZ3k2t7F25CWBkGsB6dzI7Qpwr9ODlPR1U8c/Y59X5rOjaR
AZraW2jAd96n2Yc6155WvwENQbgCwS0iMn5u1V3z+M1TG4FI7B30dEOFvMsljGIF
j7gn8LH+BxZMB/+ch6qY0huXy3K5A53OX4Ten85UVKuZBiG3yxvzfFX5mlY7PnDf
zcFGxc3SvcnTZS0HYHE+qv7SzpkuvBc4p/TIKu6zuCtNjwZJpSoJ6p/272dFMzav
ToVNMOK0AVYARP8W0mYeWfzIor+sjIwRshNrUbi112PKxhcozm9KW8tbagmw8w==
-----END CERTIFICATE-----
 1 s:C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA
   i:C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----
 2 s:C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
   i:C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
jjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----
---
Server certificate
subject=CN = ssl0.ovh.net

issuer=C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA

---
No client certificate CA names sent
Peer signing digest: SHA512
Peer signature type: RSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 5698 bytes and written 397 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 94C2704B41535450C2E914E258FCF4261AE3830EBAF68050A459650A70DD6AE6
    Session-ID-ctx:
    Master-Key: 78941A4567E592C77B7767DBBC5046B91A108F7B2C7A1ED057C274F8C896337894BD28715CCF43EB981A9832DB147E15
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 7d 83 2f ee 41 40 4d f7-7b 99 ea d7 5f 6e 3b 68   }./.A@M.{..._n;h
    0010 - 05 37 73 e7 89 63 2e 0a-ad 25 23 3f 28 d7 3e ed   .7s..c...%#?(.>.
    0020 - e4 e6 d4 33 52 10 24 49-84 93 7f 33 72 ed 50 20   ...3R.$I...3r.P
    0030 - 9b 55 40 21 01 86 99 37-21 78 bc 04 cb 4c 3a c7   .U@!...7!x...L:.
    0040 - ee 7a 29 45 d3 d0 88 a2-5c 4a d4 bc 56 54 71 0a   .z)E....\J..VTq.
    0050 - c4 e6 85 a1 4e 66 2d 46-7e e9 f2 03 63 97 e9 33   ....Nf-F~...c..3
    0060 - 1b a7 2c f2 9d da 93 03-bc d7 6b d2 c8 84 13 15   ..,.......k.....
    0070 - 46 05 d0 54 ce e5 e8 2a-41 7f 9b 15 a1 00 8a da   F..T...*A.......
    0080 - ff 8a ce 11 91 83 59 4a-47 be d5 18 da 47 4d a7   ......YJG....GM.
    0090 - d4 73 7a 5c 39 a1 21 ac-2b 5e 62 f4 47 ba fc e4   .sz\9.!.+^b.G...
    00a0 - e1 06 7d 80 81 53 9e 00-88 c7 13 d2 bc 07 a0 88   ..}..S..........

    Start Time: 1592435499
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: yes
---
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot on host 103 ready

* BAD Error in IMAP command received by server.

* BAD Error in IMAP command received by server.

* BYE Too many invalid IMAP commands.
closed

Na końcu komunikacji możemy zobaczyć jakie funkcjonalności ma ten serwer IMAP i możemy po tym nagłówku poznać jakie metody uwierzytelnienia są dostępne dla tego serwera. Poniżej kilka działajacych przykładów wykorzystania IMAPsync dla pojedynczej skrzynki:

Z serwera OVH na własny serwer

./imapsync --host1 ssl0.ovh.net --port1 993 --user1 [email protected] --password1 haslo123 --host2 mail.etf2l.site --user2 [email protected] --password2 haslo123 --ssl1 -ssl2

Z serwera GMail na własny serwer

./imapsync --host1 imap.gmail.com --port1 993 --user1 [email protected] --password1 haslo123 --host2 mail.etf2l.site --user2 [email protected] --password2 haslo123 --ssl1 -ssl2

Przy przykładzie z GMailem warto zerknąć na informacje dotyczące odblokowywania możliwości synchronizacji poniżej.

Z serwera Politechniki Śląskiej na własny serwer

./imapsync --host1 poczta.student.polsl.pl --port1 993 --user1 [email protected] --password1 haslo123 --host2 mail.etf2l.site --user2 [email protected] --password2 haslo --ssl1 -ssl2

Z serwera Onet.pl na serwer GMail

Przed synchronizacją należy włączyć obsługę IMAP dla konta oraz „dostęp do mniej bezpiecznych aplikacji”:

Taki problem da się też rozpoznać po logu:

Host2 capability before authentication: IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH AUTH
Host2 failure: Error login on [imap.gmail.com] with user [[email protected]] auth [LOGIN]: 2 NO [ALERT] Your account is not enabled for IMAP use. Please visit your Gmail settings page and enable your account for IMAP access. (Failure)
Exiting with return value 16 (EXIT_AUTHENTICATION_FAILURE)
Disconnecting from host1 imap.poczta.onet.pl user1 [email protected]
Log file is LOG_imapsync/[email protected][email protected] ( to change it, use --logfile filepath ; or use --nolog to turn off logging )

Końcowe polecenie jest takie:

./imapsync --host1 imap.poczta.onet.pl --user1 [email protected] --password1 "password123" --host2 imap.gmail.com --port2 993 --user2 [email protected] --password2 "password123" --ssl1 -ssl2

Przy okazji odpowiedź na pytanie czemu ja zawsze dostaję tak dużo spamu na moją skrzynkę? – otóż dlatego:

W trakcie rejestracji konta aby mieć skrzynkę za darmo, należy zaznaczyć odpowiednią zgodę, lecz ludzie z reguły nie czytają tego i klikają opcję na samej górze. To powoduje, że Onet.pl i ich partnerzy będą za Waszym przyzwoleniem wysyłać do Was spam. Po kliknięciu Załóż konto jednak przekonuje się, że się myliłem:

Ponadto ich oferta cenowa ze skrzynkami dla prywatnych użytkowników to żart w 2020 roku (np. GMail daje to za darmo (nie do końca, bo mogą zbierać dane o użytkownikach, ale funkcjonalnie i bez spamu za darmo)). Inna rzecz, która mnie zaskoczyła to to, że mogłem zarejestrować konto z jednym z najprostszych haseł słownikowych: Zaq12wsx!.

Z serwera WP.pl na serwer GMail

W WP.pl jest ta sama śpiewka, co w Onet.pl z mailami marketingowymi i tym, że da się założyć konto z hasłem Zaq12wsx!, ale przynajmniej Ci zaznaczyli, że te hasło jest kiepskie:

Tutaj podobnie jak w GMail synchronizacja po IMAP jest domyślnie wyłączona, trzeba ją włączyć:

Host2 failure: Error login on [imap.wp.pl] with user [[email protected]] auth [LOGIN]: 2 NO Wybrany kanal dostepu nalezy aktywowac w intefejsie WWW
Exiting with return value 16 (EXIT_AUTHENTICATION_FAILURE)
./imapsync --host1 imap.wp.pl --user1 [email protected] --password1 "password123" --host2 imap.gmail.com --port2 993 --user2 [email protected] --password2 "password123" --ssl1 -ssl2

Z serwera Gazeta.pl na serwer GMail

Tutaj spamik ponownie, ale tym razem da się wyłączyć:

Jednak nie zaznaczyło „powyższej” opcji:

Co ciekawe, wg Gazeta.pl Zaq12wsx! to mocne hasło:

Tutaj jedynie SMTP jest wyłączony (uwaga, gdyby ktoś z tej skrzynki chciał korzystać w Outlooku czy innym kliencie pocztowym). IMAP jest włączony, więc od razu można puścić synchronizację:

./imapsync --host1 imap.gazeta.pl --user1 [email protected] --password1 "password123" --host2 imap.gmail.com --port2 993 --user2 [email protected] --password2 "password123" --ssl1 -ssl2

Z serwera o2.pl na serwer GMail

Interfejs jest identyczny jak ten z WP.pl, te same zgody, te same hasło:

Tak samo jak na WP.pl odpalamy IMAPa:

./imapsync --host1 poczta.o2.pl --user1 [email protected] --password1 "password123" --host2 imap.gmail.com --port2 993 --user2 [email protected] --password2 "password123" --ssl1 -ssl2

Z własnego serwera na Exchange Online

./imapsync --host1 ssl0.ovh.net --port1 993 --user1 [email protected] --password1 "password123" --host2 outlook.office365.com --user2 [email protected] --password2 "password123" --ssl1 -ssl2

Przykład wyniku synchronizacji małej skrzynki:

supra@supra-pc:/mnt/r/supra/Pobrane/imapsync-imapsync-1.945$ ./imapsync --host1 ssl0.ovh.net --port1 993 --user1 [email protected] --password1 "password123" --host2 imap.poczta.onet.pl --user2 [email protected] --password2 "password123"
--ssl1 -ssl2
Here is imapsync 1.945 on host supra-pc, a linux system with 16.5/63.9 free GiB of RAM
with Perl 5.26.1 and Mail::IMAPClient 3.42
Transfer started at Thu Jul 23 08:12:33 2020
PID is 38 my PPID is 8
Log file is LOG_imapsync/[email protected][email protected] ( to change it, use --logfile path ; or use --nolog to turn off logging )
Load is 0.52 0.58 0.59 1/5 on 16 cores
Current directory is /mnt/r/supra/Pobrane/imapsync-imapsync-1.945
Real user id is supra (uid 1000)
Effective user id is supra (euid 1000)
$RCSfile: imapsync,v $ $Revision: 1.945 $ $Date: 2019/06/26 19:30:56 $
Command line used, run by /usr/bin/perl:
./imapsync --host1 ssl0.ovh.net --port1 993 --user1 [email protected] --password1 MASKED --host2 imap.poczta.onet.pl --user2 [email protected] --password2 MASKED --ssl1 -ssl2
Temp directory is /tmp ( to change it use --tmpdir dirpath )
kill -QUIT 38 # special behavior: call to sub catch_exit
kill -TERM 38 # special behavior: call to sub catch_exit
kill -INT 38 # special behavior: call to sub catch_reconnect
kill -HUP 38 # special behavior: call to sub catch_print
kill -USR1 38 # special behavior: call to sub toggle_sleep
File /tmp/imapsync.pid does not exist
PID file is /tmp/imapsync.pid ( to change it, use --pidfile filepath ; to avoid it use --pidfile "" )
Writing my PID 38 in /tmp/imapsync.pid
Writing also my logfile name in /tmp/imapsync.pid : LOG_imapsync/[email protected][email protected]
Modules version list:
Authen::NTLM         1.09
CGI                  4.49
Compress::Zlib       2.074
Crypt::OpenSSL::RSA  0.28
Data::Uniqid         0.12
Digest::HMAC_MD5     1.01
Digest::HMAC_SHA1    1.03
Digest::MD5          2.55
File::Copy::Recursive 0.40
File::Spec           3.67
Getopt::Long         2.49
HTML::Entities       3.69
IO::Socket           1.38
IO::Socket::INET     1.35
IO::Socket::INET6    2.72
IO::Socket::IP       0.38
IO::Socket::SSL      2.060
IO::Tee              0.65
JSON                 4.02
JSON::WebToken       0.10
LWP                  6.31
Mail::IMAPClient     3.42
Net::Ping            2.55
Net::SSLeay          1.84
Term::ReadKey        2.37
Test::MockObject     1.20161202
Time::HiRes          1.9741
URI::Escape          3.31
Unicode::String      2.10
( use --no-modulesversion to turn off printing this Perl modules list )
Info: will resync flags for already transferred messages. Use --noresyncflags to not resync flags.
SSL debug mode level is --debugssl 1 (can be set from 0 meaning no debug to 4 meaning max debug)
Host1: SSL default mode is like --sslargs1 "SSL_verify_mode=0", meaning for host1 SSL_VERIFY_NONE, ie, do not check the certificate server.
Host1: Use --sslargs1 SSL_verify_mode=1 to have SSL_VERIFY_PEER, ie, check the certificate server of host1
Host2: SSL default mode is like --sslargs2 "SSL_verify_mode=0", meaning for host2 SSL_VERIFY_NONE, ie, do not check the certificate server.
Host2: Use --sslargs2 SSL_verify_mode=1 to have SSL_VERIFY_PEER, ie, check the certificate server of host2
Info: turned ON syncinternaldates, will set the internal dates (arrival dates) on host2 same as host1.
Host1: will try to use LOGIN authentication on host1
Host2: will try to use LOGIN authentication on host2
Host1: imap connection timeout is 120 seconds
Host2: imap connection timeout is 120 seconds
Host1: IMAP server [ssl0.ovh.net] port [993] user [[email protected]]
Host2: IMAP server [imap.poczta.onet.pl] port [993] user [[email protected]]
Host1: connecting and login on host1 [ssl0.ovh.net] port [993] with user [[email protected]]
Host1 IP address: 193.70.18.144
Host1 banner: * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot on host 103 ready
Host1 capability before authentication: IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN AUTH
Host1: ssl0.ovh.net says it has CAPABILITY for AUTHENTICATE LOGIN
Host1: success login on [ssl0.ovh.net] with user [[email protected]] auth [LOGIN]
Host2: connecting and login on host2 [imap.poczta.onet.pl] port [993] with user [[email protected]]
Host2 IP address: 213.180.147.154
Host2 banner: * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID SORT SORT=DISPLAY MULTIAPPEND UNSELECT CHILDREN UIDPLUS LIST-STATUS LIST-EXTENDED I18NLEVEL=1 SEARCHRES WITHIN AUTH=PLAIN AUTH=LOGIN AUTH=XOAUTH2] Onet server ready.
Host2 capability before authentication: IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID SORT SORT=DISPLAY MULTIAPPEND UNSELECT CHILDREN UIDPLUS LIST-STATUS LIST-EXTENDED I18NLEVEL=1 SEARCHRES WITHIN AUTH=PLAIN AUTH=LOGIN AUTH=XOAUTH2 I18NLEVEL AUTH
Host2: imap.poczta.onet.pl says it has CAPABILITY for AUTHENTICATE LOGIN
Host2: success login on [imap.poczta.onet.pl] with user [[email protected]] auth [LOGIN]
Host1: state Authenticated
Host2: state Authenticated
Host1 capability once authenticated: IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE QUOTA THREAD I18NLEVEL CONTEXT
Host2 capability once authenticated: IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID SORT SORT=DISPLAY MULTIAPPEND UNSELECT CHILDREN UIDPLUS LIST-STATUS LIST-EXTENDED I18NLEVEL=1 SEARCHRES WITHIN I18NLEVEL

Host1: found ID capability. Sending/receiving ID, presented in raw IMAP for now.
In order to avoid sending/receiving ID, use option --noid
Sending: 4 ID ("name" "imapsync" "version" "1.945" "os" "linux" "vendor" "Gilles LAMIRAL" "support-url" "https://imapsync.lamiral.info/" "date" "26-Jun-2019 19:30:56 +0000" "side" "host1")
Sent 181 bytes
Read:   * ID ("name" "Dovecot")
        4 OK ID completed (0.000 + 0.000 secs).


Host2: found ID capability. Sending/receiving ID, presented in raw IMAP for now.
In order to avoid sending/receiving ID, use option --noid
Sending: 4 ID ("name" "imapsync" "version" "1.945" "os" "linux" "vendor" "Gilles LAMIRAL" "support-url" "https://imapsync.lamiral.info/" "date" "26-Jun-2019 19:30:56 +0000" "side" "host2")
Sent 181 bytes
Read:   * ID ("name" "NIL")
        4 OK ID completed (0.001 + 0.000 secs).

Host1: found 13 folders.
Host2: found 8 folders.
Host1: guessing separator from folder listing: [.]
Host1: separator given by NAMESPACE: [.]
Host2: guessing separator from folder listing: [/]
Host2: No NAMESPACE capability, so using guessed separator [/]
You can set the separator character with the --sep2 option,
the complete listing of folders may help you to find it
[Powiadomienia]
[Oferty]
[Spo&AUI-eczno&AVs-ci]
[Drafts]
[Junk]
[Sent]
[Trash]
[INBOX]
Host1: guessing prefix from folder listing: [INBOX.]
Host1: prefix given by NAMESPACE: [INBOX.]
Host2: guessing prefix from folder listing: []
Host2: No NAMESPACE capability so using guessed prefix []
You can set the prefix namespace with the --prefix2 option,
the folowing listing of folders may help you to find it:
[Powiadomienia]
[Oferty]
[Spo&AUI-eczno&AVs-ci]
[Drafts]
[Junk]
[Sent]
[Trash]
[INBOX]
Host1: separator and prefix: [.][INBOX.]
Host2: separator and prefix: [/][]
Including all folders found by default. Use --subscribed or --folder or --folderrec or --include to select specific folders. Use --exclude to unselect specific folders.
Host1: Checking wanted folders exist. Use --nocheckfoldersexist to avoid this check (shared of public namespace targeted).
Host1: Checking wanted folders are selectable. Use --nocheckselectable to avoid this check.
Turned off automapping folders ( use --automap to turn on automapping )

++++ Listing folders
All foldernames are presented between brackets like [X] where X is the foldername.
When a foldername contains non-ASCII characters it is presented in the form
[X] = [Y] where
X is the imap foldername you have to use in command line options and
Y is the utf8 output just printed for convenience, to recognize it.

Host1: folders list (first the raw imap format then the [X] = [Y]):
* LIST (\HasChildren) "." INBOX
* LIST (\HasNoChildren) "." "INBOX.ESET Antispam"
* LIST (\HasNoChildren) "." INBOX.INBOX.Sent
* LIST (\HasNoChildren) "." INBOX.INBOX.Junk
* LIST (\HasNoChildren) "." INBOX.INBOX.Drafts
* LIST (\HasNoChildren) "." INBOX.INBOX.Trash
* LIST (\HasNoChildren) "." INBOX.Trash
* LIST (\HasNoChildren) "." INBOX.Wiadomo&AVs-ci-&AVs-mieci
* LIST (\HasNoChildren) "." "INBOX.Elementy wys&AUI-ane"
* LIST (\HasNoChildren) "." INBOX.Sent
* LIST (\HasNoChildren) "." "INBOX.Elementy usuni&ARk-te"
* LIST (\HasNoChildren) "." "INBOX.Wersje robocze"
* LIST (\HasNoChildren) "." "INBOX.Wykryte elementy"
22 OK List completed (0.000 + 0.000 secs).

[INBOX]
[INBOX.ESET Antispam]
[INBOX.Elementy usuni&ARk-te] = [INBOX.Elementy usunięte]
[INBOX.Elementy wys&AUI-ane] = [INBOX.Elementy wysłane]
[INBOX.INBOX.Drafts]
[INBOX.INBOX.Junk]
[INBOX.INBOX.Sent]
[INBOX.INBOX.Trash]
[INBOX.Sent]
[INBOX.Trash]
[INBOX.Wersje robocze]
[INBOX.Wiadomo&AVs-ci-&AVs-mieci] = [INBOX.Wiadomości-śmieci]
[INBOX.Wykryte elementy]

Host2: folders list (first the raw imap format then the [X] = [Y]):
* LIST (\NoInferiors) "/" Powiadomienia
* LIST (\NoInferiors) "/" Oferty
* LIST (\NoInferiors) "/" Spo&AUI-eczno&AVs-ci
* LIST (\NoInferiors) "/" Drafts
* LIST (\NoInferiors) "/" Junk
* LIST (\NoInferiors) "/" Sent
* LIST (\NoInferiors) "/" Trash
* LIST (\NoInferiors) "/" INBOX
9 OK List completed (0.001 + 0.000 secs).

[Drafts]
[INBOX]
[Junk]
[Oferty]
[Powiadomienia]
[Sent]
[Spo&AUI-eczno&AVs-ci] = [Społeczności]
[Trash]

Folders in host2 not in host1:
[Spo&AUI-eczno&AVs-ci] = [Społeczności]
[Powiadomienia]
[Oferty]
[Junk]
[Drafts]


Folders sizes before the synchronization.
You can remove foldersizes listings by using "--nofoldersizes" and "--nofoldersizesatend"
but then you will also lose the ETA (Estimation Time of Arrival) given after each message copy.
++++ Calculating sizes of 13 folders on Host1
Host1 folder    1/13 [INBOX]                             Size:     42026 Messages:     8 Biggest:      7928
Host1 folder    2/13 [INBOX.ESET Antispam]               Size:         0 Messages:     0 Biggest:         0
Host1 folder    3/13 [INBOX.Elementy usuni&ARk-te] = [INBOX.Elementy usunięte] Size:         0 Messages:     0 Biggest:         0
Host1 folder    4/13 [INBOX.Elementy wys&AUI-ane] = [INBOX.Elementy wysłane] Size:      3211 Messages:     1 Biggest:      3211
Host1 folder    5/13 [INBOX.INBOX.Drafts]                Size:         0 Messages:     0 Biggest:         0
Host1 folder    6/13 [INBOX.INBOX.Junk]                  Size:         0 Messages:     0 Biggest:         0
Host1 folder    7/13 [INBOX.INBOX.Sent]                  Size:       663 Messages:     1 Biggest:       663
Host1 folder    8/13 [INBOX.INBOX.Trash]                 Size:         0 Messages:     0 Biggest:         0
Host1 folder    9/13 [INBOX.Sent]                        Size:         0 Messages:     0 Biggest:         0
Host1 folder   10/13 [INBOX.Trash]                       Size:      5718 Messages:     1 Biggest:      5718
Host1 folder   11/13 [INBOX.Wersje robocze]              Size:         0 Messages:     0 Biggest:         0
Host1 folder   12/13 [INBOX.Wiadomo&AVs-ci-&AVs-mieci] = [INBOX.Wiadomości-śmieci] Size:         0 Messages:     0 Biggest:         0
Host1 folder   13/13 [INBOX.Wykryte elementy]            Size:         0 Messages:     0 Biggest:         0
Host1 Nb folders:               13 folders
Host1 Nb messages:              11 messages
Host1 Total size:            51618 bytes (50.408 KiB)
Host1 Biggest message:        7928 bytes (7.742 KiB)
Host1 Time spent:              3.7 seconds
++++ Calculating sizes of 13 folders on Host2
Host2 folder    1/13 [ESET Antispam]                     does not exist yet
Host2 folder    2/13 [Elementy usuni&ARk-te] = [Elementy usunięte] does not exist yet
Host2 folder    3/13 [Elementy wys&AUI-ane] = [Elementy wysłane] does not exist yet
Host2 folder    4/13 [INBOX]                             Size:    286065 Messages:     2 Biggest:    231514
Host2 folder    5/13 [INBOX/Drafts]                      does not exist yet
Host2 folder    6/13 [INBOX/Junk]                        does not exist yet
Host2 folder    7/13 [INBOX/Sent]                        does not exist yet
Host2 folder    8/13 [INBOX/Trash]                       does not exist yet
Host2 folder    9/13 [Sent]                              Size:         0 Messages:     0 Biggest:         0
Host2 folder   10/13 [Trash]                             Size:         0 Messages:     0 Biggest:         0
Host2 folder   11/13 [Wersje robocze]                    does not exist yet
Host2 folder   12/13 [Wiadomo&AVs-ci-&AVs-mieci] = [Wiadomości-śmieci] does not exist yet
Host2 folder   13/13 [Wykryte elementy]                  does not exist yet
Host2 Nb folders:               13 folders
Host2 Nb messages:               2 messages
Host2 Total size:           286065 bytes (279.360 KiB)
Host2 Biggest message:      231514 bytes (226.088 KiB)
Host2 Time spent:              0.1 seconds
++++ Looping on each one of 13 folders to sync
Folder    1/13 [INBOX]                             -> [INBOX]
Host1: folder [INBOX] has 8 messages in total (mentioned by SELECT)
Host2: folder [INBOX] has 2 messages in total (mentioned by SELECT)
Host2: folder [INBOX] permanentflags:
Host1: folder [INBOX] considering 8 messages
Host2: folder [INBOX] considering 2 messages
Host1: folder [INBOX] selected 8 messages, duplicates 0
Host2: INBOX/1 size 54569 ignored (no wanted headers so we ignore this message)
Host2: folder [INBOX] selected 2 messages, duplicates 0
msg INBOX/1 {6599}            copied to INBOX/3          1.00 msgs/s  6.444 KiB/s 6.444 KiB copied ETA: Thu Jul 23 08:12:48 2020  10 s  10/11 msgs left
msg INBOX/2 {4128}            copied to INBOX/4          2.00 msgs/s  10.476 KiB/s 10.476 KiB copied ETA: Thu Jul 23 08:12:42 2020  4 s  9/11 msgs left
msg INBOX/4 {4152}            copied to INBOX/5          3.00 msgs/s  14.530 KiB/s 14.530 KiB copied ETA: Thu Jul 23 08:12:41 2020  3 s  8/11 msgs left
msg INBOX/5 {4711}            copied to INBOX/6          3.87 msgs/s  18.503 KiB/s 19.131 KiB copied ETA: Thu Jul 23 08:12:40 2020  2 s  7/11 msgs left
msg INBOX/6 {5690}            copied to INBOX/7          4.22 msgs/s  20.858 KiB/s 24.688 KiB copied ETA: Thu Jul 23 08:12:40 2020  1 s  6/11 msgs left
msg INBOX/7 {3635}            copied to INBOX/8          4.42 msgs/s  20.812 KiB/s 28.237 KiB copied ETA: Thu Jul 23 08:12:40 2020  1 s  5/11 msgs left
msg INBOX/8 {7928}            copied to INBOX/9          4.65 msgs/s  23.916 KiB/s 35.979 KiB copied ETA: Thu Jul 23 08:12:39 2020  1 s  4/11 msgs left
msg INBOX/9 {5183}            copied to INBOX/10         4.81 msgs/s  24.685 KiB/s 41.041 KiB copied ETA: Thu Jul 23 08:12:39 2020  1 s  3/11 msgs left
Folder    2/13 [INBOX.ESET Antispam]               -> [ESET Antispam]
Host1: folder [INBOX.ESET Antispam] has 0 messages in total (mentioned by SELECT)
Creating folder [ESET Antispam] on host2
Created folder [ESET Antispam] on host2
Host2: folder [ESET Antispam] has 0 messages in total (mentioned by SELECT)
Host2: folder [ESET Antispam] permanentflags:
Host2: Subscribing to folder ESET Antispam
Host1: folder [INBOX.ESET Antispam] considering 0 messages
Host2: folder [ESET Antispam] considering 0 messages
Host1: folder [INBOX.ESET Antispam] selected 0 messages, duplicates 0
Host2: folder [ESET Antispam] selected 0 messages, duplicates 0
Folder    3/13 [INBOX.Elementy usuni&ARk-te] = [INBOX.Elementy usunięte] -> [Elementy usuni&ARk-te] = [Elementy usunięte]
Host1: folder [INBOX.Elementy usuni&ARk-te] has 0 messages in total (mentioned by SELECT)
Creating folder [Elementy usuni&ARk-te] on host2
Folder [Elementy usuni&ARk-te] already exists (--nomixfolders is not set)
Host2: folder [Elementy usuni&ARk-te] has 0 messages in total (mentioned by SELECT)
Host2: folder [Elementy usuni&ARk-te] permanentflags:
Host2: Subscribing to folder Elementy usuni&ARk-te
Host1: folder [INBOX.Elementy usuni&ARk-te] considering 0 messages
Host2: folder [Elementy usuni&ARk-te] considering 0 messages
Host1: folder [INBOX.Elementy usuni&ARk-te] selected 0 messages, duplicates 0
Host2: folder [Elementy usuni&ARk-te] selected 0 messages, duplicates 0
Folder    4/13 [INBOX.Elementy wys&AUI-ane] = [INBOX.Elementy wysłane] -> [Elementy wys&AUI-ane] = [Elementy wysłane]
Host1: folder [INBOX.Elementy wys&AUI-ane] has 1 messages in total (mentioned by SELECT)
Creating folder [Elementy wys&AUI-ane] on host2
Folder [Elementy wys&AUI-ane] already exists (--nomixfolders is not set)
Host2: folder [Elementy wys&AUI-ane] has 0 messages in total (mentioned by SELECT)
Host2: folder [Elementy wys&AUI-ane] permanentflags:
Host2: Subscribing to folder Elementy wys&AUI-ane
Host1: folder [INBOX.Elementy wys&AUI-ane] considering 1 messages
Host2: folder [Elementy wys&AUI-ane] considering 0 messages
Host1: folder [INBOX.Elementy wys&AUI-ane] selected 1 messages, duplicates 0
Host2: folder [Elementy wys&AUI-ane] selected 0 messages, duplicates 0
msg INBOX.Elementy wys&AUI-ane/1 {3211}            copied to Elementy wys&AUI-ane/1          3.55 msgs/s  17.422 KiB/s 44.177 KiB copied ETA: Thu Jul 23 08:12:40 2020  1 s  2/11 msgs left
Folder    5/13 [INBOX.INBOX.Drafts]                -> [INBOX/Drafts]
Host1: folder [INBOX.INBOX.Drafts] has 0 messages in total (mentioned by SELECT)
Creating folder [INBOX/Drafts] on host2
Created folder [INBOX/Drafts] on host2
Host2 folder INBOX/Drafts: Could not select: 54 NO Mailbox doesn't exist: INBOX/Drafts (0.003 + 0.000 + 0.002 secs).
Creating folder [INBOX/Drafts] on host2
Created folder [INBOX/Drafts] on host2
Host2 folder INBOX/Drafts: Could not select: 58 NO Mailbox doesn't exist: INBOX/Drafts (0.003 + 0.000 + 0.002 secs).
Folder    6/13 [INBOX.INBOX.Junk]                  -> [INBOX/Junk]
Host1: folder [INBOX.INBOX.Junk] has 0 messages in total (mentioned by SELECT)
Creating folder [INBOX/Junk] on host2
Created folder [INBOX/Junk] on host2
Host2 folder INBOX/Junk: Could not select: 62 NO Mailbox doesn't exist: INBOX/Junk (0.003 + 0.000 + 0.002 secs).
Creating folder [INBOX/Junk] on host2
Created folder [INBOX/Junk] on host2
Host2 folder INBOX/Junk: Could not select: 66 NO Mailbox doesn't exist: INBOX/Junk (0.002 + 0.000 + 0.001 secs).
Folder    7/13 [INBOX.INBOX.Sent]                  -> [INBOX/Sent]
Host1: folder [INBOX.INBOX.Sent] has 1 messages in total (mentioned by SELECT)
Creating folder [INBOX/Sent] on host2
Created folder [INBOX/Sent] on host2
Host2 folder INBOX/Sent: Could not select: 70 NO Mailbox doesn't exist: INBOX/Sent (0.002 + 0.000 + 0.001 secs).
Creating folder [INBOX/Sent] on host2
Created folder [INBOX/Sent] on host2
Host2 folder INBOX/Sent: Could not select: 74 NO Mailbox doesn't exist: INBOX/Sent (0.002 + 0.000 + 0.001 secs).
Folder    8/13 [INBOX.INBOX.Trash]                 -> [INBOX/Trash]
Host1: folder [INBOX.INBOX.Trash] has 0 messages in total (mentioned by SELECT)
Creating folder [INBOX/Trash] on host2
Created folder [INBOX/Trash] on host2
Host2 folder INBOX/Trash: Could not select: 78 NO Mailbox doesn't exist: INBOX/Trash (0.002 + 0.000 + 0.001 secs).
Creating folder [INBOX/Trash] on host2
Created folder [INBOX/Trash] on host2
Host2 folder INBOX/Trash: Could not select: 82 NO Mailbox doesn't exist: INBOX/Trash (0.002 + 0.000 + 0.001 secs).
Folder    9/13 [INBOX.Sent]                        -> [Sent]
Host1: folder [INBOX.Sent] has 0 messages in total (mentioned by SELECT)
Host2: folder [Sent] has 1 messages in total (mentioned by SELECT)
Host2: folder [Sent] permanentflags:
Host1: folder [INBOX.Sent] considering 0 messages
Host2: folder [Sent] considering 1 messages
Host1: folder [INBOX.Sent] selected 0 messages, duplicates 0
Host2: folder [Sent] selected 1 messages, duplicates 0
Folder   10/13 [INBOX.Trash]                       -> [Trash]
Host1: folder [INBOX.Trash] has 1 messages in total (mentioned by SELECT)
Host2: folder [Trash] has 0 messages in total (mentioned by SELECT)
Host2: folder [Trash] permanentflags:
Host1: folder [INBOX.Trash] considering 1 messages
Host2: folder [Trash] considering 0 messages
Host1: folder [INBOX.Trash] selected 1 messages, duplicates 0
Host2: folder [Trash] selected 0 messages, duplicates 0
msg INBOX.Trash/1 {5718}            copied to Trash/1          2.53 msgs/s  12.601 KiB/s 49.761 KiB copied ETA: Thu Jul 23 08:12:41 2020  0 s  1/11 msgs left
Folder   11/13 [INBOX.Wersje robocze]              -> [Wersje robocze]
Host1: folder [INBOX.Wersje robocze] has 0 messages in total (mentioned by SELECT)
Creating folder [Wersje robocze] on host2
Created folder [Wersje robocze] on host2
Host2: folder [Wersje robocze] has 0 messages in total (mentioned by SELECT)
Host2: folder [Wersje robocze] permanentflags:
Host2: Subscribing to folder Wersje robocze
Host1: folder [INBOX.Wersje robocze] considering 0 messages
Host2: folder [Wersje robocze] considering 0 messages
Host1: folder [INBOX.Wersje robocze] selected 0 messages, duplicates 0
Host2: folder [Wersje robocze] selected 0 messages, duplicates 0
Folder   12/13 [INBOX.Wiadomo&AVs-ci-&AVs-mieci] = [INBOX.Wiadomości-śmieci] -> [Wiadomo&AVs-ci-&AVs-mieci] = [Wiadomości-śmieci]
Host1: folder [INBOX.Wiadomo&AVs-ci-&AVs-mieci] has 0 messages in total (mentioned by SELECT)
Creating folder [Wiadomo&AVs-ci-&AVs-mieci] on host2
Folder [Wiadomo&AVs-ci-&AVs-mieci] already exists (--nomixfolders is not set)
Host2: folder [Wiadomo&AVs-ci-&AVs-mieci] has 0 messages in total (mentioned by SELECT)
Host2: folder [Wiadomo&AVs-ci-&AVs-mieci] permanentflags:
Host2: Subscribing to folder Wiadomo&AVs-ci-&AVs-mieci
Host1: folder [INBOX.Wiadomo&AVs-ci-&AVs-mieci] considering 0 messages
Host2: folder [Wiadomo&AVs-ci-&AVs-mieci] considering 0 messages
Host1: folder [INBOX.Wiadomo&AVs-ci-&AVs-mieci] selected 0 messages, duplicates 0
Host2: folder [Wiadomo&AVs-ci-&AVs-mieci] selected 0 messages, duplicates 0
Folder   13/13 [INBOX.Wykryte elementy]            -> [Wykryte elementy]
Host1: folder [INBOX.Wykryte elementy] has 0 messages in total (mentioned by SELECT)
Creating folder [Wykryte elementy] on host2
Created folder [Wykryte elementy] on host2
Host2: folder [Wykryte elementy] has 0 messages in total (mentioned by SELECT)
Host2: folder [Wykryte elementy] permanentflags:
Host2: Subscribing to folder Wykryte elementy
Host1: folder [INBOX.Wykryte elementy] considering 0 messages
Host2: folder [Wykryte elementy] considering 0 messages
Host1: folder [INBOX.Wykryte elementy] selected 0 messages, duplicates 0
Host2: folder [Wykryte elementy] selected 0 messages, duplicates 0
++++ End looping on each folder

Folders sizes after the synchronization.
You can remove this foldersizes listing by using  "--nofoldersizesatend"
++++ Calculating sizes of 13 folders on Host1
Host1 folder    1/13 [INBOX]                             Size:     42026 Messages:     8 Biggest:      7928
Host1 folder    2/13 [INBOX.ESET Antispam]               Size:         0 Messages:     0 Biggest:         0
Host1 folder    3/13 [INBOX.Elementy usuni&ARk-te] = [INBOX.Elementy usunięte] Size:         0 Messages:     0 Biggest:         0
Host1 folder    4/13 [INBOX.Elementy wys&AUI-ane] = [INBOX.Elementy wysłane] Size:      3211 Messages:     1 Biggest:      3211
Host1 folder    5/13 [INBOX.INBOX.Drafts]                Size:         0 Messages:     0 Biggest:         0
Host1 folder    6/13 [INBOX.INBOX.Junk]                  Size:         0 Messages:     0 Biggest:         0
Host1 folder    7/13 [INBOX.INBOX.Sent]                  Size:       663 Messages:     1 Biggest:       663
Host1 folder    8/13 [INBOX.INBOX.Trash]                 Size:         0 Messages:     0 Biggest:         0
Host1 folder    9/13 [INBOX.Sent]                        Size:         0 Messages:     0 Biggest:         0
Host1 folder   10/13 [INBOX.Trash]                       Size:      5718 Messages:     1 Biggest:      5718
Host1 folder   11/13 [INBOX.Wersje robocze]              Size:         0 Messages:     0 Biggest:         0
Host1 folder   12/13 [INBOX.Wiadomo&AVs-ci-&AVs-mieci] = [INBOX.Wiadomości-śmieci] Size:         0 Messages:     0 Biggest:         0
Host1 folder   13/13 [INBOX.Wykryte elementy]            Size:         0 Messages:     0 Biggest:         0
Host1 Nb folders:               13 folders
Host1 Nb messages:              11 messages
Host1 Total size:            51618 bytes (50.408 KiB)
Host1 Biggest message:        7928 bytes (7.742 KiB)
Host1 Time spent:              1.5 seconds
++++ Calculating sizes of 13 folders on Host2
Host2 folder    1/13 [ESET Antispam]                     Size:         0 Messages:     0 Biggest:         0
Host2 folder    2/13 [Elementy usuni&ARk-te] = [Elementy usunięte] does not exist yet
Host2 folder    3/13 [Elementy wys&AUI-ane] = [Elementy wysłane] does not exist yet
Host2 folder    4/13 [INBOX]                             Size:    328475 Messages:    10 Biggest:    231514
Host2 folder    5/13 [INBOX/Drafts]                      does not exist yet
Host2 folder    6/13 [INBOX/Junk]                        does not exist yet
Host2 folder    7/13 [INBOX/Sent]                        does not exist yet
Host2 folder    8/13 [INBOX/Trash]                       does not exist yet
Host2 folder    9/13 [Sent]                              Size:      3259 Messages:     1 Biggest:      3259
Host2 folder   10/13 [Trash]                             Size:      5766 Messages:     1 Biggest:      5766
Host2 folder   11/13 [Wersje robocze]                    Size:         0 Messages:     0 Biggest:         0
Host2 folder   12/13 [Wiadomo&AVs-ci-&AVs-mieci] = [Wiadomości-śmieci] does not exist yet
Host2 folder   13/13 [Wykryte elementy]                  Size:         0 Messages:     0 Biggest:         0
Host2 Nb folders:               13 folders
Host2 Nb messages:              12 messages
Host2 Total size:           337500 bytes (329.590 KiB)
Host2 Biggest message:      231514 bytes (226.088 KiB)
Host2 Time spent:              0.2 seconds
++++ Statistics
Transfer started on                     : Thu Jul 23 08:12:33 2020
Transfer ended on                       : Thu Jul 23 08:12:43 2020
Transfer time                           : 10.1 sec
Folders synced                          : 13/13 synced
Messages transferred                    : 10
Messages skipped                        : 0
Messages found duplicate on host1       : 0
Messages found duplicate on host2       : 0
Messages found crossduplicate on host2  : 0
Messages void (noheader) on host1       : 0
Messages void (noheader) on host2       : 1
Messages found in host1 not in host2    : 0 messages
Messages found in host2 not in host1    : 1 messages
Messages deleted on host1               : 0
Messages deleted on host2               : 0
Total bytes transferred                 : 50955 (49.761 KiB)
Total bytes skipped                     : 0 (0.000 KiB)
Message rate                            : 1.0 messages/s
Average bandwidth rate                  : 4.9 KiB/s
Reconnections to host1                  : 0
Reconnections to host2                  : 0
Memory consumption at the end           : 188.4 MiB (started with 170.5 MiB)
Load end is                             : 0.52 0.58 0.59 1/5 on 16 cores
Biggest message                         : 7928 bytes (7.742 KiB)
Memory/biggest message ratio            : 24916.5
Start difference host2 - host1          : -9 messages, 234447 bytes (228.952 KiB)
Final difference host2 - host1          : 1 messages, 285882 bytes (279.182 KiB)
The sync looks good, all 10 identified messages in host1 are on host2.
The sync is not strict, there are 1 messages in host2 that are not on host1. Use --delete2 to delete them and have a strict sync.
Detected 8 errors

Check if a new imapsync release is available by adding --releasecheck
Homepage: https://imapsync.lamiral.info/
++++ Listing 8 errors encountered during the sync ( avoid this listing with --noerrorsdump ).
Err 1/8: Host2 folder INBOX/Drafts: Could not select: 54 NO Mailbox doesn't exist: INBOX/Drafts (0.003 + 0.000 + 0.002 secs).
Err 2/8: Host2 folder INBOX/Drafts: Could not select: 58 NO Mailbox doesn't exist: INBOX/Drafts (0.003 + 0.000 + 0.002 secs).
Err 3/8: Host2 folder INBOX/Junk: Could not select: 62 NO Mailbox doesn't exist: INBOX/Junk (0.003 + 0.000 + 0.002 secs).
Err 4/8: Host2 folder INBOX/Junk: Could not select: 66 NO Mailbox doesn't exist: INBOX/Junk (0.002 + 0.000 + 0.001 secs).
Err 5/8: Host2 folder INBOX/Sent: Could not select: 70 NO Mailbox doesn't exist: INBOX/Sent (0.002 + 0.000 + 0.001 secs).
Err 6/8: Host2 folder INBOX/Sent: Could not select: 74 NO Mailbox doesn't exist: INBOX/Sent (0.002 + 0.000 + 0.001 secs).
Err 7/8: Host2 folder INBOX/Trash: Could not select: 78 NO Mailbox doesn't exist: INBOX/Trash (0.002 + 0.000 + 0.001 secs).
Err 8/8: Host2 folder INBOX/Trash: Could not select: 82 NO Mailbox doesn't exist: INBOX/Trash (0.002 + 0.000 + 0.001 secs).
Exiting with return value 111 (EXIT_WITH_ERRORS)
Log file is LOG_imapsync/[email protected][email protected] ( to change it, use --logfile filepath ; or use --nolog to turn off logging )

Nie znalazłem rozwiązania na błędy, które pojawiają się na samym końcu, więc jeśli ktoś zna rozwiązanie – chętnie o tym posłucham.

Exchange i przenoszenie wielu skrzynek na inny serwer

Tutaj sprawa jest nieco skomplikowana: Exchange domyślnie nie obsługuje IMAPa, to znaczy ta funkcja jest wyłączona. Trzeba ją włączyć i skonfigurować dla użytkowników. Jeśli chodzi o synchronizację wielu użytkowników – niczym się nie różni w stosunku tego, co jest powyżej, poza tym, że robimy to dla wielu użytkowników i czytamy loginy i hasła kont źródłowych i docelowych z pliku CSV. Testy robiłem na Exchange 2019 i do niego będę się odnosił. Nazwa serwera mailowego to mail.serba.website. Poza tym, co wspomniałem, konta muszą być wcześniej utworzone na docelowym serwerze, na który przenosimy skrzynki.

Instrukcja włączania IMAPa jest tutaj, ale ja ją skrócę – poniższe usługi trzeba włączyć i zmienić ich tryb na Automatyczny:

Następnie należy ustawić adres FQDN dla serwera IMAP Exchange’a:

C:\Windows\system32>Set-ImapSettings -ExternalConnectionSettings "mail.serba.website:993:SSL","mail.serba.website:143:TLS" -X509CertificateName mail.serba.website
WARNING: Changes to IMAP4 settings will only take effect after all Microsoft Exchange IMAP4 services are restarted on server EXCHANGE.

Po tym należy wykonać restart usługi:

[PS] C:\Windows\system32>Restart-Service MSExchangeIMAP4; Restart-Service MSExchangeIMAP4BE
WARNING: Waiting for service 'Microsoft Exchange IMAP4 (MSExchangeIMAP4)' to start...
WARNING: Waiting for service 'Microsoft Exchange IMAP4 (MSExchangeIMAP4)' to start...
WARNING: Waiting for service 'Microsoft Exchange IMAP4 Backend (MSExchangeIMAP4BE)' to start...
WARNING: Waiting for service 'Microsoft Exchange IMAP4 Backend (MSExchangeIMAP4BE)' to start...
[PS] C:\Windows\system32>Get-Service MSExchangeIMAP4; Get-Service MSExchangeIMAP4BE

Status   Name               DisplayName
------   ----               -----------
Running  MSExchangeIMAP4    Microsoft Exchange IMAP4
Running  MSExchangeIMAP4BE  Microsoft Exchange IMAP4 Backend

Po tym IMAP działa, ale nie można zapomnieć o tym, by ten miał ważny certyfikat SSL lub jeśli ma samopodpisany lub nieważny, należy użyć opcji --sslargs2 SSL_verify_mode=0 zakładając, że Exchange jest serwerem na który przenosimy skrzynki.

Następnie należy przygotować skrypt, który wykona nam synchronizację oraz plik CSV zawierający loginy i hasła. CSV wygląda tak (zapisany jako konta.csv):

[email protected];haslo1;apilecki@website;haslo1
[email protected];haslo2;bpoprawa@website;haslo2
[email protected];haslo3;fkluk@website;haslo3

Skrypt wygląda tak:

{ while IFS=';' read  u1 p1 u2 p2; do
/mnt/c/Users/Administrator.SERBA/Desktop/imapsync/imapsync --host1 ssl0.ovh.net --user1 "$u1" --password1 "$p1" --ssl1 --port1 993 \
                             --host2 exchange.serba.local --user2 "$u2" --password2 "$p2" -ssl2
                         done ; } < konta.csv

Oczywiście należy podmienić ścieżkę do imapsync na właściwą wcześniej, po tym zapisujemy skrypt jako sync.sh i wykonujemy polecenie bash sync.sh. Po tym skrzynki się zsynchronizują.

Kwestie wydajnościowe

Według zaleceń twórcy IMAPsynca są kwestie, które trzeba wziąć pod uwagę pod kątem synchronizacji i myślę, przy masowych synchronizacjach warto wziąć pod uwagę. Jeśli mamy dużo kont do synchronizacji to można podzielić plik CSV na mniejsze i odpalić osobne procesy dla każdego pliku CSV – w ten sposób więcej synchronizacji można wykonać w jednym czasie, lecz nie ma dokładnego określenia ile ich ma być. Pozostaje testować. Poza tym, warto takie synchronizacje robić z poziomu źródłowego serwera pocztowego lub z docelowego serwera pocztowego (jeśli to jest w ogóle możliwe). To zapewni nam najlepszą wydajność, na przykład jeśli wysyłamy skrzynkę do Office 365 z lokalnego Exchange, warto taki program odpalić bezpośrednio na Exchange’u (jeśli to w ogóle możliwe),

Dystrybucja certyfikatów na stacje robocze i serwery w domenie Active Directory poprzez GPO

To jest kolejna niesamowicie przydatna rzecz przy wdrażaniu vCenter jako podrzędnego CA, o którym niedawno była tutaj mowa oraz przy wdrażaniu SSL deep inspection na UTMie jeśli nie chce się nam stawiać AD CSa (pomimo to polecam pójście w taką stronę).

Konfiguracja jest banalnie prosta – trzeba stworzyć nowy obiekt GPO, następnie w jego edycji przejść do Konfiguracja komputera > Zasady > Ustawienia systemu Windows > Ustawienia zabezpieczeń > Zasady kluczy publicznych > (magazyn certyfikatów, który nas interesuje, w moim przypadku to Pośrednie urzędy certyfikacji), następnie tam kliknąć prawym na wolne pole i wybrać Importuj:

Następnie należy kliknąć Dalej.

Należy wybrać plik, który chcemy dodać. W tym przypadku dodajemy certyfikat vCenter i chcemy, by był w magazynie pośrednich urzędów certyfikacji. Następnie klikamy Dalej.

W sumie na następnym etapie nie trzeba nic robić, bo tutaj mamy wybrany już odpowiedni magazyn. Klikamy Dalej.

Na koniec widzimy to, co wdrożyliśmy, można kliknąć Zakończ.

Po podłączeniu obiektu GPO do odpowiedniego OU i zaaktualizowaniu polityk na komputerze klienckim certyfikat się dodał do maszyny w certyfikatach komputerów.

Wymuszanie wykorzystywania lokalnego magazynu certyfikatu w Firefoxie przez GPO

To jest całkiem przydatna rzecz, szczególnie w 2 przypadkach: mamy wdrażane vCenter i chcemy mieć zaufane wszystkie certyfikaty lub wdrażamy SSL deep inspection. Do tego niektórzy używają Firefoxa i tego nie jesteśmy w stanie przeskoczyć, więc pozostaje nam spróbować wymusić ustawienia przez GPO. Takich ustawień nie ma domyślnie w GPO, ale możemy wykorzystać pliki ADMX, które nam dodają specjalne ustawienia w przeglądarkach. Do Firefoxa plik ADMX znajduje się na stronie getadmx.com i to wykorzystamy. Klonujemy repo, w którym są te ustawienia, otwieramy katalog SYSVOL na naszym kontrolerze domeny (pod adresem //domena.local/SYSVOL lub //kontroler-domeny/SYSVOL, np. //serba.local/SYSVOL lub //dc1.serba.local/SYSVOL), w nim otwieramy folder o nazwie naszej domeny (w moim przypadku serba.local), w nim tworzymy folder PolicyDefinitions i wklejamy tam folder o nazwie języka + pliki ADMX, które znajdują się w folderze. Z faktu, że nie ma języka polskiego – kopiuję folder en oraz pliki *.admx.

Folder PolicyDefinitions istnieje także w C:/Windows/PolicyDefinitions. Takie tworzenie folderu w SYSVOL dla definicji polityk GPO jest określane jako Central Store. Poza samymi zmienionymi politykami powinniśmy skopiować wszystko, co jest we wspomnianym folderze systemowym do //serba.local/SYSVOL/serba.local/PolicyDefinitions. Dzięki temu wszystkie opcje w GPO będą trzymane w jednym miejscu, co jest istotne w przypadku posiadania wielu kontrolerów domeny. Dlatego też nie polecam wrzucania 3rd party plików ADMX do lokalnego folderu – w przyszłości jeśli będzie się miało drugi kontroler domeny to ten nie będzie wiedział w ogóle co znaczą te polityki i one mogą nam nie działać.

Następnie w GPO tworzymy nowy obiekt (nazwałem go firefox use local ca store), następnie rozwinąłem w Konfiguracja komputera > Zasady > Szablony administracyjne: definicje zasad (pliki ADMX) pobrane z komputera lokalnego > Mozilla > Firefox > Certificates i włączamy opcję Import Enterprise Roots.

Po tym wystarczy podłączyć taką politykę i wymusić aktualizację zasad grupy:

Po aktywowaniu, jak sama polityka wskazuje zmiany są stosowane nawet jeśli przeglądarka była zainstalowana po wprowadzeniu polityki, ponadto użytkownik nie może zmienić wskazanego ustawienia:

Integracja SSO VMware ESXi 7.0 oraz VMware vCenter 7.0 z Active Directory

Po raz kolejny będziemy starać się zintegrować logowanie do środowiska vSphere po to, by móc się logować za pomocą kont z Active Directory. Dzięki temu po raz kolejny ograniczamy hasło, które musimy pamiętać. Fakt, można korzystać z menedżera haseł i przechowywałbym w nim hasło do kont lokalnych (np. w przypadku ESXi do konta root, w przypadku vCenter do konta [email protected] (chodzi o domyślne konto administracyjne vCenter, oczywiście zawsze można zmienić przy instalacji nazwę domeny, po prostu ta jest domyślna i często jest w środowiskach produkcyjnych pomimo wszystko).

Integracja SSO z VMware ESXi 7.0

Ogólnie integracja nie różni się w żaden sposób od wersji 6.5 i 6.7 – na początku należy mieć prawidłowo skonfigurowane serwery DNS:

By ustawić je, należy przejść do Networking > TCP/IP stacks, kliknąć na Default TCP/IP stack i wybrać Edit settings.

Zaznaczamy opcję Manually configure the settings for this TCP/IP stack i poniżej ustalamy opcje:

  • Host name – definiujemy tutaj nazwę hosta ESXi, w moim przypadku vhost1,
  • Domain name – tutaj wskazujemy domenę, do której ma należeć host, w moim przypadku serba.local. To jest po to, by móc określać FQDN hosta, czyli w tym przypadku vhost1.serba.local,
  • Primary DNS server – tutaj wstawiamy adres pierwszorzędnego kontrolera domeny,
  • Secondary DNS server – jeśli mamy drugi kontroler domeny – wstawiamy tutaj.
  • Search domains – tutaj dodałem serba.local, ta funkcja polega na tym, że jeśli na przykład chcemy się połączyć do serwera dc1 bez podania FQDNa w pełnej formie czyli host + domena to nasz host sam spróbuje dopisać domenę z search domains, czyli będzie wykonana próba połączenia do dc1.serba.local.

Zanim podłączymy hosta do domeny warto zwrócić uwagę na jeden szczegół w ustawieniach zaawansowanych ESXi – po dodaniu do domeny host sprawdza, czy w AD istnieje grupa o nazwie, która jest zdefiniowana w zmiennej Config.HostAgent.plugins.hostsvc.esxAdminsGroup w ustawieniach Manage > System > Advanced Settings. Domyślna wartość to ESX Admins, co oznacza, przy logowaniu do serwera ESXi ten będzie sprawdzał czy taka grupa istnieje oraz czy użytkownik, który się loguje znajduje się w tej grupie (przy czym działa też możliwość dodawania grup jako członków i dziedziczenie obiektów). Zawsze można ją zmienić na Administratorzy domeny lub Domain Admins (jeśli mamy anglojęzyczny Windows Server na którym postawiliśmy pierwszy kontroler domeny), dzięki czemu nie trzeba ustawiać w żaden sposób dodatkowych grup i od razu wszyscy admini w domenie mają możliwość logowania swoimi kontami.

Poniżej przykład rozwiązania kwestii domyślnej grupy, do której można jak wspomniałem dodać adminów domeny (jeśli chcemy zostawić wspomniane ustawienie z wartością domyślną):

Następnie przechodzimy do Manage > Security & Users, wybieramy Authorization i kilkamy Join Domain. Potem zostaje nam podać nazwę domeny w Domain Name oraz login i hasło do konta, które ma uprawnienia do dodawania komputerów do domeny. Po tym klikamy Join domain

…i w ten sposób można zobaczyć efekt.

W ten sposób zalogowałem się na swoje konto z AD:

Integracja SSO z VMware vCenter 7.0

Pora na vCenter, gdzie podobnie możemy zintegrować logowanie z AD zarówno w interfejsie vCenter jak i w vCenter Server Management (interfejs na porcie 5480 z którego robimy aktualizację i kopie zapasowe vCenter).

Na początku trzeba upewnić się, że serwer DNS, który jest ustawiony w vCenter rozwiąże nazwę naszej domeny, więc do vCenter Server Management pod adresem https://<adres-vcenter>:5480, w moim przypadku: https://vcenter.serba.local:5480/#/login.

Następnie przechodzimy do Networking i klikamy na górze po prawej Edit:

Wybieramy interfejs vCenter i klikamy Next.

Następnie w Hostname and DNS określamy FQDN naszej maszyny (w moim przypadku vcenter.serba.local) i w DNS Settings wybieramy opcję Enter DNS settings manually, i podajemy adresy kontrolerów domeny, które nam rozwiążą nazwę domeny.

Na końcu podajemy poświadczenia administracyjne, dzięki których możemy zatwierdzić zmianę.

Po zmianie vCenter zrestartuje usługi sieciowe, poza tym te zmiany mogą wpłynąć na prawidłowe działanie środowiska, dlatego przed wykonaniem trzeba potwierdzić, że zrobiło się backup przed zmianami (co polecam zrobić!).

Następnie należy zalogować się do zwykłego interfejsu vCenter, przejść do Menu > Administration, następnie do Single Sign on > Configuration.

Tutaj, w zakładce Identity Provider należy wybrać Active Directory Domain i kliknąć Join AD przy wpisie z naszym adresem vCenter:

Potem wystarczy wpisać w Domain naszą nazwę domeny (w moim przypadku serba.local), Organization Unit jest opcjonalne i nie musimy go ustawiać (jest po to, by zmienić domyślny kontener, do którego trafia obiekt komputera vCenter w domenie, określa się go za pomocą DN, np. OU=Serwery,OU=it.supra.tf,DC=serba,DC=local). Ponadto podajemy poświadczenia użytkownika, który ma prawo do dodawania komputerów do domeny i klikamy Join.

Gdy nam się to uda, jesteśmy poproszeni o zrestartowanie vCenter w celu zatwierdzenia zmian:

Restart możemy wykonać za pomocą opcje Restart Guest (opcja wysyła sygnał do systemu operacyjnego zamiast natychmiast restartować maszynę wirtualną) lub możemy skorzystać z tej opcji w vCenter Server Management:

Po restarcie należy wrócić do miejsca, gdzie dodawaliśmy vCenter do domeny i w Identity Sources należy kliknąć Add i szczerze powiedziawszy to od razu można kliknąć Add, ponieważ domyślnie wszystko, co się zaznacza jest tym, co nas interesuje.

Potem można dodatkowo zmienić w tym menu domyślnego dostawcę logowania na AD zaznaczając go na liście oraz klikając Set as default, a następnie zatwierdzić klikając OK. To spowoduje, że logując się do vCenter nie musimy podawać UPN nazwy użytkownika (np. [email protected]), lecz wystarczy nazwa użytkownika (tzw. sAMAccountName, np. rserba):

Następnie w Administration > Access Control > Global Permissions należy dodać grupę, która będzie mogła zarządzać ustawieniami vCenter. Klikamy + i wskazujemy grupę w AD, która ma możliwość logowania i administracji. Ponadto działa tutaj dziedziczenie obiektów, więc można zawsze wskazywać grupy, których członkami są inne grupy, w której są dopiero nasi użytkownicy.

Wygląda to tak:

W ten sposób jestem w stanie się zalogować, ale niestety nie mam uprawnień do niektórych ustawień:

Problem wynika z tego, że nie jesteśmy w lokalnej grupie Administrators, która jest widoczna w vCenter 6.7 na liście, w przypadku vCenter 7.0 trzeba na dole po prawej przejść do następnej strony grup:

Grupy w vCenter 6.7

Poniżej animacja pokazująca jak dodać grupę Administratorzy domeny do grupy Administrators. Na tym etapie muszę zaznaczyć, że taką operację wykonujecie na własną odpowiedzialność, ponieważ VMware takiej opcji nie zaleca.

Po tej zmianie jak widać, mamy dostęp do wszystkich ustawień:

Tak samo możemy się od teraz logować kontami AD w vCenter Server Management, lecz tutaj logujemy się UPNem, czyli na przykład w moim przypadku kontem [email protected].

VMware Enhanced Authentication Plugin

vCenter pozwala na logowanie poprzez konto zalogowanego użytkownika na komputerze poprzez ten plugin. Wystarczy go pobrać, zainstalować i gotowe. Można to zrobić poprzez instalator, który znajdziemy na dole po prawej stronie w ekranie logowania:

Instalatora nie trzeba w żaden sposób konfigurować – idziemy wszędzie dalej i to się zainstaluje. Jedynie na początku dostajemy komunikat świadczący o tym, że po wykonaniu instalacji trzeba otworzyć na nowo przeglądarki, z których się używa.

Potem instalacja wygląda tak:

Koniec pierwszego instalatora odpala drugi, który można tak samo wyklikać.

Gdy mamy to już za sobą, możemy otworzyć na nowo przeglądarkę (w moim przypadku Google Chrome) i otworzyć stronę vCenter. Automatycznie po otwarciu Chrome spyta nas czy chcemy otworzyć program, do którego chce się dostać strona:

Następnie zatwierdzamy i otworzy się plugin, który nas spyta czy ufamy tej stronie. Z faktu, że tak dodatkowo zaznaczamy opcję Always ask before allowing this site i w ten sposób nie będziemy o to pytani ponownie.

Po tym wystarczy, że na ekranie logowania zaznaczymy Use Windows session authentication i nie musimy podawać loginu i hasła – po prostu klikamy Login.

W ten sposób jesteśmy w domu.

Zdalne wykonanie procedury nie powiodło się przy aktualizacji zasad grupy – rozwiązanie

Ten problem niestety jest przy każdym środowisku z Windowsem Server w domyślnej konfiguracji, lecz bez obaw – jest na to rozwiązanie. Problemem są wyłączone domyślne polityki firewalla w Windowsach, więc wystarczy je włączyć. Oczywiście robi się to polityką GPO, bo nie wyobrażam sobie takie coś wklepywać na 100 komputerach.

Należy włączyć następujące polityki firewalla w ruchu przychodzącym:

  • Instrumentacja zarządzania Windows (ruch przychodzący ASync)
  • Instrumentacja zarządzania Windows (ruch przychodzący DCOM)
  • Instrumentacja zarządzania Windows (ruch przychodzący WMI)
  • Zdalne zarządzanie usługami (RPC)
  • Zdalne zarządzanie usługami (RPC-EPMAP)
  • Zdalne zarządzanie zaplanowanymi zadaniami (RPC)
  • Zdalne zarządzanie Zaporą Windows Defender (RPC-EPMAP)

Na zrzucie ekranu można zobaczyć poniżej jak wyglądają ustawienia:

Oczywiście nie trzeba ich tworzyć ręcznie. Wystarczy otworzyć Zaporę Windows Defender z zabezpieczeniami zaawansowanymi, znaleźć pasujące nazwy i poprzeciągać do GPO. Od razu wszystko się ładnie doda. Po utworzeniu obiektu GPO można go na spokojnie przypiąć do korzenia drzewa AD, dzięki czemu obiekt będzie zmieniał ustawienia firewalla we wszystkich komputerach w domenie – tego chcemy.

Po tym należy odczekać 2 godziny, aż komputery kliencie same spróbują pobrać nową konfigurację GPO z domeny lub można zrestartować maszyny – to da nam ten sam skutek – maszyny będą miały zmienione ustawienia firewalla.

Gdyby ktoś był leniwy – tutaj kopia polityk, którą można sobie zaimportować. Do tego trzeba zrobić nowy obiekt, a potem kliknąć prawym i Importuj ustawienia….

Z istotnych rzeczy należy wybrać folder, w którym jest nasz plik ZIP z polityką.

Potem można klikać tylko dalej i jesteśmy w domu:

FortiGate jako podrzędny urząd certyfikacji dla AD CS w SSL/SSH Inspection

Często we wdrożeniach SSL deep inspection jest pomijane, bo wdrażanie go jest upierdliwe. Osobiście uważam, że pomijanie wdrażania tej funkcjonalności to głupota. Aktualnie w sieci prawie 80% ruchu jest szyfrowana SSLem, więc bez takiego wdrożenia nie jesteśmy w stanie filtrować tego całego ruchu pod kątem potencjalnych zagrożeń, bo po prostu nie jesteśmy w stanie zaglądać bezinwazyjnie do ruchu użytkownika. Problem nie dotyczy stricte FortiGate, lecz dowolnego urządzenia, które takie filtrowanie robi (dzisiaj robi to każdy normalny UTM na rynku).

Dlaczego wdrożenie tego jest upierdliwe? FortiGate w ramach tej techniki rozszyfrowuje ruch pomiędzy klientem i serwerem, a następnie przed dotarciem do klienta ten ruch musi ponownie zaszyfrować, więc strony, które otwiera klient będą miały podpisane certyfikaty SSL przez FortiGate’a. To powoduje, że musimy mieć certyfikat CA FortiGate’a mieć zainstalowany na każdym komputerze wpadającym w regułę deep inspection.

W przypadku grupy roboczej rzeczywiście to może być piekło, ale w takiej sytuacji raczej większym zmartwieniem jest po prostu brak domeny Active Directory w organizacji. Teoretycznie można taki certyfikat CA FortiGate wysłać użytkownikom przez GPO, ale jest ogólnie lepsze rozwiązanie (można je zastosować tylko w przypadku posiadania wdrożonej domeny Active Directory) – użycie usług certyfikatów Active Directory. Można podpisać certyfikat dla podrzędnego urzędu certyfikacji, dzięki czemu ten z góry jest zaufany w naszych komputerach domenowych, bo główny urząd certyfikacji automatycznie jest dodawany po wdrożeniu do każdego komputera będącego w AD. W ten sposób nie trzeba dogrywać na komputerach klienckich żadnych dodatkowych certyfikatów.

Standardowo nie przedstawiam tutaj sposobu jak wdrażać AD CS, bo zakładam, że to już jest wdrożone (z dodatkową funkcją Rejestracja w sieci Web dla urzędu certyfikacji). Skupiam się tutaj nad samą częścią związaną z certyfikatem dla FortiGate’a. Na początku należy sobie wygenerować klucz prywatny oraz przygotować żądanie podpisania certyfikatu dla naszego nowego urzędu. Opisałem to tutaj, więc zalecam przejrzeć jak to się robi. W stosunku do tej stronki różnica w naszej konfiguracji jest taka, że tutaj moje pole CN i DNS.1 posiada wartość fortigate.serba.local, ponieważ tak się nazywa FQDN mojego urządzenia.

Po utworzeniu CSRki dostaniemy plik z podobną zawartością jak ta:

-----BEGIN CERTIFICATE REQUEST-----
MIIDDjCCAfYCAQAwgZUxCzAJBgNVBAYTAlBMMRAwDgYDVQQIDAdzbGFza2llMQ4w
DAYDVQQHDAVUeWNoeTEUMBIGA1UECgwLaXQuc3VwcmEudGYxCzAJBgNVBAsMAklU
MSEwHwYJKoZIhvcNAQkBFhJyYWRvc2xhd0BzZXJiYS5vdmgxHjAcBgNVBAMMFWZv
cnRpZ2F0ZS5zZXJiYS5sb2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALjPgatD84GPdQlt5GytCUSjs7Mr4k3yn7mUW2QbEr9zAQ5/uRWo/rep6ptr
N2HBP4vFzCTGA4c1OGwg0yzzkz3uGEVUiJ0qdudutHGYEfDpr2Hd0kH6eH7MIqGx
GBqhe9+XRugtSojE2jDPGL3UU2eDhx8fzzovbbi+IyuOsOEtCwGl2FvPP9AnT2/s
owTOxlU2ZqaAauL+72pa0ciSdDfWh9Lat2FeWIPD34qAt/n9yK4fXpSWgWm0y+zB
ackruljZxd6gw4x0KBKdUq+a8vPdz6RK2ODBnQEG02DkxvdjfgzkzX2aNbR9QWAC
HuPGB6FdzidIf+UoBUaUKrFabhMCAwEAAaAzMDEGCSqGSIb3DQEJDjEkMCIwIAYD
VR0RBBkwF4IVZm9ydGlnYXRlLnNlcmJhLmxvY2FsMA0GCSqGSIb3DQEBCwUAA4IB
AQB/qzvsPSpFyZtqsdbBKBOZb6aHjUfFFynnI2XKIi0bjUSy0mo7O2BcHJxM2Om2
TN+52pxI7HerHSqCj2RaC7SW9NWf10s1gHxNvDMS3fK1thX2QdrssbX5oRNUQRHU
I+kUfJ4xSGUogqw8ARaxreNe99qBjClzITuGGnjMLVtDXAJYQHG4CpXGHF+TwHbW
FHnYcuCm/BtS+sNKmadpWh2ZUCQQM8nkgQXJwJLk64d4FJbIBTuyetmQ+GnqY8eo
PUSwjIPDKFIG8p1hRzUhUjr1WL7Qx0SXAg8hEJj/3/z6RxRCq8N1qRXxhEzXLjBz
AHlsjMlPW5GC21jkDCXbxcq8
-----END CERTIFICATE REQUEST-----

To jest nasze żądanie i te musimy przesłać do urzędu certyfikacji, by podpisać certyfikat. Wchodzimy na adres http://<adres-ca>/certsrv, w moim przypadku https://dc1.serba.local/certsrv:

Następnie należy wybrać Żądanie certyfikatu.

Następnie wybieramy zaawansowane żądanie certyfikatu.

Na tym etapie musimy otworzyć nasz plik CSR w jakimś edytorze tekstu, skopiować zawartość i wkleić w pole żądania. Ponadto, musimy wybrać szablon certyfikatu, dzięki czemu określamy przeznaczenie certyfikatu, który generujemy. To, co nasz interesuje to Podrzędny urząd certyfikacji. Po tym klikamy Prześlij >.

Na końcu pobieramy plik w formacie Base-64.

Ponadto, musimy pobrać certyfikat urzędu certyfikacji, co możemy zrobić na stronie głównej urzędu poprzez opcję Pobierz certyfikat urzędu certyfikacji, łańcuch certyfikatów lub listę CRL, a następnie mając zaznaczoną metodę kodowania Base 64, następnie klikając Pobierz certyfikat urzędu certyfikacji.

Mając oba certyfikaty, należy je dodać w FortiGate. Po zalogowaniu się do urządzenia należy przejść do sekcji System > Certificates i tam kliknąć Import > CA Certificate:

Po prawej stronie otworzy nam się menu, w Type wybieramy File i w Upload wskazujemy plik, a następnie zatwierdzamy:

W ten sposób CA jest dodane, więc dodatkowo warto też zmienić nazwę certyfikatu w FortiGate, by móc ją łatwiej w ustawieniach odnajdywać, co opisałem tutaj. Następnie dla certyfikatu podrzędnego CA należy zamiast Import > CA Certificate wybrać Import > Local Certificate. W Type wybieramy Certificate, następnie w Certificate file wybieramy plik certyfikatu, potem w Key file wybieramy klucz prywatny, który był wykorzystywany przy tworzeniu CSR i ewentualnie podajemy hasło do klucza. Ponadto można w Certificate Name z góry przypisać nazwę certyfikatu. Finalnie wygląda to tak:

Jak widać CA zostało dodane:

Dzięki temu możemy wykorzystywać nowy certyfikat podrzędny CA w SSL deep inspection:

Wdrożenie 802.1X w sieci bezprzewodowej na FortiGate oraz w sieci opartej o sprzęt Netgear

Jako część mojej pracy inżynierskiej musiałem skonfigurować mechanizm uwierzytelniania oparty o domenę Active Directory. Założeniem było to, by użytkownicy z podłączonymi komputerami do domeny miały móc się logować bez jakiegokolwiek problemu do dwóch sieci Wi-Fi oraz do portów na switchu. Postaram się opisać jak wszystko skonfigurować od zera.

W każdym przypadku potrzebujemy serwera RADIUS. Są tutaj różne opcje, ponieważ można zainstalować serwer FreeRadius, lecz z faktu, że korzystałem w tym projekcie ze środowiska bazującego na Windowsach skorzystałem z roli Serwera zasad sieciowych (Network Policy Server).

Mechanizm działania jest dosyć prosty: użytkownik wykonuję próbę połączenia się z siecią po czym dostaje odpowiedź od urządzenia (access point lub switch), że musi się dodatkowo autoryzować i ten próbuje dokonać autoryzacji swoim kontem komputera lub aktualnie zalogowanego użytkownika w AD. Access point/switch komunikują się z serwerami RADIUS będąc ich klientami w celu sprawdzenia czy dany użytkownik ma mieć prawo do korzystania z zasobu (definiuje się to na podstawie grup użytkowników/komputerów). W trakcie połączenia klienta RADIUS z serwerem ci wykorzystują klucz współdzielony w celu uwierzytelnienia się. W przypadku, gdy użytkownik jest w grupie zdefiniowanej dla zasady przypisanej do klienta RADIUS – dostaje połączenie. W innym przypadku zostaje odrzucony.

Zanim zaczniemy instalować NPSa musimy mieć wcześniej wdrożony urząd certyfikacji (Usługi certyfikatów Active Directory). Myślę, że wkrótce taki poradnik pojawi się na mojej stronie (jeśli tak się stanie to dodam link tutaj do niego). Tak czy siak, gdy mamy to za sobą to instalujemy tą rolę:

Wybieramy Instalacja oparta na rolach lub oparta na funkcjach. Potem wybieramy serwer z listy, klikamy Dalej > i wybieramy Usługi zasad sieciowych i dostępu sieciowego i Dodaj funkcje. Potem Dalej >, Dalej >, Dalej > i Zainstaluj.

Po tym rola powinna być zainstalowana i powinniśmy zacząć konfigurację serwera.

Konfiguracja RADIUS dla sieci Wi-Fi na FortiGate

W tym scenariuszu będę bazował na urządzeniu FortiWiFi 60E, które ma wbudowaną kartę bezprzewodową. Na początku należy otworzyć okno Serwera zasad sieciowych, po czym zdefiniować nową zasadę poprzez wybranie w oknie Konfiguracja standardowa opcję Serwer usługi RAIDUS na potrzeby bezprzewodowych i przewodowych połączeń 802.1X i klikamy Skonfiguruj połączenia 802.1X.

Na dobrą sprawę nie ma znaczenia czy wybierzemy połączenia bezprzewodowe czy nie, bo i tak będziemy modyfikować zasadę tak, by brała pod uwagę adres IP klienta RADIUS zamiast przeznaczenia, ale z faktu, że to miało być dla Wi-Fi zaznaczamy opcję Bezpieczne połączenia bezprzewodowe i nazywamy jakoś zasadę, np. fortigate wifi.

Na następnej karcie kreatora należy zdefiniować klientów RADIUS, którzy będą się łączyli w ramach zasady RADIUS. Na początku nie ma żadnych, więc należy dodać przyciskiem Dodaj… nowego. Po tym należy zdefiniować pole Przyjazna nazwa, która jest po prostu nazwą klienta, a następnie adres IP lub jego FQDN. Z faktu, że dla moich klientów mam wcześniej przygotowane nazwy DNS, wpisałem po prostu fortigate.serba.local, co w moim przypadku odpowiada adresowi 192.168.30.1. Po tym definiujemy wspólny klucz tajny na dole okienka dwa razy. Powinien być długi i powinniśmy sobie go zapisać, bo taki klucz też trzeba będzie zdefiniować w FortiGate. Po tym zapisujemy i idziemy dalej.

Następnie wybieramy typ protokołu EAP dla tworzonej przez nas zasady i tutaj wybieram opcję Microsoft: Chroniony protokół EAP (PEAP). Gdy klikniemy Konfiguruj…, możemy sprawdzić lub zmienić jaki certyfikat będzie wykorzystywany przy komunikacji z klientem. W moim przypadku certyfikat był już wskazany, a ten się wygenerował po postawieniu AD CS (automatycznie, wystarczyło zrestartować serwer i mogłem się cieszyć certem z własnego urzędu).

Następnie należy dodać grupy, które mogą się autoryzować w ramach tej zasady. W moim założeniu dostęp mają wszyscy użytkownicy i wszystkie komputery będące w domenie, więc dodajemy grupy Użytkownicy domeny oraz Komputery domeny tak jak ja poniżej:

Następny punkt wykonuje się tylko i wyłącznie w przypadku FortiGate’a – definiujemy przesyłany parametr tekstowy, który służy do identyfikacji sieci. To działa tak, że FortiGate jest w stanie szukać polityki z konkretnym parametrem. Jeśli w różnych sieciach autoryzujemy różne grupy, możemy mieć takie ciągi znaków różne w różnych regułach, np. siec-handlowcy i siec-marketing, dzięki czemu dwie grupy mogą być inaczej brane pod uwagę przy logowaniu.

W oknie Konfigurowanie elementów kontroli ruchu w sieci klikamy po prawej Konfiguruj…, następnie wybieramy kartę Atrybuty specyficzne dla dostawcy. Domyślnie jest zdefiniowany jeden o nazwie atrybutu Ventor-Specific, klikamy na niego i Edytuj…. Po tym pojawi się okno Informacje o atrybutach i tutaj klikamy Dodaj…, a następnie otworzy się kolejne okno (szał!) Informacje o atrybutach specyficznych dla dostawcy i tutaj należy podać kod dostawcy 12356, zaznaczyć opcję Tak, jest zgodny pod kątem zgodności z RADIUS RFC i kliknąć Konfiguruj atrybut…. Tutaj zmieniamy Format atrybutu na Ciąg i wpisujemy wartość, którą chcemy określić daną politykę, byśmy mogli ją potem wskazać w FortiGate. W moim przypadku to wifi-fortigate. Ten parametr jest ogólnie opcjonalny; zobaczycie za niedługo dlaczego. Po tym wszędzie klikamy OK i Dalej na końcu.

Okienny rozgardiasz związany z milionem podopcji.

W ten sposób mamy prawie wszystko gotowe po stronie serwera:

Pod koniec trzeba zmienić nieco parametry warunkowe dla naszej zasady. Otwieramy Zasady żądań połączeń, znajdujemy naszą zasadę, klikamy prawym i Właściwości. W karcie Warunki usuwamy wszystko i klikając na dole Dodaj… dodajemy nowy warunek: Adres IPv4 klienta dostępu. Po tym jeszcze raz Dodaj… i tutaj podajemy adres IP naszego FortiGate’a.

Końcowo powinno wyglądać to tak (jeśli u Was też to tak wygląda to można zapisać ustawienia):

Po tym warto zmienić jeszcze 1 rzecz: metody uwierzytelnieniaw w zasadach sieciowych. W Zasady > Zasady sieciowe odnajdujemy naszą zasadę, klikamy na nią prawym i Właściwości. W zakładce Ograniczenia, w opcji Metody uwierzytelnienia odznaczamy opcje uwierzytelnianie z szyfrowaniem firmy Microsoft (MS-CHAP) i zostawiamy zaznaczone Uwierzytelnianie z szyfrowaniem firmy Microsoft wersja 2 (MS-CHAP-v2). Jeśli macie tak, jak na zrzucie ekranu – można zapisać.

Nie można zapomnieć o tym, by odblokować port dla RADIUSa na firewallu. Ruch musi być odblokowany dla portów TCP i UDP 1812, 1813, 1645, 1646 (dwa ostatnie dla starych urządzeń) dla połączeń przychodzących i wychodzących pomiędzy serwerem RADIUS a jego klientami (w naszym przypadku FortiGate, AP i switch z Netgear). Ja akurat zrobiłem na taką potrzebę politykę GPO:

Po zapisaniu wystarczy kliknąć prawym OU, w którym znajdują się serwery NPS (w moim przypadku są postawione na kontrolerze domeny) i wybrać Aktualizacja zasad grupy…, a następnie potwierdzić.

Efekty widać tutaj:

Tak samo odblokowujemy ruch do reguł wychodzących.

W interfejsie FortiGate, w User & Authentication > RADIUS Servers należy kliknąć Create New i zdefiniować profil w przykładzie jak niżej, przy czym w moim przypadku w IP/Name podałem FQDNy serwerów NPS, które posiadam (skonfigurowałem tak samo drugi serwer, by mieć redundancję, na koniec pokażę jak skopiować z serwera drugi wszystkie ustawienia). Do tych serwerów w polu Secret definiujemy klucz tajny, który definiowaliśmy na początku w zasadzie.

Następnie, po zapisaniu tych ustawień należy w User & Authentication > User Groups należy utworzyć grupę klikając Create New oraz w Remote Groups kliknąć Add, potem z listy Remote Server wybieramy wcześniej zdefiniowany profil RADIUSa i w Groups wybieramy Any jeśli nie chcemy określać się co do zasad, które zdefiniowaliśmy lub wybierając Specify możemy określić parametr, który zdefiniowaliśmy wcześniej w polu specyficznym dla dostawcy (w naszym przypadku wifi-fortigate).

Mając to trzeba edytować profil SSID w WiFi & Switch Controller > SSIDs lub stworzyć nowy klikając Create New > SSID. W Name definiujemy nazwę profilu (w moim przypadku (serba-corp-wifi), potem w WiFi Settings, w SSID definiujemy nazwę WiFi (w moim przypadku serba.local), w Security Mode wybieramy WPA2 Enterprise i w Authentication należy wybrać RADIUS Server i wybrać profil, który wcześniej zdefiniowaliśmy (w moim przypadku serba.local_radius). Mając zdefiniowane SSID możemy je przypisać do FortiAPków lub do interfejsu Software Switch, w którym są interfejsy, którym są podłączeni użytkownicy przewodowo. Poniżej przykład:

W ten sposób możemy zalogować się do sieci Wi-Fi nawet przez telefon z Androidem:

Tutaj ustawienia z telefonu. Warto dodać certyfikat CA do telefonu, by móc go wybrać.
I tutaj efekt końcowy.

Efekt końcowy widoczny z komputera, który jest członkiem AD:

Możemy to też przygotować wcześniej dodatkową polityką GPO, która dodaje sieć Wi-Fi o naszym SSID tak jak w zrzucie ekranu poniżej, ponadto niżej też konfiguracja zabezpieczeń dla profilu:

Konfiguracja RADIUS dla sieci Wi-Fi na AP od Netgear

Przykład jest prezentowany na urządzeniu Netgear WAC505. Scenariusz jest prawie taki sam, jak w przypadku definicji zasady dla FortiGate’a z drobną różnicą – nie definiujemy żadnego atrybutu specyficznego dla urządzenia i definiujemy dodatkowego klienta RADIUS na początku kreatora. Tak samo definiujemy inne ustawienia. W mojej konfiguracji klient posiada FQDN wac.serba.local, który odpowiada adresowi IP 192.168.30.253. Ten model, który mamy w przykładzie obsługuje też konfigurację przez chmurę, ja akurat definiuję ustawienia lokalnie. Pewnie jak bym miał takich access pointów 10 to definiowałbym to przez chmurę, bo łatwiej wszystko skonfigurować.

Na początku w w Configuration > Security > RADIUS Settings definiujemy adresy IP serwerów RADIUS, porty wykorzystywane do komunikacji oraz klucze współdzielone.

Potem, w Configuration > Wireless > Basic w karcie WLAN Settings należy wybrać SSID, w którym chcemy umożliwić na autoryzację kontami AD i wybrać w Network Authentication opcję WPA2-enterprise.

Po tym możemy dodać tak samo profil Wi-Fi jak w przypadku FortiGate’a. Jak widać poniżej, sieć działa:

I widok z komputera będącego w AD:

Konfiguracja RADIUS dla sieci przewodowej ze switchem marki Netgear

W tym scenariuszu wdrożenia posługiwałem się przełącznikiem Netgear GS716T.

Scenariusz wygląda bardzo podobnie jak w poprzednich politykach – tworzymy nową zasadę na serwerze zasad sieciowych (NPS) korzystając z opcji Bezpieczne połączenia przewodowe (Ethernet) w oknie Wybieranie typu połączeń 802.1X, usuwamy warunki połączenia klienta dla zasad żądań połączeń i definiujemy adres klienta jako adres switcha (w moim przypadku jest to adres netgear.serba.local (192.168.30.254).

Tak wyglądają warunki dla zasad żądań połączeń:

Tak wyglądają dla zasad sieciowych:

I tak wygląda profil klienta RADIUS dla switcha:

Dalsza część jest do ustawienia na switchu. Zaczynamy od zdefiniowania adresów DNS, które mają być wykorzystywane przez przełącznik (w System > Management > DNS > DNS Configuration) poprzez dodanie wszystkich adresów kontrolerów domeny w naszej sieci. Po wpisaniu wartości w puste pole należy kliknąć na dole Add.

Następnie w System > Management > IP Configuration należy się upewnić, że adres IP switcha się pokrywa z tym, który zdefiniowaliśmy w zasadzie w NPSie. W naszym przypadku jest w porządku.

Następnie w Security > Management Security > RADIUS > Server Configuration należy dodać wpisy adekwatne do środowiska:

  • Server Address: dc1.serba.local
  • Authentication Port: 1812
  • Secret Configured: Yes
  • Secret: tutaj podajemy klucz współdzielony
  • Active: Primary/Secondary, wybieramy w zależności tego, który serwer ma być wykorzystywany w autoryzacji w pierwszej kolejności
  • Message Authenticator: Disable

Po tym klikamy na dole Add i tak samo dodajemy serwer dc2.serba.local. Efekt końcowy wygląda tak:

Następnie w Security > Management Security > Authentication List > Dot1x Authentication List należy ustawić dla pola dot1xList w kolumnie 1 wartość Radius. i zatwierdzić kliknięciem Apply.

Teraz, w Security > Port Authentication > Advanced > Port Authentication należy zdefiniować w kolumnie Port Control odpowiednią opcję. Możliwości to:

  • Auto – ustawienie zależy od globalnego ustawienia pod kątem autoryzacji (ustawimy je na końcu). W domyślnych ustawieniach przełącznika autoryzacja nie jest wymagana.
  • Authorized – podłączone urządzenia w tym trybie nie przechodzą żadnej autoryzacji nawet, gdy ta jest włączona globalnie.
  • Unauthorized – brak możliwości autoryzacji pod wskazanym portem.
  • MAC Based – ustawienia są bazowane na tym, co jest zdefiniowane w ACL dla adresów MAC.

Dla wykonania testu ustawiłem port 1 i 2 w trybie Auto, resztę w trybie Authorized. Dzięki temu możemy na 2 portach testować czy komunikacja z RADIUS działa poprawnie, by potem móc ja włączyć dla reszty switcha.

Na końcu, w Security > Port Authentication > Advanced > 802.1X Configuration włączamy opcję Port Based Aurthentication State i zapisujemy klikając Apply. W ten sposób wszystko jest skonfigurowane po stronie switcha, więc zobaczmy efekty na urządzeniu, które jest w AD i urządzeniu, które w nim nie jest.

Obsługa 802.1X w Windowsie jest domyślnie wyłączona, więc włączamy ją zmienieniem ustawień usługi Automatyczna konfiguracja sieci przewodowej zmieniając Typ uruchomienia na Automatyczny oraz klikając Uruchom, by zaczęła działać.

Wygodniej jest stworzyć politykę GPO, która to nam ustawi na każdym komputerze, więc ta powinna mniej więcej wyglądać tak (dodam, że w tej polityce zmiana ustawień usługi WlanSvc okazała się niepotrzebna):

Tutaj można zobaczyć efekt końcowy:

Ponadto, w Security > Port Authentication > Advanced > Port Summary można zobaczyć, że na porcie 1 Port Status to Authorized:

W przypadku komputera, który nie jest członkiem AD akcja wygląda tak:

I od razu Port Status:

I to by było na tyle.