SSH 安全连接

I. 环境准备

📌 环境说明:
本实践基于 AlmaLinux 8.x , 适用 AlmaLinux 9.x , OS 版本查看:cat /etc/redhat-release

1.1 更改 SELinux 模式

⚠️ 警告:
禁用 SELinux 会降低您的系统安全性。如果您的场景需要在生产环境中执行调试,请临时使用 permissive 模式,而不是永久禁用 SELinux。如需有关 permissive 模式的更多信息,请参考 更改 SELinux 状态和模式⭐

1、在您选择的文本编辑器中打开 /etc/selinux/config 文件,例如:

1
vi /etc/selinux/config

2、配置 SELINUX=permissive 选项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted

3、重启系统

1
reboot

4、验证

1
getenforce

1.2 启用防火墙

1、查看防火墙状态

1
firewall-cmd --state

2、如果未启用,使用以下命令启动 Firewalld:

1
systemctl enable firewalld --now

更多用法参考: Firewalld 快速配置⭐

1.3 配置服务器静态 IP

📌 操作说明:
Red Hat Enterprise Linux 为管理员提供不同的选项来配置以太网连接。本实践在命令行中使用 nmcli 配置连接。

📢 前提条件:
服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。

1、列出 NetworkManager 连接配置文件:

1
nmcli connection show

2、配置 IPv4 设置(将 ens160 替换为当前系统配置文件名称):

  • 要设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器,请输入:
1
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.2.101/24 ipv4.gateway 192.0.2.254 ipv4.dns "114.114.114.114, 223.5.5.5"
  • 要使用 DHCP,请输入:
1
nmcli connection modify ens160 ipv4.method auto

3、激活配置文件:

1
nmcli connection up ens160

或重启网络服务

1
2
nmcli networking off
nmcli networking on

💡 配置文件存储位置:

  • 在 AlmaLinux 8.x 中,网络配置的存储位置在:
    /etc/sysconfig/network-scripts/
  • 在 AlmaLinux 9.x 中,密钥文件的新默认存储位置在:
    /etc/NetworkManager/system-connections

1.4 验证配置

1、显示 NIC 的 IP 设置:

1
ip address show ens160

💡 专业提示:

  • 使用 -c 选项以获得更易读的彩色输出:ip -c a
  • ip 命令允许缩写,因此 ip aip addrip address 是等效的。

2、显示 IPv4 默认网关:

1
ip route show default

3、显示 DNS 设置:

1
cat /etc/resolv.conf

4、查看网络服务状态

1
systemctl status NetworkManager

1.5 禁用 IPv6 (可选)

1、(可选)显示网络连接列表:

1
nmcli connection show

2、将连接的 ipv6.method 参数设为 disabled

1
nmcli connection modify ens160 ipv6.method "disabled"

3、重启网络连接:

1
nmcli connection up ens160

4、显示设备的 IP 设置:

1
ip address show ens160

如果没有显示 inet6 条目,则 IPv6 在该设备上被禁用。

5、验证 /proc/sys/net/ipv6/conf/ens160/disable_ipv6 文件现在是否包含值 1

1
cat /proc/sys/net/ipv6/conf/ens160/disable_ipv6

1 表示针对该设备禁用 IPv6。

1.6 nmcli 扩展

1、如果要创建额外的连接配置文件,请输入:

1
nmcli connection add con-name <connection-name> ifname <device-name> type ethernet

2、可选:重命名连接配置文件:

1
nmcli connection modify "ens160" connection.id "Internal-LAN"

3、显示连接配置文件的当前设置:

1
nmcli connection show Internal-LAN

4、配置 IPv6 设置:

  • 要使用无状态地址自动配置(SLAAC),请输入:
1
nmcli connection modify Internal-LAN ipv6.method auto
  • 要设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:
1
nmcli connection modify Internal-LAN ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com

5、要在配置文件中自定义其他设置,请使用以下命令:

1
nmcli connection modify <connection-name> <setting> <value>

将值用空格或分号括在引号中。

II. SSH 连接

2.1 备份 SSH 配置

❗ 建议:
为避免因错误修改默认配置导致无法还原,建议一开始就对原始配置文件进行备份。

1
2
cd /etc/ssh/
cp -avx sshd_config sshd_config.bak

📌 参数说明:
cp -avx 会递归地复制目录结构,保留所有文件属性,并且仅限于同一文件系统内的文件。

  • -a (archive): 该选项是一个组合选项,等同于 -dR --preserve=all。具体来说,它会递归地复制目录,并保留符号链接、文件属性(如权限、时间戳、所有者等),并且会尽可能保留源文件的所有特性。
  • -v (verbose): 在复制过程中,cp 会显示正在复制的文件名。这有助于用户跟踪哪些文件正在被复制。
  • -x (one file system): 只复制与源文件系统在同一文件系统上的文件。它会阻止跨文件系统的复制,例如,如果你在根目录下执行这个命令,它不会复制挂载的其他文件系统的内容。

2.2 允许 root 密码登录

📢 注意:在 RHEL 9.x 中,默认情况下,root 用户通过 SSH 登录通常是禁用的。

1、编辑 SSH 配置文件:

1
vi sshd_config

💡 建议:
如果是 AlmaLinux 9.x 环境,建议自定义 SSH 配置文件,如:
vi /etc/ssh/sshd_config.d/custom-rules.conf

2、添加如下配置:

1
2
PermitRootLogin yes
PasswordAuthentication yes

3、检查配置文件是否有误

1
sshd -t

4、重启 SSH 服务:

1
systemctl restart sshd

