1、机密计算简介与现状IntroductionAndStatusOfConfidentialComputing04OpenAnolis龙蜥社区OpenAnolisCommunity011122云原生机密计算SIG概述OverviewOfTheCloudNativeConfidentialComputingSIG07海光CSV:海光安全虚拟化技术IntelSGX:Intel安全防护扩展IntelTDX:Intel安全虚拟化技术AMDSEV:AMD安全加密虚拟化技术ARMCCA:Arm安全加密虚拟化技术机密计算平台ConfidentialComputingPla
2、tform1214161820编程框架ProgrammingFrameworkIntelSGXSDK/PSW/DCAP:IntelSGX软件开发套件和平台软件服务232931IntelHomomorphicEncryption:Intel平台同态加密加速框架Intel_HE_Toolkit开发指南RATS-TLS:跨机密计算平台的双向传输层安全协议35374346113ApacheTeaclaveJavaTEESDK:面向Java生态的机密计算编程框架Apache_Teaclave_Java_TEE_SDK最佳实践运行时底座RuntimeFoundation海光
3、CSV机密容器4747566168基于runtime-attestation使用机密容器基于pre-attestation使用机密容器基于runtime-attestation使用签名容器海光CSV机密虚拟机72IntelTDX机密容器解决方案SolutionOcclum:基于IntelSGX的轻量级LibOS818291102107109111IntelSGX虚拟机最佳实践IntelvSGX:IntelSGX虚拟化AMDSEV机密容器AMDSEV机密虚拟机InclavareContainers:面向机密计算场景的开源容器运行时技术栈Enclave-CC:进程级机密容器Inte
4、lConfidentialComputingZoo:Intel机密计算开源解决方案114115121126133部署TensorFlowServing在线推理服务部署TensorFlow横向联邦学习部署隐私集合求交方案PPML:端到端隐私保护机器学习解决方案01认识龙蜥龙蜥社区(OpenAnolis)成立于2020年9月,由阿里云、ARM、统信软件、龙芯、飞腾、中科方德、Intel等24家国内外头部企业共同成立龙蜥社区理事会,到目前有超过300家合作伙伴参与共建,是是国内领先的开源社区之一,具备较为领先的产业和技术影响力。目前,龙蜥操作系统下载量已超240万,整体装机
5、量达300多万,100余款企业产品完成与龙蜥操作系统的适配。同时,统信软件、中科方德、中国移动云、麒麟软件、中标软件、凝思软件、浪潮信息、新支点、阿里云基于龙蜥开源操作系统推出各自商业版本及产品,在政务、金融、交通、通信等领域累计服务用户超过30万。龙蜥开源影响力龙蜥社区及龙蜥操作系统也获得了一定的行业认可,工信部电子标准院首批开源项目成熟度评估,成为唯一获得“卓越级”认证的开源项目、龙蜥社区荣登2022科创中国“开源创新榜”、荣获“中国开源云联盟年度优秀开源项目奖”、“OSCAR开源尖峰案例奖”等25项行业奖项。龙蜥项目运作模式龙蜥社区已成立50+个SIG工作组,围绕芯片、内
6、核、编译器、安全、虚拟化及云原生等操作系统核心领域进行技术创新,已发布龙蜥AnolisOS7、AnolisOS8.x系列、AnolisOS23公测版、LifseaOS等多个社区版本,为应对即将停服的CentOS,官网已上线CentOS停服专区为用户提供迁移方案及长期稳定支持,致力于成为CentOS的更佳替代。龙蜥运营管理“为更好地运营和治理社区,龙蜥社区定期召开月度运营委员会会议、技术委员会会议,理事大会。关于理事大会:龙蜥社区第二届理事大会圆满召开!理事换届选举、4位特约顾问加入关于运营委员会会议:龙蜥社区第15次运营委员会会议顺利召开欢迎更多企业加入共建,龙
7、腾计划可参看:“龙腾计划”启动!邀请500家企业加入,与龙蜥社区一起拥抱无限生态。”龙蜥开放的生态为了鼓励合作伙伴在社区探索出更多的商业合作方式,真正牵引企业在龙蜥社区的合作落地,社区推出龙腾计划的升级版生态发展计划,更聚焦在产品和商业合作本身。关于龙蜥操作系统(AnolisOS)龙蜥操作系统(AnolisOS)搭载了ANCK版本的内核,性能和稳定性经过历年“双11”历练,能为云上典型用户场景带来40%的综合性能提升,故障率降低50%,兼容CentOS生态,提供平滑的CentOS迁移方案,并提供全栈国密能力。最新的长期支持版本AnolisOS8.6已发布,更多
10、放在硬盘、闪存或其他的存储设备中。保护At-Rest状态的数据有很多方法,比如对文件加密后再存放或者对存储设备加密。In-Transit是指通过公网或私网把数据从一个地方传输到其他地方,用户可以在传输之前对文件加密或者采用安全的传输协议保证数据在传输中的安全,比如HTTPS、SSL、TLS、FTPS等。In-Use是指正在使用的数据。即便数据在传输过程中是被加密的,但只有把数据解密后才能进行计算和使用。也就意味着,如果数据在使用时没有被保护的话,仍然有数据泄露和被篡改的风险。在这个世界上,我们不断地存储、使用和共享各种敏感数据:从信用卡数据到病历,从防火墙配置到地理位置数据。保护处于
14、密计算技术对业务进行改造,令很多开发者望而生畏。3、应用场景缺乏普适性。目前,机密计算主要被应用于具有特定行业壁垒或行业特征的场景,如隐私计算和金融等。这些复杂场景让普通用户很难触达机密计算技术,也难以为普通用户打造典型应用场景。同时,不0405同厂商的CPUTEE虽各自具有自身的特点,但都无法解决异构计算算力不足的问题,限制了机密计算的应用领域。4、信任根和信任模型问题。在信创、数据安全和安全合规等政策性要求对CPUTEE的信任根存在自主可控的诉求;与此同时,虽然有部分用户愿意信任云厂商和第三方提供的解决方案,但多数用户对云厂商和第三方不完全信任,要求将机密计算技术方案从租户TCB中完全
15、移除。总之,目前已有的机密计算技术方案存在以上困境,不能够完全满足用户不同场景的安全需求。为了解决以上四个问题,云原生机密计算SIG应运而生,主要可概括为四点:1、推广机密计算技术。邀请参与方在龙蜥大讲堂介绍和推广机密计算技术与解决方案。与芯片厂商合作,未来可以通过龙蜥实验室让外部用户体验机密计算技术,对机密计算有一个更深入化的了解。2、提高机密计算技术的可用性。支持多种机密计算硬件。提供多种运行时底座和编程框架供用户选择。3、提升机密计算技术的泛用性为最有代表性的通用计算场景打造解决方案和案例(特性即产品)。积极拥抱并参与到机密计算前沿技术领域的探索与实践,加速创新技术的落地。4、澄清误会
17、束下,作为当前数据处理基础设施的云计算也正在经历一次重大的范式转换,即从默认以CSP为信任基础的计算范式走向信任链与CSP解耦的新范式。我们将此范式称为隐私保护云计算,而机密计算是实现隐私保护云计算的必由之路。为拥抱隐私保护云计算新范式,促进隐私保护云计算生态发展,云原生机密计算SIG应运而生:愿景云原生机密计算SIG致力于通过开源社区合作共建的方式,为业界提供开源和标准化的机密计算技术以及安全架构,推动云原生场景下机密计算技术的发展。工作组将围绕下述核心项目构建云原生机密计算开源技术栈,降低机密计算的使用门槛,简化机密计算在云上的部署和应用步骤,拓展使用场景及方案。云原生机密计算SI
20、s:/HEToolkitIntelHEToolkit旨在为社区和行业提供一个用于实验、开发和部署同态加密应用的平台。目前IntelHEToolkit包括了主流的LeveledHE库,如SEAL、Palisade和HELib,基于使能了英特尔最新指令集加速的的IntelHEXL库,在英特尔至强处理器平台上为同态加密业务负载提供了卓越的性能体验。同时,IntelHEToolkit即将集成半同态Paillier加速库IPCL,为半同态加密应用提供加速支持。此外,IntelHEToolkit还提供了示例内核、示例程序和基准测试HEBench。这些示例
25、TeaclaveJavaTEESDK(JavaEnclave)是一个面向Java生态的机密计算编程框架,它继承IntelSGXSDK所定义的Host-Enclave机密计算分割编程模型。JavaEnclave提供一种十分优雅的模式,对一个完整的Java应用程序进行分割与组织。它将一个Java项目划分成三个子模块,Common子模块定义SPI服务接口,Enclave子模块实现SPI接口并以Provider方式提供服务,Host子模块负责TEE环境的管理和Enclave机密服务的调用。整个机密计算应用的开发与使用模式符合Java经典的SPI设计模式,极大降低了Java机密计算开发门槛
29、认证等功能,是安全的硬件可信执行环境。CSV机密容器技术将安全虚拟化技术与Kata容器技术结合,实现容器运行环境的度量和加密,容器中的程序可以使用远程认证功能实现身份证明。CSV机密容器和普通容器的接口完全兼容,用户可以使用Docker或者Kubernetes启动机密容器,实现对容器数据的隔离和保护。CSV技术构建了以安全加密虚拟机为基础的可信执行环境。在安全加密虚拟机保证了虚拟机数据机密性的基础上,更进一步保证了虚拟机数据的完整性,主机操作系统和虚拟机管理无法通过改写虚拟机嵌套页表对虚拟机实施重映射攻击。应用场景安全加密虚拟化可以保证最终用户数据的机密性和完整性,可用于实施机密计算,适用于云
31、进程存取,包括以更高权限级别运行的进程。CPU对受SGX保护的内存进行加密处理。受保护区域的代码和数据的加解密操作在CPU内部动态完成。因此,处理器可以保护代码不被其他代码窥视或检查。SGX提供了硬件指令级安全保障,保障了运行时的可信执行环境,使恶意代码无法访问与篡改其他程序运行时的保护内容。Intel从第六代CPU开始支持SGX,SGX已经成为学术界的热点,各大云厂商也开始在云上部署基于SGX的应用。1415应用场景提供基础机密计算能力的支撑,在IntelSGX和TDXDCAP之上,支撑机密计算运行时,虚拟机,容器等具体的使用,最终让用户方便地将自己的workload运行到一个可信的机密
36、比IntelSGX机密计算技术提供的应用级粒度)的安全可信的执行环境,同时保证租户运行环境的机密性和完整性。为此,需要将当前租户的TD,与CSP控制的特权级系统组件(比如VMM/hypervisor)、VM以及其他租户的TD都隔离开来,并将它们排除出当前租户的TCB,以确保当前租户的TD不受上述组件的影响。与VM相比,TD额外增加了以下能力:提供了VM内存的机密性和完整性保护地址转换完整性保护CPU状态机密性和完整性保护对安全中断和异常的分发机制远程证明TDX技术综合了MKTME(多密钥全加密内存)与VMX虚拟化技术,再添加新的指令集、处理器模式和强制实施的访问控制等设计。1617U
37、nmodifiedApplicationsUnmodifiedDriversTDX-EnlightenedOSTrustDomainUnmodifiedApplicationsUnmodifiedDriversTDX-EnlightenedOSTrustDomainApplicationsDriversOSLegacyVMApplicationsDriversOSLegacyVMTDX-AwareHostVMMPlatform(Cores,Caches,Devicesetc.)IntelTDXModuleRunninginSEAMRootModeIntelTDXHo
40、可信或机密正在慢慢成为公有云基础设施的默认要求而不再是一个特性,需要综合利用加密存储、安全网络传输、机密计算等技术来实现对用户敏感数据全生命周期的保护。机密计算是当前业界正在补齐的环节,主流的硬件平台已经部分提供或正在实现对机密计算的支持,如AMDSEV,IntelTDX和SGX,ArmCCA,IBMSE和RISC-V的KeyStone等。解决方案AMDSEV技术基于AMDEPYCCPU,将物理机密计算能力传导至虚拟机实例,在公有云上打造一个立体化可信加密环境。SEV可保证单个虚拟机实例使用独立的硬件密钥对内存加密,同时提供高性能支持。密钥由AMD平台安全处理器(PSP)在实例创
41、建期间生成,而且仅位于处理器中,云厂商无法访问这些密钥。AMDSEV提供了硬件级的内存加密方案,用以实现安全加密的虚拟化:内存控制器中集成了AES-128硬件加速引擎:客户操作系统通过页表选择要加密的页,对终端用户的应用程序没有任何改变。AMD安全内存加密(SME):所有内存由单一的密钥进行加密,仅仅在BIOS中开启就可以实现(TSME)。AMD安全加密虚拟化(SEV):每台虚拟机都会被分配自己的独立加密密钥,宿主机和客户虚拟机之间相互加密隔离。ConfidentialVirtualMachine也可以称作SecureVirtualMachine(SVM),是最终实现机密计算的实体,
45、用程序,必须能够在运行时保护与VM或应用程序关联的任何内存,而不受限制或分割。解决方案ArmCCA引入了一种新的机密计算世界:机密领域(Realm)。在ArmCCA中,硬件扩展被称为RealmManagementExtension(RME),RME会和被称之为机密领域管理监控器(RealmManagementMonitor,RMM),用来控制机密领域的专用固件,及在Exceptionlevel3中的Monitor代码交互。Realm是一种ArmCCA环境,能被Normalworld主机动态分配。主机是指能管理应用程序或虚拟机的监控软件。Realm及其所在平台的初始
46、化状态都可以得到验证。这一过程使Realm的所有者能在向它提供任何机密前就建立信任。因此,Realm不必继承来自控制它的Non-securehypervisor的信任。主机可以分配和管理资源配置,管理调度Realm虚拟机。然而,主机不可以监控或修改Realm执行的指令。在主机控制下,Realm可以被创建并被销毁。通过主机请求,可以增加或移除页面,这与hypervisor管理任何其他非机密虚拟机的操作方式类似。ArmCCA技术能够从根本上解决用户敏感应用数据的安全计算问题。它充分利用软硬件实现的信任根提供的数据和程序的物理隔离、保护、通信和认证体系,并在传统TrustZone的基础上,增加了
49、ectUserCodeandDataVM1TATAEL0EL1EL2EL3HypervisorOSKernelAppAppMonitorSecureServiceSPMTOSTATASecureServiceTOSSPMVM1VM1EL0EL1EL2EL3RMMOSKernelOSKernelAppAppAppAppMonitorHypervisorTrustZoneRealmManagementExtensionNon-SecureBlockAllowAllowAllowSecurityState/PASpaceNon-SecurePASecurePASecureN
50、on-SecureBlockBlockBlockBlockBlockBlockBlockAllowAllowAllowAllowAllowAllowAllowAllowAllowSecurityState/PASpaceNon-SecurePASecurePARealmPARootPASecureRealmRootNon-secureNon-secureRealmsecuresecureRSIRMI2021IntelSGXSDK/PSW/DCAP:IntelSGX软件开发套件和平台软件服务IntelSGXPlatformSoftwareandDatacenterA
51、ttestationPrimitives(PSW/DCAP)在龙蜥生态中为数据中心和云计算平台提供IntelSGX技术所需的平台软件服务,如远程证明等。IntelSGXSDK在龙蜥生态中为开发者提供使用IntelSGX技术所需的软件开发套件,帮助开发者高效便捷地开发机密计算程序和解决方案。本文介绍如何在AnolisOS8.6当中基于IntelSGXSDK/PSW/DCAP构建SGX机密计算环境,并演示如何运行示例代码以验证SGX功能。背景信息IntelSGX以硬件安全保障信息安全,不依赖固件和软件的安全状态,为用户提供物理级的机密计算环境。IntelSGX通过新的
52、指令集扩展与访问控制机制实现SGX程序的隔离运行,保障关键代码和数据的机密性与完整性不受恶意软件的破坏。不同于其他安全技术,IntelSGX的可信根仅包括硬件,避免了基于软件的可信根可能自身存在安全漏洞的缺陷,极大地提升了系统安全保障。检查SGX使能状态构建SGX机密计算环境前,您可以通过cpuid检查SGX使能状态。1、安装cpuid。sudoyuminstall-ycpuid2、检查SGX使能状态。cpuid-1-l0x7|grepSGX说明SGX被正确使能后,运行SGX程序还需要SGX驱动。3、检查SGX驱动安装情况。ls-l/dev/sgx_enclave,sgx_
53、provision开始构建SGX机密计算环境为开发SGX程序,您需要在您的机器上安装运行时(runtime)、SDK,并配置远程证明服务。本文以AnolisOS8.6为例演示构建过程,您也可以直接参考Intel官方提供的IntelSGX软件安装指南安装所需的驱动、PSW等。1.安装SGX运行时ProgrammingFramework框架编程2322mkdir-p$HOME/sgx&cd$HOME/sgx&tarzxvfsgx_rpm_local_repo.tgz&sudoyuminstall-yyum-utils&sudoyum-config-manager-add-rep
54、ofile:/$HOME/sgx/sgx_rpm_local_repo/&sudoyuminstall-nogpgcheck-ysgx-aesm-servicelibsgx-launchlibsgx-urts&rm-rfsgx_rpm_local_repo.tar.gz可按需安装更多库:sudoyuminstall-nogpgcheck-ylibsgx-ae-lelibsgx-ae-pcelibsgx-ae-qe3libsgx-ae-qvelibsgx-aesm-ecdsa-pluginlibsgx-aesm-launch-pluginlibsgx-aesm-p
55、ce-pluginlibsgx-aesm-quote-ex-pluginlibsgx-dcap-default-qpllibsgx-dcap-qllibsgx-dcap-quote-verifylibsgx-enclave-commonlibsgx-launchlibsgx-pce-logiclibsgx-qe3-logiclibsgx-quote-exlibsgx-ra-networklibsgx-ra-uefilibsgx-uae-servicelibsgx-urtssgx-ra-servicesgx-aesm-service说明SGXAESM(Archi
56、tecturalEnclaveServiceManager)负责管理启动Enclave、密钥配置、远程认证等服务,默认安装路径为/opt/intel/sgx-aesm-service。2.安装SGXSDKcd$HOME/sgx&exportSGX_VERSION=2.18.100.3&chmod+xsgx_linux_x64_sdk_$SGX_VERSION.bin&echo-enn/opt/inteln|./sgx_linux_x64_sdk_$SGX_VERSION.bin&rm-rfsgx_linux_x64_sdk_$SGX_VERSION.bin&source/opt
59、基于IntelEPID的远程证明方式,您可能需要适配程序后才能正常使用远程证明功能。更多远程证明的信息,请参见attestation-service。配置QPL及PCK缓存服务:1、安装QuoteProviderLibrary(QPL)。您可以使用自己定制的QPL或使用Intel提供的默认QPL(libsgx-dcap-default-qpl)2、安装PCK缓存服务。PCKCachingService的安装配置请参考Intel官方PCCS文档:SGXDataCenter-AttestationPrimitives3、确保PCK缓存服务由本地管理员或数据中心管理员正确
63、ample/opt/intel/sgxsdk/bin/x64/sgx_signsign-keyEnclave/Enclave_private_sample.pem-enclaveenclave.so-outenclave.signed.so-configEnclave/Enclave.config.xml2627Info:SampleEnclavesuccessfullyreturned.Enteracharacterbeforeexit.验证SGX功能示例二:SGX远程证明示例IntelSGXSDK中提供了SGX示例代码用于验证SGX功能,默认位于/opt/inte
65、dk/environment3.安装SGX远程证明依赖的包yuminstall-nogpgcheck-ylibsgx-dcap-ql-devellibsgx-dcap-quote-verify-devel4.编译被挑战方示例代码QuoteGenerationSample进入QuoteGenerationSample目录编译QuoteGenerationSamplemake运行编译出的可执行文件生成Quote./app预期的结果为:settheenclaveloadpolicyaspersistent:succeed!Step1:Callsgx_qe_get_targe
66、t_info:succeed!Step2:Callcreate_app_report:succeed!Step3:Callsgx_qe_get_quote_size:succeed!Step4:Callsgx_qe_get_quote:succeed!cert_key_type=0x5sgx_qe_cleanup_by_policyisvalidinin-procmodeonly.Cleanuptheenclaveloadpolicy:succeed!5.编译挑战方示例代码QuoteVerificationSample进入QuoteGenerationSampl
67、e目录编译QuoteVerificationSamplemake生成签名密钥opensslgenrsa-outEnclave/Enclave_private_sample.pem-33072对QuoteVerificationSampleEnclave进行签名运行编译出的可执行文件验证Quote./app预期的结果为:Info:ECDSAquotepath:./QuoteGenerationSample/quote.datTrustedquoteverification:Info:gettargetinfosuccessfullyreturned.Info:sg
68、x_qv_set_enclave_load_policysuccessfullyreturned.Info:tee_get_quote_supplemental_data_version_and_sizesuccessfullyreturned.Info:latestsupplementaldatamajorversion:3,minorversion:1,size:336Info:App:tee_verify_quotesuccessfullyreturned.Info:Ecall:VerifyQvEreportandidentitysuccessfully
69、returned.Info:App:Verificationcompletedsuccessfully.Info:SupplementaldataMajorVersion:3Info:SupplementaldataMinorVersion:1=Untrustedquoteverification:Info:tee_get_quote_supplemental_data_version_and_sizesuccessfullyreturned.Info:latestsupplementaldatamajorversion:3,minorversion:1,
71、el向开源社区贡献了HomomorphicEncryptionBenchmarkingFrame-work(HEBench)。解决方案如下图所示,Intel提供了对于同态加密技术的全栈式支持。在半同态加密方面,Intel提供了通过ISO认证的Paillier算法库IPCL,它使用了IntelIPP-Crypto库提供的AVX512IFMA指令集加速的能力,在最新的IntelXeon平台上有优异的性能表现。在LeveledHE方面,依托于IntelXeon平台最新的指令集加速以及FPGA的硬件加速能力,IntelHEXL封装了底层硬件细节,向上提供了加速的密码学运算接口供第三方同
72、态加密库,如SEAL、Palisade和HELib使用。IntelHEXL在最新的Intel平台上同样采用了AVX512IFMA指令集加速伽罗华域上的大整数运算,并且可以根据CPU型号自动匹配最合适的加速实现,提供向后兼容功能。Info:App:tee_verify_quotesuccessfullyreturned.Info:App:Verificationcompletedsuccessfully.Info:SupplementaldataMajorVersion:3Info:SupplementaldataMinorVersion:12829WorkloadFRW
73、K/DevtoolsHELibsMathLibsComputeSecureaggregationHEBenchOtherHELibsHEAccelerationLibrary(HEXL)AcceleratorsFPGAIPCL*IPPCryptoCPU*HE+FL*PSIIntelHEToolkitCleartextSEAL(ref)PALISADE(ref)ForntendBackendsTestHarnessAbstractionLayerLatencyEltwiseAdd/MultDotProductMatrixMultiplicationLogisticReg
74、ressionInferenceOineAPIBridgeC+wrapperDynamicback-endloaderReportCompiler围绕HE技术创新,IntelHEToolkit为社区和行业提供了一个用于HE应用实验、开发和部署的平台。IntelHEToolkit目前提供示例内核和示例程序,这些示例程序演示了利用主流的同态加密库构建各种同态加密应用用于保护用户隐私数据的能力。同时,IntelHEToolkit通过使用IntelHEXL加速库展示了使用最新的英特尔硬件功能发挥英特尔处理器在HE领域优势的最佳实践。此外,HEBench为同态加密方案的
75、开发者和用户提供了一个公允且标准的性能测试基准,旨在推动同态加密技术的演进和应用方案的创新。HEBench由三个部分组成:1、前端:包括测试框架和后端加载器。测试框架目前支持的运算有向量按元素的加法和乘法、向量点乘、矩阵乘法和逻辑回归推理,主要度量的指标是计算时延和吞吐量。2、适配层:提供了统一的C接口,桥接了前端的测试框架和后端具体的HE实现,使得后端开发者可以专注于HE各类算法的实现,只需要遵照接口定义就能很容易接入HEBench的测试框架。3、后端:支持开发者接入各类HE实现。目前HEBench开源项目中自带几个后端的参考实现,包括明文后端、SEAL后端和Palisade后端。应用场景同
76、态加密天然适合云计算场景,因此最先在这一领域得以应用。用户希望借助云服务器强大的计算资源来进行复杂的计算,但又不希望暴露自己的私有数据。在同态加密进入这一领域之前,在信任云服务提供商不会泄露或者窃取用户数据的前提下,用户直接将明文交给云服务器进行计算,这样始终存在一定的安全风险。而有了同态加密之后,用户只需要将私有数据加密之后的密文传输到云端,在云端直接以密文形式参与计算,最终结果也是以密文的形式返回给用户,在用户本地进行解密。云计算在同态加密的加持下,安全性得到了充分的保证。场景描述在联邦学习的应用场景中,各参与方通过同态加密技术在保证各自数据隐私的情况下,共同参与训练机器学习模型,提高模型
77、训练精度。在横向联邦学习中,各参与方在本地用各自的数据训练模型,将训练得到的模型参数加密上传参数服务器。参数服务器用Paillier等加法半同态加密技术聚合来自多方的模型参数,最后更新的模型参数仍然以密文形式发送给各参与方。利用同态加密技术可以防止攻击者从上传的模型参数中反推出用户的本地数据。在纵向联邦学习的隐私求交部分,同态加密也能发挥重要作用,从而保证在不暴露各方私有数据的情况下,求取用于联邦学习的训练数据的交集。在区块链应用中,为了保护链上存证信息的隐私性,可以对这些数据进行同态加密,并将计算过程转化为同态运算过程,节点即可在无需获知明文数据的情况下实现密文计算。应用效果微众银行的联邦学
78、习框架FATE采用了IPCL加速的Paillier方案,在第三代Xeon平台上的测试数据显示,对2048比特精度的整型数据进行模幂运算,相比于GMP方案有4.7倍的性能提升。IPCL的应用极大地提高了用户使用联邦学习方案的效率,有效地减少了TCO。蚂蚁集团的开源隐私计算框架“隐语”也正式接入IntelIPCL加速的Paillier方案,在第四代Xeon平台上的测试数据显示IPCL的应用显著提高了隐私计算的效率。Intel_HE_Toolkit开发指南本文首先介绍了如何在Anolis8.6上分别以源码和二进制包形式编译与安装IntelHEToolkit,以及如何运行HE相
80、文的配置。通过传递命令行参数-linear_regression,也可以实现线性回归推理。编译cdhe-toolkit/he-samples/examples/logistic-regression-Dzstd_DIR=$HOME/.hekit/components/zstd/v1.4.5/install/lib64/cmake/zstd-DHEXL_DIR=$HOME/.hekit/components/hexl/1.2.3/install/lib/cmake/hexl-1.2.3cmake-buildbuild运行cdbuild./lr_test预期输出结果INFO:We
81、dNov203:21:032022:LoadingEVALdatasetINFO:WedNov203:21:032022:dataLoader:datasets/lrtest_mid_eval.csvINFO:WedNov203:21:042022:LoadingEVALdatasetcompleteElapsed(s):0.102INFO:WedNov203:21:042022:Inputdatasize:(samples)2000(features)80INFO:WedNov203:21:042022:LoadingModelINF
82、O:WedNov203:21:042022:weightsLoader:datasets/lrtest_mid_lrmodel.csvINFO:WedNov203:21:042022:LoadingModelcompleteElapsed(s):0INFO:WedNov203:21:042022:Encode/encryptweightsandbiasINFO:WedNov203:21:042022:Encode/encryptweightsandbiascompleteElapsed(s):0.041INFO:WedNov203:2
83、1:042022:HELRINFO:WedNov203:21:042022:#ofbatches:1Batchsize:4096INFO:WedNov203:21:042022:TransposedataINFO:WedNov203:21:042022:-TransposedatacompleteElapsed(s):0.005INFO:WedNov203:21:042022:Encode/encryptdataINFO:WedNov203:21:042022:-Encode/encryptdatacomplete!Elapsed
84、(s):0.026INFO:WedNov203:21:042022:LogisticRegressionHE:1batch(es)INFO:WedNov203:21:042022:-LRHEcomplete!Elapsed(s):0.085INFO:WedNov203:21:042022:Decrypt/decodingLRHEresultINFO:WedNov203:21:042022:-Decrypt/decodecomplete!Elapsed(s):0.003INFO:WedNov203:21:042022:HEinferenc
85、eresult-accuracy:0.8552、安全查询这个例子演示了如何用同态加密技术(SEALBFVscheme)实现安全数据库查询。在这个例子中,数据查询条件和数据库本身都是加密的状态。查询客户端负责初始化加密上下文、产生同态加密密钥对、加密查询条件和解密查询结果。查询服务端负责存储加密数据库,并实现加密数据库查询算法。sudoyuminstall-ym4patchelfcmakegcc-toolset-10glibc-develvirtualenvautoconfwgetbzip2python38cmake-S.-Bbuild-DSEAL_DIR=$HO
87、mp-6.2.1.tar.xztar-xfgmp-6.2.1.tar.xzcdgmp-6.2.1./configuremakesudomakeinstallexportLD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH编译安装初始化编译环境sudoupdate-alternatives-configpython3#选择python3.8选项sclenablegcc-toolset-10bashcdhe-toolkit./hekitinit-default-config#根据命令提示sourcebash_profile编
88、译和安装第三方依赖./hekitinstallrecipes/default.toml查看编译安装的包./hekitlist编译cdhe-toolkit/he-samples/examples/logistic-regression-Dzstd_DIR=$HOME/.hekit/components/zstd/v1.4.5/install/lib64/cmake/zstd-DHEXL_DIR=$HOME/.hekit/components/hexl/1.2.3/install/lib/cmake/hexl-1.2.3cmake-buildbuild运行cdbuild./sec
89、ure-query预期输出结果InitializeSEALBFVschemewithdefaultparametersY(default)|N:SEALBFVcontextinitializedwithfollowingparametersPolymodulusdegree:8192Plainmodulus:17Keylength:8Inputfiletousefordatabaseorpressentertousedefaultus_state_capitals.csv:Numberofdatabaseentries:50Encry
90、ptingdatabaseentriesintoCiphertextsInputkeyvaluetousefordatabasequery:OregonQueryingdatabaseforkey:OregonDecodeddatabaseentry:SalemTotalqueryelapsedtime(seconds):(Timeinsecondsfordatabasequery)Recordssearchedpersecond:(numberofrecordssearchedpersecond)二进制包安装除了直接通过源代码编
92、a生态机密计算开发框架。采用Java静态编译技术将EnclaveModule编译成Native代码并运行在SGXTEE中,实现对高级语言的支持并最大限度保持较低的系统TCB。屏蔽底层交互细节,用户无须定义edl接口文件。给用户提供一个PureJava的机密计算开发框架和编译构建工具链,极大降低IntelSGX的开发门槛。cmake-S.-Bbuild-DSEAL_DIR=$HOME/.hekit/components/seal/v3.7.2/install/lib64/cmake/SEAL-3.7-DMicrosoft.GSL_DIR=$HOME/.hekit/components
93、/gsl/v3.1.0/install/share/cmake/Microsoft.GSL3435将机密计算从C/C+应用生态扩展到Java生态,在不牺牲机密安全性的前提下,极大提升开发效率和用户体验。应用场景场景描述TeaclaveJavaTEESDK可应用于对数据和算法敏感的领域。比如政府部门、金融、区块链、医疗和联邦计算等;在阿里云DataTrust隐私增强计算平台,TeaclaveJavaTEESDK应用在SQL安全审计和文件转加密等两个微服务模块中;应用效果基于TeaclaveJavaTEESDK帮助用户开发PureJava机密计算应用,并保证系统安全性和性能,
94、提升机密计算应用开发效率与体验。竞品分析IntelSGXSDK与OpenEnclave仅支持C/C+生态机密计算应用开发,且开发门槛高;OcclumLibOS技术降低了机密计算开发与部署难度,但系统TCB很大,牺牲了应用部分机密性。dockerrun-it-privileged-networkhost-v/dev/sgx_enclave:/dev/sgx/enclave-v/dev/sgx_provision:/dev/sgx/provisionteaclave/teaclave-java-tee-sdk:v0.1.0-ubuntu18.04/bin/bashdockerrun-
95、it-privileged-networkhost-v/dev/sgx_enclave:/dev/sgx/enclave-v/dev/sgx_provision:/dev/sgx/provisionteaclave/teaclave-java-tee-sdk:v0.1.0-ubuntu18.04/bin/bashHostSubmoduleEnclaveSubmoduleJavaApplicationProjectOperatingSystem(Linux)JavaVirtualMachine(JVM)HostAppNativeImageGraalRuntimeTEESDK
96、SGXEnclaveCloudInfrastructure(WithTEE)UntrustedServiceInvocationnative-imagecompilejavacServiceResultTrusted或3637Apache_Teaclave_Java_TEE_SDK最佳实践1.背景信息IntelSGX技术提供了极高安全等级的可信执行环境,但使用该技术需要对已有的应用代码进行改造,SGXSDK只提供了对C语言生态的支持,此外用户需要用.edl文件定义服务接口,开发过程繁琐,对开发者的编程习惯冲击较大,造成开发门槛很高,阻碍了该技术的发展与应用。ApacheTea
97、claveJavaTEESDK提供基于IntelSGX技术的Java生态机密计算开发框架。采用Java静态编译技术将EnclaveModule编译成Native代码并运行在SGXTEE中,实现对高级语言的支持并最大限度保持较低的系统TCB。屏蔽底层交互细节,用户无须定义edl接口文件。给用户提供一个PureJava的机密计算开发框架和编译构建工具链,极大降低IntelSGX的开发门槛。2.环境准备构建SGX机密计算环境前,您可以通过cpuid检查SGX使能状态。1、安装cpuid。sudoyuminstall-ycpuid2、检查SGX使能状态。cpuid-1-l0x
98、7|grepSGX说明SGX被正确使能后,运行SGX程序还需要SGX驱动。3、检查SGX驱动安装情况。ls-l/dev/sgx_enclave,sgx_provision3.运行项目test/benchmark/sample3.1进入容器环境目前Teaclave-Java-Tee-SDK支持两种容器环境ubuntu18.04和anolis8.6.3.2运行samplescd/opt/javaenclave/samples运行HelloWorldSample:cdhelloworld&./run.sh结果如下即代表运行成功:Downloading.INFOINFOhellowor
99、ld.SUCCESS0.758sINFOcommon.SUCCESS5.766sINFOenclave.SUCCESS55.070sINFOhost.SUCCESS25.544sINFO-INFOBUILDSUCCESSINFO-INFOTotaltime:01:27minINFOFinishedat:2023-02-16T12:27:18ZINFO-HelloWorldHelloWorldHelloWorldHelloWorld运行SpringbootSample:cdspringboot&./run.sh结果如下即代表运行成功:INFOR
100、eplacingmainartifactwithrepackagedarchiveINFO-INFOReactorSummaryforspringboot1.0-SNAPSHOT:INFOINFOspringboot.SUCCESS22.343sINFOcommon.SUCCESS06:46minINFOenclave.SUCCESS02:52minINFOhost.SUCCESS02:58minINFO-INFOBUILDSUCCESSINFO-INFOTotaltime:14:38minINFOFinishedat:2023-02-
101、16T11:28:49ZINFO-._____/____(_)____()_|_|_|_/_|/_)|_)|(_|)3839若因网络原因无法下载依赖,可通过配置Maven镜像源解决3.3运行testscd/opt/javaenclave/test&./run.sh.entertestcase:org.apache.teaclave.javasdk.test.host.TestSMEnclaveexittestcase:org.apache.teaclave.javasdk.test.host.TestSMEnclave.entertestcase:org.a
102、pache.teaclave.javasdk.test.host.TestSMEnclaveexittestcase:org.apache.teaclave.javasdk.test.host.TestSMEnclave.entertestcase:org.apache.teaclave.javasdk.test.host.TestSMEnclaveexittestcase:org.apache.teaclave.javasdk.test.host.TestSMEnclaveTime:109.616OK(16tests)Teaclavejavasdkutresult:tr
103、ue3.4运行benchmarkcd/opt/javaenclave/benchmark运行GuomiBenchmark:cdguomi&./run.shREMEMBER:Thenumbersbelowarejustdata.Togainreusableinsights,youneedtofollowuponwhythenumbersarethewaytheyare.Useprofilers(see-prof,-lprof),designfactorialexperiments,performbaselineandnegativete
104、ststhatprovideexperimentalcontrol,makesurethebenchmarkingenvironmentissafeonJVM/OS/HWlevel,askforreviewsfromthedomainexperts.Donotassumethenumberstellyouwhatyouwantthemtotell.Benchmark(enclaveServiceInstance)(smAlgo)ModeCntScoreErrorUnitsGuoMiBenchMark.smBenchMark
105、MOCK_IN_JVMSM2avgt439.03239.471ms/opGuoMiBenchMark.smBenchMarkMOCK_IN_JVMSM3avgt48.6560.302ms/opGuoMiBenchMark.smBenchMarkMOCK_IN_JVMSM4avgt43.4100.153ms/opGuoMiBenchMark.smBenchMarkMOCK_IN_SVMSM2avgt431.8991.003ms/opGuoMiBenchMark.smBenchMarkMOCK_IN_SVMSM3avgt410.755
106、2.616ms/opGuoMiBenchMark.smBenchMarkMOCK_IN_SVMSM4avgt44.5150.303ms/opGuoMiBenchMark.smBenchMarkTEE_SDKSM2avgt436.1132.337ms/opGuoMiBenchMark.smBenchMarkTEE_SDKSM3avgt411.3311.379ms/opGuoMiBenchMark.smBenchMarkTEE_SDKSM4avgt410.2920.896ms/opGuoMiBenchMark.smBenchMarkEM
107、BEDDED_LIB_OSSM2avgt432.05814.033ms/opGuoMiBenchMark.smBenchMarkEMBEDDED_LIB_OSSM3avgt410.3800.741ms/opGuoMiBenchMark.smBenchMarkEMBEDDED_LIB_OSSM4avgt49.1900.488ms/opBenchmarkresultissavedtoguomi_benchmark.json4.HelloWorldDemo演示4.1进入容器环境与运行项目test/benchmark/sample的进入容器环境步骤
108、相同。4.2创建JavaEnclave工程框架利用Teaclave-Java-Tee-SDK提供的脚手架创建JavaEnclave工程框架:该工程包括三个子工程,分别是host、common和enclave.4.3定义服务接口(common)在common子模块中定义服务接口:cdhelloworld/common/src/main/java/com/sample/mkdir-phelloworld/common创建Service.java,定义服务接口:4.4服务接口实现(enclave)在enclave子模块实现所定义的服务接口:cdhelloworld/enclave/src
109、/main/java/com/sample/mkdir-phelloworld/enclave创建ServiceImpl.java,实现服务接口:运行StringBenchmark:cdstring&./run.shREMEMBER:Thenumbersbelowarejustdata.Togainreusableinsights,youneedtofollowuponwhythenumbersarethewaytheyare.Useprofilers(see-prof,-lprof),designfactorialexperiments,p
110、erformbaselineandnegativeteststhatprovideexperimentalcontrol,makesurethebenchmarkingenvironmentissafeonJVM/OS/HWlevel,askforreviewsfromthedomainexperts.Donotassumethenumberstellyouwhatyouwantthemtotell.Benchmark(enclaveServiceInstance)(stringOpt)ModeCntScoreErro
111、rUnitsStringBenchMark.stringBenchMarkMOCK_IN_JVMregexavgt42.7880.090ms/opStringBenchMark.stringBenchMarkMOCK_IN_JVMconcatavgt42.6920.139ms/opStringBenchMark.stringBenchMarkMOCK_IN_JVMsplitavgt42.6980.129ms/opStringBenchMark.stringBenchMarkMOCK_IN_SVMregexavgt44.5580.084m
112、s/opStringBenchMark.stringBenchMarkMOCK_IN_SVMconcatavgt44.8790.200ms/opStringBenchMark.stringBenchMarkMOCK_IN_SVMsplitavgt45.5950.186ms/opStringBenchMark.stringBenchMarkTEE_SDKregexavgt45.3770.176ms/opStringBenchMark.stringBenchMarkTEE_SDKconcatavgt45.2690.119ms/opString
113、BenchMark.stringBenchMarkTEE_SDKsplitavgt46.1710.403ms/opStringBenchMark.stringBenchMarkEMBEDDED_LIB_OSregexavgt44.1040.992ms/opStringBenchMark.stringBenchMarkEMBEDDED_LIB_OSconcatavgt46.1400.278ms/opStringBenchMark.stringBenchMarkEMBEDDED_LIB_OSsplitavgt44.3050.585ms/opB
114、enchmarkresultissavedtostring_benchmark.jsonmvnarchetype:generate-DgroupId=com.sample-DartifactId=helloworld-Darchetype-GroupId=org.apache.teaclave.javasdk-DarchetypeArtifactId=javaenclave-archetype-Darche-typeVersion=0.1.0-DinteractiveMode=falsepackagemon;importmon.annotations.EnclaveServic
115、e;EnclaveServicepublicinterfaceServiceStringsayHelloWorld();packagecom.sample.helloworld.enclave;importmon.Service;importcom.google.auto.service.AutoService;AutoService(Service.class)publicclassServiceImplimplementsServiceOverridepublicStringsayHelloWorld()returnHelloWorld;4.5管理服务实
116、现(host)在host子模块实现对enclave的管理与服务加载.cdhelloworld/host/src/main/java/com/sample/mkdir-phelloworld/host创建Main.java,实现机密计算服务管理:packagecom.sample.helloworld.host;importorg.apache.teaclave.javasdk.host.Enclave;importorg.apache.teaclave.javasdk.host.EnclaveFactory;importorg.apache.teaclave.javasdk.hos
118、似乎不用对HW-TEE内的TLS库进行特别的考虑,但与HW-TEE通信的对端必须要验证工作负载是否运行在真实的HW-TEE中。常规的远程证明工程化实践只是对远程证明底层原语进行了封装,实际产出就是让通信双方能够安全可信地协商出共享secret,并将如何基于共享secret创建安全通信信道的工作留给了应用开发者。远程证明和建立安全信道的逻辑必须要深度结合,否则易受中间人攻击的影响。即使不将RA与TLS这么复杂的协议结合,至少也要能实现仅通过RA协议来协商出作为安全信道基础的共享密钥这一基本功能。但是仅做到共享秘密信息的程度是无法完全实现安全信道的。虽然基于共享秘密的方式能够实现安全信道,但是基于
119、RA协议实现的安全信道的通信效率太低。解决方法是将RA与能够提供安全信道的标准协议相结合,比如TLS协议。ThomasKnauth提出将IntelSGX远程证明和TLS结合的方案,但是该方案面临着以下挑战:如何灵活地支持不同的TLS库?如何适配不同的HW-TEE环境?如何让两个不同类型的HW-TEE互相验证对方的Evidence?解决方案为了解决以上挑战,我们提出了Rats-TLS,一种支持异构硬件可执行环境的双向传输层安全性协议。如下图所示,Rats-TLS在TLS的基础上增加了将TLS证书中的公钥与HW-TEEattestationquote绑定的能力,基于HW-TEE硬件为信任
120、根,即可证明了对方是在可信平台上,又可以高效的传输数据。4.6编译和运行回到工程根目录并编译工程:mvn-PnativecleanpackagepublicclassMainpublicstaticvoidmain(Stringargs)throwsExceptionEnclaveTypeenclaveTypes=EnclaveType.MOCK_IN_JVM,EnclaveType.MOCK_IN_SVM,EnclaveType.TEE_SDK;for(EnclaveTypeenclaveType:enclaveTypes)Enclaveenclave=Encl
121、aveFactory.create(enclaveType);Iteratorservices=enclave.load(Service.class);System.out.println(services.next().sayHelloWorld();enclave.destroy();INFOBuildingjar:/opt/temp/helloworld/host/target/host-1.0-SNAP-SHOT-jar-with-dependencies.jarINFO-INFOReactorSummaryforhelloworld1.0-SNAPSHOT:INFOI
122、NFOhelloworld.SUCCESS0.111sINFOcommon.SUCCESS14.584sINFOenclave.SUCCESS01:29minINFOhost.SUCCESS51.027sINFO-INFOBUILDSUCCESSINFO-INFOTotaltime:02:35minINFOFinishedat:2023-02-16T12:01:09ZINFO-#$JAVA_HOME/bin/java-cphost/target/host-1.0-SNAPSHOT-jar-with-dependencies.jar:enclave/tar
123、get/enclave-1.0-SNAPSHOT-jar-with-dependencies.jarcom.sample.helloworld.host.MainHelloWorldHelloWorldHelloWorld编译成功后,运行该Demo:$JAVA_HOME/bin/java-cphost/target/host-1.0-SNAPSHOT-jar-with-dependencies.jar:enclave/target/enclave-1.0-SNAPSHOT-jar-with-dependencies.jarcom.sample.helloworld.host.Mai
124、n4243libratsrats-tlsEnclaveAttesterInstancesEnclaveVerifierInstancesTLSWrapperInstancesCryptoWrapperInstancesRATS-TLS-awareapplications/servicesRATS-TLSAPIsRATS-TLSCore(librats-tls.so)sev/csv-pspsev/csv-pspwolfsslwolfsslsex-ecdsasex-ecdsaopenssl-sgxopenssl-sgxtdx-ecdsatdx-ecdsaopensslopenssl
125、Rats-TLS的架构如下图所示,RatsTLS提供了API给上层的应用和服务使用,API能够实现可信安全信道的建立和数据的传输。RatsTLSAPI的实现依赖于核心层与四类实例的实现。为了提供更好的安全性,核心层与四类实例插件都运行在HWTEE环境中。由于Rats-TLS架构需要支持和灵活选择多种可能性(例如:TLS库,加密库,Enclave形态等),因此根据功能逻辑区分出不同的实例插件是必不可少的。下面简单介绍一下核心层和实例插件的作用。核心层:负责整体的控制作用,控制数据流的流向。TLSWrapper实例:负责完成真正的TLSsession管理和网络传输。Attester
126、实例:从本地平台运行环境中收集证明材料,通常要有Enclave配合生成quote数据。Verifier实例:负责验证收到的各种格式的quote数据,可能收到来自另一个不同的机密计算硬件平台发来的quote。也可能存在verifier与attester必须是相同平台的情况,比如verifier使用SGXECDSAQVE的情况:强制要求当前运行环境必须支持SGXECDSA,否则无法启动QVE来验证SGXECDSAquote。Crypto实例:负责配合其他实例完成与密码学算法有关的操作。例如,它可以生成自签名证书并将quote装到证书扩展中。Rats-TLS具有以下优势:能够支持不同的H
127、W-TEE类型。能够支持不同的TLS库。能够支持不同的密码学算法库。能够支持不同类型HW-TEE间的双向TLS认证。4445CSV机密容器介绍KataContainers是一个使用虚拟化来提供隔离层的开源安全容器项目。Kata支持机密计算硬件技术,通过利用可信执行环境(TrustedExecutionEnvironments)来保护客户的高度敏感的工作负载,以防止不受信任的实体(例如:云服务商)访问租客的敏感数据。在katacontainer中,您能够在在机密虚拟机中运行POD和容器,将主机/owner/管理员/CSP软件栈从kata的TCB中移除,从而构建一个更强大的云原生多租户
128、架构。具体做法是:在为每个租户使用的容器加密镜像远程Provisioning解密密钥前,先认证pod或容器是否已经运行在了经过认证的环境中。海光CPU支持安全虚拟化技术CSV(ChinaSecureVirtualization),CSV的设计目标是通过CSV虚拟机提供可信执行环境,适用的场景包括云计算、机密计算等。海光2号支持CSV1技术,提供虚拟机内存加密能力,采用国密SM4算法,不同的CSV虚拟机使用不同的加密密钥,密钥由海光安全处理器管理,主机无法解密虚拟机的加密内存。海光CSV加密虚拟机支持两种远程认证方式:RuntimeFoundation运行时底座pre-attestati
129、on指需要在启动TEE之前能够执行attestation过程。在云上的CSV虚拟机启动的时候,对加载的ovmf,kernel,initrd,cmdline进行静态度量,生成measurement。线下的远程证明验证者对measurement进行验证,确保启动的CSV虚拟机是符合预期的。runtime-attestation:在云上的CSV虚拟机运行的时候,产生带有硬件可执行环境的Quote的TLS证书。线下的远程证明验证者对TLS证书进行验证,确保CSV虚拟机运行在TEE中。基于runtime-attestation使用机密容器本文主要为您介绍如何在kata环境中基于海光安全加密虚拟化功能CS
130、V(ChinaSecureVirtualization)技术,通过runtime-attestation认证方式,启动一个租户的加密容器镜像。前提条件请使用安装HygonCPU的硬件设备,硬件信息参考如下:CPU型号:HygonC86729132-coreProcessor固件版本:1600及以上BIOS设置:开启SMEBIOS选项SMEE用来控制是否打开内存加密功能,SMEE=Enable表示在BIOS中打开内存加密功能,SMEE=Disable表示在BIOS中关闭内存加密功能。1.安装Anolis8.4操作系统请参考Anolis8.4GA说明文档安装anolis
131、8.4GA。2.升级kernel到5.104746dockerVerdictdocicrypt-rsattestation-agentskopeokata-agentcontainerdKataRuntimeQEMUKVM+CSVPSPHostCSVGuestVMKBS注意:固件buildid要大于等于1600才可以支持远程证明。若版本低于1600,请联系BIOS厂商提供PI版本=2.1.0.2的BIOS。背景信息1、CSVVM启动;2、下载加密镜像时才会通过attestation-agent将通过vm-attestationhypercall获取的包括attesta
134、buildid:1600bootloaderversion:0.0.0guest_count:0supportedcsvguest:11platform_statuscommandsuccessful4849Anlois8.4的默认内核版本是4.19,5.10的内核上支持CSV远程证明功能。请升级kernel到5.10版本。1、请参考以下命令,添加Anolis的Experimentalrepo,并将kernel升级至5.10。2、配置bootloader。grubby-update-kernel=ALL-args=mem_encrypt=onkvm_amd.sev=13、
135、重启机器,请输入以下命令查看内核版本uname-r预期输出:5.10.134-12.an8.x86_64注意!如果您使用的是Anolis8.6GA镜像,可能会碰到使能SEV之后,机器Hang住无法进入系统的情况。请参考以下步骤降级grub2-efi之后,可以正常启动这个特性yumdowngradegrub2-efi3.检查CSV使能状态1、在操作系统内执行:dmesg|grep-isev出现如下结果时,表示CSV已经使能。9.179127ccp0000:05:00.2:sevenabled10.297951ccp0000:05:00.2:SEVAPI:1.2build
136、:010.311454SEVsupported:11ASIDs1、检查kvm_amd和ccp模块是否成功安装。lsmod|grepkvm4.使用hag检查固件版本信息1、安装hag1、通过hag获得平台状态catEOF|sudotee/opt/csv/ccv0-guest/cmdlinetsc=reliableno_timer_checkrcupdate.rcu_expedited=1i8042.direct=1i8042.dumbkbd=1i8042.nopnp=1i8042.noaux=1noreplace-smpreboot=kconsole=hvc0c
137、onsole=hvc1cryptomgr.notestsnet.ifnames=0pci=lastbus=0quietpanic=1nr_cpus=cat/proc/cpuinfo|grepprocessor|wc-lscsi_mod.scan=noneagent.config_file=/etc/agent-config.tomlEOF5051步骤一:配置权限景信息1.关闭firewallLinux系统下面自带了防火墙iptables,iptables可以设置很多安全规则。但是如果配置错误很容易导致各种网络问题。此处建议关闭firewall。执行如下操作:sudoserv
138、icefirewalldstop2.关闭selinuxSecurity-EnhancedLinux(SELinux)是一个在內核中强制访问控制(MAC)安全性机制。为避免出现权限控制导致的虚拟机启动、访问失败等问题,此处建议关闭selinux。执行如下操作:sudosetenforce0sudosed-is/SELINUX=enforcing$/SELINUX=permissive/etc/selinux/config步骤二:安装kata环境KataContainers是一个开源的、致力于用轻量级虚拟机构建一个安全的容器运行时的实现,这些虚拟机在感觉和执行上与容器类似,但使用
139、硬件虚拟化技术作为第二层防御,提供了更强的工作负载隔离。关于项目的更多信息,请参见kata-container。1.安装kata-containers1、请执行以下命令,安装kata-containers。yuminstall-ykata-static2、运行以下命令,查看kata-containers是否安装成功。tree/opt/kata/2.安装qemu此处使用的qemu基于6.2.0构建。yuminstall-yqemu-system-x86_643.安装guestkernel,initrd,ovmfccv0-guest中包含kata运行CSVVM所需的guestkern
140、el、initrd、OVMF、cmdline等文件。其中:guest的rootfs和kernel,需使用efi_secret的内核模块以支持向文件系统中注入secret,加入AA并修改AA设置,自行构建请参考guestRootfsandKernel;这里提供的OVMF是基于f0f3f5aae7c4d346ea5e24970936d80dc5b60657进行构建的,也可以使用edk2-stable202108后的版本自行构建,以支持CSV。yuminstall-yccv0-guestcmdline中记录了CSVVM启动时所需的参数信息,需根据实际使用情况进行修改。可参考以下命令:4
141、.安装kata-runtimekata-runtime运行CSVVM。yum-yinstallkata-runtime5.配置kata-runtime执行以下命令,配置kata运行时:这里修改了kata-runtime默认配置中的qemu、guestkernel&initrd&OVMF路径;使能confidential-guest选项并加入attestation-agent-config配置;将默认内存大小由2048调整为8000;将共享文件系统由virtio-fs调整为virtio-9p。mkdir-p/etc/kata-containers/&cp/opt/kata/share/
142、defaults/kata-containers/configuration.toml/etc/kata-containers/&cd/etc/kata-containers/&sed-is/opt/kata/bin/qemu-system-x86_64/opt/qemu/bin/qemu-system-x86_64/configuration.toml&sed-is/kata/share/kata-containers/vmlinux.container/csv/ccv0-guest/vmlinuz-5.15.0-rc5+/configuration.toml&sed-is/image
143、=/opt/kata/share/kata-containers/kata-containers/initrd=/opt/csv/ccv0-guest/initrd.run/configuration.toml&sed-is/#confidential_guest/confidential_guest/configuration.toml&sed-is/kernel_params=/kernel_params=agent.config_file=/etc/agent-config.toml/configuration.toml&sed-is/firmware=/firmware=/opt
144、/csv/ccv0-guest/OVMF.fd/configuration.toml&sed-is/default_memory=2048/default_memory=8000/configuration.toml&sed-is/shared_fs=virtio-fs/shared_fs=virtio-9p/configuration.toml&sed-is/#service_offload/service_offload/configuration.toml步骤三:安装containerdContainerd是一个行业标准的容器运行时,强调简单性、健壮性和可移植性。它可以作为Linu
145、x和Windows的守护进程,可以管理其主机系统的完整容器生命周期:图像传输和存储、容器执行和监督、底层存储和网络附件等。更多信息请参考containerd1、执行以下命令,安装containerdsudoyuminstall-ycontainerd2、启动containerdsudosystemctlenable/etc/systemd/system/containerd.servicesudosystemctldaemon-reloadsudoservicecontainerdrestart预期输出类似如下:containerd.service-containerdc
147、Tasks:34Memory:46.8MCGroup:/system.slice/containerd.service1884522/usr/bin/containerdyuminstall-ygop/opt/csv/calculate_hash.py-ovmf/opt/csv/ccv0-guest/OVMF.fd-kernel/opt/csv/ccv0-guest/vmlinuz-5.15.0-rc5+-initrd/opt/csv/ccv0-guest/initrd.run.img-cmdline/opt/csv/ccv0-guest/cmdline输出结果类似如下:Calcu
148、latinghashofkernelat/opt/csv/ccv0-guest/vmlinuz-5.15.0-rc5+Calculatinghashofinitrdat/opt/csv/ccv0-guest/initrd.run.imgCalculatinghashofkernelparams(/opt/csv/ccv0-guest/cmdline)FirmwareDigest:OJXIhq3PHbknNmpAIy8YpUHOpY0wvGRXULOW8djVAZA=#ps-ef/opt/qemu/bin/qemu-system-x86_64.-kernel/opt/c
149、sv/ccv0-guest/vmlinuz-5.15.0-rc5+-initrd/opt/csv/ccv0-guest/initrd.run.img-appendtsc=reliableno_timer_checkrcupdate.rcu_expedited=1i8042.direct=1i8042.dumbkbd=1i8042.nopnp=1i8042.noaux=1noreplace-smpreboot=kconsole=hvc0console=hvc1cryptomgr.notestsnet.ifnames=0pci=lastbus=0debugpanic
150、=1nr_cpus=96scsi_mod.scan=noneagent.log=debugagent.debug_consoleagent.debug_console_vport=1026agent.config_file=/etc/agent-config.tomlagent.log=debuginitcall_debug-pidfile/run/vc/vm/0d134059d36e2c099363d0c48d176e18ae9133dcb4ce25094079cfc1fd5de3a5/pid.tsc=reliableno_timer_checkrcupdate.rcu_
151、expedited=1i8042.direct=1i8042.dumbkbd=1i8042.nopnp=1i8042.noaux=1noreplace-smpreboot=kconsole=hvc0console=hvc1cryptomgr.notestsnet.ifnames=0pci=lastbus=0debugpanic=1nr_cpus=96scsi_mod.scan=noneagent.log=debugagent.debug_consoleagent.debug_console_vport=1026agent.config_file=/etc/
152、agent-config.tomlagent.log=debuginitcall_debug5253步骤四:搭建kubernetes运行环境请参考kubernetes官方指南安装Kubernetescluster。搭建kubernetes运行环境。步骤五:安装并启动verdictdVerdictd是一种远程认证实现,由一组构建块组成,这些构建块利用Intel/AMD的安全特性来发现、验证和支持关键的基础安全和机密计算用例。它依靠RATS-TLS应用远程认证基础和标准规范来维护平台数据收集服务和高效的验证引擎来执行全面的信任评估。这些信任评估可用于管理应用于任何给定工作负载的不同信任和安全
153、策略。更多信息请参考verdictd项目文档。1.请执行以下命令,安装verdictdyuminstall-yverdictd2.配置CSVOPA文件获得measurementCSV机器容器启动的时候,要对kernel,intird,ovmf和cmdline进行度量,来确保云上启动的guestVM的确是符合预期的CSVVM。默认情况下,请使用/opt/csv/calculate_hash.py计算measurement。为确保/opt/csv/calculate_hash.py运行正常,请安装snowland-smx模块,以pip3为例:pip3installsnowland-
154、smx安装完成后执行:注意:如果您修改了Kata的配置文件(/etc/kata-containers/configuration.toml),可能会影响cmdline的内容。请您用ps-ef|grepqemu输出qemu实际启动VM的命令参数,然后参考-append的参数获得guestVM的cmdline.最后重新使用/opt/csv/calculate_hash.py脚本计算measurement.例如:则guestVM的cmdline为配置csvDatamkdir-p/opt/verdictd/opa/&catEOF|sudotee/opt/verdictd/opa
155、/csvDatameasure:OJXIhq3PHbknNmpAIy8YpUHOpY0wvGRXULOW8djVAZA=EOF配置csvPolicy.regocat0input.measure=data.measure_EOF步骤六:制作加密镜像1.制作加密镜像可参考Generateencryptedcontainerimage制作加密镜像。在本例中以docker.io/zhouliang121/al-pine-84688df7-2c0c-40fa-956b-29d8e74d16c1-gcm:latest为例进行测试。注意事项:在机密计算场景中,加密镜像是在guestVM中由
156、imgae-rs组件负责拉取,而不是在host进行拉取。如果您出于研究的目的,想查看加密镜像的内容。请注意由于镜像是加密的,用常规的docker,ctr和crictl都无法正常拉取。请使用skopeo工具进行镜像的拉取。参考命令如下:skopeo-insecure-policycopydocker:/docker.io/zhouliang121/alpine-84688df7-2c0c-40fa-956b-29d8e74d16c1-gcm:latestoci:test2.部署镜像密钥mkdir-p/opt/verdictd/keys/&echo111111111111111
157、1111111111111111/opt/verdictd/keys/84688df7-2c0c-40fa-956b-29d8e74d16c13.修改镜像policy以docker.io/zhouliang121/alpine-84688df7-2c0c-40fa-956b-29d8e74d16c1-gcm:latest为例:catEOF|sudotee/opt/verdictd/image/policy.jsondefault:type:insecureAcceptAnything,transports:docker:docker.io/zhouliang121/:type:ins
159、_quoteverify.so.1:cannotopensharedobjectfile:Nosuchfileordirectory步骤七:部署加密镜像1.创建RuntimeClass对象kata用户可以使用RuntimeClass为pod指定不同的运行时,这里使用kata作为验证时使用的运行时。在集群中执行以下命令,创建RuntimeClass对象kata。cat-EOF|kubectlapply-f-apiVersion:node.k8s.io/v1kind:RuntimeClassmetadata:name:katahandler:kataEOF2.部署pod如果po
160、d的runtimeClassName设置为kata,CRI插件会使用KataContainers运行时运行pod。执行以下命令,部署名称为alpine的pod。cat-EOF|kubectlapply-f-apiVersion:v1kind:Podmetadata:name:nginx-sandboxspec:runtimeClassName:katacontainers:-image:docker.io/zhouliang121/alpine-84688df7-2c0c-40fa-956b-29d8e74d16c1-gcm:latestcommand:-top545
161、5基于pre-attestation使用机密容器本文主要为您介绍如何在kata环境中基于海光安全加密虚拟化功能CSV(ChinaSecureVirtualization)技术,通过pre-attestaion认证方式,启动一个租户的加密容器镜像。前提条件请参考基于runtime-attestation使用机密容器指南的前提条件一节,完成对系统环境的检查和配置。背景信息dockerGuestOwnerProxyContainerdKataRuntimeQEMUKVM+CSVPSPimage-rskata-agentocicrypt-rsattestation-agentHost
162、CSVGuestVMKBS12310984567:containerd调用kata-runtime创建CSVVM,kata-runtime调用image-rs下载加密镜像;:kata-runtime获取CSVVM的launch_measurement发送给gop-server;:gop-server调用hag对launch_measurement计算和校验;验证gop-server调用hag对key进行加密、形成secret和secret_header,发送给kata-runtime:kata-runtime调用qemu向C
163、SVVM注入secret;CSVVM利用固件解密secret获取key存入指定位置;:CSVVM中的attestation-agent获取key,image-rs使用key解密镜像;:启动镜像运行workload步骤一:配置权限请参考基于runtime-attestation使用机密容器指南的步骤一,完成配置权限。步骤二:安装kata环境KataContainers是一个开源的、致力于用轻量级虚拟机构建一个安全的容器运行时的实现,这些虚拟机在感觉和执行上与容器类似,但使用硬件虚拟化技术作为第二层防御,提供了更强的工作负载隔离。关于项目的更多信息,请参见k
165、measurement计算需要qemu支持kernel-hashes,在qemu6.2.0之后开始支持kernel-hashes标志,此处提供的qemu是基于6.2.0版本构建。yuminstall-yqemu-system-x86_643.安装guestkernel,initrd,OVMFccv0-guest中包含kata运行CSVVM所需的guestkernel、initrd、OVMF、cmdline等文件。其中:guest的rootfs和kernel,需使用efi_secret的内核模块以支持向文件系统中注入secret,加入AA并修改AA设置,自行构建请参考guestRo
166、otfsandKernel;这里提供的OVMF是基于f0f3f5aae7c4d346ea5e24970936d80dc5b60657进行构建的,也可以使用edk2-stable202108后的版本自行构建,以支持CSV.yum-yinstallccv0-guest5657imagePullPolicy:IfNotPresentname:alpinerestartPolicy:NeverEOF3.测试加密镜像是否部署成功执行以下命令,查看加密镜像是否部署成功:kubectlgetpods预期输出:NAMEREADYSTATUSRESTARTSAGEnginx-sandbox
167、1/1Running030s步骤三:安装containerd请参考基于runtime-attestation使用机密容器指南的步骤三来安装containerd。步骤四:搭建运行环境请参考kubernetes官方指南安装Kubernetescluster。搭建kubenetes运行环境。步骤五:安装并启动GOPKBSGOP(guestownerproxy)用于验证CSVVM的启动,并有条件地提供一个secret,是一项非常复杂的操作。该工具设计用于在可信环境中运行,提供验证和sercret注入服务。1.请执行以下命令,安装GOPKBSyuminstall-ygop初始化:
168、cd/opt/csv/guest-owner-proxy./make_grpc.sh2.安装haghag是海光提供的工具,主要用于建立和管理服务器的csv证书链,确保csv虚拟机在安全可靠的环境下执行,不受主机干扰。yuminstall-yhag3.使用hag生成证书链rm-rf/opt/csv/*cert/opt/csv/*txt/opt/csv/*bin/tmp/csv-guest-owner-proxy/&cd/opt/csv&hag-pdh_cert_export4.修改脚本适配本机环境将keysets.json中的min-api-major、min-api-minor、allo
169、wed-build-ids分别改为hag-plat-form_status显示的api_major、api_minor、build_id将gop-client.py中hw_api_major、hw_api_minor、hw_build_id分别改为hag-platform_status显示的api_major、api_minor、build_id将gop-server.py中的build_id值改为与gop-client.py中hw_build_id相同5.启动GOPservercd/opt/csv/guest-owner-proxy/&./make_grpc.sh&./gop-server
170、.pycmdline中记录了CSVVM启动时所需的参数信息,需根据实际使用情况进行修改。可参考以下命令:catEOF|sudotee/opt/csv/ccv0-guest/cmdlinetsc=reliableno_timer_checkrcupdate.rcu_expedited=1i8042.direct=1i8042.dumbkbd=1i8042.nopnp=1i8042.noaux=1noreplace-smpreboot=kconsole=hvc0console=hvc1cryptomgr.notestsnet.ifnames=0pci=lastbus
171、=0quietpanic=1nr_cpus=cat/proc/cpuinfo|grepprocessor|wc-lscsi_mod.scan=noneagent.config_file=/etc/agent-config.tomlEOF4.安装kata-runtimepre-attestation使用的kata-runtime,需要基于confidential-containers项目的kata-containers-CCv0的CCv0分支,并加入CCv0:SEVprelaunchattestationbyjimcaddenPullRequest#3025kat
172、a-con-tainers/kata-containersGitHub上的pre-attestation的支持patchf682220d和d2c3f372;同时也需要使用修改后的CPUID以支持HygonCPU。yum-yinstallkata-runtime5.配置kata-runtime执行以下命令,配置kata运行时。这里修改了kata-runtime默认配置中的qemu、guestkernel&initrd&OVMF路径;使能confidential-guest选项并加入guest_attestation_proxy、guest_attestation_keyse
173、t、attesta-tion-agent-config等配置;将默认内存大小由2048调整为8000;将共享文件系统由virtio-fs调整为virtio-9p。mkdir-p/etc/kata-containers/&cp/opt/kata/share/defaults/kata-containers/configuration.toml/etc/kata-containers/&cd/etc/kata-containers/&sed-is/opt/kata/bin/qemu-system-x86_64/opt/qemu/bin/qemu-system-x86_64/configurati
174、on.toml&sed-is/kata/share/kata-containers/vmlinux.container/csv/ccv0-guest/vmlinuz-5.15.0-rc5+/configuration.toml&sed-is/image=/opt/kata/share/kata-containers/kata-containers/initrd=/opt/csv/ccv0-guest/initrd.pre/configuration.toml&sed-is/#confidential_guest/confidential_guest/configuration.toml&
175、sed-i/confidential_guest/aguest_attestation=truenguest_attestation_proxy=localhost:50051nguest_attestation_keyset=KEYSET-1configuration.toml&sed-is/kernel_params=/kernel_params=agent.config_file=/etc/agent-config.toml/configuration.toml&sed-is/firmware=/firmware=/opt/csv/ccv0-guest/OVMF.fd/config
176、uration.toml&sed-is/default_memory=2048/default_memory=8000/configuration.toml&sed-is/shared_fs=virtio-fs/shared_fs=virtio-9p/configuration.toml&sed-is/#service_offload/service_offload/configuration.toml5859dockerVerdictdContainerdKataRuntimeQEMUKVM+CSVPSPimage-rsattestation-agentocicrypt-rska
178、TARTSAGEnginx-sandbox1/1Running050s步骤六:制作加密镜像1.制作加密镜像请参考指南制作加密镜像。在本例中可以使用docker.io/haosanzi/busybox-v1:encrypted作为镜像进行测试。2.将加密key保存到GOP的keys.json文件中GOP的keys.json文件路径:/opt/csv/guest-owner-proxy/keys.json。步骤七:部署加密镜像1.创建RuntimeClass对象kata用户可以使用RuntimeClass为pod指定不同的运行时,这里使用kata作为验证时使用的运行时。在集群中执行
179、以下命令,创建RuntimeClass对象kata。cat-EOF|kubectlapply-f-apiVersion:node.k8s.io/v1kind:RuntimeClassmetadata:name:katahandler:kataEOF2.部署pod用如果pod的runtimeClassName设置为kata,CRI插件会使用KataContainers运行时运行pod。执行以下命令,部署名称为busybox的pod。cat-EOF|kubectlapply-f-apiVersion:v1kind:Podmetadata:name:nginx-sandbox
180、spec:runtimeClassName:katacontainers:-image:docker.io/haosanzi/busybox-v1:encryptedcommand:-topimagePullPolicy:IfNotPresentname:alphine-haosanzirestartPolicy:NeverEOF3.测试加密镜像是否部署成功执行以下命令,查看加密镜像是否部署成功:6061基于runtime-attestation使用签名容器本文主要为您介绍如何在kata环境中基于海光安全加密虚拟化功能CSV(ChinaSecureVirtualization)技
181、术,启动一个租户的签名容器镜像。前提条件请参考基于runtime-attestation使用机密容器指南的前提条件一节,完成对系统环境的检查和配置。背景信息:attestation-agent通过vm-attestationhypercall获取包括attestation-report、chip-id等内容的CSVVMevidence;:attestation-agent发送CSVVMevidence给verdictdserver;verdictd验证CSVVMevidence的证书链、签名、digest等内容;与attestation-agent
182、建立基于rats-tls的可信硬件环境的安全通道;:attestation-agent向verdictdserver请求验签key和imagepolicy,verdictd作为KBS通过安全通道发送policy文件和验签key发送给attestation-agent;:image-rs使用key验签镜像;:启动镜像运行workload步骤一:配置权限请参考基于runtime-attestation使用机密容器指南的步骤一,完成配置权限。步骤二:制作签名的应用容器镜像1.生成GPG密钥对GPG:GNUPrivacyGuard,用于加密、签名通信内容及管理非
184、es:2024-05-10由于verdictd不支持kbx格式pubkey,还需执行如下操作生成pubring.gpgcd/root/.gnupg/gpg2-armor-export-outputpubring.gpg2.制作签名的应用容器镜像以docker.io/library/busybox:latest这个镜像为例,假设用户名为test,则远端的个人仓库为dock-er.io/test/busybox。注意:在实际操作中,应将docker.io/test更名为实际操作的用户名,docker.io/xxxx。首先配置/etc/containers/registries.d/defaul
186、/busybox:sig-testskopeologoutdocker.io/test以用户test为例:在本地可观察到/var/lib/containers/sigstore目录下多出了test目录(这样就完成了签名的准备工作):tree/var/lib/containers/sigstore/var/lib/containers/sigstoretestbusyboxsha256=52f431d980baa76878329b68ddb69cb124c25efa6e206d8b0bd797a828f0528esignature-1步骤三:安装kata环境请参考基于runtime
187、-attestation使用机密容器指南的步骤二来安装kata环境,并参考以下步骤更新initrd文件和kata配置文件。更新initrd文件解压initrdimagecpinitrd.run.img./initrd.img.gzgunzipinitrd.img.gzmkdirinitrdcdinitrd/cpio-ivmd./initrd.new.imggzip./initrd.new.imgcd./&mvinitrd.new.img.gzinitrd.new.imgcpinitrd.new.imginitrd.run.img6263步骤四:安装containerd请参
188、考基于runtime-attestation使用机密容器指南的步骤三来安装containerd。步骤五:搭建kubenetes运行环境请参考基于runtime-attestation使用机密容器指南的步骤四来搭建kubenetes运行环境。步骤六:安装并启动VerdictdVerdictd是一种远程认证实现,由一组构建块组成,这些构建块利用Intel/AMD的安全特性来发现、验证和支持关键的基础安全和机密计算用例。它依靠RATS-TLS应用远程认证基础和标准规范来维护平台数据收集服务和高效的验证引擎来执行全面的信任评估。这些信任评估可用于管理应用于任何给定工作负载的不同信任和安全策略。更多信息
189、请参考verdictd项目文档。1.安装verdictedyumremoveverdictd-yrm-rf/usr/share/rats-tls/usr/local/lib/rats-tls/usr/local/bin/verdict*yuminstall-yverdictd2.配置verdicted2.1将步骤二中的pubring.gpg复制到/opt/verdictd/gpg/cp/root/.gnupg/pubring.gpg/opt/verdictd/gpg/keyring.gpg2.2将policy.json写入到/opt/verdictd/image/在实际操作中,应
190、将用户docker.io/test更名为实际操作的docker.io用户名,docker.io/xxxx。cat/opt/verdictd/image/policy.json/opt/verdictd/image/sigstore.yamlEOFdefault-docker:sigstore:file:/var/lib/containers/sigstoredocker:docker.io/test:sigstore:file:/var/lib/containers/sigstoreEOF2.4配置CSVOPA文件使用/opt/csv/calculate_hash.py计算measure
191、:yuminstall-ygop/opt/csv/calculate_hash.py-ovmf/opt/csv/ccv0-guest/OVMF.fd-kernel/opt/csv/ccv0guest/vmlinuz-5.15.0-rc5+-initrd/opt/csv/ccv0-guest/initrd.run.img-cmdlin/opt/csv/ccv0-guest/cmdlinee输出结果类似如下:Calculatinghashofkernelat/opt/csv/ccv0-guest/vmlinuz-5.15.0-rc5+Calculatinghashofinitr
192、dat/opt/csv/ccv0-guest/initrd.run.imgCalculatinghashofkernelparams(/opt/csv/ccv0-guest/cmdline)FirmwareDigest:OJXIhq3PHbknNmpAIy8YpUHOpY0wvGRXULOW8djVAZA=配置csvData,需确保csvData中的measure与前一步计算的FirmwareDigest一致。mkdir-p/opt/verdictd/opa/&catEOF|sudotee/opt/verdictd/opa/csvDatameasure:OJXIhq3PHb
193、knNmpAIy8YpUHOpY0wvGRXULOW8djVAZA=EOF配置csvPolicy.rego:catEOF|sudotee/opt/verdictd/opa/csvPolicy.regopackagepolicy#Bydefault,denyrequests.defaultallow=false6465注意:在实际操作中,应将用户docker.io/test更名为实际操作的用户名,docker.io/xxxx。cat0input.measure=data.measure_EOF3.启动verdictd使用以下命令启动verdictd,从而于Attestation-
195、像1.创建RuntimeClass对象kata用户可以使用RuntimeClass为pod指定不同的运行时,这里使用kata作为验证时使用的运行时。在集群中执行以下命令,创建RuntimeClass对象kata。cat-EOF|kubectlapply-f-apiVersion:node.k8s.io/v1kind:RuntimeClassmetadata:name:katahandler:kataEOF2.部署pod如果pod的runtimeClassName设置为kata,CRI插件会使用KataContainers运行时运行pod。执行以下命令,部署名称为sig-t
196、est的pod。海光CSV机密虚拟机本文主要为您介绍如何在CSV裸金属/物理机环境中启动一个CSV虚拟机。背景信息海光CPU支持安全虚拟化技术CSV(ChinaSecureVirtualization),CSV的设计目标是通过CSV虚拟机提供可信执行环境,适用的场景包括云计算、机密计算等。海光2号支持CSV1技术,提供虚拟机内存加密能力,采用国密SM4算法,不同的CSV虚拟机使用不同的加密密钥,密钥由海光安全处理器管理,主机无法解密虚拟机的加密内存。步骤一:安装edk2-ovmf请执行如下命令安装edk2-ovmf。OVMF是一个基于EDKII的项目,用于虚拟机的UEFI支持,更多
197、详细信息请参考OVMFyuminstall-yedk2-ovmf步骤二:安装qemu-kvm请执行以下命令安装qemu-kvm。Qemu是一款开源的模拟器和虚拟机监视器,可用于虚拟机管理、加速,可以用来虚拟X86、Power、Arm、MIPS等平台,具有高速、跨平台的特性。qemu广泛应用于虚拟机管理、仿真等领域。更多详细信息请参考qemuyuminstall-yqemu-kvm步骤三:安装libvirt请执行以下命令安装libvirt。libvirt是一套用于管理虚拟化的开源API、守护进程与管理工具。此套组件可用于管理KVM、Xen、VMwareESXi、QEMU及其他虚拟化技
199、st.qcow2步骤五:启动CSVguest虚拟机启动方式一:使用QEMU命令行启动请参考如下qemu命令行启动CSVguest虚拟机:启动方式二:使用virsh启动virsh是用于管理虚拟化环境中的客户机和Hypervisor的命令行工具,与virt-manager等工具类似,它也是通过libvirtAPI来实现虚拟化的管理。virsh是完全在命令行文本模式下运行的用户态工具,它是系统管理员通过脚本程序实现虚拟化自动部署和管理的理想工具之一。配置libvirt请将/etc/libvirt/qemu.conf中的user和group设置为root,以免出现权限问题
200、和报错:442#Someexamplesofvalidvaluesare:443#444#user=qemu#Ausernamedqemu445#user=+0#Superuser(uid=0)446#user=100#Ausernamed100orauserwithuid=100447#448user=root449450#ThegroupforQEMUprocessesrunbythesysteminstance.Itcanbe451#specifiedinasimilarwaytouser.452group=root
201、453重启libvirtd服务systemctldaemon-reloadservicelibvirtdrestartsudo/usr/libexec/qemu-kvm-enable-kvm-cpuhost-smp4-m4096-driveif=pflash,format=raw,unit=0,file=/usr/share/edk2/ovmf/OVMF_CODE.cc.fd,readonly=on-hdatest.qcow2-objectsev-guest,id=sev0,policy=0x1,cbitpos=47,reduced-phys-bits=5-machine
202、memory-encryption=sev0-nametest-monitorstdio6869创建CSVguest配置文件以下是CSV虚拟机的参考配置文件csv_launch.xml,在使用过程中,请根据实际需求,修改对应的配置字段。更多配置请参考LaunchsecuritywithAMDSEVcsv_launch44hvmdestroyrestartdestroy/usr/libexec/qemu-kvm0x0001475启动CSV虚拟机sudovirshcreatecsv_launch.xml步骤六:检查guest的CSV使能状态请使用v
205、容器镜像仓库中。用户命令Kubernetes启动这个受保护的容器镜像。kubelet会向containerd发起创建Pod的CRI请求,containerd则把请求转发给kata-runtime,kata-runtime启动一个TDX保护的轻量级VM,目前支持TDX的VMM有Dragonball,CloudHypervisor,Qemu。kubelet向containerd发起ImagePulling的CRI请求,containerd则把请求转发给kata-runtime,最终kata-agent收到请求并通过image-rs子模块提
206、供的容器镜像管理功能,在下载image之前,image-rs会跟attestation-agent进行远程认证。Attestation-agent与Keybrokerservice(verdictd)建立安全会话,并进行基于runtimestack启动过程中的度量值进行远程认证,确保runtime没有被篡改。只有通过远程认证,image解密key,签名的policy和证书才会传送到TEE保护的guest内部。通过远程证明后,拿到imagepolicy文件,签名证书,解密imagekey,image-rs进行验签、解密、unpack以及挂载容器镜像的操作,最终顺利启动contai
209、MLDR.1.482195tdx:BuildallsystemmemoryblocksasTDXmemory.5.919528tdx:LoadedTDXmoduleviaP-SEAMLDR.5.919763tdx:TDXSEAMmodule:attributes0x0vendor_id0x8086build_date20220420build_num0x156minor_version0x0major_version0x1.6.379342tdx:SuccessfullyinitializedTDXmodule7475Li
210、nux系统下面自带了防火墙iptables,iptables可以设置很多安全规则。但是如果配置错误很容易导致各种网络问题。此处建议关闭firewall。执行如下操作:sudoservicefirewalldstop检查firewall状态:servicefirewalldstatus预期结果如下:Redirectingto/bin/systemctlstatusfirewalld.servicefirewalld.service-firewalld-dynamicfirewalldaemonLoaded:loaded(/usr/lib/systemd/syst
211、em/firewalld.service;disabled;vendorpreset:enabled)Active:inactive(dead)Docs:man:firewalld(1)关闭selinuxSecurity-EnhancedLinux(SELinux)是一个在内核中实施的强制存取控制(MAC)安全性机制。为避免出现权限控制导致的虚拟机启动、访问失败等问题,此处建议关闭selinux。执行如下操作:setenforce0预期结果如下:setenforce:SELinuxisdisabled配置containerd自动生成默认的config.tomlcontainerdc
212、onfigdefault/etc/containerd/config.toml由于默认的config.toml使用的是国外的镜像,国内有可能无法访问。请参考以下命令修改为国内镜像。cd/etc/containerdsed-is#registry.k8s.io/pause:3.6#-config.toml启动containerdsystemctlcontainerdstart部署单节点的Kubernetescluster请参考kubernetes官方指南安装Kubernetescluster。最低Kubernetes版本应为1.24。确保集群中至少有一个Kuber
213、netes节点具有标签node-role.kubernetes.io/worker=kubectllabelnodenode-role.kubernetes.io/worker=步骤二:安装ConfidentialcomputingOperatorConfidentialcomputingOperator提供了一种在Kubernetes集群上部署和管理ConfidentialContainersRuntime的方法。具体信息请参考指南。前提条件1、确保Kubernetes集群节点至少有8GBRAM和4个vCPU2、当前CoCo版本仅支持基于
214、containerd运行时的Kubernetes集群3、确保SELinux被禁用或未强制执行(confidential-containers/operator#115)部署OperatorOperator目前有3个版本,这里默认安装最新版v0.3.0版本。通过运行以下命令部署Operator:kubectlapply-k资源依赖国外的镜像,可能拉不下来,请参考以下步骤对镜像进行修改:kubectleditdeploycc-operator-controller-manager-nconfidential-containers-system#将gcr.io/kubebuil
215、der/kube-rbac-proxy:v0.13.0替换成image:quay.io/brancz/kube-rbac-proxy:v0.13.0查看节点状态:kubectlgetpods-nconfidential-containers-system-watch预期结果如下。注意这三个pod都要存在,且STATUS都要为Running。NAMEREADYSTATUSRESTARTSAGEcc-operator-controller-manager-56cb4d5ff5-lqd9x2/2Running0167mcc-operator-daemon-install-rg8
216、s91/1Running0154mcc-operator-pre-install-daemon-7jhnw1/1Running0154m创建customresource创建customresource会将所需的CCruntime安装到集群节点中并创建RuntimeClasses。操作如下:kubectlapply-kRuntimeClasses。kubectlgetruntimeclass预期结果如下:NAMEHANDLERAGEkatakata154mkata-clhkata-clh154m7677kata-clh-tdxkata-clh-
217、tdx154mkata-qemukata-qemu154mkata-qemu-sevkata-qemu-sev154mkata-qemu-tdxkata-qemu-tdx154m卸载Operator(非必要步骤)如果您想更新Operator的版本,或者您的安装出现问题,可以先卸载,再回到上面的步骤重新安装。具体操作请参考链接。kubectldelete-kdelete-kinstall-yverdictd2.部署镜像加密密钥mkdir-p/opt/verdictd/keys/cat/opt/verdictd/keys/84688df7-2c0c-40fa-956b-29
219、licy注意:在实际操作中,应将用户docker.io/test更名为实际操作的用户名,docker.io/xxxx。catEOF|sudotee/opt/verdictd/image/policy.jsondefault:type:insecureAcceptAnything,transports:docker:docker.io/test/:type:sigstoreSigned,keyPath:/run/image-security/cosign/cosign.pubEOF5.启动verdictdverdictd-listen0.0.0.0:20002-verifiertd
220、x-attesternullattester-client-api127.0.0.1:20001-mutual当Verdictd启动后,Verdictd在端口监听地址0.0.0.0:20002监听来自attestationagent的远程证明请求。6.制作加密image可参考Generateencryptedcontainerimage制作加密镜像。注意事项:在机密计算场景中,加密镜像是在guestVM中由imgae-rs组件负责拉取,而不是在host进行拉取。如果您出于研究的目的,想查看加密镜像的内容。请注意由于镜像是加密的,用常规的docker,ctr和crictl都无法正常
221、拉取。请使用skopeo工具进行镜像的拉取。参考命令如下:#下载一个明文imageskopeocopydocker:/docker.io/library/alpine:latestoci:alpine#为skopeo生成一个keyprovider配置文件$sudomkdir-p/etc/containerd/ocicrypt/$cat-EOF|sudotee/etc/containerd/ocicrypt/ocicrypt_keyprovider.confkey-providers:attestation-agent:grpc:127.0.0.1:200017879步骤四:启动并
222、验证带签名的加密镜像1.配置TDXCoCoruntimeattestationagent支持TDX平台的KBC为:eaa_kbc,远端verdictdservice用于提供验证和image解密key,签名的policy和密钥信息。vim/opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-tdx.toml#EAAKBCisspecifiedas:eaa_kbc:host_ip:portkernel_params=agent.aa_kbc_params=eaa_kbc:ver
223、dictd_ip_address:20002agent.enable_signature_verification=true2.部署Pod注意:在实际操作中,应将用户docker.io/test更名为实际操作的用户名,docker.io/xxxx。cat-EOF|kubectlapply-f-apiVersion:v1kind:Podmetadata:name:test-tdx-alpinespec:runtimeClassName:kata-qemu-tdxcontainers:-image:docker.io/test/alpine-encryptedcommand:-topima
224、gePullPolicy:Alwaysname:test-tdx-alpinerestartPolicy:NeverEOF查看pod是否启动成功:kubectlgetpo预期结果如下:NAMEREADYSTATUSRESTARTSAGEtest-tdx-alpine1/1Running031hkubectldescribepodtest-tdx-alpineNormalPulling5skubeletPullingimagedocker.io/test/alpine-encryptedNormalPulled3skubeletSuc
225、cessfullypulledimagedocker.io/test/alpine-encryptedin1.682344015s(1.682349283sincludingwaiting)NormalCreated3skubeletCreatedcontainertest-tdx-alpineNormalStarted3skubeletStartedcontainertest-tdx-alpine#verdictd日志EOFexportOCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocic
226、rypt_keyprovider.conf#生成加密image并保存在远端dockerregistry#注意:在实际操作中,应将用户docker.io/test更名为实际操作的用户名,docker.io/xxxx。skopeocopy-encryption-keyprovider:attestation-agent:84688df7-2c0c-40fa-956b-29d8e74d16c0oci:alpinedocker:/docker.io/test/alpine-encryptedmapattestation-agent:127.0.0.1:50001&mapattestation
227、-agent:127.0.0.1:500019711611610111511697116105111110459710310111011658565254565610010255455099489945524810297455753549845505710056101555210049549948attestation-agent:84688df7-2c0c-40fa-956b-29d8e74d16c0idx:17mapattestation-agent:565254565610
228、010255455099489945524810297455753549845505710056101555210049549948Gettingimagesourcesignatures&mapattestation-agent:565254565610010255455099489945524810297455753549845505710056101555210049549948mapCopyingblob63b65145d645doneCopy
229、ingconfig6a2bcc1c7bdoneWritingmanifesttoimagedestinationStoringsignatures#verdictd日志2023-02-27T06:02:18ZINFOverdictd:client_api:key_providerwrap_command:KeyProviderInputop:keywrap,keywrapparams:KeyWrapParamsec:Some(EcParameters:attestation-agent:ODQ2ODhkZjctMmMwYy00MGZhLTk1NmItMjlkOGU
230、3NGQxNmMw,DecryptConfig:DcParameters:),optsdata:Some(eyJzeW1rZXkiOiIycEVxWk9jNVhyUmN0WXdyQzl1UlJmSkZ5WGM2ZnV2SWZUckhnMHEyM0RrPSIsImRpZ2VzdCI6InNoYTI1Njo2M2I2NTE0NWQ2NDVjMTI1MGMzOTFiMmQxNmViZTUzYjM3NDdjMjk1Y2E4YmEyZmNiNmIwY2YwNjRhNGRjMjFjIiwiY2lwaGVyb3B0aW9ucyI6eyJub25jZSI6IkNURk5UZ2hZL0pkRkd0eGNKYz
231、c5dUE9PSJ9fQ=),keyunwrapparams:KeyUnwrapParamsdc:None,annotation:None2023-02-27T06:02:18ZINFOverdictd:resources:directory_key_managergetkeyfromkeyFile:/opt/verdictd/keys/84688df7-2c0c-40fa-956b-29d8e74d16c02023-02-27T06:02:18ZINFOverdictd:client_api:key_providerkey:49,50,51,52,53,54,55,56
233、实现方式之一,硬件提供飞地(Enclave)的构建能力,使运行在飞地中的用户代码数据具备加密性和完整性保护的特点。同时通过远程证明的自证手段,为用户提供SGX飞地运行环境和软件组件的可信度。SGX作为成熟的硬件TEE技术,为联邦学习,多方计算,区块链,安全数据库等诸多场景中提供技术底座的支撑。问题&挑战目前云服务提供商售卖的计算资源以虚拟机,安全容器的形式最为常见。硬件的能力通过虚拟化的方式暴露给虚拟机和安全容器,以SGX为例,如何通过虚拟化的方式,能够在虚拟机和安全容器中透传SGX的硬件能力,让联邦学习,多方计算,区块链等业务形态方便易用的使用具备SGX功能的云上计算资源。解决方案SGX的
234、能力主要针对用于飞地的专用内存EPC(EnclavePageCache)进行加密和完成行保护来实现。SGX的虚拟化实现一下三方面技术支撑:1、由虚拟机的CPUID来枚举SGX的能力2、通过为虚拟机模拟构建EPC的区域使虚拟机感知SGXEPC3、捕捉虚拟机中SGX飞地构建的特殊指令,提供SGX飞地中附加功能的支持SGX虚拟化的支持已在Linux上游社区和龙蜥的5.10内核中支持。2023-03-01T08:19:45ZINFOverdictd:attestation_agent:rats_tlsresponse:data:base64size:452,status:OK2023-0
235、3-01T08:19:45ZINFOverdictd:attestation_agent:protocolRequest:Objectcommand:String(GetPolicy),optional:Object2023-03-01T08:19:45ZINFOverdictd:attestation_agent:rats_tlsresponse:ewogICAgImRlZmF1bHQiOiBbCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJyZWplY3QiCiAgICAgICAgfQogICAgXSwKICAgICJ0cmFuc3B
236、vcnRzIjogewogICAgICAgICJkb2NrZXIiOiB7CiAgICAgICAgICAgICJyZWdpc3RyeS5kb21haW4ubG9jYWwiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2lnc3RvcmVTaWduZWQiLAogICAgICAgICAgICAgICAgICAgICJrZXlQYXRoIjogIi9ydW4vaW1hZ2Utc2VjdXJpdHkvY29zaWduL2Nvc2lnbi5wdWIiCiAgICAgICAgICAgICAgICB9CiAgICA
237、gICAgICAgIF0KICAgICAgICB9CiAgICB9Cn0K2023-03-01T08:19:45ZINFOverdictd:attestation_agent:protocolRequest:Objectcommand:String(GetResourceInfo),name:String(CosignKey)2023-03-01T08:19:45ZINFOverdictd:attestation_agent:rats_tlsresponse:data:base64size:240,status:OK2023-03-01T08:19:45ZINFOver
238、dictd:attestation_agent:protocolRequest:Objectcommand:String(GetCosignKey),optional:Object2023-03-01T08:19:45ZINFOverdictd:attestation_agent:rats_tlsresponse:LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFZ3h6NWhEVXl6VnpFd2RVcnhZb1JQVE1pN0ZveQovVEI4OTVlbm
239、tMdzE4RHNLczR1MnFidHg1L1hJNVlKaUJ4TDhyZG9NL3A5clBQSHVDVVdpSkxBSFVnPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg=EOF8283IntelSGX虚拟机最佳实践本文主要为您介绍如何在SGX裸金属/物理机环境中启动一个SGX虚拟机,以及如何在SGX虚拟机中构建SGX加密计算环境,并演示如何运行示例代码以验证SGX功能。背景信息IntelSGX是一组用于内存访问的指令和机制,以便为敏感应用程序和数据提供安全访问。SGX允许应用程序将其特定的地址空间用作enclave,这是一个
240、受保护的区域,即使在存在特权恶意软件的情况下也能提供机密性和完整性。阻止任何不驻留在enclave中的软件访问enclave内存区域,包括来自特权软件的访问。用户可以使用Linux内核中KVM虚拟化模块和QEMU在支持英特尔SGX的硬件上创建一个虚拟机,该虚拟机可以在Guest操作系统中使用IntelSGXandIntelSGXDataCenterAttestationPrimitives(IntelSGXDCAP)。前提条件1.检查BIOS是否使能SGX请使用BIOS使能SGX功能的SGX裸金属。以浪潮NF5280M6SG
241、X机型为例,请参考下图的步骤检查SGX是否使能。1.1.TotalMemoryEncriptionMainmenu-SocketConfiguration-ProcessorConfiguration-TotalMemoryEncryption-En-abled1.2.SWGuardExtensions(SGX)Mainmenu-SocketConfiguration-ProcessorConfiguration-SWGuardExtensions(SGX)-Enabled1.3.PRMRRSizeMainmenu-SocketConfiguration
242、-ProcessorConfiguration-SWGuardExtensions(SGX)-PRMRRSize推荐设置为32G(PRMRR决定单socket上预留EPC的大小)用户情况后续计划SGX2.0中的EDMM功能提供动态得为SGX飞地增加EPC资源的能力,在后续的龙蜥版本中,通过龙蜥机密计算SIG,为用户提供该功能。2.安装Anolis8.6操作系统请参考Anolis8.6GA说明文档安装Anolis8.6GA。3.升级kernel到5.10安装kernel5.10yum-config-manager-add-repo
244、ion0x180c000000-0x1fffffffff2.456785sgx:EPCsection0x280c000000-0x2fffffffff2.522183sgx:EPCsection0x380c000000-0x3fffffffff检查SGX驱动安装情况。ls/dev/sgx*以下输出表示已经安装SGX驱动。/dev/sgx_enclave/dev/sgx_provision/dev/sgx_vepc步骤一:安装QEMU如果系统QEMU的版本低于v6.2.0,请执行以下命令安装QEMUv6.2.0。更多详细信息请参考qemu。e
245、xportversion=6.2.0-11.0.1.module+an8.6.0+10830+f21fb638.5yuminstall-yqemu-img-$versionqemu-guest-agent-$versionqemu-kvm-$versionqemu-kvm-common-$versionvirsh是用于管理虚拟化环境中的客户机和Hypervisor的命令行工具,与virt-manager等工具类似,它也是通过libvirtAPI来实现虚拟化的管理。virsh是完全在命令行文本模式下运行的用户态工具,它是系统管理员通过脚本程序实现虚拟化自动部署和
247、中构建英特尔SGX环境,需要访问以下设备:/dev/sgx_enclave启动enclave/dev/sgx_provision启动供应认证enclave(PCE)/dev/sgx_vepc分配EPC内存页libvirt默认启用的cgroup控制器将拒绝访问这些设备文件。编辑/etc/libvirt/qemu.conf并更改cgroup_device_acl列表已包括所有三个:cgroup_device_acl=/dev/null,/dev/full,/dev/zero,/dev/random,/dev/urandom,/dev/ptmx,/dev/kvm,/d
248、ev/rtc,/dev/hpet,/dev/sgx_enclave,/dev/sgx_provision,/dev/sgx_vepcQEMU还需要读取和写入/dev/sgx_vepc设备,该设备由root拥有,文件模式为600。这意味着您必须将QEMU配置为以root身份运行。请编辑/etc/libvirt/qemu.conf,并设置用户参数。user=“root”进行这些更改后,您需要重新启动libvirtd服务:systemctlrestartlibvirtd配置NAT网络重启libvirtd服务之后,请检查当前的网络设置。#virshnet-li
250、cow2-root-passwordpassword:123456结果显示:0.0Examiningtheguest.6.5Settingarandomseed6.5Settingpasswords7.6Finishingoff步骤三:启动SGXGuest启动方式一:使用QEMU命令行启动请输入以下QEMU命令来启动SGXGuest。/usr/libexec/qemu-kvm-enable-kvm-cpuhost,+sgx-provisionkey-smp8,sockets=1-m16G-no-reboot-drivefile=$HO
251、ME/vsgx/AnolisOS-8.6-x86_64-ANCK.qcow2,if=none,id=disk0,format=qcow2-devicevirtio-scsi-pci,id=scsi0,disable-legacy=on,iommu_platform=true-devicescsi-hd,drive=disk0-nographic-monitorpty-monitorunix:monitor,server,nowait-objectmemory-backend-epc,id=mem1,size=64M,prealloc=on-Msgx-epc.0.memdev
252、=mem1,sgx-epc.0.node=0请输入步骤二设置的用户名和密码,进入SGXGuest。localhostlogin:rootPassword:123456启动方式二:使用virsh启动sgxguestyes1048576启动虚拟机#virshcreatevsgx.xmlDomainvsgxcreatedfromvsgx.xml成功启动虚拟机之后,请输入一下命令列出虚拟机实例。#virshlistId名称状态-1vsgxrunning进入虚拟机控制台#virshconsolevsgxConnectedtodomainvsgxEsca
253、pecharacteris(Ctrl+)#这里要敲一下回车键AnolisOS8.6Kernel4.19.91-26.an8.x86_64onanx86_64Activatethewebconsolewith:systemctlenable-nowcockpit.socketlocalhostlogin:请输入步骤二设置的用户名和密码,进入SGXguest。libvirt默认使用了一个名为default的NAT网络,这个网络默认使用virbr0作为桥接接口,使用dnsmasq来为使用nat网络的虚拟机提供dns及dhcp服务。如果您
254、需要自定义libvirt虚拟网络,请参考libvirt网络管理。创建SGXGuestxml文件以下是SGX虚拟机的参考xml文件vsgx.xml,在使用过程中,请根据实际需求,修改对应的配置字段。说明:假设guestimage的位置为/root/vsgx/AnolisOS-8.6-x86_64-ANCK.qcow2,使用名为default的NAT网络vsgx16777216167772168hvmdestroyrestartrestart/usr/libexec/qemu-kvm86878889localhostlogin:rootPa
255、ssword:123456检查Guest的SGX使能状态不管是用QEMU命令行直接启动的SGXGuest,还是使用virsh启动的SGXGuest,在启动之后,都需要检查Guest中对SGX是否支持。在Guest中使用SGX需要支持SGX的内核/操作系统。可以通过以下方式在Guest中确定支持:检查SGX使能状态。dmesg|grep-isgx以下输出表示SGX已经被正确使能。0.489460sgx:EPCsection0x440000000-0x443ffffff检查SGX驱动安装情况。ls/dev/sgx_*以下输出
259、ode/SampleEnclave&make运行编译出的可执行文件。./app预期输出:Checksum(0x0x7ffc732e8d20,100)=0xfffd4143Info:executingthreadsynchronization,pleasewait.Info:SampleEnclavesuccessfullyreturned.Enteracharacterbeforeexit.步骤六:停止虚拟机QEMU停止虚拟机在SGXGuest里输入exit退出Guest虚拟机,然后CTRL+C终止QEMU进程。vrish停止虚拟机停止虚拟机请
260、在Host机器上,输入以下命令停止虚拟机。#virshshutdownvsgxDomainvsgxisbeingshutdown删除虚拟机请在Host机器上,输入以下命令删除虚拟机。#virshundefinevsgxDomainvsgxhasbeenundefined强制停止虚拟机说明:仅限shutdown不工作时才使用destroy。virshdestroyvsgx9091AMDSEV机密容器本文主要为您介绍如何基于AMD安全加密虚拟化功能SEV(AMDSecureEncryptedVirtualization)技术,通过远程证明启动一个租
262、0.134-13_rc2.an8.x86_643.使能SEV注意:在Anolis8.6中,grub版本默认为1:2.02-123.0.2.an8_6.8。此版本存在BUG,如果直接进行使能sev的操作,会导致机器重启后无法进入系统的情况。请采用降级grub的workround方法。修改yum源,在Anolis8.5中才有低版本的grub。cd/etc/yum.repos.dsed-is/$releasever/8.5/AnolisOS-BaseOS.repo降级grub。umdowngradegrub2-efi查看grub的版本,预期结果如下:#yumli
263、st|grepgrubgrub2-common.noarch1:2.02-106.0.1.an8BaseOSgrub2-efi-x64.x86_641:2.02-106.0.1.an8BaseOSgrub2-pc.x86_641:2.02-106.0.1.an8BaseOSgrub2-pc-modules.noarch1:2.02-106.0.1.an8BaseOSgrub2-tools.x86_641:2.02-106.0.1.an8BaseOSgrub2-tools-efi.x86_641:2.02-106.0.1.an8BaseOSgrub2-tools-ext
264、ra.x86_641:2.02-106.0.1.an8BaseOSgrub2-tools-minimal.x86_641:2.02-106.0.1.an8BaseOS使能SEV和SME默认情况下SEV和SME没有使能,请输入以下内核命令行进行使能:grubby-update-kernel=ALL-args=mem_encrypt=onkvm_amd.sev=1重启机器。reboot重启后,请检查机器的sev使能状态。dmesg|grep-isev预期结果如下:6.747923ccp0000:4b:00.1:sevenabled6.842676ccp0000:4b:00.
265、1:SEVfirmwareupdatesuccessful6.997400ccp0000:4b:00.1:SEVAPI:1.42build:427.522437SEVsupported:255ASIDs最后检查SME(SecureMemoryEncryption)的状态。dmesg|grep-isme预期结果如下:1.863927AMDMemoryEncryptionFeaturesactive:SME9293ConfidentialVMRelyingPartykubectlImageRepoKeyBroker+AttestationServi
266、ceCRIOContainerdkata-shim-v2VMMKVM+SEVPSPLinuxKernelAMDSEVPlatformfirmwarekernelinitrdattestation-agentkata-agentAMDSEVPod级机密容器架构基于KataContainers项目,最大区别是将基于普通虚拟化技术实现的轻量级SandboxPod替换为基于机密计算技术实现的轻量级TEEPod,目的是将特定租户的整个Pod以及其中的容器运行在受CPUTEE保护的执行环境中。除此之外,TEEPod内部还额外集成了image-rs和attes
268、送敏感数据给kataruntime。kataruntime调用QEMU将秘密信息注入到guestuserland中。之后再调用QEMU启动Pod。CPUTEE执行初始化,最终启动kata-agent监听后续请求。kubelet向containerd发起ImagePulling的CRI请求,containerd则把请求转发给kata-runtime,最终kata-agent收到请求并通过image-rs子模块提供的容器镜像管理功能,在TEE内安全地执行拉取、验签、解密、unpack以及挂载容器镜像的操作。步骤一:部署测试集群本步骤为您提供
269、快速部署单节点测试集群的步骤。您可以根据您的需求,灵活部署集群。配置权限关闭firewallLinux系统下面自带了防火墙iptables,iptables可以设置很多安全规则。但是如果配置错误很容易导致各种网络问题。此处建议关闭firewall。执行如下操作:背景信息预期结果如下,注意,状态(STATUS)应该是Up的。CONTAINERIDIMAGECOMMANDCREATEDSTATUSa7cc49ee1d19registry:latest/entrypoint.sh/etc38minutesagoUp38minutes0.0.0.0:5000-5000
270、/tcp,:5000-5000/tcpnostalgic_montalcini配置containerd自动生成默认的config.tomlcontainerdconfigdefault/etc/containerd/config.toml由于默认的config.toml使用的是国外的镜像,国内有可能无法访问。请参考以下命令修改为国内镜像。cd/etc/containerdsed-is#registry.k8s.io/pause:3.6#-config.toml启动containerdsystemctlcontainerdstart部署单节点的Kubernetesclu
271、ster请参考kubernetes官方指南安装Kubernetescluster。最低Kubernetes版本应为1.24。确保集群中至少有一个Kubernetes节点具有标签node-role.kubernetes.io/worker=kubectllabelnodenode-role.kubernetes.io/worker=步骤二:安装ConfidentialcomputingOperatorConfidentialcomputingOperator提供了一种在Kubernetes集群上部署和管理ConfidentialContainersRun
272、time的方法。具体信息请参考指南。前提条件1、确保Kubernetes集群节点至少有8GBRAM和4个vCPU2、当前CoCo版本仅支持基于containerd运行时的Kubernetes集群3、确保SELinux被禁用或未强制执行(confidential-containers/operator#115)部署OperatorOperator目前有3个版本,这里默认安装最新版v0.3.0版本。通过运行以下命令部署Operator:kubectlapply-k资源依赖国外的镜像,可能拉不下来,请参考以下步骤对镜像进行修改:sudoservicefire
273、walldstop检查firewall状态:servicefirewalldstatus预期结果如下:Redirectingto/bin/systemctlstatusfirewalld.servicefirewalld.service-firewalld-dynamicfirewalldaemonLoaded:loaded(/usr/lib/systemd/system/firewalld.service;disabled;vendorpreset:enabled)Active:inactive(dead)Docs:man:firewalld(1)关闭selinuxS
274、ecurity-EnhancedLinux(SELinux)是一个在内核中实施的强制存取控制(MAC)安全性机制。为避免出现权限控制导致的虚拟机启动、访问失败等问题,此处建议关闭selinux。执行如下操作:setenforce0预期结果如下:setenforce:SELinuxisdisabled安装operator-sdkoperatorSDK项目是OperatorFramework的一个组件,OperatorFramework是一个开源工具包,用于以有效、自动化和可扩展的方式管理Kubernetes原生应用程序,称为Operators。具体信息,请参考oper
276、ckerrun-itd-p5000:5000docker.io/library/registry:latest检查docker容器是否启动成功:dockerps94959697kubectleditdeploycc-operator-controller-manager-nconfidential-containers-system#将gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0替换成image:quay.io/brancz/kube-rbac-proxy:v0.13.0查看节点状态:kubectlgetpods-nconfid
277、ential-containers-system-watch预期结果如下。注意这三个pod都要存在,且STATUS都要为Running。NAMEREADYSTATUSRESTARTSAGEcc-operator-controller-manager-56cb4d5ff5-lqd9x2/2Running0167mcc-operator-daemon-install-rg8s91/1Running0154mcc-operator-pre-install-daemon-7jhnw1/1Running0154m创建customresource创建customres
278、ource会将所需的CCruntime安装到集群节点中并创建RuntimeClasses。操作如下:kubectlapply-kRuntimeClasses。kubectlgetruntimeclass预期结果如下:NAMEHANDLERAGEkatakata154mkata-clhkata-clh154mkata-clh-tdxkata-clh-tdx154mkata-qemukata-qemu154mkata-qemu-sevkata-qemu-sev154mkata-qemu-tdxkata-qemu-tdx154m卸载Operator(非必要
279、步骤)如果您想更新Operator的版本,或者您的安装出现问题,可以先卸载,再回到上面的步骤重新安装。具体操作请参考链接。kubectldelete-kdelete-kKBSsimplekbs是一个密钥代理服务,可以存储并向workload提供secret。对于SEV加密容器示例来说,需要从simplekbs中获取secret,并用于解密已加密的容器。在步骤四的示例二中,本文提供了一个简单的加密镜像(docker.io/haosanzi/busybox-v1:encrypted),该镜像使用simplekbs已经存在的密钥来解密,同时对policy不进行校验。
282、pec:containers:-image:bitnami/nginx:1.22.0name:nginxdnsPolicy:ClusterFirstruntimeClassName:kataEOF预期结果:configuration-qemu-sev.toml启动Podcat-EOF|kubectlapply-f-apiVersion:v1kind:Podmetadata:labels:run:test-en-onlinename:test-en-onlinespec:containers:-image:docker.io/haosanzi/busybox-v1:encrypte
284、-oroutegetto8.8.8.8|sed-ns/.*src(0-9.+).*/1/p)sed-is/agent.enable_signature_verification=false/&agent.aa_kbc_params=online_sev_kbc:$kbs_ip:44444/opt/confidential-containers/share/defaults/kata-containers/自定义policy,请参考附录部分。启动Podcat-EOF|kubectlapply-f-apiVersion:v1kind:Pod9899pod/nginxcreate
286、offlinesevKBC的基础上,支持在运行时发出请求。onlinesevKBC在VMBoot时期通过QEMU注入connection。注入的connection包含一个对称密钥,用于加密和验证KBC发出的在线请求。该连接受SEV(-ES)秘密注入过程保护,该过程提供机密性、完整性并防止重放攻击。simple-kbs为每个连接生成一个新的对称密钥。KBC要求每个在线secret都带有随机guid以防止重放攻击。注意:offline_sev_kbc和online_sev_kbc是两种option,用户只需要采用一种KBC方式运行镜像即可。导出SEV证书链sevc
288、utegetto8.8.8.8|sed-ns/.*src(0-9.+).*/1/p)sed-is/agent.enable_signature_verification=false/&agent.aa_kbc_params=online_sev_kbc:$kbs_ip:44444/opt/confidential-containers/share/defaults/kata-containers/setappendwhile$SECONDS-lt$duration;doqemu_process=$(psaux|grepqemu|grepappend|true)if-n$q
289、emu_process;thenappend=$(echo$qemu_process|seds|.*-append(.*$)|1|g|seds|-.*$|)breakfisleep1doneecho$append使用sev-snp-measure来计算SEVguest的Launchdigest。measurement=$(./sev-snp-measure.py-mode=sev-output-format=base64-ovmf$ovmf_path-kernel$kernel_path-initrd$initrd_path-append$append)设置si
290、mplekbs数据库参数KBS_DB_USER=kbsuserKBS_DB_PW=kbspasswordKBS_DB=simple_kbsKBS_DB_TYPE=mysqlKBS_DB_HOST=$(dockernetworkinspectsimple-kbs_default|jq-r.Containers|select(.Name|test(simple-kbs_-db.*).IPv4Address|seds|/.*$|g)由于本文使用的加密镜像(docker.io/haosanzi/busybox-v1:encrypted),是采用simplekbs已经存在的密钥来解密,
291、该镜像的enc_key值如下。用户需要根据加密镜像按需设置enc_key。enc_key=RcHGava52DPvj1uoIk/NVDYlwxi0A6yyIZ8ilhEX3X4=将自定义policy注入mysql中。policy的组成包括:digests、policies、api_major、api_minor、build_ids等信息。详情请参考链接。我们以digests为例子,向用户展示如何注入自定义policy。用户可以根据需求自定义Policy。mysql-u$KBS_DB_USER-p$KBS_DB_PW-h$KBS_DB_HOST-D$KBS_DBAMDCBS-CP
292、UCommonOptions-SMEE-Enable2、Advanced-AMDCBS-NBIOCommonOptions-IOMMU-Enabled3、Advanced-AMDCBS-NBIOCommonOptions-SEV-SNPSupport-Enable102103AnolisOS对SEV的配置进行确认1、cat/proc/cmdline确保输出有mem_encrypt=onkvm_amd.sev=1类似输出如下BOOT_IMAGE=(hd1,gpt2)/vmlinuz-5.10.134-12.1.an8.x86_64root=/dev/mapper/ao-
293、rootrocrashkernel=autoresume=/dev/mapper/ao-swaprd.lvm.lv=ao/rootrd.lvm.lv=ao/swaprhgbquietmem_encrypt=onkvm_amd.sev=1kvm_amd.sev_es=12、dmesg|grep-iSEV确保输出有SEVsupported类似输出如下5.145496ccp0000:47:00.1:sevenabled5.234221ccp0000:47:00.1:SEVAPI:1.49build:65.445958SEVsupported:253A
295、fault-import-controllertype=scsi,model=virtio-scsi,driver.iommu=on-controllertype=virtio-serial,driver.iommu=on-networknetwork=default,model=virtio,driver.iommu=on-memballoondriver.iommu=on-graphicsnone-launchSecuritysevvirsh用xml文件启动创建sev.xml文件,内容如下csv_launch44hvmdestroyrestar
297、/var/lib/libvirt/images/sev-guest.img3、创建VM镜像用户和密码配置文件cloud-config#cloud-configssh_pwauth:Truepassword:123456chpasswd:expire:Falsechpasswd:list:|root:123456ubuntu:123456expire:False4、cloud-localds/var/lib/libvirt/images/init-passwd.isocloud-config第五步启动VMvirsh安装的方式virt-install-namesev-guest
298、-memory4096-memtunehard_limit=4563402-bootuefi-disk/var/lib/libvirt/images/sev-guest.img,device=disk,bus=scsi-disk/var/lib/libvirt/images/init-passwd.iso,device=cdrom-os-typelinux-os-variantcentos8104105CODE.cc.fd,readonly=on/导入sev-guest虚拟机virshdefinesev.xml开启虚拟机virshstartsev-guest第
300、进程的影响。英特尔SGX经过了严格测试,是业界广泛部署的基于硬件的数据中心可信执行环境(TEE),大幅减少了系统中的攻击面。问题&挑战传统的基于SGXSDK的编程方式,对应用开发者来说是一个极大的挑战。它需要应用开发者在熟悉TEE/S-GXSDK的基础上,重新设计,分割,编译已有的应用,对广发应用TEE技术于各种应用来说,难度极大。解决方案Occlum是基于SGX基础上实现的一套轻量级LibOS,大大简化了应用开发者的难度。使用Occlum后,机器学习工作负载等只需修改极少量(甚至无需修改)源代码即可在英特尔SGX上运行,以高度透明的方式保护了用户数据的机密性和完整性。1061
301、07应用场景场景描述Occlum为蚂蚁摩斯(TEE服务平台,将TEE能力作为一种SaaS服务开放出来)提供技术底座。Occlum为Intel的一个分布式的隐私保护机器学习(PrivacyPreservingMachineLearning,PPML)平台提供TEE技术底座。应用效果总体上来说,Occlum强大高效的LibOS使得用户的应用可以很方便的运行在TEE环境里,大大推动了TEE机密计算生态的发展。无论是在机密数据库(MySQL,PosrgreSQL,MongoDB),还是大数据、机器学习领域(PyTorch,Tensorflow,Spark),Occlum都有实例证明了其
303、ubeletPALruneruneCRIruntimev2(shimAPI)ConfidentialKuberneteswithInclavareContainers108109如下图所示,InclavareContainers中包含多个组件,这些组件可以利用基于硬件支持的Enclave技术使可信应用运行在容器中。包含的组件有rune、shim-rune、EnclaveRuntime等。rune:rune是一个命令行工具,用于根据OCI规范在容器中生成和运行Enclave。rune是在runc代码基础上开发的,既可以运行普通runc容器也可以运行Enc
305、me实现基于库操作系统。目前,推荐的与rune交互的EnclaveRuntime是Occlum,这是一种内存安全、多进程Libos。另一类典型的EnclaveRuntime是带有IntelSGXWebAssem-blyMicroRuntime(WAMR),这是一个占用空间很小的独立WebAssembly(WASM)运行时,包括一个VM核心、一个应用程序框架和一个WASM应用程序的动态管理。此外,您可以使用您喜欢的任何编程语言和SDK(例如英特尔SGXSDK)编写自己的EnclaveRuntime,只要它实现了EnclaveRuntimePA
306、LAPI。InclavareContianers主要有以下特点:1、将IntelSGX技术与成熟的容器生态结合,将用户的敏感应用以Enclave容器的形式部署和运行;InclavareContianers的目标是希望能够无缝运行用户制作的普通容器镜像,这将允许用户在制作镜像的过程中,无需了解机密技术所带来的复杂性,并保持与普通容器相同的使用体感。2、IntelSGX技术提供的保护粒度是应用而不是系统,在提供很高的安全防护手段的同时,也带来了一些编程约束,比如在SGXenclave中无法执行syscall指令;因此我们引入了LibOS技术,用于改善上述的软件兼
307、容性问题,避免开发者在向IntelSGXEnclave移植软件的过程中,去做复杂的软件适配工作。然后,虽然各个LibOS都在努力提升对系统调用的支持数量,但这终究难以企及原生Linux系统的兼容性,并且即使真的达成了这个目标,攻击面过大的缺点又会暴露出来。因此,InclavareContainers通过支持Java等语言Runtime的方式,来补全和提升Enclave容器的泛用性,而不是将Enclave容器的泛用性绑定在“提升对系统调用的支持数量”这一单一的兼容性维度上;此外,提供对语言Runtime的支持,也能将像Java这样繁荣的语言生态引入到机密
308、计算的场景中,以丰富机密计算应用的种类和数量。3、通过定义通用的EnclaveRuntimePALAPI来接入更多类型的EnclaveRuntime,比如LibOS就是一种EnclaveRuntime形态;设计这层API的目标是为了繁荣EnclaveRuntime生态,允许更多的EnclaveRuntime通过对接InclavareContainers上到云原生场景中,同时给用户提供更多的技术选择。应用场景作为业界首个面向机密计算场景的开源容器运行时,InclavareContainers为ACK-TEE(ACK-TrustedExecuti
311、成额外的开发负担。解决方案Enclave-cc方案在部署阶段对用户的镜像进行加密和签名处理,从而保证镜像的安全性和完整性,防止在被第三方窥探和修改镜像的内容。在生成容器镜像的时候,用户只需要和制作普通容器镜像一样,不需要针对特定的libos做额外定制,对于支持POSIXAPI的应用,可以完全兼容的通过enclave-cc成功运行起来。StandardContainerImageSGXRuntimeWrapDockerRebuildSpecializedLibOSConfidentialContainerPushtoContainerImageRegistryRequirean
312、OSSorISVSGXLibOSRuntimeSoftwareStandardContainerImageImageEncryptionImageSigningPushtoContainerImageRegistryRSupportedbycontainerecosystem110111Solution解决方案Enclave-cc方案的运行流程如下:1、用户使用标准工具制作一个签名和/或加密的受保护的容器镜像,并上传到容器镜像仓库中。2、用户命令Kubernetes启动这个受保护的容器镜像。kubelet会向containerd发起创建Pod的C
313、RI请求,containerd则把请求转发给shim-rune,最终调用rune创建实际的Pod。3、CPUTEE执行初始化,最终启动enclave-agent监听后续请求。4、kubelet向containerd发起ImagePulling的CRI请求,containerd则把请求转发给shim-rune,最终enclave-agent收到请求并通过image-rs子模块提供的容器镜像管理功能,在TEE内安全地执行拉取、验签、解密、unpack以及挂载容器镜像的操作。5、如果TEE内没有预先在bootimage中内置验签或解密容
315、钥和加密引导过程中用到的磁盘解密密钥。Enclave-cc为云原生用户提供了一种机密容器的部署和运行方案。能够让用户在使用机密容器的时候具有和使用普通容器一样的体感,用户不需要针对于机密容器的场景修改应用,在部署的时候不需要额外的操作步骤RuneShim-runecontainerdkubeletEnclaveAgentLibOS(occlum/gramine)KBSAttestationServerIntelPCSKMSCommonComponentEnclave-CCForSGXImagemanagementAttestationAgentPALAPIRuneletSGX-ba
318、ation、KMS、TLS。用户可以通过对不同参考案例的部署增加对不同安全组件的使用和选择。部署TensorFlowServing在线推理服务概述本文介绍在IntelSGX使能的平台,基于AnolisOS部署TensorFlowServing在线推理服务的技术架构和使用流程。RuntimeSecurity:当前主要使用IntelSGX,基于应用程序级别的隔离,对用户的应用和数据进行保护。LibOS:Gramine和Occlum。通过LibOS运行现有应用程序,只需进行细微修改或无需修改,即可在IntelSGXEnclave中运行。RemoteAttestation:提供了具体
319、RA-TLS能力集成的gRPC框架,方便用户将远程认证的功能需要集成到自有框架中。KMS:提供了集成远程认证加密钥管理的功能模块。TLS:集成了RA-TLS功能,并启用了证书验证机制。CCZoo将会跟AnolisCloudNativeConfidentialComputing(CNCC)SIG展开合作,将CCZoo中不同机密计算场景下的方案,结合Anolis的技术框架进行实现和部署,如下图所示。应用场景CCZoo中多场景下的机密计算方案可以帮助CNCCSIG进一步丰富用户基于Anolis的安全方案使用场景,为用户提供了最佳实践。同时,CCZoo也会基于方案级别,对Anolis进行全
320、栈式的测试和验证,从用户实际使用的角度,来验证Anolis的可靠性和功能性。CCZooSolutions(TFServing/HFL/)GramineAnolisOSK8sIntelSGX2.0GramineShieldedContainersEnclaveConfidentialContainersGramineGraminerunCrunC114115背景信息TensorFlowServing是Google开源的机器学习平台TensorFlow生态的一部分,它的功能是将训练好的模型运行起来,提供接口给其他服务调用,以便使用模型进行推理预测。阿里云ECS部分安全增强型实例基于
321、IntelSGX(SoftwareGuardExtension)技术,提供了SGX加密计算能力,打造了基于硬件级别的更高安全等级的可信机密环境,保障关键代码和数据的机密性与完整性不受恶意软件的破坏。将TensorFlowServing在线推理场景部署在阿里云安全增强型实例可信机密环境中,可以保证数据传输的安全性、数据盘的安全性、数据使用的安全性、以及AI在线推理应用程序的完整性。本实践为开发者使用AnolisOS提供了参考实现,您可以了解以下内容:对基于SGX加密技术实现的端到端的全数据生命周期安全方案有整体了解。对于使用TensorFlowServing的开发者,可直接参照本实践
322、部署和开发脚本。为使用安全增强型实例的SGX开发者提供可行性参考框架和脚本,您可根据本实践步骤快速了解安全增强型实例以及环境搭建部署流程,轻松上手使用。技术架构本实践技术架构如下所示。本实践涉及三个角色:客户端、AnolisOSSGX端、远程请求端。客户端:客户端机器会将训练完的模型以及用来建立安全连接的TLS证书进行加密,并将这些加密文件上传到AnolisOSSGX端环境中。同时,客户端机器还将部署密钥提供服务,主要用来对SGX端进行认证,确保运行在云上的TensorFlowServing推理服务应用的完整性及SGX环境的可行性。验证通过后,会将密钥发送给在OSSGX中运行的
323、TensorFlowServing推理服务。AnolisOSSGX端:AnolisOSSGX端提供SGX机密计算环境,TensorFlowServing推理服务运行在SGX环境中。当推理服务启动时,会向客户端发送远程认证请求,证明当前SGX环境的可行性和AI推理服务的完整性。验证成功后,推理服务会拿到客户端发送的密钥,并对加密的模型和TLS证书进行解密,至此,运行在SGX环境中的推理服务成功运行,并等待远程访问请求。密SGX(Anolisos)LibOSGramineTFServingSGXTLSIntelPCCSServiceERPC(TLS)ERPC(TLS)12346
324、57远程请求端:第三方使用者通过网络安全传输,将数据发送到运行在SGX机密计算环境中的推理服务。推理完成后,得到返回结果。说明:本实践将客户端和远程请求端部署在同一台机器,AnolisOSSGX端部署在另外一台机器。本实践使用到的其他组件如下:LibOS:Gramine是一款轻量级LibOS,结合IntelSGX加密保护技术,提供了内核能力定制,运行资源消耗少,具备非常好的ABI兼容性,极大降低了原生应用移植到SGX环境的成本,做到了应用程序不修改或者极少的修改便能运行在SGX环境中。本实践使用Gramine封装TensorFlowServing推理服务,将推理服务简单便捷地运行在S
325、GX实例中。更多信息,请参见Gramine。AI推理服务:TensorFlowServing是Google开源的机器学习平台TensorFlow生态的一部分,它的功能是将训练好的模型运行起来,提供接口给其他服务调用,以便使用模型进行推理预测。更多信息,请参见Tensor-Flow。Docker容器引擎:为了方便部署推理服务,本实践采用将推理服务运行在Container中的方式,利用Docker的命令方式运行推理服务。本实践技术架构说明如下:Intel证书缓存服务PCCS(ProvisioningCertificateCachingService)。如技术架构中所示,AnolisOSS
326、GX端需要向IntelPCCS获取PCK(ProvisioningCertificationKey)证书,IntelSGX会有一个密钥用于Enclave的签名,该密钥对于处理器或者平台是唯一的,密钥的公开部分就是PCK公钥。另外客户端也会向PCCS获取一些信息,比如TCB信息、QuoteEnclave认证的信息、CRL信息等用于对SGXEnclave的认证。搭建好AnolisOSSGX端后,可以将本地加密的模型文件以及TLS证书通过网络传输放到云盘中备用,如技术架构中所示。通过LibOSGramine启动TensorFlowServing推理服务时,会加载加密的模型文件,如
327、技术架构中所示。Gramine本身集成了远程认证的功能,在识别到有加密文件加载时,会转向配置好的远程IP服务发送认证请求,如技术架构中所示。本实践在实现时,以一台阿里云实例模拟客户端,同时也作为远程访问端,另一台实例作为SGX环境。在客户端的密钥提供服务对AnolisOSSGX端中的EnclaveQuote认证成功后,会将模型加密的密钥发送给Gramine,如技术架构中所示。由于此时Gramine是运行在Enclave中,因此Gramine拿到密钥对模型解密的过程是安全的。通过LibOSGramine启动TensorFlowServing推理服务时,会加载加密的模型文件,如技术架构中
328、所示。在模型解密后,TensorFlowServing便可以正常运行,并等待远端的访问请求。为了建立通信安全连接通道,远程访问端有TLS的公钥,在建立连接后,会对TensorFlowServing中的TLS证书进行校验。如技术架构中所示。当TensorFlowServing对远程请求端的数据推理完成后,便会通过建立的安全通道将推理结果返回给请求端,如技术架构中所示。步骤一:部署客户端本实践运行的环境信息参考:规格:加密内存8G镜像:Ubuntu20.04公网IP116117安装SGX软件栈1、环境配置安装所需的mesa-libGL软件包。sudopip3install-upgr
330、l.sh下载训练好的模型文件将会存放在创建的models/resnet50-v15-fp32目录下。4、模型格式转换为了兼容TensorFlowServing,需要对训练好的模型文件进行格式转换。python3./model_graph_to_saved_model.py-import_pathpwd-P/models/resnet50-v15-fp32/resnet50-v15-fp32.pb-export_dirpwd-P/models/resnet50-v15-fp32-model_version1-inputsinput-outputspredict转换好的模型文件将
331、会存放在models/resnet50-v15-fp32/1/saved_model.pb。5、创建gRPCTLS证书本实践选择gRPCTLS建立客户端和TensorFlowServing之间的通信连接,并设置TensorFlowServing域名来创建单向TLSKeys和证书,用来建立安全通信通道。该脚本将会创建ssl_configure文件夹,里面包含server和client相应的证书。service_domain_name=grpc.tf-client_domain_name=client.tf-./generate_twoway_ssl_config.sh$s
332、ervice_domain_name$client_domain_name6、创建加密模型mkdirplaintext/mvmodels/resnet50-v15-fp32/1/saved_model.pbplaintext/LD_LIBRARY_PATH=./libs./gramine-sgx-pf-cryptencrypt-wfiles/wrap-key-iplaintext/saved_model.pb-omodels/resnet50-v15-fp32/1/saved_model.pb7、启动密钥验证服务。本实践使用Gramine提供的secret_prov_server