mysql锁与死锁排查:从锁查询到表空间回收

前言

三个日常高频的数据库锁问题合在一起:mysql 里怎么查「谁锁了谁」、Oracle 的锁会话处理(附节)、以及 DELETE 大量数据后表空间为什么不回收、怎么回收。都是拿来就能用的 SQL。

一、mysql 锁排查四连查

1. 查询是否锁表

1
SHOW OPEN TABLES WHERE In_use > 0;

2. 查询当前进程(看哪些会话在跑、哪些在等待)

1
SHOW PROCESSLIST;

3. 查看正在锁的事务

……

阅读全文

LVS+Keepalived原理与安装配置实战

前言

LVS + Keepalived 是经典的四层负载均衡高可用方案:LVS 负责流量转发,Keepalived 负责健康检查与主备切换。这篇整理两者的原理与完整安装配置过程(文中的 IP 均为示例地址)。

一、Keepalived 的三种工作方式

Keepalived 工作在 IP/TCP 协议栈的 IP 层、TCP 层及应用层,对应 Layer3、Layer4、Layer7 三种检测方式:

  • Layer3(IP层):Keepalived 定期向服务器群中的服务器发送 ICMP 数据包(即 Ping),如果发现某台服务器的 IP 地址没有激活,便报告这台服务器失效并将它从服务器群中剔除。典型例子是某台服务器被非法关机。Layer3 以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。
  • Layer4(TCP层):主要以 TCP 端口的状态来决定服务器工作是否正常。如 web server 的服务端口一般是 80,如果 Keepalived 检测到 80 端口没有启动,则将这台服务器从服务器群中剔除。
  • Layer7(应用层):工作在具体的应用层,比 Layer3、Layer4 要复杂一点,在网络上占用的带宽也要大一些。Keepalived 根据用户的设定检查服务器程序的运行是否正常(例如请求一个特定 URL 比对返回内容),与设定不符则剔除。

二、LVS 安装(Active/Standby 模式)

LVS 部署两台,为 Active/Standby 模式:

……

阅读全文

nmap参数详解

前言

用nmap扫描域名整理下一些细节参数

1、语法

1
nmap [扫描类型] [选项] {目标规格}

2、选项

目标规格: 可以通过主机名,IP地址,网络等

例如:

1
2
3
4
5
scanme.nmap.org,microsoft.com/24,192.168.0.1; 10.0.0-255.1-254
  -iL <inputfilename>:从主机/网络列表输入
  -iR <num hosts>:选择随机目标
  --exclude <host1 [,host2] [,host3],...>:排除主机/网络
  --excludefile <exclude_file>:从文件中排除列表

2.1 主机发现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  -sL:列表扫描 - 只需列出要扫描的目标
  -sn:Ping扫描 - 禁用端口扫描
  -Pn:将所有主机视为在线 - 跳过主机发现
  -PS / PA / PU / PY [portlist]:向给定端口发送TCP SYN / ACK,UDP或SCTP
  -PE / PP / PM:ICMP回显,时间戳和网络掩码请求发现探测
  -PO [协议列表]:IP协议Ping
  -n / -R:不要做DNS解析/总是解决[默认:有时]
  --dns-servers <serv1 [,serv2],...>:指定自定义DNS服务器
  --system-dns:使用操作系统的DNS解析器
  --traceroute:跟踪每个主机的跳转路径

2.2 扫描技术

1
2
3
4
5
6
7
8
  -sS / sT / sA / sW / sM:TCP SYN / Connect()/ ACK / Window / Maimon扫描
  -sU:UDP扫描
  -sN / sF / sX:TCP Null,FIN和Xmas扫描
  --scanflags <flags>:自定义TCP扫描标志
  -sI <zombie host [:probeport]>:空闲扫描
  -sY / sZ:SCTP INIT / COOKIE-ECHO扫描
  -sO:IP协议扫描
  -b <FTP中继主机>:FTP跳转扫描

2.3 端口规格和扫描订单

1
2
3
4
5
6
  -p <端口范围>:仅扫描指定的端口
    例如:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
  -F:快速模式 - 扫描比默认扫描更少的端口
  -r:连续扫描端口 - 不要随机化
  --top-ports <number>:扫描<number>最常用的端口
  --port-ratio <ratio>:扫描端口比<ratio>更常见

