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

РЕДАКТИРОВАТЬ # 2: найти причину AirBnbs в их Руководстве по стилю Javascript

Не забудьте назвать выражение - анонимные функции могут затруднить поиск проблема в стеке вызовов ошибки ( Обсуждение )

blockquote>

Исходный ответ ниже

MDN имеет хорошее отклонение от того, как function name inference работает, включая два предупреждения:

Замечания

Существует нестандартное поведение вывода .name в следующих двух сценариях:

  1. при использовании интерпретаторов сценариев

Интерпретатор сценария установит свойство имени функции только в том случае, если функция не имеет собственного свойства с именем name. ..

blockquote>
  1. при использовании js tooling

Будьте осторожны при использовании преобразований Function.name и исходного кода, таких как выполняемые с помощью компрессоров (minifiers) JavaScript или обфускаторов

....

В несжатом версия запускается в правдивую ветвь, а logs «foo» - это экземпляр «Foo», тогда как в сжатой версии он ведет себя по-разному и переходит в else-ветку. Поэтому, если вы полагаетесь на Function.name, как в приведенном выше примере, убедитесь, что ваш конвейер сборки не меняет имена функций или не предполагает, что функция имеет определенное имя.

blockquote>

Что такое выражение имени функции?

Свойство name возвращает имя функции или (до реализации ES6) пустую строку для анонимных функций

blockquote>
function doSomething() {}

console.log(doSomething.name); // logs "doSomething"

Функции, созданные с помощью синтаксиса new Function (...) или просто Function (...), имеют свойство name для пустой строки. В следующих примерах создаются анонимные функции, поэтому имя возвращает пустую строку

blockquote>
var f = function() {};
var object = {
  someMethod: function() {}
};

console.log(f.name == ''); // true
console.log(object.someMethod.name == ''); // also true

Браузеры, которые реализуют функции ES6, могут вывести имя анонимной функции из ее синтаксической позиции . Например:

var f = function() {};
console.log(f.name); // "f"

Мнение

Лично я предпочитаю (стрелка) функции, назначенные переменной по трем основным причинам:

Во-первых, я не ever используют function.name

Во-вторых, смешение лексической области именных функций с назначением немного ослабляет:

// This...
function Blah() {
   //...
}
Blah.propTypes = {
 thing: PropTypes.string
}
// ...is the same as...
Blah.propTypes = {
 thing: PropTypes.string
}
function Blah() {
   //...
}

// ALTERNATIVELY, here lexical-order is enforced
const Blah = () => {
   //...
}
Blah.propTypes = {
    thing: PropTypes.string
}

И, в-третьих, все вещи, Я предпочитаю функции стрелок:

  • сообщают читателю, что нет this, no arguments и т. д.
  • выглядит лучше (imho)
  • (в прошлый раз я смотрел, функции стрелок были немного быстрее)

EDIT: моментальные снимки памяти

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

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

Плюс я использовал только снимки памяти один раз, поэтому я чувствую себя комфортно, когда по-умолчанию чувствую «инструмент» для (субъективной) ясности.

11
задан Cœur 9 April 2017 в 09:55
поделиться

12 ответов

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

7
ответ дан 3 December 2019 в 05:59
поделиться

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

0
ответ дан 3 December 2019 в 05:59
поделиться

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

  1. Название магазина / оценивает пар за имя пользователя и пароль в файле простого текста
  2. Зашифруйте файл (на Солярисе) и используйте пароль, только известный определенным администраторам
  3. Оставьте только зашифрованный файл в системе Соляриса
  4. МУРАВЕЙ build.xml выполняет sudo, дешифрует и подсказки для пароля, который вводится администратором
  5. Источники МУРАВЬЯ дешифровали файл, загружающий имя пользователя и пароль как переменные для строки SQL
  6. МУРАВЕЙ сразу удалил файл простого текста
  7. МУРАВЕЙ развертывает код и выходы

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

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

JB

0
ответ дан 3 December 2019 в 05:59
поделиться

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

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

0
ответ дан 3 December 2019 в 05:59
поделиться

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

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

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

Поскольку Вы могли отобразить любой Windows XP с локальным пользователем SCOTT, мог затем войти в Ваш DB без пароля.

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

Что когда-либо Ваше решение это - стоящее взглянуть через Блокировку Oracle Проекта перед фиксацией.

1
ответ дан 3 December 2019 в 05:59
поделиться

Так как Вы отметили ksh и удар, я собираюсь принять Linux.

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

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

  1. Сделайте свой сценарий, таким образом, он может только рассматриваться/считаться/открываться Вами. chmod 700 это. Пароли Hardcode далеко.
  2. Имейте сценарий "средства запуска", который является исполняемым файлом пользователем и делает sudo.

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

1
ответ дан 3 December 2019 в 05:59
поделиться

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

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

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

1
ответ дан 3 December 2019 в 05:59
поделиться

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

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

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

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

Некоторые практические примеры для того, как реализовать, здесь

1
ответ дан 3 December 2019 в 05:59
поделиться

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

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

4
ответ дан 3 December 2019 в 05:59
поделиться

Если сценарий работает удаленно с сервера.

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

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

5
ответ дан 3 December 2019 в 05:59
поделиться

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

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

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

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

0
ответ дан 3 December 2019 в 05:59
поделиться

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

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

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

0
ответ дан 3 December 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: