SSL与SSH

# openssl与openssh 笔记

OpenSSL

传输层协议:TCP,UDP,SCTP
    port:进程地址,进程向内核注册使用某端口(独占)

同一主机上的进程间通信:IPC, message queue, shm, semerphor
不同主上的进程间通信:socket 
    cip:port <-- --> sip:port
        cip:55673 <-- --> sip:80

        监听模式:LISTEN (ip:port)

SSL: Secure Sockets Layer
    http --> ssl --> https

TLS: transport layer Security
安全的目标:
    保密性:confidentiality
    完整性:integrity
    可用性:availability

攻击类型:
    威胁保密性的攻击:窃听、通信量分析;
    威胁完整性的攻击:更改、伪装、重放、否认
    威胁可用性的攻击:拒绝服务(DoS)

解决方案:
    技术(加密和解密)、服务(用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务)

    加密和解密:
        传统加密方法:替代加密方法、置换加密方法
        现代加密方法:现代块加密方法

    服务:
        认证机制
        访问控制机制

    密钥算法和协议
        对称加密
        公钥加密
        单向加密
        认证协议

Linux系统:OpenSSL(ssl), GPG(pgp)

    OpenSSL由三部分组成:
        libencrypto库
        libssl库
        openssl多用途命令行工具

    加密算法和协议:
        对称加密:加密和解密使用同一个密钥;
            DES:Data Encryption Standard; 
            3DES:Triple DES;
            AES:Advanced Encryption Standard;  (128bits, 192bits, 256bits, 384bits)
            Blowfish
            Twofish
            IDEA
            RC6
            CAST5

            特性:
                1、加密、解密使用同一个密钥;
                2、将原始数据分割成为固定大小的块,逐个进行加密;

            缺陷:
                1、密钥过多;
                2、密钥分发困难;

        公钥加密:密钥分为公钥与私钥
            公钥:从私钥中提取产生;可公开给所有人;public key
            私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key;
            特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;

            用途:
                数字签名:主要在于让接收方确认发送方的身份;
                密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;
                数据加密

            算法:RSA, DSA, ELGamal
                DSS: Digital Signature Standard
                DSA:Digital Signature Algorithm

        单向加密:即提出数据指纹;只能加密,不能解密;
            特性:定长输出、雪崩效应;
            功能:完整性;
            算法:
                md5:Message Digest 5, 128bits
                sha1:Secure Hash Algorithm 1, 160bits
                    sha224, sha256, sha384, sha512

        密钥交换: IKE(Internet Key Exchange)
            公钥加密
            DH(Deffie-Hellman)
                A:p, g
                B:p, g

                A: x
                    --> p^x%g ==> B

                    A: (p^y%g)^x=p^yx%g

                B: y
                    --> p^y%g ==> A => (p^y%g)^x=p^xy%g

                    B: (p^x%g)^y=p^xy%g

    PKI:Public Key Infrastructure
        公钥基础设施:                

            注册机构:RA
            证书吊销列表:CRL
            证书存取库:

        X.509v3:定义了证书的结构以及认证协议标准
            版本号
            序列号
            签名算法ID
            发行者名称
            有效期限
            主体名称
            主体公钥
            发行者的惟一标识
            主体的惟一标识
            扩展
            发行者的签名

    SSL:Secure sockets Layer
        Netscape: 1994
        V1.0, V2.0, V3.0
    TLS: Transport Layer Security
        IETF: 1999            
        V1.0, V1.1, V1.2, V1.3

        分层设计:
            1、最底层:基础算法原语的实现,aes, rsa, md5
            2、向上一层:各种算法的实现; 
            3、再向上一层:组合算法实现的半成品;
            4、用各种组件拼装而成的各种成品密码学协议软件;

        协议的开源实现:OpenSSL


加密算法和协议:
    对称加密:数据加密(保密性),(3DES,AES)
    公钥加密:身份认证、密钥交换、数据加密(不常用,比对称加密要慢3个数量级),(RSA,DSA)
    单向加密:数据完整性,(MD5, SHA1, ...)
    密钥交换:RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)

SSL/TLS
    SSL: 安全套接字层(ssl 1.0, ssl 2.0, ssl 3.0)
    TLS:传输层安全 (tls 1.0, tls 1.1, tls 1.2, tls 1.3)

    OpenSSL
        libcrypto
        libssl 
        openssl

    SSL会话主要三步:
        客户端向服务器端索要并验正证书;
        双方协商生成“会话密钥”;
        双方采用“会话密钥”进行加密通信;

        SSL Handshake Protocol:
            第一阶段:ClientHello:
                支持的协议版本,比如tls 1.2;
                客户端生成一个随机数,稍后用户生成“会话密钥”
                支持的加密算法,比如AES、3DES、RSA;
                支持的压缩算法;

            第二阶段:ServerHello
                确认使用的加密通信协议版本,比如tls 1.2;
                服务器端生成一个随机数,稍后用于生成“会话密钥”
                确认使用的加密方法;
                服务器证书;

            第三阶段:
                验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)                
                发送以下信息给服务器端:
                    一个随机数;
                    编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
                    客户端握手结束通知;

            第四阶段:
                收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;
                向客户端发送如下信息:
                    编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
                    服务端握手结束通知;

    PKI:公钥基础设施
        签证机构:CA
        注册机构:RA
        证书吊销列表:CRL
        证书存取库

