如何安全地授予对容器的访问权限以使用存储在 TPM 中的私钥

问题描述 投票:0回答:1

对于具有TPM的物理设备上的单节点Kubernetes集群,我们如何安全地提供对容器的访问,以便它可以使用TPM中的私钥建立TLS连接?我理解如果我们将它们存储在可以公开的秘密中,但它们并不安全,就好像您可以访问设备一样,您可以获取秘密。因此,如果设备具有可以保护私钥的 TPM,但需要建立证书的容器需要安全地访问私钥。在 Windows 世界中,这更容易,因为证书管理器使用 TPM 提供程序框架存储它们,并且 .net 应用程序只需引用 TLS 连接的证书。这在 Linux 或容器世界中似乎并不容易。任何关于如何在 Linux 中实现这一点的想法都会很有帮助!

kubernetes security tpm
1个回答
0
投票

需要建立证书的容器需要安全地访问私钥。

是吗?

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
)进行受控访问。
但这仅意味着容器可以请求 TPM 执行签名或密钥生成等操作,但它无法直接访问私钥。实际的加密操作(如签名)发生在 TPM 内部,遵循 TPM 的安全原则。 +-----------------------------+ | 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 节点是安全的。并且容器的权限应该最小化,以减少攻击面。

© www.soinside.com 2019 - 2024. All rights reserved.