自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 565|回复: 0

【学习笔记】加密&网络安全

[复制链接]

85

主题

97

帖子

9329

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9329
发表于 2016-2-21 17:44:42 | 显示全部楼层 |阅读模式
安全加密

硬盘分区加密 cryptsetup     luks (linux unify  key setup )
文件加密      PGP(Pretty Good Privacy)  gpg (GNU Privacy Guard)
网络通讯加密 SSL/TLS    tunnel   VPN

对称加密
非对称加密

--------------------------------------------------------
LUKS(Linux  Unified  Key Setup)是为Linux硬盘加密标准。
通过提供一个标准的磁盘上的格式,它不仅方便之间分布的兼容性,而且还提供了多个用户密码的安全管理。
必须首先对加密的卷进行解密,才能挂载其中的文件系统
可以直接对分区或者逻辑卷来进行加密

# rpm -qf `which cryptsetup`
cryptsetup-luks-1.2.0-7.el6.x86_64

       cryptsetup  -  setup cryptographic volumes for
       dm-crypt (including LUKS extension)

--下面我在虚拟机上测试,新加一个盘,分成/dev/sdb1,不格式化
[root@localhost ~]# cryptsetup luksFormat /dev/sdb1
WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.
Are you sure? (Type uppercase yes): YES  --要大写的YES
Enter LUKS passphrase:
Verify passphrase:

[root@localhost ~]# cryptsetup luksOpen /dev/sdb1 secretdisk --这里是把这个加密磁盘做一个映射,后面的secretdisk这个名字自定义
Enter passphrase for /dev/sdb1:  --输入上一步设定的密码

[root@localhost ~]# ls /dev/mapper/secretdisk  --就会产生这个设备文件
/dev/mapper/secretdisk

[root@localhost ~]# mkfs.ext4 /dev/mapper/secretdisk --格式化,第一次需要,后面再次访问就不用了

[root@localhost ~]# mount /dev/mapper/secretdisk /mnt/ --挂载后,就可以进行读写操作了

[root@localhost /]# umount /mnt/ --如果不使用的话,先umount掉,
[root@localhost /]# cryptsetup luksClose /dev/mapper/secretdisk  --再close掉,那么/dev/mapper就没有secretdisk这个设备文件了

[root@localhost /]# mount /dev/sdb1 /mnt/ --想对原设备进行挂载也是没有用的
mount: unknown filesystem type 'crypto_LUKS'

[root@localhost ~]# cryptsetup luksOpen /dev/sdb1 abc --如果想要再次使用,就用这个命令再次open一个映射,名字可以不和上次的一样;当然还是需要输入你的密码

[root@localhost ~]# ls /dev/mapper/abc --就有这个设备了,挂载就可以得到里面的加密数据了

--也就是说,你就算得到了root权限;没有密码,是没有办法得到里面的数据的;当然你可以格式化/dev/sdb1,但数据肯定就都没了

=============================================================

文件加密

对称加密
--用同一个密钥进行加密,也要使用这个密钥去解密;所以不适合网络传输的加密;因为你在本地用密钥加密了,传数据给另一方还需要连密钥也传给他;所以会在中途被截

                网络
   张三 ----------------------> 银行
  1     密钥加密文件   
  2         网络传文件和密钥            
  3    文件和密钥都可能在网络会被截取

非对称加密
--使用一对密钥(公钥和私钥),把公钥给对方,对方要给你传数据,使用这个公钥加密;中途就算被截,没有私钥是解密不了;传过来后,使用你的私钥来解密;所以适合网络传输

                网络
   张三 ----------------------> 银行
  1    银行产生或者花钱买一对密钥
  2    银行把公钥发布到公网,但私钥自己保留
  3     用银行公钥加密数据   
  4         网络传加密数据给银行就可以           
  5  就算被截取,没有私钥,无法解密     


PGP(Pretty Good Privacy)
gpg (GNU Privacy Guard)


gpg加密
gpg   gpg — encryption and signing tool

[root@localhost ~]# rpm -qf `which gpg`
gnupg2-2.0.14-4.el6.x86_64

yum install gnupg2  -y
gnupg   gnu  privacy  guard
gpg指令是gnupg套件的一部分,可以用来加密数据和创建数字签名


例一,本机或远程文件的对称加密与解密

加密文件:
[root@li ~]# gpg2 -c test   --c参数是对称加密
密码:
重输入密码:
--加密后,产生test.gpg文件,就可以把原文件删除了;rm test -rf
# file test.gpg   --查看类型
test.gpg: data

# cat test.gpg --乱码
# vim test.gpg --乱码
# strings test.gpg --也看不到

