Linux
基础知识
01搭建Centos7系统
02软件管理仓库
03Shell
04查看帮助命令
05系统工作命令
06系统状态检测命令
07工作目录切换命令
08文本文件编辑命令
09文件目录管理
10打包压缩与搜索命令
11输入输出重定向
12管道符与通配符
13Vim编辑器
14Shell脚本
15shell流程控制语句
16用户管理操作
17文件权限与归属
18文件隐藏属性
19文件访问控制列表
20su与sudo
21存储结构
22物理设备命名规则
23文件系统
24挂载硬件设备
25虚拟机添加硬盘设备
26系统中操作添加硬盘设备
27添加交换分区
28磁盘容器配额
29软硬方式链接
30RAID
31LVM
32程序安装与管理
33计划任务
34日志文件分析
35测试网络联通性
36FTP服务
37操作系统基本符号
38操作系统三剑客
39shell基础
40shell语法
41DNS
42Apache概述
43Nginx概述
44集群概述
Vmware安装Ubuntu
更换源
三剑客
更换源
输入输出
安装VMware-Tools
SSH服务
反弹shell
-
+
首页
SSH服务
SSH(Secure Shell,安全外壳协议)是一种用于在不安全网络环境中提供加密远程登录、数据传输及网络服务的网络协议。它通过强加密技术保障通信的机密性、完整性和身份真实性,已成为远程系统管理、数据传输的行业标准,广泛替代了传统的明文协议(如 Telnet、FTP)。 ## 概述 SSH 是一种应用层协议,基于客户端 - 服务器(C/S)模型,通过加密算法对数据传输进行保护,允许用户安全地远程访问计算机、执行命令、传输文件等。 由芬兰学者 Tatu Ylönen 于 1995 年开发,初衷是解决当时 Telnet、FTP 等协议明文传输密码导致的安全漏洞(因 1994 年一次密码嗅探攻击事件触发)。 后续发展出两个主要版本: - SSH-1(1995 年):早期版本,存在设计缺陷(如密钥交换漏洞、中间人攻击风险),已被淘汰,禁止在生产环境使用。 - SSH-2(2006 年标准化,RFC 4250-4256):完全重新设计的版本,修复了 SSH-1 的安全问题,支持更强的加密算法和认证机制,是目前的主流标准(SSH-1 与 SSH-2 不兼容)。 ## 工作原理 SSH 的核心是通过 “加密会话” 实现安全通信,主要分为四个阶段: > 1、协议版本协商 客户端(如ssh命令)向服务器发起连接请求,双方交换各自支持的 SSH 版本(如 “SSH-2.0-OpenSSH_8.9”)。 协商一致后,采用双方均支持的最高版本(通常为 SSH-2)建立基础连接。 > 2、密钥交换与会话密钥生成 目的:在不直接传输密钥的情况下,客户端和服务器协商生成一个对称会话密钥(用于后续数据加密),同时验证服务器身份。 过程: - 服务器向客户端发送自身的主机密钥(非对称密钥对,服务器首次启动时生成,用于标识服务器身份)。 - 双方使用Diffie-Hellman(DH) 或椭圆曲线 Diffie-Hellman(ECDH) 等密钥交换算法,通过交换公开参数,在本地独立计算出相同的共享密钥(会话密钥的基础)。 - 基于共享密钥,结合随机数生成对称会话密钥(如 AES 密钥)和消息认证码(MAC)密钥(用于校验数据完整性)。 作用:确保后续通信的加密密钥仅客户端和服务器知晓,且防止中间人攻击(客户端通过验证服务器主机密钥确认身份,首次连接时需手动确认主机密钥指纹)。 > 3、身份认证 客户端需证明自己有权限访问服务器,主要支持两种认证方式: 密码认证:客户端发送用户名和密码,通过会话密钥加密传输,服务器验证密码正确性。 公钥认证(推荐): 1. 客户端提前生成非对称密钥对(公钥id_rsa.pub + 私钥id_rsa),并将公钥上传至服务器的~/.ssh/authorized_keys文件中。 2. 认证时,服务器生成随机数,用客户端公钥加密后发送给客户端。 3. 客户端用私钥解密随机数,再用会话密钥加密后发回服务器。 4. 服务器验证解密结果与原随机数一致,则认证通过。 > 4、加密会话数据传输 认证通过后,双方进入加密会话阶段: - 数据加密:所有传输数据(命令、文件内容等)使用对称加密算法(如 AES-256、ChaCha20)加密,密钥为步骤 2 生成的会话密钥。 - 数据完整性:通过 HMAC(如 HMAC-SHA256)校验数据是否被篡改,确保接收内容与发送内容一致。 - 会话复用:一个 SSH 连接可同时承载多个会话(如同时执行命令、传输文件),通过 SSH 连接协议(SSH-CONNECT)实现多路复用。 ## 配置文件 SSH 的配置文件分为服务器端配置文件(用于管理 SSH 服务的行为)和客户端配置文件(用于简化客户端连接操作),两者的参数和作用不同。 ### 服务器端配置文件 服务器端配置文件用于定义 SSH 服务(sshd)的运行规则,如端口、认证方式、权限控制等。主流实现(如 OpenSSH)的默认路径为:**/etc/ssh/sshd_config** 配置文件中的参数列表: | 参数 | 作用说明 | 推荐配置(安全角度) | | ---------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | Protocol | 指定支持的 SSH 协议版本(SSH-1 存在安全漏洞,已淘汰) | Protocol 2(仅启用 SSH-2) | | Port | SSH 服务监听的端口(默认 22,易被扫描和暴力攻击) | 改为非标准端口(如Port 2222) | | PermitRootLogin | 控制是否允许root用户直接登录(root 权限过高,风险大) | PermitRootLogin no(禁用) | | PasswordAuthentication | 控制是否允许密码认证(密码易被暴力破解) | PasswordAuthentication no | | PubkeyAuthentication | 控制是否允许公钥认证(通过客户端私钥 + 服务器公钥文件验证,安全性高) | PubkeyAuthentication yes | | AuthorizedKeysFile | 指定服务器存放客户端公钥的路径(用于公钥认证时验证客户端身份) | 保持默认 ~/.ssh/authorized_keys(用户家目录下) | | AllowUsers | 仅允许指定用户(或用户 + 来源 IP)登录(白名单,优先级高于其他权限) | AllowUsers alice@192.168.1.* bob(仅允许 alice 从内网、bob 登录) | | AllowGroups | 仅允许指定用户组登录(适合按角色分配权限,如管理员组) | AllowGroups admin(仅 admin 组可登录) | | MaxAuthTries | 限制单次连接的最大认证尝试次数(防止暴力破解) | MaxAuthTries 3(最多 3 次失败则断开) | | LoginGraceTime | 登录认证超时时间(未完成认证则自动断开,防止连接长期挂起) | LoginGraceTime 30(30 秒) | | ClientAliveInterval | 服务器向客户端发送 “心跳” 的间隔(秒,检测客户端是否在线) | ClientAliveInterval 60(1 分钟一次) | | ClientAliveCountMax | 心跳无响应的最大次数(超过则断开连接,释放资源) | ClientAliveCountMax 3(3 次无响应则断开) | | ListenAddress | 指定服务器监听的 IP 地址(默认监听所有网卡,可限制为内网 IP 增强安全性) | ListenAddress 192.168.1.100(仅监听内网 IP) | | X11Forwarding | 控制是否允许 X11 图形界面转发(需要远程运行 GUI 程序时启用) | 按需开启(yes)或关闭(no) | 值得注意的是: - 所有参数均为 “键值对”,注释用#开头,修改时需删除#并调整值。 - sshd_config 中,被注释的参数(带 #)会使用 OpenSSH 内置的默认值,例如: #PubkeyAuthentication yes 其默认值为 yes(即默认启用公钥认证),无论该参数是否在配置文件中显式写出。 - 配置生效:修改后需重启sshd服务(如systemctl restart sshd生效)。 - 权限要求:sshd_config文件权限需为600(sudo chmod 600 /etc/ssh/sshd_config),否则服务可能无法启动。 ### 客户端配置文件 客户端配置文件用于简化 SSH 连接(无需每次输入完整的用户名、端口、密钥路径等),分为用户级和系统级 | 类型 | 路径 | 作用范围 | 优先级 | | ---------- | ------------------- | -------------------------- | ------ | | 用户级配置 | ~/.ssh/config | 仅当前用户生效(推荐使用) | 更高 | | 系统级配置 | /etc/ssh/ssh_config | 所有用户生效(全局配置) | 较低 | 系统级配置的参数: | 参数 | 作用说明 | | ------------------------- | ------------------------------------------------------------ | | Include | 引入外部配置文件,用于模块化管理 SSH 客户端配置 | | ForwardAgent | 控制是否转发 SSH 代理(用于多跳认证场景) | | ForwardX11 | 控制是否转发 X11 图形界面(远程 GUI 程序可显示到本地) | | ForwardX11Trusted | 控制是否启用 “受信任 X11 转发”(权限更高,风险略高) | | PasswordAuthentication | 控制是否允许使用密码进行身份认证 | | HostbasedAuthentication | 控制是否允许基于主机的认证(通过主机间信任关系实现认证) | | GSSAPIAuthentication | 控制是否启用 GSSAPI 认证(支持 Kerberos 等身份认证协议) | | GSSAPIDelegateCredentials | 控制是否委派 GSSAPI 凭证(允许远程主机使用本地凭证) | | GSSAPIKeyExchange | 控制是否使用 GSSAPI 进行密钥交换 | | GSSAPITrustDNS | 控制 GSSAPI 认证时是否信任 DNS 解析结果 | | BatchMode | 控制是否启用批处理模式(无交互,适合自动化脚本) | | CheckHostIP | 控制是否检查主机 IP 与主机名的匹配关系(防止 IP 欺骗) | | AddressFamily | 指定使用的网络地址族(any/inet/inet6,对应同时尝试 IPv4+IPv6、仅 IPv4、仅 IPv6) | | ConnectTimeout | 设置连接超时时间(单位秒,0 表示无超时) | | StrictHostKeyChecking | 控制是否严格检查服务器主机密钥(ask/yes/no,对应询问、严格校验、自动接受) | | IdentityFile | 指定 SSH 私钥文件路径(客户端尝试用这些私钥进行认证) | | Port | 指定默认连接的 SSH 服务器端口 | | Ciphers | 指定支持的加密算法列表(用于数据传输加密) | | MACs | 指定支持的消息认证码(MAC)算法列表(用于校验数据完整性) | | EscapeChar | 指定 SSH 会话中的转义字符(默认~,用于退出连接等操作) | | Tunnel | 控制是否启用 SSH 隧道功能(yes/no/point-to-point) | | TunnelDevice | 指定隧道设备的默认配置(本地和远程隧道设备) | | PermitLocalCommand | 控制是否允许在 SSH 连接中执行本地命令(如连接时触发本地脚本) | | VisualHostKey | 控制是否以可视化方式(如 ASCII 艺术)显示主机密钥指纹 | | ProxyCommand | 指定代理命令(用于通过跳板机等中间节点连接目标主机) | | RekeyLimit | 设置重密钥交换的限制(达到指定数据量或时间后重新协商会话密钥) | | UserKnownHostsFile | 指定存储已知主机密钥的文件路径(用于验证服务器身份) | | SendEnv | 指定连接时发送到服务器的环境变量列表 | | HashKnownHosts | 控制是否对 known_hosts 文件中的主机条目进行哈希处理(增强隐私) | | SendEnv LANG LC_* | 指定 SSH 客户端连接时,向服务器发送哪些环境变量 | | HashKnownHosts yes | 控制是否对~/.ssh/known_hosts文件中的主机条目进行哈希处理。 | | GSSAPIAuthentication yes | 启用GSSAPI(通用安全服务应用程序接口)认证,常见于基于Kerberos协议的企业级单点登录(SSO)场景。 | ## 安装ssh服务 ```bash # 1. 更新软件包列表 sudo apt update # 2. 同时安装服务端和客户端(-y 自动确认) sudo apt install openssh-server openssh-client -y # 3. 启动SSH服务 sudo systemctl start ssh # 4. 设置开机自动启动(可选,推荐) sudo systemctl enable ssh # 5. 验证服务是否运行(查看状态) sudo systemctl status ssh # 若显示 "active (running)" 则表示启动成功 ``` ## 允许root用户通过ssh进行登录 修改 SSH 服务器配置文件 /etc/ssh/sshd_config 中的 PermitRootLogin 参数。 允许**密码认证**登录 root: ```bash PermitRootLogin yes ``` 仅允许**公钥认证**登录 root(更安全,推荐): ```bash PermitRootLogin prohibit-password # 禁止密码,仅允许公钥 # 或旧版本兼容写法:PermitRootLogin without-password ```  如果没有搜索到,可以加上允许密码认证登录。  保存退出,重启服务,再次使用root进行登录。   ## 如何查看当前用户是否有ssh登录权限 SSH 服务器(sshd)的默认行为是:当未配置 Allow* 或 Deny* 相关参数时,允许所有 “系统有效用户” 登录,只要这些用户满足以下条件: - 用户在系统中存在(即 /etc/passwd 中有该用户记录,test 用户显然存在); - 用户未被锁定(密码状态正常,可用 sudo passwd -S test 检查,状态为 P 表示有效); - 认证方式有效(若服务器允许密码认证,则 test 用户密码正确;若仅允许公钥认证,则 test 的 ~/.ssh/authorized_keys 中已配置正确公钥)。 ## 取消test用户的ssh登录权限 1、编辑 SSH 服务器配置文件。 ```bash sudo vim /etc/ssh/sshd_config # 用vim编辑,也可用nano等编辑器 ``` 2、添加禁止 test 用户登录的规则。 ```bash DenyUsers test ``` 值得注意的是:DenyUsers 用于明确禁止指定用户登录 SSH,优先级低于 AllowUsers(但你的配置中没有 AllowUsers,因此该规则会直接生效)。  3、保存配置且重启sshd服务。 ```bash sudo systemctl restart ssh ``` 4、再次尝试登录。   ## 公私密钥进行登录 前提:允许test用户进行ssh登录。  > 1、客户端生成公私密钥 在客户端(用来发起连接的机器)生成密钥对,使用 ssh-keygen 工具(默认生成 RSA 算法密钥,也可指定更安全的 Ed25519 算法)。 ```bash # 生成密钥对(默认RSA算法,2048位;推荐使用4096位或Ed25519) ssh-keygen -t ed25519 # 推荐:Ed25519算法(更安全、高效) # 或 RSA 4096位:ssh-keygen -t rsa -b 4096 ```  密钥保存路径:默认 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥),直接回车使用默认路径。 密钥密码(passphrase):可选,设置后每次使用私钥需输入密码(双重保护,推荐设置),直接回车则无密码。 生成成功后,客户端 ~/.ssh/ 目录下会出现两个文件: - id_ed25519:私钥(**必须严格保密,不可泄露**)。 - id_ed25519.pub:公钥(可公开,需上传到服务器)。  > 2、将客户端生成的公钥上传至服务器的目标用户 需要使用哪个用户进行公私密钥登录就将公开密钥上传到哪个用户。 例如:需将客户端的公钥(id_ed25519.pub)添加到服务器上目标登录用户 test 的 ~/.ssh/authorized_keys 文件中 客户端的公开密钥: ```bash ┌──(root㉿kali)-[~/.ssh] └─# cat ./id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID9i2YxeJaKGNMqhuXR+jCv4q/2vp7RmYPDiKcIpvPIy root@kali ``` 目标服务端用户: ```bash root@ubuntu:/home/test# vim .ssh/authorized_keys root@ubuntu:/home/test# cat .ssh/authorized_keys ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID9i2YxeJaKGNMqhuXR+jCv4q/2vp7RmYPDiKcIpvPIy root@kali ``` > 3、服务器配置公钥认证(默认已启用,检查即可) 确保服务器的 sshd_config 中启用了公钥认证(正常情况下是默认启用,无需修改)。 确保以下参数没有被注释: ```bash PubkeyAuthentication yes # 启用公钥认证(关键) AuthorizedKeysFile .ssh/authorized_keys # 公钥存储路径(默认正确) PasswordAuthentication no # 可选:禁用密码认证(更安全,仅允许公钥登录) ``` 修改配置后重启服务。 ```bash systemctl restart ssh ``` > 4、使用私钥进行登录test用户 ```bash # 格式:ssh -i 客户端私钥路径 服务器用户名@服务器IP ssh -i ~/.ssh/id_ed25519 test@服务器IP # 例如:ssh -i ~/.ssh/id_ed25519 test@192.168.1.100 ``` 若私钥是默认路径(~/.ssh/id_ed25519 或 ~/.ssh/id_rsa),可省略 -i 参数: ```bash ssh test@服务器IP # 自动使用默认私钥 ```  > root账户进行公私密钥登录 ```bash # 推荐:禁止root密码登录,仅允许公钥登录(最安全) PermitRootLogin prohibit-password # 旧版本兼容写法:PermitRootLogin without-password ```  去掉注释,重启服务,再使用上述步骤,配置公私密钥即可。  或者直接使用已经生成的公开密钥,上传到服务器目标用户的authorized_keys文件中。 ```bash ┌──(root㉿kali)-[~/.ssh] └─# cat ./id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID9i2YxeJaKGNMqhuXR+jCv4q/2vp7RmYPDiKcIpvPIy root@kali ``` ```bash root@ubuntu:/home/test# systemctl restart ssh root@ubuntu:/home/test# vim ~/.ssh/authorized_keys root@ubuntu:/home/test# cat ~/.ssh/authorized_keys ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID9i2YxeJaKGNMqhuXR+jCv4q/2vp7RmYPDiKcIpvPIy root@kali ```  ## 常用参数 > 连接与登录控制(基础参数) | 参数 | 作用说明 | 示例 | | --------- | ------------------------------------------------------- | --------------------------------------------- | | -p <端口> | 指定连接服务器的 SSH 端口(默认 22) | ssh -p 2222 user@192.168.1.100 | | -l <用户> | 指定登录服务器的用户名(等价于 user@host 格式) | ssh -l alice 192.168.1.100 | | -t | 强制分配伪终端(用于在远程执行需要交互的命令,如 sudo) | ssh -t user@host 'sudo systemctl status sshd' | | -v | 显示详细连接日志(调试用,-vv 更详细,-vvv 最详细) | ssh -v user@host | > 认证与密钥相关 | 参数 | 作用说明 | 示例 | | ---------------------------- | ------------------------------------------------------ | ------------------------------------------ | | -i <密钥文件> | 指定用于认证的私钥文件路径(默认自动尝试 ~/.ssh/id_*) | ssh -i ~/.ssh/my_key user@host | | -o PubkeyAuthentication=no | 强制禁用公钥认证(仅用密码登录,需服务器允许密码认证) | ssh -o PubkeyAuthentication=no user@host | | -o PasswordAuthentication=no | 强制禁用密码认证(仅用公钥登录,需提前配置公钥) | ssh -o PasswordAuthentication=no user@host | > 转发功能 | 参数 | 作用说明 | 示例 | | -------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | -L \<本地端口:目标主机:目标端口> | 本地端口转发(将本地端口流量转发到远程目标,如访问远程内网服务) | ssh -L 8080:192.168.2.100:80 user@host(本地 8080 → 远程内网 192.168.2.100:80) | | -R \<远程端口:目标主机:目标端口> | 远程端口转发(将远程端口流量转发到本地目标,如暴露本地服务给远程) | ssh -R 9000:localhost:9000 user@host(远程 9000 → 本地 9000) | | -D <本地端口> | 动态端口转发(创建 SOCKS 代理,本地程序通过该端口访问远程网络,如科学上网) | ssh -D 1080 user@host(本地 1080 端口作为 SOCKS 代理) | | -X | 启用 X11 图形转发(远程 GUI 程序显示到本地,需服务器允许 X11Forwarding yes) | ssh -X user@host(然后在远程运行 gedit 等 GUI 程序) | | -Y | 启用 “受信任 X11 转发”(权限更高,适合需要本地资源访问的 GUI 程序) | ssh -Y user@host | > 跳板机与多跳连接 | 参数 | 作用说明 | 示例 | | ----------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | -J <跳板机> | 通过跳板机连接目标服务器(简化多跳登录,格式:user@跳板机IP:端口) | ssh -J jump@10.0.0.1 user@192.168.1.100(先连跳板机 10.0.0.1,再连目标) | > 连接行为调整 | 参数 | 作用说明 | 示例 | | ----------------------------- | ------------------------------------------------------------ | --------------------------------------- | | -C | 启用压缩传输(适合网络带宽低的场景,会增加 CPU 消耗) | ssh -C user@host | | -o ConnectTimeout=<秒> | 设置连接超时时间(避免长时间等待无响应的服务器) | ssh -o ConnectTimeout=10 user@host | | -o ServerAliveInterval=<秒> | 客户端向服务器发送心跳的间隔(检测连接是否存活,默认 0 不发送) | ssh -o ServerAliveInterval=30 user@host | | -o ServerAliveCountMax=<次数> | 心跳无响应的最大次数(超过则断开连接,默认 3) | ssh -o ServerAliveCountMax=2 user@host |
毛林
2025年10月22日 12:27
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码