首页 文章 精选 留言 我的

精选列表

搜索[诊断自动化],共10002篇文章
优秀的个人博客,低调大师

如何诊断SQL数据?

当一个SQL出现性能问题时,可以使用SQL_TRACE 或者 10046事件来跟踪SQL,通过生成的trace来了解SQL的执行过程。我们在查看一条SQL的执行计划的时候,只能看到CBO 最终告诉我们的执行计划结果,但是不知道CBO 是根据什么来做的。如果遇到了执行计划异常,可以借助Oracle 10053事件进行跟踪。10053事件是oracle提供的用于跟踪sql语句成本计算的内部事件,它能记载CBO模式下oracle优化器如何计算sql成本,生成相应的执行计划。 通过session级别跟踪: ALTER SESSION SET EVENTS='10053 trace name context forever, level 1'; 或ALTER SESSION SET EVENTS='10053 trace name context forever, level 2'; 执行相关sql explain plan for select count(*) from obj$; ALTER SESSION SET EVENTS '10053 trace name context off'; 对特定session启用跟踪: 通过调用 DBMS_SYSTEM. SET_EV包实现 PROCEDURE SET_EV Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SI BINARY_INTEGER IN SE BINARY_INTEGER IN EV BINARY_INTEGER IN LE BINARY_INTEGER IN NM VARCHAR2 IN 查询v$sessiowww.pizei.comn 视图获取进程信息 SQL> select sid,serial#,username from v$session where username is not null; SID SERIAL# USERNAME 125 25 SYS 执行跟踪 exec dbms_system.SET_EV(125,25,10053,1,''); 结束跟踪 exec dbms_system.SET_EV(125,25,10053,0,''); 查询系统对应session trace文件 select value from v$diag_info where name = 'Default Trace File'; 经过开发人员确认该sql在测试库(LINUX+ 12.2.0.1 单机环境)执行只需要几秒即可(数据量相差不大)完成,其中bs_loan_card_addition、bs_loan_card、bs_loan_contract_addition三张表的数据量都在200万行左右。 获取到生产环境该sql执行计划如下: 测试环境该sql执行计划如下: 首先怀疑统计信息不准确导致CBO在页游访问BS_LOAN_CARD表的时候选择错误,本应该选择BS_LOAN_CARD_I3索引(因为CUSTOMER_NO"='1000193229’的选择性很好)而这也是开发设计这个索引的原因。但结果是选择了BS_LOAN_CARD_I0索引(对应的是BS_LOAN_CARD.LOAN_CARD_NO,该列唯一的),而过滤条件根本没有这个列,他只是作为关联条件与bs_loan_card_addition表进行连接。 因此首先检查统计信息,意外发现BS_LOAN_CARD.LOAN_CARD_NO,列上居然存在一个HYBIRD类型的直方图,理论上来说该值的唯一性非常好,不应该收集直方图,因此直接删除了该列上的直方图,再次检查发现执行计划仍未改变。 尝试使用10053对该SQL执行计划的产生过程进行跟踪,发现如下信息: 而且结合执行计划 这个执行计划简单理解来说就是首先对BS_LOAN_CARD_ADDITION进行全表扫描,然后在这个所得的结果集里面每一行的LOAN_CARD_NO列拿出来到BS_LOAN_CARD里面匹配,这就是第6部里面出现了一个"B"."LOAN_CARD_NO"=:B1原因,而这个就是oracle改写后的结果。而从其选择对BS_LOAN_CARD_ADDITION进行全表扫描就不可避免的导致了效率会很低。而且其后的rows 估算为2444K,这个是贴合实际的,所以之前的删除直方图不会有结果。而测试上的改写结果明显跟这个不一样,排除统计信息的影响,那么就开始怀疑cbo内部的算法选择问题,再结合那个可疑 的 “CBQT bypassed forquery block UPD$1 (#0): Disabled by parameter. ”提示,怀疑优化器参数在两个环境中有区别, 一:_optimizer_cost_based_transformation设为linear(默认值),其有如下值: "exhaustive", "iterative","linear", "on", "off"。 本例中该参数就是默认值,该参数可控制是否允许CBO进行改写 二:_optimizer_squ_bottomup 参数值为true(默认值). 而生产环境中恰好相反为false,所以生产的trace中会有Disabled by parameter 字眼 _optimizer_squ_bottomup enables unnesting of subquery in a bottom-upmanner; 该参数默认为true,即开启子查询自底向上的展开功能(也就是类似unnest hint的功能),unnest称之为对子查询展开,顾名思义,就是不让子查询孤单地嵌套(nest)在里面。

