Документация по ОС FreeBSD Среда, 08.05.2024, 23:59
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Mail

Пламенный почтовик [2006]

На сегодняшний день этот метод обмена электронными данными представляет собой наибольшую угрозу из-за возможности раскрытия информации третьим лицам и, соответственно, может сыграть необратимую роль в судьбе организации. Механизму предотвращения подобных ситуаций и посвящена эта небольшая статья.

Каждый уважающий себя администратор (естественно, в меру своих знаний) не обходит стороной такие вещи как SSL(Secure Sockets Layer), IPSec (Internet Protocol Security), etc, поскольку эти понятия являются базовыми для защиты информации. К сожалению, не все организации способны содержать в штате и администратора и специалиста по сетевой защите информации, поэтому многим админам приходится совмещать эти должности. Следовательно, на него ложится двойная ответственность. И чтобы помочь нашему читателю избежать связанного с этой ответственностью небольшого нагоняя от начальства, разберем один из методов на примере настройки корпоративного почтового сервера с поддержкой шифрования данных.

в бой!

Начнем мы с установки и настройки криптомеханизма OpenSSL (www.openssl.org), поскольку этот механизм свободен в использовании, не требует каких-либо дополнительных соглашений (кроме GPL) и ни в чем не уступает своим платным коллегам. Скачиваем исходные коды с последним стабильным дистрибутивом OpenSSL c ресурса www.openssl.org/source (кстати, не забудь вставить в дисковод наш диск – там присутствует весь необходимый для статьи софт). Так же можно позволить себе скачать последнюю LATEST-версию www.openssl.org/source/openssl-0.9.8b.tar.gz. Скачал? Теперь распаковывай дистрибутив в любой подходящий каталог. Например, в /tmp/sandbox:

terminal# mkdir /tmp/sandbox
terminal# cd /tmp/sandbox/
 
