2009-12-29 5 views
29

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

database_password=secret 
foo=bar 

становится

database_password=* 
foo=bar 

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

Пример:

Локальная версия:

database_password=own_secret 
foo=bar 

конфигурационный файл в VCS:

database_password=* 
foo=bar 

Затем внезапно, изменения конфигурационных файлов:

database_password=* 
foo=bar 
baz=foo 

И местные версия будет ome для каждого разработчика:

database_password=own_secret 
foo=bar 
baz=foo 

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

+6

конфигурационные файлы не должны содержать пароли в открытом виде .... –

+1

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

+0

@Mitch: мой PHP webapp (на основе ZF) считывает учетные данные БД из простого текста. Где я должен хранить их? – erenon

ответ

25

Вместо версии, управляющей фактическим конфигурационным файлом, вы можете поместить шаблон или файл по умолчанию в элемент управления версиями и сценарий, который будет запрашивать информацию и учетные данные БД для создания реального файла конфигурации, который будет исключен из (т.е. игнорируется) контролем версий. При проверке разработчики могут запустить этот скрипт, чтобы получить рабочую среду. Этот скрипт можно также вызвать как часть любого процесса установки, используемого вашим приложением.

Также see my answer похожий вопрос.

+0

Хорошо объяснил, спасибо. – erenon

0

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

Я не вижу способа сделать это, а не этого. Если вы найдете другой подход, пожалуйста, поделитесь.

+0

Я думаю, что лучше сохранить ваш конфигурационный файл на игнорирование, а после изменения изменить пароль на *, зафиксировать его, а затем установить флаг игнорирования снова, затем измените * на пароль. – erenon

+0

@erenon Это похоже на массу неприятностей. Я ожидал бы, что разработчики в конечном итоге обойдут это или не будут совершать регулярные (в любом случае, сохраняя конфигурационный файл.) Хотя это возможно, вы могли бы скриптировать всю процедуру. – Matthew

1

У вас есть отдельный файл с ТОЛЬКО секретами, которые не находятся под контролем версии?

В идеале, покончить с паролями, полностью использовать openssh или аналогичные, а также аутентификацию с использованием открытого/закрытого ключа для каждого пользователя.

+0

Пароли используются программой PHP для подключения базы данных. – erenon

1

Я привык сделать txt-файл его со структурой конфигурационного файла. После этого я сделаю копию и изменю расширение, и пусть моя система контроля версий проигнорирует этот файл (ы).

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

+0

Этот подход нарушает принцип СУХОЙ. Во всяком случае, это может сработать. – erenon

9

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

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

Я сделал это в .NET, но не PHP, поэтому не знаю, насколько это легко, я боюсь.

+0

Это кажется очень умным. Для достижения этого, возможно, мне просто нужно подклассировать мой синтаксический анализатор frameworks. – erenon

+1

+1 Именно так мы обрабатываем конфигурационные файлы практически во всех наших проектах с разными уровнями иерархии. – ZoogieZork

2

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

Обновления для другого конца задачи:
Для обработки обновления, вы либо хотите, чтобы заставить ручное слияние чувствительных файлов или изменить локальный процесс сборки, чтобы перезаписать чувствительные линии с содержимым с локальным/private/ignored file.

+0

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

0

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

4

Создайте локальный файл переопределений, содержащий информацию о пользователе как переменные PHP.

Например создать файл с именем local_overrides.php, который содержит следующее:

$local_password = 'qUzaEAFK13uK2KHy'; 

Затем в файле, который включает в себя ваш DB пароля сделать что-то вроде этого

$overrides = 'local_overrides.php'; 

if (file_exists($overrides)) { 
    #include_once($overrides); 
    $db_password = $local_password; 
} else { 
    // perform appropriate action: set default? echo error message? log error?  
    $db_password = 'l1m1t3d!' 
} 

местного файла коррекция будет никогда не должен быть замечен контролем источника.

0

Мой предпочтительный ответ на этот вопрос уже упоминался здесь: проверьте фиктивный файл, сгенерируйте «реальный» файл, скопировав фиктивный файл во время выполнения и проигнорируйте «настоящий» файл в вашем VCS.

я уже отвечал на подобный вопрос, с полным пример того, как сделать это в Visual Studio:
how to ignore files in kiln/mercurial using tortoise hg "that are part of the repository"

Смежные вопросы