Используйте менеджер паролей для организации локальных файлов env и dot env.
Файлы dotenv
для локальной разработки стали очень популярны, и для их управления существует тонна инструментов. Даже если вы используете их для локальной разработки, если секреты и ключи попадают в эти файлы dotenv для удобства, они становятся вектором атаки, готовым к взлому.
Более того, при большом количестве кода и проектов, разбросанных по вашему рабочему столу в различных контекстах, становится трудно поддерживать безопасность и управление dotenvs в течение долгого времени.
Примечание: Даже при локальной разработке хранить секреты в файлах dotenv небезопасно, поскольку этот файл существует на вашем рабочем столе не только в терминальной сессии. Установка секретов в качестве переменных окружения не является наилучшей рекомендуемой схемой безопасности, поскольку возможны несчастные случаи (случайная печать окружения в журнале отладки), открытость для легких атак (окружение доступно через процесс — атаки на XML-сущности и инъекционные атаки), а сбои приложения приводят к тому, что окружение записывается в лог-файлы на диске. Для вашей топологии рекомендуется использовать конфигурацию без паролей, с нулевым доверием, основанную на идентификации. Об этом и эффективных способах управления секретами/паролями я напишу в следующем посте.
Используйте менеджер паролей
Если вы еще не используете менеджер паролей для общего/личного доступа в Интернете и приложениях, я советую вам начать это делать. Бросьте свои липкие записки, Google keep или электронные таблицы с паролями и используйте менеджер паролей, который по сути является зашифрованным цифровым хранилищем, в котором хранится надежная информация о пароле для входа в приложения и учетные записи на вашем мобильном устройстве, веб-сайтах и других сервисах.
Существует множество менеджеров паролей, мы оставим это исследование в стороне, но если вы сомневаетесь, стоит ли платить за менеджер паролей (он того стоит), начните с персонального bitwarden, он бесплатен для индивидуального использования и, как бонус, имеет открытый исходный код.
Ниже описано, как я управляю и получаю доступ к своему окружению/секретам для локальной разработки с помощью Bitwarden.
Установка
Установка Bitwarden довольно проста, а документация понятна. В этом руководстве больше внимания уделено CLI и тому, как его эффективно использовать для оптимизации работы разработчика.
После того, как вы установили CLI локально, есть два способа получить доступ к CLI (используя комбинацию apikey/secret или учетные данные с кодом 2FA). Мы рекомендуем последний вариант, поскольку он не является статичным или хранимым.
Если вы установили настольную версию Bitwarden, то при аутентификации в приложении вы войдете в Bitwarden на рабочей станции (если вы настроите приложение при запуске) (вам придется связать помощника браузера, например: расширение chrome bw, с логином вашего приложения отдельно для аналогичной сессии).
Вместо использования 2FA вы можете включить биометрию на своей рабочей станции или отменить ее с помощью системного пароля.
- Таким образом, при запуске терминала вы входите в Bitwarden (вам не нужно будет вводить 2FA). Вам потребуется
bw unlock
для установки сессии на этом окне терминала для доступа к секретам. Разблокировка также может быть выполнена с помощью apikey или мастер-пароля (не требуется 2FA, так как это аутентифицированная сессия). - Вам нужно будет установить переменную session (как переменную env), чтобы сохранить сессию на данном экземпляре терминала. Это избавит вас от необходимости
bw unlock
для каждой команды bw, которую вы выполняете. - Сессия действительна только для одного окна/вкладки терминала. Поэтому при открытии нового окна/вкладки необходимо выполнить два вышеуказанных шага.
Как только эти шаги будут выполнены, вы сможете выполнить любую команду bw
в рамках этой сессии для доступа к вашему хранилищу.
Упрощение
Чтобы упростить вышеописанные шаги, мы будем использовать начальную конфигурацию вашей оболочки терминала для разгрузки этих шагов, например: ~/.zshrc или ~/.bash_profile или любой другой, который вы предпочитаете. Настройка будет выполняться и запрашивать пароль на терминале, когда это потребуется (для установки сессии или разблокировки).
Создайте следующие псевдонимы и функции в конфигурации оболочки (~/.zshrc)
-
разблокировать
- При выполнении команды
bw unlock
результат будет следующим
Your vault is now unlocked! To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex: $ export BW_SESSION="..REDACTED" $env:BW_SESSION="..REDACTED"
Создайте следующую функцию в конфигурации запуска, которая экспортирует эту переменную окружения и установит сессию.
bwss() { eval $(bw unlock | grep export | awk -F"$" {'print $2'}) }
- При выполнении команды
-
Другие псевдонимы команд.
-
Другие вспомогательные функции
- Функция для установки переменных окружения на текущий сеанс из безопасной записи секретных пар ключ/значение
bwe(){
eval $(bw get item $1 | jq -r '.notes')
}
- Функция для создания нового элемента хранилища из существующих файлов dotenv на вашем локальном компьютере:
bwc "name_of_vault_key"
bwc(){
DEFAULT_FF=".env"
FF=${2:-$DEFAULT_FF}
#cat ${FF} | awk '{printf "%s\n", $0}' | sed 's/"/\"/g' >/tmp/.env
cat ${FF} | awk '{print "export " $0}' >/tmp/.xenv
bw get template item | jq --arg a "$(cat /tmp/.xenv)" --arg b "$1" '.type = 2 | .secureNote.type = 0 | .notes = $a | .name = $b' | bw encode | bw create item
rm /tmp/.xenv
}
-
Функция для создания нового элемента хранилища из всего окружения терминальной сессии:
bwce "name_of_vault_key"
.bwce(){ export | awk '{print "export " $0}' >/tmp/.env bw get template item | jq --arg a "$(cat /tmp/.env)" --arg b "$1" '.type = 2 | .secureNote.type = 0 | .notes = $a | .name = $b' | bw encode | bw create item rm /tmp/.env }
Использование функций и псевдонимов.
Будет использован пример управления azure apikeys/secrets/ для локальной разработки. Не обязательно ограничиваться только секретом, вы можете хранить все переменные окружения для контекста в одном ключе для эффективной загрузки.
Итак, если у вас есть файл dotenv, как показано в примере ниже
APIKEY=something
SECRET=something
configuration=host.com
environment=dev
region=eu-north
-
Чтобы импортировать его в хранилище. В месте расположения файла dotenv выполните команду
export APIKEY=something export SECRET=something export configuration=host.com export environment=dev export region=eu-north
-
Чтобы использовать его (в следующем сеансе)
-
Чтобы перечислить и установить
"az-example-dev" "az-example-stage" "az-foo-dev" "az-wee-dev" "az-test-dev"
И затем вы можете выполнить
bwe
, чтобы установить любую настройку, которая вам нужна. -
Удаление устаревших элементов :
bwdd "item-name"
.bwdd(){ bw delete item $(bw get item $1 | jq .id | tr -d '"') }
Как вы организуете свои ключи/секреты, зависит только от вас, но использование менеджера паролей гарантирует, что
- Все секреты находятся в хранилище в безопасности, и не происходит разрастания файлов.
- Вы сможете безопасно работать на других устройствах, не беспокоясь о копировании файлов окружения (поскольку после закрытия терминала сессия/среда теряется).
- Простое управление и настройка окружений в соответствующих контекстах, без необходимости управлять именованными dotenvs или иерархиями папок.
Для настройки конфигурации оболочки с использованием dotenv, которая включает все эти и другие функции, вы можете обратиться к stevengonsalvez/dotfiles
Примечание: Все это возможно и в других менеджерах паролей (Lastpass, 1password, Dashlane и т.д.).