vSphere 开发指南1——vSphere Automation API

发布于 2024-09-29 09:50:25 字数 7837 浏览 9 评论 0

0x00 前言

VMware vCenter Server 是 VMware 虚拟化管理平台,广泛的应用于企业私有云内网中。站在渗透测试工具开发的角度,我们需要通过命令行实现 vCenter Server 同虚拟机的交互。

本系列文章将要比较多种不同的 API,介绍实现细节,开源代码,实现以下功能:

  • 读取虚拟机的配置
  • 查看虚拟机文件
  • 删除虚拟机文件
  • 向虚拟机上传文件
  • 从虚拟机下载文件
  • 在虚拟机中执行命令

0x01 简介

本文将要介绍以下内容:

  • 基础知识
  • vSphere Automation API 开发细节
  • 开源代码 vSphereAutomationAPI_Manage.py

0x02 基础知识

1.VMware vSphere

VMware vSphere 是整个 VMware 套件的商业名称,而不是特定的产品或软件

VMware vSphere 的两个核心组件是 ESXi 服务器和 vCenter Server

2.ESXi

ESXi 是 hypervsior,可以在其中创建和运行虚拟机和虚拟设备。

3.vCenter Server

  • vCenter Server 是用于管理网络中连接的多个 ESXi 主机和池主机资源的服务
  • vCenter Server 可安装至 Linux 系统中,通过安装 vCenter Server Appliance(VCSA) 实现
  • vCenter Server 也可安装至 Windows 系统中,通过安装 Vmware Integrated Management(VIM) 实现

0x03 vSphere Automation API 开发细节

官方文档:https://developer.vmware.com/docs/vsphere-automation/latest/

为了能够通过命令行实现 vCenter Server 同虚拟机的交互,我们需要使用 vSphere Automation API 中的 vSphere REST API 部分

VMware 在 vSphere 6.0 版本中引入了 REST API,从 vSphere7.0U2 开始,VMware 宣布弃用旧的 REST API,使用新的 REST API

参考资料:https://core.vmware.com/blog/vsphere-7-update-2-rest-api-modernization

经过对比,发现旧的 REST API(低于 vSphere7.0U2) 不支持以下操作:

  • 查看虚拟机文件
  • 删除虚拟机文件
  • 向虚拟机上传文件
  • 从虚拟机下载文件
  • 在虚拟机中执行命令

而新的 REST API 能够满足需求,所以在开发上我们需要先对 vCenter 的版本进行判断,如果满足要求(不低于 vSphere7.0U2),那么才使用 vSphere Automation API

1.已有的开源代码

https://github.com/vmware/vsphere-automation-sdk-python/

vSphere Automation Python SDK 示例

/samples/vsphere/vcenter/vm 文件夹下有可供参考的实现代码,其中, samples/vsphere/vcenter/vm/guest/guest_ops.py 实现了在虚拟机中执行命令

测试环境 1:192.168.1.1(vCenter 6.7.0)

Windows 环境加载该脚本的示例命令如下:

cd /vsphere-automation-sdk-python-master/
set PYTHONPATH=%cd%;%PYTHONPATH%
python samples/vsphere/vcenter/vm/guest/guest_ops.py -s 192.168.1.1 -u administrator@vsphere.local -p Password1 --skipverification --vm_name "Linux1" --root_user root --root_passwd Password2

脚本执行失败,提示如下:

com.vmware.vapi.std.errors_client.OperationNotFound: {messages : [LocalizableMessage(id='vapi.method.input.invalid.interface', default_message="Cannot find service 'com.vmware.vcenter.vm.guest.filesystem.directories'.", args=['com.vmware.vcenter.vm.guest.filesystem.directories'], params=None, localized=None)], data : None, error_type : OPERATION_NOT_FOUND}

测试环境 2:192.168.1.2(vCenter 7.0.2)

Windows 环境加载该脚本的示例命令如下:

cd /vsphere-automation-sdk-python-master/
set PYTHONPATH=%cd%;%PYTHONPATH%
python samples/vsphere/vcenter/vm/guest/guest_ops.py -s 192.168.1.2 -u administrator@vsphere.local -p Password1 --skipverification --vm_name "Linux1" --root_user root --root_passwd Password2

脚本执行成功

经过更多的测试后,印证结论:vSphere Automation API 在低版本(低于 vSphere7.0U2) 无法实现以下操作:

  • 查看虚拟机文件
  • 删除虚拟机文件
  • 向虚拟机上传文件
  • 从虚拟机下载文件
  • 在虚拟机中执行命令

