Искусство создания безопасных и надежных приложений

0eb2d3907405273218f18e8f133e9aa5.png

Велибеков Заур, ведущий специалист управление развития ИТ-культуры и пользовательского опыта Страхового Дома ВСК

Как сказал в свое время известный программист Эдсгер Вибе Дейкстра:»Программирование — это искусство контроля сложности». Чтобы достичь этого контроля необходимо не только уметь писать код, но и понимать, какие уязвимости могут возникнуть в процессе его выполнения. Поэтому среди множества проблем (особенно в начале пути в разработке): выбор идеи, оценка актуальности, построение архитектуры приложения, его внешнего вида, соблюдение чистоты кода и других, — не стоит забывать про важную часть любой разработки — про безопасность кода.

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

Защита данных

В первую очередь необходимо обеспечить безопасность данных, путем использования безопасных протоколов их передачи, а также шифрования, хранения данных и управления доступом к ним. К примеру, для обмена между сервисами используют всем известный https-протокол, так как он обеспечивает безопасную передачу данных благодаря криптографическим протоколам шифрования SSL и TLS. Конфиденциальную информацию стоит хранить в шифрованном виде, при помощи ассиметричного шифрования.  В профессиональной разработке можно столкнуться с использованием таких алгоритмов шифрования как SHA2, RSA, AES, причем SHA2 является семейством алгоритмов, которое включает в себя наиболее популярные алгоритмы SHA256 и SHA512. Также используют цифровые подписи, хеширование, сертификаты и токены.

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

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

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

Данный раздел имеет большое значение в работе с приложениями, так как выдача защищенного ресурса требует определенных прав доступа. Здесь можно использовать такой продукт как Keycloak. Он имеет ряд преимуществ, на просторах интернета достаточно информации об этом. Стоит не забывать и про модель доступа к данным. Например, ролевая, мандатная или дискреционная модели. Первая больше остальных подходит под компанию, так как с ее помощью можно выдавать определенные роли должностям. В вторую стоит подключать, когда необходимо ограничить доступ к информации на основе уровней секретности. А третья предполагает свободное ограничение прав: для конкретного субъекта к конкретному объекту.

fd3fab0037d5728975173ff0140030b7.png

В одном из проектов ВСК был опыт работы с Keycloak в системе удаленной поддержки пользователей, которая выступает удостоверяющим центром вне приложения. Если коротко, то данный продукт работает на протоколе OAuth2, который помогает авторизоваться внешним источникам, сервисам, а также пользователям в системе, не передавая учетные данные этим сервисам. Еще в нем используется технология единого входа (SSO), временные токены JWT для передачи информации и т.д. Причем развертывание продукта и настройка упрощена в нашей компании, благодаря собственной разработке Marlin, в которой уже развернуты основные сервисы и ПО, в том числе и Keycloak.

Обработка ошибок и исключений

Эта процедура помогает предотвратить возможные атаки, связанные с уязвимостями в коде. Злоумышленник не только пытается украсть защищенные данные, но и вывести из строя приложение, что в итоге приведет к убыткам. Поэтому всегда нужно прорабатывать и проверять возможные участки кода на баги и уязвимости.

Защита от внедрения вредоносного кода

Я думаю, вы слышали про SQL-инъекции и XSS-атаки. Чтобы защититься от подобных действий, необходимо соблюдать правила защиты. Например, для защиты от SQL-инъекций помогает приведение данных к целочисленному типу, когда они передаются не как строка, в которую можно записывать все, что угодно, а как число, что уже усложняет процесс взлома кода. Также необходимо использовать экранирование значений: при попытке ввода кавычек для комментирования части запроса следует поменять символ кавычки на другой символ. Ну и наконец, можно использовать подготовленные выражения для проверки полученного значения: является ли оно предустановленным запросом или оно изменилось.

В нашей компании есть сервисы и приложения, написанные на языке C#, поэтому использование Entity Framework исключает SQL-инъекции. Entity использует параметризированные запросы. Если требуется прямое обращение в базу данных, то необходимо избегать возможности записи значений прямо в тело запроса.

XSS-атаки представляют собой попытку ввода JavaScript кода в места, где появляется строковый текст. Такие места необходимо минимизировать, а где это сделать достаточно трудно, стоит проверять полученные данные перед тем, как вывести на наличие строчек JS-кода.

Безопасность сети

Чтобы предотвратить DDOS-атаки и перехват трафика, необходимо соблюдать некоторые правила: использование антивирусных программ, установка межсетевых экранов, проведение аудита трафика. DDOS-атаки и сегодня являются актуальной проблемой, из-за чего стоит распределять трафик на другие сервера, чтоб разгрузить основные, и следить за его изменениями.

66bac8b0008afbc7e7f3cf4c717dcfde.jpg

Тестирование на безопасность

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

В крупных компаниях, таких как ВСК, есть целые отделы для тестирования приложений, которые пишут модульные, интеграционные, функциональные тесты и проверяют устойчивость кода к популярным видам атак.

Подведя итоги

Можно сказать, что пункты, описанные выше, многие считают очевидными и пренебрегают ими в работе. Но именно они обеспечат безопасность в коде, что, в свое время, является одним из важнейших пунктов при разработке приложения. Старайтесь не усложнять код, нагружая его лишними конструкциями, а, наоборот, сделать его простым и читабельным. Это поможет легче отслеживать ошибки и дорабатывать приложение, если появятся новые идеи и фишки.

© Habrahabr.ru