Archery核心功能深度解析:SQL审核与工作流管理
Archery作为专业的SQL审核平台,提供了完整的SQL工单提交与审核流程,通过多级审核机制确保数据库变更的安全性和规范性。本文详细解析了Archery的SQL工单提交流程、多级审核机制、自动审核规则与Inception集成以及工作流状态管理,全面展示了其如何通过灵活的配置和严格的权限控制降低生产环境风险。
SQL工单提交与审核流程详解
Archery作为专业的SQL审核平台,其核心功能之一就是提供完整的SQL工单提交与审核流程。该流程确保了数据库变更的安全性和规范性,通过多级审核机制降低生产环境的风险。
工单提交流程
SQL工单提交是Archery工作流的起点,用户通过Web界面提交需要执行的SQL语句。提交过程包含以下几个关键步骤:
1. 工单信息填写
用户需要填写完整的工单信息,包括:
| 字段名称 | 必填 | 说明 |
|---|---|---|
| 实例选择 | 是 | 选择目标数据库实例 |
| 数据库名 | 是 | 指定操作的数据库 |
| SQL内容 | 是 | 需要执行的SQL语句 |
| 工单标题 | 是 | 工单描述信息 |
| 执行方式 | 是 | 立即执行或定时执行 |
| 备份选项 | 否 | 是否开启自动备份 |
2. SQL语法检查
提交前系统会自动进行基础语法检查:
def query_check(self, db_name=None, sql=""):
"""SQL语句基础检查"""
# 检查SQL是否为空
if not sql.strip():
raise Exception("SQL内容不能为空")
# 检查危险操作
dangerous_keywords = ['drop database', 'truncate table', 'delete from']
for keyword in dangerous_keywords:
if keyword in sql.lower():
raise Exception(f"检测到危险操作: {keyword}")
return True
3. 工单创建与状态初始化
提交成功后,系统创建SqlWorkflow对象并初始化状态:
# 创建SQL工单记录
workflow = SqlWorkflow.objects.create(
workflow_name=title,
engineer=request.user.username,
status="workflow_manreviewing", # 初始状态为人工审核中
group_id=group_id,
group_name=group_name,
instance_id=instance_id,
db_name=db_name,
is_backup=is_backup,
review_content=review_content,
run_date=run_date
)
多级审核机制
Archery采用灵活的多级审核机制,支持自动审核和人工审核相结合的方式。
审核流程状态机
自动审核规则
系统支持基于规则的自动审核,配置项包括:
# 自动审核配置示例
auto_review_config = {
"auto_review": True, # 启用自动审核
"auto_review_tag": "can_write", # 实例标签过滤
"auto_review_db_type": "mysql,mongodb", # 数据库类型
"auto_review_regex": "^alter|^create|^drop", # 需要人工审核的SQL模式
"auto_review_max_update_rows": 50 # 最大影响行数
}
人工审核流程
当SQL语句需要人工审核时,系统按照配置的审核流程进行:
- 审核组分配:根据资源组配置分配审核人员
- 审核通知:通过邮件、钉钉等方式通知审核人
- 审核操作:审核人可以进行通过、驳回、终止等操作
def operate(self, action: WorkflowAction, actor: Users, remark: str):
"""审核操作核心方法"""
# 检查操作权限
if not self.can_operate(action, actor):
raise AuditException("无权限进行此操作")
# 执行审核操作
if action == WorkflowAction.PASS:
return self.operate_pass(actor, remark)
elif action == WorkflowAction.REJECT:
return self.operate_reject(actor, remark)
elif action == WorkflowAction.ABORT:
return self.operate_abort(actor, remark)
审核节点管理
Archery支持多级审核节点配置,每个节点对应一个用户组:
审核节点配置通过WorkflowAuditSetting模型管理:
class WorkflowAuditSetting(models.Model):
"""工作流审核设置"""
workflow_type = models.SmallIntegerField(choices=WorkflowType.choices)
group_id = models.IntegerField() # 资源组ID
audit_auth_groups = models.CharField(max_length=255) # 审核组ID列表
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
执行阶段控制
审核通过后,工单进入执行阶段,系统提供多种执行控制选项:
执行权限控制
def can_execute(user, workflow_id):
"""检查用户是否有执行权限"""
workflow = SqlWorkflow.objects.get(id=workflow_id)
# 超级用户可直接执行
if user.is_superuser:
return True
# 工单提交人可执行
if user.username == workflow.engineer:
return True
# 拥有资源组执行权限的用户
if user.has_perm("sql.sql_execute_for_resource_group"):
user_groups = [g.group_id for g in user_groups(user)]
if workflow.group_id in user_groups:
return True
return False
定时执行功能
支持配置定时执行任务,避免业务高峰时段:
def add_sql_schedule(name, run_date, workflow_id):
"""添加SQL定时任务"""
schedule, created = Schedule.objects.get_or_create(
name=name,
defaults={
'func': 'sql.utils.execute_sql.execute',
'args': json.dumps([workflow_id]),
'schedule_type': Schedule.ONCE,
'next_run': run_date
}
)
return schedule
审核日志与追溯
系统完整记录审核过程中的所有操作,便于审计和追溯:
| 日志类型 | 记录内容 | 用途 |
|---|---|---|
| 操作日志 | 审核通过、驳回、终止等操作 | 操作审计 |
| 执行日志 | SQL执行详情、影响行数 | 问题排查 |
| 系统日志 | 自动审核结果、异常信息 | 系统监控 |
def add_log(audit_id, operation_type, operation_info, operator):
"""添加审核日志"""
WorkflowLog.objects.create(
audit_id=audit_id,
operation_type=operation_type,
operation_info=operation_info,
operator=operator,
operator_display=operator.display,
create_time=timezone.now()
)
异常处理与回滚
当SQL执行出现异常时,系统提供完善的异常处理机制:
- 异常捕获:实时监控执行过程,捕获数据库异常
- 状态回滚:自动将工单状态回滚到执行前状态
- 通知机制:及时通知相关人员进行问题处理
- 回滚脚本:对于DML操作,自动生成回滚SQL
def execute_callback(task):
"""执行完成回调处理"""
try:
result = task.result
if result and result.get('status') == 'success':
# 执行成功,更新状态
workflow.status = 'workflow_finish'
workflow.save()
else:
# 执行失败,回滚状态
workflow.status = 'workflow_exception'
workflow.save()
# 发送失败通知
notify_for_execute(workflow, result)
except Exception as e:
logger.error(f"执行回调异常: {e}")
通过这样完整的SQL工单提交与审核流程,Archery确保了数据库变更操作的安全性、规范性和可追溯性,为企业数据库运维提供了强有力的保障。
多级审核机制与权限控制
Archery作为企业级SQL审核平台,其核心的多级审核机制与权限控制体系确保了数据库操作的安全性和规范性。该系统通过精细化的权限划分、灵活的审核流程配置以及智能的自动化决策,为不同规模的企业提供了完善的数据库操作治理方案。
审核流程架构设计
Archery采用基于资源组的多级审核架构,每个工作流类型(SQL审核、数据归档、查询权限申请)都可以配置独立的审核流程。审核流程的核心组件包括:
审核节点类型定义:
class ReviewNodeType(Enum):
GROUP = "group" # 用户组审核节点
AUTO_PASS = "auto_pass" # 自动通过节点
审核节点数据结构:
@dataclass
class ReviewNode:
group: Optional[Group] = None # 审核用户组
node_type: ReviewNodeType = ReviewNodeType.GROUP # 节点类型
is_current_node: bool = False # 是否为当前节点
is_passed_node: bool = False # 是否已通过
多级审核流程配置
Archery支持灵活的多级审核流程配置,管理员可以为每个资源组和工单类型设置独立的审核链:
审核设置配置表:
| 字段名 | 类型 | 描述 | 示例值 |
|---|---|---|---|
| workflow_type | WorkflowType | 工单类型 | SQL_REVIEW |
| group_id | Integer | 资源组ID | 1 |
| audit_auth_groups | String | 审核用户组ID列表 | "1,2,3" |
审核流程示例:
权限控制体系
Archery的权限控制体系基于Django的认证框架,实现了多层次的权限管理:
用户权限层级:
- 系统管理员:拥有所有权限,可管理用户、实例、资源组等
- 资源组管理员:管理特定资源组内的实例和工单
- 审核人员:负责对应资源组的工单审核
- 普通用户:只能提交和查看自己的工单
权限控制代码示例:
def can_review(user, workflow_id, workflow_type):
"""检查用户是否有权限审核指定工单"""
# 超级用户拥有所有审核权限
if user.is_superuser:
return True
# 获取工单审核信息
audit = WorkflowAudit.detail_by_workflow_id(workflow_id, workflow_type)
if not audit:
return False
# 检查用户是否在审核组中
user_groups = user.groups.all()
audit_groups = audit.audit_auth_groups.split(',')
return any(str(group.id) in audit_groups for group in user_groups)
自动化审核机制
Archery集成了智能的自动化审核机制,通过配置规则实现部分工单的自动处理:
自动审核条件判断:
def is_auto_review(self) -> bool:
# 检查是否启用自动审核
if not self.sys_config.get("auto_review", False):
return False
# 检查数据库类型是否在允许列表中
auto_review_db_type = self.sys_config.get("auto_review_db_type", "").split(",")
if self.workflow.instance.db_type not in auto_review_db_type:
return False
# 检查实例标签是否符合
auto_review_tags = self.sys_config.get("auto_review_tag", "").split(",")
if not self.workflow.instance.instance_tag.filter(
tag_code__in=auto_review_tags
).exists():
return False
# SQL语句正则匹配检查
auto_review_regex = self.sys_config.get(
"auto_review_regex",
"^alter|^create|^drop|^truncate|^rename|^delete"
)
p = re.compile(auto_review_regex, re.I)
# 影响行数检查
all_affected_rows = 0
for review_row in json.loads(review_content):
review_result = ReviewResult(**review_row)
sql = remove_comments(review_result.sql)
if p.match(sql):
return False
all_affected_rows += int(review_result.affected_rows)
return all_affected_rows <= int(
self.sys_config.get("auto_review_max_update_rows", 50)
)
审核状态机管理
Archery实现了完整的工单状态机,确保审核流程的规范性和可追溯性:
工单状态转换表:
| 当前状态 | 允许操作 | 下一状态 | 说明 |
|---|---|---|---|
| WAITING | PASS | 下一审核节点 | 审核通过 |
| WAITING | REJECT | REJECTED | 审核驳回 |
| WAITING | ABORT | ABORTED | 工单终止 |
| PASSED | EXECUTE_SET_TIME | TIMING_TASK | 设置执行时间 |
| PASSED | EXECUTE_START | EXECUTING | 开始执行 |
| PASSED | EXECUTE_END | FINISHED | 执行完成 |
状态转换代码实现:
SUPPORTED_OPERATION_GRID = {
WorkflowStatus.WAITING.value: [
WorkflowAction.PASS,
WorkflowAction.REJECT,
WorkflowAction.ABORT,
],
WorkflowStatus.PASSED.value: [
WorkflowAction.REJECT,
WorkflowAction.ABORT,
WorkflowAction.EXECUTE_SET_TIME,
WorkflowAction.EXECUTE_START,
WorkflowAction.EXECUTE_END,
],
# ... 其他状态转换规则
}
审核日志与审计追踪
Archery提供了完整的审核日志记录功能,确保所有操作的可追溯性:
审核日志记录:
def add_log(audit_id, operation_type, operation_type_desc,
operation_info, operator, operator_display):
"""记录审核操作日志"""
WorkflowLog.objects.create(
audit_id=audit_id,
operation_type=operation_type,
operation_type_desc=operation_type_desc,
operation_info=operation_info,
operator=operator,
operator_display=operator_display,
create_time=timezone.now()
)
日志信息示例表:
| 字段 | 类型 | 描述 | 示例值 |
|---|---|---|---|
| operation_type | String | 操作类型 | "pass" |
| operation_type_desc | String | 操作描述 | "审核通过" |
| operation_info | String | 操作详情 | "SQL语法正确,影响行数在允许范围内" |
| operator | String | 操作人用户名 | "admin" |
| operator_display | String | 操作人显示名 | "系统管理员" |
资源组隔离机制
Archery通过资源组实现了多租户的权限隔离,确保不同业务部门的数据操作互不干扰:
资源组权限控制:
资源组查询权限控制:
def user_instances(user, type=None, db_type=None, tag_codes=None):
"""获取用户有权限访问的实例列表"""
if user.is_superuser:
# 超级用户可以看到所有实例
return Instance.objects.all()
# 普通用户只能看到所属资源组的实例
user_group_ids = user.resource_group.values_list('group_id', flat=True)
return Instance.objects.filter(
resource_group__group_id__in=user_group_ids
).distinct()
安全审计与合规性
Archery的审核机制充分考虑了企业级的安全审计需求:
安全审计特性:
- 操作留痕:所有审核操作都有完整的日志记录
- 权限分离:申请、审核、执行权限相互独立
- 流程可配置:支持根据不同安全等级配置不同的审核流程
- 自动合规检查:内置SQL语法检查和风险识别
合规性检查示例:
def is_auto_reject(self):
"""自动驳回高风险工单"""
if self.workflow_type != WorkflowType.SQL_REVIEW:
return False
# 检查审核结果中的错误和警告
warning_count, error_count = 0, 0
for r in json.loads(review_content):
err_level = ReviewResult(**r).errlevel
if err_level ==
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