2.参考文档用原始数据包实现

参考文档:https://developer.vmware.com/docs/vsphere-automation/latest/vcenter/

在实现上,首先需要发送用户名和明文口令获得 Session,使用 Session 作为登录凭据,进行后续的操作

具体实现细节如下:

(1) 判断 vCenter 的版本

获得粗略版本的方法:

浏览器访问: https://<server_hostname>/sdk/vimServiceVersions.xml

返回结果为 xml 数据,无法获得具体的版本

获得详细号版本的方法:

访问: https://<server_hostname>/sdk/

正文内容如下:

<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <env:Body>
      <RetrieveServiceContent xmlns="urn:vim25">
        <_this type="ServiceInstance">ServiceInstance</_this>
      </RetrieveServiceContent>
      </env:Body>
      </env:Envelope>

注:vSphere 7.0U2 对应对 build 属性为 17630552

(2) Create_Session

添加 Header:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

其中, dXNlcm5hbWU6cGFzc3dvcmQusername:password 作 Base64 编码后的结果

返回结果格式:响应码 201,格式为 application/json 类型

(3) List_Guest_Processes

请求正文需要 json 格式的数据作为凭据,用来登录虚拟机

格式示例:

{
    "credentials":
    {
        "interactive_session":False,
        "type":"USERNAME_PASSWORD",
        "password":"Password123",
        "saml_token":None,
        "user_name":"test1"
    }
}

(4) vCenter 同虚拟机传输文件

参考文档:https://developer.vmware.com/docs/vsphere-automation/latest/vcenter/api/vcenter/vm/vm/guest/filesystemactioncreate/post/

官方文档描述的不够详细

这里给出我经过测试得出的结论:

1.将文件从本地发送至虚拟机,即向虚拟机发送该文件,先调用 Create_Temporary_Guest_Filesystem_Files 创建指定文件对应的 uri

发送的内容格式如下;

data =  {
            "credentials":
            {
                "interactive_session":False,
                "type":"USERNAME_PASSWORD",                    
                "saml_token":None,
                "user_name":guest_user_name,
                "password":guest_user_password
            },
            "spec": 
            {
                "path": path
            }
        }

不带有 size 属性

发送成功后返回该文件对应的 uri,使用 PUT 方法访问 uri,data 字段为发送的文件内容

2.将该文件从虚拟机发送至本地,即读取虚拟机中的文件,先调用 Create_Temporary_Guest_Filesystem_Files 创建指定文件对应的 uri

发送的内容格式如下;

data =  {
            "credentials":
            {
                "interactive_session":False,
                "type":"USERNAME_PASSWORD",                    
                "saml_token":None,
                "user_name":guest_user_name,
                "password":guest_user_password
            },
            "spec": 
            {
                "path": path,
                "attributes": 
                {
                    "overwrite": True,
                    "size": size,
                }
            }
        }

必须带有 size 属性

发送成功后返回该文件对应的 uri,使用 GET 方法访问 uri,在获取文件内容时需要区分文本格式和二进制格式,文本格式可以使用 r.text 读取,二进制格式可以使用 r.content 读取

0x04 开源代码

完整的开源代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-Python/blob/master/vSphereAutomationAPI_Manage.py

代码适用版本:vSphere 7.0U1+

支持以下功能:

  • 读取虚拟机的配置
  • 查看虚拟机文件
  • 删除虚拟机文件
  • 向虚拟机上传文件
  • 从虚拟机下载文件
  • 在虚拟机中执行命令

具体命令如下:

  • ListVM
  • GetVMConfig
  • ListHost
  • ListVMProcess
  • CreateVMProcess
  • KillVMProcess
  • ListVMFolder
  • DeleteVMFile
  • DownloadFileFromVM
  • UploadFileToVM

其中,对于虚拟机的操作,支持 Windows 和 Linux 系统

0x05 小结

本文介绍了通过 vSphere Automation API 实现 vCenter Server 同虚拟机交互的方法,开源实现代码 vSphereAutomationAPI_Manage.py,记录开发细节。

对于 vSphere Automation API,有些操作不支持低版本的 vCenter(<vSphere7.0U2),导致通用性不够,所以下篇文章将要介绍更为通用的实现方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

深海夜未眠

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

xu362930323

文章 0 评论 0

缱倦旧时光

文章 0 评论 0

qq_eXruk9

文章 0 评论 0

遂心如意

文章 0 评论 0

guojiayue1

文章 0 评论 0

愿与i

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文