ssh
secure shell, protocol, 22/tcp, 安全的远程登录
具体的软件实现:
OpenSSH: ssh协议的开源实现,CentOS默认安装
dropbear:另一个开源实现
SSH协议版本
v1: 基于CRC-32做MAC,不安全;man-in-middle
v2:双方主机协议选择安全的MAC方式
基于DH算法做密钥交换,基于RSA或DSA实现身份认证
两种方式的用户登录认证:
基于password
基于key
Openssh软件组成
相关包:
openssh
openssh-clients
openssh-server
工具:
基于C/S结构
Linux Client:
ssh, scp, sftp,slogin
Windows Client:
xshell, putty, securecrt, sshsecureshellclient
Server:
sshd
ssh客户端
配置文件:/etc/ssh/ssh_config
StrictHostKeyChecking no 首次登录不显示检查提示
格式:ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
常见选项
-p port:远程服务器监听的端口
-b:指定连接的源IP
-v:调试模式
-C:压缩方式
-X:支持x11转发
-t:强制伪tty分配
ssh -t remoteserver1 ssh -t remoteserver2 ssh remoteserver3。注意使用场景。例如某个公司有ABCD四台主机,配置以下策略,只允许A连B,B连C,C连D。当要连接D主机时,此时可以使用-t选项。ssh -t A ssh -t B ssh -t C ssh D。
注意:
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接。如下图
sshd
ssh配置优化
端口不使用默认22 GSSAPIAuthentication yes 提高速度可改为no UseDNS yes 提高速度可改为no。为yes会通过dns将IP解析为域名。 ClientAliveInterval 300 检查客户端是否活动连接的间隔时长,单位:秒 u ClientAliveCountMax 0 检查客户端是否活动连接的次数, 默认3此。和上一项配合使用,300秒内误操作自动退出
sshd部分配置项说明
#LoginGraceTime 2m ssh链接后等待输入密码的时长。 MaxAuthTries 6 到达配置值的一办就会退出 ClientAliveInterval 0 检查客户端是否活动连接的间隔时长,单位:秒 ClientAliveCountMax 3 检查客户端是否活动连接的次数, 默认3此 MaxStartups 10:30:100 ssh并发连接在10个以下时全部允许ssh到本机。超过十个且小于100个,则随机挑选30%个拒绝链接,超过100个则全部拒绝
ssh企业应用配置建议
Port 22 :不要使用默认端口; AllowUsers限制可登录的用户; ClientAliveCountMax,ClientAliveInterval设定空闲会话超时时长;
ListenAddress 0.0.0.0仅监听特定的IP地址; PermitEmptyPasswords no #禁止使用空密码; PermitRootLogin禁止root用户直接登录; MaxAuthTries,MaxSessions限制ssh的访问频度和并发在线数; 做好日志,经常分析; /vat/log/secure
禁止使用protocol version 1;
使用基于密钥的认证;
基于口令认证时,使用强密码策略;
随机数生成命令
# tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
#openssl rand -base64 30
利用防火墙设置ssh访问策略;
ssh公钥交换步骤
客户端发起链接请求
服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
客户端生成密钥对
客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
ssh加密通信
client和server都用对方的公钥加密,传输数据。用自己的私钥解密,获取数据。
ssh服务验证登录
ssh服务登录验证方式
用户/口令
基于密钥
基于用户和口令登录验证
在进行公钥交换后,用户会根据服务器发来的公钥对密码进行加密,加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。
ssh服务基于密钥登录验证(免密登录)
双方都使用对方的公钥加密同一个字符串,然后发给对方,解密后比对字符串是否一致。
1 首先在客户端生成一对密钥(ssh-keygen)
2 并将客户端的公钥ssh-copy-id 拷贝到服务端
3 当客户端再次发送一个连接请求,包括ip、用户名
4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:1qazwsx
5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
linux主机之间基于密钥的认证:
(1) 在客户端生成密钥对
ssh-keygen -t rsa [-P ''] [-f “~/.ssh/id_rsa"]
(2) 把公钥文件传输至远程服务器对应用户的家目录
ssh-copy-id [-i [identity_file]] [user@]host
使用xshell连接linux基于密钥的认证:
(1)使用xshell生成公钥(下面第一张图和第二张图,)
(2)将公钥复制到目标linux主机,并导入到 ~/.ssh/authorized_keys:ssh-keygen -i -f id_rsa_2048.pub >> .ssh/authorized_keys
(3)在使用xshell登录时选择密钥登录(第三张图)
posted on 2020-08-16 10:30 HowOldAreYou 阅读(181) 评论(0) 编辑 收藏 举报