Если вы следили за развитием событий в Интернете вещей, вы заметили много дискуссий о требованиях безопасности в развивающейся отрасли. Фактически, это тема, которую мы несколько раз затрагивали в наших собственных блогах: « Чувство уязвимости: безопасность IoT , связанные города», часть 1: «Создание связанных городов будущего» и « Возможность подключения к IoT: правильное понимание с первого раза» . В этом сообщении мы хотим немного углубиться в безопасность и взглянуть на некоторые меры, которые вы можете предпринять для защиты своих данных.
Безопасность может быть непростой областью программирования, особенно если вы не работали в этой области. Имея это в виду, мы начнем с некоторых из наиболее распространенных мер безопасности, которые вы можете принять. В частности, мы рассмотрим SSL / TLS — область безопасности, с которой мы все хотя бы немного знакомы.
Наиболее распространенное применение SSL / TLS — это уровень шифрования, используемый при просмотре веб-страниц. HTTPS позволяет безопасно выполнять онлайн-банкинг и аналогичные конфиденциальные приложения, зная, что ваши данные защищены — за исключением некоторых серьезных нарушений безопасности (Heartbleed, POODLE, ошибка Goto Apple;), которые мы рассмотрим подробнее. подробнее чуть позже в посте.
SSL или TLS
SSL, или уровень защищенных сокетов, является предшественником TLS, или безопасности транспортного уровня. У SSL есть три версии, которые считаются небезопасными из-за недостатков в их дизайне. TLS был создан для устранения недостатков в протоколе SSL. Термины SSL, TLS и SSL / TLS обычно используются взаимозаменяемо в литературе.
Стоит отметить, что SSL по-прежнему используется сегодня, несмотря на присущие ему недостатки. Поддержка SSL v2.0 / 3.0 в стеке SSL / TLS серверов предназначена для обратной совместимости. Конечно, эта поддержка была целью атаки POODLE. В POODLE соединения понижаются до SSL v3.0, что позволяет злоумышленнику атаковать метод шифрования в режиме CBC (Cipher-Block-Chaining), который обычно используется в SSL v3.0. Решение атак POODLE предназначено для администраторов на стороне сервера, чтобы отключить возможность понижения и поддерживать свои соединения на более безопасном TLS.
Если вы разрабатываете приложение, вы, вероятно, будете контролировать серверную часть. Если это так, вы хотите использовать соединения TLS.
Как на самом деле работает SSL / TLS?
Настройка сеанса SSL / TLS состоит из трех основных этапов — грубо говоря, если говорить подробно, это может быть очень длинный пост. Первым шагом является согласование набора шифров — комбинации алгоритма обмена ключами, шифра и кода аутентификации сообщения. Набор шифров согласовывается при обмене приветствиями между клиентом и сервером при установлении связи SSL / TLS. Второй шаг — обмен ключами в соответствии с согласованным алгоритмом обмена ключами. И, наконец, третий шаг — использование согласованного шифра и обмененных ключей для установления зашифрованного соединения.
Асимметричное шифрование (открытый-закрытый ключ) изначально используется для обмена ключами. Затем используется шифрование симметричного ключа (с использованием сгенерированного ключа на этапе обмена ключами) для шифрования данных вашего приложения.
Существует множество вариантов как для алгоритма обмена ключами, так и для шифра, используемого для шифрования — быстрый взгляд на реестр IANA для комплектов шифров убедит вас в этом. Постоянное информирование о возникающих проблемах безопасности является обязательным для информирования вашего выбора предпочитаемых комплектов шифров. OpenSSL (реализация SSL / TLS, о которой мы поговорим в следующем разделе поста) публикует рекомендации по безопасности, касающиеся OpenSSL, на своей странице новостей . ThreatPost и CNET Security — другие хорошие источники информации о безопасности.
OpenSSL
OpenSSL — это реализация функций SSL / TLS с открытым исходным кодом, которая широко используется. Если вы собираетесь зашифровать сокеты самостоятельно — в отличие от использования веб-сервера с поддержкой SSL / TLS, такого как Apache, — OpenSSL — хорошее место для начала. Конечно, Apache использует сам OpenSSL, но все низкоуровневые вызовы OpenSSL будут встроены в веб-сервер Apache.
Чтобы использовать пакет SSL / TLS, сначала необходимо открыть соединения, которые вы хотите зашифровать. Это будет сделано обычным способом: соединение (возможно, с ручным связыванием) на стороне клиента и связывание, прослушивание, принятие на стороне сервера. Как только соединение установлено, вы можете начать добавлять уровень шифрования SSL / TLS.
Сначала вам нужно инициализировать библиотеку OpenSSL и загрузить строки ошибок, что очень полезно, особенно на этапе разработки, с помощью следующих вызовов.
SSL_library_init();
SSL_load_error_strings();
Затем вам нужно создать SSL_METHOD, структуру SSL_CTX, структуру SSL и добавить BIO в структуру SSL. Структура SSL_METHOD описывает версии SSL / TLS, которые поддерживаются в ваших соединениях. Структура SSL используется для установления, чтения, записи и разрыва зашифрованного соединения. Структура SSL_CTX содержит информацию, относящуюся ко всем вашим соединениям SSL. А BIO — это абстракция ввода / вывода, используемая в библиотеке OpenSSL; BIO позволяют применять шифрование SSL / TLS ко многим различным обменам данными, а не только к обмену TCP / IP, который нас интересует. Эти четыре структуры могут быть созданы и (минимально) настроены с помощью следующих вызовов.
const SSL_METHOD* method = SSLv23_method();
SSL_CTX *ctx = SSL_CTX_new(method);
SSL *ssl = SSL_new(ctx);
BIO *bio = BIO_new_fd(sock,BIO_NOCLOSE);
SSL_set_bio(ssl,bio,bio);
Где sock относится к уже установленному незашифрованному сокету. Если вы программируете серверную часть, вы также захотите загрузить закрытый ключ и файлы сертификатов, используя вызовы — конечно, после того, как вы инициализировали структуру SSL_CTX * ctx.
SSL_CTX_use_certificate_chain_file(ctx,"cacert.pem");
SSL_CTX_use_PrivateKey_file(ctx,”privkey.pem”,SSL_FILETYPE_PEM);
После завершения этой настройки вы можете создать зашифрованное соединение, позвонив
SSL_connect(ssl);
на стороне клиента и
SSL_accept(ssl);
на стороне сервера. Если вы используете блокирующие сокеты, эти вызовы должны быть завершены, а ваше зашифрованное соединение должно быть легко установлено. Если вы используете неблокирующие сокеты, вы должны проверять возвращаемые значения каждого вызова, поскольку вам может потребоваться повторно вызывать функции, когда базовый сокет доступен для чтения / записи — см. Справочные страницы двух вызовов для получения дополнительной информации.
Как только зашифрованное соединение установлено, вы можете читать или записывать в зашифрованный сокет, используя вызовы
number_read = SSL_read(ssl,buffer_to_read_into, number_of_bytes_to_read);
number_written = SSL_write(ssl,buffer_to_write_from, number_of_bytes_to_write);
Вот и все. Теперь у вас есть зашифрованное соединение, через которое вы можете читать / записывать данные.
Ваше развитие шифрования
Несколько заключительных замечаний о шифровании ваших собственных сокетов.
Во-первых, если вы пытаетесь отлаживать свой код во время разработки, это здорово иметь возможность просматривать обмены в сокете — чтобы увидеть, что происходит не так. Tcpdump и Wireshark являются отличными инструментами для этой задачи. Wireshark даже позволяет загружать файл закрытого ключа вашего сервера, чтобы вы могли видеть обмен данными незашифрованным — при условии, конечно, что выбранный вами комплект шифров не имеет прямой секретности.
Во-вторых (и, что гораздо важнее), фрагменты кода OpenSSL, показанные выше, описывают базовую реализацию сокетов OpenSSL. Есть еще много вариантов, доступных вам как разработчику. Например, вы можете выбрать другой SSL_METHOD для использования или вы можете ограничить список доступных наборов шифров, чтобы гарантировать использование определенных наборов. Эти параметры должны быть приняты как обоснованные решения, поэтому не ограничивайте свою информацию только этим коротким постом. OpenSSL Cookbook, бесплатная книга от Feisty Duck , является хорошим местом, чтобы начать больше учиться.
Наконец, когда у вас есть готовое шифрование для развертывания, следующим шагом будет получение сертификата вашего сервера, подписанного доверенным центром сертификации (CA). Получив доверенный ЦС для подписи вашего сертификата, клиенты смогут аутентифицировать ваш сервер как часть настройки соединения. Очень важно добавить этот шаг в ваш клиентский код. Невыполнение этого требования открывает вашу платформу для атаки «человек посередине». Яблоко провалилось; ошибка была громким примером неудачной проверки подлинности с помощью сертификатов CA.
Удачного кодирования и следите за обновлениями второй части этой серии статей по безопасности на следующей неделе!