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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

 

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

 

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

 

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

В первую очередь необходимо обеспечить безопасность данных, путем использования безопасных протоколов их передачи, а также шифрования, хранения данных и управления доступом к ним. К примеру, для обмена между сервисами используют всем известный 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-атаки и сегодня являются актуальной проблемой, из-за чего стоит распределять трафик на другие сервера, чтоб разгрузить основные, и следить за его изменениями.

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

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

 

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

 

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

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

Источник: https://habr.com/ru/companies/vsk_insurance/articles/771432/


Интересные статьи

Интересные статьи

В образовательной среде есть разные метрики успешности курса: 1. Индекс потребительской лояльности (Net Promoter Score, NPS) — сколько людей рекомендуют курс друзьям.2. Индекс удовлетворённости (Custo...
В этой статье я бы хотел рассказать про создание веб приложений на С/С++ с использованием стека Nginx+fastcgi. Если быть более точным, то статья больше относится к сайтам, то есть к отдаче контента. Е...
Вышел релиз GitLab 13.5 со сканированием безопасности мобильных приложений, вики-страницами групп, общим реестром пакетов и многими другими классными фичами! Читать дальше &...
В предыдущей публикации мы рассказали о нескольких дипломных проектах семестрового курса «Разработка на iOS» Технопарка (МГТУ им. Баумана). А в этот раз расскажем о двух самых инт...
Привет, Хабр! Предлагаю вашему вниманию перевод статьи основателя сервиса Meetspaceapp Nick Gauthier «Building Minimal Docker Containers for Go Applications». Время чтения: 6 минут Существу...