Искусство создания безопасных и надежных приложений
Велибеков Заур, ведущий специалист управление развития ИТ-культуры и пользовательского опыта Страхового Дома ВСК
Как сказал в свое время известный программист Эдсгер Вибе Дейкстра:»Программирование — это искусство контроля сложности». Чтобы достичь этого контроля необходимо не только уметь писать код, но и понимать, какие уязвимости могут возникнуть в процессе его выполнения. Поэтому среди множества проблем (особенно в начале пути в разработке): выбор идеи, оценка актуальности, построение архитектуры приложения, его внешнего вида, соблюдение чистоты кода и других, — не стоит забывать про важную часть любой разработки — про безопасность кода.
В этой статье разберем основные моменты, которые необходимо учесть при разработке приложения с точки зрения безопасности.
Защита данных
В первую очередь необходимо обеспечить безопасность данных, путем использования безопасных протоколов их передачи, а также шифрования, хранения данных и управления доступом к ним. К примеру, для обмена между сервисами используют всем известный https-протокол, так как он обеспечивает безопасную передачу данных благодаря криптографическим протоколам шифрования SSL и TLS. Конфиденциальную информацию стоит хранить в шифрованном виде, при помощи ассиметричного шифрования. В профессиональной разработке можно столкнуться с использованием таких алгоритмов шифрования как SHA2, RSA, AES, причем SHA2 является семейством алгоритмов, которое включает в себя наиболее популярные алгоритмы SHA256 и SHA512. Также используют цифровые подписи, хеширование, сертификаты и токены.
В одной из систем ВСК появилась необходимость хранить временные данные в файле на рабочих ПК, однако в открытом доступе их оставлять нельзя, чтобы избежать риска удаления, изменения и просмотра информации. Поэтому в таких случаях используют ограничение прав доступа, скрывают от обычных пользователей, а также хранят и отправляют данные внутри файла в зашифрованном виде.
Стоит не забывать про правильное хранение данных в базе, чтоб при определенных обстоятельствах не терять данные и сохранять основные качества информации: конфиденциальность, доступность, целостность.
Аутентификация и авторизация
Данный раздел имеет большое значение в работе с приложениями, так как выдача защищенного ресурса требует определенных прав доступа. Здесь можно использовать такой продукт как Keycloak. Он имеет ряд преимуществ, на просторах интернета достаточно информации об этом. Стоит не забывать и про модель доступа к данным. Например, ролевая, мандатная или дискреционная модели. Первая больше остальных подходит под компанию, так как с ее помощью можно выдавать определенные роли должностям. В вторую стоит подключать, когда необходимо ограничить доступ к информации на основе уровней секретности. А третья предполагает свободное ограничение прав: для конкретного субъекта к конкретному объекту.
В одном из проектов ВСК был опыт работы с Keycloak в системе удаленной поддержки пользователей, которая выступает удостоверяющим центром вне приложения. Если коротко, то данный продукт работает на протоколе OAuth2, который помогает авторизоваться внешним источникам, сервисам, а также пользователям в системе, не передавая учетные данные этим сервисам. Еще в нем используется технология единого входа (SSO), временные токены JWT для передачи информации и т.д. Причем развертывание продукта и настройка упрощена в нашей компании, благодаря собственной разработке Marlin, в которой уже развернуты основные сервисы и ПО, в том числе и Keycloak.
Обработка ошибок и исключений
Эта процедура помогает предотвратить возможные атаки, связанные с уязвимостями в коде. Злоумышленник не только пытается украсть защищенные данные, но и вывести из строя приложение, что в итоге приведет к убыткам. Поэтому всегда нужно прорабатывать и проверять возможные участки кода на баги и уязвимости.
Защита от внедрения вредоносного кода
Я думаю, вы слышали про SQL-инъекции и XSS-атаки. Чтобы защититься от подобных действий, необходимо соблюдать правила защиты. Например, для защиты от SQL-инъекций помогает приведение данных к целочисленному типу, когда они передаются не как строка, в которую можно записывать все, что угодно, а как число, что уже усложняет процесс взлома кода. Также необходимо использовать экранирование значений: при попытке ввода кавычек для комментирования части запроса следует поменять символ кавычки на другой символ. Ну и наконец, можно использовать подготовленные выражения для проверки полученного значения: является ли оно предустановленным запросом или оно изменилось.
В нашей компании есть сервисы и приложения, написанные на языке C#, поэтому использование Entity Framework исключает SQL-инъекции. Entity использует параметризированные запросы. Если требуется прямое обращение в базу данных, то необходимо избегать возможности записи значений прямо в тело запроса.
XSS-атаки представляют собой попытку ввода JavaScript кода в места, где появляется строковый текст. Такие места необходимо минимизировать, а где это сделать достаточно трудно, стоит проверять полученные данные перед тем, как вывести на наличие строчек JS-кода.
Безопасность сети
Чтобы предотвратить DDOS-атаки и перехват трафика, необходимо соблюдать некоторые правила: использование антивирусных программ, установка межсетевых экранов, проведение аудита трафика. DDOS-атаки и сегодня являются актуальной проблемой, из-за чего стоит распределять трафик на другие сервера, чтоб разгрузить основные, и следить за его изменениями.
Тестирование на безопасность
После соблюдения всех вышестоящих пунктов, есть вероятность что-то и где-то упустить, поэтому обязательным этапом сохранение безопасности является тестирование приложения: проверить выполнение каждого из предыдущих пунктов, провести разного вида тестирование, как ручное, так и автоматизированное, попытаться взломать и т.д.
В крупных компаниях, таких как ВСК, есть целые отделы для тестирования приложений, которые пишут модульные, интеграционные, функциональные тесты и проверяют устойчивость кода к популярным видам атак.
Подведя итоги
Можно сказать, что пункты, описанные выше, многие считают очевидными и пренебрегают ими в работе. Но именно они обеспечат безопасность в коде, что, в свое время, является одним из важнейших пунктов при разработке приложения. Старайтесь не усложнять код, нагружая его лишними конструкциями, а, наоборот, сделать его простым и читабельным. Это поможет легче отслеживать ошибки и дорабатывать приложение, если появятся новые идеи и фишки.