Ssh-Туннелирование В Вашем Приложении

Введение

Данная статья посвящена задаче защиты клиент-серверного соединения MySQL с использованием функциональности, предоставляемой протоколом Secure Shell (SSH). Точнее, используется концепция туннелирования SSH. Мы рассмотрим шаги, необходимые для создания безопасных клиентских приложений MySQL, и самостоятельно реализуем образец.

Трафик MySQL — не единственный вид данных, который может туннелироваться с помощью Secure Shell. SSH можно использовать для защиты любого TCP-протокола прикладного уровня, такого как HTTP, SMTP и POP3. Если вашему приложению необходимо защитить такой протокол, туннелируя его через защищенное SSH-соединение, эта статья будет вам полезна.

Фон

Представим, что мы разрабатываем корпоративное приложение, которому необходимо отправлять запросы множеству SQL-серверов по всему миру и получать от них ответы (представим, что это сверхмощная банковская система, хранящая информацию о миллионах счетов).

Все данные между приложением и SQL-серверами передаются через Интернет «как есть». Поскольку большинство протоколов, используемых SQL-серверами, не обеспечивают целостности и конфиденциальности данных (а те, которые обеспечивают, делают это весьма непрозрачным образом), все передаваемые запросы и ответы могут (и будьте уверены, так и будут!) стать видимыми для пассивного противник. Активный противник может создать гораздо более серьезные проблемы – он может подделать данные, и никто этого не обнаружит!

SSH (Secure Shell) — это протокол, который может помочь в решении этой проблемы. Одной из его выдающихся особенностей является способность туннелировать различные типы соединений через одно, надежное и защищенное соединение.

Теперь вам не придется беспокоиться о безопасности данных, передаваемых через Интернет — SSH позаботится об этом за вас. В частности, SSH позаботится о следующих аспектах безопасности:

Надежное шифрование данных в соответствии с новейшими стандартными алгоритмами (AES, Twofish)

Аутентификация клиентских и серверных компьютеров

Защита целостности данных

Устойчивость к различным видам сетевых атак

Сжатие туннелируемых данных

Полная независимость от операционной системы и особенностей сети.

Туннелирование (или перенаправление) работает следующим образом:

Клиент SSH открывает прослушиваемый порт на каком-либо локальном сетевом интерфейсе и сообщает SSH-серверу, что он желает перенаправить все соединения, принятые через этот порт, на какой-либо удаленный хост.

Когда на прослушивающем порту принимается другое соединение, SSH-клиент сообщает об этом SSH-серверу, и они вместе устанавливают для него логический туннель. В то же время сервер SSH устанавливает новое TCP-соединение с удаленным хостом, согласованное на шаге 1.

Клиент SSH шифрует все данные, которые он получает от принятого соединения, и отправляет их на сервер SSH. Сервер SSH расшифровывает данные, полученные от клиента SSH, и отправляет их на удаленный хост.

Обратите внимание, что клиент SSH действует как TCP-сервер для принимаемых соединений, а сервер SSH действует как TCP-клиент для соединений, которые он устанавливает с удаленным хостом.

Одно SSH-соединение может туннелировать столько соединений прикладного уровня, сколько необходимо. Это означает, что вы можете защитить свой сервер, переместив все прослушивающие порты (например, порты базы данных и сервера приложений) в локальную сеть, оставив открытым только порт SSH. Гораздо проще позаботиться об одном порте, чем о десятке разных портов прослушивания.

В огонь!

Давайте разработаем небольшое приложение, которое иллюстрирует использование возможностей пересылки SSH. Мы рассмотрим важную задачу по обеспечению безопасности соединения между клиентским приложением MySQL и сервером MySQL. Представьте, что нам нужно получить информацию с сервера базы данных, который находится за тысячу миль от нас, безопасным способом.

SecureMySQLClient — это приложение, которое мы планируем реализовать. Он включает в себя следующие модули:

Клиентский модуль SSH с возможностями пересылки

Клиентский модуль MySQL

Пользовательский интерфейс для настройки параметров приложения и отображения результатов запроса.

SSH-сервер работает в удаленной сети и виден из Интернета. Сервер базы данных (MySQL) работает в той же сети, что и SSH-сервер, и может быть невидим из Интернета.

