как защитить обычный текстовый пароль в моем скрипте? (Рубин)

в моем скрипте ruby ​​мне нужно передать имя пользователя и

  • пароль в виде простого текста в форме для входа в систему. И имя пользователя, и пароль в настоящее время хранятся в моем скрипте.

  • У меня нет контроля над сервером, на котором я вхожу в систему с помощью скрипта. Скрипт локально работает нормально, и в будущем я хочу перейти на свой

  • провайдер веб-хостинга и запустите его оттуда (у меня есть доступ по ssh)

  • с помощью cron. Есть ли способ / метод, как

  • защитить пароль на случай, если кто-то случайно получит доступ к этому скрипту?


person Radek    schedule 14.02.2010    source источник
comment
Безопасность - вещь нетривиальная (chargen.matasano.com/chargen/2007/9/7/). Не делайте ничего легкомысленно.   -  person outis    schedule 14.02.2010
comment
@outis: да :-) и мне кажется, что я продолжаю запускать скрипт локально ...   -  person Radek    schedule 14.02.2010
comment
Предлагает ли сервер какие-либо другие методы аутентификации? Управляете ли вы компьютером, на котором выполняется вход скрипта, чтобы вы могли самостоятельно изменять протоколы аутентификации?   -  person outis    schedule 14.02.2010
comment
@outis: у меня нет контроля над компьютером, на котором я вхожу в систему ....   -  person Radek    schedule 14.02.2010
comment
А как насчет других методов аутентификации? Не повредит спросить у системных администраторов.   -  person outis    schedule 15.02.2010


Ответы (4)


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

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

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

Кстати о привилегиях: можно ли выполнить задачу, которую нужно автоматизировать, с помощью целевой учетной записи с пониженными привилегиями, такой как учетная запись только для чтения, или учетная запись, которая не может вносить какие-либо изменения в свой профиль? Наличие только ваших учетных данных с низким уровнем привилегий на службе хостинга снизит ваш риск (или «подверженность», как любит говорить многосложная толпа).

Предыдущий ответ, который был признан неработоспособным, ниже черты.


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

Если это действительно важно, убедитесь, что ваше соединение для запуска скрипта является криптографическим (ssh, ssl и т. Д.), И убедитесь, что скрипт использует только https для входа в систему.

Это не делает вас неуязвимым для кого-то с привилегиями root на поле (в какой-то момент идентификатор пользователя и пароль в виде открытого текста будут в памяти и, следовательно, уязвимы), но это заставляет их больше работать, чтобы они могли чтобы получить идентификатор пользователя / пароль.

Обновлено. Требование автоматизации делает вышеуказанное решение бесполезным.

person Wayne Conrad    schedule 14.02.2010
comment
@Radek, я еще подумал об этом. Пожалуйста, смотрите над линией. - person Wayne Conrad; 14.02.2010
comment
У меня есть «стандартная учетная запись unix» у поставщика веб-услуг. Мне кажется, что я с радостью запущу скрипт вручную из своего локального компьютера ;-) Я хотел знать, БЫЛО ли какое-нибудь решение для этого. - person Radek; 15.02.2010
comment
@Radek, я бы так и поступил. Удачного взлома! - person Wayne Conrad; 15.02.2010

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

Уловка состоит в том, чтобы обойти «автоматизацию» за счет однократного запуска: запустить сценарий как небольшой непрерывный процесс, который периодически просыпается и запускается. Попросите процесс запрашивать пароль при запуске или через какой-либо другой запрос API (не в командной строке!).

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

Возможно, вы захотите, чтобы задание cron проверяло процесс и предупреждало вас, если он не запущен.

person DGM    schedule 14.02.2010
comment
Хранение его в памяти - хорошая идея, хотя все еще есть шанс, что кто-то, получивший доступ на запись к сценарию, может изменить его, чтобы незаметно отправить ему копию пароля. Но да, это защитит его от любого, кто получит доступ к скрипту только для чтения, поэтому стоит подумать, если запуск в фоновом режиме не является проблемой! - person Arkku; 15.02.2010

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

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

person Arkku    schedule 15.02.2010

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

Создайте метод хеширования пароля и сделайте что-нибудь вроде этого:

require "digest/sha1"
class User
  attr_accessor :password

  def initialize(password)
    @password = hash_password(password)
  end

  def hash_password(password)
    Digest::SHA1.hexdigest(password)
  end

  def valid_password?(password)
    @password == hash_password(password)
  end
end

u = User.new("12345")
p u.password # => "8cb2237d0679ca88db6464eac60da96345513964"
p u.valid_password?("not valid") # => false
p u.valid_password?("12345") # => true

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

person August Lilleaas    schedule 14.02.2010
comment
@August Lilleaas: Привет, август, я знаю пароль, он хранится в моем скрипте, и мне нужно передать его в форме, чтобы войти в систему. Мой вопрос в том, могу ли я каким-то образом защитить такой пароль. - person Radek; 14.02.2010