SSH配置

2025-07-31 运维 ubuntu

默认配置/etc/ssh/sshd_config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# 包含额外的配置文件(例如 /etc/ssh/sshd_config.d/*.conf)
Include /etc/ssh/sshd_config.d/*.conf

# 指定监听地址族(any 表示 IPv4 和 IPv6)
AddressFamily any

# 是否允许 root 用户登录(建议使用 prohibit-password 或 no 提高安全性)
# yes 表示允许 root 用户使用密码、公钥等任意方式登录(不安全)
PermitRootLogin prohibit-password # 建议仅允许公钥登录

# 允许使用交互式键盘认证(通常用于 PAM),已关闭更安全
KbdInteractiveAuthentication no

# 是否启用 PAM(Pluggable Authentication Modules,可配合系统用户验证)
UsePAM yes

# 是否启用 X11 转发(用于图形界面程序,若无需求可关闭)
X11Forwarding yes

# 登录后是否显示 /etc/motd 文件内容(登录提示)
PrintMotd no

# 是否使用 DNS 反查客户端主机名(关闭可加快登录速度)
UseDNS no

# 接收客户端的本地语言环境变量(常用于国际化)
AcceptEnv LANG LC_*

# SFTP 子系统配置(指定 sftp-server 路径)
Subsystem sftp /usr/lib/openssh/sftp-server

# 启用密码认证(若使用公钥验证可关闭以提升安全)
PasswordAuthentication yes

# 禁止空密码账户登录
PermitEmptyPasswords no

# 可选优化项(默认未启用,如需使用请取消注释):

# 指定监听端口(默认 22)
#Port 22

# 指定监听地址(可指定某个 IP)
#ListenAddress 0.0.0.0
#ListenAddress ::

# 主机密钥文件路径
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# 设置重新协商加密密钥的限制
#RekeyLimit default none

# 设置日志等级
#SyslogFacility AUTH
#LogLevel INFO

# 登录超时时间(默认 2 分钟)
#LoginGraceTime 2m

# 是否启用权限严格检查
#StrictModes yes

# 最大认证尝试次数
#MaxAuthTries 6

# 最大并发会话数
#MaxSessions 10

# 是否启用公钥认证(默认是开启的)
#PubkeyAuthentication yes

# 指定 authorized_keys 文件路径
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

# 主机认证相关配置(一般用不到)
#HostbasedAuthentication no
#IgnoreUserKnownHosts no
#IgnoreRhosts yes

# 是否启用 Kerberos/GSSAPI 等高级认证(默认关闭)
#KerberosAuthentication no
#GSSAPIAuthentication no

# 是否允许客户端进行代理转发(用于 ssh -A)
#AllowAgentForwarding yes

# 是否允许 TCP 端口转发(如 ssh -L/ssh -R)
#AllowTcpForwarding yes

# 启用网关端口(使远程端口映射可以监听公网)
#GatewayPorts no

# 客户端连接保活(防止断线)
#ClientAliveInterval 0
#ClientAliveCountMax 3

# 最大启动连接数量(防止 DoS 攻击)
#MaxStartups 10:30:100

# 启用隧道支持
#PermitTunnel no

# chroot 限制目录
#ChrootDirectory none

# 版本信息追加说明(可加版本号标识等)
#VersionAddendum none

# 登录前显示 Banner 内容(可用于显示警告、声明)
#Banner none

# Match 匹配规则(可根据用户、组等定义不同配置)
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server

安全升级

修改端口号

1
2
# 修改端口号(建议使用1024-65535之间的端口)
Port 2022

禁用密码登录,启用密钥认证

1
2
3
4
# 禁用密码登录(包括 cleartext 密码)
PasswordAuthentication no
# 允许公钥认证
PubkeyAuthentication yes

生成SSH密钥对

1
2
3
4
# 客户端生成密钥对
ssh-keygen -t rsa -b 4096 -C "zhiqiang2033@gmail.com"
# 将公钥复制到服务器
ssh-copy-id -p 2022 user@server_ip

配置Fail2ban动态防护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装 Fail2ban
sudo apt update && sudo apt install fail2ban -y
# 配置 Fail2ban 来保护 SSH
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true # 启用 SSH 防护规则
port = ssh # 监听的端口(默认为 22)
filter = sshd # 使用默认的 sshd 过滤器
logpath = /var/log/auth.log # 登录失败日志路径(Ubuntu 系统)
maxretry = 5 # 允许的最大失败次数
findtime = 600 # 时间窗口:10 分钟内超过 maxretry 次则封禁
bantime = 3600 # 封禁时间:单位为秒,这里是 1 小时
# ignoreip = 127.0.0.1/8 # 忽略本地回环 IP,不对其封禁(白名单)
EOF

查看封禁状态

1
sudo fail2ban-client status sshd

手动解封IP

1
sudo fail2ban-client set sshd unbanip 192.168.0.100

手动封禁IP

1
sudo fail2ban-client set sshd banip 192.168.0.100

查看封禁日志

1
sudo fail2ban-client get sshd banip

重启 Fail2ban 服务

1
sudo systemctl restart fail2ban

启用双因子认证(2FA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装 Google Authenticator PAM 模块
sudo apt update && sudo apt install libpam-google-authenticator -y

# 运行2FA配置向导
google-authenticator
1.按提示回答问题(建议全部选择“是”以增强安全性)
2.会生成一个二维码和一串密钥,扫码到手机 Google Authenticator 或其他兼容 App
3.记录好备用密钥,用于恢复

# 修改配置/etc/ssh/sshd_config
# 增加一行
ChallengeResponseAuthentication yes
# 强制认证方式:先公钥,再交互式(即 2FA)
AuthenticationMethods publickey,keyboard-interactive


# 修改配置/etc/pam.d/sshd文件顶部附近添加
# nullok 表示如果用户没配置 2FA 不会强制失败,可去掉以强制所有用户必须 2FA。
auth required pam_google_authenticator.so nullok

最佳的配置/etc/ssh/sshd_config

这份 SSH 配置禁用密码和 root 登录,只允许公钥认证,改用非默认端口,限制登录尝试次数和会话数,关闭了 X11 和 TCP 转发,防止暴力破解和未授权访问,整体安全且实用,适合严格控制服务器访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# 包含额外的 sshd 配置文件
Include /etc/ssh/sshd_config.d/*.conf
# 支持 IPv4 和 IPv6
AddressFamily any
# 禁用键盘交互认证(非2FA场景)
KbdInteractiveAuthentication no
# 启用 PAM(可支持2FA等)
UsePAM yes
# 登录时不打印 MOTD
PrintMotd no
# 接受客户端传递的环境变量
AcceptEnv LANG LC_*
# sftp 子系统路径
Subsystem sftp /usr/lib/openssh/sftp-server

# --- 基础安全配置 ---
# SSH 端口(非默认端口)
Port 2022
# 主机密钥路径
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# --- 认证相关 ---

# 禁止 root 账户密码登录
PermitRootLogin no
# 禁止密码认证,仅允许密钥登录
PasswordAuthentication no
# 禁止空密码
PermitEmptyPasswords no
# 启用公钥认证
PubkeyAuthentication yes
# 只允许公钥认证(无2FA)
AuthenticationMethods publickey

# --- 连接限制 ---
# 最大认证失败尝试次数
MaxAuthTries 3
# 最大会话数
MaxSessions 10
# 最大连接数及限制策略(防止拒绝服务)
MaxStartups 3:30:10
# 登录超时,超过1分钟自动断开
LoginGraceTime 1m
# 客户端活动检测时间间隔(秒)
ClientAliveInterval 300
# 客户端最大无响应次数
ClientAliveCountMax 2
# 关闭DNS反查,加快连接速度
UseDNS no

# --- 用户限制 ---
# 允许登录的用户列表
AllowUsers ubuntu
# 拒绝登录的用户列表
DenyUsers root guest nobody

# --- 其他安全选项 ---
# 禁用 X11 转发
X11Forwarding no
# 禁止 TCP 转发
AllowTcpForwarding no
# 禁止网关端口转发
GatewayPorts no
# 禁止隧道接口
PermitTunnel no

创建ubuntu账号

1
2
useradd -m -d /home/ubuntu -s /bin/bash ubuntu
echo "ubuntu:123456" | chpasswd