目录

  • 安全与加密

  • SSH

  • SSH登录方式

  • 一些基于SSH的命令

  • SSH端口转发


一、安全与加密

1.1 加密中的机制

对称加密--加密和解密使用同样的密钥(DES类型)

        优点:传输速度快,加密解密时间短

        缺点:密钥更换频率高,而且分发较繁琐;密钥分发需要考虑被劫持的安全问题      

    DH算法完成对称加密中的密钥交换

        A和B协商一组数据,分别为公开的整数a和较大的素数p,A和B共同持有a/p;

        A随机生成小于p的x,计算a^x%p=α,α结果发送给B;B随机生成小于p的y,计算a^y%p=β,β结果发送给A;

        A计算β^x%p,结果为A的密钥;B计算α^y%p,结果为B的密钥;

        最后可以发现A的密钥和B的密钥结果是一样的

    假设A和B双方通信,他们之间的密钥为K

        A: K(data)=c -> B:得到c

        B: K(c)=data

非对称加密(公钥/私钥)--加密和解密使用不同的钥匙(RSA类型)

        优点:因为加密和解密不是用的一个钥匙,因此安全性高;公钥是公开的,私钥只有自己持有,并且只有私钥能解开公钥;

        缺点:加密和解密的消耗时间长

    假设A是发送方,B是接收方

    B生成公钥和私钥,并把公钥发送给A,A用B的公钥对数据进行加密之后发送给B,B用自己的私钥解密,

      A      ->    B

     (PB)   <-  (PB/SB)

    PB(data) ->  SB+PB(data) ==>data

单向散列hash

        特点是不同长度的字符经过处理得到固定长度的唯一字符,并且无法根据密文推算明文。例如MD5算法,sha1算法等。通常hash用来验证信息的完整性,如果信息被篡改,经过hash校验之后会报错。

证书认证 

        信息在互联网传输中,对方都是透明的,我们无法知道对方的真实身份,因此,为了确认对方的身份,加入了证书认证机制。这就和我们的×××一样,刚刚接触陌生人,我们都无法信任对方,但是只要我们都拿出×××,确认对方确实是本人,这中间就是加入了我们都信任的第三方--公安机构。证书认证和×××类似,互联网中加入了我们都信任的第三方--CA认证中心,只要被CA中心签名认证的身份,我们就认为他是安全的。 

1.2 生成密钥

gpg命令

    gpg --gen-key                  # 生成目录~/.gnupg/,该目录默认没有,并把生成的密钥保存在该目录下的 pubring.gpg  secring.gpg文件中。

    gpg --list-keys 或者 gpg -k    # 查询存在的公钥

    gpg --list-secret-keys 或者 gpg -K    # 查询存在的私钥

    gpg -a --export -o xxx.pub     # 以ASCII格式(-a)导出公钥至xxx.pub文件

    gpg -a --export 公钥ID > xxx.pub      # 将指定公钥导出

    gpg --import xxx.pub           # 将xxx.pub文件导入密钥 

    gpg -e -r xxx.pub file         # 以公钥xxx.pub加密文件file,会生成file.gpg文件

    gpg -o file -d file.gpg        # 将file.gpg解密为文件file

    gpg --delete-key               # 删除公钥

    gpg --delete-secret-key        # 删除私钥   

gpg实现对称加密

gpg -c file    # 生成file的加密文件file.gpggpg -o file -d file.gpg

1.3 SSL/TLS 

因为通信双方既要考虑数据安全问题,也要关心传输效率,因此把对称加密、非对称加密、hash和证书认证结合使用,实现对数据的高效稳定的传输。这就是SSL/TLS协议。

SSL/TLS协议过程

① 客户端发送连接请求至服务端(client hello)

② 服务端发送连接应答至客户端(server hello)

③ 服务端给客户端发送证书,证明自己的身份(certificate)

④ 服务端发起密钥交换(serverkey exchange)

⑤ 客户端给服务端发送证书,证明自己的身份(certificate)

⑥ 客户端发起密钥交换(clientkey exchange)

经过SSL/TLS协议,通信双方会获得对方的公钥、数据加密的共享密钥。


二、SSH(Secure Shell Protocol)

CentOS默认使用OpenSSH软件实现ssh协议,基于DH算法实现密钥交换。应用C/S结构。

2.1 客户端

        配置文件/etc/ssh/ssh_config   

        格式:ssh user@IP [command] 或者 ssh -l user IP [command]

        ssh -p     # 指定端口

        ssh -b     # 指定连接的源IP

        ssh -C     # 以压缩的方式进行传输数据

        ssh -X     # 支持X11,图形化

