新服务器如何更改ssh配置文件,保证安全

确保在配置之前已经配置好了防火墙!!!开启了新的ssh端口!

一、SSH配置文件设置

1. SSH配置文件的位置和备份

  • 位置: SSH服务器的配置文件通常位于 /etc/ssh/sshd_config
  • 备份: 在进行任何更改之前,务必备份原始配置文件。这可以在出现问题时轻松恢复到默认设置:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

2. 修改SSH配置文件的关键选项

使用你喜欢的文本编辑器(如 nanovimgedit)以管理员权限打开 /etc/ssh/sshd_config 文件:

sudo nano /etc/ssh/sshd_config

以下是一些需要重点关注和修改的配置选项:

  • Port(端口)
    • 默认值: 22
    • 建议: 更改为非标准端口(例如,1024-65535之间的端口)。这可以减少自动化的SSH扫描和暴力破解尝试。
    • 配置示例:
Port 2222
  • ListenAddress(监听地址)
    • 默认值: 通常监听所有接口(0.0.0.0::
    • 建议: 如果你的服务器有多个IP地址,并且你只想让SSH在特定IP上监听,可以指定该IP地址。这有助于限制SSH服务的暴露范围。
    • 配置示例:
ListenAddress 192.168.1.100  # 只监听特定IP
  • PermitRootLogin(允许root登录)
    • 默认值: 可能是 yes
    • 建议: 强烈建议设置为 no。禁止root用户直接通过SSH登录。你应该创建一个普通用户,通过 sudo 来执行需要管理员权限的操作。
    • 配置示例:
PermitRootLogin no
  • PasswordAuthentication(密码认证)
    • 默认值: 可能是 yes
    • 建议: 强烈建议设置为 no。禁用密码认证,转而使用更安全的密钥认证方式。
    • 配置示例:
PasswordAuthentication no
  • PubkeyAuthentication(公钥认证)
    • 默认值: 通常是 yes
    • 建议: 确保启用公钥认证(如果已禁用密码认证,则必须启用)。
    • 配置示例:
PubkeyAuthentication yes
  • AuthorizedKeysFile(授权密钥文件)
    • 默认值: .ssh/authorized_keys
    • 建议: 通常不需要修改。它指定了存储允许登录的公钥的文件路径(每个用户的主目录下)。
    • 配置示例:
AuthorizedKeysFile .ssh/authorized_keys
  • AllowUsers / AllowGroups (允许的用户/组)
  • 默认值: 通常未设置,表示允许所有用户。
  • 建议: 设置白名单,只允许特定用户或组通过SSH登录。
  • 配置示例:
    AllowUsers user1 user2 # 只允许user1和user2登录 AllowGroups sshusers # 只允许sshusers组中的用户登录
  • 注意: 请将 user1user2sshusers 替换为实际的用户名和组名。
  • ClientAliveInterval / ClientAliveCountMax(客户端保持连接)
    • 默认值: 通常未设置。
    • 建议: 设置这些选项可以帮助检测并关闭空闲的SSH连接,防止资源浪费和潜在的安全风险。
    • 配置示例:
ClientAliveInterval 60    # 每60秒发送一次保持连接消息
ClientAliveCountMax 3     # 如果连续3次未收到响应,则断开连接
  • MaxAuthTries(最大认证尝试次数)
    • 默认值: 通常是 6
    • 建议: 减少此值(例如,设置为 34)以降低暴力破解成功的可能性。
    • 配置示例:
MaxAuthTries 3
  • MaxSessions(最大会话数)
    • 默认值: 通常是10
    • 建议 根据服务器的负载能力和预期连接数调整,过高的数值容易导致服务器崩溃
    • 配置示例
  MaxSessions 5
  • LoginGraceTime(登录宽限时间)
    • 默认值: 通常是 2m (两分钟)
    • 建议: 缩短此时间(例如,设置为 30s1m)以减少恶意用户尝试登录的时间窗口。
    • 配置示例:
LoginGraceTime 30s
  • UsePAM(使用PAM)
    • 默认值: yes
    • 建议: 通常情况下保留默认值 yes。PAM(Pluggable Authentication Modules)是Linux系统中用于用户身份验证的框架,提供了一种灵活的方式来管理身份验证策略。
    • 配置示例:
UsePAM yes

如果你禁用了密码登录并且启用了UsePAM,请确保ChallengeResponseAuthentication为no

ChallengeResponseAuthentication no
  • X11Forwarding (X11 转发)
    • 默认值: no
    • 建议: 除非你确实需要通过SSH隧道传输X11图形应用程序,否则保持禁用状态。
    • 配置示例:
X11Forwarding no
  • Banner (登录横幅)
    • 默认值: 通常未设置。
    • 建议: 可以设置一个包含安全警告或法律声明的文本文件,在用户登录前显示。
    • 配置示例:
Banner /etc/ssh/banner.txt

然后,创建/etc/ssh/banner.txt文件并添加你希望显示的文本。

3. 保存更改并重启SSH服务

完成配置文件的修改后:

  1. 保存文件:nano 编辑器中,按 Ctrl + O 保存,然后按 Enter 确认文件名,最后按 Ctrl + X 退出。
  2. 重启SSH服务: 使更改生效。根据你的Linux发行版,使用以下命令之一:
sudo systemctl restart sshd   # 对于使用systemd的系统(如Ubuntu 16.04+、Debian 8+、CentOS 7+)
sudo service ssh restart     # 对于使用SysVinit的系统(如较旧的Ubuntu/Debian版本)
sudo /etc/init.d/ssh restart  # 另一种SysVinit系统的方式

4. 测试新的SSH配置

在完全退出当前SSH会话之前,务必在新终端窗口中测试新的SSH配置:

  1. 尝试连接: 使用新的端口、用户名和密钥(如果已配置)尝试从另一台计算机或终端连接到服务器。
  2. 验证设置: 确保所有设置(如端口、root登录限制、密钥认证)都按预期工作。

5. 密钥认证的设置(如果已禁用密码认证)

如果你禁用了密码认证,必须设置密钥认证才能登录。以下是步骤:

  1. 生成密钥对(在客户端计算机上):
ssh-keygen -t rsa -b 4096  # 生成4096位RSA密钥对(更安全)

按照提示操作,可以选择设置密码(passphrase)来保护私钥。
2. 将公钥复制到服务器:

ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_server_ip -p 2222 #这里需要换成你配置的ssh端口

user 替换为你在服务器上的用户名,your_server_ip 替换为服务器的IP地址或域名。如果使用了非标准SSH端口,请通过-p指定
3. 测试密钥认证: 尝试使用SSH连接到服务器,你应该能够无需密码直接登录(如果设置了密钥密码,则需要输入密钥密码)。

二、ssh.socket设置

1. 理解 systemd 和 ssh.socket

  • systemd: systemd 是现代 Linux 发行版中广泛使用的初始化系统和服务管理器。它负责启动和管理系统服务,包括 SSH 服务。
  • ssh.socket 这是一个 systemd socket unit 文件。它定义了 SSH 服务应该监听的网络套接字(IP 地址和端口)。systemd 会根据 ssh.socket 的配置来监听连接,然后将传入的连接传递给 sshd 进程(由 sshd.service 管理)。
  • 优先级: ssh.socket 中的设置具有更高的优先级,会覆盖 sshd_config中的 Port 选项。

2. 检查和修改 ssh.socket (如果存在)

首先,你需要检查你的系统是否使用了 ssh.socket。通常,较新的 systemd 系统会默认使用它。

  1. 检查 ssh.socket 是否启用:
systemctl is-enabled ssh.socket
  • 如果输出 enabled,则表示 ssh.socket 正在使用。
  • 如果输出 disabledstatic,则表示 ssh.socket 未启用,SSH 服务直接由 sshd.service 管理,你只需修改 sshd_config
  • 如果输出 masked, 则ssh.socket被屏蔽,需要先unmask
sudo systemctl unmask ssh.socket
  1. 查看 ssh.socket 的配置:
systemctl cat ssh.socket

这将显示 ssh.socket 文件的内容。你可能会看到类似如下的配置:

[Unit]
Description=SSH Socket for Per-Connection Servers

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target

ListenStream=22 指定了 SSH 监听的端口。
3. 修改 ssh.socket (如果需要更改端口):

  • 不要直接编辑原始文件! systemd 推荐使用 override 文件来修改系统单元的配置。
  • 创建 override 文件:
sudo systemctl edit ssh.socket

这将打开一个编辑器(通常是 nanovim)。

  • 添加或修改配置: 在打开的文件中,添加或修改 [Socket] 部分的 ListenStream 选项。例如,要将端口更改为 2222:
[Socket]
ListenStream=2222

如果你要添加多个监听地址

[Socket]
ListenStream=2222
ListenStream=192.168.1.100:2222
  • 保存并关闭文件。
  1. 重新加载 systemd 配置并重启 SSH:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
sudo systemctl restart sshd.service  #可能需要重启sshd.service来使配置在sshd_config的配置生效

三、检查当前 SSH 服务器正在使用的端口

使用 netstatss 命令 (需要 root 或 sudo 权限)

sudo netstat -tulnp | grep sshd  # 较旧的系统可能使用 netstat
# 或者
sudo ss -tulnp | grep sshd       # 较新的系统推荐使用 ss

这两条命令都会列出所有正在监听的网络端口及其对应的进程。通过查找 sshd 进程,你可以看到它正在监听哪个端口。输出示例:

tcp        0      0 0.0.0.0:2222            0.0.0.0:*               LISTEN      1234/sshd
tcp6       0      0 :::2222                 :::*                    LISTEN      1234/sshd

在这个例子中,SSH 服务器正在监听 2222 端口。

1 Like