Secure Shell (SSH) 是一种加密的网络协议,具备加密通信、身份认证(密码或密钥)、远程命令执行、文件传输等功能,默认使用TCP 22 端口进行通信,用于在不安全的网络中安全的进行远程登录和管理服务器。它替代了传统的明文协议(如Telnet、FTP),通过加密和身份验证机制保障数据传输的安全性。
ssh服务支持功能
NO.1 打造安全SSH服务通道
SSH服务作为远程管理的核心工具,尽管设计上具备高安全性,但在实际应用中仍易遭受攻击,主要原因包括以下几个方面:
- 默认端口暴露
SSH默认使用22端口,攻击者通过全网扫描即可快速定位目标,发起暴力破解或漏洞利用。 - IP白名单缺失
允许任意IP连接SSH端口,攻击者可随意发起攻击。 - Root账户开放
部分系统默认允许root用户通过SSH登录,直接暴露最高权限账户。 - 弱密码策略
用户使用简单密码(如123456、admin),攻击者可快速破解。 - 账号防护策略缺失
用户账号未设置登录失败次数锁定时长限制,增加攻击者爆破成功率 - 密钥泄露风险
私钥文件(id_rsa)未加密存储或权限宽松(如chmod 777),导致被窃取。 - 公钥配置错误
authorized_keys文件权限不当或包含未经验证的公钥。 - 兼容性配置风险
为兼容旧客户端启用不安全的加密算法(如SSHv1、CBC模式加密)。 - 日志监控不足
未定期检查/var/log/auth.log,导致攻击行为未被及时发现。 - 未及时更新补丁
旧版OpenSSH存在已知漏洞(如CVE-2020-15778、CVE-2018-15473),攻击者可远程执行代码。
1、更换SSH服务"门牌号"和"大管家"
SSH服务默认使用的是TCP 22 端口进行通信,这个就像SSH服务的“门牌号”,通过修改SSH服务的默认端口号,可以避免自动化脚本的扫描;root用户是系统最高权限用户,是系统的“大管家”,禁用root账号登录,可以降低暴力破解攻击成功率。
- 更换SSH服务默认端口号
# 修改服务端配置
sudo vim /etc/ssh/sshd_config
修改以下行:
Port 65522 # 改为非标准端口(如 49152-65535 之间的高位端口)
#修改selinux设置,放行新添加的ssh端口
semanage port -a -t ssh_port_t -p tcp 65522
# 重启服务生效:
sudo systemctl restart sshd
# 验证:
ssh user@hostname -p 65522
或者
netstat -anp|grep 65522
# 建议同时修改/etc/services里面的ssh对应的端口
ssh 65522/tcp # The Secure Shell (SSH) Protocol
ssh 65522/udp # The Secure Shell (SSH) Protocol
#使配置生效
source /etc/services
- 禁用root账户登录
# 修改服务端配置
sudo vim /etc/ssh/sshd_config
修改以下行:
PermitRootLogin no # 完全禁止Root登录
# 重启服务生效:
sudo systemctl restart sshd
# 验证:
ssh root@hostname -p 65522
2、安排“门岗”,发放特别“通行证”
SSH服务默认是监听在所有的网口上,针对实际需求,可以调整SSH服务配置,让业务监听在指定的网口上;通过启用防火墙或tcp_wrappers,可以限制访问服务的主机,通过启用PAM服务,对登录ssh服务的账号进行检查加固和控制,针对特殊的场景,配置信任主机免密登录。
sshd_config参数配置
# 修改服务端配置
sudo vim /etc/ssh/sshd_config
修改以下行:
Protocol 2 #设置协议版本为V2
ListenAddress 192.168.1.100 #设置只在192.168.1.100地址监听65522端口
# 重启服务生效:
sudo systemctl restart sshd
# 验证:
netstat -anp|grep sshd
- 限制可信主机访问SSH服务
# 配置firewall防火墙规则允许指定192.168.1.200访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.200" port protocol="tcp" port="65522" accep"
# 重新加载让规则生效
firewall-cmd --reload
# 配置tcp_wrappers规则放通192.168.1.200访问
ldd /usr/sbin/sshd |grep libwrap #查看是否支持tcp_warppers
# 有以下输出则表示支持
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fefecf89000)
#编辑/etc/hosts.allow文件,添加SSH服务允许的地址
sudo vim /etc/hosts.allow
添加如下内容:
sshd : 192.168.1.0
# 编辑/etc/hosts.deny文件,限制其他所有地址访问SSH
sudo vim /etc/hosts.deny
添加如下内容:
sshd : ALL
- 使用PAM模块加固账户信息
#编辑/etc/pam.d/system-auth,设置密码复杂度
password requisite pam_pwquality.so retry=3 minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
#编辑/etc/pam.d/sshd,配置登录失败锁定策略
auth required pam_tally2.so deny=5 unlock_time=600
- 设置SSH服务免密登录
- 生成ssh服务秘钥对
# 使用ssh-keygen生成密钥,生成Ed25519密钥(推荐,更安全且更快)
ssh-keygen -t ed25519
# 或生成RSA密钥(兼容旧系统)
ssh-keygen -t rsa -b 4096
- 交互提示:输入密钥保存路径(默认:~/.ssh/id_ed25519)。设置密钥密码(可选,增强安全性)。
- 生成文件:
- 私钥:~/.ssh/id_ed25519(需严格保密)
- 公钥:~/.ssh/id_ed25519.pub(可自由分发)
ed25519加密算法密钥对生成
# 使用 `ssh-copy-id`(推荐),自动将公钥添加到服务器的 ~/.ssh/authorized_keys
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname -p port
# 需要输入一次密码(完成后即可免密登录)。
# 手动上传到服务器,复制公钥到pub.txt
cat ~/.ssh/id_ed25519.pub > pub.txt
登录服务器,将公钥追加到 `~/.ssh/authorized_keys`:
mkdir -p ~/.ssh
cat pub.txt >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys # 必须限制权限!
- 密钥权限管理
# 私钥文件权限必须是 600
chmod 600 ~/.ssh/id_ed25519
#服务器上的 ~/.ssh 目录权限为 700:
chmod 700 ~/.ssh
#服务器上的 authorized_keys 文件权限为 600:
chmod 600 ~/.ssh/authorized_keys
NO.2 打开SSH服务工具箱
SSH服务除了远程登录和管理服务器、身份认证、通信加密的基础功能,还具备网络穿透、端口转发文件等功能,一起揭开这个工具箱,寻找趁手的工具。
- 工具1-本地端口转发
本地端口转发原理:SSH 客户端在本地打开一个端口,监听来自本地的连接请求。当有数据发送到该端口时,SSH 客户端会通过加密通道将数据转发到远程 SSH 服务器,再由服务器将数据发送到指定的目标地址和端口。
本地端口转发示例
# 配置本地端口转发,访问服务器的web服务
ssh -L 192.168.1.200:8090:192.168.2.200:8090 -Nf testuser@192.168.1.100 -p 65522
#测试验证
打开本地浏览器,在浏览器输入http://localhost:8090
- 参数说明
- -L:开启本地转发
- 192.168.1.200:8090:在本地所有接口上监听8090端口,端口可自定义
- 192.168.2.110:8090:真实应用服务器地址和端口
- -Nf:将命令放在后台静默执行
- testuser@192.168.1.100:跳板服务地址
- -p 65522:跳板服务器ssh服务端口
- 工具2-远程端口转发
远程端口转发原理:SSH 客户端请求远程 SSH 服务器在指定端口上监听,当有数据到达该端口时,远程服务器将数据通过 SSH 隧道回传给本地客户端,再由客户端转发到本地网络中的目标服务。
远程端口转发示例
# 配置远程端口转发,访问部署在本地的Mariadb数据库
ssh -R 192.168.2.100:13306:192.168.1.200:3306 -Nf testuser@192.168.1.100 -p 65522
- 参数说明
- -R:开启远程转发
- 192.168.2.100:13306:在跳板服务器上开放13306端口接收数据
- 192.168.1.100:3306:本地数据库服务地址端口
- -Nf:将命令放在后台静默执行
- testuser@192.168.1.100:跳板服务地址
- -p 65522:跳板服务器ssh服务端口
- 工具3-scp安全复制工具
SCP(Secure Copy)是基于 SSH 协议的安全文件传输工具,用于在本地与远程主机之间加密传输文件或目录,仅支持上传和下载功能。
SCP 本质是 SSH 的一个子系统,依赖 SSH 提供以下功能:
身份认证:通过密码或密钥验证用户身份。
加密通道:使用 AES、ChaCha20 等算法加密传输数据。
完整性校验:防止数据在传输中被篡改
- SCP 的工作流程
- 建立 SSH 连接 客户端与远程服务器建立 SSH 连接,完成身份认证和加密通道协商。
- 密钥交换:使用 Diffie-Hellman 算法生成临时会话密钥。
- 加密算法协商:如客户端与服务器约定使用 AES-256-GCM 加密数据。
- 启动远程 SCP 进程
- 上传文件:客户端通过 SSH 在远程服务器启动 scp -t /目标路径(-t 表示接收文件)。
- 下载文件:客户端通过 SSH 在远程服务器启动 scp -f /源文件(-f 表示发送文件)。
- 传输元数据 文件属性:
- 传输前发送文件权限、大小、时间戳等元数据。
- 目录处理:
- 若传输目录,递归发送每个文件的元数据和内容。
- 分块传输文件内容 数据分块:
- 文件内容被分块(通常为 32KB 或 64KB)并通过 SSH 加密通道传输。
- 确认机制:每传输一个数据块,接收方返回确认信号(\0)。
- 结束传输 发送结束标记(如 E),关闭连接。
- scp命令使用示例
# 命令格式
scp [选项] 源文件 目标文件
# 复制本地文件到远程主机
scp file.txt user@remote:/path/
# 复制远程文件到本地
scp user@remote:/path/file.txt .
# 复制远程目录到本地
scp -r user@remote:/path/ /local/path
- 参数说明:
- -r:递归复制整个目录(必选)
- -P 端口:指定 SSH 端口(默认 22)
- -C:启用压缩传输(大文件推荐)
- -p:保留文件权限、修改时间等属性
- -v:显示详细传输日志(调试用)
- -q:静默模式(不显示进度)
- 工具4-sftp安全文件传输协议
SFTP(SSH File Transfer Protocol)是一种通过SSH(Secure Shell)协议进行安全文件传输的网络协议。它在传输过程中对数据进行加密,确保了文件传输的安全性和完整性。SFTP不仅支持文件的上传和下载,还提供了文件删除、重命名、创建目录等丰富的文件管理功能。
- sftp工作原理
- 底层依赖 SSH 协议:
- SFTP 是 SSH 的一个子系统(类似 SCP),默认使用 SSH 的 22 端口。
- 会话流程:
- 客户端与服务器建立 SSH 连接。
- 启动 SFTP 子系统(通过 sftp-server 或类似服务)。
- 通过加密通道传输文件操作指令和数据。
- 协议分层
- SSH 传输层:处理加密、认证和完整性校验。
- SFTP 协议层:定义文件操作指令(如 OPEN, READ, WRITE)和响应。
- 数据传输
- 分块传输:文件被分块传输,每个块通过 SSH 加密。
- 二进制协议:SFTP 使用二进制格式,扩展性更强。
- sftp使用方法
# sftp命令格式
sftp user@192.168.1.100 -p65522
sftp> cd /tmp
sftp> put test.txt
sftp> chmod 644 test.txt
sftp> bye
- sftp指令:
- put local_file:上传本地文件到远程
- get remote_file:下载远程文件到本地
- ls:列出远程目录内容lls:列出本地目录内容
- cd remote_dir:切换远程目录
- lcd local_dir:切换本地目录
- mkdir dir:在远程创建目录
- rm file:删除远程文件
- rename old new:重命名远程文件
- chmod 644 file:修改远程文件权限
- exit / bye:退出 SFTP 会话
SSH服务是IT基础设施中不可或缺的安全工具,掌握其关键配置与高级功能可显著提升运维效率和系统安全性。