Linux下的SSH服务配置与安全使用指南

重要提示:本文只是我日常使用的参考,请你先在本地做好测试,以免修改后不能正常登录服务器。 尤其是密钥登录的情况,一定要先将公钥放到服务器对应目录中

SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络中安全地远程登录和执行命令。为了确保SSH服务的安全性,正确配置SSH服务器至关重要。本文将详细介绍常见的SSH配置参数及其含义,并提供安全使用SSH的最佳实践。

一、常见SSH配置参数解析

1. HostKey

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

含义:指定SSH服务器使用的私钥文件路径。SSH使用这些密钥来加密和解密通信。

推荐值:默认值即可,无需修改。

2. Port

Port 22

含义:指定SSH服务器监听的端口号。默认端口为22,但出于安全考虑,建议修改为其他端口。

推荐值:建议修改为非标准端口,例如2222。

3. SyslogFacility

SyslogFacility AUTHPRIV

含义:指定SSH日志记录的设施。AUTHPRIV表示将日志记录到authpriv设施中。

推荐值:默认值即可,无需修改。

4. PermitRootLogin

PermitRootLogin without-password

含义:控制是否允许root用户通过SSH登录。without-password表示只允许使用密钥登录,禁止密码登录。

推荐值:建议设置为without-passwordno,禁止root用户通过密码登录。

5. AuthorizedKeysFile

AuthorizedKeysFile .ssh/authorized_keys

含义:指定存储用户公钥的文件路径。

推荐值:默认值即可,无需修改。

6. PasswordAuthentication

PasswordAuthentication no

含义:控制是否允许通过密码进行身份验证。建议设置为no,以提高安全性。

推荐值:建议设置为no,禁用密码登录,使用密钥登录。

7. ChallengeResponseAuthentication

ChallengeResponseAuthentication no

含义:控制是否启用挑战-响应身份验证。建议设置为no

推荐值:建议设置为no,禁用挑战-响应身份验证。

8. GSSAPIAuthentication

GSSAPIAuthentication yes

含义:控制是否启用GSSAPI身份验证。

推荐值:建议设置为no,禁用GSSAPI身份验证。

9. GSSAPICleanupCredentials

GSSAPICleanupCredentials no

含义:控制是否在会话结束后清理GSSAPI凭据。

推荐值:默认值即可,无需修改。

10. UsePAM

UsePAM yes

含义:控制是否启用PAM(Pluggable Authentication Modules)身份验证。

推荐值:默认值即可,无需修改。

11. X11Forwarding

X11Forwarding yes

含义:控制是否启用X11转发功能。

推荐值:建议设置为no,禁用X11转发功能。

12. PrintMotd

PrintMotd no

含义:控制是否在用户登录时打印/etc/motd文件内容。

推荐值:建议设置为no,禁用打印motd文件内容。

13. UseDNS

UseDNS yes

含义:控制是否使用DNS解析客户端主机名。

推荐值:建议设置为no,禁用DNS解析。

14. AcceptEnv

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

含义:指定SSH服务器接受的环境变量。

推荐值:默认值即可,无需修改。

二、SSH安全配置最佳实践

1. 密码复杂度检查

/etc/security/pwquality.conf文件中设置密码复杂度要求:

minclass=3

含义:密码必须至少包含小写字母、大写字母、数字、特殊字符中的3类。

推荐值:建议设置为34,要求密码包含至少3类字符。

2. 密码修改最小间隔

/etc/login.defs文件中设置密码修改最小间隔:

PASS_MIN_DAYS 7

含义:用户密码至少每7天才能修改一次。

推荐值:建议设置为7,要求用户每7天才能修改一次密码。

3. 密码失效时间

/etc/login.defs文件中设置密码失效时间:

PASS_MAX_DAYS 90

含义:用户密码最长有效期为90天。

推荐值:建议设置为90,要求用户每90天更换一次密码。

4. SSH空闲超时时间

/etc/ssh/sshd_config文件中设置空闲超时时间:

ClientAliveInterval 600

含义:SSH会话空闲超过600秒(10分钟)后自动断开连接。

推荐值:建议设置为600,要求SSH会话空闲超过10分钟后自动断开。

5. 禁止空密码登录

/etc/ssh/sshd_config文件中禁止空密码登录:

PermitEmptyPasswords no

含义:禁止使用空密码登录。

推荐值:建议设置为no,禁止空密码登录。

6. SSH最大连接数

/etc/ssh/sshd_config文件中设置最大连接数:

MaxAuthTries 3

含义:每个SSH会话最多允许3次身份验证尝试。

推荐值:建议设置为3,限制每个会话最多3次身份验证尝试。

7. 密码长度检查

/etc/security/pwquality.conf文件中设置密码最小长度:

minlen=9

含义:密码长度至少为9位。

推荐值:建议设置为9,要求密码长度至少为9位。

8. 密码过期提前警告天数

/etc/login.defs文件中设置密码过期提前警告天数:

PASS_WARN_AGE 7

含义:密码过期前7天开始警告用户。

推荐值:建议设置为7,要求在密码过期前7天开始警告用户。

三、注意事项

1. 密钥登录与密码登录的选择

  • 密钥登录:建议使用密钥登录,因为密钥登录比密码登录更安全。配置PasswordAuthentication noPermitRootLogin without-password可以禁用密码登录,只允许密钥登录。
  • 密码登录:如果必须使用密码登录,请确保密码复杂度高,并定期更换密码。

2. 配置文件修改后的操作

  • 修改/etc/ssh/sshd_config文件后,务必执行以下命令重启SSH服务以使配置生效:

    sudo systemctl restart sshd

