Лучшие практики хранения паролей в сценариях оболочки/Perl?

StackOverflow https://stackoverflow.com/questions/80612

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Лучшей практикой, ИМХО, было бы НЕ хранить пароли в сценарии оболочки/Perl.Для этого и нужна аутентификация с открытым ключом.

Другие советы

Если скрипт запущен удаленно с сервера.

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

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

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

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

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

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

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

Поскольку вы отметили ksh и bash, я предполагаю, что это Linux.

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

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

  1. Сделайте свой скрипт таким, чтобы его могли видеть/читать/открывать только вы.chmod 700 это.Жесткие пароли исчезнут.
  2. Имейте сценарий «запуска», который исполняется пользователем и выполняет sudo .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Сохраняйте пары имя/значение для имени пользователя и пароля в текстовом файле.
  2. Зашифруйте файл (в Solaris) и используйте пароль, известный только определенным администраторам.
  3. Оставьте в системе Solaris только зашифрованный файл.
  4. ANT build.xml запускает расшифровку sudo и запрашивает парольную фразу, которую вводит администратор.
  5. Источники ANT расшифровывают файл, загружая имя пользователя и пароль в качестве переменных для строки SQL.
  6. ANT немедленно удалил текстовый файл.
  7. ANT развертывает код и завершает работу.

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

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

Джей Би

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

Я бы рекомендовал использовать аутентификацию ОС на самом сервере БД - REMOTE_OS_AUTHENT по-прежнему имеет значение FALSE.

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

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

Инго

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

Этого должно хватить немногим.

Ключевые слова:Жесткое кодирование пароля

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

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

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

  2. Используйте открытый ключ SSH, чтобы зашифровать строку и хранить в том же .ssh Directory $ echo "Секретное слово" | OpenSsl RSAUTL -ENCRYPT -INKEY ~/.SSH/ID_RSA.PUB -PUBIN -UT ~/.SSH/secret.dat

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top