优秀的个人博客,低调大师

DB Server 磁盘IO诊断

今日 zabbix 报警磁盘IO利用率达到90%。 又激动又担心,很久没处理故障啦,这次的故障应该很快会修复吧。。。 首先查看磁盘基本情况: iostat -x 1 avg-cpu: %user %nice %system %iowait %steal %idle 1.57 0.00 2.75 37.65 0.00 58.04 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 10.00 0.00 19.00 0.00 2240.00 235.79 1.91 104.21 0.00 104.21 52.21 99.20 avg-cpu: %user %nice %system %iowait %steal %idle 2.84 0.00 1.75 20.09 0.00 75.33 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 4.00 0.00 102.00 0.00 1832.00 35.92 5.03 47.37 0.00 47.37 9.80 100.00 avg-cpu: %user %nice %system %iowait %steal %idle 1.92 0.00 2.24 30.13 0.00 65.71 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.00 0.00 9.00 0.00 36.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 17.00 1.00 31.00 4.00 1596.00 100.00 2.38 54.75 72.00 54.19 30.75 98.40 avg-cpu: %user %nice %system %iowait %steal %idle 0.35 0.00 0.35 30.56 0.00 68.75 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 24.00 0.00 304.00 25.33 2.46 133.83 0.00 133.83 41.67 100.00 CPU iowait 达到 20%左右, IO利用率 几乎全部100%。 首选确定没有新的功能上线, SQL都是审核过的, 查看show processlist 语句大多处于 updating 状态。 iotop 查看 具体进程的情况: (Iotop 使用 Python 语言编写而成,要求 Python 2.5(及以上版本)和 Linux kernel 2.6.20(及以上版本)) 817 be/3 root 0.00 B/s 0.00 B/s 0.00 % 43.37 % [jbd2/vdb-8] 14841 be/4 mysql 0.00 B/s 1971.36 K/s 0.00 % 37.46 % mysqld --defaults-file=/usr/local/mysql/mysql.cnf --basedir=/usr/local/mysql/ --datadir=~sr/local/mysql/data//10-4-7-99.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306 21497 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 7.27 % mysqld --defaults-file=/usr/local/mysql/mysql.cnf --basedir=/usr/local/mysql/ --datadir=~sr/local/mysql/data//10-4-7-99.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306 14837 be/4 mysql 0.00 B/s 231.02 K/s 0.00 % 0.00 % mysqld --defaults-file=/usr/local/mysql/mysql.cnf --basedir=/usr/local/mysql/ --datadir=~sr/local/mysql/data//10-4-7-99.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306 14832 be/4 mysql 0.00 B/s 261.82 K/s 0.00 % 0.00 % mysqld --defaults-file=/usr/local/mysql/mysql.cnf --basedir=/usr/local/mysql/ --datadir=~sr/local/mysql/data//10-4-7-99.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306 可以确定 问题出在操作系统上, 我们使用的云主机,jdb2进程 应该交给云平台服务商来处理啦。 结果问题是:我们多个DB是存在于同一个母机上,IO竞争比较严重。。哎可恶的云计算, 云中的mysql 可以参考这边文章,http://weipengfei.blog.51cto.com/1511707/1060212 但高兴的是 可以将DB分至其他母机。 本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1124199,如需转载请自行联系原作者

优秀的个人博客,低调大师

HBase问题诊断 – RegionServer宕机