2.3 SSH 工具连接

工具1: PuTTY
工具2: Xshell

III. 进阶配置(推荐)

3.1 修改 SSH 默认端口

1、打开 SSH 配置文件添加自定义端口

⚠️ 重要提醒:
在未完全测通自定义端口前,请不要关闭默认 22 端口,以防丢失与服务器的连接。

1
2
Port 22
Port 2202

重启 SSH 服务以应用更改:

1
systemctl restart sshd

2、防火墙放通端口:

💡Tips:
默认情况下,firewalld 使用的默认区域是 public。可以使用 firewall-cmd --get-default-zone 命令查看默认区域。

1
firewall-cmd --permanent --add-port=2202/tcp

列出已允许的服务和端口:

1
firewall-cmd --permanent --list-all

💡Tips:
要查看 public 区域的开放端口,可以运行:firewall-cmd --zone=public --list-ports

更新防火墙规则:

1
firewall-cmd --reload

3、在 SSH 工具中配置新端口测试连接。

❌ 连接失败?
如果使用的是云服务器,可能还需要在云控制台“安全组”中放通端口。

4、新端口测试连接成功后,编辑 SSH 配置文件,删除 22 端口并重启 SSH 服务。

5、再次使用新端口测试连接,确保配置成功。

3.2 使用 SSH 密钥登录

1、制作 SSH 密钥对:

1
ssh-keygen -t ed25519 -f ./your_host_name_ed25519 -C "your_email@example.com"

📌 参数说明:
-o:(小写)使用新的 OpenSSH 格式(而不是 PEM 格式)保存私钥。实际上,当您将密钥类型指定为 ed25519 时,就隐含了此选项;
-a:保存私钥时,该选项指定了所使用的 KDF(密钥生成函数,目前为 bcrypt_pbkdf(3))轮数。 轮数越多,口令验证速度越慢,密码被盗时的暴力破解能力越强。 默认值为 16 轮。
-t:指定要创建的密钥类型。 可能的值有 ecdsaecdsa-sked25519ed25519-skrsa
-C:用于指定注释的选项。它是纯粹的信息,可以是任何东西。但它通常填充<login>@<hostname>谁生成了密钥;
-f:指定生成的密钥文件的文件名。如果您希望 SSH 代理自动发现它,则必须将它存储在主目录中的默认 .ssh 目录中;
-i:读取未加密的 ssh-v2 兼容的私钥/公钥文件,然后在标准输出设备上显示 openssh 兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;

输出示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[root@host ~]# ssh-keygen -t ed25519 -f host_ed25519 -C "user@example.com"
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):           <== 输入口令(无口令为空)
Enter same passphrase again:                          <== 再输入一遍口令
Your identification has been saved in host_ed25519.   <== 私钥
Your public key has been saved in host_ed25519.pub.   <== 公钥
The key fingerprint is:
SHA256:piEO2PzHsfN22mt52TZx/XpKG8vCsUHkJhvesG2EDKI user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|      . .   .    |
|     . . o +     |
| +  E     * =    |
|. + . o S. %    .|
|   + o *  + * . o|
|    o *    + *oo.|
|     . o..+ *o++o|
|       .o+oo o*= |
+----[SHA256]-----+

2、将生成的公钥添加到本地服务器,请使用以下命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 切换到当前用户目录
cd ~
# 创建 ssh 隐藏目录
mkdir .ssh
# 把公钥复制到 ssh 隐藏目录
cp host_ed25519.pub .ssh/
#修改 ssh 隐藏目录权限
chmod 700 .ssh/
# 切换到 ssh 隐藏目录
cd .ssh/
# 注册公钥
cat host_ed25519.pub >> authorized_keys
# 修改授权密钥文件权限
chmod 600 authorized_keys

📌 将公钥添加到远程服务器:
ssh-copy-id -i /path/to/host_ed25519.pub user@remote_host

3、编辑 SSH 配置文件以确保其允许基于密钥的认证(默认已开启):

1
2
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

重启 SSH 服务以应用更改:

1
systemctl restart sshd

4、在连接工具中导入前面生成的私钥,测试 SSH 连接。

📌 分析 SSH 成功的登录日志判断登录方式:
journalctl -u sshd | grep 'Accepted'

  • 通过 密码登录 的记录通常会包含类似以下内容:
    Accepted password for root from 192.168.31.101 port 53321 ssh2
  • 通过 密钥登录 的记录会显示:
    Accepted publickey for root from 192.168.31.101 port 54035 ssh2: ED25519 SHA256:...

3.3 禁用 root 及密码登录

1、确认连接工具可以使用 SSH 密钥正常登录服务器。

2、编辑 SSH 配置文件,禁用 root 及密码登录:

1
2
3
4
5
6
# 禁用 root SSH 远程登录
PermitRootLogin no
# 禁用密码登录
PasswordAuthentication no
# 禁用 DNS 反向解析
UseDNS no

3、检查配置文件错误

1
sshd -t

重启 SSH 服务以应用更改:

1
systemctl restart sshd

IV. 配置 SSH 客户端(可选)

如果你有多个 SSH 密钥或不同的配置需求,可以通过编辑本地的 ~/.ssh/config 文件来简化连接过程:

1
2
3
4
Host myserver
    HostName remote_host
    User username
    IdentityFile ~/.ssh/host_ed25519

之后,你可以简单地通过以下命令连接到服务器:

1
ssh myserver

V. 参考文档

  1. Red Hat Enterprise Linux 8 : 配置和管理网络

  2. Rocky Linux Documentaion: 网络配置