解密文件:
[root@li ~]# gpg2 test.gpg

--对目录的做加密,先把目录打包,然后再做加密
--上面的加密文件scp传到远程机器,远程机器(任何远程机器)只要有密码,就可以解密(相当于是把加密文件和密钥一起打包传过去了)


----------------------------------------------------


例二,
通信双方使用密钥对做非对称加密和解密

  
   模拟银行        模拟用户张三
  10.1.1.36   ---------------- 10.1.1.35

第一步:
在银行10.1.1.36上查询自己电脑上的公钥和私钥
[root@li ~]# gpg2 --list-keys 或 gpg2 -k --查询本机的公钥,现在为空
[root@li ~]# gpg2 --list-secret-keys   或 gpg2 -K --查询本机的私钥,现在为空

第二步:
在银行10.1.1.36生成非对称加密的密钥
[root@li ~]# gpg2 --gen-key  --产生一对密钥

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1   --算法选择默认的1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)  --密钥长度,越长越安全,但加密和解密消耗的资源和时间也较长
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1   --密钥过期时间,我这里选择1天是为了方便后面测试
Key expires at Fri 09 Oct 2015 11:35:11 AM CST
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: haha
Name must be at least 5 characters long
Real name: hahahehe
Email address: hahahehe@126.com
Comment: @_@
You selected this USER-ID:
    "hahahehe (@_@) <hahahehe@126.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

--在这里输入两次密码,然后产生密钥对,可以需要你去(敲键盘,移动鼠标等去增加随机数)
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2015-10-09
pub   2048R/001CB3D4 2015-10-08 [expires: 2015-10-09]
      Key fingerprint = 4237 29F0 FE94 C99C 57ED  E0A9 7510 51DF 001C B3D4
uid                  hahahehe (@_@) <hahahehe@126.com>
sub   2048R/7F9ADD4B 2015-10-08 [expires: 2015-10-09]

--如果不能生成成功,报随机数不够的错误;解决方法:
--使用下面的命令查看系统随机数
# cat /proc/sys/kernel/random/entropy_avail
--随机数不够,可以在生成这对密钥时,再开一个终端用下面的命令生成一下
# rngd -r /dev/urandom -o /dev/random -f -t 1

[root@li test]# gpg2 -k  --生成后,小写k列出公钥
[root@li test]# gpg2 -K  --大写k列出私钥

第三步:
在银行10.1.1.36将公钥传到对方用户张三(这里我们是测试,所以用scp就可以了)
[root@li ~]# gpg2 --export > li.asc --导出公钥,结尾必须为.asc
[root@li ~]# scp li.asc 10.1.1.35:/root/ --拷到另一台电脑

第四步:
在用户张三10.1.1.35上导入银行传过来的公钥
[root@station35 ~]# rdate -s 时间服务器IP   --先进行时间同步一下(或者使用ntpdate)
[root@station35 ~]# gpg2 --import /root/li.asc
[root@station35 ~]# gpg2 -k
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/001CB3D4 2015-10-08 [expires: 2015-10-09]
uid                  hahahehe (@_@) <hahahehe@126.com>
sub   2048R/7F9ADD4B 2015-10-08 [expires: 2015-10-09]


测试一:
[root@station35 ~]# gpg2 -e -r hahahehe /etc/fstab
--   -r参数代表公钥的名字,因为你机器可以注册别人的多个公钥

传回给银行10.1.1.36
[root@station35 ~]# scp /etc/fstab.gpg 10.1.1.36:/test1/

然后再使用自己的私钥去解密,可以解密成功
[root@li ~]# gpg2 -d /test1/fstab.gpg

测试二:
如果你把加密的文件传给没有私钥的第三方,那么他也用下面的命令去解密,会直接报没有私钥,解密失败
# gpg2 -d /root/fstab.gpg
gpg: encrypted with RSA key, ID E2F4585F
gpg: decryption failed: No secret key

测试三
把用户张三10.1.1.35的机器时间使用date-s 改成过期后的时间,再加密,就直接报公钥过期,不可用
# gpg2 -e -r hahahehe /etc/inittab
gpg: hahahehe: skipped: Unusable public key
gpg: /etc/inittab: encryption failed: Unusable public key

测试四:
在银行10.1.1.36产生一个回收公钥的证书
# gpg2 -o cancelhahahehe.asc --gen-revoke hahahehe
传给要被回收的公钥方
[root@li ~]# scp cancelhahahehe.asc 10.1.1.35:/root/
公钥方导入这个回收证书,就可以把原来的uid为hahahehe的这个公钥给失效了
[root@station35 ~]# gpg2 --import /root/cancelhahahehe.asc

