腾讯云数据库用于保险行业数据库怎么样?

直击行业痛点,安心保险搭上腾讯云后让钟诚更有了信心
钟诚简介:现任安心财产保险有限责任公司总裁。本科毕业于武汉大学经济学院,后在暨南大学金融系获得硕士学位,曾在中国人保工作20余年, 2008年升任人保财险广东省公司副总经理、2009年转任人保集团业务发展部副总经理、2010年任业务发展部总经理、2011年调任人保集团旗下子公司中人保险经纪公司任董事总经理。
日下午5点,安心保险位于宣武门的办公大楼里,彼时一片欢腾。安心保险拿到开业批文,将正式成为继众安保险、泰康在线之后,保险业第三家真正意义上的互联网保险公司。这一刻,距离钟诚踏入保险行业,已过去二十四年。
对于六十年代出生的人来说,似乎上了大学就是一件天大的喜事。那时候的大学生远不如现在这么多,自然,找工作也没有现在这样难。学习了几年的保险专业,在那个毕业包分配的年代,钟诚毫无意外的进入了中国人民保险公司,一干就是二十多年。
九十年代的保险业,堪称“传销先驱”。钟诚在做客腾讯云会客厅接受腾讯云副总裁曾佳欣采访时回忆,刚毕业的时候,保险是一个异常艰难的行业。这来源于保险的模糊印象,以及行业混乱引发的大众抵抗,加上销售误导、理赔难的问题不断出现,保险成为众矢之的,行业泥沙俱下,成为难以根除的痼疾。
脑海中最早的计划应该是在2009年,成立一家能够快速理赔、简单操作的新型保险公司。这个想法让他沉寂许久的心有些悸动,像是孩童时期探索未知的事物一样兴奋。对于既有行业的印象改造,须要有摧枯拉朽的决心,所以他从服务了二十多年的老东家出来,开始筹划建立自己的保险公司。
互联网浪潮引发的时代变迁,对于八零后、九零后来说是激情碰撞,而放在六七十年代的人身上,则更多的是无奈悲壮。钟诚不这么想,他始终觉得,保险可以做的更有情怀,就像我们上网买衣服的便捷,保险同样可以在网上完成入保、理赔的一系列过程。怀揣着这股不安心做墨守成规“老保险人”的执拗,在2013年,创办一家互联网保险公司的计划终于实现了。
在这个充斥着“资本寒冬”、“经济平缓”论调的年代,创业无异于披荆斩棘。钟诚提到,自己开始以为创办新公司非常困难,也做好了重新来过的准备,所以在跟监管部门汇报沟通时,说的最多的是他想要改变行业的期望,和他上云所做的准备。在后来接受访问时他仍记忆犹新,保监会问他,“你能不能告诉我,安全性你怎么保证?你的服务性能不能搞定?会不会出现这样那样的一些问题?”甚至屡次检查安心部署在腾讯云上的业务架构,视察腾讯云在上海的机房。最终,他拿到了国内第三家开业批文,成为国内首家全业务运行在“云”上的保险公司。
钟诚的理念的是,将产品做得更精细、更简单,能够在短时间内,给用户提供优质、高效的服务资源,这就要求公司拥有高速反应和处理能力,腾讯云提供的云服务正好解决了这些问题。互联网保险的IT系统,堪称安身立命之本,如果自己建造,一方面成本、人力不好控制,技术攻关和维护也会耗费巨大金额。
对于一家创业公司来说,在能够最大限度节省成本,解决技术烦恼,是每个创业者梦寐以求的事,也正因为如此,钟诚把公司的业务全面上云,一方面解决了技术问题,同时降低了人、物消耗成本,公司只需要为客户提供定制化方案和服务即可,省时省力。
云计算对于互联网保险业来说,更像是衣食住行一般不可或缺。不仅仅由于业务过程中,可弹性伸缩能够给系统带来缓冲的时间,降低并发性增长;同时云端服务更具备安全性,可以有效防止DDoS攻击。钟诚自己也认为,业务出现高并发流量时,腾讯云系统和公司系统的快速切换,有效帮助公司度过技术难关,可以更加专心的聚焦在产品和服务上,做好公司的品牌。
传统保险业不需要上网操作申报、理赔流程,相对而言,泄密的风险大大降低。而互联网保险的流程是网上办理,数据对公司来说,关乎命脉。钟诚认为数据的安全性关联公司声誉和态度,所以在与腾讯云的合作中,十分重视安全防护。有意思的是,安心保险背靠腾讯云的防DDoS系统,并且在内部加筑一层防御,这样在遭遇大规模的攻击时,完全不用担心被攻破。钟诚笑称,腾讯云防御壁垒非常坚固,让自己少了很多后顾之忧。
云计算做技术支撑的保险业务,可以实现更垂直细分的保险分类,例如“恋爱保险””天气保险”,钟诚将这些琐碎细小,但具有创新意义的保险称为“敏捷开发”,即针对场景化、碎片化业务和小众人群,做更精心的服务。客户只需要自己拍照上传,OCR系统自动识别存入,单子就能开出;同样,理赔过程中,在现场拍几个相片,直接上传到系统里,服务人员就会引导用户获得理赔,最后只需要一个评价即可完成。
这样“小而美”的简单保险流程,就是钟诚创办安心保险的初衷。作为一个在传统保险成长起来的行业精英,在不惑之年重新创业,不仅是希望将理想变为现实,改变保险行业的现状;更多是看到了互联网带来的挑战,想要乘风破浪、勇往直前的那份坚持吧。
互联网保险如同金融、视频、游戏上云一样,也同样搭上了时代的大船,便利、迅捷成为更多企业追求的目标,相信在未来的发展中,云计算将会成为互联网保险公司快速发展不可缺的利剑,披荆斩棘。
钟诚做客腾讯云会客厅视频
【栏目介绍】在互联网+时代下,云计算正被越来越多的行业和企业认可。《腾讯云会客厅》作为云计算行业首档高端人物访谈栏目,是由腾讯云副总裁曾佳欣亲自主持,在分享云在各领域最佳实践的同时,也邀请到众多创投界资深人士和明星,分享云端创投经验,从资本、技术、渠道、服务等方面,打通整个产业链,构建云端创业生态。
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点互联网中间件
域名与网站
开发者工具
人工智能(AI)
大数据基础服务
大数据可视化服务
大数据应用服务
行业解决方案
大数据与AI解决方案
物联网解决方案
安全与运维解决方案
微信解决方案
微信小程序
服务与培训
微信小程序
服务与培训
培训与认证
云数据库CDB
公有云数据库
CVM自建数据库
传统自建数据库
性能卓越,选型灵活
CDB提供多种存储介质选型,可根据您的业务情况灵活选择
基于高速PCIExpress架构的企业级固态硬盘(SSD)和相关控制器提供硬件加速能力,专为高性能OLTP应用程序设计,QPS高达245509的高IO版。
价格低廉,采用普通SSD存储介质,具有成本效益的大容量版。
按量计费,弹性扩展
用户可根据业务情况选择精确到秒粒度的按量计费模式,或者价格更优惠的包年包月模式。
简单易用,迁移无忧
仅需几步用户可轻松完成数据库从部署到访问,不需要预先准备基础设施,也不需要安装和维护数据库软件。
基于CDB提供的数据传输工具CDT,可轻松将海量数据迁移上云。
提供命令行和WEB两种方式管理数据库,并支持批量数据库管理、权限设置和SQL导入。
提供多种数据导入途径完成初始化。每日自动生成备份数据,云数据库根据备份文件提供3天内任意时间点回档。
服务高可用,数据高可靠
提供主从数据实时热备、确保线上数据安全。同时通过多份备份机制保存多天的数据,提高在灾难情况下的数据可靠性。
实时双机热备,3日内无损恢复 ,5日冷备数据dump。
提供宕机自动检测和故障自动迁移。主备切换和故障迁移过程对用户透明。
多维度监控、自定义资源阈值告警,提供慢查询分析报表和SQL完整运行报告。
全面调优的系统参数,融合基于腾讯多年经验的数据库补丁。
优于开源数据库的性能、服务、BUG修复速度,提供更好的数据库使用体验。
应用场景数据库迁移数据库灾备读写分离架构版本更新
开发者资源文档API
关注公众号,移动管理云服务 长按识别或截图保存关注公众号,移动管理云服务在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
点击阅读原文
腾讯云数据库审计功能大揭秘
日 发布,来源:
什么是数据库审计
对于一个仓库,如果要防盗, 常见做法是出入口全装上监控,一旦有问题了,调监控查找异常情况。对数据库来说也类似,数据库也有出入口,对所有连接出入口监控,记录下所有动作,一旦有问题了,查询历史动作,找到关键信息。如果仓库中的东西价值高,损失已经造成,监控只是事后诸葛,所以往往请专业人士在巡逻防盗,防止偷盗发生。同样数据库审计也有更专业的手段,sql阻断,在动作发生前,对动作行为分析,如果判断符合预先设置的高危动作,直接中止执行,防止对数据造成破坏。
审计定义:能够实时记录网络上的数据库活动,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断
常见的审计方式
应用层审计
在应用系统中直接审计,语句还没往数据库后台发就先做了审计,不影响数据库性能,对底层用的是什么数据库也不关心,但对应用系统压力比较大,并且应用系统需要解析语句,有一定复杂度。
传输层审计
往往抓包解析实现,对上下层都没什么影响,但同样要解析语句,有一定复杂度,并且如果传输层是通过加密通讯,将无法解析。
对于开源数据库,通常都有提供插件方式增加功能。审计可以以插件直接嵌在内核上,当然会对数据库性能有一定影响,但同样因为直接嵌在内核,很多一手信息能直接拿到,比方说上面没办法回避的语法解析就不用做,而且还能直接拿更多的运行态信息,能开发功能强大又灵活的审计功能。
直接在内核上实现,所有功能都能实现,也能将性能影响降到最低,但是对后台稳定性会有影响,对开发人员要求高,不管是开源还是非开源数据库,都会非常慎重考虑直接在内核上支持审计。
oracle审计简介
谈到数据库审计,不能不提oracle,oracle 数据库的审计功能有10多年甚至更长的历史了,对数据库sql审计功能影响深远,几乎任何数据库审计都会参考,下面我们简单了解下oracle审计。
Oracle中审计总体上可分为“标准审计”和“细粒度审计”,标准审计包含语句审计,权限审计,对象审计,细粒度审计也称为“基于政策的审计”:
按照语句类型审计SQL语句.而不论访问何种特定的模式对象。也可以在数据库中指定一个或多个用户,针对特定的语句审计这些用户
审计系统权限,例如GRANT。和语句审计一样,权限审计可以指定一个或多个特定的用户作为审计的目标
审计特定模式对象上运行的特定语句(例如,DEPARTMENTS表上的UPDATE语句)。模式对象审计总是应用于数据库中的所有用户
根据访问对象的内容来审计表访问和权限。使用程序包DBMS_FGA来建立特定表上的策略
默认情况下审计是关闭的,因为开启性能影响大,需要设置一些参数打开它,审计记录结果既可以放文件也可以放系统表中。那么怎么配置需要审计的内容呢?oracle提供了一套审计配置语法来做这事,audit/noaudit,审计和取消审计,是互逆的,如下所示:
图1图2示例如下:
// 审计u1.t2这个表的update 不成功的语句
audit update on u1.t2 by access whe
// 审计u1.t2这个表的update 成功的语句
audit update on u1.t2 by access
运算式:f+s=a 连续运行上面两个配置语句,等价审计全部
// 审计u1.t2表update全部语句,全部包括两种,成功和失败
audit update on u1.t2
// 不审计u1.t2表update成功的语句
noaudit update on u1.t2 by access
运算式:a-s=f 连续运行上面两个配置语句,等价只审计失败语句
a:all,全部
f:fail,失败
s:success,成功
这就是oracle审计配置语法用法,配置完成后就能审计到相应的语句,它的成功、失败、全部是存在运算关系的。如何查询比较简单,直接查询相关表就行,不再介绍。
mysql审计插件
前文提到,插件是数据库实现审计功能的常见手段,mysql上也有不少审计插件,比较有名的Macfee插件,官方audit plugin,mariadb audit plugin,Percona audit plugin。
从功能上来说,这几个插件大同小异,只是展示的审计内容和格式略有差异。从性能上来说,除了macfee插件外,其它几个性能相差不多,宣称都是15%左右影响,macfee则可能达到50%或更多。实际上,确定一个测试性能损失的标准场景是需要商榷的,跑非常简单的语句,几十万Qps,性能影响肯定大,审计性能消耗和语句量直接关联,跑OLAP查询,几秒甚至几十秒执行一个语句,审计性能影响可以说没有,所以审计性能损失得看具体场景。
从实现方式来说,这几个插件也差不太多,从thd对象中取到所需要的属性,按一定规则过滤,按某种策略存盘,以json或xml等格式展示审计结果。
mysql审计接口详细分析
从5.5开始,mysql内核中已经增加了一套的对服务器操作的审计机制的接口,添加了额外的审计流程来对我们所关心的地方进行事件捕获,如果要对服务器进行审计,只要基于这些完善一个插件即可。
mysql审计接口官方第一次是提交到代码是2009年底,历史也比较悠久了,修改和增加的文件并不多,几个关键点介绍下。
1. 在plugin.h中增加一个新的宏 MYSQL_AUDIT_PLUGIN 用来标识一类全新的插件类型:AUDIT插件
2. 增加了一个新的头文件:plugin_audit.h,里面有审计相关的关键的结构体及一些宏定义,如下:
mysql_event_general结构,query信息结构,对应非登陆相关的动作,如执行一个语句select或一个命令exit。
struct mysql_event_general
unsigned int event_
//子事件类型
int general_error_
unsigned long general_thread_
const char *general_
unsigned int general_user_
const char *general_
//命令,如connect,query,shutdown等,error类型存错误,其它为null
unsigned int general_command_
const char *general_
unsigned int general_query_
struct charset_info_st *general_
unsigned long long general_
unsigned long long general_
//行计数器
MYSQL_LEX_STRING general_
//来自主机,如localhost
MYSQL_LEX_STRING general_sql_
//操作类型,如select
MYSQL_LEX_STRING general_external_
// external 用户
MYSQL_LEX_STRING general_
mysql_event_connection,连接信息结构,对应登陆登出动作
struct mysql_event_connection
unsigned int event_
unsigned long thread_
const char *
unsigned int user_
const char *priv_
unsigned int priv_user_
const char *external_
unsigned int external_user_
const char *proxy_
unsigned int proxy_user_
const char *
unsigned int host_
const char *
unsigned int ip_
const char *
//数据库名
unsigned int database_
所有动作都可以用这两个结构来描述,但是并不是说就能满足全部需求,比方说,对general动作,我想知道语句是针对哪些表的,执行了多长时间,无法得到,对于connect动作,我想知道是什么时间发生的,无从得知,这肯定是不够的,仍需我们去继续丰富功能点。
几个关键的宏定义:
#define MYSQL_AUDIT_GENERAL_CLASS 0
//general动作
#define MYSQL_AUDIT_GENERAL_LOG 0
//log时,语句execute前
#define MYSQL_AUDIT_GENERAL_ERROR 1
//error时,反馈用户前
#define MYSQL_AUDIT_GENERAL_RESULT 2
//结果集返回后
#define MYSQL_AUDIT_GENERAL_STATUS 3
//审计流程结束状态
#define MYSQL_AUDIT_CONNECTION_CLASS 1
//connect动作
#define MYSQL_AUDIT_CONNECTION_CONNECT 0
#define MYSQL_AUDIT_CONNECTION_DISCONNECT 1
#define MYSQL_AUDIT_CONNECTION_CHANGE_USER 2
//切换用户
3. 核心功能实现代码:sql_auditc.h,sql_audit.cc,初始化,回收,以及最重要的取出thd对象有效值等一系列动作均在此完成。
在sql_auditc.h中,定义了两个内联函数和三个宏,功能是获取到thd对象中有用值,如用户名,数据库名,时间,sql内容等所需要信息,以参数的形式传给下一层接口。每个动作,都会从这里获取原始信息,会频繁调用这几个函数,所以使用了宏和内联函数来提高性能。
在sql_audit.cc中,除了审计插件初始化,回收外,最重要的功能获得操作原始信息,在这里实现了函数获得上面sql_auditc.h中通过参数形式传入的有用信息,并存入mysql_event_general和mysql_event_connection结构。
4. mysql其它一些连接、插入、解析、日志等接口也增加了审计入口函数。如mysqld.cc、sql_parse.cc等文件中函数增加了审计入口。
审计执行流程简介
登陆登出流程
audit_null_notify (thd=0x7fdcc7ff6000, event_class=0, event=0x7fdd45440cb0) at /mysql56/plugin/audit_null/audit_null.c:99
0x3f22 in plugins_dispatch (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:455
event_class_dispatch (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:491
general_class_handler(THD *, uint, typedef __va_list_tag __va_list_tag *) (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&)
at /mysql56/sql/sql_audit.cc:90
0x41b1 in mysql_audit_notify (thd=0x7fdcc7ff6000, event_class=0, event_subtype=0) at /mysql56/sql/sql_audit.cc:217
0xe7cb in mysql_audit_general_log (thd=0x7fdcc7ff6000, cmd=0xc76b64 &Connect&, cmdlen=7, query_str=&value optimized out&, query_len=&value optimized out&)
at /mysql56/sql/sql_audit.h:125
0xea5a in log_command (thd=&value optimized out&, command=&value optimized out&, format=0xc6d27b &%s@%s on %s&) at /mysql56/sql/log.cc:2094
general_log_print (thd=&value optimized out&, command=&value optimized out&, format=0xc6d27b &%s@%s on %s&) at /mysql56/sql/log.cc:2122
0x2030 in acl_authenticate (thd=0x7fdcc7ff6000, com_change_user_pkt_len=&value optimized out&) at /mysql56/sql/sql_acl.cc:11244
0xa8ad0 in check_connection (thd=0x7fdcc7ff6000) at /mysql56/sql/sql_connect.cc:685
#10 0xa8d97 in login_connection (thd=0x7fdcc7ff6000) at /mysql56/sql/sql_connect.cc:754
#11 thd_prepare_connection (thd=0x7fdcc7ff6000) at /mysql56/sql/sql_connect.cc:914
#12 0xa9119 in do_handle_one_connection (thd_arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:983
#13 0xa91c2 in handle_one_connection (arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:906
#14 0x9337 in pfs_spawn_thread (arg=0x7fdccb3be840) at /mysql56/storage/perfschema/pfs.cc:1860
#15 0x00007fdd46a249d1 in start_thread () from /lib64/libpthread.so.0
#16 0x00007fdd459a38fd in clone () from /lib64/libc.so.6
登陆如上所示,登陆时在do_handle_one_connection 中循环等待连接,有请求过来时再到准备连接,再到权限认证检查,最在log_command中进入审计接口,准备审计相关动作。
audit_null_notify (thd=0x7fdcc7eb0000, event_class=1, event=0x7fdd46ca0b40) at /mysql56/plugin/audit_null/audit_null.c:99
0x4402 in plugins_dispatch (thd=0x7fdcc7eb0000, event_subclass=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:455
event_class_dispatch (thd=0x7fdcc7eb0000, event_subclass=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:491
connection_class_handler(THD *, uint, typedef __va_list_tag __va_list_tag *) (thd=0x7fdcc7eb0000, event_subclass=&value optimized out&, ap=&value optimized out&)
at /mysql56/sql/sql_audit.cc:114
0x41b1 in mysql_audit_notify (thd=0x7fdcc7eb0000, event_class=1, event_subtype=1) at /mysql56/sql/sql_audit.cc:217
0xbb53 in close_connection (thd=0x7fdcc7eb0000, sql_errno=0) at /mysql56/sql/mysqld.cc:2634
0xa90b2 in do_handle_one_connection (thd_arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:996
0xa91c2 in handle_one_connection (arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:906
0x9337 in pfs_spawn_thread (arg=0x7fdccb3be7a0) at /mysql56/storage/perfschema/pfs.cc:1860
0x00007fdd46a249d1 in start_thread () from /lib64/libpthread.so.0
#10 0x00007fdd459a38fd in clone () from /lib64/libc.so.6
登出时相对简单,在close_connection中增加了审计动作。
query审计流程
audit_null_notify (thd=0x7fdcc7ff6000, event_class=0, event=0x7fdd45440da0) at /mysql56/plugin/audit_null/audit_null.c:99
0x3f22 in plugins_dispatch (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:455
event_class_dispatch (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:491
general_class_handler(THD *, uint, typedef __va_list_tag __va_list_tag *) (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&)
at /mysql56/sql/sql_audit.cc:90
0x41b1 in mysql_audit_notify (thd=0x7fdcc7ff6000, event_class=0, event_subtype=0) at /mysql56/sql/sql_audit.cc:217
0xe7cb in mysql_audit_general_log (thd=0x7fdcc7ff6000, cmd=0xc76b19 &Query&, cmdlen=5, query_str=&value optimized out&, query_len=&value optimized out&)
at /mysql56/sql/sql_audit.h:125
0xe93e in log_command (thd=0x7fdcc7ff6000, command=&value optimized out&, query=0x7fdcc201c010 &SELECT DATABASE()&, query_length=17) at /mysql56/sql/log.cc:2094
general_log_write (thd=0x7fdcc7ff6000, command=&value optimized out&, query=0x7fdcc201c010 &SELECT DATABASE()&, query_length=17) at /mysql56/sql/log.cc:2136
0xe0b37 in mysql_parse (thd=0x7fdcc7ff6000, rawbuf=&value optimized out&, length=&value optimized out&, parser_state=&value optimized out&)
at /mysql56/sql/sql_parse.cc:6578
0xe1e78 in dispatch_command (command=COM_QUERY, thd=0x7fdcc7ff6000, packet=0x7fdcc7ffa001 &SELECT DATABASE()&, packet_length=)
at /mysql56/sql/sql_parse.cc:1359
#10 0xa908d in do_handle_one_connection (thd_arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:990
#11 0xa91c2 in handle_one_connection (arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:906
#12 0x9337 in pfs_spawn_thread (arg=0x7fdccb3be840) at /mysql56/storage/perfschema/pfs.cc:1860
#13 0x00007fdd46a249d1 in start_thread () from /lib64/libpthread.so.0
#14 0x00007fdd459a38fd in clone () from /lib64/libc.so.6
audit_null_notify (thd=0x7fdcc7ff6000, event_class=0, event=0x7fdd) at /mysql56/plugin/audit_null/audit_null.c:99
0x3f22 in plugins_dispatch (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:455
event_class_dispatch (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&) at /mysql56/sql/sql_audit.cc:491
general_class_handler(THD *, uint, typedef __va_list_tag __va_list_tag *) (thd=0x7fdcc7ff6000, event_subtype=&value optimized out&, ap=&value optimized out&)
at /mysql56/sql/sql_audit.cc:90
0x41b1 in mysql_audit_notify (thd=0x7fdcc7ff6000, event_class=0, event_subtype=3) at /mysql56/sql/sql_audit.cc:217
0xe1543 in mysql_audit_general (command=&value optimized out&, thd=0x7fdcc7ff6000, packet=&value optimized out&, packet_length=1) at /mysql56/sql/sql_audit.h:196
dispatch_command (command=&value optimized out&, thd=0x7fdcc7ff6000, packet=&value optimized out&, packet_length=1) at /mysql56/sql/sql_parse.cc:1793
0xa908d in do_handle_one_connection (thd_arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:990
0xa91c2 in handle_one_connection (arg=&value optimized out&) at /mysql56/sql/sql_connect.cc:906
0x9337 in pfs_spawn_thread (arg=0x7fdccb3be840) at /mysql56/storage/perfschema/pfs.cc:1860
#10 0x00007fdd46a249d1 in start_thread () from /lib64/libpthread.so.0
#11 0x00007fdd459a38fd in clone () from /lib64/libc.so.6
Query动作审计工作流程如上图,需要留意的是在语句执行前和执行后都有审计,通过上面的宏MYSQL_AUDIT_GENERAL_LOG和MYSQL_AUDIT_GENERAL_RESULT告诉Audit是执行前后进入的审计模块,基于此可以做一些更细分的功能。当执行结果有错时,通过MYSQL_AUDIT_GENERAL_ERROR来告知审计模块。
实例流程演示:
文字描述抽象,下面以一个select 语句实例演示下审计流程。
select *from t2;
当语法解析重写完成后,在execute执行前,会在LOGGER::log_command()中进入审计流程,代码中增加了处理审计逻辑代码:
mysql_audit_general_log(thd, command_name[(uint) command].str,
command_name[(uint) command].length,
query_str, query_length);
不论审计插件有没有安装都会进入这个函数,进入这个函数第一件事就会判断是否有审计插件,没有安装审计会直接跳过所有审计逻辑,这个函数就是上面第3点介绍的获取有用值两个内联函数之一 : mysql_audit_general_log
static inline
void mysql_audit_general_log(THD *thd, const char *cmd, uint cmdlen,
const char *query_str, size_t query_len)
if (mysql_global_audit_mask[0] & MYSQL_AUDIT_GENERAL_CLASSMASK)
//没装插件则跳过
//取得有用的各种值
mysql_audit_notify(thd, MYSQL_AUDIT_GENERAL_CLASS, MYSQL_AUDIT_GENERAL_LOG,
error_code, time, user, userlen, cmd, cmdlen, query.str,
query.length, clientcs, rows, sql_command, host,
external_user, ip);
//把有用的值往下传
在mysql_audit_notify会判断下是连接语句还是通用语句,然后调用对应的函数,如本例中会调通用语句处理接口general_class_handler
static void general_class_handler(THD *thd, uint event_subtype, void *tb, va_list ap)
mysql_event_
event.general_query= va_arg(ap, const char *);
event.general_query_length= va_arg(ap, unsigned int);
event.general_charset= va_arg(ap, struct charset_info_st *);
event.general_rows= (unsigned long long) va_arg(ap, ha_rows);
event.general_host= va_arg(ap, MYSQL_LEX_STRING);
event_class_dispatch(thd, MYSQL_AUDIT_GENERAL_CLASS, &event);
在general_class_handler函数之后,语句的信息就已经有了,保存在event结构中,上面语句在gdb中 实际打印的结果如下:
(gdb) p *(mysql_event_general *)event
$2 = {event_subclass = 0, general_error_code = 0, general_thread_id = 1, general_user = 0x7fd27aa51050 &root[root] @ localhost [127.0.0.1]&,
general_user_length = 34, general_command = 0xc76b19 &Query&, general_command_length = 5,
general_query = 0x7fd1f5c1a010 &select *from t2&, general_query_length = 15, general_charset = 0x12e27e0, general_time = ,
general_rows = 0, general_host = {str = 0xbe4d2f &localhost&, length = 9}, general_sql_command = {str = 0xd29b04 &select&, length = 6},
general_external_user = {str = 0xc70579 &&, length = 0}, general_ip = {str = 0x7fd1f5c1.0.1&, length = 9}}
可以非常清楚的看到语句内容,时间,类型等信息。
当 execute执行后,会在 dispatch_command () 函数尾部会调用审计接口:
if (!thd-&is_error() && !thd-&killed_errno())
mysql_audit_general(thd, MYSQL_AUDIT_GENERAL_RESULT, 0, 0);
mysql_audit_general(thd, MYSQL_AUDIT_GENERAL_STATUS,
thd-&get_stmt_da()-&is_error() ?
thd-&get_stmt_da()-&sql_errno() : 0,
command_name[command].str);
这里调用的是 mysql_audit_general,也是上面第3点介绍的获取有用值另一个内联函数,功能和mysql_audit_general_log相同,带log的为执行前调,不带log的为执行后调,区别在于记录的值略有差异,如执行前的值里没错误状态,执行后的值是有的,成功为0,失败为对应的错误代码。在mysql_audit_general之后流程和上面mysql_audit_general_log一样,不再介绍。
这两个内联函数处理的是Query语句,另外有三个宏MYSQL_AUDIT_NOTIFY_CONNECTION_CONNECT、MYSQL_AUDIT_NOTIFY_CONNECTION_DISCONNECT、MYSQL_AUDIT_NOTIFY_CONNECTION_CHANGE_USER是处理登陆、登出、换用户时用,功能和前两个函数大同小异,不再赘述。
审计进一步思考
审计是记录历史动作,但有些情况下,光历史记录远远不够。对于应用系统,很多语句都是都是绑定参数运行的,直观审计到的就是一条条带问号的语句,不能看到实际动作,若要还原真实语句,需要联系上下语句分析,非常不便,这就要求审计有一定的语句还原拼接功能,把参数和内容放一起展示。更进一步,假如有人非常了解审计系统,知道审计记录不会永久存放,在某时刻建一个带有破坏性的存储过程,等超期不再保留建立过存储程记录后,执行并删除,真实运行动作将无法通过审计得知,对这类操作,就有了反向追踪运行内容语句的需求,尤其在金融行业中。
另一方面,审计用户也应该是个特权用户,和超级用户互相制约。审计用户应该独立出来,有超级用户不能修改的帐号密码,专门用于审计相关操作,如开关审计,设置审计策略,查阅审计结果,超级用户不能干涉这些动作,保证审计记录的真实性和完整性。审计用户账号应该掌握在客户最核心人手中,以对超级用户活动形成制衡,更加保证数据的安全。
再深入一层,有客户需求可能希望不同用户看到的内容不一样,对敏感数据根据不同用户进行自动过滤,严格来说这已经不再属于审计范围了,属于数据安全问题,需要有更严密的处理逻辑来实现。对于数据库产品来说,基于BLP模型的强制访问控制(MAC)是实现该需求的方法之一,该模型关键在于权限标签,对主客体进行标识,每个主体客体都有自己的标签,权限高的可访问修改低的对象,低权限的不能看到高权限的内容,对每个表、列甚至行都打上标签,对内容过滤可以做到列级直至行级。
原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。
如有侵权,请联系 zhuanlan_ 删除。
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)

我要回帖

更多关于 保险行业公有云 的文章

 

随机推荐