OpenSSL(2)

组件:
    libcrypto, libssl主要由开发者使用;
    openssl:多用途命令行工具;

openssl:
    许多子命令,分为三类:
        标准命令
        消息摘要命令(dgst子命令)
        加密命令(enc子命令)

    标准命令: enc, ca, req, genrsa, ...

    对称加密:
        工具:openssl  enc,  gpg
        支持的算法:3des, aes, blowfish, towfish

        enc命令:
            加密:~]# openssl  enc  -e  -des3  -a  -salt  -in fstab   -out fstab.ciphertext
            解密:~]# openssl  enc  -d  -des3  -a  -salt  -out fstab   -in fstab.ciphertext

    单向加密:
        工具:openssl dgst, md5sum, sha1sum, sha224sum, ...

        dgst命令:
            ~]# openssl  dgst  -md5  /PATH/TO/SOMEFILE

    生成用户密码:

        工具:passwd, openssl  passwd

            openssl  passwd  -1  -salt  SALT

    生成随机数:
        工具:openssl  rand

        ~]# openssl  rand  -hex  NUM
        ~]# openssl  rand  -base  NUM

    公钥加密:
        加密解密:
            算法:RSA,ELGamal
            工具:openssl  rsautl, gpg
        数字签名:
            算法:RSA, DSA, ELGamal
            工具:
        密钥交换:
            算法:DH

        生成密钥:
            生成私钥: ~]# (umask 077;  openssl  genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)
            提出公钥: ~]#  openssl  rsa  -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout

Linux系统上的随机数生成器:
    /dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
    /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
        伪随机数不安全;

        熵池中随机数的来源:
            硬盘IO中断时间间隔;
            键盘IO中断时间间隔;

CA:
    公共信任的CA,私有CA;

    建立私有CA:
        openssl
        OpenCA

    openssl命令:
        配置文件:/etc/pki/tls/openssl.cnf

        构建私有CA:
            在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;

            步骤:
                (1) 生成私钥;
                    ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
                (2) 生成自签证书;
                    ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
                        -new:生成新证书签署请求;
                        -x509:生成自签格式证书,专用于创建私有CA时;
                        -key:生成请求时用到的私有文件路径;
                        -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
                        -days:证书的有效时长,单位是day;
                (3) 为CA提供所需的目录及文件;
                    ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}
                    ~]# touch  /etc/pki/CA/{serial,index.txt}
                    ~]# echo  01 > /etc/pki/CA/serial

        要用到证书进行安全通信的服务器,需要向CA请求签署证书:

            步骤:(以httpd为例)
                (1) 用到证书的主机生成私钥;
                    ~]# mkdir  /etc/httpd/ssl 
                    ~]# cd  /etc/httpd/ssl
                    ~]# (umask  077; openssl  genrsa -out  /etc/httpd/ssl/httpd.key  2048)
                (2) 生成证书签署请求
                    ~]# openssl  req  -new  -key  /etc/httpd/ssl/httpd.key  -out /etc/httpd/ssl/httpd.csr  -days  365
                (3) 将请求通过可靠方式发送给CA主机;

                (4) 在CA主机上签署证书;
                    ~]# openssl ca  -in  /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days  365

                    查看证书中的信息:
                        ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject

        吊销证书:
            步骤:
                (1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):
                    ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject
                (2) CA主机吊销证书
                    先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;

                    吊销:
                        # openssl  ca  -revoke  /etc/pki/CA/newcerts/SERIAL.pem

                            其中的SERIAL要换成证书真正的序列号;

                (3) 生成吊销证书的吊销编号(第一次吊销证书时执行)
                    # echo  01  > /etc/pki/CA/crlnumber

                (4) 更新证书吊销列表
                    # openssl  ca  -gencrl  -out  thisca.crl 

                    查看crl文件:
                        # openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text

博客作业:加密解密技术基础、PKI及创建私有私有CA;



OpenSSH:

telnet:C/S,23/tcp 
    CentOS 6:
        Server: telnet-server                
        Client: telnet

        服务进程有两种类型:
            独立守护进程:自我管理;
            超级守护进程:xinetd,服务器托管者,用于托管其它瞬时守护进程;自己是独立守护进程;
                瞬时守护进程:非自我管理,而是由“超级守护进程”代为管理;

                xinetd:
                    配置文件:/etc/xinetd.conf, /etc/xinetd.d/(*)


    CentOS 7:
        Server: telnet-server
        Client: telnet            

ssh:Secure SHell,
    C/S: 22/tcp,安全地远程登录
        Server:OpenSSH(sshd)
        Client:OpenSSH(ssh, scp), 
            Windows: xshell, securecrt, sshsecureshellclient, putty;

    ssh protocol version:
        V1:不安全, man-in-middle
        V2: 

    主机认证:需要用到主机认证密钥;由服务器端维护和提供;
    用户登录:
        用户认证:
            基于口令的认证;
            基于密钥的认证;
                用户提供一对儿密钥,私钥保留在客户端,公钥保留于远程服务器端的用户家目录下;

