支持 Intel SGX2/SGX1 的 Kubernetes 设备插件
English | 简体中文
sgx-device-plugin 由阿里云容器服务团队和蚂蚁金服安全计算团队针对 Intel SGX 联合开发的 Kubernetes Device Plugin,可以帮助用户更容易的在容器中使用 SGX2/SGX1。
Intel(R) Software Guard Extensions (Intel(R) SGX) 是 Intel 为软件开发者提供的安全技术,用于防止指定的代码和数据的窃取和恶意篡改。详情可参考官方链接 。
- 无需开启容器特权模式即可使用 SGX;
- 支持 EPC 内存大小自动获取;
- 支持容器声明式 EPC 内存分配;
- 支持 SGX2 驱动(/dev/sgx_enclave、/dev/sgx_provision、/dev/sgx/enclave、/dev/sgx/provision)自动透传和挂载到容器;
- 支持 SGX1 驱动(/dev/isgx、/dev/sgx)自动透传和挂载到容器;
- 对于 SGX1
- Intel SGX Drivers
- Intel SGX PSW(Platform Software) (如果你需要 AESM 服务)
- Kubernetes 版本 >= 1.10
- Go 版本 >= 1.13
TEE (Trusted Execution Environment) ,中文名:可信执行环境,是把用户应用程序代码和数据运行在一个通过硬件孤岛和内存加密技术(Hardware Isolation and memory encryption Technology)创建的特殊执行上线文环境 Enclave 中,任何其他应用、OS Kernel、BIOS、甚至 CPU 之外的其他硬件均无法访问,主要用于防止用户的机密数据、隐私数据被恶意修改、窥探和窃取。
在 阿里云ACK (Alibaba Cloud Container Service for Kubernetes) 上可以创建一个基于 Intel® SGX 的机密计算托管 Kubernetes 集群,节点型号是支持 Intel® SGX 的裸金属服务器 ecs.ebmhfg5.2xlarge
, 相对于 VM,裸金属的 Overhead 开销更小,性能更优,性能抖动更小。每个节点上默认都会自动安装 containerd、SGX Driver、SGX PSW(Platform Software) 以及 SGX-Device-Plugin。
Step 1: 下载源码并编译。
mkdir -p $GOPATH/src/github.com/AliyunContainerService
git clone https://github.com/AliyunContainerService/sgx-device-plugin.git $GOPATH/src/github.com/AliyunContainerService/sgx-device-plugin
cd $GOPATH/src/github.com/AliyunContainerService/sgx-device-plugin/
make
ls -l _output/sgx-device-plugin
Step 2: 镜像打包
docker build -t {SGX_DEVICE_PLUGIN_IMAGE} . -f Dockerfile
docker push {SGX_DEVICE_PLUGIN_IMAGE}
在创建ACK机密计算托管集群时,默认会自动安装 sgx-device-plugin DaemonSet。当然你也可以在你自己支持 SGX 的 Kubernetes 中选择手动安装:
$ cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: sgx-device-plugin-ds
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: sgx-device-plugin
template:
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
k8s-app: sgx-device-plugin
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/acs/sgx-device-plugin:v1.0.0-fb467e2-aliyun
imagePullPolicy: IfNotPresent
name: sgx-device-plugin
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
volumeMounts:
- mountPath: /var/lib/kubelet/device-plugins
name: device-plugin
- mountPath: /dev
name: dev
tolerations:
- effect: NoSchedule
key: alibabacloud.com/sgx_epc_MiB
operator: Exists
volumes:
- hostPath:
path: /var/lib/kubelet/device-plugins
type: DirectoryOrCreate
name: device-plugin
- hostPath:
path: /dev
type: Directory
name: dev
EOF
$ kubectl -n kube-system -l k8s-app=sgx-device-plugin
NAME READY STATUS RESTARTS AGE
sgx-device-plugin-ds-5brgs 1/1 Running 0 5d5h
sgx-device-plugin-ds-b467q 1/1 Running 0 5d5h
sgx-device-plugin-ds-vl7sm 1/1 Running 0 5d5h
$
插件成功运行后,会发现 Node 的 .status.capacity
或 .status.allocatable
多了一种新资源 alibabacloud.com/sgx_epc_MiB
:
$ kubectl get node {NODE_NAME} -o yaml
...
allocatable:
alibabacloud.com/sgx_epc_MiB: "93"
cpu: "8"
...
$
首先你的应用须通过 Intel SGX SDK 或 SGX LibOS 进行编译、签名和镜像打包。
apiVersion: v1
kind: Pod
metadata:
name: {POD_NAME}
namespace: default
spec:
containers:
- image: {CONTAINER_IMAGE}
imagePullPolicy: IfNotPresent
name: {CONTAINER_NAME}
resources:
requests:
alibabacloud.com/sgx_epc_MiB: 20
limits:
alibabacloud.com/sgx_epc_MiB: 20
如果你的应用需要 Remote Attestation,那么必须将 aesm.socket 挂载到你的容器中,有两种方法:
方法一:手动挂载 /var/run/aesmd/aesm.socket
到你的容器中,例如:
apiVersion: v1
kind: Pod
metadata:
name: {POD_NAME}
namespace: default
spec:
containers:
- image: {CONTAINER_IMAGE}
imagePullPolicy: IfNotPresent
name: {CONTAINER_NAME}
resources:
requests:
alibabacloud.com/sgx_epc_MiB: 20
limits:
alibabacloud.com/sgx_epc_MiB: 20
volumeMounts:
- mountPath: /var/run/aesmd/aesm.socket
name: aesmsocket
volumes:
- hostPath:
path: /var/run/aesmd/aesmd/aesm.socket
type: Socket
name: aesmsocket
方法二:启用 sgx-device-plugin 的 AESM socket 自动挂载功能(通过 --enable-aesm-socket-attach=true
选项),详情可参考 deploy/sgx-device-plugin-enable-aesm-socket-attach.yaml。
-
我可以把这个插件部署到自己的私有 Kubernetes 集群中吗 ? 当然可以,这个插件是云原生、云平台无关的,你可以把它部署在任何 Kubernetes 上,但它只能运行在 SGX 的节点上。
-
这个插件是否可以真的帮助应用限制 EPC 大小 ? 不可以,
alibabacloud.com/sgx_epc_MiB
里指定的 EPC 大小限制仅用于 K8s 的调度, 因为 SGX 驱动目前还不支持 EPC 大小限制。
本软件许可证为 Apache 2.0。
详情请参考 CONTRIBUTING.md。