Каков наилучший способ настройки паролей, не имея их слишком легко доступным для обычного читателя?
У меня есть база данных, к которой подключаются многие различные клиентские приложения (небольшое количество веб-сервисов, некоторые приложения Java и несколько сетевых приложений). Не все из них работают в Windows (к сожалению, в противном случае это упростит ответ, просто включив проверку подлинности Windows для подключения к базе данных). В настоящий момент пароли хранятся в различных файлах конфигурации/свойств, расположенных вокруг систем. В идеале, только сотрудники службы поддержки имеют доступ к серверам, на которых работают файлы, но если кто-то получает доступ к одному из серверов, у них будет достаточно прав на доступ к базе данных, чтобы получить справедливое представление данных в том виде, в каком оно стоит сейчас.
Мой вопрос, тогда, что является лучшим способом сохранить пароли настраиваемыми, не имея его слишком легко доступным для обычного читателя?
Изменить. Чтобы уточнить, сервер БД - это Windows Server 2003 с запуском MSSQL 2005.
PS: Я не вижу никаких вопросов, которые повторяются, но если есть, не стесняйтесь закрыть этот.
Ответы
Ответ 1
Я предполагаю, что вы хотите скрыть пароли от случайных наблюдателей. Если бы они были злыми, стальными глазами наблюдатели с доступом ко всему исходному коду на одной из машин, которые соединяются, то они могут получить пароль с немного обратной инженерии.
Помните, что вам не нужно использовать одну и ту же защиту для каждого другого клиента. Несколько шагов: -
- Создайте разные учетные записи баз данных для разных систем, которые обращаются к вашей базе данных.
- Ограничить доступ к базе данных только тем, что им нужно, используя встроенные базы данных GRANT.
- Храните тройной ключ DES (или любой другой) внутри класса менеджера паролей в вашей базе данных. Используйте это, чтобы дешифровать зашифрованное значение в вашем файле свойств.
Мы также рассмотрели вопрос о том, есть ли приглашение приложения для парольной фразы при запуске, но не реализовано это, поскольку кажется больным, и ваш персонал должен знать пароль. Это, вероятно, менее безопасно.
Ответ 2
Предположим, что следующий общий сценарий:
-
Вы используете ту же базу кода для всех сред, и ваша база кода имеет пароли базы данных для каждой среды.
-
Персонал (системные администраторы, менеджеры конфигурации), имеющие доступ к вашему серверу производственных приложений, может знать пароли производственной базы данных и никого другого.
-
Вы не хотите, чтобы кто-то с доступом к исходному коду знал, что такое производственные пароли.
В подобном сценарии вы можете зашифровать и сохранить производственные пароли в файлах свойств, которые находятся в вашем приложении. В приложении вы можете включить класс, который считывает пароли из файла свойств и дешифрует его, прежде чем передавать его в драйвер базы данных. Однако ключ и алгоритм, используемые для дешифрования пароля, не являются частью исходного кода, а скорее переданы приложению как системному свойству во время выполнения. Это отделяет знание ключа от исходного кода приложения, и любой, у кого есть доступ к только исходному коду приложения, больше не сможет расшифровать пароль, потому что у него нет доступа к среде выполнения приложения (сервер приложений).
Если вы используете Java, посмотрите на этот для более конкретного примера. В этом примере используются Spring и Jasypt. Я уверен, что некоторые вещи, подобные этому, могут быть экстраполированы на другие среды, такие как .Net
Ответ 3
На моем прежнем рабочем месте у нас была система, в которой все пароли были зашифрованы (с использованием Triple DES или того, что мы использовали в то время). Пароли часто хранились в файлах свойств (это было в системе Java).
Когда нужно изменить пароль, мы можем просто использовать "! plaintext" в качестве значения, а затем наш код загрузит его, зашифрует и сохранит зашифрованное значение в файле свойств.
Это означало, что можно было изменить пароль, не зная, что такое исходное значение, - не уверен, что это то, о чем вы просили!
Ответ 4
Похоже, что нет простого ответа (из-за разных типов подключаемых приложений)... действительно, единственная проблема, которую я вижу, - это Java-приложения, которые, похоже, напрямую подключаются к вашей базе данных. Это правильно?
Если да, то что вы можете сделать:
1) Измените любые клиентские приложения, которые напрямую подключаются к БД для прохождения службы. (Если они должны подключиться напрямую, то, по крайней мере, дать им первый шаг, чтобы "получить пароль" из службы, тогда они могут подключаться напрямую).
2) Сохраните пароли в файле web.config(если вы решили делать .Net-сервисы), а затем зашифруйте раздел "строки подключения" файла.
Ответ 5
Не используйте пароли, аутентификация между сервером и сервером обычно может выполняться с использованием файла ключа или сертификата клиента или другого способа, кроме пароля.
Ответ 6
Вы можете использовать обратимый алгоритм шифрования, например. Blowfish для хранения паролей в качестве меры остановки. Там должно быть множество бесплатных библиотек, которые вы можете использовать для их создания во всех ваших программах, которым необходим этот доступ.
Страница Брюса Шнайера на Blowfish
Статья в Википедии о Blowfish
Ответ 7
Для java-материалов, если вы используете сервер приложений, посмотрите, можете ли вы определить источник данных, и ваши приложения могут получить доступ к источнику данных с помощью JNDI. Таким образом, управление источником данных (включая сведения о подключении) обрабатывается сервером приложений, и ваш код приложения должен сделать запрос на источник данных.
Ответ 8
Проверка подлинности NTLM или аутентификация на основе LDAP (Active Directory) должны быть доступны вам с минимальными усилиями. Это позволит вам использовать вашу "проверку подлинности Windows" для всех приложений.
Это может означать небольшую миграцию для вашего персонала, но SSO для набора приложений хорош.
Ответ 9
Да, я должен согласиться с возможностью хранения (соленых) хэшей. Я бы порекомендовал (соленый) SHA256 хэш пароля, хранящегося в базе данных. Также не забудьте обеспечить соблюдение правил безопасного пароля.
Ответ 10
Использование шифрования - не очень хорошая идея. Если кто-то скомпрометирует ключ, он сможет его расшифровать. Используйте хэш-алгоритм с солью для хранения паролей. Хэш-алгоритмы - один из способов, поэтому он не обратим. Но они уязвимы для словарных атак, поэтому используйте соль (простой текст concatane с чем-то длинным и подробным, чем хэш). Он также защищает базу данных от внутренних атак.