美文网首页Linux初学者学习笔记
20170909 加密和安全(二)

20170909 加密和安全(二)

作者: 哈喽别样 | 来源:发表于2017-09-18 23:00 被阅读59次

    CA和证书
    安全协议(SSL/TLS)
    OpenSSH

    一、CA和证书

    (一) PKI(Public Key Infrastructure) 公钥基础设施

    • 定义:支持公开密钥管理并能支持认证、加密、完整性和可追究性服务的基础设施

    • 主要组成部分:

      • 签证机构:CA (Certificate Authority)
      • 注册机构:RA (Registration Authority)
      • 证书吊销列表:CRL (Certificate Revocation List)
      • 证书存取库
    • X.509:定义了证书的结构以及认证协议标准

      • 内容:版本号、序列号、签名算法、颁发者、有效期限、主体名称、主体公钥、CRL分发点、扩展信息、发行者签名

    (二)证书获取的方法:

    • 证书授权机构签发的证书:由CA签发申请者的公钥
      • 第1步:生成签名请求(csr)
      • 第2步:将csr发送给CA
      • 第3步:从CA处接受签名
    • 自签名的证书:自己签发自己的公钥

    二、安全协议(SSL/TLS):

    (一)协议历史、功能

    • 发展历程:

      • SSL(Secure Socket Layer):安全套接字
        • 由Netscape公司于1995年发布SSL 2.0
      • TLS(Transport Layer Security) 安全传输层协议1.1:
        • TLS 1.1:IETF(Internet工程任务组) 于2006年将其定义为国际标准RFC 4346
        • TLS 1.2:当前使用最广泛的标准,2008年发布
        • TLS 1.3:最新标准,2015年发布
    • 提供功能:机密性、认证、完整性、重放保护

    • 位于TCP/IP模型传输层之上,应用层之下

    (二)协议工作原理

    • SSL/TLS协议是两阶段协议,分为握手阶段和应用阶段

      • 握手阶段(协商阶段)客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成。
      • 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
    • 相关协议:

      • 握手阶段:Handshake, ChangeCipherSpec, Alert协议
      • 应用阶段:Record协议
    • HTTPS协议:就是“HTTP” 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输

    (三)OpenSSL

    • 开源项目:可以实现对称加密、公钥加密、秘钥管理等丰富功能

    • 对称加密:openssl enc工具实现

      • 帮助:man enc
      • 语法:
      // 加密
      openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
      
      // 解密
      openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile
      
    • 公钥加密:openssl rsautl工具实现

      • 帮助:man rsautl
      • 语法:
      // 生成私钥
      openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
      // 私钥需要谨慎保管,权限应设置为600
      // 执行umask 066,为避免umask设置影响今后操作,将umask和后续生成私钥命令用小括号括起
      // 例如以下命令(-des: 私钥添加口令)
      (umask077; openssl genrsa -out test.key -des 2048) 
      
      //从私钥中提取出公钥
      openssl rsa -in PRIVATEKEYFILE -pubout -out PUBLICKEYFILE
      //例如以下命令
      openssl rsa -in test.key -pubout -out test.key.pub
      
    • 单项加密:openssl dgst工具实现

      • 帮助:man dgst
      • 语法:
      openssl dgst -md5 [-hex] /PATH/SOMEFILE     //-hex 默认设置为16进制显示
      openssl dgst -md5 testfile
      
    • 生成密码:openssl sslpasswd工具实现

      • 帮助:man sslpasswd
      • 语法:
      openssl passwd -1 -salt SALT(最多8位)  //-1指MD5加密
      openssl passwd -1 -salt centos
      
    • 生成随机数:openssl sslrand工具实现

      • 帮助:man sslrand
      • 帮助:
      openssl rand -base64|-hex NUM
      NUM: 表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2
      

    (四)OpenSSL实现创建CA并申请、管理证书

    • 配置文件
      • openssl的配置文件:/etc/pki/tls/openssl.cnf
        配置文件关键信息:
    dir             = /etc/pki/CA          //存储目录
    certs           = $dir/certs           //颁发的证书存储路径
    crl_dir         = $dir/crl             //证书吊销列表存储路径
    database        = $dir/index.txt       //数据库文件存储路径
    
    new_certs_dir   = $dir/newcerts        //新证书存放路径,与证书存储路径中的内容相同,但名称不同
    
    certificate     = $dir/cacert.pem      //CA自签发或由上级签发的证书路径,名称必须为"cacert.pem"
    serial          = $dir/serial          //下一个签发证书的序号,一般从16位数字00开始
    crlnumber       = $dir/crlnumber       //下一个证书吊销列表的序号,一般从16位数字00开始
                                      
    crl             = $dir/crl.pem         //证书吊销列表的存放路径
    private_key     = $dir/private/cakey.pem      //私钥的存放路径
    
    countryName             = match        //国家信息必须匹配
    stateOrProvinceName     = match        //州或省信息必须匹配
    organizationName        = match        //域名信息必须匹配
    organizationalUnitName  = optional     //部门名称
    commonName              = supplied     //申请证书的主机名称
    emailAddress            = optional     //邮箱
    
    • 申请信息的三种策略:匹配、支持和可选

      • 匹配:申请填写的信息跟CA设置信息必须一致
      • 支持:必须填写这项申请信息
      • 可选:可有可无
    • 第1步,创建私有CA,生成私钥

      // 创建所需要的文件
      touch /etc/pki/CA/index.txt      //生成证书索引数据库文件
      echo 01 > /etc/pki/CA/serial     //指定第一个颁发证书的序列号
      
      // CA生成私钥,注意名称必须为cakey.pem
      (umask066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
      
    • 第2步,生成自签名证书

      openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
      // -new 生成新证书签署请求
      // -x509 专用于CA生成自签证书
      // -key 生成请求时用到的私钥文件
      // -days n 证书的有效期限
      // -out /PATH/TO/SOMECERTFILE: 证书的保存路径
      
    • 第3步,颁发证书,一般将私钥和CA签发的证书保存在应用的目录中

      // 1. 生成证书请求csr
      // 生成私钥
      (umask066; openssl genrsa -out /etc/pki/tls/private/test.key 2048)
      生成证书申请文件
      openssl req -new -key /etc/pki/tls/private/test.key -out etc/pki/tls/test.csr
      
      // 2. 将证书请求文件传输给CA
      
      // 3. CA签署证书,并将证书颁发给请求者
      openssl ca -in /tmp/test.csr -out /etc/pki/CA/certs/test.crt -days 365
      注意:默认国家,省,公司名称三项必须和CA一致
      
      // 4. 查看证书中的信息:
      openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
      // 查看指定编号的证书状态
      openssl ca -status SERIAL
      
    • 第4步,吊销证书

      // 1. 在客户端获取要吊销的证书的serial
      openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
      
      // 2. 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书
      openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
      // 指定第一个吊销证书的编号
      注意:第一次更新证书吊销列表前,才需要执行
      echo 01 > /etc/pki/CA/crlnumber
      
      // 3. 更新证书吊销列表
      openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
      // 查看crl文件:
      openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text
      
    • 实验:建立根CA,子CA,并实现根CA签发自身证书、根CA给子CA签发证书、子CA给申请者签发证书,最后吊销子CA签发给申请者的证书,并生成证书吊销列表
      环境设置
      根CA的ip地址:192.168.136.230,命令提示符颜色:紫色
      子CA的ip地址:192.168.136.229,命令提示符颜色:黄色
      申请主机的ip地址:192.168.136.224,命令提示符颜色:蓝色
      密钥、证书申请、签发的证书存储位置,如下图:

    第1步:建立根CA,根CA签发自身证书(根CA上操作)
    建立证书索引库文件index.txt,指定证书序列号
    touch /etc/pki/CA/index.txt
    echo 01 > /etc/pki/CA/serial

    生成私钥文件cakey.pem,存储在/etc/pki/CA/private目录下
    (umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048)

    自已签发自己的证书cacert.pem,存储在/etc/pki/CA目录下,过程中设置:countryName, stateOrProvinceName, organizationName, organizationalUnitName, commonName, emailAddress等信息,前三项一定要注意,之后签发的证书信息务必要与本次设置的信息相同
    openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 7300

    第2步,建立子CA,子CA向根CA申请证书,根CA签发证书(子CA上操作)
    建立证书索引库文件index.txt,指定证书序列号
    touch /etc/pki/CA/index.txt
    echo 01 > /etc/pki/CA/serial

    生成私钥
    (umak 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048)

    生成证书申请文件
    openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.csr

    将证书申请文件传送给根CA,根CA签发证书并将证书传送回子CA,存储至子CA的/etc/pki/CA目录下
    scp /etc/pki/CA/cacert.csr 192.168.136.230:/tmp 发送证书申请文件至根CA

    openssl ca -in /tmp/cacert.csr -out /etc/pki/CA/certs/cacert.pem -days 3650
    根CA签发证书(此命令在根CA上操作)

    查看签发的证书内容,可以看到证书序列号按照/etc/pki/CA/serial文件中的01编号,根CA和子CA的关键信息相同(此命令在根CA上操作)

    使用openssl x509 -in /etc/pki/CA/certs/cacert.pem -noout -text|issuer|suject|serial|dates命令查看证书信息,红框中可以看到时间期限确实为签发证书指定的约10年(-days 3650)(此命令在根CA上操作)

    使用openssl ca -status 01命令,查看指定编号的证书状态(此命令在根CA上操作)

    scp /etc/pki/CA/certs/cacert.pem 192.168.136.229:/etc/pki/CA/
    发送签发的证书至子CA(此命令在根CA上操作)

    第3步,申请主机向子CA发起证书签发申请,子CA签发证书(申请主机上操作)
    生成密钥
    (umask 066; openssl genrsa -out /etc/pki/tls/private/hello.key -des3 2048)

    生成证书申请文件
    openssl req -new -key /etc/pki/tls/private/hello.key -out /etc/pki/tls/hello.csr

    将证书申请文件传送给子CA,子CA签发证书并将证书传送回申请主机,存储至申请主机的/etc/pki/tls目录下
    scp /etc/pki/tls/hello.csr 192.168.136.229:/tmp 发送证书申请文件至子CA

    openssl ca -in /tmp/hello.csr -out /etc/pki/CA/certs/hello.crt -days 730
    子CA签发证书(此命令在子CA上操作)

    scp /etc/pki/CA/certs/hello.crt 192.168.136.224:/etc/pki/tls/
    发送签发的证书至子CA(此命令在子CA上操作)

    将根CA证书、子CA证书、申请主机证书都传至windows,可以在证书页面看到清晰的证书继承关系

    第4步,吊销子CA给申请主机的证书,创建证书吊销列表(子CA上操作)
    环境设置:在子CA上再签发两个证书
    修改/etc/pki/CA/index.txt.attr文件,内容改为"unique_subject = no",这样可以为相同证书申请签发多次证书
    openssl ca -in /tmp/hello.csr -out /etc/pki/CA/certs/hello1.crt -days 300
    openssl ca -in /tmp/hello.csr -out /etc/pki/CA/certs/hello2.crt -days 500

    查看想要吊销证书的序列号,查看目前所有证书的状态,V表示可用状态
    openssl x509 -in /etc/pki/CA/certs/hello1.crt -noout -serial -subject
    openssl x509 -in /etc/pki/CA/certs/hello2.crt -noout -serial -subject
    cat /etc/pki/CA/index.txt
    ``

    吊销序列号为02和03的两个证书:
    openssl ca -revoke /etc/pki/CA/newcerts/02.pem
    openssl ca -revoke /etc/pki/CA/newcerts/03.pem
    cat /etc/pki/CA/index.txt 查看索引数据库,发现被吊销的证书状态为R

    生成证书吊销列表
    echo 01 > /etc/pki/CA/crlnumber 指定首个证书吊销列表的序列号
    openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem 生成证书吊销列表

    查看证书吊销列表内容
    openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text

    三、OpenSSH

    (一)SSH协议

    • ssh: secure shell,TCP连接,默认端口号22,安全的端口登录
    • 软件实现:OpenSSH, dropbear
    • 协议版本:当前使用ssh v2,基于DH算法做密钥交换,基于RSA或DSA实现身份认证
    • 登录认证方式:基于password和基于key两种方式

    (二)OpenSSH

    • 基于C/S结构

      • client: ssh, scp, xshell, securecrt
      • server: sshd
    • ssh客户端:

      • 路径:/etc/ssh/ssh_config
      • 配置项:
        StrictHostKeyChecking 首次登录检查Key,默认为"ask"提示,设为"no"不提示
      • 语法:
        ssh [user@]host [COMMAND] 默认以当前本机登录用户名登录远程主机
        ssh [-l user] host [COMMAND] -l 指定用户登录远程主机
      选项:
      -p port:远程服务器监听的端口
      -b:指定连接的源IP
      -v:调试模式
      -C:压缩方式
      -X:支持x11转发
      -Y:支持信任x11转发
      -t:强制伪tty分配
      //通过ssh直连remoteserver1实现间接连接至remoteserver2
      ssh -t remoteserver1 ssh remoteserver2
      

    (三)OpenSSH远程验证

    • openssh实现远程主机验证的方式:
      当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接

    • ssh服务登录验证:基于用户/口令和基于密钥两种方式

      • 基于用户/口令登录

        • step 1 客户端发起ssh请求,服务器会把自己的公钥发送给用户
        • step 2 用户会根据服务器发来的公钥对密码进行加密
        • step 3 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
      • 基于密钥登录

        • step 1 首先在客户端生成一对密钥
        • step 2 并将客户端的公钥拷贝到服务端
        • step 3 当客户端再次发送一个连接请求,包括ip, 用户名
        • step 4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:acdf
        • step 5 服务端使用客户端拷贝过来的公钥进行加密,然后发送给客户端
        • step 6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
        • step 7 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
      • 实现基于密钥登录

        • 在客户端生成密钥对,-P '':私钥不设置密码
          ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"]
        • 把公钥文件传输至远程服务器对应用户的家目录
          ssh-copy-id [-i [identity_file]] [user@]host
        • 修改私钥的密码
          ssh-keygen -p
        • 使用验证代理,只需要输入一次密码,之后所有的ssh连接输入私钥密码的工作由代理完成。bash进程结束,代理工作结束;下次登录时,重新启动代理。
          ssh-agent agent 启用代理
          ssh-add 密码添加给代理

    (四)加密文件传输工具:scp, rsysc, sftp, pssh

    (1)scp工具
    • 来源于openssh-clients软件包

    • scp遇到相同文件直接覆盖操作

    • 语法:
      scp [options] SRC... DEST/
      scp [options] [user@]host:/sourcefile /destpath:将远程主机文件复制到本地
      scp [options] /sourcefile [user@]host:/destpath:将本地文件复制到远程主机

    • 常用选项:
      -C: 压缩数据流
      -r: 递归复制
      -p: 保持原文件的属性信息
      -q: 静默模式
      -P PORT: 指明remote host的监听端口

    (2)rsync工具
    • 基于ssh和rsh服务实现高效率的远程系统之间复制文件

    • 使用安全的shell连接做为传输方式

    • 比scp更快,只复制不同的文件

    • 语法:
      rsync -av /etc server1:/tmp:复制目录和目录下文件
      rsync -av /etc/ server1:/tmp:只复制目录下文件

    • 选项:
      -n 模拟复制过程
      -v 显示详细过程
      -r 递归复制目录树
      -p 保留权限
      -t 保留时间戳
      -g 保留组信息
      -o 保留所有者信息
      -l 将软链接文件本身进行复制(默认)
      -L 将软链接文件指向的文件复制
      -a 存档,相当于–rlptgoD,但不保留ACL(-A) 和SELinux属性(-X)

    (3)sftp工具
    • 交互式文件传输工具
    • 用法和传统的ftp工具相似
    • 利用ssh服务实现安全的文件上传和下载
    • 使用ls cd mkdir rmdir pwd get put等指令,可用?help获取帮助信息
    (4)pssh工具
    • pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制

    • 选项如下:
      --version:查看版本
      -h:主机文件列表,内容格式"[user@]host[:port]"
      -H:主机字符串,内容格式"[user@]host[:port]"
      -l:登录使用的用户名
      -o:输出的文件目录
      -O:SSH的选项
      -v:详细模式
      -A:手动输入密码模式
      -x:额外的命令行参数使用空白符号,引号,反斜线处理
      -X:额外的命令行参数,单个参数模式,同-x
      -i:每个服务器内部处理信息输出
      -P:打印出服务器返回信息

    (五)SSH端口转发(又名“隧道”):

    (1)SSH 端口转发的功能
    • SSH端口转发:SSH将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务
    • SSH端口转发又名隧道(tunneling),SSH为其他TCP协议提供了一个安全的传输通道。
    • 功能:
      • 加密SSH Client 端至SSH Server 端之间的通讯数据
      • 突破防火墙的限制完成一些之前无法建立的TCP 连接
    (2)SSH本地转发
    • 语法:
      ssh -L local_port:remote_host:remote_host_port ssh_server
      local_port:本地端口(防火墙外)
      remote_host:远程主机IP(防火墙内)
      remote_host_port:远程主机不安全的TCP协议端口(防火墙内)
      ssh_server:充当跳板机的ssh服务器IP(防火墙内)

    • 选项:
      -f 后台启用
      -N 不打开远程shell,处于等待状态
      -g 启用网关功能

    • 网络连接状态如图所示:

    • 示例:

      • ssh -L 2009:telnetsrv:23 -Nf sshsrv
        建立从本机到telnet服务器23端口的连接,监听本机2009端口,以sshsrv服务器为跳板
      • telnet 127.0.0.1 2009
        当访问本机的2009的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发至telnetsrv的23端口
      • 信息在端口间的流向:
        data <<==>> local_host:2009 <<==>> local_host:XXXXX <<==>> ssh_srv:22 <<==>> ssh_srv:YYYYY <<==>> telnet_srv:23
    • 实验:建立SSH本地转发
      建立从本机192.168.136.230到telnet服务器192.168.136.224的连接,中间将ssh服务器192.168.136.229作为跳板,本地转发端口2009
      ssh -L 2009:192.168.136.224:23 -Nf 192.168.136.229 本地建立连接
      telnet 127.0.0.1 2009 本地转发连接远程telnet服务器

      本地主机端口连接情况:本机连接至跳板机的ssh服务22端口

      跳板机端口连接情况:跳板机一方面与本机以ssh服务22端口连接,一方面与远程服务器以telnet服务23端口连接

      远程telnet服务器端口连接情况:跳板机连接至远程服务器的telnet服务23端口

      数据流向为:data <<==>> 127.0.0.1:2009 <<==>> 192.168.136.230:56160 <<==>> 192.168.136.229:22 <<==>> 192.168.136.229:51488 <<==>> 192.168.136.224:23

    (3)SSH远程转发
    • 语法:
      ssh -R ssh_server_port:remote_host:remote_host_port ssh_server
      ssh_server_port:(防火墙外)
      remote_host_port:(防火墙内)
      remote_host_port:(防火墙内)
      ssh_server:(防火墙外)

    • 网络连接状态如图所示:

    • 示例:

      • ssh -R 2010:telnetsrv:23 -Nf sshsrv
        建立从ssh服务器到telnet服务器23端口的连接,监听ssh服务器2010端口,以ssh客户端为跳板

      • telnet sshsrv 2010
        当访问本机的2010端口时,将加密信息通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv的23端口

      • 信息在端口间的流向:
        Data <==> ssh_srv:2010 <==> ssh_srv:22 <==> local_host:XXXXX <==> local_host:YYYYY <==> telnet_srv:23

    • 实验:建立SSH远程转发
      建立从ssh服务器192.168.136.230到telnet服务器192.167.136.224的连接,中间将本机192.168.136.229作为跳板,远程转发端口2010
      ssh -R 2010:192.168.136.224:23 -Nf 192.168.136.230 本机建立连接

      telnet 127.0.0.1 2010 远程ssh服务器连接远程telnet服务器

      ssh服务器端口连接情况:ssh服务器的22端口与主机相连

      主机端口连接情况:一方面作为客户机与防火墙外的ssh服务器连接,另一方面与防火墙内的telnet服务器的23端口连接

      telnet服务器端口连接情况:telnet服务器的23端口与主机相连

    (4)SSH端口转发
    • 当用浏览器访问internet时,本机的1080端口做为代理服务器,浏览器的访问请求被转发到ssh_server上,由ssh_server替之访问internet

    • 示例:

      • ssh -D 1080 root@sshserver
        建立本地1080端口至ssh_server的ssh连接

      • 在浏览器设置代理本地代理:ip:127.0.0.1 port:1080

    • 实验:建立SSH端口转发
      通过本机(192.168.136.224)1080端口转发请求至192.168.136.230的ssh服务器,由ssh服务器访问192.168.136.229的httpd服务

    (六)SSH的X协议转发:

    • X协议:C/S结构,Client程序向Server发出请求,Server响应请求并展现相关图形界面
    • 所有的图形应用程序都是X客户程序
      • 能够通过TCP/IP连接远程X服务器
      • 数据没有加密机制,可以通过ssh连接隧道安全传输
    • OpenSSH的实现:
      ssh -X user@remotehost COMMAND

    相关文章

      网友评论

      • 8337ea5e8883:您好,看到您的文章质量都非常高,想邀请您成为虫洞社区的首批优质内容签约作者。虫洞社区是专业的区块链技术学习社区。虫洞社区鼓励内容生产者产生高质量内容,并给予合理的回报,也希望能帮助内容消费者获得高质量的区块链内容,并让数字货币投资者获得有价值的投资洞见。同时,虫洞社区已经积累了大量的区块链深度从业者,便于作者建立个人品牌。不知道是否可以加您微信细聊?

      本文标题:20170909 加密和安全(二)

      本文链接:https://www.haomeiwen.com/subject/hrvajxtx.html