用失效的公钥加密,已经不可以了
[root@station35 ~]# gpg2 -e -r hahahehe /etc/inittab  
gpg: hahahehe: skipped: Unusable public key
gpg: /etc/inittab: encryption failed: Unusable public key

--总结:上面的主要是说明了这个对称加密和非对称加密的原理,和演示了一过加密解密的过程;  实际在网络应用里,不会手动这么麻烦的去做;使用TLS/SSL协议,就是网络上的非对称加密的典型应用

密钥的删除:先删除私钥,再删除公钥
# gpg2 --delete-secret-keys hahahehe
# gpg2 --delete-keys hahahehe


gpg 签名
对一个文件或者rpm软件包进行签名,就是对数据完整性进行保护,表示这个文件是由官方签名的
如果你下载的文件或者rpm软件包没有对应的签名,则表示这个文件是可疑的,有可能被人恶意修改过
很多软件的官网上除了软件包的下载,还有其对应的签名文件和public key文件下载

# 笔记目录下/arch/gpg_sign_soft/ --这是我在mediawiki官方下载的一个软件包及其对应的签名和key文件
mediawiki-1.25.2.tar.gz  mediawiki-1.25.2.tar.gz.sig  mediawiki_pubkey.txt

# gpg2 --verify mediawiki-1.25.2.tar.gz.sig  mediawiki-1.25.2.tar.gz
gpg: Signature made Tue 11 Aug 2015 05:27:49 AM CST using RSA key ID 23107F8A
gpg: Can't check signature: No public key
--这个验证签名,但结果是报:不能检测签名,没有public key的错误
# gpg2 --import mediawiki_pubkey.txt --导入mediawiki的公钥

# gpg2 --verify mediawiki-1.25.2.tar.gz.sig  mediawiki-1.25.2.tar.gz
gpg: Signature made Tue 11 Aug 2015 05:27:49 AM CST using RSA key ID 23107F8A
gpg: Good signature from "Chad Horohoe <chad@wikimedia.org>"
gpg:                 aka "keybase.io/demon <demon@keybase.io>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 41B2 ABE8 17AD D3E5 2BDA  946F 72BC 1C5D 2310 7F8A

看到有good signature from 这一句,说明这个软件包有完整签名,没问题

=======================================================================


网络通迅加密
tls/ssl 协议  
SSL 安全套接层  security socket layer
TLS 传输层安全  transport layer  security
openssl  --ssl的开源软件

课后扩展:
上网查:百度为什么由http改为https?

https  = http + ssl
1,安装ssl包
yum install httpd* openssl* mod_ssl -y  

2,使用rpm版的ssl创建证书和密钥
# cd /etc/pki/tls/certs/
# make httpd.crt --证书名字可以随意写,扩展名用crt(不一定)
umask 77 ; \
        /usr/bin/openssl genrsa -des3 1024 > httpd.key
Generating RSA private key, 1024 bit long modulus
....................++++++
.........................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase: --两次密码,自己设定,以后有用
umask 77 ; \
        /usr/bin/openssl req -utf8 -new -key httpd.key -x509 -days 365 -out httpd.crt -set_serial 0
Enter pass phrase for httpd.key: --自动创建私钥,输密码

Country Name (2 letter code) [GB]:cn
State or Province Name (full name) [Berkshire]:guangdong
Locality Name (eg, city) [Newbury]:shenzhen
Organization Name (eg, company) [My Company Ltd]:haha
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:li.cluster.com
Email Address []:li@126.com

3,编译httpd配置文件,让它支持ssl
# vim /etc/httpd/conf.d/ssl.conf
105 SSLCertificateFile /etc/pki/tls/certs/httpd.crt  --证书,就是公钥,散发到网上的
112 SSLCertificateKeyFile /etc/pki/tls/certs/httpd.key --私钥,自己保存的

4,重启apache
# /etc/init.d/httpd restart
Stopping httpd:                                          [  OK  ]
Starting httpd: Apache/2.2.3 mod_ssl/2.2.3 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.
Server localhost.localdomain:443 (RSA)
Enter pass phrase:   --输入创建证书时的密码
OK: Pass Phrase Dialog successful.
                                                         [  OK  ]
# netstat -ntlup |grep httpd
tcp        0      0 :::80                       :::*                        LISTEN      5821/httpd         
tcp        0      0 :::443                      :::*                        LISTEN      5821/httpd

--如果启不起来,报443被占用,很有可能是你的vmware-workstation-server服务是开启状态
解决方法:
service vmware-workstation-server stop
chkconfig vmware-workstation-server off


