Каков наилучший способ настройки паролей, не имея их слишком легко доступным для обычного читателя?

У меня есть база данных, к которой подключаются многие различные клиентские приложения (небольшое количество веб-сервисов, некоторые приложения 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 с чем-то длинным и подробным, чем хэш). Он также защищает базу данных от внутренних атак.