Рекомендации по хранению паролей в сценариях оболочки/Perl?

Мне недавно пришлось свалить свои навыки Perl и shell script, чтобы помочь некоторым коллегам. Соответствующим коллегам было поручено предоставить некоторые отчеты из внутреннего приложения с большим бэкэндом базы данных Oracle, и у них просто нет навыков для этого. Хотя некоторые могут сомневаться в том, есть ли у меня эти навыки (усмешка), по-видимому, достаточно людей, которые, как я полагаю, я имею в виду, что я не могу их выучить.

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

Есть ли хорошее решение для этого, которое кто-то еще написал, возможно, как модуль CPAN? Или есть что-то еще, что лучше сделать - например, сохранить комманду user/password в полностью отдельном файле, который скрыт где-то еще в файловой системе? Или я должен хранить их тривиально зашифрованным, чтобы просто избежать их вытаскивания из моих скриптов с помощью системного grep?

Изменить: База данных Oracle находится на сервере HP-UX.
Сервер приложений (запуск сценариев оболочки) - это Solaris.
Настройка скриптов, принадлежащих только мне, - это не-go, они должны принадлежать учетной записи службы, доступ к которой имеет несколько сотрудников службы поддержки.
Сценарии предназначены для запуска как задания cron.
Я бы хотел пойти с аутентификацией с открытым ключом, но я не знаю методов, чтобы сделать эту работу с Oracle - если есть такой метод - просветите меня!

Ответ 1

Лучшей практикой, IMHO, было бы НЕ содержать пароли в оболочке /Perl script. Для этого используется аутентификация открытого ключа.

Ответ 2

Если script выполняется удаленно с сервера.

  • Представление отчетов.
  • Дайте пользователю, что вы входите в ТОЛЬКО доступ к выбору в представлениях отчета.
  • Просто сохраните пароль.

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

Ответ 3

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

Однако в Perl существует множество подходов. Вы можете изучить Getopt::Long для параметров командной строки (и дополнительно Getopt::ArgvFile, чтобы сохранить их в простом файле конфигурации), или посмотрите на что-то вроде Config::IniFiles для чего-то с за ней больше силы. Это два типа, которые я обычно использую, но есть и другие доступные файлы конфигурации.

Ответ 4

Нет хорошего решения. Вы можете немного запутать пароли, но вы не можете их защитить.

Если у вас есть контроль над настройкой БД, вы можете попытаться подключиться по именованному каналу (по крайней мере, поддерживает mysql) без пароля и позволить ОС обрабатывать разрешения.

Вы также можете сохранить учетные данные в файле с ограниченными правами.

Ответ 5

Поскольку вы отметили ksh и bash, я собираюсь взять Linux.

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

Лучшим способом может быть следующее:

  • Сделайте свой script, чтобы его можно было увидеть/прочитать/открыть. chmod 700 он. Удалите пароли с жестким кодом.
  • У вас есть "launcher" script, который является исполняемым пользователем и выполняет sudo.

Таким образом, пользователь может увидеть вашу программу запуска script, осмотреть ее, чтобы увидеть, что она имеет только одну командную строку. Они могут запускать его, и он работает, но у них нет прав на чтение источника для script, который является sudo'd.

Ответ 6

Я не уверен, какую версию Oracle вы используете. В старой версии Oracle (pre 9i Advanced Security) некоторый DBA будет CREATE USER OPS$SCOTT IDENTIFIED BY EXTERNALLY и установите для параметра REMOTE_OS_AUTHENT значение true.

Это означает, что ваш удаленный солнечный аппарат может аутентифицировать вас как SCOTT, а затем ваша Oracle DB примет эту аутентификацию.

Это плохая идея.

Как вы могли бы изобразить любую Windows XP с локальным пользователем SCOTT, вы можете войти в свою БД без пароля.

