是什么:理解SSH配置的核心概念
配置SSH,全称为配置Secure Shell,是指为了安全、高效地通过网络连接到远程计算机或服务器而进行的一系列设置。它不仅仅是简单地输入用户名和密码,更涉及到密钥管理、端口设置、权限控制以及各种高级功能的启用。SSH配置主要分为两个层面:
- 客户端配置: 这通常指的是您本地计算机上用于发起SSH连接的设置。它控制着如何连接到不同的远程主机,例如使用哪个私钥、连接哪个端口、以哪个用户身份登录以及各种连接优化选项。
- 服务器端配置: 这指的是远程服务器上接受SSH连接的设置。它决定了哪些用户可以登录、允许哪种认证方式(密码或密钥)、是否允许root用户登录、监听哪个端口以及其他安全策略。
它的核心目的是在不安全的网络环境中提供加密的通信通道,确保数据传输的机密性和完整性,并对连接双方进行身份认证。
为什么:配置SSH的必要性与优势
配置SSH并非可有可无,而是远程管理和安全操作的基石。以下是其重要的原因和带来的优势:
1. 增强安全性
- 杜绝密码暴力破解: 默认的密码认证容易被自动化工具进行暴力破解攻击。通过配置SSH,特别是采用密钥认证并禁用密码登录,可以极大提高安全性。密钥对(公钥和私钥)的长度通常远超任何人类可记忆的密码,且理论上无法通过暴力破解来推导。
- 防范中间人攻击: SSH通过公钥指纹验证机制,可以有效识别并防范中间人攻击。首次连接时会提示您确认服务器的指纹,一旦确认,后续连接将以此为准,任何指纹变更都会发出警告。
- 数据传输加密: SSH会加密所有传输的数据,包括命令、文件传输(SCP/SFTP)和隧道流量,防止敏感信息在网络传输过程中被窃听或篡改。
- 权限细粒度控制: 服务器端配置允许管理员精确控制哪些用户、甚至哪些IP地址可以登录,以及这些用户登录后能执行哪些操作,从而降低未授权访问的风险。
2. 提高便利性与效率
- 无密码登录: 一旦配置了密钥认证,您无需每次连接都输入密码,实现“一键登录”,尤其是在频繁连接或编写自动化脚本时,能显著提升效率。
-
连接别名与默认设置: 通过客户端配置文件(
~/.ssh/config),您可以为复杂的连接字符串创建简单的别名,并为特定主机设置默认的用户、端口、私钥等,简化命令。 - SSH代理(ssh-agent): 配置代理可以避免在每个终端会话中反复输入私钥密码,只需输入一次,代理就会在内存中安全地缓存您的密钥,大大提升便利性。
3. 实现强大的功能扩展
- 端口转发(Tunneling): SSH不仅用于远程Shell,还能用于建立加密隧道,将本地端口的流量转发到远程服务器的某个端口(本地转发),或将远程服务器的某个端口流量转发到本地(远程转发),常用于访问防火墙后的服务或绕过网络限制。
- SOCKS代理: 通过动态端口转发,SSH可以创建一个SOCKS代理,让您的浏览器或其他应用程序通过加密隧道访问互联网,实现简单的VPN功能。
- X11转发: 允许您在本地机器上运行远程服务器上的图形界面应用程序,其界面通过SSH连接安全地显示在您的本地显示器上。
- 文件传输: SCP(Secure Copy Protocol)和SFTP(SSH File Transfer Protocol)是SSH协议的一部分,提供安全的文件上传和下载功能。
哪里:SSH配置文件与密钥的存放位置
了解SSH相关文件的存放位置是配置的基础。
1. 客户端配置文件位置
-
主配置文件:
~/.ssh/config
这是用户特定的SSH客户端配置文件。~代表当前用户的主目录(例如在Linux上是/home/your_username,在macOS上是/Users/your_username,在Windows上是C:\Users\your_username)。该文件通常需要手动创建,其权限应设置为600(只有文件所有者可读写)。 -
私钥文件: 通常位于
~/.ssh/目录下
例如:~/.ssh/id_rsa(RSA密钥)、~/.ssh/id_dsa(DSA密钥)、~/.ssh/id_ecdsa(ECDSA密钥)、~/.ssh/id_ed25519(Ed25519密钥)。这些文件是您的身份凭证,绝不能泄露,其权限应设置为600或更严格的400。 -
公钥文件: 通常与私钥同名,但扩展名为
.pub
例如:~/.ssh/id_rsa.pub、~/.ssh/id_ed25519.pub。这些是您可以公开分享的密钥部分,用于放置到远程服务器的authorized_keys文件中。 -
已知主机文件:
~/.ssh/known_hosts
该文件存储了您连接过的所有远程主机的公钥指纹。当您首次连接一台新主机时,会提示您确认其指纹并将其添加到此文件。此后,如果主机的指纹发生变化,SSH会发出警告。
2. 服务器端配置文件位置
-
SSH守护进程配置文件:
/etc/ssh/sshd_config
这是SSH服务器(sshd)的主配置文件,包含了所有服务器端的全局设置,例如监听端口、认证方式、日志级别等。修改此文件后,通常需要重启sshd服务才能生效。 -
授权公钥文件: 通常位于每个用户的home目录下
~/.ssh/authorized_keys
远程服务器上的每个用户都有自己的.ssh目录,其中包含authorized_keys文件。这个文件存储了允许该用户通过密钥认证登录的客户端公钥列表。服务器在验证用户身份时,会检查客户端提供的公钥是否在此文件中。此文件及其父目录~/.ssh/的权限管理至关重要,~/.ssh/目录权限应为700,authorized_keys文件权限应为600。
3. 系统级SSH配置(较少改动)
-
SSH客户端系统级配置:
/etc/ssh/ssh_config
这是系统范围的SSH客户端配置,其中的设置会影响所有用户。但通常,用户会倾向于使用自己的~/.ssh/config来覆盖或补充这些系统级设置。
如何:详细配置SSH的步骤与示例
以下是配置SSH的详细步骤,涵盖从生成密钥到客户端和服务器端的高级设置。
第一步:生成SSH密钥对 (在您的本地计算机上执行)
SSH密钥对由一个私钥和一个公钥组成。私钥保存在本地,公钥复制到远程服务器。推荐使用Ed25519类型,因为它兼顾了安全性和性能。
-
打开终端或Git Bash (Windows) / PowerShell (Windows 10+):
ssh-keygen -t ed25519 -C "[email protected]"-t ed25519: 指定密钥类型为Ed25519。您也可以使用rsa,但推荐使用长度更长(如-b 4096)的RSA密钥,或者直接使用Ed25519。-C "[email protected]": 为密钥添加一个注释,通常是您的邮箱或任何有助于识别密钥的信息,这不会影响密钥功能,但有助于管理。
-
根据提示操作:
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/your_username/.ssh/id_ed25519):直接回车,密钥将保存在默认位置(
~/.ssh/id_ed25519)。如果您有多个密钥,可以指定不同的文件名。Enter passphrase (empty for no passphrase): Enter same passphrase again:强烈建议为您的私钥设置一个复杂的密码(passphrase)。这提供了额外的安全层,即使私钥文件泄露,没有密码也无法使用。每次使用私钥时都需要输入此密码,但可以通过SSH代理(ssh-agent)解决此问题。如果想无密码使用,直接回车留空。
-
查看生成的密钥:
ls -l ~/.ssh/id_ed25519*您会看到两个文件:
id_ed25519(私钥) 和id_ed25519.pub(公钥)。
第二步:将公钥复制到远程服务器 (在您的本地计算机上执行)
这是建立密钥认证的关键一步。您需要将本地生成的公钥(id_ed25519.pub)的内容添加到远程服务器上目标用户的~/.ssh/authorized_keys文件中。
-
使用
ssh-copy-id命令 (推荐,最简单):
如果远程服务器安装了ssh-copy-id(大多数Linux发行版默认安装),这是最便捷的方法。ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host-i ~/.ssh/id_ed25519.pub: 指定要复制的公钥文件路径。如果只生成了一个默认密钥,此参数可以省略。user@remote_host: 远程服务器的用户名和IP地址或域名。
该命令会尝试连接到远程服务器,并提示您输入远程用户的密码。成功登录后,它会自动创建或追加您的公钥到
~/.ssh/authorized_keys文件中,并设置正确的目录和文件权限。 -
手动复制公钥 (如果
ssh-copy-id不可用或您偏好手动操作):
首先,通过密码登录到远程服务器:
ssh user@remote_host然后,在远程服务器上执行以下命令,确保
.ssh目录和authorized_keys文件存在且权限正确:mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys接着,在本地计算机上复制公钥内容:
cat ~/.ssh/id_ed25519.pub将输出的公钥字符串(通常以
ssh-ed25519开头,以注释结尾)复制。最后,在远程服务器上将复制的公钥粘贴到
~/.ssh/authorized_keys文件中(使用vi、nano或其他编辑器,或直接使用echo追加):echo "粘贴您的公钥字符串" >> ~/.ssh/authorized_keys或者,您也可以在本地计算机上一步到位:
cat ~/.ssh/id_ed25519.pub | ssh user@remote_host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
第三步:配置SSH客户端(~/.ssh/config)(在您的本地计算机上执行)
客户端配置文件允许您为不同的远程主机定义连接参数,大大简化连接命令。
-
创建或编辑
~/.ssh/config文件:
如果文件不存在,请创建它。确保其权限为600:touch ~/.ssh/config chmod 600 ~/.ssh/config -
添加配置条目:
使用文本编辑器打开~/.ssh/config,并添加类似以下内容的条目:Host my_server_alias Hostname 192.168.1.100 # 或 remote.example.com User remote_user Port 2222 # 如果远程服务器的SSH端口不是22 IdentityFile ~/.ssh/id_ed25519 # 如果您有多个私钥或私钥不在默认位置 ForwardAgent yes # 开启SSH代理转发,方便从远程服务器连接其他机器 TCPKeepAlive yes # 保持连接活跃,防止因长时间不活动而断开 ServerAliveInterval 60 # 每60秒发送一次“活着”消息 ServerAliveCountMax 3 # 如果三次未收到响应,则断开连接 StrictHostKeyChecking no # 不建议在生产环境使用,用于首次连接新机器时避免提示 UserKnownHostsFile /dev/null # 不建议在生产环境使用,用于调试 NoHostAuthenticationForLocalhost yes # 针对localhost连接时跳过主机认证 Host another_server Hostname example.com User admin Port 22 IdentityFile ~/.ssh/another_key ControlMaster auto ControlPath ~/.ssh/cm_sockets/%r@%h:%p ControlPersist 10m # 保持连接10分钟,后续连接复用Host my_server_alias: 您为远程主机定义的别名,可以是任意有意义的名称。Hostname: 远程服务器的实际IP地址或域名。User: 登录远程服务器使用的用户名。Port: 远程SSH服务器监听的端口号。如果不是默认的22,请务必指定。IdentityFile: 指定用于连接此主机的私钥文件路径。ForwardAgent yes: 启用SSH代理转发,允许您在登录远程服务器后,无需再次输入私钥密码即可从该服务器连接到其他服务器。ControlMaster auto,ControlPath,ControlPersist: 这些选项用于开启SSH连接多路复用。这意味着第一次连接建立后,后续在该别名下的SSH连接将重用同一个底层TCP连接,显著提高连接速度,尤其是在频繁连接或文件传输时。
-
测试连接:
现在,您可以使用别名进行连接:ssh my_server_alias如果配置正确,您应该能够无需密码(如果私钥没有密码或已通过代理加载)或仅输入一次私钥密码成功登录。
第四步:配置SSH服务器(/etc/ssh/sshd_config)(在远程服务器上执行)
服务器端配置是SSH安全的核心。在修改此文件之前,务必先备份! 并且,请勿在没有备用连接方式的情况下断开当前SSH连接,直到您确认新的配置能正常工作。
-
备份配置文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak -
打开
sshd_config进行编辑:
使用您喜欢的文本编辑器(如nano或vi):sudo nano /etc/ssh/sshd_config -
修改关键配置项:
找到并修改(或添加)以下行。通常这些行前面会有#号(注释),需要去掉#并修改其值。注意: 修改前,请确保您已经通过密钥成功登录,并且至少有一个非root用户可用于登录,以防root登录被禁用后无法再次登录。
-
修改默认SSH端口 (提高隐蔽性):
#Port 22 Port 2222 # 修改为任意不常用的高位端口,如 2222, 22222, 49152-65535 等重要: 修改端口后,请务必在服务器的防火墙(如ufw, firewalld, iptables)中开放新端口。
-
禁用Root用户直接登录 (强烈推荐):
#PermitRootLogin yes PermitRootLogin no # 或 prohibit-password (只允许密钥登录root)这表示不允许root用户直接通过SSH登录。您应该以普通用户登录,然后使用
sudo -i或su -切换到root。 -
禁用密码认证 (强烈推荐,如果已配置密钥):
#PasswordAuthentication yes PasswordAuthentication no这强制所有用户都必须使用密钥对进行认证。在禁用前,请务必确保您已通过密钥成功登录过至少一个用户。
-
禁用空密码登录 (默认通常已禁用):
#PermitEmptyPasswords no PermitEmptyPasswords no -
确保公钥认证已启用:
PubkeyAuthentication yes这通常是默认启用。
-
指定授权公钥文件的位置 (通常默认无需修改):
#AuthorizedKeysFile .ssh/authorized_keys AuthorizedKeysFile .ssh/authorized_keys这表示公钥将从用户的
~/.ssh/authorized_keys文件中加载。 -
其他安全项 (根据需求配置):
ChallengeResponseAuthentication no # 禁用基于挑战-响应的认证,如键盘交互 UsePAM no # 禁用PAM认证,除非您明确需要,否则可能导致问题 GSSAPIAuthentication no # 禁用GSSAPI认证,除非您明确需要 X11Forwarding yes # 如果需要X11图形界面转发,则启用 AllowTcpForwarding yes # 允许TCP端口转发 AllowAgentForwarding yes # 允许SSH代理转发 MaxAuthTries 3 # 最大认证尝试次数,防止暴力破解 LoginGraceTime 30 # 登录宽限时间,超过此时间未成功登录则断开连接 LogLevel INFO # 记录SSH连接日志级别您也可以使用
AllowUsers或DenyUsers来明确允许或禁止某些用户登录:#AllowUsers user1 user2 #DenyUsers user3
-
修改默认SSH端口 (提高隐蔽性):
- 保存并退出文件。
-
重启SSH服务:
根据您的Linux发行版,使用以下命令之一:sudo systemctl restart sshd # 对于Systemd系统 (如Ubuntu 16.04+, CentOS 7+) sudo service ssh restart # 对于Upstart/SysVinit系统 (如较旧的Ubuntu, Debian) -
测试新配置 (非常重要!):
不要关闭您当前的SSH连接!
在您的本地计算机上打开一个新的终端窗口,尝试使用新配置(例如新端口,新用户)连接到远程服务器:ssh -p 2222 user@remote_host_ip_or_domain # 使用新端口测试 ssh my_server_alias # 如果您已经配置了客户端别名如果新的连接成功,并且您确认了所有新配置(如无法使用密码登录,root无法直接登录)都生效,那么您现在可以安全地关闭旧的SSH连接。
如果新连接失败,您可以回到旧连接修改配置,直到成功。
高级配置选项
SSH代理 (ssh-agent)
SSH代理是一个程序,它在内存中存储您的私钥,并在您需要连接时自动提供它们,这样您就无需重复输入私钥密码。
-
启动ssh-agent (如果未运行):
eval "$(ssh-agent -s)"这个命令通常在您的shell启动脚本(如
~/.bashrc或~/.zshrc)中。 -
将私钥添加到代理:
ssh-add ~/.ssh/id_ed25519如果您的私钥有密码,
ssh-add会提示您输入一次。之后,只要ssh-agent进程还在运行,您就可以无需密码使用该私钥。 -
查看已加载的密钥:
ssh-add -l
端口转发 (Port Forwarding)
SSH端口转发允许您通过加密的SSH隧道发送网络流量。
-
本地端口转发 (Local Port Forwarding):
ssh -L [本地端口]:[目标IP]:[目标端口] user@remote_host
将本地机器的某个端口的流量转发到远程服务器能访问的某个IP和端口。
ssh -L 8080:localhost:80 user@remote_host这会将您本地机器上
localhost:8080的流量转发到远程服务器上的localhost:80。您可以在本地浏览器中访问http://localhost:8080来访问远程服务器上的Web服务。 -
远程端口转发 (Remote Port Forwarding):
ssh -R [远程端口]:[目标IP]:[目标端口] user@remote_host
将远程服务器的某个端口的流量转发到本地机器能访问的某个IP和端口。常用于内网穿透。
ssh -R 8888:localhost:80 user@remote_host这会将远程服务器上
localhost:8888的流量转发到您本地机器上的localhost:80。 -
动态端口转发 (Dynamic Port Forwarding / SOCKS Proxy):
ssh -D [本地端口] user@remote_host
创建一个SOCKS代理。所有通过该代理的流量都会经过SSH隧道。
ssh -D 1080 user@remote_host然后在您的浏览器或其他应用程序中配置SOCKS代理,指向
localhost:1080。
X11转发 (X11 Forwarding)
允许您在本地机器上显示远程服务器的图形界面应用程序。
ssh -X user@remote_host
登录后,您可以直接运行远程服务器上的图形应用程序(如xclock, firefox),它们的窗口会出现在您的本地桌面上。需要在服务器端sshd_config中启用X11Forwarding yes,并且本地需要安装X服务器(如Windows上的Xming)。
跳板机 (Jump Host / ProxyJump)
当您需要通过一个中间服务器(跳板机)连接到最终目标服务器时使用。
在~/.ssh/config中配置:
Host final_server
Hostname 192.168.1.50
User target_user
ProxyJump jump_server_alias
Host jump_server_alias
Hostname 10.0.0.10
User jump_user
IdentityFile ~/.ssh/id_ed25519_jump
然后直接连接:
ssh final_server
SSH客户端会自动先连接到jump_server_alias,然后再通过它连接到final_server。
常见问题与解决方案
在SSH配置过程中,您可能会遇到各种问题。以下是一些常见的问题及其排查方法:
1. 权限问题
错误信息示例:
Bad permissions on /home/user/.ssh/id_rsaUnprotected private key file!Permissions 0755 for '/home/user/.ssh' are too open.Permissions 0644 for '/home/user/.ssh/authorized_keys' are too open.
原因: SSH对密钥文件和配置文件的权限要求非常严格,以防止他人读取或修改您的敏感信息。
解决方案:
-
私钥文件 (
~/.ssh/id_rsa或id_ed25519等):
权限必须是600(rw——-)。chmod 600 ~/.ssh/id_ed25519 -
.ssh目录 (~/.ssh/):
权限必须是700(rwx——)。chmod 700 ~/.ssh -
authorized_keys文件 (在远程服务器上):
权限必须是600(rw——-)。chmod 600 ~/.ssh/authorized_keys
2. 防火墙问题
现象: 无法连接到远程服务器,连接超时或被拒绝。
原因: 远程服务器的防火墙可能阻止了SSH连接请求,或者您修改了SSH端口但未在防火墙中开放新端口。
解决方案:
-
检查服务器防火墙:
- UFW (Ubuntu/Debian):
sudo ufw status sudo ufw allow ssh # 允许默认SSH端口22 sudo ufw allow 2222/tcp # 如果您修改了端口为2222 sudo ufw reload - Firewalld (CentOS/RHEL):
sudo firewall-cmd --list-all sudo firewall-cmd --permanent --add-service=ssh # 允许默认SSH服务 sudo firewall-cmd --permanent --add-port=2222/tcp # 如果您修改了端口为2222 sudo firewall-cmd --reload - IPTables:
sudo iptables -L -n # 示例:允许新端口 sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT # 保存规则 (不同系统保存方式不同)
- UFW (Ubuntu/Debian):
- 检查云服务提供商的安全组/网络ACL: 如果您的服务器是云主机,如AWS EC2、Azure VM、Google Cloud VM等,您还需要在云平台控制台中检查其安全组或网络ACL,确保SSH端口(或您修改后的新端口)对外开放。
3. 密钥不匹配或未正确添加
现象: 尝试使用密钥登录时,仍然提示输入密码,或显示
Permission denied (publickey,password).
原因:
- 您的公钥未正确添加到远程服务器用户的
~/.ssh/authorized_keys文件中。 sshd_config中PubkeyAuthentication未设置为yes。authorized_keys文件或其父目录.ssh的权限不正确。- 客户端使用的私钥与服务器上的公钥不匹配。
解决方案:
-
重新执行第二步: 确保公钥已正确复制到远程服务器的
~/.ssh/authorized_keys文件中,并且该文件及.ssh目录的权限是正确的(600和700)。 -
检查
sshd_config: 确保远程服务器的/etc/ssh/sshd_config文件中PubkeyAuthentication yes已启用,并且没有其他设置(如PasswordAuthentication yes,如果打算禁用密码)冲突。 -
指定私钥: 确保您在连接时使用了正确的私钥,或在
~/.ssh/config中正确配置了IdentityFile。ssh -i ~/.ssh/my_custom_key user@remote_host
4. sshd服务未运行
现象: 连接被拒绝,提示
Connection refused。
原因: 远程服务器上的SSH守护进程(sshd)可能没有运行,或者在您修改配置后未能成功重启。
解决方案:
-
检查sshd服务状态:
sudo systemctl status sshd如果显示
inactive (dead)或有错误信息,请尝试重启:sudo systemctl restart sshd -
查看系统日志: 如果重启失败,查看系统日志以获取更多错误信息:
sudo journalctl -u sshd -e # Systemd系统 sudo tail -f /var/log/auth.log # 常见的SSH认证日志 sudo tail -f /var/log/syslog # 更多系统日志这些日志文件会记录
sshd启动时遇到的问题,例如配置文件的语法错误。
5. PermitRootLogin 或 PasswordAuthentication 配置错误
现象: 使用root用户或密码登录失败,即使密码是正确的。
原因: 您在/etc/ssh/sshd_config中禁用了root登录或密码认证。
解决方案:
- 确认预期行为: 如果您有意禁用这些功能,那么这是正常现象。请使用允许登录的普通用户和密钥对进行连接。
-
修改并重启: 如果您需要重新启用,请在备用连接(如通过控制台登录云服务器,或通过另一SSH会话以普通用户登录)下修改
/etc/ssh/sshd_config文件,将PermitRootLogin或PasswordAuthentication改回yes(不推荐用于生产环境),然后重启sshd服务。
6. Host key verification failed.
现象: 尝试连接时,出现此警告并拒绝连接。
原因: 远程服务器的SSH公钥指纹与您本地~/.ssh/known_hosts文件中记录的不符。这可能是因为服务器的SSH密钥被更改了(例如,服务器重装了系统,或您连接到了一个新服务器但IP地址与旧服务器相同),也可能是中间人攻击的迹象。
解决方案:
-
确认新指纹: 如果您确定这是正常变更(例如服务器重装),可以删除
~/.ssh/known_hosts文件中对应的那一行。ssh-keygen -R hostname_or_ip_address下次连接时会再次提示您确认新的指纹。
- 警惕: 如果您没有预料到这种变化,请务必调查原因,这可能是安全问题。
通过详细的日志分析(通常是/var/log/auth.log或/var/log/secure)和逐步排查,大多数SSH配置问题都可以解决。
多少:关于SSH密钥类型与数量的考量
1. SSH密钥类型有多少种?
SSH支持多种密钥算法,它们在安全强度、性能和兼容性方面有所不同。目前主流且推荐使用的有:
-
RSA (Rivest-Shamir-Adleman): 最早且最广泛使用的密钥类型。建议生成至少4096位的RSA密钥(
ssh-keygen -t rsa -b 4096)。安全性良好,但生成和使用速度相对较慢。 - DSA (Digital Signature Algorithm): 仅支持1024位密钥,现在已被认为不够安全,不推荐使用。
-
ECDSA (Elliptic Curve Digital Signature Algorithm): 基于椭圆曲线密码学,提供与RSA相当甚至更高的安全强度,但密钥长度更短,计算速度更快。常见的有
ecdsa-p256、ecdsa-p384、ecdsa-p521。 -
Ed25519 (Edwards-curve Digital Signature Algorithm): 同样基于椭圆曲线,是目前推荐的密钥类型。它提供了优秀的安全性、更短的密钥长度和极高的性能。生成简单(
ssh-keygen -t ed25519),且没有像RSA那样需要选择密钥长度的复杂性。
推荐: 对于新生成的密钥,强烈推荐使用Ed25519。
2. 可以配置多少个用户/密钥?
-
单个用户可拥有的密钥对数量:
理论上没有限制。您可以在本地机器上生成任意数量的SSH密钥对,每个密钥对用于连接不同的服务器、不同的账户或不同的项目。通过客户端的~/.ssh/config文件,您可以为每个主机指定使用不同的IdentityFile。 -
单个服务器上可配置的用户数量:
理论上没有限制。只要服务器有足够的存储空间和系统资源,您可以创建任意数量的Linux/Unix用户,并为每个用户配置SSH密钥认证。 -
单个
authorized_keys文件中可包含的公钥数量:
理论上也没有严格限制。一个用户的~/.ssh/authorized_keys文件可以包含多个公钥,每个公钥对应一个允许通过密钥登录该用户的客户端。这对于团队协作非常有用,允许多个开发者使用自己的密钥登录同一个部署用户。但是,文件过大可能会轻微影响SSH认证速度,且管理起来更复杂。建议定期清理不再使用的公钥。
最佳实践:
- 为每个设备生成独立的密钥对。
- 为每个重要的服务或部署角色使用独立的密钥对。
-
定期审计
authorized_keys文件,移除不再需要的公钥。
SSH配置安全最佳实践
除了上述具体的配置步骤,遵循以下最佳实践将大大提高您的SSH安全:
-
禁用密码登录: 一旦确认密钥认证正常工作,立即在
/etc/ssh/sshd_config中将PasswordAuthentication设置为no。这是防止暴力破解最有效的方法。 -
禁用Root用户直接登录: 将
PermitRootLogin设置为no或prohibit-password。以普通用户登录,再通过sudo或su提权。 -
修改默认SSH端口: 将
Port从默认的22更改为不常用的高位端口,同时在防火墙中开放新端口。这是一种“安全通过隐蔽”的措施,可以减少被扫描器发现的几率。 -
使用强密钥类型和密码: 优先使用
Ed25519或RSA 4096位密钥,并为您的私钥设置一个复杂且难以猜测的密码(passphrase)。 -
正确设置文件权限: 确保所有SSH相关文件(
.ssh目录、私钥、authorized_keys)具有正确的、严格的权限(通常是700和600)。 -
启用SSH代理 (
ssh-agent): 配合私钥密码使用,可以在不牺牲安全性的前提下提高使用便利性。 - 配置防火墙: 仅允许SSH端口(新端口)从受信任的IP地址访问,或至少仅允许必要的端口访问服务器。
-
定期审计
authorized_keys: 定期检查服务器上每个用户的~/.ssh/authorized_keys文件,移除任何不再需要的公钥。 -
限制登录用户: 使用
AllowUsers或AllowGroups选项在sshd_config中明确指定哪些用户或用户组可以通过SSH登录。 -
启用日志并定期监控: 确保
LogLevel设置为INFO或更高,并定期检查SSH日志(如/var/log/auth.log或/var/log/secure),以发现异常登录尝试。