openssl及openssh

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 公钥基础架构

   wKiom1X9IWqgXqbsAAC4gR1hU9s975.jpg

数据-->单向加密-->特征码-->私钥加密-->对称加密-->对方的公钥加密

                  完整性 发送者身份认证  私密性   口令传输

一次加密通信过程

发送者:

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用户登录

你可能感兴趣的:(linux,OpenSSL)