1、加密方式
1)对称加密:加密算法+口令
加密算法:DES(56bits),3DES,AES(128bits),Blowfish
特点:
加密,解密使用同一个口令
将原文分割成固定大小的数据块,对这些块进行加密
缺点:
1、口令传输
2、口令太多
密钥交换:(IKE)DH算法
私密性:保证
用户认证:无法验证
数据完整性:无法验证
2)非对称加密(公钥加密):密钥对儿,公钥产生于私钥之中,私钥解密
加密算法:RSA,EIGamal,DSA,
3)单向加密:只能从明文产生密文,反之不成,严格意义上来讲,它实现的是提取数据特征码
同一个数据,使用同一个算法,多次计算得到的结果一定相同,所以常用于验证数据完整性
定长输出,无论原数据大小是什么,加密后结果输入长度相同
输出格式:$加密算法$8位随机字符$加密后的密码
算法:MD5:(centos5),SHA1 ,SHA512:(centos6,7采用)
2、PKI:Public Key Infrastucture 公钥基础架构
数据-->单向加密-->特征码-->私钥加密-->对称加密-->对方的公钥加密
完整性 发送者身份认证 私密性 口令传输
一次加密通信过程
发送者:
1、使用单向加密算法提取生成数据的特征码;
2、使用自己的私钥加密特征码附加在数据后面;
3、生成用于对称加密的临时密钥;
4、用此临时密钥加密数据和已经使用私钥加密后的特征码;
5、使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方;
接收方:
1、使用自己的私钥解密加密的临时密钥;从而获得对称密钥;
2、使用对称密钥解密对称加密的 数据和私钥加密的特征码密文;从而获得数据和特征码密文;
3、使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码;
4、使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较;
二、OPENSSL
NIST:
保密性:
数据保密性
隐私性
完整性:
数据完整性
系统完整性
可用性:
OSI: x.800
安全攻击:
被动攻击:监听
主动攻击:伪装、重放、消息篡改、拒绝服务
安全机制:
加密/解密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证
安全服务:
认证
访问控制
数据保密性
连接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性
密码算法和协议:
对称加密
公钥加密
单向加密
认证协议
1、openssl:套件,开源程序
上面我们说到了很多的算法,那真正将这些算法予以实现那就需要一些软件来负责这些相关操作,而真正能够完成这些操作的常用软件分别是gpg,openssl;
什么是OpenSSL呢?
OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
openSSL整个软件包由三个套件组成:
libcrypto:通用功能的加密库
libssl:用于实现TLS/SSL的功能
openssl:多功能命令行工具
生成密钥,创建数字证书,手动加密解密数据
2、加密解密技术常用的功能及算法:
对称加密:
算法:DES,3DES,AES,Blowfish,Twofish,RC6,CAST5
openssl enc -e -des3 -a -salt -in /path/to/input_file -out /path/to/cipher_)file
加密 文本编码格式
openssl enc -d -des3 -a salt -in /path/to/cipher_file -ouut /path/to/clear_file
解密
单向加密:
算法:md5:128bits
sha1:160bits
sha512:512bits
工具:sha1sum,md5sum,cksum,openssl dgst
[root@BAIYU_110 ~]# sha1sum /etc/fstab 4c0f1460d21e1141fcd3f93182cb87128702091f /etc/fstab [root@BAIYU_110 ~]# openssl dgst -sha1 /etc/fstab SHA1(/etc/fstab)= 4c0f1460d21e1141fcd3f93182cb87128702091f
3、加密的延伸应用
MAC:消息摘要码
用于实现在网络通信中保证所传输的数据完整性
机制:
CBC-MAC
HMAC:MD5,SHA1
用户认证:
工具:passwd,openssl passwd
[root@BAIYU_110 ~]# openssl passwd -1 Password: Verifying - Password: $1$xOAnQ50H$Fzkdh.P7I20vOD94LJl6B/ [root@BAIYU_110 ~]# openssl passwd -1 #随机加盐 Password: Verifying - Password: $1$DbZWmzRR$RBP9WNYeTya9Zc9IcShvg/ [root@BAIYU_110 ~]# openssl passwd -1 -salt 123abc Password: $1$123abc$rlOkS30UBZu06DOR0wEQd/ [root@BAIYU_110 ~]# openssl passwd -1 -salt 123abc "123456" $1$123abc$rlOkS30UBZu06DOR0wEQd/
公钥加密:(加密速度慢,主要用于:身份认证,秘钥交换,)
公钥:pkey
私钥:skey
算法:RSA,EIGmal
工具:gpg,openssl rsautl
数字签名:私钥加密,公钥解密
算法:RSA,EIGmal,DSA,DSS
工具:
秘钥交换:IKE
算法:DH,
数字证书:
证书格式:x509,pkcs
x509格式:
公钥和有效期限
持有者的个人合法身份信息:(主机名)
证书的使用方式:
CA的信息
CA的数字签名
谁给CA发证:自签署证书
4、用openssl实现私有CA:
配置:/etc/pki/tls/openssl.conf #默认配置即可,定义了CA工作目录
CA工作目录:/etc/pki/CA
生成密钥:
(umask 077; openssl genrsa -out cakey.pem 2048)
查看公钥:
openssl rsa -in private/cakey.pem -pubout -text
生成自签证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
创建需要的文件:
touch index.txt servial crnumber
用openssl实现证书申请:
在主机上生成密钥,保存至应用此证书的服务的配置文件目录下:
mkdir /etc/httpd/ssl
cd /etc/httpdd/ssl
(umask077;openssl genrsa -out httpd.key 2048)
生成证书签署请求:
openssl req -new -key httpd.key -out httpd.csr
将请求文件发往CA
CA 签署:
openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days DAYS
讲证传回请求者
吊销证书:
openssl ca -revoke /path/to/somefile.crt
5、常用的openssl标准命令
openssl speed 加密解密速度测试
openssl version openssl版本查看
openssl rand:生成伪随机数
openssl rand -hex 4
三、ssl
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。
互联网的通信安全,建立在SSL/TLS协议之上。
1、作用
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
(1) 窃听风险(eavesdropping):第三方可以获知通信内容。
(2) 篡改风险(tampering):第三方可以修改通信内容。
(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
(1) 所有信息都是加密传播,第三方无法窃听。
(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。
(3) 配备***书,防止身份被冒充。
2、历史
互联网加密通信协议的历史,几乎与互联网一样长。
1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
1996年,SSL 3.0版问世,得到大规模应用。
1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。
目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。
TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。
3、基本的运行过程
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
但是,这里有两个问题。
(1)如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
(2)公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。
因此,SSL/TLS协议的基本过程是这样的:
(1) 客户端向服务器端索要公钥并验证。
(2) 双方协商生成"对话密钥"(临时密钥)。
(3) 双方采用"对话密钥"进行加密通信。
上面过程的前两步,又称为"握手阶段"(handshake)。
4、握手阶段的详细过程
"握手阶段"涉及四次通信,我们一个个来看。需要注意的是,"握手阶段"的所有通信都是明文的。
4.1 客户端发出请求(ClientHello)
在TCP第三次握手时就发出请求?
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。
在这一步,客户端主要向服务器提供以下信息。
(1) 支持的协议版本,比如TLS 1.0版。
(2) 一个客户端生成的随机数,稍后用于生成"对话密钥"。
(3) 支持的加密方法,比如RSA公钥加密。
(4) 支持的压缩方法。
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。
对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。
4.2 服务器回应(SeverHello)
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。
(1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
(2) 一个服务器生成的随机数,稍后用于生成"对话密钥"。
(3) 确认使用的加密方法,比如RSA公钥加密。
(4) 服务器证书。
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
4.3 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。
(1) 生成一个随机数。该随机数用服务器公钥加密,防止被窃听。
(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。
至于为什么一定要用三个随机数,来生成"会话密钥"
"不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。"
此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。
4.4 服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
http:明文
https:密文
ssl:
NetScape 网景
Secure Socket Layer
SSLv2,SSLv3
TLS:Transport Layer Sercurity
TLSv1,
远程登录:
telnet:
监听tcp协议的23号端口
禁止管理员直接登录
使用普通用户登录,再su切换至root用户
ssh:Secure Shell
grep ssh /etc/services
监听tcp协议的22号端口
ssh文本协议:字符通信,不支持图形界面
openssh(c/s)
server:程序(服务)监听tcp22
client:程序
windows客户端:xmanager(xshell),putty,scrt
openssh客户端组件:
ssh:
ssh USERNAME@HOST
ssh -l USERNAME HOST
-p port:指定要连入端口
ssh认证机制:
基于口令:
基于密钥:
客户端在本地生成一对密钥,客户端将公钥复制到要登录的用户的家目录下.sshz中的一个名为authorized_keys或authorized_key2文件中
配置过程:
1、生成密钥对儿
# ssh-keygen [-t rsa]
[root@localhost ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 06:f5:5c:25:fd:d0:ed:d3:63:b6:3e:26:71:b0:23:63 [email protected] The key's randomart image is: +--[ RSA 2048]----+ | . oo...| | . o . .o o| | . o +.| | . . =+| | S = +| | . E + o | | . o = | | . + | | o .| +-----------------+ [root@localhost ~]# ls .ssh/ id_rsa id_rsa.pub
2、复制密钥至远程主机
# ssh-copy-id [-i /path/to/pubkey_file] USERNAME@HOST #公钥不是在默认位置就用-i选项指定公钥,注意公钥文件名一定要以.pub结尾要不然会报错
[root@localhost ~]# ssh-copy-id [email protected] The authenticity of host '192.168.100.110 (192.168.100.110)' can't be established. RSA key fingerprint is 42:10:18:58:a4:24:95:ca:10:af:4a:e7:2b:89:6e:1d. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.100.110' (RSA) to the list of known hosts. [email protected]'s password: Now try logging into the machine, with "ssh '[email protected]'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [root@localhost ~]# ssh 192.168.100.110 #再远程ssh服务器不需要输入密码 Last login: Tue Sep 22 15:57:59 2015 from 192.168.100.114 You have entered the system: 168.100.110 your username is: root WARNING:Proceed with caution! Have any questions please contact the system administrator [root@BAIYU_110 ~]#
scp:类cp命令,基于ssh协议跨主机复制
scp SRC1 SRC2 ... DEST
分两种情况:
源文件在本机,目录为远程
# scp /path/to/somefile... USERNAME@HOST:/path/to/somewhere
源文件在远程,目标为本机
# scp USERNAME@HOST:/path/to/somefile /path/to/somewhere
-r:源文件是目录是使用,以实现递归复制
-p:保留源文件的复制及修改时间戳,权限等
-q:静默模式
-P:指定服务器端端口
sftp:基于ssh的ftp协议
只要openssh的服务器端配置文件中启用了如下项(默认是启用的):
Subsystem sftp /usr/libexec/openssh/sftp-server
用法:# sftp [username@]HOST
sshd配置文件:/etc/ssh/sshd_config
服务脚本:/etc/rc.d/init.d/sshd
脚本配置文件:/etc/sysconfig/sshd
查看config文件的帮助
man sshd_config
ListernAddress 当前主机的监听地址
Protocol 协议版本
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
验证主机的公钥
#KeyRegenerationInterval 1h 密钥的使用时间
#ServerKeyBits 1024 密钥长度
#LogLevel INFO 日志级别
#LoginGraceTime 2m 登陆宽限期
#PermitRootLogin yes root是否可以登录
#StrictModes yes 严格模式,家目录 属主 属组
#MaxAuthTries 6 最多可以承受的次数
#MaxSessions 10
最大的连接数
PasswordAuthentication yes 是否使用用户名和密码的方式
Kerberos集中认证管理
X11Forwarding yes 是否转发图形窗口
AllowUsers user1 user2
用户白名单
Allowgroups 组白名单
DenyUser 用户黑名单
用户登录信息获取
lastlog:显示每个用户最近一次成功的登录信息,
-u USERNAME|UID
lastb:显示用户登录失败的日志信息: /var/log/btmp
last:用户成功登陆的日志信息:/var/log/wtmp
使用ssh的最佳实践:
1)only use ssh protocol 2
2)limit users SSh access
Allowusers root vivek jerry
白名单
denyUser saroj anjali foo
黑名单
3)configure Idle Log out timeout Interval 配置空闲会话超时长。
ClientAliveCountMax 300
ClientAliveInterval 0
4)Firwall SSH Port # 22
使用iptables设置ssh服务安全访问策略
5)change ssh port and Limit IP binding
port 300
Listaddress 192.168.1.5
ListenAddress 202.54.1.5
勿使用默认22端口
6)use Strong SSH passwords and passphrase
genpasswd(){
local 1=$1
[ "$1" == "" ]&& 1=20
tr -dc A-Za-z0-9_</dev/urandom | head -c ${1} | xargs
}
使用足够长足够复杂的密码,且定期更换。
7)use Public key Based AUthentication
使用公钥认证。
8)disable Empty password
9)thwart ssh crakers (Brute Force attack)
google:ssh best practice
10)rate-limit incoming port # 22 COnnections
限制ssh访问频度
11)use log analyzer
记录好日志,经常做日志分析。
总结:ssh,scp.sftp,sshd
ssh /etc/ssh/ssh_config
sshd /etc/ssh/sshd_config
练习:基于密钥的认证,并限定仅余下root和hadoop用户登录