Хранение пароля в системе контроля версий - PullRequest
18 голосов
/ 18 февраля 2009

Мы храним все наши пароли приложений и БД в виде простого текста в системе контроля версий. Мы делаем это, поскольку наш процесс сборки / развертывания генерирует необходимые файлы конфигурации, а также выполняет фактическое развертывание, для которого требуются эти пароли (т. Е. Для запуска sql с базой данных требуется вход в базу данных с использованием действительных учетных данных). У кого-нибудь была аналогичная потребность, когда вы могли реализовать этот тип функций, не сохраняя пароли в виде простого текста?

Ответы [ 6 ]

21 голосов
/ 18 февраля 2009

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

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

Второй вариант, мы зашифруем пароли! Но теперь код должен знать, как расшифровать пароли, поэтому вам нужно поместить ключ дешифрования где-то в коде. Проблема только что перенесена на уровень.

Как насчет использования открытых / закрытых ключей? Та же проблема, что и для паролей, ключ должен быть в коде.

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

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

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

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

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

6 голосов
/ 18 февраля 2009

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

Вот как я это делаю. Я продублировал этот шаблон из TikiWiki, который тоже это делает.

в каком-то файле, который обычно содержит пароли, задайте им фиктивные значения, не важно, что. Установите все, что должен видеть ваш клиент. Разместите комментарий, чтобы разработчики оставили этот файл в покое и изменили второй файл.

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

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

# in .gitignore
localsettings.py

# in settings.py
## Alter this value to log into the snack machine:
## developers: DON'T alter this, instead alter 'localsettings.py'
SECRET_VALUE = ""
try:
  from localsettings import *
except:
  pass

# in localsettings.py
SECRET_VALUE = "vi>emacs"
1 голос
/ 18 февраля 2009

Я создал системы, в которых пары ИД и пароль базы данных не являются частью удаления кода. Ключ заключается в настройке механизма конфигурации для конкретного сайта. Затем вы можете поместить такую ​​информацию на поле, о котором идет речь, не будучи частью базы кода.

Есть бонус: у вас могут быть разные пароли не только для разных кодов, но и для разных разработчиков. : -)

0 голосов
/ 18 февраля 2009

Вы не упомянули язык, поэтому вот решение vb.net, которое мы используем:

Imports System.Web.Security
Imports System.Security.Cryptography
Imports System.Text
Imports Microsoft.Win32

Public Class myCrypt

Private myKey As String = "somekeyhere"
Private cryptDES3 As New TripleDESCryptoServiceProvider()
Private cryptMD5Hash As New MD5CryptoServiceProvider()


Private Function Decrypt(ByVal myString As String) As String
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey))
    cryptDES3.Mode = CipherMode.ECB
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateDecryptor()
    Dim buff() As Byte = Convert.FromBase64String(myString)
    Decrypt = ASCIIEncoding.ASCII.GetString(desdencrypt.TransformFinalBlock(buff, 0, buff.Length))
End Function

Private Function Encrypt(ByVal myString As String) As String
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey))
    cryptDES3.Mode = CipherMode.ECB
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateEncryptor()
    Dim MyASCIIEncoding = New ASCIIEncoding()
    Dim buff() As Byte = ASCIIEncoding.ASCII.GetBytes(myString)
    Encrypt = Convert.ToBase64String(desdencrypt.TransformFinalBlock(buff, 0, buff.Length))
End Function

End Class
0 голосов
/ 18 февраля 2009

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

0 голосов
/ 18 февраля 2009

Если вы делаете в C, вы можете хранить в виде массива символов и вставлять символы в виде десятичных ссылок. Не уверен, сломает ли это строки или нет, но может помочь решить некоторые из этих проблем.

char pass[]={72, 101, 108, 108, 111};
...