# 应用到应用的密码管理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格式密钥串，参考下面的步骤： 打开命令提示行，运行命令ssh-keygen。 默认情况下，私钥保存在id_rsa文件中。公钥保存在id_rsa.pub文件中。这2个文件位于命令提示行的当前路径中。 如果你要更改存储位置。你要导入id_rsa.pub。最后存储在<PMP_HOME>/<user name>/.ssh/authorized_keys文件中。 如果你要添加多一层保护，你可以输入SSH密钥的密码。输入并确认密码后，就在SSH密钥中添加了密码保护，这样的话，当你每一次使用SSH密钥的时候都要输入该密码。 生成了密钥后，在添加API用户页面中导入公钥。 下面是ssh-keygen的输出示例： 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密钥串的过程。你也可以根据需要使用其他工具来生成密钥。 XML-RPC API需要X.509格式的SSL证书。 证书可以使用OpenSSL创建。证书可以由CA(数字证书认证机构)签名或者自签名。 #### 步骤1：生成证书 使用openssl创建证书共2步： 生成私钥 openssl genrsa -des3 -out server.key 2048 生成证书请求 使用上步的私钥来创建证书请求。执行下面命令，输入密钥密码，常用名称，主机名或IP地址： openssl req -new -key server.key -out server.csr 生成了证书后，你也可以选择找第三方CA(数字证书认证机构)来签名或者自签名。下面分别说明操作步骤： #### 步骤2：从CA获取签名 主要的CA有Verisign (http://verisign.com)、 Thawte (http://www.thawte.com)、RapidSSL (http://www.rapidssl.com)。选择一个CA进入其网站，提交csr。CA或许收取签名费。 一般要等几天，CA会给你签名的SSL证书和其根证书.cer文件。 保存到步骤1和2生成文件存放到位置。 ### -或者- #### 自签名证书 获取自签名证书需要以下几步： #### 步骤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服务器端口 打开管理 >> 全局 >> 密码管理API >> XML-RPC 如果需要，更改XML-RPC服务器端口。默认为7070。 点击保存。 重新启动PMP来使端口更改生效。 #### 步骤2: 如果你使用第三方CA签名的证书请跳过该步。如果你使用自签名证书，或者你自己拥有证书，请按以下步骤操作指定CA的根证书： 切换到PMP安装目录的bin目录中 执行importCert.bat(Windows)或importCert.sh(Linux)命令： (在Windows中) 如果自签名证书 importCert.bat <自签名证书的绝对路径> 如果你拥有证书或有内部CA importCert.bat <CA根证书的绝对路径> (在Linux中) 如果自签名证书 sh importCert.sh <自签名证书的绝对路径> 如果你拥有证书或有内部CA sh importCert.sh <CA根证书的绝对路径> 重启PMP服务器。 ### 执行了上面的操作后，CA的根证书将记录在PMP中，以后该CA签名的证书就可以直接使用了。 说明： CA根证书位置的配置文件是<PMP安装目录>/conf/server.xml。如果因为某种原因，你要修改该配置，使用文本编辑工具打开该xml文件，搜索clientAuth="true"，找到如下内容： <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"/> 默认为jre/lib/security/cacerts。根据你的需要进行修改。 如果你的客户端证书启用了在线证书状态协议(OCSP)，PMP将通过它执行身份验证。这样的话，就要访问互联网。如果你的网络环境中需求代理才能访问互联网，请到管理 >> 全局 >> 代理服务器中配置。 ### 步骤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)
            {
            }
        }
    }
## 选项2：使用XML-RPC客户端（使用其他编程语言） 参考这里的详细说明。
版权所有 ©2016, 卓豪（北京）技术有限公司，保留一切权利。

顶部