ssh服务介绍及通信原理
ssh服务:secure shell;加密通信,代替传统的telnet
具体软件实现:openssh、dropbear
ssh协议版本:V1基于crc-32做mac,不安全;V2双方主机基于安全的mac方式,基于DH算法做密钥交换,基于dsa或rsa实现身份认证
公钥交换原理
1、客户端发起连接请求
2、服务器端返回自己的公钥和会话ID给客户端,客户端获取到服务端的公钥
3、客户端生成自己的密钥对,客户端用自己的公钥异或会话ID生成response,并使用服务端的公钥加密response,得到密文
4、密文传输给服务端,服务端用自己的私钥解密,得到response,response和会话id异或得到了客户端的公钥,最终完成密钥交换
5、最后双方可使用对方的公钥加密数据完成数据通信
openssh服务
OpenSSH是SSH (Secure SHell) 协议的免费开源实现,基于 C/S结构
服务器:/usr/sbin/sshd
Unit 文件:/usr/lib/systemd/system/sshd.service
客户端:
Linux Client: ssh, scp, sftp,slogin
Windows Client:xshell, MobaXterm,putty, securecrt, sshsecureshellclient
客户端ssh命令
当client发起ssh命令请求时,会复制服务器的/etc/ssh/ssh_host*key.pub公钥到client的当前用户的.ssh/know_hosts文件中,下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
如果没有know_hosts文件中,发起连接会提示确认是否连接该主机
ssh客户端配置文件:/etc/ssh/ssh_config
#StrictHostKeyChecking ask
首次登录不显示检查提示
StrictHostKeyChecking no
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
使用sed批量替换配置文件中的选项
root@LGW-Linux-8 .ssh]# sed -i.bak '/StrictHostKeyChecking/s/.*/StrictHostKeyChecking no/' /etc/ssh/ssh_config
ssh命令格式
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 最终跳转到remoteserver3;中间为跳转机
-o option 如:-o StrictHostKeyChecking=no
-i <file> 指定私钥文件路径,实现基于key验证,默认使用文件: ~/.ssh/id_dsa,
~/.ssh/id_ecdsa, ~/.ssh/id_ed25519,~/.ssh/id_rsa等
X11转发
在server端安装yum -y install xorg-x11-xauth
在client 执行ssh -X host,可将server的图形在client端显示
-t实现逐级跳转
远程执行命令
远程运行本地脚本
lastb命令查看登录失败记录 日志记录在/var/log/btmp
ssh登录方式介绍(口令/密钥)
口令登录原理
密钥登录原理
1、客户端通过ssh-genkey生成密钥对,通过ssh-copy-id拷贝公钥到服务端
2、当客户端发起登录请求包含用户和ip时,会在authorized_key中查找,如果有响应的ip和用户时,服务端生成随机字符串,使用客户端的公钥加密,然后发送给客户端
3、得到服务端的消息后,客户端使用私钥解密,得到随机字符串,将解密得到的随机字符串发送给服务端
4、服务端对比随机字符串,结果一致,即可免密登录
密钥登录方式实现
使用ssh-keygen生成客户端密钥
ssh-keygen -t rsa [-P 'password'] [-f “~/.ssh/id_rsa"]
使用ssh-copy-id将公钥拷贝到服务端
ssh-copy-id [-i [identity_file]] [user@]host
查看到目标server端的authorized_key中存在的公钥与client中一致
测试验证免密登录
ssh-keygen可对client的私钥密钥进行密钥保护
ssh-keygen -p
取消密码保护
ssh-keygen -p -f id_rsa -N
如对私钥使用了密码保护,那每次登录server服务端都需要输入密码,可通过验证代理(authentication agent)将密码托管,只需要在当前shell输入一次即可;如下为实现方式: 注:shell退出后验证代理也会退出
#启用代理 ssh-agent bash
#托管密保 ssh-
SecureCRT或Xshell实现基于key验证
工具—>用户密钥管理—>生成
转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:
ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys
批量执行命令或脚本
其他ssh客户端工具
scp命令复制文件
scp [options] [user@]host:/sourcefile /destpath
scp [options] /sourcefile [user@]host:/destpath
常用选项:
-c 压缩数据流
-r 递归复制
-p 保持源文件的属性信息
-q 静默模式
-P port 指明remote host的监听端口
rsync同步文件
rsync工具可以基于ssh和rsync协议实现高效率远程系统之间复制文件,比scp快,基于增量数据同步,只复制有变动文件
rsync -av /etc server1:/tmp #复制目录和目录下文件
rsync -av /etc/ server1:/tmp #只复制目录下文件
常用选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留修改时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-u 如果接收者的文件比发送者的文件较新,将忽略同步
-z 压缩,节约网络带宽
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
--delete 源数据删除,目标数据也自动同步删除
ssh服务器配置
服务端:sshd 配置文件:/etc/ssh/sshd_config 帮助文件 man 5 sshd_config
常用参数
Port 监听端口
ListenAddress ip 监听IP
LoginGraceTime 2m 登录时间
PermitRootLogin yes #默认ubuntu不允许root远程ssh登录,是否禁止root登录
StrictModes yes #检查.ssh/文件的所有者,权限等
MaxAuthTries 6 # 最大认证错误次数,需要除以2,默认6/2=3次
MaxSessions 10 #同一个连接最大会话 xshell中的复制会话,代表10个
PubkeyAuthentication yes #基于key验证
PermitEmptyPasswords no #空密码连接
PasswordAuthentication yes #基于用户名和密码连接
GatewayPorts no ssh是否可作为网关转发
ClientAliveInterval 10 #单位:秒
ClientAliveCountMax 3 #默认3 与上方时间一起作用,代表为3*10秒无操作自动断开
UseDNS yes #提高速度可改为no,解析域名
GSSAPIAuthentication yes #提高速度可改为no
MaxStartups #未认证连接最大值,默认值10
Banner /path/file
#以下可以限制可登录用户的办法:
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroups
解决ssh登录缓慢的问题
vim /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no
systemctl restart sshd
ssh服务最佳实践
1、使用非标准端口标签:公钥,服务,登录,服务端,SSH,59,id,ssh,客户端 From: https://blog.51cto.com/gavenlee/6033707
2、禁止使用protocol version1
3、限制可登录用户
4、设置空闲会话超时时长,以释放资源
5、使用防火墙设置ssh策略
6、基于口令认证时,使用强密码
7、使用基于密钥认证
8、禁止root直接登陆
9、限制ssh的访问频率和并发在线数
10、禁止使用空密码