本来静谧的晚上,吃着葡萄干看着球赛,何等惬意。可偏偏一条报警短信如闪电一般打破了夜晚的宁静,线上集群一台RS宕了!于是倏地从床上坐起来,看了看监控,瞬间惊呆了:单台机器的读写吞吐量竟然达到了5w ops/sec!RS宕机是因为这么大的写入量造成的?如果真是这样,它是怎么造成的?如果不是这样,那又是什么原因?各种疑问瞬间从脑子里一一闪过,甭管那么多,先把日志备份一份,再把RS拉起来。接下来还是Bug排查老套路:日志、监控和源码三管齐下,来看看到底发生了什么! 案件现场篇 下图是使用监控工具Ganglia对事发RegionServer当时读写吞吐量的监控曲线,从图中可以看出,大约在19点~21点半的时间段内,这台RS的吞吐量都维持了3w ops/sec左右,峰值更是达到了6w ops/sec。之前我们就线上单台RS能够承受的最大读写吞吐量进行过测定,基本也就维持在2w左右,主要是因为网络带宽瓶颈。而在宕机前这台RS的读写吞吐量超出这么多,直觉告诉我RS宕机原因就是它! 接着就赶紧把日志拉出来看,满屏的responseTooSlow,如下图所示: 很显然,这种异常最大可能原因就是Full GC,果然,经过耐心地排查,可以看到很多如下所示的Full GC日志片段: 2016-04-14 21:27:13,174 WARN [JvmPauseMonitor] util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 20542ms GC pool 'ParNew' had collection(s): count=1 time=0ms GC pool 'ConcurrentMarkSweep' had collection(s): count=2 time=20898ms 2016-04-14 21:27:13,174 WARN [regionserver60020.periodicFlusher] util.Sleeper: We slept 20936ms instead of 100ms, this is likely due to a long garbage collecting pause and it's usually bad, see http://hbase.apache.org/book.html#trouble.rs.runtime.zkexpired 可以看出,HBase执行了一次CMS GC,导致整个进程所有线程被挂起了20s。通过对MemStore的监控也可以看出这段时间GC力度之大,如下图所示: GC时间长最明显的危害是会造成上层业务的阻塞,通过日志也可以看出些许端倪: java.io.IOException: Connection reset by peer at sun.nio.ch.FileDispatcherImpl.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) at sun.nio.ch.IOUtil.read(IOUtil.java:197) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:384) at org.apache.hadoop.hbase.ipc.RpcServer.channelRead(RpcServer.java:2246) at org.apache.hadoop.hbase.ipc.RpcServer$Connection.readAndProcess(RpcServer.java:1496) .... 2016-04-14 21:32:40,173 WARN [B.DefaultRpcServer.handler=125,queue=5,port=60020] ipc.RpcServer: RpcServer.respondercallId: 7540 service: ClientService methodName: Multi size: 100.2 K connection: 10.160.247.139:56031: output error 2016-04-14 21:32:40,173 WARN [B.DefaultRpcServer.handler=125,queue=5,port=60020] ipc.RpcServer: B.DefaultRpcServer.handler=125,queue=5,port=60020: caught a ClosedChannelException, this means that the server was processing a request but the client went away. The error message was: null 上述日志表示HBase服务端因为Full GC导致一直无法响应用户请求,用户客户端程序在一定时间过后就会SocketTimeout并断掉此Connection。连接断掉之后,服务器端就会打印如上日志。然而,这些和我们的终极目标好像并没有太大关系,别忘了我们的目标是找到RS宕机的原因哦! 破案铺垫篇 经过对案件现场的排查,唯一有用的线索就是HBase在宕机前经历了很严重、很频繁的Full GC,从下面日志可以进一步看出,这些Full GC都是在 concurrent mode failure模式下发生的,也就是虚拟机还未执行完本次GC的情况下又来了大量数据导致JVM内存不够,此时虚拟机会将所有用户线程挂起,执行长时间的Full GC! (concurrent mode failure): 45876255K->21800674K(46137344K), 10.0625300 secs] 48792749K->21800674K(49283072K), [CMS Perm : 43274K->43274K(262144K)], 10.2083040 secs] [Times: user=12.02 sys=0.00, real=10.20 secs] 2016-04-14 21:22:43,990 WARN [JvmPauseMonitor] util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 10055ms GC pool 'ParNew' had collection(s): count=2 time=244ms GC pool 'ConcurrentMarkSweep' had collection(s): count=1 time=10062ms 上文提到Full GC会对上层业务产生很严重的影响,那有没有可能会对下层依赖方也产生很大的影响呢?事实是Yes!而且,RS宕机的大部分原因也要归咎于此! 进一步查看日志,发现HBase日志中出现下述异常: 2016-04-14 21:22:44,006 WARN [ResponseProcessor for block BP-632656502-10.160.173.93-1448595094942:blk_1073941840_201226] hdfs.DFSClient: DFSOutputStream ResponseProcessor exception for block BP-632656502-10.160.173.93-1448595094942:blk_1073941840_201226 java.io.IOException: Bad response ERROR for block BP-632656502-10.160.173.93-1448595094942:blk_1073941840_201226 from datanode 10.160.173.93:50010 at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer$ResponseProcessor.run(DFSOutputStream.java:732) 从日志内容来看应该是hbase调用DFSClient向datanode写入block数据”BP-632656502-10.160.173.93-1448595094942:blk_1073941840_201226″,但是datanode返回失败。具体失败原因需要查看datanode节点日志,如下所示: 2016-04-14 21:22:43,789 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: opWriteBlock BP-632656502-10.160.173.93-1448595094942:blk_1073941840_201226 received exception java.net.SocketTimeoutException: 10000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/10.160.173.94:50010 remote=/10.160.173.94:30110] 2016-04-14 21:22:43,779 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: hz-hbase4.photo.163.org:50010:DataXceiver error processing WRITE_BLOCK operation src: /10.160.173.94:30123 dest: /10.160.173.94:50010 java.net.SocketTimeoutException: 10000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/10.160.173.94:50010 remote=/10.160.173.94:30123] 很显然,从日志可以看出,datanode一直在等待来自客户端的read请求,但是直至SocketTimeout,请求都没有过来,此时datanode会将该连接断开,导致客户端收到上述”Bad response ERROR ***”的异常。 那这和Full GC有什么关系呢?很简单,就是因为Full GC导致HBase所有内部线程挂起,因此发往datanode的read请求也被挂起了,datanode就等啊等,左等右等都等不到,万不得已才将连接断掉。 查看Hadoop客户端源码可知,如果DFSClient发生上述异常,DFSClient会将一个全局标志errorIndex设为一个非零值。具体可参见DFSOutputStream类中如下代码片段: 破案结局篇 上述铺垫篇最后的结果就是Hadoop客户端会将一个全局标志errorIndex设为一个非零值,那这到底和最终RS宕掉有什么关系呢?来继续往下看。下图HBase日志相关片段截图,记录了比较详细的RS宕机异常信息,我们就以这些异常信息作为切入点进行分析,可以看出至少三条有用的线索,如下图所示: 线索一:RS宕机最直接的原因是因为系统在关闭LogWriter(之后会重新开启一个新的HLog)的时候失败 线索二:执行LogWriter关闭失败的原因是”writing trailer”时发生IOException异常 线索三:而发生IOException异常的原因是”All datanodes *** are bad” 到这里为止,我们能够获得的最靠谱的情报就是RS宕机本质是因为”All datanodes *** are bad”造成的,看字面意思就是这台datanode因为某种原因坏掉了,那我们赶紧去看看datanode的日志,看看那个时间段有没有相关的异常或者错误日志。 然而很遗憾,datanode日志在那个时间点没有打印任何异常或者错误日志,而且显示所有服务都正常,信息如下所示: 2016-04-14 21:32:38,893 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: 127.0.0.1, dest: 127.0.0.1, op: REQUEST_SHORT_CIRCUIT_FDS, blockid: 1073941669, srvID: DS-22834907-10.160.173.94-50010-1448595406972, success: true 2016-04-14 21:32:38,894 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: 127.0.0.1, dest: 127.0.0.1, op: REQUEST_SHORT_CIRCUIT_FDS, blockid: 1073941669, srvID: DS-22834907-10.160.173.94-50010-1448595406972, success: true ... 看到这里,是不是有点蒙圈:HBase日志里面明明打印说这台datanode坏掉了,但是实际datanode日志显示服务一切正常。这个时候就得翻翻源码了,看看HBase在哪里打印的”All datanodes *** are bad“,通过查看源码,可以看出最终元凶就是上文提到的errorIndex,如下图所示: 终于拨开天日了,再不完结就要晕了!上文铺垫篇铺垫到最后就得出来因为Full GC最终导致DFSClient将一个全局标志errorIndex设为一个非零值,在这里终于碰头了,简直泪流满面! 案件梳理篇 整个流程走下来本人都有点晕晕的,涉及的方方面面太多,因此有必要把整个流程完整的梳理一遍,下面简单画了一个示意图: 经过对整个案件的整理分析,一方面再次锻炼了如何通过监控、日志以及源码定位排查问题的功底,另一方面在HBase运维过程中也需要特别关注如下几点: 1. Full GC不仅会严重影响上层业务,造成业务读写请求的卡顿。另外还有可能造成与HDFS之间数据请求的各种异常,这种异常严重的时候甚至会导致RegionServer宕机。 2. 上文中提到Full GC基本是由于Concurrent Mode Failure造成,这种Full GC场景比较少见,通常可以通过减小 JVM 参数XX:CMSInitiatingOccupancyFraction来避免,这个参数用来设置CMS垃圾回收时机,假如此时设置为60,表示JVM内已使用内存占到总内存的60%的时候就会进行垃圾回收,减少该值可以使得垃圾回收更早进行。 3. 一定要严格限制业务层面的流量。一方面需要和业务方交流,由业务方进行限制,另一方面可以探索HBase业务资源隔离的新方案; 本文转载自:http://hbasefly.com 原文链接

