Golang. Хранение паролей для доступа к базе данных безопасно

Собираюсь написать свой первый веб-сервис на Go. Встал вопрос безопасного хранения пароля к базе данных. Если следовать этому гайду, то нужно сделать переменную окружения.

Есть ли более безопасный способ хранения пароля к базе данных, чем переменная окружения применительно к веб-сервису написанному на Golang?


Ответы (1 шт):

Автор решения: Falchio

Интересные обсуждения по теме на других ресурсах:

Почему стоит хранить в формате переменных окружения

Есть довольно интересная методология от разработчиков облачной платформы Heroku, под названием Twelve-Factor App. Лучшие практики относительно хранения паролей, ключей API описаны здесь, раздел config. Так же есть два перевода на хабре выжимка и полный.

Конфигурация — это все параметры, которые меняются в зависимости от того где запущено приложение: логины, пароли, адреса баз данных, ключи api и т.д.

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

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

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

Приложение двенадцати факторов хранит конфигурацию в переменных окружения (часто сокращается до env vars или env). Переменные окружения легко изменить между развертываниями, не изменяя код. В отличие от файлов конфигурации, менее вероятно случайно сохранить их в репозиторий кода. Так же в отличие от пользовательских конфигурационных файлов или других механизмов конфигурации, таких как Java System Properties, они являются независимыми от языка и операционной системы стандартом.

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

Защищённость переменной окружения.

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

Библиотеки Golang для шифрования/хранения секретов

Для шифрования/хранения секретных можно использовать следующие библиотеки:

  • keyring - работает с хранилищами учётных данных встроенных в систему, такими как Windows Credential Manager, KWallet и другие. Но при компрометации системы это опять же не особо поможет.
  • sops - библиотека для работы с Mozilla Sops. Позволяет шифровать/дешифровать данные. В данном случае основная проблема это хранение приватного ключа. Он не должен храниться на машине где запущено приложение, иначе возвращаемся к утечке учётных данных. Соответственно необходима реализация стороннего провайдера для дешифровки в момент, когда это нужно на другой машине. Но для моих целей это уже будет излишнее усложнение.

Поэтому как и предполагал буду хранить переменные окружения в CD/CI GitLab.

Буду рад, если кто-нибудь более компетентный напишет другой ответ.

→ Ссылка