sendmail & STARTTLS
2014-01-20 20:55Как включить поддержку шифрования почты в протоколе SMTP для FreeBSD и штатного sendmail, в ужасном стиле безграмотных "хаутушек". Контекст - полное отсутствие доверия к публичным центрам сертификации, продающим сертификаты за деньги и желание закрыть SMTP-трафик от тупых СОРМ2-снифферов без попытки защититься от man-in-the-middle.
- Устанавливаем cyrus-sasl2 из портов или пакетов.
- В /etc/make.conf добавляем строчки:
SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2
Пересобираем штатный sendmail с поддержкой SASL:
cd /usr/src/lib/libsmutil make cleandir && make obj && make cd /usr/src/lib/libsm make cleandir && make obj && make cd /usr/src/usr.sbin/sendmail make cleandir && make obj && make && make install
Эта часть позаимствована из Handbook.
- Создаём сертификаты.
Берем вот этот скрипт: make-server-key, кладем его в /etc/mail. Туда же кладем openssl.cnf.diff.
Редактируем начало скрипта, подставляя в servername имя почтового сервера (для содержимого сертификата), в shortname короткое имя сервера для именования файла сертификата, в contact адрес электронной почты (для соответствующего поля сертификата), в days время действия сертификата, в pass пароль для шифрования приватного ключа создаваемого скриптом самоподписанного Certificate Authority (CA), в answers - ответы на стандартные вопросы openssl, которые он задаёт при генерации сертификатов. А можно ничего не редактировать, оставить дефолты (нигилизм mode on).
Запускаем скрипт, он полностью автоматически создаёт в /etc/mail подкаталоги CA и certs, в которых генерирует самодельный Certificate Authority, а так же выданный им сертификат для sendmail. По умолчанию срок действия 10 лет.
Берем sendmail.mc.add, меняем в нём myserver на shortname, прописанный в make-server-key (или, опять же, ничего не меняем). Дописываем строчки из него в свой .mc-файл, пересобираем и переустанавливаем конфиг, рестартуем sendmail.
Всё. Теперь те сервера, которые тоже поддерживают STARTTLS и которым неважно, что сертификат самодельный, станут шифровать SMTP-трафик при отправке нам почты, или при приёме от нас. В /var/log/maillog для таких шифрованных сессий будут писаться слова типа STARTTLS=server, version=TLSv1/SSLv3, cipher=DHE-RSA-AES256-SHA, bits=256/256
В конторе, имеющей собственный почтовый домен и сервер, возникла необходимость рассылать внутренние уведомления не только в почтовые ящики пользователей, но и в некоторых случаях одновременно дублировать тему писем (subject) как SMS на мобильные номера сотрудников.
Выдалось попробовать настроить sendmail
на отправку почты определенному релею, требующему SMTP AUTH. Для FreeBSD 8.0-RC1 оказалось довольно просто.
- Читаем Handbook, игнорируя пункты о редактировании
/usr/local/lib/sasl2/Sendmail.conf
и установкеsaslauthd
, так как нам нужна авторизация не при приёме почты от клиентов, а только при отправке, когда самsendmail
выступает клиентом. - По той же причине вместо
TRUST_AUTH_MECH
иconfAUTH_MECHANISMS
вставляемFEATURE(authinfo)
в .mc-файл, чтобыsendmail
читал имена/пароли/явки из /etc/mail/authinfo - В /etc/mail/Makefile.local добавляем:
SENDMAIL_MAP_SRC+=authinfo
В /etc/mail/authinfo пишем:AuthInfo:relay.host.name "U:username@domain.ru" "I:username@domain.ru" "M:PLAIN" "P:password"
(эти заклинания документированы вsrc/contrib/sendmail/cf/README
)
На самом деле,sendmail
читает не сам файлauthinfo
, а его хешированный вариантauthinfo.db
, поэтомуauthinfo
, содержаший пароли, желательно запретить для чтения всем кроме тех, кому положено. Командаmake
в/etc/mail
создаётauthinfo.db
, у которого уже будут достаточные для чтения самимsendmail
привилегии. - Перегенерируем .cf и .db-файлы (
make all install
в/etc/mail
), рестартуемsendmail
. Всё.