2.4 服务/版本检测

1
2
3
4
5
  -sV:探测打开端口以确定服务/版本信息
  --version-intensity <level>:从0(亮)到9(尝试所有探针)
  - 变换光:极限探测器(强度2)
  --version-all:尝试每一个探针(强度9)
  --version-trace:显示详细的版本扫描活动(用于调试)

2.5 脚本扫描

1
2
3
4
5
6
7
8
  -sC:相当于--script = default
  --script = <Lua scripts>:<Lua scripts>是逗号分隔的列表目录,脚本文件或脚本类别
  --script-args = <n1 = v1,[n2 = v2,...]>:为脚本提供参数
  --script-args-file = filename:在文件中提供NSE脚本参数
  --script-trace:显示发送和接收的所有数据
  --script-updatedb:更新脚本数据库。
  --script-help = <Lua脚本>:显示有关脚本的帮助。
                          <Lua脚本>是一个逗号分隔的脚本文件列表脚本的类别。

2.6 操作系统检测

1
2
3
  -O:启用操作系统检测
  --osscan-limit:将操作系统检测限制为有希望的目标
  - 可以猜测:猜测操作系统更积极

2.7 时间和性能

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
  采取<time>的选项以秒为单位,或追加“ms”(毫秒)
  '(秒),'m'(分钟)或'h'(小时)到该值(例如30m)。
  -T <0-5>:设置时间模板(越高越好)
  --min-hostgroup / max-hostgroup <size>:并行主机扫描组大小
  --min-parallelism / max-parallelism <numprobes>:探针并行化
  --min-rtt-timeout / max-rtt-timeout / initial-rtt-timeout <time>:指定
      探测往返时间。
  --max-retries <attempts>:端口扫描探测重传的Caps number。
  --host-timeout <time>:在此之后放弃目标
  --scan-delay /  -  max-scan-delay <time>:调整探测器之间的延迟
  --min-rate <number>:发送速度慢于<number>每秒
  --max-rate <number>:发送数据包速度不超过每秒的<number>

2.8 防火墙/IDS逃避和SPOOFING

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  -F; --mtu <val>:片段数据包(可选地,给定MTU)
  -D <decoy1,decoy2 [,ME],...>:用诱惑遮掩扫描
  -S <IP_Address>:欺骗源地址
  -e <iface>:使用指定的接口
  -g /  -  source-port <portnum>:使用给定的端口号
  --data-length <num>:将随机数据附加到发送的数据包
  --ip-options <options>:使用指定的ip选项发送数据包
  --ttl <val>:设置IP生存时间字段
  --spoof-mac <mac address / prefix / vendor name>:欺骗您的MAC地址
  --badsum:发送具有假TCP / UDP / SCTP校验和的数据包

2.9 OUTPUT

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  -oN / -oX / -oS / -oG <file>:正常输出扫描,XML,s | <rIpt kIddi3,
     和Grepable格式,分别给给定的文件名。
  -oA <basename>:一次输出三种主要格式
  -v:增加详细程度(使用-vv或更多的效果)
  -d:增加调试级别(使用-dd或更多更大的效果)
  --reason:显示端口处于特定状态的原因
  --open:仅显示打开(或可能打开)的端口
  --packet-trace:显示发送和接收的所有数据包
  --iflist:打印主机接口和路由(用于调试)
  --log错误:将错误/警告记录到正常格式的输出文件中
  --append-output:追加而不是clobber指定的输出文件
  --resume <filename>:恢复中止的扫描
  --stylesheet <path / URL>:将XML输出转换为HTML的XSL样式表
  --webxml:来自Nmap.Org的引用样式表,用于更多的便携式XML
  --no-stylesheet:防止XSL样式表与XML输出关联

2.10 MISC

1
2
3
4
5
6
7
8
  -6:启用IPv6扫描
  -A:启用操作系统检测,版本检测,脚本扫描和跟踪路由
  --datadir <dirname>:指定自定义Nmap数据文件位置
  --send-eth /  -  send-ip:使用原始以太网帧或IP数据包发送
  --privileged:假设用户是完全特权的
  --unprivileged:假设用户缺少原始套接字权限
  -V:打印版本号
  -h:打印此帮助摘要页面。

