Про Линукс. Простым языком

19.06.2007

Безопасность в туннеле, или stunnel на страже коммуникаций

Filed under: Практика — timothy_ha @ 20:18

На днях столкнулся реальной проблемой, которая отняла у меня немало часов возни со своим Linux’ом – я отправился в отпуск с ноутбуком (конечно, отпуск это отрада, а не проблема). Вроде Wi-Fi интерфейс есть, Linux работает и подсоединяется с Интернетом везде. Но все коммуникации (почта, Web, ICQ, Yahoo Messenger) идут по тем каналам, которые я совсем не знаю – кто их прослушивает, как они фильтруются и т.п. Совсем не хотелось в какой-нибудь гостинице “случайно” потерять свои пароли, которые в случае FTP, ICQ или многих веб-сайтов (например, форумов, где я участвую, или блогов, где пишу) идут открытым текстом в TCP/IP трафике. Ведь в наше время любой администратор сети может поставить программу-сниффер для прослушивания локальной сети и автоматического сбора паролей. Вот и пришлось повозиться, решая данную задачу.

С почтой кое-как разобрался. Настроил почтовый сервер в компании на работу с SSL как при получении, так и при отправке. Но что делать с другим трафиком? Было два варианта: настроить VPN-сервер на сервере фирмы и ходить через этот канал (поверх канала, который предоставляет местный провайдер), или же построить шифрованный туннель посредством маленькой программы stunnel. Почему-то OpenVPN не получилось настроить даже после двух дней изучения – признаюсь, был занят отпускными хлопотами, не разобрался – поэтому я вспомнил про stunnel.

Stunnel (веб-сайт stunnel.org) это маленькая программа, которая сидит как на серверной, так и на клиентской стороне, чтобы соединить два порта (клиентский и серверный) шифрованным каналом. Ее часто используют, чтобы добавить “секурный” порт веб-серверу, который не поддерживает SSL, или то же самое – почтовому серверу, работающему только по POP3 и только на 110-м порте. Серверный скрипт “вешается” на порт 443 и передает (внутри сервера) все запросы на порт 80 – в случае веб-сервера. Весь трафик от клиента до сервера идет по надежному каналу, а внутренний трафик никто прослушать уже не сможет, не взломав сам сервер.

Что же надо сделать на стороне клиента? Поставив stunnel на клиентскую машину, можно запрашивать не 80-й порт сервера, а 80-й порт локальной машины, а уже с этого порта будет туннель на 443-й порт сервера. Конечно, тут пример неудачный получился, потому что современные браузеры и так умеют общаться с 443-ми портами веб-серверов. Но в моем случае надо было защитить еще и “аську”. По этой причине я решил, что все программы, работающие с Интернетом, будут использовать прокси, а общаться с прокси буду по защищенному каналу. Следовательно, была выбрана такая архитектура:

  1. на сервере прокси-сервер squid слушает запросы на порте 3128, как обычно. Прокси запрашивает пароль при первом входе
  2. на сервере stunnel слушает порт 3129 (взят с потолка), перенаправляя все запросы на 3128
  3. на клиенте stunnel слушает порт 3128 и соединяется с сервером на 3129 защищенным образом
  4. все программы настроены на работу с “прокси-сервером” по адресу 127.0.0.1: 3128.

Теперь все программы общаются с местным прокси “открытым текстом”. Этот текст затем шифруется и отправляется по туннелю на сервер и там обрабатывается. Результат запроса (страницы веба, сообщения от людей и т.п.) возвращаются по туннелю на мою машину. Теперь ни один человек не сможет это перехватить! Конечно теоретически :-) , а практически, может быть, моя машина дырявая.

Но теперь работать стало значительно спокойнее. Думаю, что и дома буду продолжать использовать установленный туннель. Зачем ломать то, что работает, при том, что оно еще и надежнее, чем обычно.

Кому интересно, как я все настроил, то настройки были произведены следующие. Напомню, что работаю в основном с Redhat-серверами и Fedora на десктопе. На обоих концах я установил stunnel (up2date -i stunnel на сервере и yum install stunnel на десктопе). У меня версия 4, поэтому конфигурационные файлы приводятся для этой версии. Внимание! На сайте stunnel.org пока что устаревшая документация, формат команд от третьей версии…

Сервер: файл /etc/stunnel/stunnel.conf

[root@www root]# more /etc/stunnel/stunnel.conf
# Provide the full path to your certificate-key pair file
cert = /etc/stunnel/stunnel.pem
# lock the process into a chroot jail
chroot = /var/run/stunnel/
# and create the PID file in this jail
pid = /stunnel.pid
# change the UID and GID of the process for security reasons
setuid = nobody
setgid = nobody

# Configure our secured services
##debug = 7
##output = /var/log/stunnel.log
[ssquid]
accept = 3129
connect = 3128

Всего несколько строчек (не считая комментариев)!

Клиент: тоже /etc/stunnel/stunnel.conf

[tim@localhost ~]$ sudo more /etc/stunnel/stunnel.conf
Password:
cert = /etc/stunnel/stunnel.pem
# chroot = /var/tmp/stunnel

