本文介绍如何通过阿里云堡垒机对 OpenClaw(AI Agent 运维工具)实施全生命周期安全管控,涵盖批量安装、远程运维、安全加固和批量卸载四个场景。
方案背景
OpenClaw 等开源 AI Agent 工具凭借自然语言驱动的任务自动化能力,正在成为运维效率提升的重要工具。但当此类高权限 Agent 直接运行在生产环境时,如果缺乏有效管控,会带来以下安全隐患:
安装部署失控:运维人员可能在未经审批的情况下,在多台服务器上私自安装 OpenClaw,导致资产清单缺失关键组件、版本混乱、安全策略无法统一管理。
操作过程不可审计:OpenClaw 将自然语言解析为 Shell 或 Python 命令后直接执行。如果没有中间审计层,一旦发生误操作或恶意调用,无法追溯是哪条自然语言指令触发了哪条危险命令。
凭证泄露风险:Agent 通常需要较高的系统权限或与数据库、云 API 交互。如果 Agent 直接持有长期有效的凭证且无统一出入口管控,一旦 Agent 被攻破,攻击者可利用其凭证在内网横向移动,造成数据泄露。
解决方案
本方案通过堡垒机实现 OpenClaw 从部署到卸载的全生命周期管控,在确保审计合规的前提下保障高效运维。主要覆盖以下场景:
批量安装:通过堡垒机统一下发部署脚本,批量完成 OpenClaw 安装和 Gateway 服务配置。
远程运维:建立基于堡垒机的零信任运维通道,所有操作通过受控会话执行,全程可审计。
批量加固:通过运维任务批量下发安全加固脚本,统一执行配置核查与漏洞修复。
批量卸载:一键触发清理流程,自动移除 Agent 组件及残留配置。
适用范围
已购买并启用企业双擎版堡垒机实例。具体操作,请参见快速购买并登录堡垒机和启用堡垒机。
已有可访问公网的云服务器 ECS,且能访问 OpenClaw 官网。
本文以安装了 Ubuntu 22.04 的阿里云 ECS 为例。
服务器推荐使用 Node 24(Node 22 LTS 22.16+ 也受支持)。执行
node --version检查 Node 版本。
步骤一:接入资产并为运维人员授权
登录堡垒机控制台,选择堡垒机所在的地域。
在实例列表页面,定位到目标实例,单击管理。
接入阿里云 ECS。具体操作,请参见步骤一:导入阿里云ECS并托管ECS账户。
添加运维人员。具体操作,请参见步骤二:新建堡垒机用户。
为堡垒机用户授权资产及资产账户。具体操作,请参见步骤三:为堡垒机用户授权资产及资产账户。
开启公网访问。在实例列表页面,定位目标实例,打开公网开关。
步骤二:批量运维 OpenClaw
场景一:批量安装 OpenClaw
通过堡垒机批量下发安装脚本,可以将逐台手动安装的繁琐操作简化为一次批量任务。管理员审核脚本后批准执行,既提升部署效率,又保障安全合规。以 Ubuntu 22.04 为例,以下步骤介绍如何通过堡垒机批量安装 OpenClaw。
堡垒机提供两种脚本类型,适用于不同场景:
对比维度 | 公共脚本 | 私有脚本 |
创建者 | 管理员 | 运维人员 |
可见范围 | 所有运维人员可见 | 仅当前运维人员可见 |
创建入口 | 堡垒机管理后台 > 资产管理 > 运维任务管理 > 公共脚本管理 | 运维门户 > 运维任务 > 脚本管理 |
脚本执行的审批机制 | 需要管理员审批 | 无需审批,可直接执行 |
创建运维脚本
根据脚本类型,选择以下方式之一创建运维脚本。两种方式的脚本内容相同,区别在于创建入口和审批流程。
方式一:管理员创建公共脚本
创建公共脚本后,所有运维人员均可选择该脚本创建运维任务。使用公共脚本的运维任务需管理员审批。具体操作,请参见新建公共运维脚本。
登录堡垒机控制台,选择堡垒机所在的地域。
定位到目标实例,单击管理。
在管理页面的左侧导航栏,选择。
单击公共脚本管理页签,单击新建运维脚本。
输入脚本名称,填写以下安装脚本内容,然后单击确定。
方式二:运维人员创建私有脚本
创建私有脚本后,仅当前运维人员可见。使用私有脚本的运维任务无需管理员审批。具体操作,请参见自动运维。
安装脚本内容
以下脚本适用于公共脚本和私有脚本,内容一致。脚本执行以下操作:安装 Node.js 24.x、安装 OpenClaw、配置 Gateway 服务并设为开机自动启动。
#!/bin/bash
set -euo pipefail
echo "Starting Node.js (v24.x) installation..."
# 1. 安装 Node.js 24.x
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo bash - && \
sudo apt install -y nodejs
echo "Node.js installation completed."
echo "Running OpenClaw installation script..."
# 2. 执行 OpenClaw 安装脚本(跳过交互和 post-install)
(
set +e
export CI=1
export OPENCLAW_SKIP_POST_INSTALL=1
curl -fsSL https://openclaw.ai/install.sh | bash
exit 0
)
echo "OpenClaw installation script finished."
# 3. 配置 OpenClaw 并安装 systemd 服务(以 root 用户身份)
echo "Configuring OpenClaw and installing systemd service..."
# 设置配置
openclaw config set gateway.mode local
if ! openclaw config get gateway.auth.token >/dev/null 2>&1; then
openclaw config set gateway.auth.token "$(openssl rand -hex 20)"
fi
# 创建 systemd 用户服务文件(root 用户)
mkdir -p /root/.config/systemd/user
cat > /root/.config/systemd/user/openclaw-gateway.service <<'EOF'
[Unit]
Description=OpenClaw Gateway
After=network.target
[Service]
Environment=HOME=/root
ExecStart=/usr/bin/openclaw gateway --port 18789
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=default.target
EOF
# 启用 linger,使 root 用户服务可在无登录时运行
sudo loginctl enable-linger root 2>/dev/null || true
# 重新加载用户级 systemd 配置并启动服务
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway
# 显式重启 + 端口监听检查
echo "Restarting OpenClaw service to apply configuration..."
systemctl --user restart openclaw-gateway
echo "Checking if port 18789 is being listened on..."
# 等待最多 10 秒让服务启动
for i in {1..10}; do
if ss -tuln | grep -q ':18789\s'; then
echo "Successfully listening on port 18789!"
break
fi
sleep 1
done
# 最终验证
if ! ss -tuln | grep -q ':18789\s'; then
echo "Error: OpenClaw is not listening on port 18789!"
echo "Please check the logs:"
journalctl --user -u openclaw-gateway -n 50 --no-pager
exit 1
fi
# 安装后状态检查
echo "Checking OpenClaw installation status..."
# 1. 检查命令是否存在并获取版本
if command -v openclaw &> /dev/null; then
echo "openclaw command found."
echo "Version info:"
openclaw --version
else
echo "openclaw command not found, please verify the installation."
exit 1
fi
echo ""
# 2. 显示可执行文件路径
echo "Installation path:"
which openclaw
echo ""
# 3. 获取并显示 Token
TOKEN=$(openclaw config get gateway.auth.token 2>/dev/null || echo "<unable to read>")
echo "Access Token: $TOKEN"
echo ""
# 4. 检查服务状态
if systemctl --user is-active --quiet openclaw-gateway; then
echo "openclaw-gateway service is running."
elif systemctl --user is-enabled --quiet openclaw-gateway 2>/dev/null; then
echo "openclaw-gateway service is enabled but not running."
else
echo "openclaw-gateway service is not enabled or does not exist."
fi
echo ""
echo "Detailed service status:"
systemctl --user status openclaw-gateway --no-pager
echo ""
echo "Listening page (SSH tunnel required): http://localhost:18789/__openclaw__/canvas/"
echo ""
echo "OpenClaw installation, configuration, and verification completed!"创建运维任务
运维人员访问公网运维门户地址,登录运维门户。登录运维门户的详情,请参见登录运维门户。
选择运维任务,单击新建运维任务。
配置以下信息:
任务信息:填写任务名称,选择执行方式为手动执行,脚本内容设置为指定运维脚本,并选择前面步骤创建的公共脚本或私有脚本。
关联主机账户:选择已添加的主机账户。
单击新建运维任务。任务创建完成后,运维任务列表显示该任务的状态为待审批。
审批运维任务
使用公共脚本的运维任务需管理员审批后才可执行。使用私有脚本的运维任务无需审批,可直接执行。管理员审批运维任务的详情,请参见审批运维任务。
管理员登录堡垒机控制台,选择堡垒机所在的地域。
定位到目标实例,单击管理。
在管理页面的左侧导航栏,选择。
单击任务审批页签,定位到待审批的任务,单击允许。
执行运维任务
运维人员进入运维门户,单击运维任务。
选择目标任务记录,单击开始。任务状态变为执行中。
当状态变为执行完成后,单击操作 > 查看执行结果。定位目标记录,单击查看输出结果,即可查看每台主机的执行日志。
说明安装时长受网络环境影响。例如,在中国内地安装可能需要约 30 分钟。
获取 OpenClaw UI 访问地址
运维人员进入运维门户,单击主机。
定位目标主机,单击远程连接下的主机用户名,进入主机终端。
执行以下命令,获取 Token 等信息以登录 OpenClaw UI。
openclaw dashboard命令输出包含以下内容:
Dashboard URL: http://127.0.0.1:18789/#token=3703e******e8a75访问 OpenClaw UI。
进入云服务器ECS实例页面,选择目标 ECS 实例所在地域,单击目标实例名称,进入实例详情页。
在安全组页签下的安全组列表,定位目标安全组,单击安全组 ID,在安全组详情的入方向下,新增一条规则:
授权策略:允许
协议:自定义 TCP
访问来源:0.0.0.0/0
访问目的:18789
进入本地电脑终端,执行:
ssh -N -L 18789:127.0.0.1:18789 root@<ECS 公网IP>,建立SSH隧道。进入云服务器ECS实例页面,定位目标 ECS 实例,在IP 地址列的即可查看公网IP。
复制
Dashboard URL后的地址,并将127.0.0.1替换为ECS 公网IP,在本机通过浏览器访问,即可进入 OpenClaw UI。警告ECS 的安全组需临时开放 18789 端口入方向访问。完成 OpenClaw 设置后,请立即关闭该端口,以降低安全风险。
场景二:远程运维 OpenClaw
通过堡垒机建立安全运维通道,所有 SSH 连接请求强制经由堡垒机进行身份鉴别和统一代理。该机制实现了运维权限集中管控和细粒度授权,同时对全量操作指令、会话录像及文件传输行为进行实时记录和审计留存,从访问入口到操作执行形成完整的安全闭环。
运维人员进入运维门户,单击主机。
定位目标主机,单击远程连接下的主机用户名,进入主机终端。
根据需要执行运维命令。常见操作示例:
查看 OpenClaw 运行状态:
systemctl --user status openclaw-gateway查看已安装的技能列表:
openclaw skills list进入自然语言交互界面:
openclaw tui
所有操作均通过堡垒机全程会话审计,可追溯。
场景三:批量安全加固
OpenClaw 的安全加固涉及多个步骤,手动逐台操作效率低且容易遗漏。通过堡垒机批量下发加固脚本,可以快速覆盖所有目标节点,同时执行安全风险扫描。
创建私有脚本
运维人员访问公网运维门户地址,登录运维门户。登录运维门户的详情,请参见登录运维门户。
说明获取公网运维门户地址:管理员进入堡垒机实例列表页面,选择目标地域,定位到目标实例,单击管理。概览页面右侧的堡垒机实例信息区域即可获取公网运维门户地址。
选择运维任务,切换至脚本管理页签,单击新建运维脚本。
输入脚本名称,填写以下加固脚本内容,然后单击确定。
说明脚本执行以下操作:运行安全审计修复、设置配置文件和状态目录权限、执行深度安全审计。
#!/bin/bash # OpenClaw 宿主机安全加固脚本 # 功能: # 1. 执行 openclaw security audit --fix 修复安全问题 # 2. 设置配置文件和状态目录权限 # 3. 执行深度安全审计 set -e # 遇到错误时立即退出 # 颜色定义(用于美化输出) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" >&2 } # 检查 openclaw 是否已安装 check_openclaw_installed() { if ! command -v openclaw &> /dev/null; then log_error "openclaw command not found, please install OpenClaw first" exit 1 fi log_info "OpenClaw is installed" } # 获取 OpenClaw 配置目录路径 get_openclaw_config_dir() { if [ -n "$OPENCLAW_CONFIG_DIR" ]; then echo "$OPENCLAW_CONFIG_DIR" else echo "$HOME/.openclaw" fi } # 主函数 main() { log_info "Starting OpenClaw host security hardening..." # 检查 OpenClaw 是否已安装 check_openclaw_installed # 获取配置目录路径 CONFIG_DIR=$(get_openclaw_config_dir) CONFIG_FILE="$CONFIG_DIR/openclaw.json" log_info "Config directory: $CONFIG_DIR" log_info "Config file: $CONFIG_FILE" # 步骤1: 执行安全审计修复 log_info "Step 1: Running openclaw security audit --fix for security remediation..." if openclaw security audit --fix; then log_success "Security remediation completed" else log_warning "Warnings encountered during security remediation, continuing with next steps" fi # 步骤2: 设置配置文件和状态目录权限 log_info "Step 2: Setting config file and state directory permissions..." if [ ! -d "$CONFIG_DIR" ]; then log_warning "Config directory $CONFIG_DIR does not exist, creating..." mkdir -p "$CONFIG_DIR" fi chmod 700 "$CONFIG_DIR" log_success "Directory permissions set: chmod 700 $CONFIG_DIR" if [ -f "$CONFIG_FILE" ]; then chmod 600 "$CONFIG_FILE" log_success "Config file permissions set: chmod 600 $CONFIG_FILE" else log_warning "Config file $CONFIG_FILE does not exist, skipping permission setup" fi # 步骤3: 执行深度安全审计(关键步骤) log_info "Step 3: Running openclaw security audit --deep for deep security audit..." # 捕获深度审计输出(即使命令失败也保留输出) DEEP_AUDIT_OUTPUT="" if ! DEEP_AUDIT_OUTPUT=$(openclaw security audit --deep 2>&1); then DEEP_AUDIT_EXIT_CODE=$? log_warning "Deep security audit command failed (exit code: $DEEP_AUDIT_EXIT_CODE), but output has been captured" else log_success "Deep security audit completed successfully" fi # === 脚本结尾:重点突出深度审计结果 === echo "" echo -e "${YELLOW}========================================${NC}" echo -e "${YELLOW} OpenClaw Deep Security Audit Results ${NC}" echo -e "${YELLOW}========================================${NC}" if [ -n "$DEEP_AUDIT_OUTPUT" ]; then echo "$DEEP_AUDIT_OUTPUT" else echo -e "${RED}(No output)${NC}" fi echo -e "${YELLOW}========================================${NC}" echo "" log_success "OpenClaw host security hardening completed! Please review the deep audit results above." } # 脚本入口点 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi
创建运维任务
执行运维任务
运维人员进入运维门户,单击运维任务。
选择目标任务记录,单击开始。任务状态变为执行中。
当状态变为执行完成后,单击操作 > 查看执行结果。定位目标记录,单击查看输出结果,即可查看每台主机的加固日志。
场景四:批量卸载
在资源回收或版本迭代时,通过堡垒机批量下发卸载脚本,自动移除 Agent 组件及残留配置,确保所有节点的卸载操作一致且可追溯。
创建私有脚本
运维人员访问公网运维门户地址,登录运维门户。登录运维门户的详情,请参见登录运维门户。
说明获取公网运维门户地址:管理员进入堡垒机实例列表页面,选择目标地域,定位到目标实例,单击管理。概览页面右侧的堡垒机实例信息区域即可获取公网运维门户地址。
选择运维任务,切换至脚本管理页签,单击新建运维脚本。
输入脚本名称,填写以下卸载脚本内容,然后单击确定。
说明脚本执行以下操作:停止并移除 systemd 服务、清理 npm 全局包和 CLI 文件、删除配置和缓存目录、清理 shell 配置,并自动验证卸载结果。
#!/bin/bash # 彻底卸载 OpenClaw 并立即验证清理结果 set -e echo "Starting to uninstall OpenClaw..." # 1. 停止并清理 systemd user 服务(关键顺序) echo "Stopping and removing Gateway service..." systemctl --user stop openclaw-gateway 2>/dev/null || true systemctl --user disable openclaw-gateway 2>/dev/null || true rm -f ~/.config/systemd/user/openclaw-gateway.service # 确保 systemd 用户实例重载(必须在删除文件后) systemctl --user daemon-reload 2>/dev/null || true # 强制重置 systemd 用户状态(解决缓存残留) if command -v systemctl >/dev/null 2>&1; then sleep 1 systemctl --user reset-failed 2>/dev/null || true fi # 2. 获取 npm 全局 node_modules 路径 NPM_GLOBAL_DIR="" if command -v npm >/dev/null 2>&1; then NPM_GLOBAL_DIR=$(npm root -g 2>/dev/null || echo "") fi [ -z "$NPM_GLOBAL_DIR" ] && NPM_GLOBAL_DIR="/usr/lib/node_modules" # 3. 强制删除 npm 全局包 echo "Force cleaning npm global packages..." if [ -d "$NPM_GLOBAL_DIR/openclaw-cli" ]; then rm -rf "$NPM_GLOBAL_DIR/openclaw-cli" echo " Removed $NPM_GLOBAL_DIR/openclaw-cli" fi if [ -d "$NPM_GLOBAL_DIR/openclaw" ]; then rm -rf "$NPM_GLOBAL_DIR/openclaw" echo " Removed $NPM_GLOBAL_DIR/openclaw (legacy name)" fi # 4. 删除 CLI 可执行文件 echo "Cleaning CLI executables..." rm -f /usr/local/bin/openclaw /usr/bin/openclaw /bin/openclaw # 5. 删除配置、缓存、编译缓存 echo "Cleaning config and cache..." rm -rf ~/.openclaw ~/.cache/openclaw /var/tmp/openclaw-compile-cache # 6. 清理 lingering if command -v loginctl >/dev/null 2>&1; then if loginctl show-user "$USER" 2>/dev/null | grep -q "Linger=yes"; then echo "Disabling lingering..." loginctl disable-linger "$USER" 2>/dev/null || true fi fi # 7. 清理 shell 配置 echo "Cleaning shell configuration..." for rc in ~/.bashrc ~/.zshrc ~/.profile /etc/profile; do if [ -f "$rc" ]; then cp "$rc" "$rc.bak-openclaw" 2>/dev/null || true sed -i.bak -E '/(openclaw|NODE_COMPILE_CACHE|OPENCLAW_NO_RESPAWN)/d' "$rc" 2>/dev/null || true fi done echo "" echo "OpenClaw uninstall complete, verifying cleanup..." # 自动验证清理结果 CLEAN=true # 1. 检查 CLI 命令是否存在 if command -v openclaw &> /dev/null; then echo "[LEFTOVER] 'openclaw' command still exists" CLEAN=false else echo "CLI command removed" fi # 2. 检查 npm 全局包 if command -v npm >/dev/null 2>&1; then if npm list -g --depth=0 2>/dev/null | grep -q "openclaw"; then echo "[LEFTOVER] openclaw package still exists in npm" CLEAN=false else echo "npm package uninstalled" fi else echo "npm not available, skipping npm package check" fi # 3. 检查配置目录 if [ -d "$HOME/.openclaw" ]; then echo "[LEFTOVER] Config directory ~/.openclaw still exists" CLEAN=false else echo "Config directory cleaned" fi # 4. 检查缓存目录 if [ -d "$HOME/.cache/openclaw" ]; then echo "[LEFTOVER] Cache directory ~/.cache/openclaw still exists" CLEAN=false else echo "Cache directory cleaned" fi # 5. 检查 systemd user 服务 if systemctl --user list-units --full 2>/dev/null | grep -q "openclaw"; then echo "[LEFTOVER] systemd user service still exists" CLEAN=false else echo "systemd user service cleaned" fi # 6. 检查进程 if pgrep -f "openclaw" > /dev/null 2>&1; then echo "[LEFTOVER] OpenClaw process still running" CLEAN=false else echo "No OpenClaw process running" fi # 最终结果 echo "" if [ "$CLEAN" = true ]; then echo "Verification passed! OpenClaw has been completely removed." exit 0 else echo "Warning: leftovers detected, please clean up manually." exit 1 fi
创建运维任务
执行运维任务
运维人员进入运维门户,单击运维任务。
选择目标任务记录,单击开始。任务状态变为执行中。
当状态变为执行完成后,单击操作 > 查看执行结果。定位目标记录,单击查看输出结果,即可查看每台主机的卸载日志。
应用于生产环境
将上述方案部署到生产环境时,建议从以下维度加强安全管控:
网络策略:仅允许堡垒机出口 IP 访问受管控服务器,阻断其他来源的直连访问。
访问策略:将受管控节点接入堡垒机,并授权给对应的运维人员,实现权限最小化。
运维策略:对敏感资产启用运维二次审批、命令审批、命令黑白名单等策略,进一步收敛操作风险。
附录:OpenClaw 相关命令示例
更多命令请参考 OpenClaw 官方文档。
命令 | 功能描述 | 备注 | 风险等级 |
| 启动浏览器自动化实例 | 开启自动化环境 | 高 |
| 管理定时任务 | 自动化执行特定指令 | 高 |
| 模拟点击网页元素 | 自动填写表单、点击按钮 | 高 |
| 清空所有状态数据 | 重置全部配置 | 高 |
| 让浏览器打开指定 URL |
| 中 |
| 从官方市场安装技能/插件 | 官方技能市场 | 中 |
| 启用指定插件 | 需指定插件名称 | 中 |
| 重建向量索引 | 修复 AI 记忆逻辑问题时使用 | 中 |
| 列出已安装的技能 | 查看 Agent 能力列表 | 低 |
| 搜索长期记忆内容 | 基于向量检索 | 低 |
| 自然语言交互入口 | 终端交互界面 | 低 |