作者:来自 Elastic Pete Ward

从手动下载到自动化 artifact 管理。
问题:当 "只需下载" 不是选项时
想象这种场景:你需要在敏感/机密网络、关键基础设施或具有严格网络隔离策略的金融系统中部署 Elastic Agents。网络被严格锁定 ------ 没有互联网访问,没有外部下载,更不能访问 artifacts.elastic.co ------ 但 Elastic Agent 需要更新,或者 Endpoint 安全需要最新的威胁检测 artifacts。
这就是许多组织的现实:它们需要 Elastic 强大的基于 agent 的可观测性和安全功能,但运行在隔离或受限环境中。本该是一个简单的 agent 部署,却变成了手动 artifact 下载、U 盘传输和在每个 Elastic 发布中重复的繁琐流程的后勤噩梦。
在支持企业 Elastic Agent 部署时,我作为一名高级 Elastic 工程师多次遇到这种挑战。我不得不反复手动查找 URL 并下载 agent 二进制文件、Endpoint artifacts 和安全签名,为不同的客户站点重复这一过程。每次新的 Elastic 发布都意味着数小时的手工劳动,而且这个过程容易出错。
解决方案:自动化 artifact 管理
与其接受这种现状,我构建了一个解决方案,把数小时的手工操作转变为一个命令。artifacts-bundler 工具自动化整个下载、打包和为离线环境提供 Elastic Stack 组件的过程。
它的实际作用
该工具解决了我在现场遇到的三大核心挑战:
-
批量下载 :自动从 artifacts.elastic.co 和 artifacts.security.elastic.co 获取 Elastic Agent 二进制文件、Beats、APM server、Fleet Server 和关键的 Endpoint 安全 artifacts。
-
智能打包:创建带有时间戳和版本的 bundle,并包含清单文件以便可追溯和验证。
-
本地分发:可选构建一个自包含的 NGINX 容器,作为内部 artifact 镜像源。
技术架构
智能下载
我构建它来智能使用 Elastic 的官方 API:
-
从 artifacts.elastic.co 和 artifacts.security.elastic.co 查询当前 artifact 清单
-
在可用时验证校验和和签名
-
创建详细的清单文件,记录下载了什么以及何时下载
-
支持使用 --update 标志进行增量更新,避免重复下载已有文件
灵活的部署选项
我设计的 NGINX 容器方式带来以下优势:
-
自成一体:无需外部依赖或复杂的服务器设置
-
可移植:可在 Docker、Podman、containerd 等不同容器平台上一致运行
-
可扩展:可以在 Kubernetes 中通过水平扩展进行部署
-
安全:支持使用自定义证书的 SSL/TLS 终止
版本管理
该工具能同时处理多个 Elastic 版本,这对需要以下场景的环境来说至关重要:
-
支持跨不同系统的渐进式发布
-
为测试和生产维护多个版本
-
在需要时快速回滚到先前版本
真实场景演练:从零到运行
让我带你完整走一遍使用 artifacts-bundler 搭建离线 Elastic Agent artifact 服务器的过程 ------ 这就是我在客户部署中使用的相同工作流。
步骤 1:初始设置
从一个可以访问互联网的系统开始(你的构建/预发布环境):
克隆仓库
bash
`
1. git clone https://github.com/pkward/artifacts-bundler.git
2. cd artifacts-bundler
`AI写代码
安装前置条件(RHEL/CentOS 示例)
go
`sudo dnf install -y curl tar jq gzip docker|podman`AI写代码
步骤 2:选择你的部署策略
artifacts-bundler 支持我为不同环境设计的两种不同部署方式:
选项 A:适用于裸机/传统服务器的打包方式
typescript
``1. ./scripts/download-artifacts.sh \
2. --versions 8.18.5,9.1.2 \
3. --bundle
5. This creates a timestamped tarball (`elastic-artifacts-bundle-20250813-154323.tar.gz`) that you can extract and serve with any web server.``AI写代码
选项 B:自包含容器镜像
markdown
``
1. ./scripts/download-artifacts.sh \
2. --versions 8.18.5,9.1.2 \
3. --build-nginx-image
5. This builds a ready-to-deploy NGINX Docker image (`elastic-artifacts-nginx:latest`) with artifacts preloaded.
``AI写代码
这两个命令都会触发我自动化的相同全面下载流程:
-
Linux、Windows 和 macOS 的 Elastic Agent 二进制文件
-
安全 endpoint artifacts,包括检测签名和行为模型
-
指定版本的 APM server 和 Fleet Server
-
记录下载内容和时间的清单文件
步骤 3:传输到隔离环境
方法取决于你选择的部署策略:
对于裸机部署(打包选项)
将 bundle 传输到目标服务器
bash
`scp elastic-artifacts-bundle-20250813-154323.tar.gz target-server:/tmp/`AI写代码
替代方案:复制到已挂载的 USB 驱动器进行物理传输
首先挂载 USB 驱动器:sudo mount /dev/sdb1 /mnt/usb
bash
`cp elastic-artifacts-bundle-20250813-154323.tar.gz /mnt/usb/`AI写代码
对于容器部署
保存容器镜像(在传输前在构建环境中执行):
go
`docker|podman save elastic-artifacts-nginx:latest | gzip > elastic-artifacts-nginx.tar.gz`AI写代码
传输到目标服务器
bash
`scp elastic-artifacts-ningx.tar.gz target-server:/tmp/`AI写代码
替代方案:复制到已挂载的 USB 驱动器进行物理传输
首先挂载 USB 驱动器:sudo mount /dev/sdb1 /mnt/usb
bash
`cp elastic-artifacts-nginx.tar.gz /mnt/usb/`AI写代码
这种方法的优势在传输阶段尤为明显。你不再需要管理几十个单独文件(我以前都是手动操作),而是拥有一个单一的自包含包,无论是通过网络还是通过 USB 等物理介质,都可以在环境间移动。
步骤 4:部署你的 artifact 服务器
部署选项 A:裸机 NGINX 服务器
对于传统服务器环境,解压并使用 NGINX 提供 bundle 服务:
bash
`
1. # In the air-gapped environment, extract to web directory
2. sudo mkdir -p /var/www/elastic-artifacts
3. cd /var/www/elastic-artifacts
4. sudo tar -xzf /tmp/elastic-artifacts-bundle-20250813-154323.tar.gz
6. # Set proper ownership and permissions (check NGINX user first)
7. # Check which user NGINX runs as: ps aux | grep nginx
8. sudo chown -R nginx:nginx /var/www/elastic-artifacts
9. # Use www-data:www-data on Ubuntu/Debian
10. sudo chmod -R 755 /var/www/elastic-artifacts
12. # Configure SELinux context for NGINX to serve static files
13. sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/elastic-artifacts(/.*)?"
14. sudo restorecon -Rv /var/www/elastic-artifacts
16. # Verify SELinux labels are correct
17. sudo ls -laZ /var/www/elastic-artifacts/
18. # Expected output should show: unconfined_u:object_r:httpd_sys_content_t:s0
`AI写代码
安装并配置 NGINX:
ini
`
1. # Install NGINX (RHEL/CentOS example)
2. sudo dnf install -y nginx
4. # Create NGINX configuration
5. sudo tee /etc/nginx/conf.d/elastic-artifacts.conf << 'EOF'
6. server {
7. listen 80;
8. server_name elastic-artifacts.local;
10. root /var/www/elastic-artifacts;
11. index index.html;
13. # Enable ETags globally - REQUIRED for Elastic Endpoint artifact updates
14. etag on;
16. location /downloads/ {
17. alias /var/www/elastic-artifacts/;
18. autoindex on;
19. autoindex_exact_size off;
20. autoindex_localtime on;
22. # Enable CORS for cross-origin requests
23. add_header Access-Control-Allow-Origin *;
24. add_header Access-Control-Allow-Methods "GET, OPTIONS";
25. add_header Access-Control-Allow-Headers "Origin, Content-Type, Accept";
27. # Ensure ETags are sent for all files (critical for Endpoint)
28. add_header Cache-Control "public, must-revalidate";
30. # Set appropriate MIME types
31. location ~* \.(tar\.gz|tgz)$ {
32. add_header Content-Type application/gzip;
33. }
35. location ~* \.zip$ {
36. add_header Content-Type application/zip;
37. }
38. }
40. # Optional: Create a simple index page
41. location = / {
42. return 301 /downloads/;
43. }
44. }
45. EOF
47. # Enable and start NGINX
48. sudo systemctl enable nginx
49. sudo systemctl start nginx
51. # Configure firewall (if needed)
52. sudo firewall-cmd --permanent --add-service=http
53. sudo firewall-cmd --reload
`AI写代码
你的 artifact 服务器现在可通过 http://your-server/downloads/ 访问,支持可浏览的目录列表和适用于 Elastic Endpoint artifact 更新检测的 ETag。
重要注意事项:ETag 头配置对 Elastic Endpoint 功能是必需的。没有 ETag,Elastic Endpoint 无法判断全局 artifacts 是否已更新,也不会在新版本可用时下载。
验证 ETag 配置 :
测试 ETag 是否正常工作:
arduino
`curl -I http://your-server/downloads/endpoint/manifest/artifacts-8.18.5.zip`AI写代码
应显示:ETag: "十六进制值"