使用下面的url来访问,下载并确认证书
https://10.1.1.35/

--每次重启
# vim /etc/init.d/httpdssl  
#!/bin/bash
# chkconfig: 2345 85 15
# description:  https start scripts
expect<<ABC
spawn /etc/init.d/httpd restart
expect "phrase:"
send "123456\n"
expect eof
ABC

# yum install expect -y
# chmod 755 /etc/init.d/httpdssl
# chkconfig --add httpdssl
# chkconfig httpdssl on
# chkconfig httpd off

--如果你希望完全自动,就把上面的脚本写成服务脚本,放到/etc/init.d下,让它支持chkconfig,然后chkconfig  on起来就可以了
--还有一点就是脚本里的密码,你不希望被人看到,可以用上面的shc工具对脚本加密

===============================================================

nginx+ssl

# cd /etc/pki/tls/certs/
# make nginx.crt       --创建证书,得到nginx.crt和nginx.key
# vim /usr/local/nginx/conf/nginx.conf  --在server { } 配置段里加上下面三句,并把监听端口改成443就可以了
listen    443;
        ssl                  on;
        ssl_certificate      /etc/pki/tls/certs/nginx.crt;
        ssl_certificate_key  /etc/pki/tls/certs/nginx.key;

然后重启nginx就可以了
# /usr/local/nginx/sbin/nginx
Enter PEM pass phrase:

==============================================================

smtp+ssl=smtps 465
pop3+ssl=pop3s 995

ftp+ssl=ftps
samba+ssl=smbs
dns+ssl  --没有
nfs+ssl  --没有
rsync+ssl --没有
总结:一般ssl的应用主要是https,smtps,ftps
==============================================================

postfix +ssl/tls

1,安装相关软件包
yum install postfix* dovecot* openssl*  cyrus-sasl -y

SASL(simple authentication and security layer)
SASL有什么用?
这里我们讨论自己为公司所做的邮件服务器(服务客户为公司员工,不是象@126.com,@qq.com这种服务全网用户的)
那么邮件服务器一般来说需要外网IP(这样员工出差,或者在家才能连上公司邮件服务器)
默认情况下,非受信任网络(一般是非内网用户)的人使用邮件服务器,是不可以发送外部邮件的(这就是邮件的转发relay)
那么员工出差或在家里,要使用公司的邮件服务器对外网的一个客户(客户用的不是你公司的邮箱)发送邮件,如何判断你是这个公司的那个员工呢?
答案就是使用SASL做验证(用户名,密码正确就可以)


2,创建证书
# cd /etc/pki/tls/certs
# make postfix.pem  --PEM的全称(Privacy Enhanced Mail)


3,编辑postfix主配置文件
# vim /etc/postfix/main.cf
myhostname = li.cluster.com --本机主机名
mydomain = cluster.com --本机域名,postfix会自动扣除主机名第一点号前的部分作为域名。如果不是FQDN形式的主机名,就一定要手动配置你的域名
myorigin = $mydomain --当你在li.cluster.com以user1发送邮件,它会自动把你的发信地址改为user1@cluster.com
inet_interfaces = all --监听所有
mydestination = $myhostname, localhost.$mydomain, localhost ,$mydomain
  --加上$mydomain,则表示可以直接以域名来收邮件
mynetworks = 10.1.1.0/24, 127.0.0.0/8 --信任网络,在这里也可以不配,因为默认值为subnet,也就是本网段内的都是信任网络

--然后在配置文件最后加上下面一大段,配置sasl验证
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
reject

--再加上下面一段,配置ssl
smtpd_use_tls = yes
smtpd_tls_key_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_CAfile = /etc/pki/tls/certs/postfix.pem

# vim /etc/postfix/master.cf --修改这个配置文件,这是一句话,直接加到配置文件最后
smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smptd_sasl_auth_enable=yes

# /etc/init.d/postfix  restart --如果先前启动了sendmail,先停sendmail再启postfix,或者使用system-switch-mail来切换MTA
# /etc/init.d/saslauthd restart

4,rhel6.5下配置dovecot+ssl
# vim /etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp  --第二十行打开注释
login_trusted_networks = 10.1.1.0/24

# vim /etc/dovecot/conf.d/10-ssl.conf
ssl_cert = </etc/pki/tls/certs/postfix.pem
ssl_key = </etc/pki/tls/certs/postfix.pem --两个<符号不能去掉

# vim /etc/dovecot/conf.d/10-mail.conf
   mail_location = mbox:~/mail:INBOX=/var/mail/%u

