目录
安全与加密
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.gpg gpg -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 有户名/口令登录
① 服务端生成自己的密钥,保存在/etc/ssh/目录下,该目录下存放着ssh_host_xxxkey和ssh_host_xxxkey.pub类型的文件
② 客户端发送ssh连接请求给服务器
③ 服务器把自己的公钥发送给客户端
④ 客户端保存发送过来的公钥至~/.ssh/known_hosts文件中,(我们第一次连接的时候需要敲yes就是保存公钥文件)如果之前保存过,则进行对比,一致则进行下去,不一致则报错。例如下图:
解决的办法是删除~/.ssh/known_hosts文件再重新连接。
⑤ 客户端生成自己的密钥
⑥ 客户端发送自己的公钥至服务端
⑦ 客户端用服务器的公钥对密码进行加密,然后发给服务器
⑧ 服务器用自己的私钥对公钥进行解密,获取密码,如果密码正确则允许登录
3.2 密钥登录
① 客户端生成一对密钥,生成的密钥保存在~/.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目录下并没有自己的密钥;
② CentOS6生成自己的密钥(公钥和私钥),白色框内的分别表示生成的密钥的文件名、是否输入密码、请再次输入密码,直接回车则保持默认,第二项的密码用在客户端用私钥解密的过程;
③ 将CentOS6生成的公钥拷贝发送给CentOS7;
④ 该公钥在CentOS7下的~/.ssh目录下,并按指定的命名规则命名该公钥文件;
⑤ 之后ssh登录就可以不用输入密码;
⑥ 设置客户端的私钥密码,这里的私钥密码不是服务端主机的登录密码,而是客户端在用私钥解密的时候要用到的密码。
四、一些基于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
格式:pssh [选项] “command1;command2;...”
pscp.pssh [选项] <源文件> <目的目录> # 本地文件传到远程目录
pslurp [选项] -L <指定本地目录> <远程文件> <在指定目录下新创建的目录> # 远程文件传到本地目录
-h # 后跟文件,文件格式为user@IP
-H # 后跟user@IP的格式,多个需要用双引号括起来
-i # 交互式地显示出执行结果,不加则不显示结果
-o # 将执行结果导入到指定文件
五、SSH端口转发
有些协议传输网络数据是不安全的,例如Telnet、SMTP等,另外如果防火墙禁用某些网络端口导致某些TCP连接无法建立,遇到上诉问题的时候怎么办呢?可以将这些数据通过ssh加密,经过ssh端口转发出去,接收端经过sshd端口接受这些数据并解密,这样为明文传输保障了安全和绕过了那些不可用的网络端口。这样通过ssh端口完成数据转发的过程,就好像是在ssh建立的通道之间传输数据一样,我们称之为"隧道(tunnel)",也即"端口转发",通道内的数据本身可能是不安全的,但是通道却是安全的。
5.1 本地转发
所谓本地端口转发,就是将发送到本地端口的请求,转发到目标端口。这样,就可以通过访问本地端口,来访问目标端口的服务。应用于内网本地主机访问外网主机。
以telnet的ssh端口本地转发为例:
① 安装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不仅仅本机可以使用
③ 查看建立的连接状态,命令:netstat -ntap
④ telnet连接本地的9527端口,则经过ssh通道连接到CentOS6主机。
⑤ 断开连接,需要把通道断开
5.2 远程转发
所谓远程端口转发,就是将发送到远程端口的请求,转发到目标端口。这样,就可以通过访问远程端口,来访问目标端口的服务。应用于外网主机访问内网本地主机。
以telnet的ssh端口远程转发为例:
①建立mini6与CentOS6的ssh远程通道,命令格式为:ssh -R [远程地址:]远程端口:目标地址:目标端口 -N service_IP
② 在CentOS6上查看端口监听状态,发现9527端口正在被sshd监听。注意与本地端口转发的ssh监听9527端口的区别
③ telnet连接本地的9527端口,则经过ssh通道连接mini6主机
5.3 动态转发
所谓动态装发,就是仅绑定一个本地端口,但是目标地址:目标端口则是根据发起的请求而变化的,与本地转发和远程转发的一对一端口不同,动态转发是一对多端口。应用于内网主机访问外网主机的多个服务。例如我们常说的×××。
① 设置socket代理,设置如下图,然后确认保存;
② 浏览器下访问www.baidu.com,显示访问失败;
③ 建立ssh动态端口转发通道,命令格式为:ssh -D 本地地址:本地端口 -N server_IP
④ 再次回到浏览器访问www.baidu.com,则访问成功。