Security

Security

Security

CVE

订阅rss

vulnerability

GPG的使用

准备工作

安装
linux下安装gpg软件(以debian10为例)

apt-get install -y gpg

windows下安装gpg软件 https://www.gpg4win.org/get-gpg4win.html 会提示donate,把num设置成0
生成自己的私钥公钥对
windows下, 我使用的是上面安装的客户端Kleopatra Gpg4win-3.1.14

可以在文件-新建密钥对或者文件-导入 导入之前的密钥对,这里我先创建一个,然后导入我linux里面的

创建密钥对并备份

选择格式选择创建个人openpgp, 在界面填写用户和邮箱,高级设置里面也有和linux差不多的选项 最后输入密码,我在创建页面备份了密钥对的副本,没有上传到目录服务

图形界面加密文件

文件-签名/加密 可以增加多个人的名字或者邮箱 加密完成后会生成一个gpg文件,右击即可解密(因为有自己的私钥,当然也可以在前面加密的时候设置密码)

linux下, 这里我设置了key密码,填写了姓名邮箱等信息,选择了4096位的rsa类型
生产密钥对
1
liuliancao@liuliancao-dev:~/gpg$ gpg --full-generate-key # or gpg --generate-key

注意这里的密码一定要记得

发送pub到keyserver
1
2
3
4
5
➜  ~ gpg --list-keys --keyid-format short # 注意用short,如果觉得麻烦,就是ID的后8位
pub   rsa3072/199C28FA 2022-01-19 [SC] [有效至:2024-01-19]
      A41C48868765BF123D11425BABF181C9199C28FA
uid         [ 绝对 ] ops <ops@liuliancao.com>
sub   rsa3072/6F917C31 2022-01-19 [E] [有效至:2024-01-19]

这样别人就可以通过如下方式获取你的PUB了

1
2
3
4
5
gpg --keyserver keyserver.ubuntu.com --recv-keys 199C28FA
gpg: 下载密钥‘199C28FA’,从 hkp 服务器 keyserver.ubuntu.com
gpg: 密钥 199C28FA:公钥“ops <ops@liuliancao.com>”已导入
gpg: 合计被处理的数量:1
gpg:           已导入:1  (RSA: 1)
用指定pub加密一个文件

我们写一个临时文件

1
2
➜  gpg-wd cat test.txt
Hello, liuliancao!

加密文件

1
2
gpg -r 199C28FA --encrypt test.txt
# 这个时候会有test.txt.gpg
解密文件

解密文件

1
2
3
4
gpg --decrypt test.txt.gpg
gpg: 由 3072 位的 RSA 密钥加密,标识为 40D3635F6F917C31,生成于 2022-01-19
      “ops <ops@liuliancao.com>”
Hello, liuliancao!

有可能会让我们输入密码,记得输入创建key的时候的密码

签名

签名要注意指定用户通过-u指定,可以写用户短名字比如liuliancao,也可以使用标记SHORT ID

1
gpg -u liuliancao -s test.txt

表示使用本地liuliancao用户对test.txt进行签名并生成test.txt.sig文件

如果要生成ascii码类型的签名,使用–clearsign,clear这里意思是清晰明了的,否则是二进制的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
➜  gpg -u liuliancao --clearsign test.txt
➜  ls
test.txt  test.txt.asc  test.txt.gpg  test.txt.gpg1
➜  cat test.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Hello, liuliancao!
-----BEGIN PGP SIGNATURE-----

iQHGBAEBCgAwFiEEpBxIhodlvxI9EUJbq/GByRmcKPoFAmHnrEASHHdkb3BzQHdv
b2R1YW4uY29tAAoJEKvxgckZnCj6V8AL/3zhalJBE6UHsVj5xoKb185MWSt3btSX
9Lk4KE3S0LkRaA835pH6mLjzlWfgAr61rYV0aC3S94JvhAWV28mbrzSfosO+fsgb
xxxEE4SzjjaB6ISRKjoc7kmh3ehwH13ggudQ+z99F0xR57gYasAAbFIs+RbkFgJl
XWSPV1zs2vII+ntBFFuREQy4Fp+80xssF/AajnwUV4c80OMbHYRGcwE1bu1eRrnB
fLES6lq1JND3CEKB4Rjt5I6T+cPigZEoIAvd+jurvQajbh0s8eFvu2Tkpjlmufbc
pstDX5me74uIsCkrFsBXrvEhiQirE0AObWyxc+VN5FI90iB7qY2dhgYatSjsEnVf
L3yBrKa19SvVQtlkG7byhIVT+cqbTcC7BuTrJVZdhLXm35cLeL6nleYwkEVOpKCA
CGnPlZBYYUZPMsIGaiuDn6yxZoq4hmHlBfgewI3AYRXEu+hk1iUuYhr3GHc+Urlt
rHpsxOFDtoPlD5cpUEw9qm2aGwvF+qwCBg==
=T0pI
-----END PGP SIGNATURE-----

