密钥文件指南

编辑

本指南提供逐步示例和最佳实践,介绍如何直接在主机上或通过 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/elastic-agent/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/elastic-agent/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 密钥或密钥令牌)才能使用此提供程序指定。