К сожалению, это единственный вариант, который я знаю о СУБД Oracle 9i, чтобы не хранить имя пользователя/пароли в вашем script или в другом месте, доступном на клиентской машине.

Какое бы ваше решение вам стоило взглянуть на Oracle "Блокировка проекта" перед тем, как совершить.

Ответ 7

Для хранения паролей вы можете выполнить двухэтапную процедуру шифрования, сначала с жестко запрограммированным ключом в вашем script и, возможно, 2-й раз с ключом, хранящимся в файле (который устанавливается с использованием разрешений для файлов с ограниченным доступом).

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

Нет идеального решения, потому что вы должны иметь возможность расшифровать и получить пароль cleartext... и если вы можете это сделать, то кто-то может тоже, если у них есть правильная информация.

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

Некоторые практические примеры реализации здесь

Ответ 8

В UNIX я всегда делаю эти скрипты setuid и сохраняю информацию о пользователе и пароле в файле, который сильно защищен (все дерево каталогов не читается/доступно для поиска обычными пользователями, а сам файл доступен для чтения только владельцем script).

Ответ 9

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

Если вы хотите получить фантазию, SUID-программа может проверить /proc//exe и cmdline (в Linux) и только потом выпустить имя пользователя.

Ответ 10

У меня/была аналогичная проблема с разработчиками, развертывающими SQL-код в MSSQL (фактически в любую базу данных на этом сервере MSSQL, поэтому роль должна была быть SysAdmin) с использованием ANT с сервера Solaris. Снова я не хотел хранить имя пользователя и пароль в файлах ANT build.xml, поэтому мое решение, которое, как я знаю, не является идеальным, выглядит следующим образом:

  • Сохранять имя/значение пар для имени пользователя и пароля в текстовом файле
  • Зашифровать файл (в Solaris) и использовать пароль, известный только некоторым администраторам
  • Оставьте только зашифрованный файл в системе Solaris
  • ANT build.xml запускает sudo decrypt и запрашивает пропущенную фразу, которая вводится администратором
  • ANT источники дешифрованного файла, загружающие имя пользователя и пароль в качестве переменных для строки SQL
  • ANT немедленно удалил файл открытого текста
  • ANT развертывает код и завершает работу

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

Я уверен, что это может быть лучше, но...

JB

Ответ 11

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

Я бы рекомендовал использовать аутентификацию ОС на самом сервере db - REMOTE_OS_AUTHENT по-прежнему ЛОЖЬ.

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

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

Инго

Ответ 12

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

Этого достаточно для нескольких.

Ключевые слова: пароль HardCoding

Ответ 13

Есть коммерческие или более продвинутые решения, такие как cyberark AIM, которые могут сделать это лучше, но, делая это бесплатно и из коробки, я пошёл обратно на публичный/закрытый ключ SSH, потому что для одного, пары ключей SSH, скорее всего, уже созданы соответствующие правила безопасности; во-вторых, пары ключей SSH уже имеют набор стандартных протоколов для защиты ключей по разрешению файла, непрерывного затвердевания системы (например, tripwire) или поворота ключа.

Вот как я это сделал:

  • Создайте пары ключей ssh, если они еще не созданы. Клавиши и каталог ключей будут защищены по системному протоколу/разрешению по умолчанию. ssh-keygen -t rsa -b 2048

  • использовать открытый ключ ssh для шифрования строки и сохранения в том же каталоге .ssh $ echo "secretword" | openssl rsautl -encrypt -inkey ~/.ssh/id_rsa.pub -pubin -out ~/.ssh/secret.dat

  • использовать закрытый ключ ssh для дешифрования ключа и передать параметры сценариям /AP в реальном времени. script/programe включить строку для дешифрования в реальном времени: Строка = openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in ~/.ssh/secret.dat

PS - Я экспериментировал с безрежимным решением CYBERARK AIM. это своего рода боль требует значительных изменений/изменений API для API/ script. будет держать вас в курсе, как это происходит.