Подтвердить что ты не робот

Хранилище паролей в источнике управления

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

Вот как я это делаю. Я продублировал этот шаблон из 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"

Ответ 3

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

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

Ответ 4

Вы не упомянули язык, поэтому вот решение 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

Ответ 5

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

Ответ 6

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

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