OpenSSH:
    sshd:配置文件 /etc/ssh/sshd_config
    ssh: 配置文件 /etc/ssh/ssh_config

    客户端程序:
        ssh  [options]  [user@]host  [COMMAND]
        ssh  [-l  user]  [options] host  [COMMAND]

        省略用户名:
            使用本地用户名作为远程登录的用户名;

        常用选项:
            -l user:以指定的用户登录远程主机;
            -p port:用于指明远程服务器的端口; 
            -X:支持X11转发;
            -Y:支持信任的X11转发;
                X:协议; x-window, C/S
                X11转发的作用:在本地显示远程主机上的图形窗口;
                    前提:本地是X图形界面,或者提供了x service;
            -o StrictHostKeyChecking=no                     

        接收的所有认可的服务器列表:
            ~/.ssh/known_hosts

        ssh远程连接服务器时的配置选项,定义在/etc/ssh/ssh_config配置文件中;
            HOST  patttern 
                OPTION1 VALUE
                OPTION2 VALUE
                ...

        ssh支持的用户认证方式:
            基于口令的认证;
            基于密钥的认证;
                (1) 在本地主机生成一对儿密钥:
                    ssh-keygen  [-q]  [-b bits]  [-t type]  [-f output_keyfile] [-P passphrase] 
                        -t  {rsa|ecdsa|dsa}:公钥加密算法类型;
                        -b bits:指明密钥长度;
                        -P passphrase:私钥加密密码;
                        -f output_keyfile:生成密钥的保存位置;

                (2) 在本地主机上,将公钥复制到要登录的远程主机的某用户的家目录下的特定文件中(~/.ssh/authorized_keys)
                     ssh-copy-id  [-i [identity_file]]  [-p port]  [-o ssh_option]  [user@]hostname

                (3) 测试
                    ssh  user@host

        scp命令: 基于ssh连接完成复制

            scp  [options]  SRC...  DEST/
            scp  [options]  SRC  DEST

            存在两种使用情形:
                PULL:  scp  [options]  [user@]host:/PATH/TO/SOMEFILE   /PATH/TO/SOMEFILE
                PUSH:    scp  [options]  /PATH/TO/SOMEFILE   [user@]host:/PATH/TO/SOMEFILE

                    常用选项:
                        -r:递归复制;
                        -p:保持原文件的权限信息;
                        -q:静默模式;
                        -P PORT:指明远程主机ssh协议监听的端口;

        sftp命令:
            ftp:file transfer protocol,明文;
            安全的文件传输机制:
                ftps: ftp over ssl 
                sftp: ftp over ssh 

            sftp:
                C/S架构
                    S:由sshd服务进程管理,是sshd的一个子系统,在centos系统上的openssh上,默认为启动状态; /usr/libexec/openssh/sftp-server
                    C:即sftp; 

                连接至远程主机: sftp  user@host
                    sftp> help

    sshd(服务器端):
        配置文件:/etc/ssh/sshd_config

            格式:配置指令  值
                常用指令:
                    Port  22                        
                    ListenAddress  0.0.0.0
                    Protocol  2                        
                    PermitRootLogin  yes
                    UseDNS  no

            手册页:
                man  sshd_config
                man  sshd

                man  ssh_config
                man  ssh

            限制可登录的用户(配置文件):
                AllowUsers  user1  user2  user3 ...
                AllowGroups  grp1 grp2  ...

                DenyUsers  user1  user2  ...
                DenyGroups  grp1  grp2  ...

        CentOS 6:
            服务脚本:/etc/rc.d/init.d/sshd
        CentOS 7:
            Systemd Unit File:/usr/lib/systemd/system/sshd.service 

    并行的客户端工具:
        pssh: epel
            pssh
            pscp

    ssh服务的最佳实践:
        1、不要使用默认端口;
        2、禁止使用protocol version 1;
        3、限制可登录的用户;
        4、设定空闲会话超时时长;
        5、利用防火墙设置ssh访问策略;
        6、仅监听特定的IP地址;
        7、基于口令认证时,使用强密码策略;
            # tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
        8、使用基于密钥的认证;
        9、禁止使用空密码;
        10、禁止root用户直接登录;
        11、限制ssh的访问频度和并发在线数;
        12、做好日志,经常分析; 

        /var/log/secure

ssh协议的另一个实现:dropbear
    轻量化的实现方案,多用于嵌入式环境中;

    常用工具:
        dbclient:ssh协议客户端程序
            dbclient [options] [user@]host[/port][,[user@]host/port],...] [command]

        dropbearkey:主机密钥生成工具
            dropbearkey  -t <type>  -f <filename>  [-s bits]
                /etc/dropbear/

    服务端程序:
        dropbear 
            -p  [IP:]PORT
            -F: 前台
            -E:将日志发往错误输出
<% if (theme.canvas_nest) { %> <% } %> s