对于具有TPM的物理设备上的单节点Kubernetes集群,我们如何安全地提供对容器的访问,以便它可以使用TPM中的私钥建立TLS连接?我理解如果我们将它们存储在可以公开的秘密中,但它们并不安全,就好像您可以访问设备一样,您可以获取秘密。因此,如果设备具有可以保护私钥的 TPM,但需要建立证书的容器需要安全地访问私钥。在 Windows 世界中,这更容易,因为证书管理器使用 TPM 提供程序框架存储它们,并且 .net 应用程序只需引用 TLS 连接的证书。这在 Linux 或容器世界中似乎并不容易。任何关于如何在 Linux 中实现这一点的想法都会很有帮助!
需要建立证书的容器需要安全地访问私钥。
是吗?
TPM(可信平台模块)的全部理念是为加密密钥提供硬件级安全性。这意味着,根据设计,TPM 确保私钥永远不会暴露在 TPM 环境之外,甚至不会暴露给主机操作系统:用于 TLS 连接的实际私钥永远不会被任何进程直接访问,包括在容器中运行的进程。
您可以在容器中使用可与主机上的 TPM 交互的软件。该软件应该能够与 TPM 通信。
tpm2-tools
:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y tpm2-tools
# Rest of your container setup
然后将 TPM 设备安装到容器中。在 Kubernetes 中,您可以通过修改 pod 规范来做到这一点:
apiVersion: v1
kind: Pod
metadata:
name: tpm-example
spec:
containers:
- name: tpm-container
image: your-tpm-enabled-container
volumeMounts:
- mountPath: /dev/tpm0
name: tpm
volumes:
- name: tpm
hostPath:
path: /dev/tpm0
type: CharDevice
是的,容器可以通过安全安装点对 TPM 设备(例如,
/dev/tpm0
)进行受控访问。+-----------------------------+
| Kubernetes Node with TPM |
| +-------------------------+ |
| | Container | |
| | +---------------------+ | |
| | | Application with | | |
| | | TPM-enabled Software| | |
| | +---|--------------|--+ | |
| | | | | |
| | | | | |
| | TPM device mounted | | |
| | into the container | | |
| +-----|--------------+----+ |
| | |
| TPM <---- Private Key |
+-----------------------------+
在 TLS 握手期间,容器的应用程序(充当 TLS 客户端或服务器)需要证明其身份,通常是通过使用其私钥对数据进行签名。应用程序不是直接访问私钥,而是请求 TPM 执行此签名操作。
TPM 接收数据,在内部对其进行签名,然后将签名返回给应用程序。
然后,该签名将用于 TLS 握手过程,从而在不暴露私钥的情况下对应用程序进行身份验证。
这假设托管 TPM 和容器的 Kubernetes 节点是安全的。并且容器的权限应该最小化,以减少攻击面。