# /etc/init.d/dovecot restart

5,配置dns支持邮件交换

yum install bind* -y

# vim /etc/named.conf
listen-on port 53 { any; };
allow-query     { any; };


zone "cluster.com" IN {
        type master;
        file "data/master.cluster.com.zone";
};


# vim /var/named/data/master.cluster.com.zone
$TTL 86400
@       IN      SOA     sdfssf.sfas.com. root. (
                            2015100801
                                60
                                30
                                360
                                86400   )
        IN      NS      10.1.1.7.
        IN      MX 0    10.1.1.7.
mail    IN      A       10.1.1.7
# /etc/init.d/named restart

6,验证:
客户端DNS指向DNS服务器
outlook:
在账号-属性-高级-把发送和接收的此服务器要求安全连接SSL 两个选项打勾,并把发送端口改为465,接收端口是995
因为还配置了验证,所以非10.1.1.0/24网段的需要把"我的服务器要求身份验证"前面的勾打上

===============================================================

ip tunnel (在网络上建立虚拟的通道,用于做VPN这种应用)

Linux有3种隧道。它们是:
IP-in-IP隧道
GRE 隧道
非内核隧道(如PPTP)
GRE是最初由CISCO开发出来的隧道协议,能够做一些IP-in-IP隧道做不到的事情。比如,你可以使用GRE隧道传输多播数据包和IPv6数据包。在Linux下,你需要ip_gre.o模块

          因特网
  深圳分公司  ---------  北京分公司
        建立tunnel

使用四台虚拟机来模拟实现(不用宿主机模拟,宿主机能和所有网段通)

--下图中10.1.1.0网段模拟外网;1.1.1.0网段模拟内网1;2.2.2.0网段模拟内网2
--(虽然在实际情况下10.1.1.0是内网,1.1.1.0和2.2.2.0是外网,但我这里只是实验环境模拟)
我下面是用vmware来模拟
10.1.1.0为bridge网络
1.1.1.0为hostonly1网络(vmnet1)
2.2.2.0为hostonly2网络(vmnet2)

     10.1.1.7      10.1.1.9      
      外1(深圳VPN)      外2(北京VPN)
     1.1.1.128      2.2.2.128

内1 (深圳内网机器)    内2 (北京内网机器)
1.1.1.129     2.2.2.129
网关指向1.1.1.128    网关指向2.2.2.128


SIP:1.1.1.129  DIP:10.1.1.9


先在外1和外2在打开ip_forword
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1  --0改为1
# sysctl -p


建立外1和外2之间的tunnel
1,外1上面操作
# modprobe ip_gre --tunnel协议
# lsmod |grep gre
ip_gre                 15341  0

ip tunnel add tun0 mode gre  remote 10.1.1.9 local 10.1.1.7
ip link set tun0 up
ip addr add 3.3.3.3 peer 3.3.3.4 dev tun0
ip route add 2.2.2.0/24 dev tun0

--上面这四条的意思:
第一条,增加一个tun0接口,隧道模式为gre,由本端的10.1.1.7和对端的10.1.1.9这个物理连接上建立
第二条,启动tun0这个网卡接口,然后ifconfig命令就可以查看得到
第三条,给本地的tun0授于IP为3.3.3.3,对端为3.3.3.4;完成后ifconfig就能看到tun0的IP
第四条,表示当本机数据包要访问2.2.2.0/24这个网段时从tun0出去;完成后route -n可以看到这条路由

2,外2上的操作
# modprobe ip_gre
# lsmod |grep gre
ip_gre                 15341  0

ip tunnel add tun0 mode gre  remote 10.1.1.7 local 10.1.1.9
ip link set tun0 up
ip addr add 3.3.3.4 peer 3.3.3.3 dev tun0
ip route add 1.1.1.0/24 dev tun0

3,内1上的操作
把网关指向外1的内网IP
route add default gw 1.1.1.128

4,内2上的操作
把网关指向外2的内网IP
route add default gw 2.2.2.128

5,测试,内1和内2两个内网可以互相ping通,并且可以使用traceroute 命令接IP,查看确实走了tunnel
测试完后,删除tunnel的方法  ip tunnel del tun0
--如果做的有问题,可以用ip tunnel del tun0命令删除后,重新,再写上面的四条

扩展:
上面架构做好后,深圳内网用户1.1.1.129ping不通10.1.1.9(北京vpn外网IP),但反过来(就是北京vpn可以ping通深圳内网用户)却可以ping通
--从tunnel过,才可以从tunnel回。不能不从tunnel过,而从tunnel回

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2022-9-27 23:27 , Processed in 0.053394 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表