На сегодняшний день этот метод обмена электронными данными представляет собой наибольшую угрозу из-за возможности раскрытия информации третьим лицам и, соответственно, может сыграть необратимую роль в судьбе организации. Механизму предотвращения подобных ситуаций и посвящена эта небольшая статья.
Каждый уважающий себя администратор (естественно, в меру своих знаний) не обходит стороной такие вещи как 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# 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 это делается так:
Эта команда сгенерирует секретный 1024-битный ключ RSA, где опция
-rand - это входные данные, необходимые для того, что бы получить надежный псевдослучайный набор простых чисел. Также нам необходимо будет ввести ключевое слово - пароль на секретный ключ, который нужно запомнить. Итак, ключ, с помощью которого мы сможем дешифровать данные, создан. Назначим на него права, которые будут беречь его от посторонних глаз:
terminal# chmod 700 sendmail.key
Конечно же, мы не зря выбрали такое имя ключа - это поможет нам избежать путаницы.
На основе нашего секретного ключа создадим его публичную часть. Сделать это можно следующем образом:
Здесь rsautl - это алгоритм шифрования, in file.txt – файл, нуждающийся в шифровании (его подаем на вход), out file.crypt – шифрованный файл, который будет получаться на выходе, inkey pubsendmail.pem – ключ, с помощью которого мы будем шифровать файл file.txt, а pubin и encrypt – аргументы, которые сообщают программе rsault, что надо совершить шифрование с помощью открытого ключа.
В результате этой команды из файла file.txt будут извлечены чистые данные, которые программа rsault зашифрует и выдаст результат в файл file.crypt. Для того чтобы дешифровать файл file.crypt с помощью OpenSSL нужно совершить следующее:
Файл file.decrypt содержит дешифрованный текст, который был в исходном состоянии в файле file.txt. Итак, мы разобрались с базовым понятием криптографии при помощи шифрования с использованием открытого ключа.
сертификаты
Представь, что наш открытый ключ подписала некая доверительная (сторонняя) организация. Теперь такой открытый ключ будет являться не просто ключом, а целым сертификатом, удостоверяющим пользователей в том, что данный ключ несет полную гарантию целостности зашифрованных данных и является настоящей собственностью владельца сертификата. Это и есть понятие сертификата. Иначе говоря, существует некий публичный ключ и его подписал некий доверительный центр (своим дайджестом или чем-либо еще). Данный ключ действительно является публичным ключом владельца, и после подписания он превращается в доверительный сертификат и может быть использован. Для того чтобы правильно сформировать открытый ключ, из которого мы будем формировать сертификат (в OpenSSL этим занимается программа req), нужно сделать следующее:
После ввода нашего секретного пароля на экран выпадет некий диалог, анкета, которую необходимо будет заполнить, после чего в файле sendmail.csr будет записана информация, взятая из заполняемой анкеты и часть приватного ключа в виде открытых данных (публичный ключ).
Затем файл sendmail.csr необходимо направить доверительному центру CA, где его удостоверят подписью СА на основе дайджеста корневого сертификата и произведут кое-какие изменения, после чего и получится наш сертификат. Стоит отметить, что данная процедура не бесплатна: стоит она примерно 300 американских президентов (такова платная сторона бесплатного GPL, подробнее читаем Крис Касперски «Платная сторона бесплатного GPL»). Но не стоит отчаиваться: не все в этом мире строится на деньгах и уважении. Почему бы самому не подписать свой сертификат? Правда это будет не совсем то, но работать будет. Таким образом мы подошли к понятию самоподписанных сертификатов. Такие сертификаты подобны корневым сертификатам CA центров ;).
Как же создать такой сертификат? Для этого нужно файл sendmail.crt подписать дайджестом на основе секретного ключа. Это может сделать программа x509:
Вот так мы создадим сертификат в виде файла sendmail.crt, который будет действителен 3666 дней. Теперь для нас важны два файла - sendmail.key и sendmail.crt. На них мы и будем базировать криптоподдержку в службах.
Группы, работающие в сетевой безопасности, различают несколько уровней шифрования данных, передаваемых по сети. Они начинаются на сетевом уровне IP и заканчиваются седьмым уровнем приложений. Мы же рассмотрим шифрование на транспортном уровне, называемое SSL/TLS (TLS – это SSL v3.1), так как данный уровень подходит почти ко всем приложениям и является для них прозрачным. Программа sendmail умеет работать на этом уровне, то есть она способна предоставлять клиентам шифрованную передачу электронных почтовых сообщений посредством SMTP-трафика.
Подразумевается, что некоторый опыт установки sendmail у тебя уже есть (в крайнем случае, документацию всегда можно найти в internet), поэтому некоторые моменты, относящиеся к настройке sendmail мы не будем комментировать.
Итак, закачиваем свежую стабильную версию sendmail в уже известный каталог /tmp/sandbox и распаковываем trball.
В каталоге создаем файл 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 из исходных кодов) добавляем строчки:
Итак, создали конфигурационный файл и сохранили его. Далее конфигурационный файл sendmail (на языке m4) необходимо преобразовать в конфигурационный файл, который должна понимать программа sendmail. Делаем это так:
Далее нужно инсталлировать созданный файл 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 (которые у нас уже имеются) и заходим в этот каталог:
В результате мы получили секретный файл sendmail.pem. И я думаю, что закономерный вопрос, возникший у читателя относительно файла sendmail.pem в конфигурационном файле sendmail.mc, исчерпан :).
Назначаем права 700 на каталог с сертификатами /etc/mail/certs, а файлы /etc/sandbox/sendmail.key,
/etc/sandbox/sendmail.csr и /etc/sandbox/sendmail.crt нужно удалить:
Перед тем, как запускать sendmail, нам необходимо создать некоторых хешей и просто файлов, необходимых для работы sendmail. Поэтому изволь почитать соответствующее руководство на нашем диске :).
terminal# cd /etc/mail
Если файла aliases нет, создаем его:
terminal# touch aliases
Обязательно делаем newaliases:
terminal# newaliases
Создаем файл с доверительными и недоверительными хостами:
Осталось только запустить sendmail и проверить наличие поддержки шифрования (если запустить sendmail не получается, возможно, где-то допущена ошибка). Смотрим логи:
Если все прошло нормально, то программа 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 должен содержать строчку:
Если в системе порт 995 не «забиндился», значит что-то было упущено, и нужно зачитать логи stunnel. Если все заработало, то можно проверять с помощью s_client наличие предоставляемого сертификата сервисом:
Вкратце объясним, как работает данный механизм. Дело в том, что демон inetd делает службу popa3d доступной только из локального адреса, в свою очередь, демон stunel подключается к службе pop3 и становится посредником между клиентом и pop3-службой, организуя шифрованное соединение между собой и клиентом, на своем порту (в данном случае – 995). Все просто и тривиально.
пишите письма!
Вот мы и подошли к логическому завершению. В результате мы, кажется, разобрались с основными понятиями криптографии с помощью открытого ключа, познакомились с такими понятиями как ЭЦП и сертификат, научились теоретически и практически применять эти знания на практике в виде реальных рабочих систем. Удачи на ниве системного администрирования!