应用到应用的密码管理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用户步骤:

    1. 管理 >> 用户 >> 添加用户中点击创建API用户
    2. 添加API用户页面中,输入用户名。很重要的一点是,该名称也用于SSL证书的“常用名称(CN)”,证书的“组织名称(O)”应该和PMP的全名(Manage Engine Password Manager Pro)一致。
    3. 输入从哪里访问API的主机名称。用户名和主机名组成一个API用户的ID,例如用户名为test,从主机test-server访问,组成的API用户ID就是test@test-server
    4. 全名就是展示给外部世界的名称。例如在报表和审计记录中。默认为“用户名-主机名 - API User”,例如 test@test-server - API User。当然,你可以定义为你喜欢的名称。
    5. 选择API用户的权限:管理员/密码管理员/密码用户
    6. 如果选择了“管理员”或“密码管理员”,你要设置访问范围:拥有的和共享的密码或者系统中所有的密码(这将使这个用户成为超级管理员)
    7. SSH连接需要通过公钥身份验证。这需要提供该用户的公钥。
    8. 假如你要创建全新的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密钥串的过程。你也可以根据需要使用其他工具来生成密钥。

    9. 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访问的步骤

步骤汇总

    1. 按照上面的说明来创建API用户。
    2. 服务器端配置
    3. 启动SSH服务器
    4. 配置客户端来让应用程序访问PMP

服务器端配置

PMP内置了SSH服务器,默认,端口为5522。当然你可以配置为其他端口。

配置SSH服务器端口,并启动

    1. 打开管理 >> 全局 >> 密码管理API >> SSH CLI"
    2. 如果需要,更改SSH服务器端口
    3. 点击启动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访问备用服务器。要进行以下简单配置:

    1. 把<PMP主服务器安装目录>的sshd文件夹复制到<PMP备用服务器安装目录>。
    2. 停止PMP主服务器
    3. 登录的到PMP备用服务器客户端
    4. 打开管理 >> 全局 >> 密码管理API >> SSH CLI
    5. 如果需要,更改SSH服务器端口
    6. 点击启动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的步骤

步骤汇总

    1. 按照上面的说明来创建API用户
    2. 服务器端配置
    3. 配置客户端来让应用程序访问PMP。如果你使用Java,你可以使用PMP提供的jar包。如你使用其他语言,可能使用到XML-RPC客户端。

服务器端配置

步骤1

配置XML-RPC服务器端口

    1. 打开管理 >> 全局 >> 密码管理API >> XML-RPC
    2. 如果需要,更改XML-RPC服务器端口。默认为7070。
    3. 点击保存
    4. 重新启动PMP来使端口更改生效。

步骤2: 如果你使用第三方CA签名的证书请跳过该步。如果你使用自签名证书,或者你自己拥有证书,请按以下步骤操作指定CA的根证书:

    1. 切换到PMP安装目录的bin目录中
    2. 执行importCert.bat(Windows)或importCert.sh(Linux)命令:
    3. (在Windows中)

      如果自签名证书

      importCert.bat <自签名证书的绝对路径>

      如果你拥有证书或有内部CA

      importCert.bat <CA根证书的绝对路径>

      (在Linux中)

      如果自签名证书

      sh importCert.sh <自签名证书的绝对路径>

      如果你拥有证书或有内部CA

      sh importCert.sh <CA根证书的绝对路径>

    4. 重启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包

    1. 打开管理 >> 全局 >> 密码管理API >> XML-RPC
    2. 点击Java PMP API Package链接下载名称为JavaWrapper.zip的文件。
    3. 解压缩下载的zip文件到你应用程序所在位置。
    4. 解压后得到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, 卓豪(北京)技术有限公司,保留一切权利。

顶部