优秀的个人博客,低调大师

Java 虚拟机诊断利器

作者 | 小白一只 【Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿】 背景 最近学习Java字节码过程中遇到了反射,有段代码是这样的: package com.example.classstudy; import java.lang.reflect.Method; /** * @author TY */ public class ReflectionTest { private static int count = 0; public static void foo() { new Exception("test#" + (count++)).printStackTrace(); } public static void main(String[] args) throws Exception { Class<?> clz = Class.forName("com.example.classstudy.ReflectionTest"); Method method = clz.getMethod("foo"); for (int i = 0; i < 20; i++) { method.invoke(null); } } } 就是一段简单的反射调用 foo 方法,执行 20 次,然后看执行结果: 可以看到在 15 次调用 foo 方法后,第 16 次调用 foo 方法是走的 GeneratedMethodAccessor1 来调用的。我嘞个擦,怎么回事,调着调着就不一样了,于是跟代码,跟到了下面这个类: 其中这句代码就是对反射调用的次数做了控制 if (++this.numInvocations > ReflectionFactory.inflationThreshold() && !ReflectUtil.isVMAnonymousClass( this.method.getDeclaringClass())) { MethodAccessorImpl var3 = (MethodAccessorImpl) (new MethodAccessorGenerator()) .generateMethod(this.method.getDeclaringClass(), this.method.getName(), this.method.getParameterTypes(), this.method.getReturnType(), this.method.getExceptionTypes(), this.method.getModifiers()); this.parent.setDelegate(var3); } this.numInvocations 的默认值是 0,而 ReflectionFactory.inflationThreshold() 默认是 15,当大于 15 的时候会通过 ASM 技术动态生成 GeneratedMethodAccessor1 类来调用 invoke 方法,但是,因为是动态生成的,我们怎么才能看到这个类实际长什么样子呢? Arthas 这个时候,就可以用上阿里的 arthas(阿尔萨斯)了。 首先下载 arthas: curl-Ohttps://alibaba.github.io/arthas/arthas-boot.jar 然后启动 arthas: java-jararthas-boot.jar 启动之后界面长这个样子: 其中什么 23012, 28436 等是当前环境中现有的 java 进程,然后需要连接到哪个进程就输前面的编号(1234 啥的),输了之后回车。那么我首先改写一下最开始的那个程序,让他不退出: package com.example.classstudy; import java.lang.reflect.Method; /** * @author TY */ public class ReflectionTest { private static int count = 0; public static void foo() { new Exception("test#" + (count++)).printStackTrace(); } public static void main(String[] args) throws Exception { Class<?> clz = Class.forName("com.example.classstudy.ReflectionTest"); Method method = clz.getMethod("foo"); for (int i = 0; i < 20; i++) { method.invoke(null); } System.in.read(); } } 重新启动程序之后,查看 arthas 界面: 可以看到 32480 正是我们运行的程序,输入编号 2 去连接到该进程: 然后就可以将动态生成的类 dump 下来: dumpsun.reflect.GeneratedMethodAccessor1 可以看到字节码被 dump 下来了,找到该文件用 javap 来查看: javap-c-v-p-lGeneratedMethodAccessor1.class 没有问题,可以查看到,然后剩下的就是人肉翻译字节码啦。。。 本篇关于Arthas的使用其实很少,我只是因为学到这个地方简单的用了下,但是已经感受到了 Arthas 的强大之处,它甚至还支持 web 界面。。。 相当厉害! Arthas 征文活动火热进行中 Arthas 官方正在举行征文活动,如果你有: 使用 Arthas 排查过的问题 对 Arthas 进行源码解读 对 Arthas 提出建议 不限,其它与 Arthas 有关的内容 欢迎参加征文活动,还有奖品拿哦~点击投稿 “阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