签名有啥用呢,通过gpg –verify可以检查签名和实际文件是否一致,排除中间网络异常修改等操作,但是注意这里

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
➜  gpg-wd gpg --verify test.txt.asc
gpg: 签名建立于 2022年01月19日 星期三 14时14分24秒 CST
gpg:               使用 RSA 密钥 A41C48868765BF123D11425BABF181C9199C28FA
gpg:                签发者 "liuliancao@liuliancao.com"
gpg: 完好的签名,来自于 “liuliancao <liuliancao@liuliancao.com>” [绝对]
gpg: 警告:不是一个分离签名;文件‘test.txt’没有被验证!
➜  gpg-wd vim test.txt.asc
➜  gpg-wd gpg --verify test.txt.asc
gpg: CRC 错误;E94CA0 - 4F4A48
gpg: 未找到签名
gpg: 签名无法被验证。
请记住签名文件(.sig 或 .asc)应该是
在命令行中第一个给定的文件。

由于我们没有分开签名(文件和签名是一个文件), 导致我们只能验证签名的内容,文件是无法验证的

创建分离签名, 如果不要二进制记得加–armor参数,如果还需要加密,则在文件签名加–encrypt

1
2
3
gpg -u liuliancao --detach-sign test.txt
ls *.sig
test.txt.sig

再次执行verify

1
2
3
4
5
6
gpg --verify test.txt.sig
gpg: 假定被签名的数据在‘test.txt’
gpg: 签名建立于 2022年01月19日 星期三 14时29分51秒 CST
gpg:               使用 RSA 密钥 A41C48868765BF123D11425BABF181C9199C28FA
gpg:                签发者 "liuliancao@liuliancao.com"
gpg: 完好的签名,来自于 “liuliancao <liuliancao@liuliancao.com>” [绝对]

我们改一下test.txt

1
2
3
4
5
6
7
echo 'add a line' >> test.txt
gpg --verify test.txt.sig
gpg: 假定被签名的数据在‘test.txt’
gpg: 签名建立于 2022年01月19日 星期三 14时29分51秒 CST
gpg:               使用 RSA 密钥 A41C48868765BF123D11425BABF181C9199C28FA
gpg:                签发者 "liuliancao@liuliancao.com"
gpg: 已损坏的签名,来自于 “liuliancao <liuliancao@liuliancao.com>” [绝对]

发现这个时候签名已经损坏了

修改key的密码

如果key的密码忘了,我们一般就无法修改密码,通常需要暴力破解等手段

1
2
3
4
5
# 格式gpg --change-passphrase USER_ID
gpg --change-passphrase 6F917C31
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注意这里也可以用gpg –edit-keys USER_ID编辑和修改,这个是相当丰富的命令行资源,类似ftp

输入 passwd,

save即可

增加别人的key到pub里面,多人协同

此时我们登录另一台服务器模拟另一个小伙伴benben

 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
[root@terraform-server01 ~]# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名)
   (4) RSA (仅用于签名)
您的选择? 1
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)4096
您所要求的密钥尺寸是 4096请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
密钥永远不会过期
以上正确吗?(y/n)y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:ben
姓名至少要有五个字符长
真实姓名:benben
电子邮件地址:benben@liuliancao.com
注释:liuliancao's test
您选定了这个用户标识:
    “benben (liuliancao's test) <benben@liuliancao.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?O
您需要一个密码来保护您的私钥。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。


# 实际发现服务器会卡住,

需要安装一下rng-tools,安装完成以后手动执行下

 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
61
62
63
64
65
66
67
68
yum -y install rng-tools

rngd -r /dev/urandom
# 再生成一下
gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名)
   (4) RSA (仅用于签名)
您的选择? 1
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048) 4096
您所要求的密钥尺寸是 4096请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
密钥永远不会过期
以上正确吗?(y/n)y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:benben
电子邮件地址:benben@liuliancao.com
注释:benben
您选定了这个用户标识:
    “benben (benben) <benben@liuliancao.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?O