2.11 例子

1
2
3
  nmap -v -A scanme.nmap.org
  nmap -v -sn 192.168.0.0/16 10.0.0.0/8
  nmap -v -iR 10000 -Pn -p80

3、常见的nmap例子

我们要进行对icmp的扫描,我们可以这样写

1
nmap -sP ipaddress

我们要对目标半开放式端口扫描不想在留下日志记录怎么整

1
namp -sS -p port ipadress

下面介绍一些nmap的审计脚本

snmp默认团体名/弱口令漏洞及安全加固

审计snmp弱口令

1
nmap -sU -p161 -script=snmp-brute ipaddress 

iis短文件名泄露

1
nmap -p 80 --script http-iis-short-name-brute ipaddress

Memcached未授权访问漏洞

1
nmap -sV -p 11211 -script memcached-info ipaddress

验证https.sys远程代码执行漏洞

1
nmap -sV - (-) script http-vuln-cve2015-1635 ipaddress

心脏出血

1
nmap -sV --scipt=ssl-heartbleed ipaddress

mongodb未授权访问

1
nmap -p 27017 --script mongodb-info ipaddress

redis未授权访问

1
nmap -p 6370 --script redis-info ipaddress

elastticsearch未授权访问

1
nmap --script=http-vuln-cve2015-1427 --script-args command='ls' ipaddress

rsync未授权漏洞

1
nmap -p 873 --script rsync=brute ==script=args 'rsync-brute.module=www'

http拒绝服务

1
nmap --max-paralleism 800-script http=slowloris siteaddress

ftp弱口令暴力破解

1
nmap --script ftp-brute --script-args brute.emptypass=true,ftp-brute.timeout=30,userdb=/root/dirtionary/usernames.txt,brute.useraspass=true,passdb=/root/dirtionary/passwords.txt,brute.threads=3,brute.delay=6 ipaddress

检测CVE-2011-2523中的ftp-vsftpd-backdoor

1
nmap -T2 --script ftp-vsftpd-backdoor ipaddress

验证http中开启的-methods 方法

1
nmap -T3 --script http-methods --script-args http.test-all=true,http.url-path=/siteaddress

验证HTTP.sys 远程代码执行

1
nmap -sV --script http-vuln-cve2015-1635 ipaddress

验证 SSL POODLE information leak

1
nmap -sV -p 443 --version-light --script ssl-poodle ipaddress

验证http 中开启了put 方法

1
nmap --script http-put --script-args http-put.url=/uploads/testput.txt,http-put.file=/root/put.txt ipaddress

验证mysql 匿名访问

1
nmap --script mysql-empty-password ipaddress

验证cve2015-1427 漏洞

1
nmap --script http-vuln-cve2015-1427 --script-args command=ls ipaddress

验证cve2014-8877漏洞

1
nmap -Pn --script http-vuln-cve2014-8877 --script-args http-vuln-cve2014-8877.cmd=dir,http-vuln-cve2014-8877.uri=/wordpress ipaddress

验证Cisco ASA中的CVE-2014-2126,CVE-2014-2127,CVE-2014-21,CVE-2014-2129漏洞

1
nmap -p 443 --script http-vuln-cve2014-2126,http-vuln-cve2014-2127,http-vuln-cve2014-2128,http-vuln-cve2014-2129 ipaddress

验证低安全的 SSHv1,sslv2协议

1
nmap --script sshv1,sslv2 siteadress

验证CVE-2014-0224 ssl-ccs-injection

1
nmap -Pn --script ssl-ccs-injection ipaddress

验证ssl-cert证书问题

1
nmap -v -v --script ssl-cert ipaddress

验证SSL证书的有限期

1
nmap -Pn --script ssl-date siteadress

验证 Debian OpenSSL keys

1
nmap -p 443 --script ssl-known-key ipaddress

验证弱加密SSL套件

1
nmap --script ssl-enum-ciphers ipaddress

验证CVE 2015-4000