优秀的个人博客,低调大师

诊断勒索软件部署协议(RDP)

前言 远程桌面协议(RDP)是最流行的初始勒索软件攻击媒介,并且多年来一直如此。针对2020年Unit 42事件响应和数据泄露报告,Unit 42研究了1,000多起事件的数据,发现在50%的勒索软件部署案例中,RDP是最初的攻击媒介。在2021年Cortex Xpanse攻击面威胁报告中,Cortex Xpanse研究人员发现RDP占总暴露的30%,是第二位最常见暴露的两倍多。 RDP是Microsoft Windows系统上的一种协议,旨在允许用户远程连接和控制远程系统。最常见的合法用途是允许IT支持远程控制用户的系统以解决问题。最近,RDP在云计算中变得流行,用于访问云环境中的虚拟机(VM)或远程管理云资产。 如果将RDP公开在一个被遗忘的系统、云实例、先前受网络分段保护或通过直接连接到互联网的设备上,就很容易在无意中暴露RDP。更糟糕的是,RDP已变得更广泛、更暴露并且具有更普遍的风险,可能导致攻击(特别是勒索软件部署)、数据丢失、代价高昂的停机时间和补救工作,以及对组织的品牌损害。 更多的暴露意味着更大的风险 COVID-19大流行首先导致在家工作人数的激增,这意味着笔记本电脑从带有防火墙的办公网络的安全空间转移到从未考虑过安全性的家庭网络。 IT还没有为这种转变做好准备,因此必须购买新的笔记本电脑并很快将其发送给远程工作人员。这意味着风险和更多的RDP暴露。向远程工作的转变也加剧了与临时动态DNS相关的风险。 具有分配IP地址的办公网络上的计算机易于清点和跟踪。在个人家庭中,随着互联网服务提供商(ISP)动态分配地址,计算机的IP地址每天都会发生变化。而且,这些设备可以从家里移动到咖啡店或朋友家,然后再返回,每次都会获得一个新的IP地址。尽管这长期以来一直是一个风险,但现在远程工作者比以往任何时候都多,因此风险也就越大。 2021年1月的Unit 42云威胁报告发现,从Q1 2020(预COVID-19)至Q2 2020(后COVID-19)所有云供应商RDP暴露的风险增加了59%。启动新的云实例比以往任何时候都容易,同时出错的可能性也会增加。 所以,RDP无处不在。RDP是威胁参与者的主要目标,并且,RDP通常是勒索软件攻击的初始攻击媒介。不幸的是,根据Cortex Xpanse的报告,在对2021年前三个月与50家全球企业相关的5000万个IP地址的扫描中发现,RDP占到了整体安全问题的32%。 为什么RDP如此危险? RDP是威胁参与者最喜欢的目标,因为一旦攻击者进入,他们就可以完全访问系统(甚至可以达到被盗用户帐户的级别)。如果管理员帐户受到攻击,那将是一场灾难。即使更受限制的用户帐户遭到入侵,攻击者也只需要在该系统上找到另一个漏洞来提升权限并获得更多访问权限。 对于恶意行为者来说,要找到暴露的RDP需要一个简单的nmap脚本,该脚本会扫描Internet上的开放端口3389(默认RDP端口)。今天,攻击者正在不断扫描3389端口,如图X所示。 根据Cortex Xpanse的研究,攻击者可以在45分钟内扫描整个互联网。所以一旦RDP暴露了,攻击者就会发现并且通过多种方式进入: 使用窃取的凭据登录。 强制登录(如果实现允许无限制的登录尝试)。 如果RDP版本过时或使用有缺陷的加密,则执行中间人攻击。 利用旧版RDP中的已知漏洞,例如BlueKeep。 避免勒索软件彩票 恶意行为者并不总是针对特定目标,通常情况下,他们只是在寻找那些通过攻击能带来回报的漏洞。勒索软件就像是一种邪恶的彩票系统,您只需打开门就可以进行游戏,例如RDP。 任何组织的第一步都是通过比对手更快地扫描漏洞来规避RDP风险,并确保对所有连接互联网的设备具有完全的可见性和完整的记录系统。如果这些漏洞存在于外部IP空间中,则漏洞扫描程序无法找到它们,因此您需要从外向内进行扫描。很多较为先进的公司使用平均库存时间(MTTI)来衡量他们扫描完整库存和评估潜在风险的速度。 确保您没有不必要的RDP暴露的第一种方法是在所有不需要的系统上简单地禁用RDP。对于需要RDP的系统,请遵循以下安全措施: 将RDP置于虚拟专用网络(虚拟网络)之后。 启用多重身份验证(MFA)。降低与被盗凭据相关的风险的最佳方法是确保在所有用户帐户上启用MFA。 限制登录尝试。同样,为了降低暴力攻击的风险,限制失败的登录尝试,禁止无限制的尝试。 为断开连接的会话设置时间限制并自动结束达到该限制的会话。 考虑允许列表,以便只有经过批准的IP地址才能连接到RDP服务器。 部署互联网规模的攻击面监控解决方案,例如Cortex Xpanse,以监控RDP或其他远程访问服务的意外暴露。 优先考虑RDP 到现在为止,应该清楚为什么RDP=勒索软件部署协议。RDP配置应该是所有IT卫生计划中的一个高优先级项目。它是一种具有危险默认设置的协议,用户很容易以危险的方式启用或使用。 如果配置不当,并且您的组织很不幸的成为勒索软件运营商的目标时,RDP将被用作攻击媒介。这不是理论上的风险,这是一个简单且确定的事实。 无论您是否打算公开RDP,这些暴露都发生在Internet范围内,而不仅仅是在您已知的IP空间上。这意味着防御者必须在互联网范围内监控任何意外或配置错误的实现,因为可以确定的是此时攻击者也在监控。 本文翻译自:https://www.paloaltonetworks.com/blog/2021/07/diagnosing-the-ransomware-deployment-protocol/如若转载,请注明原文地址。

优秀的个人博客,低调大师

如何利用 Webshell 诊断 EDAS Serverless 应用

本文主要介绍 Serverless 应用的网络环境以及 Serverless 应用容器内的环境,了解背景知识以及基本的运维知识后可以利用 Webshell 完成基本的运维需求。 Webshell 简介 用户可以通过阿里云控制台直接获取 ECS 的 Shell,从而完成自己的运维需求。如果 ECS 内开启了 SSH 服务,且 ECS 存在弹性公网 IP,那么用户也可以在本地通过 SSH 服务获取 ECS 的 Shell 完成运维需求。 由于 EDAS Serverless 特殊的架构以及网络环境,用户暂时无法直接从本地通过 SSH 服务获取应用容器的 Shell。在 Serverless 场景中,容器是一个暂态的、供应用运行的环境,一般来说不需要进入运维。为了方便用户进行线上问题定位排查,EDAS 在控制台提供了一个简单的Webshell

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册