数据加密的最大特点是不可逆性
确保数据的机密性:
–对称加密:加密/解密用同一个密钥
–非对称加密:加密/解密用不同的密钥(公钥,私钥)
保护信息的完整性:
–信息摘要:基于输入的信息生成长度较端,位数固定的散列值
常见的加密算法:
对称加密:
–DES ,Data Encryption Standard
–AES , Advanced Encryption Standard
非对称加密:
–RSA,Rivest Shamish Adleman
–DSA,Digita Signature Algorithm
一 : 检查文件的MD5校验和
1 将etc目录下的配置文件加密后写入新的文件 a.md5
for i in `ls /etc/*.conf`
do
md5sum $i >>/a.md5
done
2 任意改动/etc/my.conf的内容:修改追加重定向的文件b.md5
for i in `ls /etc/*.conf`
do
md5sum $i >> /b.md5
done
3 利用diff查看文件的的md5校验码的区别
[root@room9pc01 ~]# diff /a.md5 /b.md5
1,2d0
< b244e3b37f10a5e9275303908d27d712 my.cnf
二 使用GPG对称加密方式保护文件,自身加密,自身解密
1 查看版本
[root@mysql11 ~]# gpg --version
gpg (GnuPG) 2.0.22
libgcrypt 1.5.3
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: ~/.gnupg
支持的算法:
公钥:RSA, ?, ?, ELG, DSA
对称加密:IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
散列:MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩:不压缩, ZIP, ZLIB, BZIP2
2 定义一个文本文件
[root@mysql11 ~]# echo 123456 > w.txt
3 使用gpg对称加密
[root@mysql11 ~]# gpg -c w.txt //在当前目录下生成w.txt.gpg文件
4 对gpg文件解密
[root@mysql11 ~]# gpg -d w.txt.gpg > w1.txt
gpg: 钥匙环‘/root/.gnupg/secring.gpg’已建立
gpg: CAST5 加密过的数据
gpg: 以 1 个密码加密
gpg: 警告:报文未受到完整的保护
[root@mysql11 ~]# cat w1.txt
123456
三 非对称密钥:私钥解密 公钥加密
步骤:
–UserA(生成一对密钥)
–UerA把公钥传给UserB
–UserB使用公钥加密数据,并把数据传给UserA
–UserA使用公钥解密
1 主机web33 192.168.4.33生成非对称密钥对
[root@web33 ~]# gpg --gen-key //创建密钥对
… …
请选择您要使用的密钥种类:
(1) RSA and RSA (default) //默认算法为RSA
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择? //直接回车默认(1)
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048) //接受默认2048位
您所要求的密钥尺寸是 2048 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) //接受默认永不过期
密钥永远不会过期
以上正确吗?(y/n)y //输入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>"
真实姓名:liuqi
电子邮件地址:ww@qq.com
注释:this is key
您选定了这个用户标识:
“liuqi (this is key) <ww@qq.com>”
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?O
您需要一个密码来保护您的私钥。
您不想要有密码――这个想法实在是遭透了!
不过,我仍然会照您想的去做。您任何时候都可以变更您的密码,仅需要
再次执行这个程序,并且使用“--edit-key”选项即可。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 FA75B8F6 被标记为绝对信任
公钥和私钥已经生成并经签名。
gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
pub 2048R/FA75B8F6 2018-12-08
密钥指纹 = F3D3 39C9 0CF7 DD37 3CD0 78C6 B906 71C1 FA75 B8F6
uid liuqi (this is key) <ww@qq.com>
sub 2048R/336316F2 2018-12-08
查看公钥环
[root@web33 ~]# gpg --list-keys //查看公钥环
/root/.gnupg/pubring.gpg
pub 2048R/FA75B8F6 2018-12-08
uid liuqi (this is key) <ww@qq.com>
sub 2048R/336316F2 2018-12-08
//注意:这个公钥的对象可以用这些来表示:FA75B8F6 liuqi ww@qq.com 336316F2
//需要用的时候随意选择一个即可,只要不与其他公钥环的信息冲突
2 web33导出自己的公钥文件
[root@web33 ~]# gpg -a --export liuqi>liuqi.pub
–导出到当前目录下,文件名自定义
–可以用之前定义密钥对的真实姓名或者邮箱作为导出对象
–当不加选项a时看到的liuqi.pub内容为乱码
3 传递密钥文件给web44 :192.168.4.44
[root@web33 ~]# scp liuqi.pub 192.168.4.44:/tmp/
4 web44导入接收的公钥信息
[root@web44 ~]# gpg --import /tmp/liuqi.pub
gpg: 已创建目录‘/root/.gnupg’
gpg: 新的配置文件‘/root/.gnupg/gpg.conf’已建立
gpg: 警告:在‘/root/.gnupg/gpg.conf’里的选项于此次运行期间未被使用
gpg: 钥匙环‘/root/.gnupg/secring.gpg’已建立
gpg: 钥匙环‘/root/.gnupg/pubring.gpg’已建立
gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 FA75B8F6:公钥“liuqi (this is key) <ww@qq.com>”已导入
gpg: 合计被处理的数量:1
gpg: 已导入:1 (RSA: 1)
[root@web44 ~]# gpg --list-key //查看公钥信息
/root/.gnupg/pubring.gpg
pub 2048R/FA75B8F6 2018-12-08
uid liuqi (this is key) <ww@qq.com>
sub 2048R/336316F2 2018-12-08
5 在web44上利用公钥将文件加密后传给web33
[root@web44 ~]# gpg -e -r ww@qq.com hello.txt //-e选项是使用密钥加密数据 , -r选项后面跟的是密钥,说明使用哪个密钥对文件加密
gpg: 336316F2:没有证据表明这把密钥真的属于它所声称的持有者
pub 2048R/336316F2 2018-12-08 liuqi (this is key) <ww@qq.com>
主钥指纹: F3D3 39C9 0CF7 DD37 3CD0 78C6 B906 71C1 FA75 B8F6
子钥指纹: 682E 2A70 BBD5 E982 4D5C 0FF1 B8E9 0CC2 3363 16F2
这把密钥并不一定属于用户标识声称的那个人。如果您真的知道自
己在做什么,您可以在下一个问题回答 yes。
无论如何还是使用这把密钥吗?(y/N)y
[root@web44 ~]# ls
anaconda-ks.cfg hello.txt.gpg
[root@web44 ~]# scp hello.txt.gpg 192.168.4.33:/root //加密的数据传给web33
6 web33以自己的私钥解密文件
[root@web33 ~]# gpg -d hello.txt.gpg > web33.txt
gpg: 由 2048 位的 RSA 密钥加密,钥匙号为 336316F2、生成于 2018-12-08
“liuqi (this is key) <ww@qq.com>”
[root@web33 ~]# cat web33.txt
hello world
四 非对称密钥 : 私钥(签名) 公钥(验证签名) //验证数据的来源与私钥签名
–使用私钥签名的文件,是可以使用对应的公钥验证签名的,只要验证成功,则说明这个文件一定是出自对应的私钥签名,除非私钥被盗,否则一定能证明这个文件来自于某个人!
1 建立测试软件包
[root@web33 ~]# tar -zcf log.tar /var/log
2 为软件包创建分离式签名
[root@web33 ~]# gpg -b log.tar
[root@web33 ~]# ls //注意创建签名后生成的log.tar.sig为文件签名
anaconda-ks.cfg liuqi.pub log.tar 公共 图片 音乐
hello.txt.gpg lnmp_soft log.tar.sig
3 将文件和签名传送给web44 192.168.4.44
[root@web33 ~]# scp log.tar* 192.168.4.44:/root
root@192.168.4.44's password:
log.tar 100% 568KB 11.4MB/s 00:00
log.tar.sig
4 web44验证数据的来源
[root@web44 ~]# gpg --verify log.tar.sig log.tar
gpg: 于 2018年12月08日 星期六 11时40分47秒 CST 创建的签名,使用 RSA,钥匙号 FA75B8F6
gpg: 完好的签名,来自于“liuqi (this is key) <ww@qq.com>”
gpg: 警告:这把密钥未经受信任的签名认证!
gpg: 没有证据表明这个签名属于它所声称的持有者。
主钥指纹: F3D3 39C9 0CF7 DD37 3CD0 78C6 B906 71C1 FA75 B8F
// 注意log.tar.sig log.tar两个文件的顺序 如果写反了会验证失败,如下
[root@web44 ~]# gpg --verify log.tar log.tar.sig
gpg: 找不到有效的 OpenPGP 数据。
gpg: 签名无法被验证。
请记住签名文件(.sig或.asc)
应该是在命令行中给定的第一个文件
五 使用AIDE做入侵检测
–Aide通过检查数据文件的权限、时间、大小、哈希值等,校验数据的完整性。
–使用Aide需要在数据没有被破坏前,对数据完成初始化校验,生成校验数据库文件,在被攻击后,可以使用数据库文件,快速定位被人篡改的文件。
1 安装软件包
[root@web44 ~]# yum -y install aide
2 修改配置文件:
[root@web44 ~]# vim /etc/aide.conf
@@define DBDIR /var/lib/aide //数据库目录
@@define LOGDIR /var/log/aide //日志目录
database_out=file:@@{DBDIR}/aide.db.new.gz //数据库文件名
//以下内容为可以检查的项目(权限,用户,组,大小,哈希值等)
#p: permissions
#i: inode:
#n: number of links
#u: user
#g: group
#s: size
#md5: md5 checksum
#sha1: sha1 checksum
#sha256: sha256 checksum
DATAONLY = p+n+u+g+s+acl+selinux+xattrs+sha256
//以下内容设置需要对哪些数据进行入侵校验检查
//注意:为了校验的效率,这里将所有默认的校验目录与文件都注释
//仅保留/root目录,其他目录都注释掉
/root DATAONLY
#/boot NORMAL //对哪些目录进行什么校验
#/bin NORMAL
#/sbin NORMAL
#/lib NORMAL
#/lib64 NORMAL
#/opt NORMAL
#/usr NORMAL
#!/usr/src //使用[!],设置不校验的目录
#!/usr/tmp
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
注意:一般在文件内容不做修改的情况下对其进行检测,校验
3 侵前对数据进行校验,生成初始化数据库
[root@web44 ~]# aide --init
AIDE, version 0.15.1
AIDE database at /var/lib/aide/aide.db.new.gz initialized.
//生成校验数据库,数据保存在/var/lib/aide/aide.db.new.g
4 备份数据库,将数据库文件拷贝到U盘(非必须的操作)
[root@web44 ~]# cp /var/lib/aide/aide.db.new.gz /media/
5 对root目录进行改动,再进行对比检测
[root@web44 ~]# aide --check
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2018-12-08 14:28:46
Summary:
Total number of files: 932
Added files: 1
Removed files: 1
Changed files: 1
---------------------------------------------------
Added files:
---------------------------------------------------
added: /root/er.txt
---------------------------------------------------
Removed files:
---------------------------------------------------
removed: /root/hello.txt
---------------------------------------------------
Changed files:
---------------------------------------------------
changed: /root/a.txt
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /root/a.txt
Size : 0 , 4
SHA256 : 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NM , GBIQ+PnHecJtodmyB1veAScwLuDj/K
六 扫描与抓包分析
1 使用NMAP扫描来获取指定主机/网段的相关信息
[root@web44 ~]# yum -y install nmap
//基本用法:
nmap [扫描类型] [选项] <扫描目标 ...>
//常用的扫描类型
// -sS,TCP SYN扫描(半开)
// -sT,TCP 连接扫描(全开)
// -sU,UDP扫描
// -sP,ICMP扫描
// -A,目标系统全面分析
2 检查192.168.4.100主机是否可以ping通
[root@web44 ~]# nmap -n -sP 192.168.4.100 //-n代表不进行DNS解析
[root@web44 ~]# nmap -n -sP 192.168.4.0/24
3 检查目标主机所开启的TCP服务
[root@web44 ~]# nmap -sT 192.168.4.30 //sT 和 sS 的区别 : sT 为tcp三次握手 sS为tcp前两次握手(速度相对要块,半开)
Starting Nmap 6.40 ( http://nmap.org ) at 2018-12-08 15:12 CST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.4.30
Host is up (0.00050s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
111/tcp open rpcbind
2049/tcp open nfs
MAC Address: 52:54:00:73:86:D9 (QEMU Virtual NIC)
4 检查目标主机所开启的UDP服务(注意 ,检测UDP的速度非常的慢,10分钟以上)
[root@web44 ~]# nmap -sU 192.168.4.0/24
5 全面分析目标主机192.168.4.100和192.168.4.5的操作系统信息
[root@web33 ~]# nmap -A 192.168.4.254 //
Starting Nmap 6.40 ( http://nmap.org ) at 2018-12-08 15:24 CST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap done: 2 IP addresses (0 hosts up) scanned in 0.87 seconds
[root@web33 ~]# nmap -A 192.168.4.254
Starting Nmap 6.40 ( http://nmap.org ) at 2018-12-08 15:24 CST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.4.254
Host is up (0.00032s latency).
Not shown: 993 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.2
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| drwxr-xr-x 2 0 0 4096 Oct 23 13:59 centos
| drwxr-xr-x 2 0 0 4096 Nov 13 02:17 ceph
| -rw-r--r-- 1 0 0 74692 Nov 21 08:57 libev-4.15-1.el6.rf.x86_64.rpm
| -rw-r--r-- 1 0 0 86564 Nov 21 08:57 libevent-devel-2.0.21-4.el7.x86_64.rpm
| -rw-r--r-- 1 0 0 7688608 Nov 21 00:59 percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
| drwxr-xr-x 3 0 0 4096 Dec 06 00:28 pub
| dr-xr-xr-x 9 0 0 4096 Jul 11 2017 rhel7
|_drwxrwxrwx 2 0 0 4096 Apr 26 2018 share [NSE: writeable]
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey: 2048 37:af:35:48:2a:ed:f7:b9:c2:6b:d8:fe:fa:6c:7b:02 (RSA)
|_256 dc:95:db:de:7e:c3:7d:34:ff:41:d4:e5:bb:97:5f:e9 (ECDSA)
53/tcp open domain dnsmasq 2.76
| dns-nsid:
|_ bind.version: dnsmasq-2.76
80/tcp open http Apache httpd 2.4.6 ((CentOS))
| http-methods: Potentially risky methods: TRACE
|_See http://nmap.org/nsedoc/scripts/http-methods.html
TRACEROUTE
HOP RTT ADDRESS
1 0.31 ms 192.168.4.254
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 20.41 seconds
6 检查192.168.4.0/24网段内哪些主机开启了FTP、SSH服务
[root@web33 ~]# nmap -p 21-22 192.168.4.0/24
PORT STATE SERVICE
21/tcp closed ftp
22/tcp open ssh
MAC Address: 52:54:00:29:CA:6E (QEMU Virtual NIC)
七 使用tcpdump分析FTP访问中的明文交换信息
nmap是扫描工具
tcpdump抓包工具+其他(IP地址欺骗/DHCP欺骗)
1 环境准备web44做ftp服务端
[root@web44 ~]# yum -y install vsftpd
[root@web44 ~]# useradd tom
[root@web44 ~]# echo 123456 | passwd --stdin tom
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@web44 ~]# echo wwwwwwww > /home/tom/nb.txt
[root@web44 ~]# systemctl restart vsftpd
[root@web44 ~]# systemctl enable vsftpd
2 环境准备web33做ftp客户端
[root@web33 ~]# yum -y install ftp
[root@web33 ~]# ftp 192.168.4.44
Connected to 192.168.4.44 (192.168.4.44).
220 (vsFTPd 3.0.2)
Name (192.168.4.44:root): tom //输入用户名
331 Please specify the password.
Password: //输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,4,44,193,174).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 9 Dec 08 08:15 nb.txt //服务端共享的文件
226 Directory send OK.
ftp>
3 启用tcpdump命令行抓包
执行tcpdump命令行,添加适当的过滤条件,只抓取访问主机192.168.4.5的21端口的数据通信 ,并转换为ASCII码格式的易读文本。
这里假设,192.168.4.5主机有vsftpd服务,如果没有需要提前安装并启动服务!!!
[root@proxy ~]# tcpdump -A host 192.168.4.5 and tcp port 21
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
.. .. //进入等待捕获数据包的状态
//监控选项如下:
// -i,指定监控的网络接口(默认监听第一个网卡)
// -A,转换为 ACSII 码,以方便阅读
// -w,将数据包信息保存到指定文件
// -r,从指定文件读取数据包信息
//tcpdump的过滤条件:
// 类型:host、net、port、portrange 主机/ net/端口/端口范围
// 方向:src、dst 源/目标
// 协议:tcp、udp、ip、wlan、arp、……
// 多个条件组合:and、or、not
4 web33执行ftp访问,在21端口产生数据
[root@web33 ~]# ftp 192.168.4.44
Connected to 192.168.4.44 (192.168.4.44).
220 (vsFTPd 3.0.2)
Name (192.168.4.44:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
5 观察抓包的结果(回到web44主机观察tcpdump抓包的结果)
[root@web44 ~]# tcpdump -A tcp port 21 and host 192.168.4.33
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:36:56.824253 IP 192.168.4.33.60104 > web44.ftp: Flags [P.], seq 1:11, ack 21, win 229, options [nop,nop,TS val 196470329 ecr 196460149], length 10: FTP: USER tom
E..>..@.@......!...,.........g.!...........
...9...uUSER tom
16:37:00.200125 IP 192.168.4.33.60104 > web44.ftp: Flags [P.], seq 11:24, ack 55, win 229, options [nop,nop,TS val 196473705 ecr 196462879], length 13: FTP: PASS 123456
E..A. @.@......!...,.........g.C...........
...i....PASS 123456
……………………
6 再次使用tcpdump抓包,使用-w选项可以将抓取的数据包另存为文件,方便后期慢慢分析
[root@web44 ~]# tcpdump -A tcp port 21 and host 192.168.4.33 -w ftp.txt
7 tcpdump命令的-r选项,可以去读之前抓取的历史数据文件
[root@web44 ~]# tcpdump -A -r ftp.txt | egrep '(USER|PASS)'
八 使用tcpdump分析Nginx的明文账户认证信息信息
1 在主机(192.168.4.33)准备一台需要用户认证的Nginx服务器
[root@web33 ~]# cd /usr/local/nginx/conf/
[root@web33 ~]# cp nginx.conf.default nginx.conf //还原配置文件
[root@web33 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
auth_basic "xx";
auth_basic_user_file "/usr/local/nignx/pass";
… …
[root@web33 ~]# htpasswd -c /usr/local/nginx/pass jerry //创建账户文件
New password:123456 //输入密码
Re-type new password:123456 //确认密码
[root@web33 ~]# nginx -s reload
2 在33主机使用tcpdump命令抓包
[root@web33 ~]# tcpdump -A host 192.168.4.5 and tcp port 80
3 在客户端192.168.4.254使用火狐浏览器访问192.168.4.33
[root@pc001 ~]# firefox http://192.168.4.33 //根据提示输入用户名与密码
4 回到33主机查看抓包的数据结果
[root@web33 ~]# tcpdump -A host 192.168.4.33 and tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
… …
Authorization: Basic dG9tOjEyMzQ1Ng==
… …
5 查看base64编码内容
[root@web33 ~]# echo "dG9tOjEyMzQ1Ng==" | base64 -d
tom:123456
[root@web33 ~]# printf "tom:123456" | base64 //注意,因为echo有回车功能,在这里如果还是用echo就会出错。
dG9tOjEyMzQ1Ng==