Распознается www.openssl.org... 195.30.6.166
Connecting to www.openssl.org|195.30.6.166|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 3,279,283 (3.1M) [application/x-tar]
Загружено... 100%
17:43:43 (33.16 KB/s) - `openssl-0.9.8b.tar.gz' saved [3279283/3279283]

terminal# tar -zxvf /tmp/sandbox/openssl-0.9.8b.tar.gz

Привычным образом конфигурируем, компилируем и устанавливаем программу:

terminal# cd /tmp/sandbox/openssl-0.9.8b
terminal# ./config
terminal# make all
terminal# make test
terminal# make install
terminal# rehash
 
С установкой OpenSSL разобрались, что не может не радовать. А что же все-таки такое OpenSSL? Проще говоря, это комплекс (набор программ и библиотек) по управлению механизмом криптографии. Сюда входят функции и программы, которые обеспечивают основные алгоритмы и методы для шифрования. Большинство GPL- программ, таких как MySQL, Sendmail, OpenLDAP, etc используют библиотеки, которые предоставляет пакет OpenSSL. С помощью программ, которые предоставляет комплекс OpenSSL, мы сможем управлять механизмом закрытых и открытых ключей, а также обеспечивать ЭЦП и выпускать сертификаты. Уверен, что с теорией симметричного и ассиметричного шифрования знакомы все, поэтому не будем заниматься скучными рассказами про Алису и Боба, которые пишут друг другу секретные письма эротического содержания :), а погрузимся в практику. Если мы хотим создать пару с закрытым и открытым ключом, то в OpenSSL это делается так:

openssl genrsa -des3 -rand /usr/local/games/doom3-linux-1.3.1302.x86.run -out sendmail.key 1024

Эта команда сгенерирует секретный 1024-битный ключ RSA, где опция

-rand - это входные данные, необходимые для того, что бы получить надежный псевдослучайный набор простых чисел. Также нам необходимо будет ввести ключевое слово - пароль на секретный ключ, который нужно запомнить. Итак, ключ, с помощью которого мы сможем дешифровать данные, создан. Назначим на него права, которые будут беречь его от посторонних глаз:

terminal# chmod 700 sendmail.key

Конечно же, мы не зря выбрали такое имя ключа - это поможет нам избежать путаницы.
На основе нашего секретного ключа создадим его публичную часть. Сделать это можно следующем образом:

terminal# openssl rsa -in sendmail.key -out pubsendmail.pem -pubout

Для того чтобы зашифровать какое-либо текстовое сообщение при помощи публичного ключа, необходимо выполнить следующую команду:

terminal# openssl rsautl -in file.txt -out file.crypt -inkey pubsendmail.pem -pubin -encrypt

Здесь rsautl - это алгоритм шифрования, in file.txt – файл, нуждающийся в шифровании (его подаем на вход), out file.crypt – шифрованный файл, который будет получаться на выходе, inkey pubsendmail.pem – ключ, с помощью которого мы будем шифровать файл file.txt, а pubin и encrypt – аргументы, которые сообщают программе rsault, что надо совершить шифрование с помощью открытого ключа.

В результате этой команды из файла file.txt будут извлечены чистые данные, которые программа rsault зашифрует и выдаст результат в файл file.crypt. Для того чтобы дешифровать файл file.crypt с помощью OpenSSL нужно совершить следующее:

terminal# openssl rsautl -in file.crypt -out file.decrypt -inkey server.key -decrypt

Файл file.decrypt содержит дешифрованный текст, который был в исходном состоянии в файле file.txt. Итак, мы разобрались с базовым понятием криптографии при помощи шифрования с использованием открытого ключа.

сертификаты

Представь, что наш открытый ключ подписала некая доверительная (сторонняя) организация. Теперь такой открытый ключ будет являться не просто ключом, а целым сертификатом, удостоверяющим пользователей в том, что данный ключ несет полную гарантию целостности зашифрованных данных и является настоящей собственностью владельца сертификата. Это и есть понятие сертификата. Иначе говоря, существует некий публичный ключ и его подписал некий доверительный центр (своим дайджестом или чем-либо еще). Данный ключ действительно является публичным ключом владельца, и после подписания он превращается в доверительный сертификат и может быть использован. Для того чтобы правильно сформировать открытый ключ, из которого мы будем формировать сертификат (в OpenSSL этим занимается программа req), нужно сделать следующее:

terminal# openssl req -new -key sendmail.key -out sendmail.csr

После ввода нашего секретного пароля на экран выпадет некий диалог, анкета, которую необходимо будет заполнить, после чего в файле sendmail.csr будет записана информация, взятая из заполняемой анкеты и часть приватного ключа в виде открытых данных (публичный ключ).

Затем файл sendmail.csr необходимо направить доверительному центру CA, где его удостоверят подписью СА на основе дайджеста корневого сертификата и произведут кое-какие изменения, после чего и получится наш сертификат. Стоит отметить, что данная процедура не бесплатна: стоит она примерно 300 американских президентов (такова платная сторона бесплатного GPL, подробнее читаем Крис Касперски «Платная сторона бесплатного GPL»). Но не стоит отчаиваться: не все в этом мире строится на деньгах и уважении. Почему бы самому не подписать свой сертификат? Правда это будет не совсем то, но работать будет. Таким образом мы подошли к понятию самоподписанных сертификатов. Такие сертификаты подобны корневым сертификатам CA центров ;).

Как же создать такой сертификат? Для этого нужно файл sendmail.crt подписать дайджестом на основе секретного ключа. Это может сделать программа x509:

terminal# openssl x509 -req -days 3666 -in sendmail.csr -signkey sendmail.key -out sendmail.crt

Вот так мы создадим сертификат в виде файла sendmail.crt, который будет действителен 3666 дней. Теперь для нас важны два файла - sendmail.key и sendmail.crt. На них мы и будем базировать криптоподдержку в службах.

Группы, работающие в сетевой безопасности, различают несколько уровней шифрования данных, передаваемых по сети. Они начинаются на сетевом уровне IP и заканчиваются седьмым уровнем приложений. Мы же рассмотрим шифрование на транспортном уровне, называемое SSL/TLS (TLS – это SSL v3.1), так как данный уровень подходит почти ко всем приложениям и является для них прозрачным. Программа sendmail умеет работать на этом уровне, то есть она способна предоставлять клиентам шифрованную передачу электронных почтовых сообщений посредством SMTP-трафика.

Подразумевается, что некоторый опыт установки sendmail у тебя уже есть (в крайнем случае, документацию всегда можно найти в internet), поэтому некоторые моменты, относящиеся к настройке sendmail мы не будем комментировать.

Итак, закачиваем свежую стабильную версию sendmail в уже известный каталог /tmp/sandbox и распаковываем trball.

terminal# cd /tmp/sandbox/
tar -zxvf sendmail.8.13.7.tar.gz
terminal# tar -zxvf sendmail.8.13.7.tar.gz
 
Заходим в каталог sendmail-8.13.7/devtools/Site/:

terminal# cd sendmail-8.13.7/devtools/Site/

В каталоге создаем файл site.config.m4 на редактирование:

terminal# ee site.config.m4

В файл site.config.m4 вписываем следующие строчки:

dnl Stuff for TLS
APPENDDEF(`confINCDIRS', `-I/usr/local/include')
APPENDDEF(`confLIBDIRS', `-L/usr/local/lib')
APPENDDEF(`conf_sendmail_ENVDEF', `-DSTARTTLS')
APPENDDEF(`conf_sendmail_LIBS', `-lssl -lcrypto')

Сохраняем файл site.config.m4 и выходим из него. Если планируется прикрутить к sendmail антиспам-фильтр, антивирусный пакет или и то и другое, тогда в тот же файл site.config.m4 необходимо добавить строчку с поддержкой мильтера:

#MILTER
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')

А теперь переходим в каталог ../../libmilter/ и собираем библиотеки с поддержкой мильтера:

terminal# cd ../../libmilter/
terminal# ./Build -c

Далее заходим в каталог ../cf/cf/ и создаем в нем файл:

sendmail.mc:
terminal# cd ../cf/cf/
terminal# ee sendmail.mc

В файл sendmail.mc (подразумевается, что у тебя уже есть опыт установки sendmail из исходных кодов) добавляем строчки:

define(`confCACERT_PATH',`/etc/mail/certs')
define(`confCACERT',`/etc/mail/certs/sendmail.pem')
define(`confSERVER_CERT',`/etc/mail/certs/sendmail.crt')
define(`confSERVER_KEY',`/etc/mail/certs/sendmail.pem')
define(`confCLIENT_CERT',`/etc/mail/certs/sendmail.crt')dnl
define(`confCLIENT_KEY',`/etc/mail/certs/sendmail.pem')dnl

Это и есть наш минимальный рабочий конфигурационный файл sendmail на языке m4:

divert(0)
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v GO TO HELL')
OSTYPE(freebsd6)
DOMAIN(generic)
FEATURE(use_ct_file)
FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')
FEATURE(relay_based_on_MX)
define(`confCACERT_PATH',`/etc/mail/certs')
define(`confCACERT',`/etc/mail/certs/sendmail.pem')
define(`confSERVER_CERT',`/etc/mail/certs/sendmail.crt')
define(`confSERVER_KEY',`/etc/mail/certs/sendmail.pem')
define(`confCLIENT_CERT',`/etc/mail/certs/sendmail.crt')dnl
define(`confCLIENT_KEY',`/etc/mail/certs/sendmail.pem')dnl
dnl TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
dnl define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
dnl define(`confDEF_AUTH_INFO', `/etc/mail/auth/auth-info')dnl
DAEMON_OPTIONS(`Name=MTA')dnl
DAEMON_OPTIONS(`Port=465, Name=MTA-SSL, M=s')dnl
define(`confMAX_RCPTS_PER_MESSAGE', `10')
define(`confMAX_MESSAGE_SIZE', `1048576')
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confMAX_MIME_HEADER_LENGTH', `256/128')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
MAILER(local)
MAILER(smtp)

Итак, создали конфигурационный файл и сохранили его. Далее конфигурационный файл sendmail (на языке m4) необходимо преобразовать в конфигурационный файл, который должна понимать программа sendmail. Делаем это так:

terminal# m4 ../m4/cf.m4 sendmail.mc > sendmail.cf

Далее нужно инсталлировать созданный файл sendmail.cf. Исторически, место назначения - каталог /etc/mail (и далее под понятием каталога sendmail будем подразумевать каталог /etc/mail). Вперед:

terminal# make install-cf CF=sendmail

Ну что же, приступим непосредственно к самой сборке и установке sendmail. Переходим из каталога cf/cf/ на два уровня выше и выполняем скрипт Build:

terminal# cd ../../
terminal# ./Build -c

Далее выполняем Build install:

terminal# ./Build install

С установкой sendmail покончено. Теперь необходимо выполнить условия, описанные в конфигурационном файле относительно директив

confCACERT_PATH,confCACERT,confSERVER_CERT,confSERVER_KEY, confCLIENT_CERT,confCLIENT_KEY. Создаем каталог /etc/mail/certs, копируем в него файлы sendmail.key и sendmail.crt (которые у нас уже имеются) и заходим в этот каталог:

terminal# mkdir /etc/mail/certs
terminal# cp /tmp/sandbox/sendmail.key /tmp/sandbox/sendmail.crt \
/etc/mail/certs/
terminal# cd /etc/mail/certs

Теперь нужно избавиться от пароля в секретном файле sendmail.key. Свершим это при помощи программы rsa:

terminal# openssl rsa -in sendmail.key -out sendmail.pem

В результате мы получили секретный файл sendmail.pem. И я думаю, что закономерный вопрос, возникший у читателя относительно файла sendmail.pem в конфигурационном файле sendmail.mc, исчерпан :).

Назначаем права 700 на каталог с сертификатами /etc/mail/certs, а файлы /etc/sandbox/sendmail.key,

/etc/sandbox/sendmail.csr и /etc/sandbox/sendmail.crt нужно удалить:

terminal# chmod -R 700 /etc/mail/certs
terminal# cd /tmp/sandbox
terminal# rm sendmail.key sendmail.csr sendmail.crt

Перед тем, как запускать sendmail, нам необходимо создать некоторых хешей и просто файлов, необходимых для работы sendmail. Поэтому изволь почитать соответствующее руководство на нашем диске :).

terminal# cd /etc/mail

Если файла aliases нет, создаем его:

terminal# touch aliases

Обязательно делаем newaliases:

terminal# newaliases

Создаем файл с доверительными и недоверительными хостами:

terminal# touch access
terminal# makemap hash access.db < access
terminal# touch virtusertable
terminal# makemap hash virtusertable.db < virtusertable
terminal# makemap hash mailertable.db < mailertable
terminal# touch local-host-names

Осталось только запустить sendmail и проверить наличие поддержки шифрования (если запустить sendmail не получается, возможно, где-то допущена ошибка). Смотрим логи:

terminal# sendmail -bd -q10m
terminal# openssl s_client -host localhost -port 465

5 минут – полет нормальный?

Если все прошло нормально, то программа s_client сможет подключиться на порт 465 (защищенный порт SMTP/SSMTP), а нам на экран выпадет сертификат сервера с публичным ключом. SMTP-службу мы защитили, осталось защитить службу POP, иначе теряется весь смысл защиты почтового сервера. В качестве POP-демона мы рекомендуем использовать программу popa3d, написанную русским хакером Solar Designer (Sergey Samoyloff). Программа является официальным дистрибутивом для FreeBSD и находится в портах FreeBSD /usr/ports/mail/popa3d.

В исходных кодах по умолчанию popa3d настроена для сборки под Linux-машину, поэтому нужно привести необходимые рекомендации по корректировке этого демона для BSD-систем. Итак, скачиваем последний дистрибутив popa3d с сайта Solar Designer’а www.openwall.com/popa3d. Распаковываем дистрибутив с «попой», заходим в каталог с его исходными кодами, открываем файл params.h на редактирование и находим строчки:
 
#define AUTH_PASSWD 0
#define AUTH_SHADOW 1
#define AUTH_PAM 0
#define AUTH_PAM_USERPASS 0
#define USE_LIBPAM_USERPASS 0

После чего приводим строчки в такой вид (cохраняем и выходим из редактора):

#define AUTH_PASSWD 1
#define AUTH_SHADOW 0
#define AUTH_PAM 0
#define AUTH_PAM_USERPASS 0
#define USE_LIBPAM_USERPASS 0

Теперь открываем файл Makefile на редактирование. Раскомментируем строчки: CFLAGS += -DHAVE_OPENSSL, LIBS += -lcrypt, LIBS += -lcrypto. Все, теперь можно компилировать и инсталлировать программу.

После того, как мы поставили и запустили popa3d, нужно установить еще один программный продукт, который будет заниматься шифрованием POP3-трафика. Наиболее доступным и достаточно простым в использовании для организации SSL является программа Stunnel. Можно поставить ее непосредственно из исходных кодов, но лучше сделать это из программных портов FreeBSD: /usr/ports/security/stunnel.

Вот мы и установили stunnel без всякого физического напряжения.

Создаем конфигурационный файл /usr/local/etc/stunnel/stunnel.conf и открываем его на редактирование. В файл вписываем следующие строчки:

cert = /usr/local/etc/stunnel/stunnel.crt
key = /usr/local/etc/stunnel/stunnel.pem
;RNDfile = /usr/local/etc/stunnel/stunnel.rnd
chroot = /usr/local/var/stunnel/
setuid = stunnel
setgid = stunnel
pid = /run/stunnel.pid
output = /var/log/stunnel.log
ciphers = HIGH
debug = 6
compression = rle
[pop3s]
accept = 995
connect = 127.0.0.1:110

А теперь - создаем chroot директорию и устанавливаем соответствующие права:

terminal# cd /usr/local/var && mkdir stunnel && cd stunnel
terminal# mkdir etc && touch hosts.allow
terminal# mkdir run
terminal# chown -R stunnel:stunnel run

В файл /usr/local/var/stunnel/hosts.allow пишем следующие строчки:

pop3s : ALL : allow
ALL : ALL : deny

В каталоге /usr/local/etc/stunnel/ создаем пару ключей stunnel.key (stunel.pem) ,stunel.csr, а также сертификат stunel.crt – это мы уже научились делать. Назначаем необходимые права на ключ. Если мы правильно установили popa3d(согласно документации по установке), то файл /etc/inetd.conf должен содержать строчку:

pop3 stream tcp nowait root /usr/local/sbin/popa3d popa3d

Все что нам остается - это перезагрузить демон inetd со следующими параметрами:

-wWa 127.0.0.1, далее запускаем демон Stunnel:

terminal# /usr/local/sbin/stunnel \ usr/local/etc/stunnel/stunnel.conf

Если в системе порт 995 не «забиндился», значит что-то было упущено, и нужно зачитать логи stunnel. Если все заработало, то можно проверять с помощью s_client наличие предоставляемого сертификата сервисом:

terminal# openssl s_client -host localhost -port 995

Вкратце объясним, как работает данный механизм. Дело в том, что демон inetd делает службу popa3d доступной только из локального адреса, в свою очередь, демон stunel подключается к службе pop3 и становится посредником между клиентом и pop3-службой, организуя шифрованное соединение между собой и клиентом, на своем порту (в данном случае – 995). Все просто и тривиально.  

пишите письма!

Вот мы и подошли к логическому завершению. В результате мы, кажется, разобрались с основными понятиями криптографии с помощью открытого ключа, познакомились с такими понятиями как ЭЦП и сертификат, научились теоретически и практически применять эти знания на практике в виде реальных рабочих систем. Удачи на ниве системного администрирования!

 
первая "openssl s_client показывает, что smtp протокол защищен сертификатом"
вторая "Список программ, предоставляемых комплексом openssl"
третья "pop3 протокол защищен сертефикатом"


Источник: http://www.xakep.ru/magazine/xs/069/040/1.asp
Категория: Mail | Добавил: oleg (07.03.2008) | Автор: ВОЛЬФ Д. А. AKA PAYHASH
Просмотров: 1569 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024