部署选项 B:容器部署
对于容器化环境,使用预构建镜像:
arduino
`
1. # In the air-gapped environment, load and run the pre-built image
3. docker|podman load < /tmp/elastic-artifacts-nginx.tar.gz
4. docker|podman run -d -p 80:80 elastic-artifacts-nginx:latest
`AI写代码
部署选项 C:Kubernetes 部署
bash
`
1. # Deploy using the included manifests
2. kubectl apply -f k8s/nginx-deploy.yaml
3. kubectl apply -f k8s/nginx-nodeport.yaml
`AI写代码
步骤 5:配置 Elastic Stack 使用本地镜像
这就是该解决方案的价值所在。每个组件不再尝试访问外部服务器,而是全部指向你的本地镜像。
Fleet 配置
在 Kibana 中,导航到 Fleet > Settings 并配置 Agent Binary Download URL:
Fleet 设置显示"Edit agent binary source"对话框,在此配置内部 artifact 服务器的 URL
关键是将 Host 字段设置为指向你的本地 artifact 服务器(例如:http://10.0.0.33/downloads/)。这告诉 Fleet 在所有 agent 安装和更新时从哪里下载 Elastic Agent 二进制文件。
Agent 安装命令会自动使用你配置的 artifact 服务器,在 curl 命令中显示自定义下载 URL
从此时起,所有 Elastic Agent 部署、更新和策略更改都会从你的本地服务器获取二进制文件,而不是从互联网获取。
Endpoint 安全配置
对于 Elastic Defend(Endpoint 安全),在 Endpoint 策略中配置全局 artifact 下载源,路径为 Security > Endpoint > Policies > [Your Defend Policy ] > Edit > Advanced Settings。
为每个平台配置全局 artifact 下载源:
Windows 高级 artifacts 全局基础 URL 配置
macOS 高级 artifacts 全局基础 URL 配置
Linux 高级 artifacts 全局基础 URL 配置
将每个平台设置为指向你的本地镜像 URL,例如 http://10.0.0.33
。这确保安全签名更新、行为模型和其他关键 Endpoint 组件从本地提供。
配置完成后,你可以验证 agent 是否成功使用你的本地 artifact 服务器:


Agent 概览显示成功从本地服务器下载的 artifacts,包括全局 artifacts 和诊断配置。
生产环境注意事项
根据我在不同环境中部署的经验,以下是关键注意事项:
存储需求
存储需求随支持的版本和平台数量而增长。典型的 bundle(包含两个 Elastic 版本、三个平台 Linux、Windows、macOS 以及 endpoint 安全文件)大约 2GB--3GB。多版本部署时请相应规划。
更新工作流程
建议为组件 bundle 的更新建立定期流程:
-
预发布:在联网环境中下载并测试新版本。
-
验证:验证文件完整性和兼容性。
-
传输:将验证后的包移动到生产环境。
-
部署:使用新内容更新你的 artifact 服务器。
安全注意事项
虽然该工具简化了 artifact 管理,但仍应保持安全最佳实践:
-
尽可能验证 artifact 校验和(checksum)
-
在生产环境中使用 HTTPS 分发 artifacts
-
对 artifact 服务器实施访问控制
-
监控下载日志,检测异常活动
超越工具:社区影响
artifacts-bundler 不仅是一个技术解决方案,它还展示了我们 Elastic 社区如何识别现实挑战并构建实用解决方案。我已将该工具以 MIT 许可证发布在 GitHub 上,以鼓励面临类似挑战的组织采用和扩展它。
该工具已在不同领域证明了其价值,例如:
-
为机密网络和安全设施准备部署介质的政府机构
-
在监控医疗设备网络和患者数据系统的同时保持 HIPAA 合规的医疗系统
-
以安全优先于连接性的关键基础设施,包括电网、水处理设施和交通系统
展望
虽然我最初为内部测试和 Kubernetes 部署构建了该工具,但 artifacts-bundler 解决了 Elastic 生态系统中普遍存在的挑战。随着隔离和边缘部署变得更加常见,这类工具弥合了 Elastic 云原生架构与受限环境实际情况之间的差距。
我会根据社区反馈和实际使用不断改进该工具,最近的更新包括对多容器运行时的支持和增强的 SSL 配置选项。
对于在受限环境中运行的组织,artifacts-bundler 证明了隔离环境不必意味着困难;有时,它只是需要以不同的方式思考问题。
快速入门
artifacts-bundler 在 GitHub 上提供,包含完整文档、使用示例和 Kubernetes 部署清单。
对于考虑隔离 Elastic 部署的组织,该工具消除了流程中最耗时的部分。曾经需要数小时手动操作和仔细记录的工作,现在只需一个命令即可完成。
正如我喜欢说的:目标是将重复且易出错的手工流程变成可靠且可重复的操作。当你处理生产安全系统时,你希望将时间花在配置和优化上,而不是追逐下载 URL。
原文:How to deploy Elastic Agents in air-gapped environments | Elastic Blog