Процесс выполнения безопасного обмена данными между SecureMySQLClient и сервером базы данных выглядит следующим образом:

Клиентский модуль SSH согласовывает безопасное соединение с SSH-сервером и устанавливает пересылку с некоторого локального порта на удаленный сервер MySQL.

Клиентский модуль MySQL подключается к порту прослушивания, открытому клиентским модулем SSH.

Клиент и сервер SSH настраивают логический туннель для принятого соединения.

Клиент MySQL отправляет SELECT на порт, открытый клиентским модулем SSH, который шифрует его и отправляет на SSH-сервер. Сервер SSH расшифровывает запрос и отправляет его на сервер MySQL.

SSH-сервер получает ответ от сервера MySQL, шифрует его и отправляет обратно SSH-клиенту, который расшифровывает его и передает клиентскому модулю MySQL.

Выглядит слишком сложно? Реализовать это проще, чем вы думаете. Итак, пойдем и сделаем это.

Перед созданием приложения нам потребуются следующие продукты, установленные на компьютере:

Microsoft Visual Studio .NET 2003, 2005 или 2008.

EldoS SecureBlackbox (версия .NET). Можно скачать с

http://www.eldos.com/sbbdev/download.php.

Коннектор MySQL .NET. Можно скачать с

http://www.mysql.com/products/connector/net/.

Давайте теперь откроем Microsoft Visual Studio .NET (мы будем использовать версию 2005 года) и попробуем собрать такое приложение с нуля.

После завершения разработки графического пользовательского интерфейса мы можем перейти к самому коду бизнес-логики. Сначала добавляем в наш проект ссылки на следующие сборки:

SecureBlackbox

SecureBlackbox.PKI (только в SecureBlackbox 5. SecureBlackbox 6 не имеет этой сборки)

SecureBlackbox.SSHClient

SecureBlackbox.SSHCommon

MySql.Данные

SSHForwarding уведомляет нас об определенных ситуациях через свои события, поэтому для некоторых из них нам необходимо создать обработчики:

OnAuthenticationSuccess — запускается, когда процесс аутентификации клиента завершен.

OnAuthenticationFailed — вызывается, если клиенту не удалось пройти аутентификацию с использованием определенного метода аутентификации. В целом это не означает, что процесс аутентификации полностью провалился – клиент может последовательно попробовать несколько методов аутентификации, и один из них может оказаться успешным.

OnError — вызывается, если во время сеанса возникает какая-либо ошибка протокола. Обычно это приводит к замыканию соединения. Точную ошибку можно определить по переданному ему коду ошибки.

OnKeyValidate — используется для передачи полученного ключа сервера приложению. Обратите внимание, что неправильная обработка этого события может привести к серьезному нарушению безопасности. Обработчик этого события должен проверить, что переданный ключ соответствует удаленному серверу (и предупредить пользователя, если это не так). Если ключ действителен, обработчик должен установить для параметра Validate значение true. Для простоты в примере не выполняется проверка ключей.

OnOpen — запускается, когда SSH-соединение установлено и компонент готов к туннелированию данных. Мы будем использовать обработчик этого события для запуска клиентского компонента MySQL.

OnClose — запускается при закрытии SSH-соединения.

OnConnectionOpen — запускается при создании нового туннеля. Соответствующий объект туннелированного соединения передается в качестве параметра.

OnConnectionClose — вызывается при закрытии существующего туннеля.

Реализация двух основных методов: SetupSSHConnection() и RunQuery(). Первый инициализирует объект SSHForwarding и устанавливает сеанс SSH с удаленным сервером, вызывая его метод Open(), а второй отправляет запрос на сервер MySQL.

Код метода SetupSSHConnection() довольно прост:

частная пустота SetupSSHConnection()

Указываем адрес и порт SSH-сервера

Пересылка.Адрес = tbSSHАдрес.Текст;

Пересылка.Порт = Convert.ToInt32(tbSSHPort.Text);

Установка учетных данных для аутентификации на SSH-сервере

Пересылка.Имя пользователя = имя_пользователя.Текст;

Пересылка.Пароль = tbПароль.Текст;

