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-password
或no
,禁止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类。
推荐值:建议设置为3
或4
,要求密码包含至少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 no
和PermitRootLogin without-password
可以禁用密码登录,只允许密钥登录。 - 密码登录:如果必须使用密码登录,请确保密码复杂度高,并定期更换密码。
2. 配置文件修改后的操作
修改
/etc/ssh/sshd_config
文件后,务必执行以下命令重启SSH服务以使配置生效:sudo systemctl restart sshd
3. 测试配置
- 在应用新的SSH配置之前,建议先在测试环境中进行测试,确保配置正确且不会导致无法登录系统。
限制指定用户和IP地址登录SSH的方法
方法一:使用 sshd_config
配置文件
编辑
sshd_config
文件:sudo nano /etc/ssh/sshd_config
限制用户登录:
在文件中添加或修改以下行,指定允许登录的用户:AllowUsers user1 user2
这将只允许
user1
和user2
登录。限制IP地址登录:
在文件中添加或修改以下行,指定允许登录的IP地址:AllowUsers user1@192.168.1.100 user2@192.168.1.101
这将只允许
user1
从192.168.1.100
登录,user2
从192.168.1.101
登录。重启SSH服务:
sudo systemctl restart sshd
方法二:使用 hosts.allow
和 hosts.deny
文件
编辑
hosts.allow
文件:sudo nano /etc/hosts.allow
添加允许的IP和用户:
在文件中添加以下行:sshd: 192.168.1.100: ALLOW sshd: 192.168.1.101: ALLOW
这将允许
192.168.1.100
和192.168.1.101
登录。编辑
hosts.deny
文件:sudo nano /etc/hosts.deny
添加拒绝所有IP的规则:
在文件中添加以下行:sshd: ALL
这将拒绝所有IP地址登录,但
hosts.allow
中的规则会覆盖此规则。重启SSH服务:
sudo systemctl restart sshd
方法三:使用防火墙(如 iptables
或 firewalld
)
使用
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地址。使用
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
:指定密钥的名字
版权声明:本文为原创文章,版权归 全栈开发技术博客 所有。
本文链接:https://www.lvtao.net/system/linux-ssh.html
转载时须注明出处及本声明