机密文件指南编辑

本指南提供了一些分步示例和最佳实践,说明了如何在主机上直接部署机密文件或通过 Kubernetes 机密引擎部署机密文件。

文件系统上的机密编辑

可以将机密文件作为纯文本文件直接配置在文件系统上,并通过 Elastic Agent 进行引用或传递。

我们建议采取以下步骤来提高安全性。

文件权限编辑

文件权限不应允许全局读取权限。

在 MacOS 和 Linux 上,您可以分别使用 chownchmod 命令设置文件所有权和文件权限。Fleet Server 在 MacOS 和 Linux 上以 root 用户身份运行,因此,假设有一个名为 mySecret 的文件,您可以使用以下命令对其进行更改:

sudo chown root:root mySecret # set the user:group to root
sudo chmod 0600 mySecret      # set only the read/write permission flags for the user, clear group and global permissions.

在 Windows 上,您可以使用 icacls 更改与文件关联的 ACL 列表:

Write-Output -NoNewline SECRET > mySecret          # Create the file mySecret with the contents SECRET
icacls .\mySecret /inheritance:d                   # Remove inherited permissions from file
icacls .\mySecret /remove:g BUILTIN\Administrators # Remove Administrators group permissions
icacls .\mySecret /remove:g $env:UserName          # Remove current user's permissions
临时文件系统编辑

您可以使用临时文件系统(在 RAM 中)来保存机密文件,以提高安全性。这类文件系统通常不包含在备份中,并且会在主机重置时被清除。如果使用此类文件系统,则需要在每次重置时重新配置文件系统和机密文件。

在 Linux 上,您可以将 mounttmpfs 文件系统一起使用,以在 RAM 中创建临时文件系统:

mount -o size=1G -t tmpfs none /mnt/fleet-server-secrets

在 MacOS 上,您可以组合使用 diskutilhdiutil 来创建 RAM 磁盘:

diskutil erasevolume HFS+ 'RAM Disk' `hdiutil attach -nobrowse -nomount ram://2097152`

Windows 系统不提供创建 RAM 磁盘的内置选项,但可以使用多个第三方程序。

示例编辑

下面是在 Linux 系统上配置服务令牌的分步指南:

sudo mkdir -p /mnt/fleet-server-secrets
sudo mount -o size=1G -t tmpfs none /mnt/fleet-server-secrets
echo -n MY-SERVICE-TOKEN > /mnt/fleet-server-secrets/service-token
sudo chown root:root /mnt/fleet-server-secrets/service-token
sudo chmod 0600 /mnt/fleet-server-secrets/service-token

-n 标志与 echo 一起使用,以防止在机密末尾附加换行符。请确保机密文件不包含尾随换行符。

容器中的机密编辑

当您在容器中直接使用机密文件而不使用 Kubernetes 或其他机密管理解决方案时,可以通过挂载文件或目录将文件传递到容器中。以与 文件系统上的机密 中相同的方式配置文件,并以只读模式挂载。例如,当使用 Docker 时。

如果您使用的是 Elastic Agent 镜像:

docker run \
	-v /path/to/creds:/creds:ro \
        -e FLEET_SERVER_CERT_KEY_PASSPHRASE=/creds/passphrase \
        -e FLEET_SERVER_SERVICE_TOKEN_PATH=/creds/service-token \
        --rm docker.elastic.co/beats/elastic-agent

Kubernetes 中的机密编辑

Kubernetes 有一个 机密管理引擎,可用于将机密文件配置到 Pod。

例如,您可以使用以下命令创建密码机密:

kubectl create secret generic fleet-server-key-passphrase \
  --from-literal=value=PASSPHRASE

并使用以下命令创建服务令牌机密:

kubectl create secret generic fleet-server-service-token \
  --from-literal=value=SERVICE-TOKEN

然后将其包含在 Pod 规范中,例如,当您在 Elastic Agent 下运行 Fleet Server 时:

spec:
  volumes:
  - name: key-passphrase
    secret:
      secretName: fleet-server-key-passphrase
  - name: service-token
    secret:
      secretName: fleet-server-service-token
  containers:
  - name: fleet-server
    image: docker.elastic.co/beats/elastic-agent
    volumeMounts:
    - name: key-passphrase
      mountPath: /var/secrets/passphrase
    - name: service-token
      mountPath: /var/secrets/service-token
    env:
    - name: FLEET_SERVER_CERT_KEY_PASSPHRASE
      value: /var/secrets/passphrase/value
    - name: FLEET_SERVER_SERVICE_TOKEN_PATH
      value: /var/secrets/service-token/value
Elastic Agent Kubernetes 机密提供程序编辑

当您在 Kubernetes 中的 Elastic Agent 下运行 Fleet Server 时,可以使用 Elastic Agent 的 Kubernetes 机密提供程序 将 Kubernetes 机密直接插入到 Fleet Server 的配置中。请注意,由于 Fleet Server 的引导方式,只有 APM 机密(API 密钥或机密令牌)可以使用此提供程序指定。