1
nmap --script ssl-dh-params siteadress

验证多种SSL漏洞问题

1
nmap 203.195.139.153 --vv --script sshv1,ssl-ccs-injection,ssl-cert,ssl-date,ssl-dh-params,ssl-enum-ciphers,ssl-google-cert-catalog,ssl-heartbleed,ssl-known-key,sslv2

在网络中检测某主机是否存在窃听他人流量

1
nmap --script sniffer-detect ipaddress

暴力破解telnet

1
nmap -p 23 --script telnet-brute --script-args userdb=myusers.lst,passdb=mypwds.lst --script-args telnet-brute.timeout=8s ipaddress

验证telnet是否支持加密

1
nmap --script telnet-encryption ipaddress

精准地确认端口上运行的服务

1
nmap -sV --script unusual-port ipaddress

收集VNC信息

1
nmap --script vnc-info ipaddress

暴力破解VNC

1
nmap --script vnc-brute --script-args brute.guesses=6,brute.emptypass=true,userdb=/root/dictionary/user.txt,brute.useraspass=true,passdb=/root/dictionary/pass.txt,brute.retries=3,brute.threads=2,brute.delay=3 ipaddress

Web敏感目录扫描

1
nmap -p 80 --script=http-enum.nse XXX.XXX.XXX.XXX
……

阅读全文

@FeignClient属性详解与bean重名冲突处理

前言

微服务项目里 OpenFeign 是最常用的声明式 HTTP 客户端,但 @FeignClient 的属性含义很多人只停留在 value 上。这篇整理注解的全属性解读,以及一个常见的坑:多个 FeignClient 指向同一个服务时的 bean 重名冲突。

一、@FeignClient 全属性解读

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {

    /**
     * 1、value 与 name 互为别名,两者二选一即可
     * 2、当 contextId 没有值的时候,会默认获取(value/name)的值
     * 3、当未指定 url 请求地址的时候,最终会通过 ribbon-loadbalancer 工具,
     *    从注册中心选取 service-id 等于 value 的服务作为请求地址
     */
    @AliasFor("name")
    String value() default "";

    /**
     * serviceId 已作废,其目的与 value 一致。如果设置了 serviceId,
     * 则 value/name 皆以 serviceId 为准
     */
    @Deprecated
    String serviceId() default "";

    /**
     * 1、当 contextId 没有值的时候,会默认获取(value/name)的值
     * 2、当 qualifier 没有值的时候,会将 '${contextId}FeignClient' 作为
     *    feign 的 bean 组件别名
     */
    String contextId() default "";

    /** 同 value,二选一 */
    @AliasFor("value")
    String name() default "";

    /**
     * feign 的 bean 组件别名,拥有最高优先级;
     * 当 qualifier 为空时,取 '${contextId}FeignClient' 作为 bean 的名称
     */
    String qualifier() default "";

    /**
     * 1、设置 url 以后,后续发起 http 调用时,直接读取该地址作为请求目标;
     * 2、未设置 url 时,借助 ribbon-loadbalancer 组件,根据 (value/name)
     *    从注册中心的服务列表中选中 service-id 匹配的目标服务
     */
    String url() default "";

    boolean decode404() default false;

    Class<?>[] configuration() default {};

    Class<?>[] fallback() default void.class;

    Class<?>[] fallbackFactory() default void.class;

    /**
     * 目标服务器对应的资源 uri(FeignClient 下所有方法相同的 path 前缀)
     */
    String path() default "";

    boolean primary() default true;
}

属性速查:

……

阅读全文

log4j2远程执行漏洞

前言

12月9日爆出来的log4j2远程执行漏洞,因为影响巨大,网上新闻和介绍特别多,这里不多说,间接使用log4j2的第三方也不少,等官网修复不知道是否赶得上,直接采用暴力删除jndilook.class最简单

1、直接删除漏洞class

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
set -eu
for JAR_PATH in "$@"; do
	if [[ $JAR_PATH != *log4j-core*.jar ]] || [ -e "$JAR_PATH.bak" ] || ! [ -f "$JAR_PATH" ]; then
		echo "Skipped $JAR_PATH"
		continue
	fi
	echo "Processing $JAR_PATH"
	cp -p "$JAR_PATH" "$JAR_PATH.bak"
	zip -q -d "$JAR_PATH" org/apache/logging/log4j/core/lookup/JndiLookup.class