2.2 服务端

        配置文件/etc/ssh/sshd_config

主要参数含义

Port             定义sshd服务的端口,默认为22

Protocol         定义ssh协议的版本号,一般为2

ListenAddress    定义sshd监听的IP地址,默认所有IP,若要指定则为:ListenAddress xxx.xxx.xxx.xxx

PidFile          定义开启sshd服务的进程ID的文件,/var/run/sshd.pid存放着PID

LoginGraceTime   定义输入密码阶段的宽容时间,超过该时间还没有连接成功则自动退出。默认2分钟

Compression      定义是否使用压缩方式传输,有yes no delayed(登录后采用压缩方式)

HostKey          定义sshd服务生成的密钥文件格式

SyslogFacility   定义ssh登录日志存放的文件,AUTHPRIV表示/var/log/secure

PermitRootLogin  表示是否允许root登录

StrictModes      表示是否对sshd相关的文件进行权限的检查

PubkeyAuthentication   表示是否允许用户密钥登录的方式

AuthorizedKeysFile     表示密钥登录的时候,客户端公钥需要保存为服务端的什么目录、格式,默认为.ssh/authorized_keys

PasswordAuthentication 表示是否需要进行密码验证

PermitEmptyPasswords   表示是否允许空密码登录,默认为no

UsePAM           表示是否使用PAM管理认证,默认为yes

X11Forwarding    表示是否允许图形化数据经过ssh通道转发

TCPKeepAlive     表示是否让ssh时刻监控TCP的连接状态

MaxStartups      定义允许同时出现连接输入密码界面的最大数目

UseDNS           表示是否对客户端进行DNS反向解析,用以判断客户端的合法性。默认为yes,如果内外互联可以设置为no

DenyUsers/DenyGroups   定义禁止登陆的用户和群组


三、SSH登录方式

3.1 有户名/口令登录

blob.png

    ① 服务端生成自己的密钥,保存在/etc/ssh/目录下,该目录下存放着ssh_host_xxxkey和ssh_host_xxxkey.pub类型的文件

    ② 客户端发送ssh连接请求给服务器

    ③ 服务器把自己的公钥发送给客户端

    ④ 客户端保存发送过来的公钥至~/.ssh/known_hosts文件中,(我们第一次连接的时候需要敲yes就是保存公钥文件)如果之前保存过,则进行对比,一致则进行下去,不一致则报错。例如下图:

blob.png

        解决的办法是删除~/.ssh/known_hosts文件再重新连接。

    ⑤ 客户端生成自己的密钥

    ⑥ 客户端发送自己的公钥至服务端

    ⑦ 客户端用服务器的公钥对密码进行加密,然后发给服务器

    ⑧ 服务器用自己的私钥对公钥进行解密,获取密码,如果密码正确则允许登录

3.2 密钥登录

blob.png    

    ① 客户端生成一对密钥,生成的密钥保存在~/.ssh/(700)目录下,分别为id_xxx(私钥600)、id_xxx.pub(公钥644)

        客户端生成密钥:ssh-keygen [-t 密钥类型] 

    ② 把公钥id_xxx.pub发送给服务端,在服务端中把发送过来的公钥保存在~/.ssh/authorized_keys(644)文件中   

        拷贝公钥:ssh-copy-id -i id_xxx.pub

    ③ 客户端向服务端发送ssh连接请求,信息包括客户端的ip和用户名

    ④ 服务端收到该连接请求后,在~/.ssh/authorized_keys中查找是否有客户端的ip和用户名,如果存在的话服务端随机生成一段字符串char

    ⑤ 服务端用公钥authorized_keys加密char发送给客户端

    ⑥ 客户端收到后用私钥id_xxx解密,得到char

        在用私钥解密的之前可以加入密码:ssh-keygen -p

    ⑦ 客户端用服务端发送的公钥(服务端自己生成的公钥)加密char发送给服务端

    ⑧ 服务端收到后用私钥(服务端自己生成的私钥)解密,得到char与之前随机生成的char比对,如果一致则登录

实现密钥登录的方法:

① 我们要实现CentOS6密钥方式登录CentOS7,刚开始CentOS6的~/.ssh目录下并没有自己的密钥;

blob.png

② CentOS6生成自己的密钥(公钥和私钥),白色框内的分别表示生成的密钥的文件名、是否输入密码、请再次输入密码,直接回车则保持默认,第二项的密码用在客户端用私钥解密的过程;

blob.png

③ 将CentOS6生成的公钥拷贝发送给CentOS7;

blob.png

