秘密文件指南
编辑秘密文件指南
编辑本指南提供逐步示例以及关于如何在主机上或通过 Kubernetes 密钥引擎直接部署秘密文件的最佳实践。
文件系统上的密钥
编辑秘密文件可以作为纯文本文件直接在文件系统上配置,并通过 Elastic Agent 进行引用或传递。
我们推荐以下步骤来提高安全性。
文件权限
编辑文件权限不应允许全局读取权限。
在 MacOS 和 Linux 上,您可以分别使用 chown
和 chmod
命令设置文件所有权和文件权限。Fleet 服务器在 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
临时文件系统
编辑您可以使用临时文件系统(内存中)来保存秘密文件以提高安全性。这些类型的文件系统通常不包含在备份中,并且如果主机重置则会被清除。如果使用,则需要在每次重置时重新配置文件系统和秘密文件。
在 Linux 上,您可以使用 mount
命令和 tmpfs
文件系统在内存中创建一个临时文件系统。
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
echo
命令中的 -n
标志用于防止在密钥末尾附加换行符。确保秘密文件不包含尾随换行符。
容器中的密钥
编辑当您直接在容器中使用秘密文件而不使用 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 服务器时。
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 服务器时,您可以使用 Elastic Agent 的Kubernetes 密钥提供程序将 Kubernetes 密钥直接插入 Fleet 服务器的配置中。请注意,由于 Fleet 服务器的引导方式,只有 APM 密钥(API 密钥或秘密令牌)可以使用此提供程序指定。