linux - 使用硬件 token 登录

标签 linux pam pkcs#11

我是密码学的新手,正在研究 PKI 和 PKCS 等。我了解 PKI 的基本概念以及如何使用它进行加密/解密。然而,我对如何使用 USB token 或智能卡等硬件 token 来安全登录计算机感到困惑。以下是我理解的步骤以及我感到困惑的部分(提前对问题的长度表示抱歉):

场景:网络上的计算机 xyz 包含只有属于 SECRET 组的用户才能访问的数据。用户 Bob 和 Joe 属于该组,并且已获得 USB token ,他们可以使用这些 token 来提供使他们能够访问这些资源的凭据。 USB token 采用双因素身份验证,需要输入 PIN 码。该 token 符合 PKCS11。

  1. Bob 将 USB token 插入 Linux 机器
  2. PAM-PKCS11 模块识别此事件并提示 Bob 输入他的 pin。
  3. 一旦 Bob 正确输入了他的 4 位 PIN,该模块将通过检查 Bob token 上证书的有效性(这有所不同,但最低限度是多少?):
    • 找到根证书以检查受信任的 CA
    • 检查证书有效期和吊销列表
    • 将 token 上的 ID 与用户文件(在哪里?,缺少一个步骤) 或目录(LDAP 等)进行匹配
  4. 如果一切正常,模块会通知 PAM 成功的结果。
  5. 此行标记为足够,因此 PAM 接受身份验证并且 Bob 已登录并可以查看仅限于 SECRET 组用户的信息。

我缺少的部分是有关 Bob 是否可以访问这台机器以及他与网络(甚至桌面)用户 Bob 的关联程度的信息存储在哪里。我了解有关 Bob 的其他识别数据将存储在 USB 上,包括 ID(例如,电子邮件地址)。然而,这种强大的安全性如何?如果有的话,在登录过程中在哪里使用加密(或者这不是这些 token 的真正目的)?如果有人拿到 USB 并知道 4 位数的 PIN 码,这似乎就是所需要的,对吧?此外,对 CA 的信任本质上是否允许相信另一个用户无法获得新的 USB token 并使用受信任的 CA 获得新证书但指定所有识别数据与 Bob 的相同?我知道我遗漏了一些关键部分……但是在阅读了数十篇文章之后,对这方面的解释似乎被掩盖了。使用硬件 token 作为验证登录包含敏感数据的机器的充分手段是个好主意吗?还是此类 token 的主要目的是安全地存储在其他应用程序中使用的 key 对?感谢您的帮助!

最佳答案

PAM(顾名思义)仅处理身份验证。身份验证是关于证明用户是谁,即“向我证明你所说的你是谁。”这与授权是分开的,即“您有权访问此资源吗?”。

身份验证包括三个方面:
1.我知道
2. 我有
3. 我是

典型的用户名/密码组合属于 1。 token 或其他 PKCS 设备属于 2,而虹膜识别或指纹读取等生物识别技术属于 3。

您在安全方面拥有的这些方面越多,安全性就越好/越严格。在这种情况下,登录符合 1 和 2,因此比仅用户名和密码更安全。如果有人要从他身上取下他的密码并偷走他的设备,那么是的,它不会证明是鲍勃在使用它。但是,如果 Bob 将他的用户名和密码提供给其他人,也不会发生这种情况。

token 的要点是引入“拥有”某物的第二个因素,您还需要 PIN 意味着还需要“知道”某物。这样系统就可以更加确信这个人就是他们声称的那个人。

您所指的缺失部分是授权,如前所述,这是一个单独的身份验证过程,仅在用户对自己进行身份验证后才会发生。在这种情况下,PAM 已经对 Bob 进行了身份验证,并向操作系统提供了 Bob 确实在使用该系统的确认信息。但是,操作系统随后必须在步骤 5 中执行一些其他检查,以确认 Bob 可以访问该资源。

关于linux - 使用硬件 token 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/804676/

相关文章:

java - 在线Gitlab ci上安装Java

r - PAM 聚类 - 使用另一个数据集中的结果

authentication - 如何在Kubernetes集群上为jupyterhub设置PAM身份验证?

linux - 在 Linux 中使用 PAM 进行身份验证。为什么某些用户可能无法运行?

c - 如何使用 perf_event_open 以恒定速率采样?

Ruby/PG - 无法连接到 PostgreSQL

linux - 先前命令执行的退出代码始终为 0——在远程 Shell 执行中 $?

c - 为什么 C_GenerateKeyPair 返回错误 (PKCS#11)?

c# - C# 中 PKCS11Interop 库的线程安全使用

c - 在 PKCS#11 中使用 key 对象句柄