SSHD
sshd, 指的是ssh daemon, 是ssh服务器的后台进程.
当一台主机配置了sshd, 其他的主机才能连接. 这里的连接包括了SSH Login, SSHFS, Scp等连接方式
Linux Setup
使用对应平台的包管理器下载openssh-server, 如:
然后, 使用Systmectl启动openssh-server:
sudo systemctl enable --noe sshdMacOS Setup
可以简单的使用Homebrew安装:
brew install openssh但是实际上, MacOS已经自带了这些功能, 需要进入设置中搜索ssh, 然后打开共享->远程登陆, 并在其中配置允许ssh登陆的用户列表
Windows Setup
这个可能比较繁琐.
需要在设置中找到: 可选功能(设置→系统→可选功能), 在里面搜索”OpenSSH”, 下载安装OpenSSH Client和OpenSSH Server.
如果没找到, 可以使用命令行激活: 首先按下Win+X然后找到”终端(管理员)”, 进入管理员权限的终端; 然后输入下面的命令:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'输出的结果应该为:
Name : OpenSSH.Client~~~~0.0.1.0
State : NotPresent
Name : OpenSSH.Server~~~~0.0.1.0
State : NotPresent
输入命令:
# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0输出:
Path :
Online : True
RestartNeeded : False
输入命令:
# Start the sshd service
Start-Service sshd
# OPTIONAL but recommended:
Set-Service -Name sshd -StartupType 'Automatic'
# Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue)) {
Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}Configure SSHD
配置文件是一样的写法.
MacOS 和 linux 的配置文件都在路径/etc/ssh/sshd_config中, 需要sudo权限进行编辑
windows 配置文件通常位于C:\ProgramData\ssh\sshd_config
sshd_config
Port 22- 意义: 指定
sshd守护进程监听的端口号。 - 默认值:
22。 - 建议: 为了降低被自动化工具扫描和攻击的风险,可以将其更改为一个不常用的高位端口(例如
2222)。但请注意,这是一种“安全混淆”(Security through obscurity),不能替代真正的安全措施(如防火墙、密钥认证等)。
- 意义: 指定
ListenAddress 0.0.0.0- 意义: 指定
sshd监听的网络接口 IP 地址。可以有多个ListenAddress项。 - 默认值:
0.0.0.0(监听所有 IPv4 地址) 和::(监听所有 IPv6 地址)。 - 用途: 如果服务器有多个网卡,你可以用它来指定 SSH 服务只在内网或特定的 IP 地址上可用。例如
ListenAddress 192.168.1.1。
- 意义: 指定
AddressFamily any- 意义: 指定
sshd使用的 IP 地址族。 - 可选值:
any: 同时使用 IPv4 和 IPv6 (默认)。inet: 只使用 IPv4。inet6: 只使用 IPv6。
- 意义: 指定
HostKey /etc/ssh/ssh_host_rsa_key- 意义: 指定服务器用于向客户端证明自己身份的私钥文件路径。当客户端第一次连接服务器时,会收到这些密钥的公钥部分,并提示用户确认。
- 建议: 通常不需要修改。确保这些文件的权限是安全的(通常是
600),只有root用户可读写。现代推荐优先使用ed25519和ecdsa。
LoginGraceTime 2m- 意义: 指定客户端在发起连接后必须完成认证的时间。如果在指定时间内未能成功登录,服务器将断开连接。
- 默认值:
120秒 (2m)。 - 建议: 可以适当缩短此时间(如
30s)以减少未认证连接占用的资源。
PermitRootLogin prohibit-password- 意义: 控制是否允许
root用户通过 SSH 登录。这是最重要的安全配置之一。 - 可选值:
yes: 允许root用户以任何方式登录(非常不推荐)。no: 完全禁止root用户登录。这是最安全的设置。管理员应使用普通用户登录,然后通过su或sudo提权。prohibit-password: (现代版本的默认值) 禁止使用密码登录root,但允许使用密钥对登录。这是一个很好的折中方案。forced-commands-only: 只允许root通过密钥登录,并且只能执行authorized_keys文件中指定的命令。
- 强烈建议: 设置为
no或prohibit-password。
- 意义: 控制是否允许
StrictModes yes- 意义:
sshd在接受登录前,会检查用户的主目录、~/.ssh目录和authorized_keys文件的权限是否安全(即不应被其他用户写入)。 - 默认值:
yes。 - 强烈建议: 保持为
yes。如果设为no,当用户目录权限配置不当时,会带来严重的安全风险。
- 意义:
MaxAuthTries 6- 意义: 每个连接允许的最大认证尝试次数。达到此限制后,连接将被断开。
- 建议: 设置为一个较低的数字(如
3或4)可以有效防止密码暴力破解攻击。
PubkeyAuthentication yes- 意义: 是否启用公钥认证(即使用 SSH 密钥对登录)。
- 默认值:
yes。 - 强烈建议: 保持为
yes。密钥认证远比密码认证安全。
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2- 意义: 指定存储用户公钥的文件路径。路径是相对于用户主目录的。
- 建议: 通常使用默认值即可。
PasswordAuthentication yes- 意义: 是否启用密码认证。
- 默认值:
yes。 - 强烈建议: 如果你的所有用户都已配置密钥登录,请将其设置为
no。禁用密码认证是提升 SSH 安全性的关键步骤,可以完全杜绝密码暴力破解攻击。
PermitEmptyPasswords no- 意义: 是否允许使用空密码的账户登录。
- 默认值:
no。 - 强烈建议: 必须保持为
no。
ChallengeResponseAuthentication no- 意义: 是否启用质询-响应式认证。这是一种交互式认证,通常也表现为密码输入提示。
- 建议: 如果
PasswordAuthentication设置为no,此项也应设为no。在某些系统(如启用了 PAM)中,禁用密码登录需要同时将这两项都设为no。
UsePAM yes- 意义: 是否启用 PAM (Pluggable Authentication Modules) 认证。PAM 允许系统集成多种认证机制(如密码、指纹、LDAP 等)。
- 建议: 在大多数现代 Linux 发行版上,应保持为
yes,因为它与系统级的用户和认证策略紧密集成。
KerberosAuthentication no/GSSAPIAuthentication no- 意义: 是否启用基于 Kerberos 或 GSSAPI 的企业级认证。
- 建议: 如果你不在企业 Kerberos/GSSAPI 环境中,请将它们设置为
no,以减少不必要的攻击面。
X11Forwarding yes- 意义: 是否允许 X11 转发。这允许用户在 SSH 会话中运行图形化 (GUI) 程序。
- 建议: 如果你不需要在服务器上运行图形化应用,请设置为
no,因为 X11 转发存在一定的安全风险。
AllowTcpForwarding yes- 意义: 是否允许 TCP 转发(也称为 SSH 隧道)。这是一个非常强大的功能,但也可能被滥用。
- 建议: 如果不需要此功能,可以设置为
no。
PermitTunnel no- 意义: 是否允许
ssh的tun设备转发(即创建 VPN)。 - 建议: 除非你有明确的 VPN 需求,否则保持为
no。
- 意义: 是否允许
PrintMotd yes- 意义: 用户登录后是否显示
/etc/motd(Message Of The Day) 文件中的内容。 - 建议: 根据需求设置。通常用于向登录用户显示系统公告。
- 意义: 用户登录后是否显示
Banner none- 意义: 指定一个文件,其内容将在用户输入密码或密钥之前显示。
- 用途: 常用于显示法律声明或安全警告。例如
Banner /etc/ssh/ssh_banner。
Subsystem sftp /usr/lib/openssh/sftp-server- 意义: 配置外部子系统,最常见的就是 SFTP 服务。
- 建议: 保持默认值以确保 SFTP 功能正常。如果想禁用 SFTP,可以注释掉此行。
ClientAliveCountMax 3- 意义: 服务器端空闲超时机制。服务器会每隔
ClientAliveInterval秒向客户端发送一个空包,如果连续ClientAliveCountMax次没有收到客户端的响应,则断开连接。 - 用途: 可以防止因网络问题或客户端无响应而产生的“僵尸”会话。例如,设置为
ClientAliveInterval 60和ClientAliveCountMax 3意味着如果客户端在 3 分钟内无响应,连接将被断开。
- 意义: 服务器端空闲超时机制。服务器会每隔
SyslogFacility AUTH- 意义:
sshd日志消息发送到syslog时的设施(facility)类型。AUTH或AUTHPRIV是常见设置。
- 意义:
LogLevel INFO- 意义:
sshd记录日志的详细级别。 - 可选值:
QUIET,FATAL,ERROR,INFO,VERBOSE,DEBUG,DEBUG1,DEBUG2,DEBUG3 - 建议: 日常使用
INFO即可。在排查问题时可以临时调整为VERBOSE或DEBUG。
- 意义:
Reload Config
-
编辑文件:
sudo nano /etc/ssh/sshd_config -
测试配置语法: 在重启服务前,务必检查配置文件语法是否正确,否则可能导致 SSH 服务启动失败,让你无法远程登录。
sudo sshd -t如果没有任何输出,说明语法正确。
-
重新加载或重启服务: 为了让新配置生效,需要重新加载或重启
sshd服务。推荐使用reload,因为它不会断开当前的 SSH 连接。# 对于使用 systemd 的系统 (Ubuntu, CentOS 7+, Debian 8+) sudo systemctl reload sshd # 如果 reload 不可用或你想彻底重启 sudo systemctl restart sshd