Как лучше всего работать с паролями в git-репозиториях?

165

У меня есть небольшой скрипт Bash, который я использую для доступа к твиттеру и всплывающего уведомления Growl в определенных ситуациях. Каков наилучший способ хранения моего пароля с помощью скрипта?

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

Теги:
security
github
passwords

6 ответов

220
Лучший ответ

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

Чтобы отфильтровать существующий пароль от предыдущих коммитов, см. справочную страницу GitHub на Удаление конфиденциальных данных.

  • 4
    Кстати, вы можете добавить пример foobar.config в репозиторий, а затем добавить foobar.config в файл .ignore. Таким образом, пример foobar.config появится при клонировании, и ваши действительные пароли не будут добавлены в репозиторий.
  • 15
    @Mr_Chimp: файл .gitignore не применяется к отслеживаемым файлам, которые уже находятся в хранилище. Например, git add -u добавит измененный файл, даже если он уже находится в .gitignore .
Показать ещё 5 комментариев
22

Подход может состоять в том, чтобы установить пароль (или ключ API), используя переменную среды. Таким образом, этот пароль находится вне контроля версий.

С Bash вы можете установить переменную окружения, используя

export your_env_variable='your_password'

Этот подход можно использовать с такими службами непрерывной интеграции, как Travis, при этом ваш код (без пароля), хранящийся в репозитории GitHub, может быть выполнен Travis (с вашим паролем, установленным с помощью переменной среды).

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

echo "$your_env_variable"

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

import os
print(os.environ['your_env_variable'])

PS: имейте в виду, что это, вероятно, немного рискованно (но это довольно распространенная практика) https://www.bleepingcomputer.com/news/security/javascript-packages-caught-stealing-environment-variables/

PS2: это dev.to статья под заголовком "Как безопасно хранить ключи API" может быть интересно читать.

16

Что сказал Грег, но я бы добавил, что неплохо проверить файл foobar.config-TEMPLATE.

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

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

3

Можно использовать Vault, который защищает, сохраняет и контролирует доступ к токенам, паролям, сертификатам, ключам API и т.д. Для Пример Ansible использует Ansible Vault, который заключает сделку с паролями или сертификатами, используемыми в playbooks

  • 0
    Я считаю, что Ansible Vault слишком сложен, по сравнению с простым созданием примера файла конфигурации.
  • 0
    @ icc97 Да, это печально. Но нам нужно упомянуть эту возможность. На мой взгляд, для задач более сложных, чем хранение нескольких паролей для однопользовательской среды, лучше использовать специализированные решения с самого начала.
Показать ещё 1 комментарий
1

Вот техника, которую я использую:

Я создаю папку в моей домашней папке с именем: .config

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

Я обычно использую обратный синтаксис доменного имени, такой как:

com.example.databaseconfig

Затем в скрипте bash я делаю это:

#!/bin/bash
source $HOME/.config/com.example.databaseconfig ||exit 1

|| exit 1 || exit 1 приводит к завершению работы сценария, если он не может загрузить файл конфигурации.

Я использовал эту технику для скриптов bash, python и ant.

Я довольно параноик и не думаю, что файл .gitignore достаточно надежен, чтобы предотвратить случайную регистрацию. Кроме того, ничего не отслеживается, поэтому, если регистрация все-таки произошла, никто не узнает, как с ней справиться.

Если конкретное приложение требует более одного файла, я создаю подпапку, а не один файл.

0

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

  • 4
    Можете ли вы рассказать подробнее о том, что делает этот камень? Таким образом, его можно (потенциально) рассматривать как «практику», применимую ко многим языкам.
  • 0
    medium.com/@MinimalGhost/… имеет обзор, в принципе, кажется, что он управляет извлечением материала из файла конфигурации

Ещё вопросы

Сообщество Overcoder
Наверх
Меню