您需要一个密码来保护您的私钥。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
gpg: 密钥 9D621B41 被标记为绝对信任
公钥和私钥已经生成并经签名。

gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性:  1 已签名:  0 信任度:0-,0q,0n,0m,0f,1u
pub   4096R/9D621B41 2022-01-19
密钥指纹 = F662 BEF2 7042 1AA8 F220  50FF 1D1C 6973 9D62 1B41
uid                  benben (benben) <benben@liuliancao.com>
sub   4096R/D4AB1327 2022-01-19
# 记住这里的用户指纹F662 BEF2 7042 1AA8 F220  50FF 1D1C 6973 9D62 1B41

# 列出我们的key
gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   4096R/9D621B41 2022-01-19
uid                  benben (benben) <benben@liuliancao.com>
sub   4096R/D4AB1327 2022-01-19

# 注意用pub对应的短UID,不要用sub的
gpg --keyserver keyserver.ubuntu.com --send-keys 9D621B41
gpg: 将密钥‘9D621B41’上传到 hkp 服务器 keyserver.ubuntu.com

此时你是gpg的管理员,要把benben加到用户组sub keys里面

继续回到我们的开始服务器

 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
61
62
63
64
65
66
67
68
69
70
  # 导入benben的公钥
  gpg --keyserver keyserver.ubuntu.com --recv-keys 9D621B41
  gpg: 密钥 1D1C69739D621B41:公钥 “benben (benben) <benben@liuliancao.com>” 已导入
  gpg: 处理的总数:1
  gpg:               已导入:1

  # 列出所有的key
  gpg --list-keys
  /home/liuliancao/.gnupg/pubring.kbx
  -----------------------------------
  # 这是主master pub和sub,绝对信任
  pub   rsa3072 2022-01-19 [SC] [有效至:2024-01-19]
        A41C48868765BF123D11425BABF181C9199C28FA
  uid           [ 绝对 ] liuliancao <liuliancao@liuliancao.com>
  sub   rsa3072 2022-01-19 [E] [有效至:2024-01-19]

  # 这个是未知用户
  pub   rsa4096 2022-01-19 [SC]
        F662BEF270421AA8F22050FF1D1C69739D621B41
  uid           [ 未知 ] benben (benben) <benben@liuliancao.com>
  sub   rsa4096 2022-01-19 [E]
  # 取后8位或者gpg --list-keys --keyid-format short发现benben的pub id为9D621B41
  # 检查指纹,
  gpg --fingerprint 9D621B41
  pub   rsa4096 2022-01-19 [SC]
      F662 BEF2 7042 1AA8 F220  50FF 1D1C 6973 9D62 1B41
  uid           [ 未知 ] benben (benben) <benben@liuliancao.com>
  sub   rsa4096 2022-01-19 [E]
  # ok,和benben的本地一样,

  # 准备在pub里面签名
  gpg -u 199C28FA --sign-key 9D621B41 # -u指定你的master ID

  pub  rsa4096/1D1C69739D621B41
       创建于:2022-01-19  有效至:永不       可用于:SC
       信任度:未定义     有效性:未知
  sub  rsa4096/5D5AEF46D4AB1327
       创建于:2022-01-19  有效至:永不       可用于:E
  [ 未知 ] (1). benben (benben) <benben@liuliancao.com>


  pub  rsa4096/1D1C69739D621B41
       创建于:2022-01-19  有效至:永不       可用于:SC
       信任度:未定义     有效性:未知
   主密钥指纹: F662 BEF2 7042 1AA8 F220  50FF 1D1C 6973 9D62 1B41

       benben (benben) <benben@liuliancao.com>

  您真的确定要签名这个密钥,使用您的密钥
  “wdops <liuliancao@liuliancao.com>” (ABF181C9199C28A)

  真的要签名吗?(y/N) y

  gpg --list-keys
  /home/liuliancao/.gnupg/pubring.kbx
  -----------------------------------
  pub   rsa3072 2021-11-06 [SC] [有效至:2023-11-06]
        5FF5D6DD2B143A05301AB39E3DC8D10790F6D8EF
  uid           [ 绝对 ] liuliancao <liuliancao@gmail.com>
  sub   rsa3072 2021-11-06 [E] [有效至:2023-11-06]

  pub   rsa3072 2022-01-19 [SC] [有效至:2024-01-19]
        A41C48868765BF123D11425BABF181C9199C28FA
  uid           [ 绝对 ] liuliancao <liuliancao@liuliancao.com>
  sub   rsa3072 2022-01-19 [E] [有效至:2024-01-19]

  pub   rsa4096 2022-01-19 [SC]
        F662BEF270421AA8F22050FF1D1C69739D621B41
  uid           [ 完全 ] benben (benben) <benben@liuliancao.com>
  sub   rsa4096 2022-01-19 [E]

