文章目录
SSH 协议与 OpenSSH 配置详解
1. SSH 协议概述
SSH (Secure Shell) 协议是一种用于远程管理的安全通道协议。它通过加密通信数据,确保在不安全的网络环境中,数据传输的机密性和完整性。
- SSH在正确使用时可弥补网络中的漏洞。
- 客户端包含SSH程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。
22 网络层 传输层 TCP 22
SSH客户端<-------------------------->SSH服务端
数据传输是加密的,可以防止信息泄露
数据传输是压缩的,可以提高传输速度
SSH 的组成
-
传输层协议 [SSH-TRANS]
提供服务器认证、保密性及完整性,并且有时还提供压缩功能。SSH-TRANS 通常运行在 TCP/IP 连接上,但也可以用于其他可靠的数据流。该协议提供强力的加密技术、密码主机认证及完整性保护。认证基于主机,但不执行用户认证。更高层的用户认证协议可在此基础上设计。
-
用户认证协议 [SSH-USERAUTH]
用于向服务器提供客户端用户的鉴别功能,运行在传输层协议 SSH-TRANS 之上。当 SSH-USERAUTH 开始后,它从低层协议接收会话标识符(从第一次密钥交换中的交换哈希 H)。会话标识符唯一标识此会话,并适用于标记以证明私钥的所有权。SSH-USERAUTH 还需了解低层协议是否提供保密性保护。
-
连接协议 [SSH-CONNECT]
将多个加密隧道分成逻辑通道,运行在用户认证协议之上。它提供交互式登录会话、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。
监听
- 监听是指在特定的网络地址和端口上等待并接受来自其他主机的数据流的过程,通常用于实现网络服务,如 Web 服务器、FTP 服务器等。例如:“listen-on port 53 { 192.168.10.10; };” 。通俗讲,就是由进程等待在网卡中的端口。
- 当服务器进程启动时,需要监听一个或多个端口,以等待客户端的请求。客户端向服务器发送请求时,服务器进程接收到请求后,会创建一个新的套接字来处理该请求,从而与客户端进行交互。因此,监听是建立服务与客户端之间连接的关键步骤之一。
2. OpenSSH 概述
OpenSSH 是基于 SSH 协议的开源实现,用于在 UNIX/Linux 系统中提供安全的远程登录和其他安全网络服务。
CentOS 7系统默认已安装OpenSSH相关软件包,并已将 sshd服务添加为开机自启动。
- 服务名称:
sshd
(SSH 服务守护进程) - 服务端主程序:
/usr/sbin/sshd
- 客户端配置文件:
/etc/ssh/ssh_config
- 服务端配置文件:
/etc/ssh/sshd_config
- 密钥对文件:
ssh_host_ecdsa_key # 私钥
ssh_host_ecdsa_key.pub # 公钥 .pub结尾
ssh_host_ed25519_key
ssh_host_ed25519_key.pub
ssh_host_rsa_key
ssh_host_rsa_key.pub
3. 配置SSH(sshd_config文件)
3.1 配置服务监听选项
在配置 SSH 服务时,可以设置监听端口、协议版本、以及监听的 IP 地址,同时禁用反向 DNS 解析。
配置示例
使用文本编辑器编辑 SSH 服务端配置文件:
vim /etc/ssh/sshd_config
# 设置 SSH 监听的端口号,默认端口为 22
Port 22
# 设置 SSH 监听的 IP 地址(可多地址监听)
ListenAddress 172.16.16.22
# 再如:监听地址为任意网段,允许所有网络接口接入。
# ListenAddress 0.0.0.0
# 使用 SSH 协议版本 2(推荐使用)
Protocol 2
# 禁用反向 DNS 解析以提高连接速度
UseDNS no
3.2 配置用户登录控制(黑白名单)
SSH 提供了丰富的用户登录控制选项,可以通过配置文件进行设置,包括禁用 root 用户登录、限制空密码用户登录、设置登录验证时间、控制重试次数等。
配置示例
# 编辑 SSH 服务配置文件
vi /etc/ssh/sshd_config
# 设置登录验证的等待时间(默认2分钟)
LoginGraceTime 2m
# 禁止 root 用户通过 SSH 登录
PermitRootLogin no
# 设置最大认证尝试次数
MaxAuthTries 6
# 禁止空密码用户登录
PermitEmptyPasswords no
# 允许用户列表(可以指定特定用户和IP)
AllowUsers jerry admin@61.23.24.25
注意事项
- AllowUsers 和 DenyUsers:这两个指令不能同时使用。
AllowUsers
用于指定允许访问的用户,而DenyUsers
用于指定禁止访问的用户。
3.3 配置登录验证方式(密钥对验证)
SSH 支持多种登录验证方式,主要包括密码验证和密钥对验证。(具体定义和密钥对创建在下一节讲解)
启用密钥对验证
- 密钥对:由私钥和公钥组成。客户端持有私钥,服务端保存公钥。通过密钥对的匹配来验证用户身份。
配置示例
# 编辑 SSH 服务配置文件
vi /etc/ssh/sshd_config
# 启用密码验证
PasswordAuthentication yes
# 启用公钥验证
PubkeyAuthentication yes
# 指定存放公钥的文件路径
AuthorizedKeysFile .ssh/authorized_keys
开启后需要创建密钥对,在下一节讲解。
3.4 常用的配置项及说明
配置示例
# 设置 OpenSSH 服务器监听的端口号,默认是 22
Port 22
# 设置监听的 IP 地址,0.0.0.0 表示监听所有可用的网络接口
ListenAddress 0.0.0.0
# 登录验证的超时时间为 2 分钟
LoginGraceTime 2m
# 禁止 root 用户通过 SSH 登录,yes 允许
PermitRootLogin no
# 设置最大认证重试次数为 6 次
MaxAuthTries 6
# 禁止使用空密码的用户登录
PermitEmptyPasswords no
# 禁用 DNS 反向解析,以提高服务器的响应速度
UseDNS no
# 仅允许指定用户通过 SSH 登录,
# wangwu 仅允许从 IP 地址 61.23.24.25 登录
AllowUsers zhangsan lisi wangwu@61.23.24.25
# 禁止指定用户通过 SSH 登录(不可对一用户同时使用允许和禁止)
DenyUsers zhangsan
作用
- Port: 默认 SSH 端口是 22。可以更改此端口以增加安全性,避免被自动化攻击脚本扫描到。
- ListenAddress:
0.0.0.0
表示监听所有网络接口。如果服务器有多个 IP 地址,可以指定监听的 IP,以限制访问来源。 - LoginGraceTime: 这是 SSH 登录验证的超时时间。如果在指定时间内未成功登录,连接会被断开。
- PermitRootLogin: 出于安全考虑,通常禁止 root 用户通过 SSH 直接登录,建议通过普通用户登录后使用
sudo
获取管理员权限。 - MaxAuthTries: 设置最大重试次数后,如果超过此次数,连接会被断开。这有助于防止暴力破解攻击。
- PermitEmptyPasswords: 禁止空密码登录是非常重要的安全措施,确保所有用户都有设置密码。
- UseDNS: 禁用 DNS 反向解析可以加快服务器的响应速度,特别是在 DNS 配置不佳或解析速度较慢的情况下。节省优化资源,也进一步确保安全。
- AllowUsers: 此项用于限制只有特定用户可以登录 SSH,可以进一步通过 IP 限制来增加安全性。
- DenyUsers: 此项用于明确禁止某些用户登录 SSH,但注意不要与
AllowUsers
同时使用,以避免配置冲突。
修改后需重启服务:
sudo systemctl restart sshd
4. 使用 SSH 客户端程序
4.1 SSH 远程登录
SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络上安全地访问远程计算机。使用 ssh
命令可以通过网络登录远程服务器。
格式
ssh [选项] zhangsan@192.168.80.10
- 首次登录: 用户第一次登录SSH服务器时,必须接受服务器发来的ECDSA密钥(根据提示输入“yes”)。接收的密钥信息将保存到
~/.ssh/known_hosts
文件中。密码验证成功后,即可登录到目标服务器的命令行环境中。
选项说明
- -p:指定非默认的端口号。如果不使用此选项,则默认使用端口22。
示例
ssh -p 2345 zhangsan@192.168.80.10
注意
- 此处IP地址也可以是/etc/hosts文件中定义的别名。
- 别名可以是主机名,可以是域名,且可以有多个,但不能写重,如server2同时对应2个IP地址。
- 若是域名如(www.cat.com),除非是虚拟主机的域名,否则一个域名只能对应一个IP。
4.2 SCP 远程复制
SCP(Secure Copy Protocol)用于在本地和远程主机之间安全地复制文件。
选项
- -r:递归复制,同cp命令。
- -P:(大P)指定端口号。
示例
-
下行复制: 将远程主机中的文件复制到本地。
scp root@192.168.80.11:/etc/passwd /root/passwd10.txt # 将远程主机中的 /etc/passwd 文件复制到本机的 /root/passwd10.txt
-
上行复制: 将本地文件或目录复制到远程主机。
scp -r /etc/ssh/ root@192.168.80.10:/opt # 将本机的 /etc/ssh 目录复制到远程主机的 /opt 目录
4.3 SFTP (安全 FTP)
SFTP(Secure File Transfer Protocol)提供了类似FTP的文件传输服务,但由于使用了加密技术,安全性更高,但传输效率比普通的FTP稍低。
示例
sftp zhangsan@192.168.80.10
操作步骤:
- 连接: 连接到服务器后,系统提示输入密码。
- 列出文件: 使用
ls
列出远程目录的文件。 - 下载文件: 使用
get <文件名>
下载文件到本地。 - 上传文件: 使用
put <文件名>
上传文件到远程服务器。 - 退出: 使用
quit
退出SFTP会话。
示例
sftp> get example.txt
# 下载 example.txt 文件
sftp> put localfile.txt
# 上传 localfile.txt 文件
sftp> quit # 退出
5. 配置密钥对验证
密钥对验证比密码验证更加安全,尤其适用于频繁远程连接或需要提高安全性的场景。密钥对由公钥和私钥组成,公钥放在服务器上,私钥留在客户端。
-
密码验证
对服务器中本地系统用户的登录名称、密码进行验证。简便,但可能会被暴力破解。
-
密钥对验证
要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证。能增强安全性,且可以免交互登录。
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。可根据实际情况设置验证方式。 -
密钥
密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。
而ssh密钥就是一种非对称性的密钥(rsa)。
ssh远程访问控制中不仅仅可以使用用户密码登录,还可以通过密钥进行登录。
而密钥登录的产生是通过客户端与服务端进行一系列的操作过程产生的。 -
密钥登录的过程
- ssh客户端通过ssh-keygen生成自己的公钥和私钥,将公钥发送给ssh服务端,并且放在指定的位置。
- 公钥发送完毕后。ssh客户端再向ssh服务端进行登录请求。
- ssh服务端收到ssh客户端的登录请求后,ssh服务端用对应的公钥加密一些随机数返回给ssh客户端。
- ssh客户端收到加密的随机数后使用私钥对其进行解密,再将解密的结果发送给ssh服务端进行验证。
- ssh服务端接收到ssh客户端发送过来的解密数据,将其与原数据进行比对,保持一致则允许用户进行登录
5.1 在客户端创建密钥对
ssh-keygen是用于生成、管理和转换认证密钥的工具。使用ssh-keygen工具为当前用户创建密钥对文件。可用的加密算法为RSA、 ECDSA或DSA等。
使用 ssh-keygen
工具生成密钥对。
# 添加账号并注入密码,切换此账号登录
useradd admin
echo "123123" | passwd --stdin admin
su - admin
ssh-keygen -t ecdsa # 生成ECDSA算法的密钥对
# 或
ssh-keygen -t rsa # 生成RSA算法的密钥对
选项
- -t:指定密钥的算法类型,如 rsa、ecdsa(小写)等。
说明解释及流程
-
命令执行过程中,会交互提示三次(三次默认即回车):
-
输入私钥保存的路径。默认保存路径为
/home/用户名/.ssh/id_ecdsa
或 root 为/root/.ssh/id_rsa
,私钥密码可以为空,但建议设置。Enter file in which to save the key (/root/.ssh/id_rsa):
-
输入密钥短语。密钥短语可以为空(无密码),但为了安全,建议设置一个。如果输入密钥短语,系统会要求再次确认。
Enter passphrase (empty for no passphrase):
-
再次输入密钥短语。
Enter same passphrase again:
-
-
最后私钥和公钥生成成功,并提升密钥指纹和密钥随机艺术图像(便于识别)
Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:gbcKTDbF9zX+KXGNJTmZ3usqjevmR&/ZsvcT9dUkA/9 rootebind The key's randomart image is: +---[RSA 2048]----+
生成文件
id_ecdsa
或id_rsa
:私钥文件,权限默认为600。id_ecdsa.pub
或id_rsa.pub
:公钥文件,权限644。用于上传到服务器。
5.2 将公钥文件上传至服务器
可以使用 scp
或 ssh-copy-id
命令将公钥文件上传到服务器。
方法1:使用 ssh-copy-id
上传默认公钥并自动处理
将当前用户的默认公钥(通常是 ~/.ssh/id_rsa.pub
或 ~/.ssh/id_ecdsa.pub
)上传到远程服务器,并自动将其添加到远程服务器用户的 ~/.ssh/authorized_keys
文件中。即可实现免密登录。
ssh-copy-id root@192.168.80.10
# 将公钥直接上传并导入到服务器的指定用户目录
# 使用此命令后续不需再做
或
方法2:使用 scp
手动上传再处理
使用 scp
(安全复制协议)将本地的公钥文件 id_ecdsa.pub
上传到远程服务器的 /opt
目录中。
公钥文件只是被上传到远程服务器的指定目录,并没有自动导入到 authorized_keys
文件中。需要手动将公钥添加到~/.ssh/authorized_keys
中,以实现免密登录。
scp ~/.ssh/id_ecdsa.pub root@192.168.80.10:/opt # 上传公钥到服务器的 /opt 目录
或
方法3:使用 ssh-copy-id
指定公钥文件再上传
与第一个 ssh-copy-id
命令类似,但这个显式指定了要上传的公钥文件 ~/.ssh/id_ecdsa.pub
,而不是使用默认的公钥文件。
会自动处理公钥的添加过程,无需手动干预,实现免密登录。
ssh-copy-id -i ~/.ssh/id_ecdsa.pub zhangsan@192.168.80.10
# 将公钥直接上传并导入到服务器的指定用户目录
# 同样,使用此命令后续不需再做
双向实现免交互使用ssh工具
在另一端(客户端)同样创建密钥对并上传,可同时实现双向免交互登录。
5.3 在服务器中导入公钥文本
若使用 scp
命令(方法2)上传公钥,需手动导入公钥文件。
将公钥添加到用户的 ~/.ssh/authorized_keys
文件中。
useradd -d /home/zhangsan/ zhangsan
# 指定目录创建用户
mkdir /home/zhangsan/.ssh/
# 创建 .ssh 目录
cat /opt/id_ecdsa.pub >> /home/zhangsan/.ssh/authorized_keys
# 将公钥文件内容追加到 authorized_keys 文件中
检查
此时执行 ls /root/.ssh/
会看到多了一个authorized_keys文件(授权密钥,或者说是凭证),即为对端的认证公钥。
此时所有ssh工具(ssh、scp、sftp)都可免密码交互连接登录。
验证: 确保公钥已成功导入。
cat /home/zhangsan/.ssh/authorized_keys
5.4 在客户端使用密钥对验证
ssh zhangsan@192.168.80.10
说明: 如果私钥设置了密码,会提示输入私钥的密码。
5.5 设置SSH代理,实现免交互登录(不常用)
SSH代理功能可以让用户在会话期间缓存私钥密码,实现免交互登录,从而避免每次连接时输入密码。
为了在使用受密码保护的私钥时,免去每次使用私钥时输入密码的步骤,而不是免去登录的第一层密码验证。
可以使用 ssh-agent
来启动身份验证代理并加载 SSH 密钥。
启动 SSH 代理
使用以下命令启动一个新的 Bash shell,并在该 shell 中启动 SSH Agent:
ssh-agent bash
SSH Agent 是一个身份验证代理,用于管理和缓存 SSH 密钥。
添加 SSH 密钥到代理
使用 ssh-add
命令将你的私钥添加到 SSH 代理中:
ssh-add /path/to/your/private_key
如果使用的是默认位置(~/.ssh/id_rsa
),只需要运行:
ssh-add
提示输入私钥的密码(如果有设置)。
一旦密钥被加载到 SSH Agent 中,代理会在需要时自动提供该密钥进行身份验证。
验证配置
使用以下命令来查看当前加载的密钥:
ssh-add -l
显示所有已经添加到代理中的密钥的指纹。
实现免密码登录
使用 SSH 登录到远程服务器时,SSH 客户端会自动从 SSH Agent 中获取并使用私钥进行身份验证,无需手动输入密码:
ssh user@hostname
保持代理会话
- 临时会话:通过
ssh-agent bash
启动的代理会话只在当前 shell 会话中有效。关闭 shell 会话后,代理也会随之终止。 - 持久会话:为了在多个 shell 会话中共享同一个 SSH Agent,通常可以在启动时添加
eval $(ssh-agent)
到~/.bash_profile
或~/.bashrc
中。
退出 SSH 代理
若不再需要 SSH Agent,可以终止代理进程:
ssh-agent -k
5.6 更安全的密钥文件使用方式
多在企业级使用,将密钥文件放到本地,而不是直接配置在服务器上。
登录ssh直接使用命令 ssh -p -
指向本地目录下的密钥文件。