3. 测试配置

  • 在应用新的SSH配置之前,建议先在测试环境中进行测试,确保配置正确且不会导致无法登录系统。

限制指定用户和IP地址登录SSH的方法

方法一:使用 sshd_config 配置文件

  1. 编辑 sshd_config 文件

    sudo nano /etc/ssh/sshd_config
  2. 限制用户登录
    在文件中添加或修改以下行,指定允许登录的用户:

    AllowUsers user1 user2

    这将只允许 user1user2 登录。

  3. 限制IP地址登录
    在文件中添加或修改以下行,指定允许登录的IP地址:

    AllowUsers user1@192.168.1.100 user2@192.168.1.101

    这将只允许 user1192.168.1.100 登录,user2192.168.1.101 登录。

  4. 重启SSH服务

    sudo systemctl restart sshd

方法二:使用 hosts.allowhosts.deny 文件

  1. 编辑 hosts.allow 文件

    sudo nano /etc/hosts.allow
  2. 添加允许的IP和用户
    在文件中添加以下行:

    sshd: 192.168.1.100: ALLOW
    sshd: 192.168.1.101: ALLOW

    这将允许 192.168.1.100192.168.1.101 登录。

  3. 编辑 hosts.deny 文件

    sudo nano /etc/hosts.deny
  4. 添加拒绝所有IP的规则
    在文件中添加以下行:

    sshd: ALL

    这将拒绝所有IP地址登录,但 hosts.allow 中的规则会覆盖此规则。

  5. 重启SSH服务

    sudo systemctl restart sshd

方法三:使用防火墙(如 iptablesfirewalld

  1. 使用 iptables 限制IP地址

    sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 22 -j DROP

    这将允许 192.168.1.100 登录,并拒绝其他所有IP地址。

  2. 使用 firewalld 限制IP地址

    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
    sudo firewall-cmd --reload

    这将允许 192.168.1.100 登录,并拒绝其他所有IP地址。


ssh-keygen是一个用于生成、管理和转换 SSH 密钥的工具

基本使用

ssh-keygen -t type -b bits -C comment
  • -t type: 指定密钥类型。常见的类型有 rsa, dsa, ecdsa, ed25519 等。

    • rsa: 最常用的密钥类型,支持多种密钥长度(如 2048 或 4096 位)。
    • ed25519: 较新的密钥类型,提供更高的安全性和更短的密钥长度。
    • ecdsa: 基于椭圆曲线加密的密钥类型。
  • -b bits: 指定密钥的位数。例如,-b 4096 表示生成一个 4096 位的 RSA 密钥。
  • -C comment: 为密钥添加注释。通常用于标识密钥的用途或所有者,例如 -C "user@example.com"

生成不同类型的 SSH 密钥

1. 生成 Ed25519 密钥

Ed25519 是目前推荐的 SSH 密钥类型,具有较高的安全性和性能。

ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/custom_ed_key
  • -t ed25519:指定生成 Ed25519 类型密钥
  • -C :添加注释(通常为电子邮件或标识符)
  • -f :指定密钥的名字

多个不同的认证密钥的时候,如果设置快捷登录,就需要设置不同的密钥名

Host example.com
    HostName example.com
    User your_username
    IdentityFile ~/.ssh/custom_ed_key

Host anotherhost.com
    HostName anotherhost.com
    User another_username
    IdentityFile ~/.ssh/custom_rsa_key

2. 生成 RSA 密钥

RSA 是传统且广泛支持的 SSH 密钥类型,适用于各种系统和服务。现代推荐密钥长度为 2048 位或更长。

ssh-keygen -t rsa -b 2048 -C "your_email@example.com" -f ~/.ssh/custom_rsa_key
  • -t rsa:指定生成 RSA 类型密钥
  • -b 2048:指定密钥长度为 2048 位
  • -C :添加注释
  • -f :指定密钥的名字

注意:你可以选择更高的密钥长度(如 4096 位)以增加安全性:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/custom_rsa_key

3. 生成 ECDSA 密钥

ECDSA(Elliptic Curve Digital Signature Algorithm)基于椭圆曲线密码学,较小的密钥长度可以提供与 RSA 类似的安全性。

ssh-keygen -t ecdsa -b 256 -C "your_email@example.com" -f ~/.ssh/custom_ecdsa_key
  • -t ecdsa:指定生成 ECDSA 类型密钥
  • -b 256:指定密钥长度(可以是 256、384 或 521)
  • -C :添加注释
  • -f :指定密钥的名字

标签: Linux, 安全

相关文章

macOS下使用UTM安装Alpine Linux虚拟机

在macOS下使用UTM(Universal Turing Machine)安装Alpine Linux虚拟机是一个相对简单的过程,但需要一些基本的配置和步骤。以下是详细的指南,涵盖了从安装UT...

Linux下swap分区的使用及配置

在Linux系统中,Swap分区用于在物理内存(RAM)不足时,将部分内存数据转移到硬盘上,以释放内存空间。Swap分区对于系统的稳定运行至关重要,尤其是在内存资源有限的情况下。本文将详细介绍如...

如何实现让我们部署的Go应用在进程挂掉之后自动重启

在软件开发和部署过程中,确保应用的高可用性是至关重要的。对于使用Go语言开发的应用来说,实现在进程异常终止后自动重启是提高服务稳定性的有效策略之一。下面将围绕如何实现Go应用在挂掉之后自动重启进...

linux下时区设置问题 遵循IANA标准

在Linux下设置时区遵循IANA标准,可以通过以下步骤进行:查看当前系统时区:timedatectl列出所有可用的时区:timedatectl list-timezones选择一个合适的时区,...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件