# PID is created inside chroot jail
# pid = /stunnel.pid

#setuid = stunnel
#setgid = stunnel

client = yes

##debug = 7
##output = /var/log/stunnel.log

[3129]
accept = 3128
connect = адрес_IP_сервера:3129

Тоже всего чуть-чуть! Разница только в флаге client=yes и адресе для параметра connect. Архитектура очень прозрачная.

Я также хотел бы помочь тем, кто устанавливает это впервые – я сам испытал это на себе – не сразу понятно, откуда взять нужный stunnel.pem – ключ для шифрования канала. Его можно сгенерировать из веб-интерфейса на stunnel.org, но это если совсем туго и у меня полученный ключ не работал – видимо, сайт генерит его для старой версии 3. Но затем я нашел простое решение для redhat-подобных дистрибутивов. Это, опять же, всего две команды:

cd /usr/share/ssl/certs

make /etc/stunnel/stunnel.pem

Надо только ответить на несколько вопросов скрипта make – отвечать можно произвольным образом, если этот сертификат больше нигде не будет использоваться. На моей локальной машине папки /usr/share/ssl/certs не нашлось (видимо, нужно установить openssl-devel), поэтому я поступил еще банальнее – скопировал на локальную машину файл stunnel.pem, полученный на сервере. :-)

После всего этого надо просто добавить в автозапуск – в redhat-подобных дистрибутивах можно использовать файл /etc/rc.local – я в конец файла добавил строчку stunnel – и все!

После запуска команды stunnel на сервере и на клиенте (это только один раз нужно) туннель устанавливается и можно общаться без боязни прослушивания. Ура!

8 Comments »

  1. Признаюсь, что я админ-самоучка, а мой учитель – Google (иногда Яндекс). Если кому интересно более подробное описание stunnel, то в журнале “Системный администратор” есть статья Андрея Бешкова, “Защита сетевых сервисов с помощью stunnel”, http://www.samag.ru/art/12.2004/12.2004_10.html – там есть даже примеры использования в Windows. Кстати, именно в Windows я впервые познакомился с stunnel, когда надо было зашифровать канал от почтового клиента TheBat до сервера.

    Comment by timothy_ha — 19.06.2007 @ 20:48

  2. У упомянутой статьи, как сообщил Яндекс, есть три части.

    Вот ссылки на вторую и третью части:
    http://onix.opennet.ru/content/view/38/26/
    http://onix.opennet.ru/content/view/39/26/

    Адрес цикла статей: http://onix.opennet.ru/content/category/4/20/26/

    Comment by timothy_ha — 19.06.2007 @ 20:58

  3. В ЖЖ спросили (адрес сообщения http://community.livejournal.com/prolinux/90665.html?view=248105 в сообществе prolinux, мы там как prolinuxru зарегистрированы):

    relf: а чем оно лучше обычного ssh-тунелирования?

    prolinuxru: В случае SSH-туннелирования надо иметь аккаунт на сервере. И для запуска команды ssh -L порт:сервер:порт логин@сервер без ввода пароля намного больше телодвижений нужно производить. Я пробовал.

    Comment by timothy_ha — 20.06.2007 @ 03:18

  4. Такой вопрос – а как делал ssl на почте? Я как-то этим озаботился (система была FreeBSD и Sendmail) и уперся в то, что надо генерить сертификат, который нужно было заказывать в инете за деньги. Так что тогда я ограничился лишь авторизацией при отправке наружу :) А как сделать внутрисетевой почтовый ssl?

    Comment by Aleksanders — 20.06.2007 @ 17:00

  5. В моем случае работает связка postfix + courier-imap. Но для твоего случая можно использовать stunnel! :-) Посмотри в статье Андрея Бешкова, там подробное решение.

    А самопальные сертификаты генерятся средствами openssl – покупать ничего не надо.

    Comment by timothy_ha — 20.06.2007 @ 21:50

  6. Почему не vtund? Настраивается на раз, имеет кучу полезных свойств.

    Comment by fdv — 21.06.2007 @ 11:04

  7. Извините, у меня вопрос… Как вообще настроить Линукс, чтобы можно было бы выходить в и-нет через радио, ю-эс-би модем… Линукс купил полгода назад… Версия – Fedora 9 i386 ru [Tigro] Ядро – 6 и т.д. Help me please!!!

    Comment by sidmonster — 05.01.2009 @ 22:49

  8. Re: sidmonster – В Fedora есть программа NetworkManager – если у Вас еще не установлена она, то запустите через yum install NetworkManager. Она поможет настроить выход Интернет через WiFi (если под радио Вы подразумевали это). USB-модем должен распознаться системой, чтобы им пользоваться. Это надо уточнять в Google или Яндексе. Наберите номер модели модема и слово linux (Линукс).

    Comment by admin — 06.01.2009 @ 07:24

RSS feed for comments on this post. TrackBack URL

Leave a comment

You must be logged in to post a comment.

Powered by WordPress