大家好!我是大聪明-PLUS


如果你刚开始接触系统管理,你可能想知道当你输入用户名和密码时,Linux 系统“底层”究竟发生了什么。让我们一起深入了解一下:它是如何验证用户身份的;比较常见的密码和 SSH 密钥;以及如何配置服务器以确保安全运行。欢迎继续阅读。


身份验证和授权


在现代 Linux 发行版中,用户权限验证由 PAM(可插拔身份验证模块)子系统执行。这种灵活的机制支持多种身份验证方法。例如,用户登录时,密码验证既可以在本地进行(使用文件/etc/passwd/etc/shadow,也可以使用外部服务(LDAP、SSH 密钥等)。具体选择取决于 PAM 配置和系统管理员的设置。验证成功后,系统会为用户建立具有相应权限的会话。
 

我相信即使我不说,你也一定知道这一点,但我们再重复一遍。
  • 身份验证是确认用户身份的过程。系统会核实用户是否是其声称的本人。这需要凭证,例如登录名和密码对或加密密钥。
  • 授权是指在身份验证成功后授予访问权限的过程。系统随后决定​​用户可以执行哪些具体操作:例如读取哪些文件、执行哪些命令,并设置其他类似的权限和限制。



身份验证类型


Linux 支持多种身份验证方法。正如本文标题所示,最常见的两种方法是基于密码的身份验证和基于 SSH 密钥的身份验证。
 

密码验证


这是经典的登录方式。用户输入用户名,实际上是向操作系统说“你好!我是……”。然后,他们输入密码进行身份验证。本地访问和远程访问的密码验证过程几乎完全相同。唯一的细微差别在于输入凭据的界面:可以是图形用户界面 (GUI) 或终端。无论哪种情况,系统都会使用用户名和密码组合来验证用户身份并授予其访问权限。

在 Debian 及其后续发行版(例如 Ubuntu 或SelectOS)中,用户帐户存储在一个文件中/etc/passwd,密码哈希值存储在一个受保护的文件中/etc/shadow。只有特权进程(即以 root 身份运行的进程)才能直接访问后者。但是,即使是这些特权进程,在任何情况下也无法看到密码——只存储密码哈希值。

一个特殊的 PAM 模块会对输入的密码进行不可逆的转换,并将生成的哈希值与存储的哈希值进行比较/etc/shadow。使用的算法和盐值也在哈希值行中指定。现代 Linux 发行版通常使用带有盐值的 SHA-512 算法,而不是过时的DES/MD5算法。这确保了安全的身份验证——真实密码不会以明文形式传输或存储。

如果输入密码的哈希值与登录时存储的哈希值匹配,则身份验证过程成功。用户将被授予其帐户中指定的系统访问权限——他们现在已获得登录授权。

如上所述,密码身份验证可以是本地的,也可以是远程的。在远程情况下,通常使用 SSH(安全外壳)协议。当然,它的机制不仅限于密码身份验证——我们将在下文中详细讨论。需要注意的是,在基于 Debian 的发行版中,OpenSSH 服务器默认允许除 root 用户之外的所有用户使用密码登录。配置PasswordAuthentication文件中的一个参数/etc/ssh/sshd_config控制此功能:该值yes启用密码身份验证;no该值禁用密码身份验证。SSH协议会对所有流量进行加密,因此密码本身会安全地传输到服务器。服务器上的 sshd 守护进程会解密接收到的密码。然后,PAM 模块计算哈希值并将其与配置文件中的条目进行匹配/etc/shadow
 

密码存在几个明显的缺点。


密码可以被暴力破解。用户通常会选择容易记住的密码——通常使用常用单词或数字组合。攻击者使用专门的字典和暴力破解攻击。他们很容易就能破解使用弱密码的账户。

复杂且独特的密码难以记忆。安全建议要求使用由随机字符组成的长密码。然而,人们不可能记住很多毫无意义的字符串。因此,明文密码被使用,存储在不安全的地方,甚至就放在显眼的地方。它们也容易丢失。

在多个服务上使用相同的密码是一种危险但常见的做法。一个资源上的密码一旦泄露——无论是通过数据库泄露还是网络钓鱼——都会自动使其他使用相同密码的账户面临攻击风险。这对于服务器尤其重要——在系统中重复使用管理员面板密码或电子邮件密码,即使是最小的漏洞,也会让攻击者有机可乘。

密码可以在客户端被获取或拦截。密码是用户知道的秘密,他们必须手动输入。密码可能被他人窥视、被键盘记录器或病毒窃取。

跨多个服务器管理密码并非易事。对于数十台机器,管理员需要维护一个包含各种复杂密码的列表,定期更改密码,监控密码过期日期等等。这种复杂性既不方便又容易出错。除非启用双因素身份验证,否则一个密码泄露就可能导致整个系统安全受到威胁。

在现代系统中,密码验证被认为是安全性最低的选项,需要采取额外的安全措施,例如使用密码管理器、实施复杂度策略以及启用双因素身份验证。
 

SSH 身份验证:它是什么以及 SSH 密钥的工作原理


SSH(安全外壳协议)是一种用于安全远程系统访问的网络协议。它的名称意为“安全外壳”。该协议为连接双方提供加密和身份验证。SSH 允许您连接到远程服务器,并在终端中执行命令,就像在同一台机器上使用本地连接一样。

它采用客户端-服务器模型:远程主机必须运行一个 SSH 守护进程(服务sshd),该守护进程监听网络端口(默认为 8080 22),并等待传入​​的连接。在用户端,使用 SSH 客户端——一个用于发起连接、进行身份验证以及加密和解密数据的程序。OpenSSH是Linux 上最流行的 SSH 实现。在基于 Debian 的发行版中,OpenSSH 客户端已经包含在内。要部署服务器端,只需安装相应的软件包openssh-server——该服务将自动启动并接受传入的 SSH 连接。服务器配置存储在一个文件中/etc/ssh/sshd_config,该文件指定身份验证参数、加密协议和其他设置。

要通过 SSH 连接,用户需要输入如下命令:
 

ssh <user>@<host>


接下来,用户需要进行身份验证——可以通过密码或密钥。我们已经讨论过第一种方法,并指出了它的不足之处。第二种方法——使用 SSH 密钥进行身份验证——允许用户无需输入密码即可访问服务器,它使用预先创建的一对关联的加密密钥:私钥和公钥。SSH密钥基于非对称加密原理。私钥用于加密数据,只有关联的公钥才能执行反向转换。密钥的名称也表明了它们的用途。
 

私钥存储在用户的本地计算机上,不会被泄露,也绝不会以任何形式通过网络传输。

公钥则不是秘密,可以自由地通过网络传输——它会被复制到目标服务器,通常保存在服务器上用户主目录下的一个特殊文件中~/.ssh/authorized_keys


通过 SSH 连接时,服务器会向客户端发送一个随机字符串(挑战码),客户端使用私钥对该字符串进行签名并发送回服务器。服务器使用公钥验证签名。如果签名正确,则授予访问权限;否则,拒绝访问。这样,无需通过网络传输任何敏感数据即可确认私钥的所有权。完全不需要密码。
建议每个管理员或进程维护自己的密钥对。authorized_keys可以将多个公钥存储在服务器上的一个文件中,每个获得访问权限的用户对应一个公钥。这样,如果某个密钥泄露,只需撤销该密钥,其余密钥不受影响。

如有必要,可以为 SSH 密钥添加额外的安全措施。例如,可以将登录访问权限限制在特定的 IP 地址。

为什么 SSH 密钥比密码更好?


以下是支持使用密钥的主要论点。
 

防盗


一个 8-10 个字符的密码相对容易被破解。破解方法通常是暴力破解或使用字典,尤其是在密码比较常见的情况下。而 SSH 密钥则是由数百个随机字符组成的序列,长度通常为 2048 或 4096 位。这种密钥的长度和熵值比最复杂的密码都要高出几个数量级。

即使使用当今最强大的计算机,也无法对所有可能的 SSH 密钥进行完整的暴力破解搜索。事实上,这样的任务需要数百万年的计算时间。因此,用密钥代替基于密码的登录方式,彻底杜绝了这种服务器入侵方式的可能性。大量通过 SSH 不断攻击服务器的僵尸程序将束手无策——密钥无法被暴力破解,它们甚至连尝试猜测密码的机会都没有。
 

私钥保密性


SSH 密钥的一个显著优势在于,私钥永远不会离开用户的计算机,也不会在网络上传输。因此,通过网络窃取私钥是不可能的。即使拦截了加密的 SSH 流量,攻击者也无法获取任何关于私钥本身的有用信息。

服务器上只存储公钥,而公钥的泄露不会造成任何安全风险——它仅用于验证质询和响应。这就像“门上的锁”——没有私钥就无法打开。尽管 SSH 对连接进行了加密,但使用密码进行客户端攻击仍然可能,例如键盘记录器或简单的窃听。
 

抵御服务器入侵和数据泄露的能力


攻击者可以攻破存储密码哈希值的服务器——例如,通过获取 root 权限并复制文件/etc/shadow。然后,他们可以尝试离线破解密码,方法是尝试不同的密码组合并比较生成的哈希值。但对于使用密钥的系统来说,这种攻击毫无意义:服务器上既不存在可暴力破解的秘密信息,也不存在私钥。

攻破一台服务器并不能让攻击者获得直接访问用户其他节点的工具。私钥并非集中存储,因此不会与其他用户的数据一起泄露。所以,密码数据库泄露或密码重用(重用攻击)对使用密钥登录的系统构不成威胁。
 

消除人为因素


密钥无需记忆,也不会因为用户疏忽而选择“过于简单”的密钥。用户无法像创建弱密码(例如“12345”)那样设置一个简单的 SSH 密钥。这消除了使用容易被猜到或强度不足的密钥组合的风险。
 

便捷性、灵活性和自动化


使用 SSH 密钥,您可以使用单个密钥对访问多个服务器(或者为不同的机器组生成单独的密钥对)。这比为每个资源管理多个唯一密码要方便得多。您无需每次连接时都输入密码:身份验证会自动完成。

在频繁连接或使用自动化脚本和编排系统时,这种便利性尤为显著。例如,Ansible 和 Terraform 都使用密钥来访问服务器,无需人工干预。这种方法比将密码存储在明文脚本中更安全。

这种便利性的另一个优点是,当员工离职时,您只需从所有服务器中删除其公钥,而无需费力地更改多个密码。
 

概念优势:拥有与知识


从安全理论的角度来看,密码是基于知识的秘密,而密钥是基于持有的秘密。密钥被认为更安全:要破解密钥,攻击者需要获取密钥本身——即私钥文件。而密码则可能被远程获取、拦截或破解。

当然,理想的解决方案是多种方法的结合。例如,您可以将私钥存储在硬件令牌上,并结合PIN码或一次性代码。然而,在“密码还是密钥”的选择中,密钥在各方面都更胜一筹。
 

正确使用 SSH 密钥认证几乎可以完全避免密码的缺点。SSH 密钥无疑更加安全,也更适合远程办公。唯一的不足之处在于,初始设置对新手来说可能比较复杂。你需要生成密钥,并学习密钥的存储位置和使用方法。不过,有一些工具和最佳实践可以简化密钥管理,使其更加集中化。


密码仍然流行的原因有两个。首先,它们看起来更简单。其次,这是历史事实。然而,就系统安全性而言,密码远逊于加密密钥。后者如果管理得当,可以消除主要的攻击途径——猜测或窃取密码——从而显著提高基础设施的整体安全性。

令人失望的统计数据


信息安全事件统计数据再次证实了密码作为安全措施的脆弱性。据Selectel安全专家的数据显示,

首次暴力破解攻击通常在新部署的服务器连接到网络后的10-15分钟内发生。随后的攻击会持续不断地扫描机器,寻找开放的SSH端口。

每年记录到的登录尝试次数高达数千万次。Rapid7对SSH和RDP蜜罐进行了一项研究,并提供了2021-2022年的数据。研究识别出了超过21.6万个不同的攻击者IP地址和超过51.2万个用于这些攻击的密码。绝大多数密码都很常见,甚至被整理成特殊的密码字典。排名前五的密码分别是:123456、nproc、test、qwerty和password——这些密码显然很弱。

收集到的数据表明,攻击者依赖于简单或默认密码,而且他们往往能够成功。

2022 年 81% 的账户泄露事件是由弱密码、重复使用密码或被盗密码造成的。换句话说,十起成功的系统攻击中,有八起都以某种方式利用了密码漏洞。这些攻击可能包括网络钓鱼攻击、密码数据库泄露、暴力破解攻击,或使用从其他服务窃取的密码。三分之二的云服务攻击都涉及易受攻击的凭证——这是另一个令人担忧的迹象。原因相同——密码缺失或弱密码,谷歌云2023 年下半年的数据也证实了这一点。密码仍然是攻击者在发起攻击之前获得初始访问权限的“薄弱环节”。 所有数据都清楚地表明,仅仅依赖密码保护是极其危险的。对于始终在线且经常成为攻击目标的服务器而言,安全尤为重要。然而,如果遵循以下基本规则,仅使用密钥进行 SSH 攻击几乎不存在:



 

  • 复杂的密钥和现代算法,
  • 私钥保护,
  • 禁用密码登录。


攻击统计数据证实,改用加密密钥认证可以显著降低被黑客攻击的可能性。

设置 SSH 密钥访问


在基于 Debian 的发行版中,OpenSSH 服务器默认支持基于密钥的身份验证(该指令PubkeyAuthentication yes已启用)。要设置基于 SSH 密钥的登录,您需要生成一个密钥并将公钥安装到服务器上。一般步骤如下:

1. 在客户端生成密钥对。在用于执行访问的本地计算机的用户终端中,运行密钥生成命令。例如,对于 ED25519 密钥(OpenSSH 的默认值是 RSA 3072 位,但在此示例中我们使用更安全的算法),命令如下:
 

ssh-keygen -t ed25519 -C


默认情况下,系统会建议一个保存路径~/.ssh/id_ed25519。您可以通过指定相对于您主目录的路径来更改它,例如:
 

Enter file in which to save the key (/home/alex/.ssh/id_ed25519): .ssh/my_key


您还可以选择输入密码短语来保护密钥。命令完成后,将出现两个文件:私钥和公钥~/.ssh/my_key

. 将公钥安装到服务器上。~/.ssh/my_key.pub如果密码登录仍然可用,最简单的方法是使用 ssh-copy-id 工具。默认情况下,该工具会尝试复制找到的第一个密钥,通常是。如果存在多个密钥,则需要指定要使用的密钥。让我们复制示例中的密钥。

~/.ssh/id_rsa.pub~/.ssh/id_ed25519.pubmy_key.pu


该工具会要求用户输入当前服务器密码,然后自动将内容复制my_key.pub到服务器上的一个文件中如果目录.ssh或文件authorized_keys不存在,它将被创建。

您也可以手动复制公钥。为此,请将其保存到服务器上的合适位置,然后将其添加到内容中~/.ssh/authorized_keys。例如,您可以使用scp(安全复制)工具:
cat ~/my_key.pub >> ~/.ssh/authorized_keys


当然,要执行此类操作,用户必须拥有服务器访问权限和相应的权限。

3. 测试密钥登录。让我们尝试使用密钥连接到服务器,以检查 SSH 功能:


首次连接时,服务器会要求您确认其密钥指纹。这是正常现象;请输入“yes”并按回车键。如果私钥受附加密码保护,系统会提示您输入密码。之后,您应该已登录到远程系统;终端中的提示符会发生变化。您也可以随时输入“execute” hostname;它始终会显示当前主机名。

4. 禁用密码验证(推荐)。一旦您成功实现了基于密钥的登录,请禁用基于密码的登录。这将消除密码验证的缺点,并带来基于密钥验证的所有优点。编辑服务器上的 SSH 配置文件/etc/ssh/sshd_config
 

在禁用密码之前,请务必确认密钥登录功能正常。否则,您将只能通过 KVM 控制台或救援模式恢复对服务器的访问权限。


更改参数PasswordAuthentication——其值应变为no。确保ChallengeResponseAuthentication负责旧版身份验证的选项也已禁用keyboard-interactive。要使更改生效,请重启 SSH 服务:
 

sudo systemctl restart ssh

服务器重启后将停止接受密码登录。现在仅支持密钥登录。

使用该工具创建密钥对时ssh-keygen,除非已更改默认路径,否则密钥对将保存在以下目录中~/.ssh
  • id_rsa或者id_ed25519- 私钥(默认名称取决于所使用的算法);
  • id_rsa.pub或者id_ed25519.pub- 公钥。


建议保护这些文件免受未经授权的访问。目录~/.ssh必须具有相应的权限700,私钥也必须具有相应的权限600(只有所有者才能读写)。如果权限配置不正确,SSH 服务器可能会出于安全原因拒绝基于密钥的登录。

通常的做法是在创建私钥时为其设置密码。这将确保私钥以加密形式存储。要使用该密钥,您需要输入密码。即使文件或整个设备被盗,这也能保护私钥的安全。

为了避免每次都输入密码,您可以使用 ssh-agent 工具——每个会话只需输入一次密码即可。
 

ssh-add ~/.ssh/my_key


上述措施显著提高了远程访问的安全性。现在,身份验证不再依赖于容易猜测的密码,而是基于私钥——一种几乎不可能被猜测或伪造的加密证明。

我并非暗示什么,但是……

它是一项云服务,为登录名、密码、SSH 密钥、API 密钥等提供了一个安全可靠的单一存储位置。

所有添加的密钥都使用 AES-256-GCM 等强加密算法进行加密。只有授权用户(即账户所有者)才能访问此存储。与存储的数据交换使用 TLS 加密,从而防止在使用 API 或 Web 界面时被拦截。因此,存储在 Secrets Manager 中的私钥在基础架构层面得到了加密和保护。Secrets

Manager 与 Selectel 项目系统集成。您可以创建多个用户和项目,并为特定项目分配角色和访问权限。这使您可以限制对特定项目的访问,从而消除不必要的权限。

所有密钥操作都会被记录——完整的操作历史记录可用于审计,从而增强控制和可追溯性。您可以查看谁在何时检索或修改了密钥。
这意味着可以将密钥自动集成到自定义应用程序和基础架构场景中。例如,与其在 CI/CD 脚本中存储 SSH 密钥,不如在部署期间通过 API 从密钥管理器请求密钥——密钥以加密形式传输,并可立即用于集成。此外,密钥不会存储在开发人员的磁盘或代码库中——它始终仅存在于安全存储和应用程序内存中,并在使用时保留。

密钥管理器可以安全地保护各种数据:密码、数据库管理系统 (DBMS) 凭据、TLS 证书、私钥等等。这种集中管理所有项目密钥的方式解决了许多问题。例如,SSH 密钥用于连接服务器,而密码用于连接数据库。密钥和密码都存储在密钥管理器中。因此,管理员无需将关键密钥保存在电脑或记事本中——所有密钥都安全存储。这是一种符合安全建议的现代化敏感数据管理方法:

  • 不要以明文形式将密码和密钥存储在代码中。
  • 尽量减少秘密在人与人之间以及系统之间的传播。
  • 从单一中心控制访问权限。


与 SSH 密钥配合使用时,密钥管理器可提供最安全的解决方案:密钥会被安全地存储,并且仅在请求时以加密形式传输。即使攻击者获得了对您基础设施的有限访问权限,他们也很难提取私钥,因为私钥存储在独立的加密库中。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