от Пейо Попов(4-09-2005)

рейтинг (24)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Покрай новата машина на Linux-BG, Слави (нашият безстрашен лидер) предложи да опишем като статии по-интересните неща, които са имплементирали върху нея. Надявам се това да доведе до поредица от полезни статии и затова ето опит за кратко описание как се активират и използват TLS възможностите на Postfix.

За TLS подръжката в Postfix
До настоящата 2.2.2 версия TLS подръжката в Postfix се осъществяваше чрез пач, който се добавяше в процеса на компилация или от създателите на пакета в ползваната дистрибуция. На конкретната машина имаме Debian-stable, който идва с Postfix 2.1.5 и има отделен пакет postfix-tls, който осигурява TLS подръжката. В RHEL и Fedora Core 2 и 3 Postfix идва компилиран с подръжка на TLS, като за настройката му има опция в src.rpm файла. С Fedora Core 4 се дистрибутира версия 2.2.2, където TLS подръжката е инкорпорирана в кода на сървъра.

Създаване на CA
Създаването, настройването и управлението на Certification Authority е тема, на която са писани книги и е невъзможно да се дадат изчерпателни пояснения. За Linux-BG решихме да ползваме средствата, които идват с дистрибуцията на openssl, тъй като те осигуряват минимума за функциониране на CA.
Преди да се създаде CA е добре да се настрои openssl.cnf (намира се в /etc/ssl при Debian и /etc/pki на Fedora) така, че да отговаря на нуждите ни. От него може да промените името на директорията на CA, въпросите, които се задават, и техните отговори по подразбиране, хеширащия алгоритъм, предназначението на сертификата, url-те с политиките на CA и др..

За управление на CA ще използваме скрипта CA.pl който идва с дистрибуцията на openssl. Името на скрипта е различно при различните дистрибуции и аз съм го срещал като CA или ca, но той е стандартна част от openssl (обикновено е в misc/ директорията) и трябва да може лесно да го откриете. Аз обикновено го копирам в директорията, която ще съдържа файловете на CA и нанасям малки промени по него, касаещи името на директорията, срока на валидност на сертификатите, clr листи, използвани алгоритми и др.. Създаването на нова CA се извършва с командата:

# ./CA.pl -newca

Следват въпроси относно CA, които служат за попълване на сертификатните полета и за установяване на парола за частния й ключ.
В този случай самоподписаният сертификат на новата CA се намира във файла cacert.pem.

Създаване и подписване на сертификат
С помоща на openssl създаваме частен RSA ключ с големина 1024 бита и попълваме заявка за сертификат:

# openssl req -new -nodes -keyout newkey.pem -out newreq.pem

В файла newkey.pem се съдържа частния ключ, а в newreq.pem — заявката за сертификат. Използването на конвенцията за именоване на файловете newkey.pem, newreq.pem и newcert.pem е заради използването на CA.pl и тези имена може лесно да бъдат променени с редакция на скрипта.

Преглеждането и подписването на заявката от страна на CA се извършват с командата:

# ./CA.pl -signreq

След нейното изпълнение във файла newcert.pem се намира подписаният от нашата CA сертификат.

Конфигурация на Postfix
Обикновено файловете свързани с TLS подръжката се слагат в отделна директория в /etc/postfix. Ако имаме сертификати на други CA може да конкатенираме нашия сертификат към тях с изпълнението на:

# cat cacert.pem >> /etc/postfix/cabundle.pem

при усовие, че ги съхраняваме в един файл, или да го добавим в директорията в която държим сертификатите на външни CА: (certs/ в примера):

# cp cacert.pem /etc/postfix/certs/
# openssl c_rehash /etc/postfix/certs/

За съжаление, в дистрибуциите на Postfix по подразбиране няма такива файлове и горното няма да е нужно в общия случай и ние можем да изпълним само:

# cp cacert.pem /etc/postfix/ssl/

Копираме и частния ключ и сертификата на пощенския сървър като се уверяваме, че ключа може да се прочете само от root:

# mv newkey.pem /etc/postfix/ssl/mailserver-key.pem
# mv newcert.pem /etc/postfix/ssl/mailserver-cert.pem
# chmod 400 /etc/postfix/ssl/mailserver-key.pem

За да активираме TLS услугата в main.cf добавяме:

