-
Notifications
You must be signed in to change notification settings - Fork 1.7k
logs/archery.log
logs/qcluster.log
logs/soar.log
# docker查看,可能不完整,以日志文件为准
docker logs archery -f --tail=10
MySQL审核、执行、备份基goInception实现,建议使用SQL审核前先完整阅读对应项目文档,如仍无法满足需求,可给goInception项目提交issue,作者反馈及时
-
资源组必须关联实例
用户和实例之间目前是通过资源组间接关联 -
资源组必须关联用户
用户仅可以查看关联的资源组以及资源组所关联的实例信息,在系统管理-资源组管理页面,进行组管理以及组关联对象管理 也可在用户管理中编辑用户,增加关联关系 -
必须给实例关联[支持上线]标签
在实例管理中编辑实例,给实例关联标签 -
资源组属性里一定不能设置 删除: 是 设置为 删除: [是]时,不显示资源组列表,如需显示一定要设置[否]
系统会默认过滤系统和测试数据库,目前无法配置,过滤列表为
information_schema
performance_schema
mysql
test
sys
- 审核人只能审核自己所在资源组的数据,所以审核人必须要关联工单的资源组
相关issue: #129
- 这个问题的根本原因是,如果binlog格式不为ROW,goInception会尝
set binlog_format=row
,而这个操作需要super权限,所以会有这个错误提示
Execute: Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation (sql: SHOW MASTER STATUS;). Execute: 无法获取master binlog信息
原因是archery上去连接每个实例的账户需要同时授予Replication Client和Replication Slave权限,缺一不可,或者给Super权限。
- 检查日志记录确认是否正常启动了django_q服务,日志文件为
logs/qcluster.log
- 访问debug接口查看系统django_q运行情况 debug
- 使用
python manage.py qmonitor
确认qcluster的运行状态 - 确认是否存在任务回调失败的记录:django_q/failure
- 检查archery数据库中max_allowed_packet参数,如果工单内容过大,可能导致回调写入失败
相关issue: #309 可在issue搜索回滚、备份关键字
错误信息一般如下所示,或者显示备份数据库不存在,请按照以下checklist逐一排查
- 使用前先完整阅读goInception和Inception项目文档
- 检查系统配置里面inception备份库的相关配置
- 检查inception配置文件inc.cnf里面的inception_remote_相关配置
- 检查inception审核用户和备份用户权限,权限参考
— inception备份用户 GRANT SELECT, INSERT, CREATE ON *.* TO 'inception_bak' — inception审核用户(主库配置用户,如果要使用会话管理需要赋予SUPER权限,如果需要使用OSC,请额外配置权限) GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'inception'
- 检查binlog是否开启,并且格式需要为ROW,binlog_row_image为FULL
- 检查DML的表是否存在主键
- 检查语句是否有影响数据
- 检查备份库是否开启autocommit
- mariadb不会生成备份
相关issue: #145
- 在线查询仅显示关联了【支持查询】标签的实例,并且用户所在资源组需要关联该实例
- 建议单独创建一个只读账号,来区分上线实例和查询实例
从v1.7.3开始,使用goInception来解析语句,进行表权限校验,注意检查goInception的连接以及goInception对查询实例的连接
可参考下面的脚本,定时运行即可
# 脱敏规则
# (1, '手机号'), (2, '证件号码'), (3, '银行卡'), (4, '邮箱'), (5, '金额'), (6, '其他')
masking_rule_phone='phone|mobile'
masking_rule_idno='id_number|idcard'
masking_rule_bankcardno='bank_no'
masking_rule_mail='mail|email'
masking_rule_amount='pay_money|amount'
masking_rule_others='pwd|password|user_pass'
masking_rules="$masking_rule_phone|$masking_rule_idno|$masking_rule_bankcardno|$masking_rule_mail|$masking_rule_amount|$masking_rule_others";
DIR="$( cd "$( dirname "$0" )" && pwd )"
cd $DIR
archery_host=127.0.0.1
archery_port=3306
archery_user=
archery_db=archery
archery_pw=
# 获取archery所有slave实例信息
mysql -h$archery_host -P$archery_port -u$archery_user -p$archery_pw $archery_db -N -e "select
id,instance_name,host,port
from sql_instance where type='slave';">instances.list
# 清空表
mysql -h$archery_host -P$archery_port -u$archery_user -p$archery_pw $archery_db -N -e "truncate table data_masking_columns;"
# 临时账号密码(因实例账号&密码为加密,写死使用)
# 此方式只适用单个实例或多个实例账号密码一致
user=
pw=
# 获取脱敏字段信息
cat instances.list|while read instance_name host port
do
mysql -h$host -P$port -u$user -p$pw -N -e "
SELECT CASE
WHEN COLUMN_NAME REGEXP '$masking_rule_phone'
THEN 1
WHEN COLUMN_NAME REGEXP '$masking_rule_idno'
THEN 2
WHEN COLUMN_NAME REGEXP '$masking_rule_bankcardno'
THEN 3
WHEN COLUMN_NAME REGEXP '$masking_rule_mail'
THEN 4
WHEN COLUMN_NAME REGEXP '$masking_rule_amount'
THEN 5
WHEN COLUMN_NAME REGEXP '$masking_rule_others'
THEN 6
END AS rule_type,
1 AS active,
'$instance_id' instance_id,
TABLE_SCHEMA table_schema,
TABLE_NAME table_name,
COLUMN_NAME column_name,
COLUMN_COMMENT column_comment
FROM information_schema.COLUMNS
WHERE COLUMN_NAME REGEXP '$masking_rules'
AND TABLE_SCHEMA != 'performance_schema'
AND TABLE_SCHEMA != 'information_schema';">$instance_name.txt
# 更新表数据
mysql -h$archery_host -P$archery_port -u$archery_user -p$archery_pw $archery_db -N -e "load data local infile '$instance_name.txt' replace into table data_masking_columns fields terminated by '\t' ( rule_type,active,instance_id,table_schema,table_name,column_name,column_comment);"
done
- 检查配置管理是否开启了脱敏配置
- 检查脱敏字段是否命中(名称区分大小写,关联实例和查询实例是否一致)
- 检查脱敏规则的正则表达式是否可以匹配到数据,无法匹配的会返回原结果
- 检查是否关闭了QUERY_CHECK参数,关闭该参数遇到无法解析的脱敏语句会直接跳过
- 检查脚本内的配置,hostname和实例配置表中的内容是否保持一致,比如实例列表配置如下
则脚本内的hostname就应该为
hostname="mysql:3306"
- 检查慢日志收集表mysql_slow_query_review_history是否存在记录,并且hostname_max是否和实例配置的host:port一致
通常显示如下
这是因为NGINX的静态资源配置不正确,无法访问样式文件,修改相关配置即可,假如
settings.py配置项为:STATIC_ROOT = os.path.join(BASE_DIR, 'static')
archery部署路径为:/opt/archery
,则location修改为
location /static {
alias /opt/archery/static;
}
进入用户管理页面开启职员状态即可
需要安装 msodbc驱动,具体参加官方文档
需要在supervisord.conf 文件中 ,修改并发方式为sync模式,如下所示:
command=gunicorn -w 4 -k sync-b 127.0.0.1:8000 --timeout 600 archery.wsgi:application
docker部署的话,执行如下命令即可,issue详情:
docker exec -it archery bash
sed -i 's#return "127.0.0.1", self.server.local_bind_port#return "archery", self.server.local_bind_port#g' /opt/archery/sql/utils/ssh_tunnel.py
exit
docker restart archery
管理员可以登录的情况: 管理员登陆管理后台,进入SQL-->2FA配置,删除用户对应的那条2FA配置信息即可
管理员无法登陆的情况:
python3 manage.py shell
from sql.models import TwoFactorAuthConfig
TwoFactorAuthConfig.objects.filter(user__username='admin').delete()
- 检查日志
docker logs -f --tail=10 archery
- 查看是否发现如下错误:
django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: 'archery_xxx.xxxang.com:9123'. The domain name provided is not valid according to RFC 1034/1035.
- 若有这个错误,则说明是域名不合规,上述示例是Django域名不支持下划线,将下划线(_)替换成横杠(-)后就好了,具体请参考 https://github.com/django/django/blob/0b8a0296bfd30748f08021834e95cdae241686e8/django/http/request.py#L28