Указание сетевого интерфейса и номера порта, который будет открыт локально

Forwarding.ForwardedHost = "";

Forwarding.ForwardedPort = Convert.ToInt32(tbFwdPort.Text);

Указание хоста назначения, на который сервер должен пересылать данные.

Обратите внимание, что пункт назначения должен быть указан в соответствии с

Точка зрения SSH-серверов. Например, 127.0.0.1 будет означать

SSH-серверы localhost, а не SSH-клиенты.

Пересылка.DestHost = tbDBAddress.Text;

Пересылка.DestPort = Convert.ToInt32(tbDBPort.Text);

Открытие SSH-соединения

Пересылка.Открыть();

Чуть сложнее код метода RunQuery() (точнее, код метода RunQueryThreadFunc(), который вызывается в отдельном потоке методом RunQuery()):

частная пустота RunQueryThreadFunc()

MySqlConnection MySQLConnection = новый MySqlConnection();

формируем строку подключения

string connString = "database=" + tbDBName.Text + ";Connect Timeout=30;user id=" + tbDBUsername.Text + "; pwd=" + tbDBPassword.Text + ";";

если (cbUseTunnelling.Checked)

указание локального пункта назначения, если переадресация включена

connString = connString + "server=127.0.0.1; порт=" + tbFwdPort.Text;

еще

указание реального местоположения сервера MySQL, если переадресация не используется

connString = connString + "server=" + tbDBAddress.Text + "; port=" + tbDBPort.Text;

MySQLConnection.ConnectionString = connString;

пытаться

открываем соединение MySQL

MySqlCommand cmd = новый MySqlCommand(tbQuery.Text, MySQLConnection);

Log("Подключение к серверу MySQL.");

MySQLConnection.Открыть();

Log("Соединение с сервером MySQL установлено. Версия: " + MySQLConnection.ServerVersion + ".");

считываем результаты запроса

Читатель MySqlDataReader = cmd.ExecuteReader();

пытаться

