Что такое секреты и как работать с ними в Java

Завершено

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

Что представляют собой концепции "Никому не доверяй" и "Никаких секретов в коде"?

Концепция "Никому не доверяй" заключается в том, что никому не следует доверять и предоставлять доступ к ресурсам компании без проверки и авторизации.

Эта концепция также применяется к веб-приложениям: в их коде или финальных двоичных файлах не должны храниться секреты. Это то, что мы вызываем стратегией "Никаких секретов в коде".

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

Не храните секреты в репозиториях Git

Даже если репозиторий Git является частным, размещать в нем секреты не рекомендуется:

  • Любой пользователь с доступом к репозиторию будет знать ваши конфиденциальные данные
  • Любой пользователь с доступом к двоичному файлу приложения может извлечь секреты из него

Кроме того, когда секрет хранится в репозитории Git, злоумышленники всегда могут найти его, глядя в журнал репозитория, где его можно забыть после длительного времени.

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

Использование переменных среды

Самым простым решением для управления секретами является использование переменных среды. Такой подход имеет ряд преимуществ:

  • Они просты в использовании
  • Они работают над всеми системами (даже в локальных системах)
  • Все знают их и понимают, как они работают

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

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

Использование секретов Kubernetes

В Kubernetes имеется такое понятие, как secrets, что является еще одним хорошим решением. Эти секреты можно загрузить как файл в файловой системе приложения: программа Java может прочитать этот файл во время запуска, чтобы получить доступ к этим секретам. В таких средствах, как платформы Spring Framework, даже имеется стандартная поддержка для этого механизма, что позволяет им с легкостью и эффективно использовать эти секреты.

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

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

Использование хранилища секретов

Хранилище секретов, например Hashicorp Vault или Azure Key Vault, является специализированным программным обеспечением для управления секретами. Оно предлагает обширную систему управления для авторизации пользователей, смены ключей безопасности и проверки того, какое приложение может получить доступ к тому или иному секрету.

Такие решения также предоставляют внешний API, поэтому их можно использовать в любой системе. Например, azure Key Vault можно использовать во всех службах Azure, включая Виртуальные машины, службы приложение Azure, Служба Azure Kubernetes или Azure Spring Apps.

Хранилище секретов — это наиболее безопасное решение для управления секретами, но им требуется использование выделенного средства.