领导给了一周,我前三天全耗在这个报错上:
无法连接到 activation.xxx.com
请检查网络连接后重试
2024年5月,我用的蓝印RPA物理隔离内网部,处理核心业务数据,要求"数据不出本机,流程不外传,审计能溯源"。
第一坑:假离线激活
某工具宣传"支持本地部署",安装后首次启动弹出连接license服务器窗口。内网直接报错。
翻文档找"离线激活",需要三步:联网机器生成请求文件→传外网换激活文件→传回内网导入。本质上还是依赖外网,只是换了种形式。
真正离线的工具:安装包内置激活模块,输入license密钥后本地校验通过,全程零外网。后来找到的那款,安装完断网状态直接激活,没有任何弹窗。
第二坑:流程文件默认云同步
某工具保存流程后抓包发现,有流量往sync.xxx.com走。
排查:设置->高级->数据管理->同步偏好,buried在三层菜单里,默认开启。关掉后重启软件,同步选项又自动打开。
解决:防火墙阻断该域名,观察三天确认无异常流量。同时修改默认保存路径到加密磁盘。
第三坑:组件运行时拉取资源
设计流程时用了某"智能识别"组件,本机测试正常。搬到内网后报错:
无法下载模型文件 ocr_model_v3.dat
请检查网络连接或联系管理员
原来组件首次使用时要联网下载AI模型,本地无缓存。内网环境下直接卡死。
解决:联网环境预装所有组件,找到缓存目录(C:\ProgramData\XXX\Components\),整体打包搬进内网。或者弃用"云增强"组件,改用基于本地Windows API的传统识别方案。
部署架构
┌─────────────────────────────────────────┐
│ 内网终端 / 服务器 │
│ │
│ ┌─────────────┐ ┌───────────────┐ │
│ │ RPA主程序 │←──→│ 本地流程仓库 │ │
│ │ (离线激活) │ │ (加密磁盘路径) │ │
│ └──────┬──────┘ └───────────────┘ │
│ │ │
│ ┌──────┴──────┐ ┌───────────────┐ │
│ │ Python 3.10 │←──→│ 本地组件库 │ │
│ │ (Anaconda离线)│ │ (预装完整包) │ │
│ └──────┬──────┘ └───────────────┘ │
│ │ │
│ ┌──────┴──────┐ ┌───────────────┐ │
│ │ 输入数据源 │ │ 输出/日志留存 │ │
│ │ (本地Excel │───→│ (本地目录结构) │ │
│ │ /数据库直连)│ │ (按日期归档) │ │
│ └─────────────┘ └───────────────┘ │
│ │
│ [防火墙规则:阻断所有外网出站连接] │
└─────────────────────────────────────────┘
关键配置与代码
1. 流程打包EXE
实际工具中通过GUI配置,审计时需提供参数清单。Python调用示例:
# 调用打包API生成独立EXE
from rpa_sdk import Packager
pkg = Packager()
pkg.set_source(r"D:\Flows\Auto_Reconcile.flow")
pkg.set_output(r"D:\Deploy\Auto_Reconcile.exe")
# 加密与授权配置
pkg.set_encryption(
password="user_defined", # 自定义密码
machine_bind=True, # 绑定设备
expire_date="2025-12-31" # 有效期
)
# 运行时约束
pkg.set_runtime(
network_required=False, # 运行时无需联网
local_logs=True, # 日志本地留存
screenshot_local_only=True # 截图仅本地
)
# 打包:生成绿色EXE,对方无需安装运行环境
pkg.build()
打包后的Auto_Reconcile.exe可在未安装RPA环境的机器上直接运行,双击即执行。
2. 日志本地化管理
import os
import shutil
from datetime import datetime, timedelta
LOG_BASE = r"D:\RPA_Logs"
RETENTION_DAYS = 30
def get_log_dir(flow_name):
today = datetime.now().strftime("%Y%m%d")
log_dir = os.path.join(LOG_BASE, flow_name, today)
os.makedirs(log_dir, exist_ok=True)
return log_dir
def cleanup_logs():
cutoff = datetime.now() - timedelta(days=RETENTION_DAYS)
for flow in os.listdir(LOG_BASE):
flow_path = os.path.join(LOG_BASE, flow)
if not os.path.isdir(flow_path):
continue
for date_dir in os.listdir(flow_path):
try:
dir_date = datetime.strptime(date_dir, "%Y%m%d")
if dir_date < cutoff:
shutil.rmtree(os.path.join(flow_path, date_dir))
except ValueError:
continue
# 流程中调用
current_log = get_log_dir("Auto_Reconcile")
# 所有日志、截图写入 current_log
# 流程结束后执行 cleanup_logs()
3. Python环境离线化
联网机器准备:
conda create -n rpa_env python=3.10 pandas openpyxl sqlalchemy cx_Oracle pywin32
conda pack -n rpa_env -o rpa_env.tar.gz
内网解压后,RPA配置解释器路径:D:\Anaconda\envs\rpa_env\python.exe
额外踩坑:Oracle客户端版本。内网预装Oracle 11g客户端,但cx_Oracle需对应版本DLL。报错ORA-12154时,不是代码问题,是PATH环境变量没指向正确的instantclient目录。折腾半天才找到原因。
4. 数据库直连
import cx_Oracle
import pandas as pd
import win32cred # 从Windows凭据管理器读取密码
# 读取存储的凭据,禁止硬编码密码
cred = win32cred.CredRead("ORACLE_RPA", win32cred.CRED_TYPE_GENERIC)
password = cred["CredentialBlob"].decode("utf-16")
conn = cx_Oracle.connect(
user="rpa_user",
password=password,
dsn="internal-db:1521/PROD",
encoding="UTF-8"
)
# 内存处理,不落临时文件
df = pd.read_sql("SELECT * FROM transactions WHERE status='PENDING'", conn)
df_filtered = df[df['amount'] > 1000]
# 结果写回数据库
df_filtered.to_sql("high_value", conn, if_exists="append", index=False)
conn.close()
安全加固清单
| 加固项 | 操作 | 验证 |
|---|---|---|
| 运行账号最小权限 | 创建专用账号rpa_svc,仅授权必要目录和DB | 尝试访问无关目录,应被拒绝 |
| 敏感信息存储 | 密码存入Windows凭据管理器 | 流程文件中无硬编码 |
| 网络行为审计 | 防火墙阻断所有出站,仅保留内网DB端口 | Wireshark抓包72小时零外联 |
| 流程文件防拷贝 | 打包EXE启用机器绑定+密码 | 未授权设备运行应报错 |
| 日志完整性 | 本地按日期归档,定期哈希校验 | SHA256值比对一致 |
验收实录
安全部张工话少,验收时只列清单,我手心全是汗:
**物理断网测试:**拔网线,安装、激活、设计流程、运行任务、导出结果,全程无报错
**流量监控:**Wireshark抓包一周,零外网IP连接
**日志溯源:**随机抽查三个月前记录,本地目录完整调取,含时间戳、步骤、输入输出摘要
**权限验证:**打包的EXE拷到个人笔记本运行,提示"未授权设备,拒绝执行"
四项全过,审计材料盖章。张工难得说了句:"这个可以写进材料。"
内网部署RPA,最大的敌人是"伪本地"------名义上本地安装,实则处处依赖外网。选型时务必实测:断网能不能活?保存后有没有外网流量?组件运行时会不会偷偷下载资源?
把RPA当成完全离线的单机软件用,所有数据路径对IT可见、可控、可审计,才是内网合规的正确打开方式。