2011-12-21 6 views
4

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

У меня есть несколько серверов, которые мне нужны для доступа 3 раза в день, каждый день, в течение всего года, является своего рода безостановочным сервисом, служба SSH работает в каждом из них, а также у меня есть мое программное обеспечение, которое запрашивает доступ к каждому из серверов 3 раза в день. Ну все работает отлично, как я хочу, проблема в том, ПАРОЛЬ! Как управлять всеми паролями!

Сегодня у меня есть все серверные пароли в скрипте (тот же скрипт, который фактически запускает службы SSH), поскольку я использую функции PHP SSH2 ssh2_auth_password() для аутентификации на серверах, но это простой текст.

что об этой функции ssh2_ auth_ pubkey_ file()? Как я должен использовать это?

Безопасно ли хранить пароль в моих собственных сценариях? Я так не думаю.

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

EnCrypt пароли затем дешифровать пароли каждый запрос сервера? возможно возможно ..

Есть ли у кого-нибудь идеи, что лучше всего делать в этой ситуации?

Я в бассейне!

Заранее благодарим за любой свет!

[Изменено]

My Arch является ядро ​​Linux 2.6 большинство из них, SaaS приложений, работающих на внешнем (нейтральном сервере) и CronJobs являются regurlary работает 3 раза/день все авто по командной строке , никакого взаимодействия с человеком.

[EDITED РАЗ]

Где я должен генерировать пару ключей (ы)? Достаточно ли только одной пары ключей для всех моих серверов, включая сервер SaaS APP? или мне нужно генерировать по одному? Немного путать ..

   CRON JOBS (fire servers) 3x/day 
       ------------ 
       | SaaS APP |________________________ 
     ________------------_______    | 
    |    |    |    | 
    |    |    |    | 
----------- ----------- -----------   | 
| SERVER1 | | SERVER2 | | SERVER3 | .... SERVER4 .... 
----------- ----------- ----------- 

Еще раз спасибо!

+7

«Я в бассейн!» Я прочитал это и сразу же нарисовал «Старый специй» Гай, задающий вопрос. –

+4

Не используйте пароли, используйте аутентификацию открытого/закрытого ключа. – ceejayoz

+1

Если ваш скрипт недоступен извне (и его не должно быть и не должно быть под wwwroot), тогда ваши пароли будут «безопасными»; конечно, вы должны быть уверены, что никто не может получить более высокие привилегии на вашем веб-сервере (но это должно быть сделано все равно). – Viruzzo

ответ

1

Вы находитесь на правильном пути с ssh2_auth_pubkey_file().

  1. Создание открытого/закрытого ключевого слова через ssh-keygen.
  2. Добавить открытый ключ в ~/.ssh/authorized_keys на каждом сервере.
  3. Скопируйте открытые и закрытые ключи на свои клиентские компьютеры и сделайте их доступными только для учетных записей, которые должны их использовать.
  4. Изменение кода аутентификации в клиенте на что-то вроде этого:

    $ssh_conn = ssh2_connect('my.server.addr', 22, array('hostkey'=>'ssh-rsa')); 
    if (ssh2_auth_pubkey_file(
        $ssh_conn, 
        'sshuser', 
        '/path/to/id_rsa.pub', 
        '/path/to/id_rsa', 
        'key_passphrase' 
    )) { 
        echo "Success"; 
    } else { 
        echo "Failure"; 
    } 
    
+0

Я думаю, что это так, но что произойдет, если администратор изменит с частотой пароль сервера? Должен ли я снова создать пару ключей? Спасибо – B4NZ41

+0

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

+0

Ничего себе! Это ответ, который я хотел услышать. Это определенно метод. Я попробую прямо сейчас. Еще раз спасибо. – B4NZ41

4

Если вы выполняете внутрисерверную связь через ssh, тогда определенно используйте publicickeys. Если вы просто используете аутентификацию на основе пароля, пароль может быть вырван, если целевой сервер взломан или настроен трекер SSL. Проблема в том, что вы должны каждый раз указывать пароль (ну, вы можете использовать патчи без пароля, но лучше не). Чтобы преодолеть эту трудность, вы можете использовать открытые ключи и агент ssh, который хранит ваши пароли auth, поэтому вам нужно только вводить эти пароли только один раз для каждой перезагрузки.

Pubkey auth tutorial for debian

+0

Э? Если вы можете использовать только открытые ключи, почему в мире не так ли? Более безопасный, чем смешанный подход. – Kzqai

1

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

Пример:

<?php 
$output = mcrypt_encrypt(MCRYPT_TWOFISH, $key, $plaintextPassword, MCRYPT_MODE_ECB); 
//encode to base64 for easier manipulation 
$stored = base64_encode($output); 
... 
$b64encoded = base64_decode($encryptedPassword); 
mcrypt_decrypt(MCRYPT_TWOFISH, $key, $b64encoded, MCRYPT_MODE_ECB) 
?> 
+0

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

Смежные вопросы