# TLS Settings
smtpd_use_tls = yes
smtpd_tls_loglevel = 1
#smtpd_tls_auth_only = yes
tls_random_source = dev:/dev/urandom
tls_daemon_random_source = dev:/dev/urandom

# TLS Server
smtpd_tls_cert_file = /etc/postfix/ssl/mailserver-cert.pem
smtpd_tls_key_file = /etc/postfix/ssl/mailserver-key.pem
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem

И презареждаме конфигурацията:

# /etc/init.d/postfix reload

На този етап нашият пощенски сървър трябва да е способен да комуникира използвайки TLS.

Удостоверяване за изпращане на поща чрез клиентски сертификат
Вместо традиционният начин за удостоверяване чрез smtp-auth или pop-before-smtp можем да използваме значително по-сигурното удостоверяване чрез клиентски сертификат.

За тази цел е нужно нашите потребители да си генерират частен ключ и заявка за сертификат, която ние да подпишем и с помоща на подписаният от нас сертификат те да си генерират PKCS#12 файл, който да внесат в пощенския си клиент.
От потребителска страна се изпълнява следната команда:

$ openssl req -new -nodes -keyout newkey.pem -out newreq.pem

Заявката за сертификат (newreq.pem) се изпраща по надежден начин до управляващият CA, който преглежда заявката и я подписва чрез:

# ./CA.pl -signreq

За да се позволи изпращането на поща потребителският сертификат се трябва да се опише и да се укаже на Postfix да иска потребителски сертификат и списъкът на валидните сертификати. В main.cf се добавя:

# Relay users with certificate
smtpd_tls_ask_ccert = yes
relay_clientcerts = hash:/etc/postfix/ssl/relay_clientcerts

а в реда на smtpd_recipient_restrictions се добавя и permit_tls_clientcerts:

smtpd_recipient_restrictions =
permit_mynetworks,
permit_tls_clientcerts,

Сертификатът се описва чрез отпечатъка си в /etc/postfix/ssl/relay_clientcerts. Отпечатъкът се генерира чрез:

# openssl x509 -fingerprint -noout -in newcert.pem | cut -d= -f2

и се добавя в relay_clientcerts, като може да се поясни и чий е той:

15:B5:3E:3F:1B:CF:AD:B4:CA:CB:E9:A8:BB:BB:50:14 peio@linux-bg.org

/etc/postfix/ssl/relay_clientcerts е стандартен за Postfix hash формат и затова трябва да се компилира чрез:

# postmap /etc/postfix/ssl/relay_clientcerts

И конфигурацията да се презареди:

# /etc/init.d/postfix reload

Подписаният сертификат (newcert.pem) се изпраща обратно на потребителя, който създава PKCS#12 файл с командата:

$ openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -certfile cacert.pem -name „Linux-BG Certificate“ -out user-linux-bg.p12

Където cacert.pem e сертификата на подписващото CA.

Новосъздаденият .p12 файл заедно със сертификата на CA се внасят в пощенския клиент на потребителя, като се указва ползването на TLS за свързването към този пощенски сървър. След успешното им внасяне потребителят трябва да може да се автентикира само чрез своя сертификат.

Postfix като TLS клиент
За да дадем възможност за използване на TLS, когато нашия пощенски сървър се свързва като клиент с други се указва използването на сертификати чрез следните настройки в main.cf:

# TLS client
smtp_use_tls = yes
smtp_tls_key_file = /etc/postfix/ssl/key.pem
smtp_tls_cert_file = /etc/postfix/ssl/cert.pem
smtp_tls_CAfile = /etc/postfix/ssl/cacert.pem

За съжаление тази възможност съм виждал да се се използва единствено в корпоративните комуникации или между сървърите на организации, които тясно си сътрудничат. Екипът на Linux-BG е готов да обмени сертификати с организации, които проявяват интерес в установяването на надеждна връзка между пощенските ни сървъри.

От по-популярните пощенски сървъри TLS подръжка имат: Sendmail, qmail (чрез пач), Exim, courier-mta. Дори и да няма вградена TLS подръжка е възможно установяването на сигурна комуникация чрез използването на stunnel, който има версия дори и за Windows.

Полезни четива

Заключение
Тъй като тази статия съм я писал повече по памет и не съм изпълнявал стъпките в нея една след друга са възможни пропуски и неточности. Моля да ми съобщите, ако намерите такива.



<< Ограничаване на достъпа чрез mod_ssl | Greylisting с Postgrey >>