我的情况不是很普通,或者对某人来说很普通。我需要在数据库中存储一些密码。 让我解释一下我真正需要的东西。
我有一些服务器,我需要每天访问3次,每天,全年,是一种不间断的服务,SSH服务在每一个都运行,而且我有我的每天3次请求访问每个服务器的软件。 好吧,一切都按照我的意愿运作,问题是,密码!如何管理所有密码!
今天我在脚本中有所有服务器密码(实际运行SSH服务的脚本相同),因为我使用SSH2 PHP函数ssh2_auth_password()
对服务器进行身份验证,但它是纯文本。 / p>
这个函数ssh2_ auth_ pubkey_ file()
怎么样?我该怎么用?
是否安全,将密码存储在我自己的脚本中?我不这么认为..
然后在这种情况下该怎么做?如果我将密码存储在数据库中,我将需要在每个服务器请求(它由cron运行)上检索密码,然后如果它是一个哈希,我可以与我的脚本中的另一个哈希进行比较并返回一个纯文本功能验证,仍然是纯文本..(但我认为它还不是一个好的解决方案!)。
EnCrypt密码然后DeCrypt每个服务器请求的密码?也许可能..
有人知道在这种情况下最好做什么吗?
我在游泳池里!
提前感谢任何光明!
[EDITED]
My Arch是Kernel Linux 2.6中的大多数, SaaS应用程序在外部(中立服务器)上运行 CronJobs是每天3次运行的regurlary,一切都是通过命令行自动运行,没有人为干预。
[已编辑更多]
我应该在哪里生成密钥对?对于我的所有服务器,只有一个密钥对包括SaaS APP服务器吗?或者我需要逐个生成? 有点困惑..
CRON JOBS (fire servers) 3x/day
------------
| SaaS APP |________________________
________------------_______ |
| | | |
| | | |
----------- ----------- ----------- |
| SERVER1 | | SERVER2 | | SERVER3 | .... SERVER4 ....
----------- ----------- -----------
再次感谢!
答案 0 :(得分:4)
如果您通过ssh进行内部服务器通信,则可以使用publickeys。如果您只是使用基于密码的身份验证,则可以在目标服务器受到破坏或SSL SSLner被破解时抢占密码。问题是,你必须每次都给出密码(好吧,你可以使用无密码的pubkeys,但最好不要)。要克服这个困难,您可以使用公钥和存储auth密码的ssh代理,这样您每次重启时只需键入一次这些密码。
答案 1 :(得分:1)
您可以使用mcrypt_encrypt
PHP函数将您的密码存储在数据库/文件中,并在每次连接之前自动解密此密码。当然,您需要另一个密码来加密您的SSH密码,这个密码可以存储在另一个文件中,或者如前所述,每次重启后都会为此密码提供密码并将其存储在内存中。
示例:
<?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)
?>
答案 2 :(得分:1)
您使用ssh2_auth_pubkey_file()
走在正确的轨道上。
ssh-keygen
生成公钥/私钥对。~/.ssh/authorized_keys
。将客户端中的身份验证代码更改为以下内容:
$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";
}