应用到应用的密码管理API
(只有白金版和企业版支持该功能。PMP 6200及以上版本。)
概览
对于使用密码彼此才能连接的应用程序或脚本来说,通过PMP提供的密码管理API,你不再需要在配置文件或代码使用明文密码。可以随时从PMP中安全地获取密码,这样管理员可以放心的执行周期性密码更改,不用再担心修改一个密码之后,还要在很多使用该密码的地方修改。
密码管理API
从6.2版本开始,PMP提供2种API:
- 一个在HTTPS之上基于XML-RPC的全面应用API
- 一个在SSH之上的命令行API
二者都使用公钥加密算法来访问PMP。XML-RPC API还提供了JAVA包来方便于JAVA应用程序的集成。
配置密码管理API - 总体步骤
以下是配置和使用密码管理API的总体步骤:
- 先在PMP创建只用于API访问的用户。而且每个API用户要绑定到一个具体终端(使用API的服务器或桌面机)。所以用户账户的ID最终形式为user@hostname。
- 一个API用户可以单独或同时使用XML-RPC、SSH CLI。
- API用户使用公钥加密算法。所以每个用户,根据使用的API类型,要满足以下条件:
- 使用XML-RPC API,使用用户名作为常用名称(CN)的X.509格式SSL证书。
- 使用SSH CLI,OpenSSH格式的公钥,相应的user@host用户私钥。
- PMP内建了XML-RPC和SSH服务器,确保二者的端口没有被其他程序占用,没有被防火墙阻断。
- 在创建了API用户,并且启用了XML-RPC、SSH服务器后,PMP的密码管理API就可以使用了。
- 管理员可以为API用户分配可访问的密码,就像对其他用户一样。当然API用户只能通过API访问授权了的密码。
- 当前API支持密码的获取、修改和创建操作。
下图描述了密码管理API使用的总体步骤:
详细的配置过程
前提条件
1. 在PMP中创建API用户
这是配置使用密码管理API的第一步,如上所述,要创建只用于API访问的用户,而且每个用户要绑定到一个具体的终端(服务器或桌面机)。最终用户格式为user@hostname。
创建API用户步骤:
- 在管理 >> 用户 >> 添加用户中点击创建API用户。
- 在添加API用户页面中,输入用户名。很重要的一点是,该名称也用于SSL证书的“常用名称(CN)”,证书的“组织名称(O)”应该和PMP的全名(Manage Engine Password Manager Pro)一致。
- 输入从哪里访问API的主机名称。用户名和主机名组成一个API用户的ID,例如用户名为test,从主机test-server访问,组成的API用户ID就是test@test-server。
- 全名就是展示给外部世界的名称。例如在报表和审计记录中。默认为“用户名-主机名 - API User”,例如 test@test-server - API User。当然,你可以定义为你喜欢的名称。
- 选择API用户的权限:管理员/密码管理员/密码用户
- 如果选择了“管理员”或“密码管理员”,你要设置访问范围:拥有的和共享的密码或者系统中所有的密码(这将使这个用户成为超级管理员)。
- SSH连接需要通过公钥身份验证。这需要提供该用户的公钥。
- 打开命令提示行,运行命令ssh-keygen。
- 默认情况下,私钥保存在id_rsa文件中。公钥保存在id_rsa.pub文件中。这2个文件位于命令提示行的当前路径中。
- 如果你要更改存储位置。你要导入id_rsa.pub。最后存储在<PMP_HOME>/<user name>/.ssh/authorized_keys文件中。
- 如果你要添加多一层保护,你可以输入SSH密钥的密码。输入并确认密码后,就在SSH密钥中添加了密码保护,这样的话,当你每一次使用SSH密钥的时候都要输入该密码。
- 生成了密钥后,在添加API用户页面中导入公钥。
- 下面是ssh-keygen的输出示例:
- XML-RPC API需要X.509格式的SSL证书。
- 证书可以使用OpenSSL创建。证书可以由CA(数字证书认证机构)签名或者自签名。
- 生成了证书后,你也可以选择找第三方CA(数字证书认证机构)来签名或者自签名。下面分别说明操作步骤:
- 主要的CA有Verisign (http://verisign.com)、 Thawte (http://www.thawte.com)、RapidSSL (http://www.rapidssl.com)。选择一个CA进入其网站,提交csr。CA或许收取签名费。
- 一般要等几天,CA会给你签名的SSL证书和其根证书.cer文件。
- 保存到步骤1和2生成文件存放到位置。
假如你要创建全新的SSH格式密钥串,参考下面的步骤:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/xyz/.ssh/identity): /home/xyz/.ssh/pmp_identity
Enter passphrase (empty for no passphrase): *在这里输入密码*
Enter same passphrase again: *确认密码*
Your identification has been saved in /home/xyz/.ssh/pmp_identity.
Your public key has been saved in /home/xyz/.ssh/pmp_identity.pub.
The key fingerprint is:
22:71:3c:ff:7e:df:59:ad:72:47:d1:16:bd:e2:e9:2d xyz@xyz
以上是生成Open SSH密钥串的过程。你也可以根据需要使用其他工具来生成密钥。
步骤1:生成证书
使用openssl创建证书共2步:
生成私钥
openssl genrsa -des3 -out server.key 2048
生成证书请求
使用上步的私钥来创建证书请求。执行下面命令,输入密钥密码,常用名称,主机名或IP地址:
openssl req -new -key server.key -out server.csr
步骤2:从CA获取签名
-或者-
自签名证书
获取自签名证书需要以下几步:
步骤1:创建私钥
运行以下命令:
openssl genrsa -des3 -out server.key 2048
该命令输出如下:
Generating RSA private key, 2048 bit long modulus
.....++++++
.............
.++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key: 输入密码
Verifying - Enter pass phrase for ca.key: 确认密码
步骤2:不通过CA创建公钥
命令如下:
openssl req -new -x509 -key server.key -out server.crt -days 1095
该命令输出如下:
Enter pass phrase for ca.key: password
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:CA
Locality Name (eg, city) []:Pleasanton
Organization Name (eg, company :Zoho Corporation
Organizational Unit Name (eg, section) []:Manage Engine Password Manager Pro
Common Name (eg, YOUR name) []:localhost
Email Address []:
注意:如果你输入“.”,字段将保留为空。
生成PKCS12证书文件
生成了自签名crt文件后,要被密码管理API使用,还要将其转为PKCS12(公钥加密算法12号标准)格式。命令如下:
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server_cert.p12 -name "PMP"
继续添加API用户页面中操作:
- 输入用户所属部门(可选)
- 输入用户位置(可选)
- 点击保存。
到此为止,API用户就添加好了。下面讲解如何使用API来操作密码。
配置SSH CLI访问的步骤
步骤汇总
- 按照上面的说明来创建API用户。
- 服务器端配置
- 启动SSH服务器
- 配置客户端来让应用程序访问PMP
服务器端配置
PMP内置了SSH服务器,默认,端口为5522。当然你可以配置为其他端口。
配置SSH服务器端口,并启动
- 打开管理 >> 全局 >> 密码管理API >> SSH CLI"
- 如果需要,更改SSH服务器端口
- 点击启动SSHD服务器
应用程序访问PMP
完成上面的配置后,应用程序就可以使用API操作该API用户有权访问的密码了。可以进行密码获取、修改和创建账户等操作。
客户端密码访问工作流:如何工作的?
每个用户创建私钥/公钥串进行身份验证。服务器知道公钥,但是只有用户知道私钥。<PMP_HOME>/<user name>/.ssh/authorized_keys文件中记录可登录的公钥。用户登录的时候,ssh程序告诉服务器哪个密钥串讲用于身份验证。服务器检查该密钥是否已授权,然后发送给用户一个“质询”,就是一个使用公钥加密的随机数。用户使用私钥解密该质询证明自己。验证成功后,就可以使用API操作密码了。
API用户连接PMP执行密码操作
可以使用任意标准的openssh命令来访问SSH服务器。如下例子所示,你可以使用PMP API命令来操作密码。
ssh -q [-p port] user@hostname [-i private_key] [PMP API命令]
例如:ssh -q -p 5522 test@test-server -i /home/guest/id_rsa [PMP API命令]
MSP版本使用如下命令:
ssh -q [-p port] ORGNAME/user@hostname [-i private_key] [PMP API命令]
例如:ssh -q -p 5522 MANAGEENGINE/test@test-server -i /home/guest/id_rsa [PMP API命令]
PMP的SSH CLI API命令
密码获取
ssh -q [-p port] user@hostname [-i private_key] RETRIEVE --resource=<PMP中的资源名称> --account=<PMP中的账户名称> --reason=<密码访问原因> --ticketid=<密码访问的工单ID>
例如:
ssh -q -p 5522 test@test-server -i /home/guest/id_rsa RETRIEVE --resource=test-server --account=root --reason=Testing password retrieval using ssh client API --ticketid=7
密码重置
本地密码重置
ssh -q [-p port] user@hostname [-i private_key] RESET_LOCAL --resource=<PMP中的资源名称> --account=<PMP中的账户名称> --newpassword=<新密码> --reason=<密码重置原因> --ticketid=<密码重置工单ID>
例如:
ssh -q -p 5522 test@test-server -i /home/guest/id_rsa RESET_LOCAL --resource=test-server --account=root--newpassword=rootnew --reason=Rotating Password --ticketid=7
远程密码重置
ssh -q [-p port] user@hostname [-i private_key] RESET_REMOTE --resource=<PMP中的资源名称> --account=<PMP中的账户名称> --newpassword=<新密码> --reason=<密码重置原因> --ticketid=<密码重置工单ID>
例如:
ssh -q -p 5522 test@test-server -i /home/guest/id_rsa RESET_REMOTE --resource=test-server --account=root --newpassword=rootnew --reason=Rotating Password --ticketid=7
创建新的资源和账户
ssh -q [-p port] user@hostname [-i private_key] CREATE --resource=<要创建的资源名称> --account=<要创建的账户名称>--newpassword=<添加账户的密码> --resourcetype=<添加的资源类型> --notes=<参考信息>
例如:
ssh -q -p 5522 test@test-server -i /home/guest/id_rsa CREATE --resource=testresource --account=testaccount --newpassword=test password--resourcetype=Windows --notes=A New resource is added
参考这个文档获取更多信息。
故障排除
执行了上面的命令后,没有从PMP获得响应。
解决方法
去掉命令中的-q选项来显示警告和错误信息。例如,使用如下命令获取密码:
ssh [-p port] user@hostname [-i private_key] RETRIEVE --resource=<PMP中的资源名称> --account=<PMP中的账户名称> --reason=<密码访问原因>
根据输出信息联系技术支持。
访问PMP备用服务器(高可用部署 - SSH CLI)
如果你的PMP是高可用部署,就是当主服务器宕机的情况下使用API访问备用服务器。要进行以下简单配置:
- 把<PMP主服务器安装目录>的sshd文件夹复制到<PMP备用服务器安装目录>。
- 停止PMP主服务器
- 登录的到PMP备用服务器客户端
- 打开管理 >> 全局 >> 密码管理API >> SSH CLI
- 如果需要,更改SSH服务器端口
- 点击启动SSHD服务器
访问PMP备用服务器的命令
命令如下:
密码获取
ssh -q [-p port] user@PMP备用服务器主机名 [-i private_key] RETRIEVE --resource=<PMP中的资源名称> --account=<PMP中的账户名称> --reason=<密码访问原因>
例如:
ssh -q -p 5522 test@test-secondary-server -i /home/guest/id_rsa RETRIEVE --resource=test-server --account=root --reason=Testing password retrieval using ssh client API
但是,因为备用服务器不支持写操作,所以只能从备用服务器获取密码。
配置XML-RPC API的步骤
步骤汇总
- 按照上面的说明来创建API用户
- 服务器端配置
- 配置客户端来让应用程序访问PMP。如果你使用Java,你可以使用PMP提供的jar包。如你使用其他语言,可能使用到XML-RPC客户端。
服务器端配置
步骤1
配置XML-RPC服务器端口
步骤2: 如果你使用第三方CA签名的证书请跳过该步。如果你使用自签名证书,或者你自己拥有证书,请按以下步骤操作指定CA的根证书:
- 切换到PMP安装目录的bin目录中
- 执行importCert.bat(Windows)或importCert.sh(Linux)命令:
- 重启PMP服务器。
(在Windows中)
如果自签名证书
importCert.bat <自签名证书的绝对路径>
如果你拥有证书或有内部CA
importCert.bat <CA根证书的绝对路径>
(在Linux中)
如果自签名证书
sh importCert.sh <自签名证书的绝对路径>
如果你拥有证书或有内部CA
sh importCert.sh <CA根证书的绝对路径>
执行了上面的操作后,CA的根证书将记录在PMP中,以后该CA签名的证书就可以直接使用了。
说明:
- CA根证书位置的配置文件是<PMP安装目录>/conf/server.xml。如果因为某种原因,你要修改该配置,使用文本编辑工具打开该xml文件,搜索clientAuth="true",找到如下内容:
- 默认为jre/lib/security/cacerts。根据你的需要进行修改。
- 如果你的客户端证书启用了在线证书状态协议(OCSP),PMP将通过它执行身份验证。这样的话,就要访问互联网。如果你的网络环境中需求代理才能访问互联网,请到管理 >> 全局 >> 代理服务器中配置。
<Connector URIEncoding="UTF-8" useBodyEncodingForURI="true" acceptCount="100" clientAuth="true" port="7070"connectionTimeout="-1" debug="0" disableUploadTimeout="true" enableLookups="false" keystoreFile="conf/server.keystore" keystorePass="passtrix" truststoreFile="jre/lib/security/cacerts" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="7070" scheme="https" secure="true" sslProtocol="TLS"/>
步骤3:客户端配置
选项1:使用PMP提供的jar包
步骤1:下载Jar包
- 打开管理 >> 全局 >> 密码管理API >> XML-RPC
- 点击Java PMP API Package链接下载名称为JavaWrapper.zip的文件。
- 解压缩下载的zip文件到你应用程序所在位置。
- 解压后得到docs和lib文件夹
步骤2:编辑配置文件
- 在lib文件夹中找到JAVA_API.conf文件。
- 按照下面的说明进行编辑:
ServerName=<XML-RPC服务器所在机器的主机名。就是PMP所在主机的名称。该值默认设置好,一般不用修改。>
ServerPort=<XML-RPC服务器默认端口为7070 >
SecondaryServerName=<高可用部署中的备用服务器名称。如果你之前已经部署好了高可用,那么该项默认已经设置好,一般不用修改。如果后来你才配置高可用部署,要手动设置该项。如果你没有部署高可用,保留此项为空。>
SecondaryServerPort= <备用服务器上的XML-RPC服务器端口,默认为7070>
KeyStorePath=<PKCS12格式密钥路径>
KeyStorePassword=<PKCS12格式密钥的密码,如果有的话。>
例如:
ServerName=testserver
ServerPort=7070
SecondaryServerName=test_workstation_secondary
SecondaryServerPort=7070
KeyStorePath=C:\\openssl\\bin\\file.p12
KeyStorePassword=passtrix
PMP提供的jar文件默认包含了SSL证书。
步骤3:在你的程序中调用XML-RPC API
详细API文件位于解压缩出的docs文件夹中。
密码获取
不需要原因获取密码
retrievePassword (String resourceName, String accountName)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { System.out.println(PasswordManagerPro.getInstance().retrievePassword("test-server","administrator")); } catch (PMPException pmpEx) { } } }
需要原因获取密码
retrievePassword (String resourceName, String accountName, String reason)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { System.out.println(PasswordManagerPro.getInstance().retrievePassword("test-server","administrator","testing")); } catch (PMPException pmpEx) { } } }
需要工单ID获取密码
retrievePassword (String resourceName, String accountName, String reason, String ticketId)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { System.out.println(PasswordManagerPro.getInstance().retrievePassword("test-server","administrator","testing","7")); } catch (PMPException pmpEx) { } } }
密码重置
本地密码重置
changePassword (String accountName, String reason, String updateRemote)(这将生成随机密码)
或者
changePassword (String accountName, String reason, String newPassword, String updateRemote) (这使用你提供的密码)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { PasswordManagerPro.getInstance().changePassword("test-server","administrator","testing","false" ); } catch (PMPException pmpEx) { } } }
远程密码重置
changePassword (String accountName, String reason, String updateRemote)(这将生成随机密码)
或者
changePassword (String accountName, String reason, String newPassword, String updateRemote) (这使用你提供的密码)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { PasswordManagerPro.getInstance().changePassword("test-server","administrator","testing","true"); } catch (PMPException pmpEx) { } } }
需要工单ID重置密码
本地密码重置
changePassword (String accountName, String reason, String updateRemote, String ticketId) (这将生成随机密码)
或者
changePassword (String accountName, String reason, String newPassword, String updateRemote, String ticketId) (这使用你提供的密码)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { PasswordManagerPro.getInstance().changePassword("test-server","administrator","testing","false","7"); } catch (PMPException pmpEx) { } } }
远程密码重置
changePassword (String accountName, String reason, String updateRemote, String ticketId)(这将生成随机密码)
或者
changePassword (String accountName, String reason, String newPassword, String updateRemote, String ticketId) (这使用你提供的密码)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { PasswordManagerPro.getInstance().changePassword("test-server","administrator","testing","true","7"); } catch (PMPException pmpEx) { } } }
创建新的资源和用户账户
createResource (String resourceName, String resourceType, String accountName, String notes) (创建的账户将使用随机密码)
或者
createResource (String resourceName, String resourceType, String accountName, String newPassword, String notes) (创建的账户将使用指定密码)
例如:
import com.manageengine.pmp.PasswordManagerPro; import com.manageengine.pmp.PMPException; class Sample { public static void main(String args[]) { try { PasswordManagerPro.getInstance().createResource("Mail-Server","Windows","administrator","testing"); } catch (PMPException pmpEx) { } } }