一、关于加密和解密
CloudStack存储一些敏感密码和密钥用于提供安全保障。这些值被自动加密。

  • 数据库密钥(该密钥不是数据库用户密码,而是在使用cloudstack-setup-databases初始化数据库时,如果加了-m 选项,对db.properties文件中关键参数进行加密。默认为“password”,可在/etc/cloudstack/management/key文件中查看)

  • 数据库密码

  • SSH密钥

  • 计算节点root密码

  • ×××密码

  • 用户API密钥

  • VNC密码

CloudStack使用简单的java加密库(JASYPT)。使用数据库密钥加密和解密数据值,随着数据库密码一起存储在CloudStack内部属性文件中。 上面列出的其他加密值, 例如 SSH 密钥, 也被记录在CloudStack数据库中。
当然,数据库密钥本身不可以公开存储-必须被加密存储。那么,CloudStack如何阅读它呢?从外部源启动管理服务器期间必须提供另一个密钥。有2种方法提供该密钥:从文件加载或者由CloudStack的管理员提供。CloudStack数据库中有个配置项,将会告知使用了哪种方法。如果加密类型设置为 “file,” 密钥必须存在于位置已知的文件中。如果加密类型设置为 “web,” 管理员则会运行

com.cloud.utils.crypt.EncryptionSecretKeySender

工具,关键在于连接至管理服务器中一个已知的端口。

在CloudStack初始化的过程中设置加密类型,数据库密钥和管理服务器密钥。这些都是CloudStack数据库设置脚本的参数(cloud-setup-databases)。默认值是file,password和password。当然,强烈建议你修改这些密钥值。
好了,更多信息查看CloudStack官方文档。
直接上干货。

二、解密虚拟机VNC密码
新版本CS中默认启用虚拟机的VNC密码,保证安全性。但,CPVM的性能,呵呵。
所以当不想通过CPVM时,需要解密VNC密码才能连接直接通过vnc工具连接。
以KVM为例:
(其实有两个简单的方式可以让你快速得到VNC密码:1、在kvm主机中通过 "virsh edit 虚拟机名称",进去编辑状态,可以查看到明文的VNC密码。2、通过virt-manager打开某个虚拟机,先在details里面种手动将VNC密码修改,然后再使用更改后的密码登录;第二个方法慎用,可能会造成CS页面中Console功能异常,不过虚拟机关机,再开机后密码会重新生成,console恢复正常。)。
1.在CloudStack UI中查找该虚拟机的内部名称。例如:i-2-15-VM
2.在CloudStack数据库中查找该虚拟机加密后的vnc密码

mysql> select vnc_password from cloud.vm_instance where instance_name = 'i-2-15-VM' or name = 'InstanceName';
+----------------------------------------------+
| vnc_password                                 |
+----------------------------------------------+
| mmwJnTulUgSWyd/NdiXAkRtI+y+33h5dbuk4+OGpkck= |
+----------------------------------------------+
1 row in set (0.00 sec)


3.使用jasypt库解密
jasypt库路径为:

[root@localhost ~]# /usr/share/cloudstack-common/lib/jasypt-1.9.0.jar

使用如下命令解密:

[root@localhost ~]# java -cp /usr/share/cloudstack-common/lib/jasypt-1.9.0.jar 
org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="上步骤中得到的vnc密码" 
password="数据库密钥(参见前面解释)"

例如:

[root@localhost ~]# java -cp 
/usr/share/cloudstack-common/lib/jasypt-1.9.0.jar 
org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI 
input="mmwJnTulUgSWyd/NdiXAkRtI+y+33h5dbuk4+OGpkck=" password="password"
----ENVIRONMENT-----------------
Runtime: Sun Microsystems Inc. OpenJDK 64-Bit Server VM 20.0-b12 
----ARGUMENTS-------------------
input: mmwJnTulUgSWyd/NdiXAkRtI+y+33h5dbuk4+OGpkck=
password: password
----OUTPUT----------------------
f7d7ae4bac54cfa2


其中,OUTPUT即为解密后的vnc密码,使用该密码连接VNC控制台。


三、解密计算节点root密码
还是以kvm为例,该密码为添加主机时使用的root密码。
1.在数据库host_details表中查出加密后的主机密码字段

mysql> select * from cloud.host_details where name="password";
+----+---------+----------+----------------------------------+
| id | host_id | name     | value                            |
+----+---------+----------+----------------------------------+
| 10 |       1 | password | jQ5GklnC7FEShUJUo0uZs4p9LYclP8ng |
| 20 |       4 | password | f8qWuceOf6AzeN+AJ82OYQN7mSqiqYPU |
| 30 |       5 | password | 6icHGY6p5O+fq+hrJ/CRv9u+SaVPvvmj |
| 40 |       6 | password | OcU/tzEcZXzKhjaxQA8n48usagBXCpPm |
+----+---------+----------+----------------------------------+
4 rows in set (0.00 sec)


2.复制value值,进行解密

[root@localhost ~]# java -cp /usr/share/cloudstack-common/lib/jasypt-1.9.0.jar 
org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI 
input="jQ5GklnC7FEShUJUo0uZs4p9LYclP8ng" password="password"
[root@localhost ~]# java -cp
 /usr/share/cloudstack-common/lib/jasypt-1.9.0.jar 
org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI 
input="f8qWuceOf6AzeN+AJ82OYQN7mSqiqYPU" password="password"
[root@localhost ~]# java -cp
 /usr/share/cloudstack-common/lib/jasypt-1.9.0.jar 
org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI 
input="6icHGY6p5O+fq+hrJ/CRv9u+SaVPvvmj" password="password"
[root@localhost ~]# java -cp
 /usr/share/cloudstack-common/lib/jasypt-1.9.0.jar 
org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI 
input="OcU/tzEcZXzKhjaxQA8n48usagBXCpPm" password="password"


其中,OUTPUT即为解密后的密码。

其他类型密码解密不再演示,自行测试。



2015-01-29日更新:部分说明