Что такое информационная безопасность? Это состояние защищенности информации, при котором обеспечиваются её конфиденциальность, доступность и целостность.

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

На мой взгляд, невозможно оценить безопасность отдельно взятой технологии или языка программирования без привязки к конкретному способу реализации, т. е. без конкретного готового программного продукта на языке, у которого есть детальное ТЗ с описанием архитектуры и функционала. Но и этого тоже будет мало, так как необходимо оценивать состояние защищенности готовой информационной системы со своей специфичной архитектурой, набором компонентов, бизнес-процессами, информацией и, наконец, людьми. Приведу пример с постройкой дома. У нас есть материалы (песок, цемент, щебень, кирпич и т. д.) и инструменты (ведро, лопата, шпатель и т. п.). Оценить исключительно по используемым материалам/инструментам качество и надежность готового дома мы не сможем: сколько он простоит, будут ли в нем трещины, будет ли в нем холодно или тихо. Нужно выбрать проект дома, технологии строительства и бригаду мастеров. И только после завершения строительства мы сможем провести измерения соответствия проекту, ГОСТу, СНиПам, проверить измерения по теплозащите, шуму, нагрузкам, провести анализ качества цемента и ответить на большинство вопросов. Но на главный вопрос «сколько он простоит?» у нас не будет точного ответа, так как мы не знаем всех условий эксплуатации дома и всех факторов, которые будут воздействовать на протяжении всего времени.

Как обеспечить безопасность в Java

Возьмем к примеру Java. Это объектно-ориентированный язык программирования; программы, написанные на Java, транслируются в байт-код Java, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор. Достоинством подобного способа выполнения программ является полная независимость байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина.

«Универсальный язык» звучит красиво, но самая распространённая проблема — это одновременно и обратная сторона медали — утечка памяти в JVM, что приводит к переполнению памяти и сбоям. В связи с этой проблемой не исключены уязвимости, ведь основной постулат надежности — чем проще, тем лучше. В данном же случае собирается такой сложный пирог из обеспечения совместимости большого количества платформ и ОС, что практически невозможно отслеживать и закрывать все найденные в них уязвимости и оперативно их устранять. У той же Microsoft уязвимости могут быть найдены и исправлены спустя 4-8 лет, и это если не брать в расчёт оставленные намеренно или по ошибке недекларированные возможности.

Из моей практики: когда программисты добавляют новый функционал, который связан с уже реализованным, или исправляют старый функционал, то в 15% случаях они ломают ранее работающий продукт. И если при этом не проводят полное тестирование — на выходе имеем продукт с новым функционалом, но с частично не работающим старым. Также существуют различия написания кода для разных платформ, версий ОС, ПО. В связи с этим можно себе представить, насколько тяжело поддерживать язык программирования Javа и JVM, не говоря уже про вопросы безопасности.

На текущий момент выпущен Java Development Kit 10, который предлагает нам штатные механизмы обеспечения безопасности, выпущенные еще для Java SE 8 и описанные в Security Documentation. В десятой версии не добавилось ничего нового.

Отмечу, что у Oracle существует ресурсный центр безопасности Java. В целом компания разделяет безопасность Java на четыре основных раздела:

А) разработчики должны:

— следить и использовать все последние обновления среды разработки и безопасности;

— использовать программы контроля корректности кода (например, Checker Framework);

— использовать безопасные правила кодирования;

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

Б) системные администраторы должны:

— следить и использовать все последние обновления для Java и необходимые компоненты для работы продукта (в т. ч. ОС, библиотеки, фреймворки, и т. д.);

— использовать правила развертывания Java, описанные здесь и здесь;

— использовать надёжную метку времени.

В) конечные пользователи должны:

— всегда использовать последнюю оригинальную версию Java;

— выполнять рекомендации.

Г) профессионалам в области безопасности необходимо:

— использовать расширенные инструменты управления и повышения безопасности (например, Advanced Management Console);

— контролировать своевременную установку всех обновлений безопасности;

— знать безопасные правила кодирования.

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

Разработка ПО и вопросы безопасности

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

А) Отсутствие понимания терминологии безопасности в целом, не говоря о специфических знаниях и применяемых решениях.

Как правило, у разработчиков безопасность в лучшем случае ассоциируется со следующими вещами: управление и журналирование доступа и парольная защита, реже — защита соединения на уровне https (использование механизмов шифрования, которые доступны из коробки по умолчанию). Т. е. формально они будут использовать методы обеспечения безопасности, которые по факту останутся формальными, «для галочки», без учета требований и нюансов:

— Для паролей: обычно используются значения по умолчанию и не настраиваются дополнительно длина, стойкость, частота смены, неповторяемость, количество попыток. Довольно часто эти параметры нельзя донастроить, так как они не были включены в скоуп-задачу по разработке ПО, что приводит к необходимости дописывать код.