④ 该公钥在CentOS7下的~/.ssh目录下,并按指定的命名规则命名该公钥文件;

blob.png

⑤ 之后ssh登录就可以不用输入密码;

blob.png

⑥ 设置客户端的私钥密码,这里的私钥密码不是服务端主机的登录密码,而是客户端在用私钥解密的时候要用到的密码。

blob.png


四、一些基于SSH协议的命令

scp       # 远程复制

    scp file1 user@IP:dir

    scp user@IP:file2 dir

    -p    # 保持源文件权限不变

    -r    # 递归

    -q    # 静默模式

rsync     # 只将内容不同的文件进行复制

    -r    # 递归

    -v    # 显示详细过程

    -L    # 将软链接指向的源文件进行复制

    -l    # 将软链接文件本身进行复制

    -a    # 存档

    常用选项组合rsync -av    

sftp

    和lftp命令类型

pssh

    一个Python写的工具,pssh的软件需要epel源下载,yum -y install pssh;cat /usr/bin/pssh  

blob.png      

    格式:pssh [选项] “command1;command2;...”

          pscp.pssh [选项] <源文件> <目的目录>    # 本地文件传到远程目录

          pslurp [选项] -L <指定本地目录> <远程文件> <在指定目录下新创建的目录>    # 远程文件传到本地目录

    -h    # 后跟文件,文件格式为user@IP

    -H    # 后跟user@IP的格式,多个需要用双引号括起来 

    -i    # 交互式地显示出执行结果,不加则不显示结果 

    -o    # 将执行结果导入到指定文件         

blob.png

blob.png


五、SSH端口转发

有些协议传输网络数据是不安全的,例如Telnet、SMTP等,另外如果防火墙禁用某些网络端口导致某些TCP连接无法建立,遇到上诉问题的时候怎么办呢?可以将这些数据通过ssh加密,经过ssh端口转发出去,接收端经过sshd端口接受这些数据并解密,这样为明文传输保障了安全和绕过了那些不可用的网络端口。这样通过ssh端口完成数据转发的过程,就好像是在ssh建立的通道之间传输数据一样,我们称之为"隧道(tunnel)",也即"端口转发",通道内的数据本身可能是不安全的,但是通道却是安全的。

5.1 本地转发

所谓本地端口转发,就是将发送到本地端口的请求,转发到目标端口。这样,就可以通过访问本地端口,来访问目标端口的服务。应用于内网本地主机访问外网主机

以telnet的ssh端口本地转发为例:

blob.png

① 安装telnet软件,以CentOS6为服务端,CentOS7为客户端

        CentOS6:yum -y install telnet-server

        CentOS7:yum -y install telnet

② 建立ssh通道,命令格式:ssh -L [本地地址:]本地端口:目标地址:目标端口 -N server_IP

ssh -L    # 表示建立本地ssh通道

    -N    # 建立ssh通道后,不登录服务端

    -f    # 后台运行

    -g    # 启动网关功能,即client_port不仅仅本机可以使用

blob.png

③ 查看建立的连接状态,命令:netstat -ntap

blob.png

blob.png

④ telnet连接本地的9527端口,则经过ssh通道连接到CentOS6主机。

blob.png

⑤ 断开连接,需要把通道断开

blob.png

5.2 远程转发

所谓远程端口转发,就是将发送到远程端口的请求,转发到目标端口。这样,就可以通过访问远程端口,来访问目标端口的服务。应用于外网主机访问内网本地主机

以telnet的ssh端口远程转发为例:

blob.png

①建立mini6与CentOS6的ssh远程通道,命令格式为:ssh -R [远程地址:]远程端口:目标地址:目标端口 -N service_IP

blob.png

② 在CentOS6上查看端口监听状态,发现9527端口正在被sshd监听。注意与本地端口转发的ssh监听9527端口的区别

blob.png

③ telnet连接本地的9527端口,则经过ssh通道连接mini6主机

blob.png

5.3 动态转发

所谓动态装发,就是仅绑定一个本地端口,但是目标地址:目标端口则是根据发起的请求而变化的,与本地转发和远程转发的一对一端口不同,动态转发是一对多端口。应用于内网主机访问外网主机的多个服务。例如我们常说的×××。

blob.png

① 设置socket代理,设置如下图,然后确认保存;

blob.png

② 浏览器下访问www.baidu.com,显示访问失败;

blob.png

③ 建立ssh动态端口转发通道,命令格式为:ssh -D 本地地址:本地端口 -N server_IP

blob.png

④ 再次回到浏览器访问www.baidu.com,则访问成功。

blob.png