Безопасно ли хранить критические пароли в переменных среды сервера?


23

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

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

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


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

Хорошие мысли, Фрэнк. Если бы вы использовали крипто, какую систему вы бы использовали? Что-то основанное на ключе RSA / SSH, инструменте цепочки для ключей или что-то еще? В настоящее время мы используем системы Linux> 2.6, такие как CentOS и Amazon.
Стив ХХХ

Ответы:


11

Если вы работаете в системе Linux, посмотрите / proc / * / environment и решите, являются ли переменные среды хорошим местом для хранения конфиденциальной информации или нет. / proc / self - это текущий процесс:

$ tr '\0' '\n' < /proc/self/environ
USER=me
LOGNAME=me
HOME=/home/me
PATH=/usr/bin:/bin:/usr/sbin:/sbin
MAIL=/var/mail/me
SHELL=/usr/bin/sh
SSH_CLIENT=1.2.3.4 58195 22
SSH_CONNECTION=1.2.3.4 58195 7.8.9.0 22
SSH_TTY=/dev/pts/1
TERM=xterm

Не берите в голову, что вещь, устанавливающая переменную среды, вероятно, читает файл где-нибудь.

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

Правильный способ сделать это - запустить приложение как учетную запись с ограниченными правами и сохранить пароль в файле, защищенном правами доступа на уровне файловой системы. Надеемся, что вы можете «включить» файл или аналогичный файл, чтобы сохранить пароль от системы контроля версий (при условии, что VCS не имеет мер безопасности). Чтобы защитить себя от непреднамеренного раскрытия, замаскируйте пароль как хотите - закодируйте с помощью base64, используйте pgp для шифрования, что бы ни имело смысл в наборе параметров вашей серверной программы. Если вы пишете программу для этого, лучшее, что вы можете сделать, - это запрашивать у пользователя пароль только при необходимости, а затем удалять его из памяти, как только он будет использован.



3
Да, файл с режимом 0600, принадлежащий пользователю, запустившему программу, доступен тем же людям, которые могут получить доступ к среде программы. Но, как я уже говорил, среда, вероятно, настраивается путем чтения файла, поэтому копирование данных в среду просто увеличивает количество мест, в которых эти данные доступны. И среда по умолчанию дублируется на дочерние процессы. И многие программы имеют внешние средства для запроса переменных среды из-за ошибок или преднамеренных проектных решений (например, phpinfo ()). Если в любом случае будет задействован файл, зачем увеличивать поверхность атаки?
dannysauer

1
Команда tr, которую вы дали, не сработала для меня - это cat /proc/self/environ | tr '\0' '\n'
сработало

Я в своем телефоне, поэтому трудно сказать ... Это должен быть ноль; ты набрал букву "о"?
dannysauer

8

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

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

Что бы я сделал, если бы действительно хотел защитить некоторую информацию в критически важной системе:

  1. Используйте Full Disk Encryption, чтобы содержимое всего постоянного хранилища было зашифровано.

  2. Ограничить физический доступ к машинам. Зафиксируйте корпус машины с помощью надежного механизма блокировки и контролируйте физический доступ к ключам. Нанимайте мускулов (вооруженных охранников), чтобы быть привратниками для доступа.

  3. Внедрить детальный принудительный контроль доступа (MAC) в операционной системе устройства. Вы можете начать с чего-то вроде SELinux в GNU / Linux и установить для него Enforcing, а затем адаптировать политику к точным потребностям производственного программного обеспечения, предоставляя этим учетным записям именно те (и только) разрешения, которые им необходимы для файлов, которые им нужны.

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

  5. Убедитесь, что у вас есть специалисты по сетям, чтобы позаботиться о разрешениях брандмауэра, чтобы свести к минимуму подверженность атаке по сети. Аудит (тест на проникновение, а также тестирование кода в «белой коробке») любого программного обеспечения, которое взаимодействует с внешними системами, особенно с общедоступным Интернетом. «Интерфейсы» включают в себя не только прямые сетевые подключения, но также чтение или запись «ненадежных» данных (данных, чьи байты были получены вне ОЗУ / диска / ЦП защищенного сервера).

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


Я бы пропустил # 1. Если система работает, файловая система монтируется и не шифруется. Если он не работает, ваш физический контроль доступа должен быть адекватным. Если его необходимо перезагрузить, вам нужно, чтобы кто-то предоставлял ключ дешифрования при каждой загрузке (что раздражает), или вам нужно, чтобы компьютер предоставил это - в этом случае учетные данные обычно также доступны любому, имеющему доступ к жесткому диску. , Большинство «серверных» машин обычно не используют шифрование диска из-за этой компромиссной стоимости. :)
dannysauer

«Это сводится к основному вопросу: безопасность системы и удобство», - цитируется в моем ответе, - который в равной степени относится и к вашему комментарию. Вы не можете максимизировать безопасность и удобство одновременно.
allquixotic

1
# 1 важно в том случае, если какой-то кусок оперативной памяти попадает на диск (подкачка) или если он попадает в сектор ssd, который впоследствии становится «плохим» и удаляется от ОС, но все еще удерживает этот кусок памяти. даже когда диск в настоящее время разблокирован, этот кусок данных в итоге оказывается зашифрованным на пластинах.
Акира

3

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

Обратите внимание, что это отличается от передачи пароля в командной строке. Аргументы командной строки доступны для чтения всем процессам, запущенным на одном компьютере (за исключением мер по усилению защиты), а не только процессам, выполняющимся от одного и того же пользователя.

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

Недостаток в вашем сценарии - «создать подходящую переменную среды при настройке серверной системы». Переменная среды - это динамическое свойство процесса. Вы не можете создать его при настройке системы, если под настройкой вы подразумеваете что-то, что переживает перезагрузку. Что вы имеете в виду, по- видимому , что администратор организовал для этого переменного будет присутствовать в среде , когда некоторый вход пользователя в системе . Это делается с помощью конфигурационного файла (обычно ~/.pam_environmentили ~/.profileили файл читать ~/.profile). Таким образом, это решение, по сути, не перемещает пароль из файлов конфигурации.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.