— По управлению и журналированию доступа: в лучшем случае разработчикам описали группы или роли пользователей и объекты доступа, которые должны быть доступны в ПО. В худшем — разработчики сами «поделили» разделы и объекты на необходимые пользователям и администраторам. В первом случае получаем систему, которую можно гибко настроить, но требуется потратить значительное количество времени на настройку и согласование прав. Во втором — формальную систему разграничения доступа. Кроме того, разработчикам надо понимать, какую именно информацию и в каком объёме необходимо журналировать. Однако зачастую им эту информацию не предоставляют, что приводит к недостаточной детализации журналов для разбора инцидентов или понимания того, что происходит в ПО. Или же к избыточному хранению логов и большого объёма информации, что накладывает существенные ограничения на возможность хранения информации в течение необходимого периода времени (например, один-три года) или возникает необходимость закупки дополнительных хранилищ информации. При избыточной записи информации возникают дополнительные проблемы со скоростью анализа и разбора инцидентов и быстротой поиска нужной информации. Избыточность также может потребовать дополнительного финансирования на расширение штата, закупку SIEM-систем с настройкой уникальных правил обработки информации или вести к рискам, связанным с неактуальностью информации. При этом тратится слишком много времени на анализ и обработку информации.

— Защита каналов связи — не менее существенный момент, особенно для платежных и банковских систем, где помимо разглашения персональных и личных данных возможны финансовые потери. Чаще всего бывает, что о защите каналов и среды передачи информации не думают, а если и думают, то используют настройки «по умолчанию», например, TLS/SSL. Но там ведь тоже есть свои особенности по выбору версии протокола (TLS 1.1, 1.2, 1.3 или SSL v1-3), алгоритма шифрования (RC4, IDEA, Triple DES, SEED, Camellia или AES), длины ключа. Иногда выбирается, например, правильный протокол TLS 1.2, с шифрованием по AES, длиной ключа 256 бит, но забывается про возможность выбора адреса по порту 443 для HTTPS и или 80-й порт для HTTP, вместо блокировки 80-го порта, в результате чего появляется возможность получать доступ по незащищенному каналу. Или, например, поднимают инфраструктуру на виртуальных машинах и совсем не думают о необходимости закрыть сетевой доступ между виртуальными машинами.

Б) Вторая проблема связана с бизнесом, так как он вкладывает деньги в конкретный специальный функционал, который не учитывает блоки безопасности.

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

К сожалению, в этом виноват не только бизнес, но и его окружение, которое:

— также не понимает в безопасности;

— пожалело бюджет на специалистов по ИБ (не нанимаются вообще или нанимаются узкоспециализированные специалисты, или нанимается один человек, отвечающий за все);

— не смогло аргументировано донести необходимость в безопасности и правильно обосновать текущие риски (репутационные, финансовые, временны́е).

В) Проблема с коммуникацией в компании или отсутствие оной.

Это тот случай, когда бизнес и его окружение понимают необходимость и важность ИБ. Они выделили бюджеты, наняли соответствующих специалистов, но возникают сложности в коммуникации между бизнес-подразделениями и службами ИБ/ИТ, разработчиками.

Г) Недостаточная осведомленность простых пользователей компании в вопросах ИБ.

Предположим, что есть все необходимые подразделения, специалисты, технические и организационные меры. Но пользователи упираются и не хотят работать по правилам. Очень частая ситуация, и решать ее также необходимо комплексно, так как люди не понимают, зачем им лишняя работа по соблюдению вопросов ИБ (проверять файлы антивирусом, запоминать сложные пароли, знать и соблюдать политики и бизнес-процессы и т. д.). Нужно периодически устраивать мастер-классы, рассказывать на бытовом уровне, что такое ИБ, какие есть проблемы и решения, доводить глобальные цели и задачи ИБ, их и влияние на бизнес, мотивировать.

Д) Нехватка архитекторов ИБ — не всегда в разработке ПО участвуют специалисты по ИБ, и программисты сами думают о безопасности архитектуры и применении написанных и готовых шаблонов безопасности (Security patterns).

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

Чтобы можно было говорить о безопасности, нужно решить описанные выше проблемы. Я специально не описываю варианты решений, так как все зависит от конкретных проблем, среды, условий. Универсальной пилюли не существует и необходимо использовать все возможные меры. Основная задача состоит в том, чтобы все работники компании вникали, понимали и выполняли требования ИБ и были заинтересованы в их соблюдении. И только тогда можно будет говорить об эффективности и хорошем уровне зрелости ИБ в компании.

Автор статьи — эксперт-аналитик по ИБ.