密钥文件指南
编辑密钥文件指南
编辑本指南提供逐步示例和最佳实践,介绍如何直接在主机上或通过 Kubernetes 密钥引擎部署密钥文件。
文件系统上的密钥
编辑密钥文件可以作为纯文本文件直接在文件系统上进行配置,并通过 Elastic Agent 引用或传递。
我们建议采取以下步骤来提高安全性。
文件权限
编辑文件权限不应允许全局读取权限。
在 MacOS 和 Linux 上,可以使用 chown
和 chmod
命令分别设置文件所有权和文件权限。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 上,可以使用 mount
和 tmpfs
文件系统在 RAM 中创建临时文件系统
mount -o size=1G -t tmpfs none /mnt/fleet-server-secrets
在 MacOS 上,可以使用 diskutil
和 hdiutil
的组合来创建 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 密钥或密钥令牌)才能使用此提供程序指定。