我们这边生成一个新文件进行测试

1
2
3
4
5
6
7
cat benben-test.txt
this is test for benben.
# 进行加密,并且指定接收人为liuliancao和benben,如果只指定benben那只有benben可以看
gpg -r benben -r liuliancao --encrypt benben-test.txt
# 解密
# 本地
gpg benben-test.txt.gpg

benben服务器上面进行解密

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
gpg benben-test.txt.gpg

您需要输入密码,才能解开这个用户的私钥:“benben (benben) <benben@liuliancao.com>”
4096 位的 RSA 密钥,钥匙号 D4AB1327,建立于 2022-01-19 (主钥匙号 9D621B41)

gpg: 由 RSA 密钥加密、钥匙号为 6F917C31
gpg: 由 4096 位的 RSA 密钥加密,钥匙号为 D4AB1327、生成于 2022-01-19
      “benben (benben) <benben@liuliancao.com>”
cat benben-test.txt
this is test for benben.

这个时候我们就完成了一次完整的数据传递

私钥备份和恢复
1
2
3
4
# 备份
gpg --export-secret-keys > liuliancao-gpg.asc
# 恢复
gpg --import liuliancao-gpg.asc
gpg服务器默认不缓存密码
1
2
cat .gnupg/gpg-agent.conf 
max-cache-ttl 0

总结

  • gpg通过公私钥和密码共同保证安全性
  • gpg可以用于文件签名,邮件签名,文件加密等场景
  • gpg可以用于多人协同 只要通过keyserver下载下来团队成员的公钥,即可通过他的pub进行加密并发送给他 他个人的key可以加入公共的sub keys链

CSRF(Cross Site Request Forgery)跨站请求攻击

说白了就是其他地方防止一个攻击请求,利用用户本地的一些cookie session等,

点击以后就会触发用户意想不到的web请求,从而导致比如转账等情况。 wiki关于跨站请求攻击

通过令牌限制

比如django默认强制form表单增加{% csrf_token %}这种,通过每次表单都需要带一个token解决

设置http请求的refer字段

通过检查校验refer来看这个请求的调用来源是否是同源网站

表单增加一个随机数token

通过表单增加一个随机数据项(这个不存在cookie中),后端每次顺便校验一下随机数,实现类似csrf_token的效果

XSS(Cross Site scripting)跨站脚本攻击

wiki XSS 说白了就是通过用户误点击xss脚本,会执行攻击者的一些命令,

比如获取:

  • cookie,可以盗用信息,甚至可以转账,登录等
  • 通过植入flash,和设置cross domain获取更多权限
  • 利用iframe,frame,XMLHttp Request或者flash,执行一些管理员动作,比如发微博,加好友
  • 用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动
  • 在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DoS攻击的效果

预防方式

过滤特殊字符

调用对应库的encode函数或者检查函数

在http头指定内容的类型

渗透测试工具

扫描工具

masscan

Vault

vault是hashicorp公司针对安全数据存放和获取的一种解决方案,用于安全验证等,vault官网

部署前的安全检查 https://learn.hashicorp.com/tutorials/vault/production-hardening?in=vault/day-one-consul

配合aws和raft keepalived部署https://blog.yasithab.com/centos/hashicorp-vault-ha-cluster-with-raft-and-aws-kms-on-centos-7/

集群搭建with consul https://learn.hashicorp.com/tutorials/vault/deployment-guide

integrated storage https://learn.hashicorp.com/collections/vault/raft 安装完成以后

1
2
vault -autocomplete-install
complete -C /usr/bin/vault vault

export VAULT_ADDR='http://127.0.0.1:8200' vault status

max 768h change to 9000h

1
2
vault write sys/auth/token/tune max_lease_ttl=9000h
vault write sys/auth/token/tune default_lease_ttl=9000h

自签证书

ca证书相关

1
openssl s_client -showcerts  -servername baidu.com -connect baidu.com:443 > cacert.pem

一些安全相关的工具网站

参考文档