for (int i = 0; я

AddQueryColumn(reader.GetName(i));

пока (читатель.Читать())

значения string[] = новая строка[reader.FieldCount];

for (int i = 0; я

значения[i] = reader.GetString(i);

AddQueryValues (значения);

окончательно

закрытие соединений MySQL и SSH

Log("Закрытие соединения MySQL");

читатель.Закрыть();

MySQLConnection.Закрыть();

Пересылка.Закрыть();

поймать (Исключение ex)

Log("Не удалось подключиться к MySQL (" + ex.Message + ")");

И это все!

Но есть еще одна вещь, на которую я должен обратить ваше внимание. Поскольку протоколы SSH и MySQL работают в отдельных потоках и получают доступ к элементам управления графическим интерфейсом из этих потоков, нам необходимо обрабатывать доступ к графическому интерфейсу особым образом, чтобы предотвратить проблемы с перекрестными потоками. Я проиллюстрирую это на примере метода Log():

делегировать void LogFunc (строка S);

частный журнал пустоты (строка S)

если (lvLog.InvokeRequired)

LogFunc d = новый LogFunc (Журнал);

Invoke(d, новый объект[] {S});

еще

Элемент ListViewItem = новый ListViewItem();

item.Text = DateTime.Now.ToShortTimeString();

элемент.Подпункты.Добавить(S);

lvLog.Items.Add(элемент);

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

Местоположение SSH-сервера, имя пользователя и пароль, используемые для аутентификации на нем.

Адрес сервера базы данных, порт, имя пользователя, пароль, имя базы данных и запрос. Помните, что адрес сервера базы данных следует указывать так, как он виден с SSH-сервера.

Включаем галочку «Использовать туннелирование».

Теперь нажмите кнопку «Пуск» и дождитесь результатов запроса. Если все параметры указаны правильно, мы должны получить что-то вроде этого:

Особенности и требования

Протокол SSH предоставляет (и SecureBlackbox реализует) следующие возможности:

Надежное шифрование данных с использованием AES, Twofish, Triple DES, Serpent и многих других симметричных алгоритмов с длиной ключа до 256 бит.

Аутентификация клиента с использованием одного или нескольких типов аутентификации (на основе пароля, на основе открытого ключа, на основе сертификата X.509, интерактивная аутентификация на запрос-ответ).

Аутентификация сервера

Надежный обмен ключами на основе алгоритмов открытого ключа DH или RSA.

Защита целостности данных

Сжатие туннелированных данных

Мультиплексирование нескольких туннельных соединений через одно SSH-соединение.

SecureBlackbox также предоставляет следующие функции:

Комплексная реализация протокола SSH, соответствующая стандартам (как на стороне клиента, так и на стороне сервера).

Поддержка криптографических токенов в качестве хранилища ключей и сертификатов.

Поддержка хранилищ системных сертификатов Windows

Профессиональная и быстрая поддержка клиентов

SecureBlackbox доступен в редакциях .NET, VCL и ActiveX. Это означает, что вы можете использовать компоненты в проектах, реализованных на языках C#, VB.NET, Object Pascal (Delphi и Kylix), FreePascal, VB6 и C++.

SecureBlackbox (выпуск .NET) доступен для Microsoft .NET Framework 1.1, 2.0, 3.0 и 3.5, а также .NET Compact Framework.




SSH-туннелирование в вашем приложении

Введение

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

SSH-туннелирование и не только

Хотя мы фокусируемся на защите соединений клиент-сервер MySQL, туннелирование SSH — это универсальный метод, который можно применять к различным протоколам на основе TCP. Если вам нужно защитить HTTP, SMTP, POP3 или другие протоколы прикладного уровня, туннелирование SSH может предоставить надежное решение. Если вашему приложению требуется защитить какой-либо протокол на основе TCP путем его туннелирования через защищенное соединение SSH, эта статья будет ценным ресурсом.

Понимание проблемы

Давайте рассмотрим сценарий, в котором мы разрабатываем корпоративное приложение, которое взаимодействует с несколькими серверами SQL, расположенными по всему миру. В этом гипотетическом примере мы можем представить себе мощную банковскую систему, обслуживающую миллионы счетов. Данные, которыми обмениваются приложение и серверы SQL, передаются через Интернет в виде открытого текста. К сожалению, большинству протоколов SQL-серверов не хватает встроенных мер обеспечения целостности и конфиденциальности данных, что делает данные уязвимыми для перехвата пассивными злоумышленниками. Более того, активные злоумышленники могут подделать данные, что может привести к катастрофическим последствиям.

Представляем SSH

SSH (Secure Shell) приходит на помощь, предоставляя решение этих проблем безопасности. SSH — широко используемый протокол, известный своими возможностями безопасной и зашифрованной связи. Одной из его примечательных особенностей является возможность туннелирования различных типов соединений через одно, надежное и защищенное соединение.

Используя SSH, вы можете снять с себя ответственность за безопасность данных, передаваемых через Интернет. SSH заботится о нескольких важных аспектах безопасности, в том числе:

  1. Надежное шифрование данных с использованием стандартных алгоритмов, таких как AES и Twofish.
  2. Аутентификация как клиентских, так и серверных компьютеров, обеспечивающая идентичность взаимодействующих сторон.
  3. Защита целостности данных, предотвращение несанкционированного изменения передаваемых данных.
  4. Стабильность против различных сетевых атак, защита соединения от злоумышленников.
  5. Сжатие туннелируемых данных, оптимизация пропускной способности сети.
  6. Независимость от конкретных операционных систем и сетевых конфигураций, обеспечивающая совместимость в различных средах.

Понимание туннелирования

Туннелирование SSH, также известное как пересылка, работает следующим образом:

  1. Клиент SSH открывает прослушиваемый порт на локальном сетевом интерфейсе и сообщает SSH-серверу о своем намерении перенаправить все соединения, полученные через этот порт, на удаленный хост.
  2. Когда на прослушивающем порту устанавливается новое соединение, клиент SSH уведомляет SSH-сервер, инициируя создание логического туннеля. Одновременно сервер SSH устанавливает новое TCP-соединение с согласованным удаленным хостом.
  3. Клиент SSH шифрует данные, полученные от принятого соединения, и передает их на сервер SSH. На другом конце SSH-сервер расшифровывает данные.

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

Заключение

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

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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2011-07-23 05:15:35
Баллов опыта: 552966
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.