ssh
sh:secure shell,protocol.22/tcp,安全的远程连接
具体的软件实现:
openssh:ssh协议的开源实现,centos默认安装
dropbear:另一个开源实现
ssh客户端:
1 | 客户端组件: |
一、ssh基于秘钥验证的原理:
a、首先在C(客户端)生成一对秘钥,并将公钥拷贝给S(服务器)一份并重命名为authorized_keys
1 | [root@node01 ~]#ssh-keygen -t rsa -b 2048 |
b、C想S发送一个连接请求,信息包括ip、用户名
c、S得到C的信息后,会到authorized_keys中查找,如果有响应的ip和用户名,S会随机生成一个字符串,例如:qwer
d、S将使用公钥对字符串qwer进行加密,发送给C
e、C得到S发来的消息后,C会使用私钥进行解密,然后将解密后的字符串发送给S
f、S接收到字符串会跟先前声称的字符串对比,如果一致,就允许免密码登录。
二、在xshell实现基于可以的验证登录
1、在xshell创建公钥–>生成identity.pub文件,并复制到需要登录的主机上相应文件authorized_keys文件中,注意权限必须为600,在需要登录的ssh主机上执行:
1 | ssh-keygen -i -f identity.pub >> .ssh/authorized_keys |
pssh工具
pssh是一个python编写的可以在多台服务器上执行命令的工具,也可以实现文件复制
选项:
--version:查看版本
-h:主机文件列表,内容格式"[user@]host[:port]"
-H:主机字符串,内容格式"[user@]host[:port]"
-A:手动输入密码模式,默认基于key验证
-i:每个服务器内部处理信息输出
-l:登陆使用的用户名
-p:并发的线程数[可选]
-t:超时时间
-v:详细模式
-O:SSH的选项
-p:打印出服务器的返回信息使用案例:
1、在多台主机执行相同命令:
pssh -h ip_file -i COMMAND
1 | [root@node01 ~/.ssh]#pssh -h iplist.txt -i ifconfig |
2、实现将本地文本批量复制到远程主机的功能
1 | [root@node01 ~/.ssh]#pscp.pssh -h iplist.txt -r /data/test/ /data/f1.gpg /data/ |
telnet通过ssh隧道实现安全的本地端口转发
实验:准备三台主机A(192.168.34.101)、B(192.168.34.105)、C(192.168.34.108);A充当ssh客户端,B充当ssh服务端和Telnet客户端,C充当Telnet服务端。
步骤:
1、centos系统默认不安装telnet-server包,需要先安装telnet-server包
1 | [root@node01 ~/.ssh]#yum -y install telnet-server |
此时查看端口23是否打开
1 | [root@node01 ~/.ssh]#ss -ntl |
如果打开了说明Telnet服务可以正常使用,此时用Telnet连接B机器做测试。
2、在C机器设置防火墙拒绝A机器的直接连接
1 | [root@node01 ~]#iptables -A INPUT -s 192.168.34.101 -j REJECT |
3、在主机A开启一没被占用的端口,例如9527,用来接收发往远程的Telnet流量
1 | [root@node01 ~/.ssh]#ssh -L 9527:192.168.34.108:23 192.168.34.105 -fN |
此条命令的意思是在本地开启9527端口,通过shh通道连接到192.168.34.105,再通过192.168.34.105转发给192.168.34.108的23端口。4、通过Telnet连接本机的9527端口,此时还自动通过刚才建立的ssh通道连接到C机器。
1 | [root@node01 ~/.ssh]#telnet 127.0.0.1 9527 |
实验结束,本实验模仿A与C之间无法通信,但是B与A,C之间均可通信的情况下,利用B主机做跳板,实现A与C之间的Telnet通信.
数据传输流程为:
data–>本地(A)9527端口–>本地随机端口–>ssh server(B)–>ssh server随机端口–>telnet server(C)
Telnet利用ssh通道实现安全的本地端口转发之从企业内部发起shh通道
实验:同样A(192.168.34.101),B(192.168.34.105),C(192.168.34.108)三个主机
1、2两步同上个实验相同
3、在B机器上以本机作为客户端,A作为服务器端打开一个ssh通道
1 | [root@node01 ~/.ssh]#ssh -R 9527:192.168.34.108:23 -fN 192.168.34.101 |
此条命令的意思是,以本机为ssh客户端,A机器为ssh服务端建立通道,将来A机器的9527端口的数据都通过此通道,传到本机,并以本机为Telnet客户端转发给C机器的23端口4、在A上Telnet本机的9527端口即可连接到C主机
1 | [root@node01 ~/.ssh]#telnet 127.0.0.1 9527 |
实验结束,本实验从企业内部发起ssh连接,不用修改防火墙策略即可实现,更加具有实用性。上述实验有一个缺陷,就是A主机监听的知识127.0.0.1的9527端口,只能A本机实现端口转发功能,那么如果再有一台机器希望连接C该如何做呢?
很简单,在
1 | [root@node01 ~/.ssh]#ssh -R 9527:192.168.34.108:23 -fN 192.168.34.101 |
这条命令中增加一个g选项,开启网关功能,即可实现监听A机器的所有网卡的9527端口,实现远程转发功能。
1 | [root@node01 ~/.ssh]#ssh -R 9527:192.168.34.108:23 -fNg 192.168.34.101 |
实现此步骤,需要在ssh配置文件中打开网关端口
1 | [root@centos7 ~]#sed -nr '/^Gate/p' /etc/ssh/sshd_config |
ssh实现动态端口转发
实验:准备三台主机A(192.168.34.101)、B(192.168.34.105)、C(192.168.34.108);A为本地主机,B为购买的国外虚拟机(可访问),C为国外无法访问的互联网主机。本实验实现A通过跳板机B访问C;即在A主机打开一个可用端口作为代理服务器,A对C的访问请求被转发到sshserver(B)上,由B代替A访问C。
方法一:
1、在A主机执行
1 | [root@centos7 ~]#ssh -D 1080 192.168.34.105 -fNg |
2、设置代理:
windows:
再浏览器设置代理192.168.34.101:1080即可访问C主机
linux:
1 | [root@centos7 ~]#curl --socks5 127.0.0.1:1080 192.168.34.108 |
方法二:
1、在B主机打开一个端口做代理:
1 | [root@centos7 ~]#ssh -D 1080 192.168.34.101 -fNg |
2、设置代理:
windows:
再浏览器设置代理192.168.34.101:1080即可访问C主机
linux:
1 | [root@centos7 ~]#curl --socks5 127.0.0.1:1080 192.168.34.108 |
ssh服务器
服务器端配置文件
/etc/ssh/sshd_config
常用参数
port 监听端口,默认22
ListenAddress ip 监听地址,设置监听哪块网卡
LoginGraceTime 2m 宽限登录时长,等待时间
PermitRootLogin yes 是否允许root账户登录
StrictModes yes 检查.ssh/文件的所有者,权限等
MaxAuthTries 6 最大错误尝试次数,当达到最大值的一半时,结束
MaxSessions 10 同一个连接最大会话
PubkeyAuthentication yes 允许使用秘钥登录
PermitEmptyPasswords no 是否允许空密码登录
PasswordAuthentication yes 是否允许使用密码登录
GatewayPorts no 是否启用网关功能
ClientAliveInterval 单位:秒;客户端活跃检查次数
ClientAliveCountMax 默认3;客户端是否活跃检查次数
UseDNS yes 是否开启DNS解析
GSSAPIAuthentication yes 提高速度可改为no
MaxStartups 未认证连接最大值,默认值10
Banner /path/file 登录提示,类似/etc/motd的功能
限制可登录用户的办法:
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroupsssh最佳实践
- 建议使用非默认端口
- 禁止使用protocol version 1
- 限制可登陆用户
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址
- 基于口令认证时使用强密码侧罗
随机密码生成,例如:openssl rand -base64 8 tr -dc "[[:alnum:]]" < /dev/urandom | head -c 8 - 使用基于秘钥的认证
- 禁止使用空密码
- 禁止root用户直接登录
- 限制ssh的访问频度和并发在线数
- 经常分析日志