让你久等了!《开源安全运维平台OSSIM疑难解析--提高篇》9月上市
作者:互联网
本书主要内容
本书介绍了开源OSSIM系统安装部署以及运维管理的若干疑难问题,共分12章。
第1章,***检测Snort与Suricata,讲解***检测系统Snort和Suricata在OSSIM系统中的应用问题。
第2章,基于主机的***检测——OSSEC,讲解在HIDS-OSSEC部署过程中常见的故障并进行解答。
第3章,漏洞扫描OpenVAS,讲解在漏洞扫描OpenVAS服务器安装过程中遇到的疑难问题。
第4章,Memcache、RabbitMQ与Redis协同工作,讲解Memcache、RabbitMQ和Redis等缓存和中间件系统在系统维护与管理中遇到的配置难点及疑点问题。
第5章,日志采集与分析,讲解利用OSSIM进行日志采集和分析的问题。
第6章,关联分析技术,讲解OSSIM关联分析技术问题。
第7章,资产管理,讲解利用OSSIM进行资产管理的问题。
第8章,网络流量与主机高可用监控,讲解利用Ntop和Nagios进行流量管理的问题。
第9章,NetFlow流量分析,讲解利用NetFlow为OSSIM进行流量分析的问题。
第10章,OSSIM前端汉化技巧,讲解OSSIM前端汉化技巧。
第11章,压力测试及性能监控,讲解利用开源工具对OSSIM进行性能测试以及调优的技巧问题。
第12章,数据包抓包分析技巧,讲解抓包分析过程中的疑难问题。
目 录
第1章 ***检测Snort与Suricata 1
Q001 Snort检测规则存储在何处?如果触发规则Snort将会产生几种动作类型? 1
Q002 Snort 2.9版本中主要有哪些预处理插件,各有什么功能? 2
Q003 如何利用Scapy测试Snort规则? 2
Q004 Snort有几种工作模式,各有什么特点? 4
Q005 Snort通过什么规则来检测可疑净载荷? 12
Q006 Snort如何检测Chargen/echo DOS***? 12
Q007 如何使用Snort的Packet logger模式将捕获到的信息记录到磁盘目录下? 13
Q008 在同一个网段内如何部署多个IDS? 14
Q009 手动编译安装Snort时,需要做何准备工作? 14
Q010 如何在Linux下编译安装Snort? 15
Q011 如何将Snort告警存入MySQL数据库? 19
Q012 如何搭建基于BASE的可视化***检测系统? 23
Q013 OSSIM的PHP IDS组件采用什么方法来接收和分析数据? 28
Q014 IP碎片***对Snort会产生哪些危害? 29
Q015 请解释Snort规则中msg、content、threshold、reference等选项的含义 29
Q016 OSSIM中如何管理引用类型? 31
Q017 外部引用在OSSIM安全事件管理中起到什么作用? 32
Q018 OSSIM5中的Suricata支持PF_RING吗? 34
Q019 如何利用DARPA 2000数据集重构***场景? 34
Q020 在Snort中用什么参数查看数据链路层的包头信息? 35
Q021 Snort的输出插件分为几类,各有什么作用? 36
Q022 sid-msg.map和gen-msg.map有什么区别? 41
Q023 OSSIM 4.12检测器中Snort状态是DOWN,而Suricata是UP,这种状态正常吗?
它们能同时为状态UP吗? 42
Q024 网络主动探测与被动探测有什么区别? 43
Q025 如何找出/var/log/suricata目录下24小时内访问过的日志并且找到后立即删除? 43
Q026 Snort传感器部署在企业网的什么位置? 44
Q027 Suricata与Snort有何区别? 44
Q028 如何调整Suricata同时处理数据包的数量? 45
Q029 如何设置Suricata的运行模式? 45
Q030 Suricata事件输出分为哪几种? 46
Q031 当Suricata检测到可疑数据包时,以二进制格式将其存储到什么文件?通过什么
程序读取? 47
Q032 经过多个HTTP代理服务器后的IP将会隐藏(记录代理服务器的IP),Suricata
通过哪个参数来记录真实客户机的IP? 47
Q033 若让Suricata记录所有HTTP日志,则该如何修改配置文件? 47
Q034 如何保存经Suricata检测的所有数据包? 48
Q035 如何启用Suricata服务的Debug日志? 48
Q036 如何将Suricata的告警信息输出到Syslog文件中? 48
Q037 数据包在Suricata检测引擎中是如何匹配的? 48
Q038 Suricata检测引擎的配置属性分为几种? 49
Q039 在一台八核的OSSIM服务器上如何改善Suricata处理性能? 49
Q040 在高速复杂网络环境中,如何提高Suricata规则检测时的数据分片传输效率? 49
Q041 在Suricata的stream引擎中对数据包重组需要占用CPU资源,为了避免无限制的
重组数据包,应该修改什么参数对其进行限制? 51
Q042 Suricata的日志文件suricata.log保存在什么路径下?该路径由什么配置文件
定义? 51
Q043 OSSIM下Suricata抓包方式采用AF_PACKET还是PF_RING? 51
Q044 如何定制Suricata规则? 52
Q045 如何更新AlienVault NIDS规则和签名? 53
Q046 Snort可作为IPS使用吗?如何部署? 54
Q047 在OSSIM 3中PF_RING有哪几种工作模式? 55
Q048 如何手工修改OSSIM系统的Snort规则? 55
Q049 如何启用新的ET规则? 55
Q050 如何配置系统中的无线***系统? 56
Q051 OSSIM平台上的iptables模块在什么位置? 62
Q052 举例说明OSSIM如何发现Nmap扫描行为? 62
Q053 AIDE有什么作用? 64
Q054 如何在CentOS Linux中安装AIDE? 65
Q055 如何在OSSIM中安装AIDE? 66
本章测试 68
第2章 基于主机的***检测——OSSEC 73
Q056 OSSEC Agent主要由哪些进程组成,各有什么作用? 73
Q057 简述OSSEC Server/Agent工作流程及其关键进程的作用。 74
Q058 什么是Agent和Agentless监控方式? 74
Q059 如何测试OSSEC规则? 75
Q060 由于磁盘空间满,造成OSSEC进程停止故障分析的案例。 75
Q061 画出分布式环境下OSSEC和Agent进行通信的数据流图 77
Q062 在Linux环境中如何安装OSSEC Agent? 77
Q063 Linux下安装OSSEC Agent报错时应如何解决? 80
Q064 Nmap扫描和OpenVAS扫描有什么区别? 81
Q065 OSSEC事件报警处理流程是什么? 81
Q066 如何在Windows 8环境下安装OSSEC Agent? 82
Q067 用于配置OSSEC Agent的文件位于何处? 86
Q068 出现OSSEC Agent无法连接服务器时,该如何处理? 86
Q069 Windows 2012如何安装OSSEC Agent? 87
Q070 如何在Web页面查看OSSEC Agent状态? 92
Q071 OSSEC日志存储在什么位置? 93
Q072 WebUI中OSSEC调用规则的后台文件位于何处? 94
Q073 如何监听OSSEC Server和Agent之间的数据通信? 95
Q074 Windows平台上OSSEC Agent已安装,但在OSSIM Server中没有接收到日志,
怎么解决? 96
Q075 OSSEC客户端联机故障排除技巧。 96
Q076 在/var/log/suricata/目录下 JSon 文件中各个字段表示什么含义? 96
Q077 解释OSSEC报警输出插件中特定字符的含义。 97
本章测试 98
第3章 漏洞扫描OpenVAS 102
Q078 OpenVAS的扫描日志存放在何处? 102
Q079 CVE、CNCVE、NVD、OSVDB、BugTraq、 SecurityFocus表示什么含义? 102
Q080 OpenVAS主要进程和配置文件有哪些? 104
Q081 OpenVAS脚本采用什么语言编写?请描述脚本加载过程? 105
Q082 OpenVAS扫描初期如何加载脚本? 106
Q083 漏洞扫描器中的脚本如何对目标进行安全检测? 106
Q084 OpenVAS的扫描器openvas-scanner调用的私钥证书文件位于何处,证书由什么
程序创建? 106
Q085 OpenVAS服务器端有几个主要模块,它们之间工作流程如何? 107
Q086 OpenVAS扫描器工作状态出现Failed提示,这表示什么含义? 108
Q087 OpenVAS故障排除方法实例。 108
Q088 什么情况下应终止漏洞扫描任务? 111
Q089 采用Nessus与OpenVAS扫描效果有什么区别? 112
Q090 OSSIM使用OpenVAS扫描系统时,为何还保留Nessus规则? 113
Q091 使用alienvault-update命令对系统升级之后出现OpenVAS无法正常工作,怎么
解决? 114
Q092 有无法连接到漏洞扫描器故障时,如何解决? 114
Q093 漏洞扫描时间过短会发生哪些问题? 115
Q094 扫描资源池之外的机器会出现什么情况?如何处理? 115
Q095 如何手动更新CVE库? 116
Q096 OSSIM系统中设置多长时间的漏洞扫描周期合适? 116
Q097 OpenVAS导出报告中用于漏洞分类使用了几种颜色,各表示什么含义? 117
Q098 试比较X-Scan、Fluxay、Nessus及OpenVAS这几款扫描软件的区别? 118
本章测试 119
第4章 Memcache、RabbitMQ与Redis协同工作 122
Q099 为何单线程的Redis速度还能这么快? 122
Q100 Memcache的作用是什么? 122
Q101 如何增大Redis运行内存? 123
Q102 如何安装MemCached监控探针? 124
Q103 OSSIM为什么采用消息中间件? 125
Q104 RabbitMQ在OSSIM系统中起到什么作用? 127
Q105 如何查询OSSIM服务器上的消息队列以及连接信息? 127
Q106 如何重置RabbitMQ节点? 127
Q107 如何查看已启用的RabbitMQ插件? 128
Q108 OSSIM中的RabbitMQ如何打开Web管理后台? 128
Q109 OSSIM为何要引入Redis内存数据库,采用key/value存储? 130
Q110 OSSIM Server使用RabbitMQ有何优势? 131
Q111 如何查看Redis服务器实时转储收到的请求? 132
Q112 如何进入/退出erlang shell界面? 132
本章测试 133
第5章 日志采集与分析 135
Q113 在OSSIM平台上日志可视化体现在何处? 135
Q114 iptables日志有几种记录形式?各有什么区别? 136
Q115 如何将iptables日志转发到指定文件中? 137
Q116 如何在Web界面查看iptables事件? 139
Q117 如何发现日志时间被篡改? 141
Q118 为什么使用GNS3? 142
Q119 模拟环境中使用GNS3有哪些短板? 142
Q120 哪些Cisco IOS镜像适合GNS3仿真环境? 143
Q121 GNS3如何模拟三层交换机? 143
Q122 如何将GNS3与本地网卡桥接? 143
Q123 如何用OSSIM采集Squid日志? 144
Q124 如何通过Snare将Windows事件转发至Linux日志采集服务器? 145
Q125 如何用Syslog-Slogger测试Syslog服务器? 148
Q126 如何用logger发送测试日志? 149
Q127 如何模拟Syslog流量? 149
Q128 WMI与Snare有什么区别? 151
Q129 简述OSSIM日志处理流程。 151
Q130 原始安全事件需要具备哪些属性? 152
Q131 原始日志和归一化事件有什么不同? 154
Q132 将Windows日志转换为Syslog日志的工具有哪些? 154
Q133 如何选择合适的日志级别? 155
Q134 如何将Windows日志转换Syslog? 156
Q135 如何利用Evtsys工具采集Windows日志并转发到Syslog服务器? 157
Q136 如何收集Apache日志? 158
Q137 为什么将Zabbix服务器启用Syslog消息转发后,服务器会出现卡顿的现象? 159
Q138 如何利用Rsyslog协议采集日志? 159
Q139 如何用Rsyslog将日志发送到不同的日志收集器中? 160
Q140 如何在OSSIM中启用SNMP? 160
Q141 如何让Linux客户机通过Syslog 发送日志到OSSIM Server? 161
Q142 alerts.log中突然产生大量日志,应如何处理? 162
Q143 Syslog中的每条消息最大长度是多少? 162
Q144 在OSSIM企业版中如何从WebUI中导出日志? 162
Q145 安全审计要求日志保存时间是多久? 163
Q146 如何通过WMI方式接收日志? 163
Q147 如何将VsFTP日志发送到OSSIM? 164
Q148 如何将客户端sudo日志重定向到服务器端指定的 文件中? 166
本章测试 167
第6章 关联分析技术 169
Q149 OSSIM的关联分析如何工作? 169
Q150 安全事件关联分析的目的是什么? 170
Q151 简述安全事件归一化处理的步骤。 171
Q152 如何通过关联分析来判断***? 172
Q153 OSSIM如何将网络安全事件进行分类? 172
Q154 举例说明OSSIM关联分析指令的结构? 176
Q155 如何新建关联指令? 177
Q156 如何查看交叉关联规则? 181
Q157 在交叉关联规则中显示数据源及插件信息时为什么比较慢? 181
Q158 Risk、Priority、Reliability 3个参数在关联分析时有何关联? 182
Q159 在仪表盘中Risk显示的Risk Metric C、A值表示什么含义? 183
Q160 对主机风险进行评估时事件属性Risk的C、A值会发生哪些变化?这种变化
反映出什么问题? 186
Q161 OSSEC与Snort事件能合并吗? 187
Q162 如何聚合OSSEC报警信息? 188
Q163 如何判断OSSEC产生的同类报警? 189
Q164 如何在WebUI配置关联指令? 190
Q165 详细说明OSSIM关联规则中的属性。 194
Q166 SIEM控制台如何将不同数据源的事件进行聚合处理? 196
Q167 举例说明OSSIM关联规则树的含义。 197
Q168 OSSIM关联分析引擎分为几种类型?可靠性和风险值在里面起到了什么
作用? 200
Q169 如何理解安全事件的交叉关联分析? 201
Q170 风险评估三要素是什么,它们之间的关系如何? 201
Q171 为什么说可靠性的值是动态变化的? 202
Q172 内网一台邮件服务器的资产值设定为5,而Priority和Reliability的默认值
设置为3,这台服务器Risk值为多少? 203
Q173 OSSIM关联引擎有何作用,工作过程怎样? 203
本章测试 205
第7章 资产管理 208
Q174 在OSSIM平台中需要对资产的哪些特征进行监控? 208
Q175 如何为资产赋值? 209
Q176 OSSIM中资产列表位于什么位置? 210
Q177 资产扫描有6个选项,各表示什么含义? 210
Q178 如何设置Nmap扫描频率? 211
Q179 为什么扫描192.168.1.0/24网段内的资产,结果中却包含10.0.0.0/8网段的机器? 211
Q180 如何通过CSV文件导入资产信息? 212
Q181 如何设置OCS检测频率? 214
Q182 调节资产的可靠性值会对Risk产生什么影响? 214
Q183 在OSSIM5的Web UI中如何批量删除资产? 216
Q184 在OSSIM中进行资产扫描时,如果定义网段不当则会出现“Scanning network
(172.16.0.0/12) with local Nmap,please wait...”提示,并且扫描一直停止,如何
解决? 217
Q185 OSSIM里Prads程序的作用是什么? 218
Q186 Prads启动失败如何解决? 218
Q187 当监控资产过多时,OSSIM系统页面为什么刷新非 常慢? 219
Q188 如何为资产启用插件? 219
Q189 在OSSIM中安装iTop的详细步骤包括哪些? 221
Q190 如何将OSSIM产生的告警转发到iTop的CMDB? 228
Q191 如何限制iTop上传文件的大小? 230
Q192 如何在外网访问iTop站点? 230
Q193 在iTop安装过程中若出现“iTop is read-only iTop is temporarily frozen,please
wait…”系统提示,如何处理? 230
本章测试 230
第8章 网络流量与主机高可用监控 232
Q194 在OSSIM中Monit与Nagios服务有什么区别? 232
Q195 RRDTool代表什么含义,它在OSSIM中起到什么作用? 232
Q196 RRDTool绘图流程包括哪些内容? 233
Q197 如何用Nagios 监控MySQL? 234
Q198 如何在命令行下使用Nagios插件? 234
Q199 如何通过Nagios插件来检测负载? 235
Q200 如何利用Nagios插件来检查内存和交换分区? 235
Q201 添加Nagios监控主机后,打开WebUI报错该如何处理? 236
Q202 Nagios中显示的返回码包括哪几种,各表示什么含义? 237
Q203 检测网络流量时Ntop与SNMP相比有什么优势?Ntop流量采集方式有什么
特点? 238
Q204 网络中数据包大小变化的背后隐藏了哪些玄机?Ntop如何统计流量的变化? 238
Q205 用Ntop分析网络数据时,需要在交换机上设置端口镜像吗? 240
Q206 如何重置Ntop的admin密码? 241
Q207 在OSSIM系统中多传感器的情况下如何选择Ntop的默认传感器? 241
Q208 打开Ntop时出现“Sensor not available”提示,应如何处理? 242
Q209 打开Ntop主界面缓慢,如何处理? 242
Q210 如何设置Ntop中的流向统计功能? 243
Q211 若在分布式Sensor中设置多块网卡,在使用Ntop时提示“Sensor not available please
select for the above dropdown”,该如何处理? 244
Q212 在Ntop设置Local Network Traffic Map时出现错误提示,应如何处理? 244
Q213 如何在OSSIM中安装Ntopng? 244
Q214 蠕虫爆发时其流量协议以及数据包大小在分布上都会发生哪些异常,Ntop如何
感知这些变化? 245
Q215 如何监控OSSIM Server和Sensor中的磁盘、网络、系统进程、Postfix? 247
Q216 如何通过Ntop显示每个监控服务器的IP流量大小? 249
Q217 如何采用phpMyAdmin工具监控OSSIM服务器的流量? 250
本章测试 251
第9章 NetFlow流量分析 252
Q218 OSSIM服务器中的NetFlow模块由哪几个工具组成,分别有什么作用? 252
Q219 nfdump模块由那些进程组成?各有什么功能? 252
Q220 NetFlow数据流存储路径在什么配置文件中定义,修改配置后若未生效如何
处理? 253
Q221 Sensor中如何启用NetFlow功能? 253
Q222 在OSSIM分布式系统中NetFlow数据存储在Server端,还是Sensor端? 254
Q223 OSSIM系统中如何分析NetFlow数据包? 254
Q224 “LIST LAST 500 SESSIONS、TOP 10 SRC IPS、TOP 10 DST IPS”等参数表示
什么含义? 255
Q225 分布式环境下如何监测NetFlow数据流? 255
Q226 NetFlow采集数据时需要在交换设备上设置端口 镜像吗? 258
Q227 相对于基于Payload的恶意代码检测方法而言,NetFlow检测方法有何优势? 259
Q228 如何清理NetFlow采集的数据? 259
Q299 NetFlow采集的抽样数据可保存多长时间? 260
Q230 如何通过命令行读取NetFlow数据? 261
Q231 NetFlow数据集能显示到Web UI的仪表盘吗?如何操作? 261
Q232 在分布式部署OSSIM环境中,多个Sensor之间如何区别来自不同Sensor的
NetFlow数据? 262
Q233 OSSIM平台上利用NetFlow收集路由器流量会对路由器正常工作造成影响吗? 263
Q234 OSSIM平台上将NetFlow数据与谷歌地图结合有什么优点? 263
Q235 常见的流量监测技术有哪些? 264
Q236 NetFlow能否检测出SYN Flooding(泛洪)***? 264
Q237 在nfsend进程中出现“Connection refused”报错该如何处理? 265
Q238 OSSIM如何分析网络异常行为? 266
Q239 sFlow协议有什么功能,哪些软件可以分析出sFlow的数据包? 269
Q240 sFlow与NetFlow的协议有何区别? 269
Q241 举例说明如何排除NetFlow运行故障。 270
本章测试 274
第10章 OSSIM前端汉化技巧 277
Q242 OSSIM 5.4中的Web UI菜单调用源码位于何处? 277
Q243 Locale的作用是什么,如何查询和修改locale? 279
Q244 OSSIM中的WebUI菜单如何汉化? 279
Q245 OSSIM汉化版需要修改源代码吗? 284
Q246 对于WebUI汉化后的界面,若使用IE10浏览器应该如何选择编码方式才能
显示中文? 284
Q247 在OSSIM终端界面上如何能显示和输入中文字符? 285
Q248 如何查看PHP中安装了哪些扩展模块?如何查询PHP版本信息? 286
Q249 Windows环境下使用什么工具编辑PHP文件,需要注意些什么? 286
Q250 SecureCRT远程连接到OSSIM系统,直接修改汉化PHP代码时,在浏览器上
显示都是乱码? 287
Q251 如何修改Favicon图标? 287
Q252 如何修改Logo图标? 287
Q253 如何修改WebUI中的Title标识? 288
Q254 如何修改箭头所指示的标签? 289
Q255 如何更换OSSIM系统的WebUI背景? 290
Q256 OSSIM系统中的ADODB包有什么作用?其配置文件在什么位置? 290
Q257 在OSSIM WebUI仪表盘里,雷达图主要显示的传感器收集事件的数量,在
该雷达图中,可以描述多少个不同的Sensor的信息? 290
Q258 椭圆框中的文字在什么位置修改? 291
Q259 如何将Loading Widget修改成中文字符呢? 292
Q260 如何修改OSSIM的WebUI菜单? 293
Q261 如何修改WebUI仪表盘的名称,然后涂红圈内的字符? 296
Q262 若Alarm数据每隔300s刷新一次,如何修改刷新时间? 297
Q263 OSSIM中的WebUI如何实现动态加载页面? 298
Q264 如何将UTC时间转化为Local时间? 299
Q265 jquery插件中的/usr/shre/ossim/www/js/geo_autocomplete.js脚本有什么
作用? 299
Q266 脚本jquery.dynatree.js有什么作用?发生故障会影响WebUI的哪些功能? 299
本章测试 300
第11章 压力测试及性能监控 303
Q267 如何利用Netperf进行网络性能测试? 303
Q268 如何使用I/O分析工具dstat? 304
Q269 如何用sysbench测试数据库? 305
Q270 如何用dd工具测试系统I/O性能? 306
Q271 如何使用OSSIM自带的性能测试工具(alienvault- system-benchmark.sh)? 307
Q272 如何测试系统的IOPS? 308
Q273 当OSSIM服务器产生大量套接字连接时,如何查看全局统计信息? 309
Q274 OSSIM系统空间不足时如何查找大型文件? 310
Q275 检测OSSIM系统整体状态的命令行工具。 311
Q276 如何使用图形化监控工具nmon? 312
Q277 监控Linux系统资源和进程的工具atop 312
Q278 如何找出最消耗内存的进程? 313
Q279 如何测试OSSIM WebUI页面的响应速度? 315
Q280 如何对OSSIM系统目录的大小进行排序? 315
Q281 OSSIM的流量监控工具iftop的使用。 316
Q282 如何利用Apache自带的工具ab测试OSSIM响应速度? 318
Q283 如何详细了解OSSIM系统进程的网络带宽占用情况? 319
Q284 OSSIM下如何使用nload软件监控流量? 319
Q285 为OSSIM系统进行压力测试tcpreplay。 320
Q286 OSSIM中如何应用hping3进行测试? 321
Q287 OSSIM下如何安装sendip工具? 323
Q288 OSSIM中如何安装Smokeping? 325
Q289 如何在 OSSIM Server上安装Cacti? 327
Q290 如何在OSSIM Sensor上安装Zabbix? 329
Q291 如何利用Munin工具进行性能监控? 330
Q292 如何安装Glances工具? 331
本章测试 333
第12章 数据抓包分析技巧 335
Q293 如何预防网络嗅探? 335
Q294 SPAN那么技术有何局限? 336
Q295 采集数据流分为几类?有什么特点? 337
Q296 通过Traffic Capture抓包的数据存放在什么位置? 337
Q297 若在千兆网络环境中存储30天的完整抓包数据,需要多大硬盘空间? 338
Q298 协议分析包括哪些内容,常用分析工具有哪些? 338
Q299 如何用tcpdump监听端口间的数据通信? 339
Q300 怎么用tcpdump分析Syslog数据包? 339
Q301 如何将tcpdump抓包存入文件? 339
Q302 采用OSSIM监控千兆网络环境会遇到哪些问题? 340
Q303 SecureCRT远程连接到OSSIM进行抓包,如何显示从网卡eth0获取的除了TCP 22
端口之外的全部流量? 340
Q304 如何利用Traffic Capture功能远程排除网络故障? 340
Q305 在使用OSSIM WebUI的Traffic Capture功能时提示“This traffic capture is empty”,应如何处理? 341
Q306 Traffic Capture分析数据包时如何对协议进行过滤? 341
Q307 Traffic Capture数据包捕获的时间范围是多少? 342
Q308 分析人员需要掌握的Traffic Capture数据包过滤技巧有哪些? 342
本章测试 343
标签:运维,Suricata,如何,开源,Snort,日志,OSSEC,OSSIM 来源: https://blog.51cto.com/chenguang/2427909