done

2、Apache log4j2漏洞官方说明

官方漏洞说明: https://logging.apache.org/log4j/2.x/security.html

……

阅读全文

性能测试入门:从PV/QPS/TPS概念到四款压测工具横评

前言

项目需要对一批接口压测,要求 QPS 达到 6 万以上。一直用的 jmeter 单台电脑打不到这个量级,于是对几款主流压测工具做了一次横评。压测机为 Linux 4核8G,为避免干扰,测试时服务器只运行压测工具,且非本机压本机。

先从概念说起,再对比工具。

一、先分清 PV / QPS / TPS

  • PV(Page View):页面访问量,每次用户访问或者刷新页面都会被计算在内。
  • QPS(Query Per Second):每秒查询数,每秒系统能够处理的查询请求次数。比如执行了 select 操作,相应的 qps 会增加。
  • TPS(Transactions Per Second):每秒事务数,每秒系统能够处理的事务次数。比如执行了 dml 操作,那么相应的 tps 会增加。

不同的应用系统 tps/qps 是没有可对比性的。例如:

……

阅读全文

lombok一些注解的含义

前言

lombok一些注解的含义整理

1、@Accessors(chain = true)

链式风格,在调用set方法时,返回这个类的实例对象,比如:a.b.c

2、@Data

在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor、equals、canEqual、hashCode、toString 注解,即当使用当前注解时,会自动生成包含的所有方法;

……

阅读全文

git的日常操作命令整理

前言

git的一些常见命令操作整理

1、下载

depth用于指定克隆深度,为1即表示只克隆最近一次commit,可以减少下载的容量

1
git cone --depth=1 {http://xxx/url}

2、撤销commit

默认撤销,不撤销本地代码,撤销commit,并且撤销git add

1
git reset --mixed HEAD^

不删除工作空间改动代码,撤销commit,不撤销git add

1
git reset --soft HEAD^

删除工作空间改动代码,撤销commit,撤销git add

……

阅读全文

caffeine和springcache

前言

说到caffeine,一般会对比 google 家的 guava,这里只做浅析。

缓存

缓存分为本地缓存和远端缓存。
常见的远端缓存有Redis,MongoDB;
本地缓存一般使用map的方式保存在本地内存中。

一般我们在业务中操作缓存,都会操作缓存和数据源两部分。
如:put数据时,先插入DB,再删除原来的缓存;get数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中。
如果访问量大,我们还得兼顾本地缓存的线程安全问题。
必要的时候也要考虑缓存的回收策略。

……

阅读全文

前端编码安全

前端js开发 – 转自腾讯github

I. 代码实现

1.1 原生DOM API的安全操作

1.1.1【必须】HTML标签操作,限定/过滤传入变量值

  • 使用innerHTML=、outerHTML=、document.write()、document.writeln()时,如变量值外部可控,应对特殊字符(&, <, >, ", ')做编码转义,或使用安全的DOM API替代,包括:innerText=
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 假设 params 为用户输入, text 为 DOM 节点
// bad:将不可信内容带入HTML标签操作
const { user } = params;
// ...
text.innerHTML = `Follow @${user}`;

// good: innerHTML操作前,对特殊字符编码转义
function htmlEncode(iStr) {
	let sStr = iStr;
	sStr = sStr.replace(/&/g, "&amp;");
	sStr = sStr.replace(/>/g, "&gt;");
	sStr = sStr.replace(/</g, "&lt;");
	sStr = sStr.replace(/"/g, "&quot;");
	sStr = sStr.replace(/'/g, "&#39;");
	return sStr;
}

let { user } = params;
user = htmlEncode(user);
// ...
text.innerHTML = `Follow @${user}`;

// good: 使用安全的DOM API替代innerHTML
const { user } = params;
// ...
text.innerText = `Follow @${user}`;

1.1.2【必须】HTML属性操作,限定/过滤传入变量值

……

阅读全文

最近文章

分类

标签

其它