如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

简单的密码不安全,复杂的密码则难以记住。 这就是为什么它们经常被贴在键盘下方或显示器上的便签上。 为了确保密码留在“健忘”用户的脑海中,并且不会失去保护的可靠性,采用了双因素身份验证 (2FA)。

由于拥有设备和了解其 PIN 码相结合,PIN 码本身可以更简单、更容易记住。 PIN 长度或随机性方面的缺点被实际拥有要求和 PIN 暴力破解限制所抵消。

此外,政府机构也希望一切都按照 GOST 进行。 我们将讨论登录 Linux 的 2FA 选项。 我将从远处开始。

PAM模块

可插入身份验证模块 (PAM) 是具有标准 API 和应用程序中各种身份验证机制实现的模块。
所有可与 PAM 配合使用的实用程序和应用程序都会选择它们并使用它们进行用户身份验证。
实际上,它的工作原理如下:登录命令调用 PAM,PAM 使用配置文件中指定的模块执行所有必要的检查,并将结果返回给登录命令。

librtpam

Aktiv公司开发的模块根据国内密码学的最新标准,使用非对称密钥添加了使用智能卡或USB令牌的用户的双因素身份验证。

我们来看一下它的工作原理:

  • 令牌存储用户的证书及其私钥;
  • 该证书作为受信任保存在用户的主目录中。

身份验证过程如下:

  1. Rutoken 搜索用户的个人证书。
  2. 请求令牌 PIN。
  3. 随机数据直接在 Rutoken 芯片中的私钥上签名。
  4. 使用用户证书中的公钥验证生成的签名。
  5. 模块将签名验证结果返回给调用应用程序。

您可以使用 GOST R 34.10-2012 密钥(长度 256 或 512 位)或过时的 GOST R 34.10-2001 进行身份验证。

您不必担心密钥的安全性 - 它们直接在 Rutoken 中生成,并且在加密操作期间永远不会离开其内存。

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

Rutoken EDS 2.0 通过了 FSB 和 FSTEC 根据 NDV 4 的认证,因此它可以用于处理机密信息的信息系统。

实际使用

几乎任何现代 Linux 都可以,例如我们将使用 xUbuntu 18.10。

1)安装必要的包

sudo apt-get install libccid pcscd opensc
如果您想添加带有屏幕保护程序的桌面锁,请另外安装该软件包 libpam-pkcs11.

2) 添加具有GOST支持的PAM模块

从以下位置加载库 https://download.rutoken.ru/Rutoken/PAM/
将PAM文件夹librtpam.so.1.0.0的内容复制到系统文件夹
/usr/lib/ или /usr/lib/x86_64-linux-gnu/или /usr/lib64

3)安装librtpkcs11ecp.so包

从以下链接下载并安装 DEB 或 RPM 包: https://www.rutoken.ru/support/download/pkcs/

4) 检查Rutoken EDS 2.0在系统中是否正常运行

在终端中我们执行
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
如果你看到这条线 Rutoken ECP <no label> - 这意味着一切都好。

5)阅读证书

检查设备是否有证书
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O
如果在该行之后:
Using slot 0 with a present token (0x0)

  • 显示信息 关于密钥和证书,您需要读取证书并将其保存到磁盘。 为此,请运行以下命令,其中您需要替换您在上一个命令的输出中看到的证书 ID,而不是 {id}:
    $ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -r -y cert --id {id} --output-file cert.crt
    如果已创建 cert.crt 文件,请继续执行步骤 6)。
  • 什么都没有,则设备为空。 请联系您的管理员或按照下一步操作自行创建密钥和证书。

5.1) 创建测试证书

注意力! 所描述的创建密钥和证书的方法适合测试,不适用于战斗模式。 为此,您需要使用由组织受信任的证书颁发机构或认可的证书颁发机构颁发的密钥和证书。
PAM 模块旨在保护本地计算机,并设计用于小型组织。 由于用户较少,管理员可以监控证书吊销情况,手动封禁账户,以及证书有效期。 PAM 模块尚不知道如何使用 CRL 验证证书并构建信任链。

最简单的方法(通过浏览器)

要获取测试证书,请使用 网络服务“Rutoken 注册中心”。 该过程不会超过 5 分钟。

极客的方式(通过控制台,可能还有编译器)

检查 OpenSC 版本
$ opensc-tool --version
如果版本低于0.20,则更新或构建 支持 GOST-11 的 pkcs2012-tool 分支 来自我们的 GitHub(在本文发表时,版本 0.20 尚未发布)或来自主 OpenSC 项目的 master 分支 提交 8cf1e6f

使用以下参数生成密钥对:
--key-type: GOSTR3410-2012-512:А (ГОСТ-2012 512 бит c парамсетом А), GOSTR3410-2012-256:A (ГОСТ-2012 256 бит с парамсетом A)

--id: 对象标识符 (CKA_ID) 作为 ASCII 表中的两位十六进制字符编号。 仅对可打印字符使用 ASCII 代码,因为... id 需要作为字符串传递给 OpenSSL。 例如,ASCII码“3132”对应字符串“12”。 为了方便起见,您可以使用 将字符串转换为 ASCII 代码的在线服务.

$ ./pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-512:A -l --id 3132

接下来我们将创建一个证书。 下面将介绍两种方式:第一种是通过 CA(我们将使用测试 CA),第二种是自签名。 为此,您首先需要安装并配置 OpenSSL 版本 1.1 或更高版本,以便使用手册通过特殊的 rtengine 模块与 Rutoken 一起使用 安装和配置 OpenSSL.
例如:对于 '--id 3132' 在 OpenSSL 中您需要指定“pkcs11:id=12«。

您可以使用测试CA的服务,其中有很多,例如, 这里, 这里 и 这里,为此我们将创建一个证书请求

另一种选择是屈服于懒惰并创建一个自签名的
$ openssl req -utf8 -new -keyform engine -key "pkcs11:id=12" -engine rtengine -out req.csr

将证书上传至设备
$ openssl req -utf8 -x509 -keyform engine -key "pkcs11:id=12" -engine rtengine -out cert.cer

6)在系统中注册证书

确保您的证书看起来像一个 base64 文件:

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

如果您的证书如下所示:

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

那么您需要将证书从DER格式转换为PEM格式(base64)

$ openssl x509 -in cert.crt -out cert.pem -inform DER -outform PEM
我们再次检查现在一切是否正常。

将证书添加到受信任证书列表中
$ mkdir ~/.eid
$ chmod 0755 ~/.eid
$ cat cert.pem >> ~/.eid/authorized_certificates
$ chmod 0644 ~/.eid/authorized_certificates

最后一行保护受信任的证书列表不被其他用户意外或故意更改。 这可以防止某人在此处添加他们的证书并能够代表您登录。

7) 设置身份验证

设置我们的 PAM 模块是完全标准的,并且与设置其他模块的方式完全相同。 创建到文件 /usr/share/pam-configs/rutoken-gost-pam 包含模块的全名、是否默认启用、模块的优先级和认证参数。
认证参数包含操作成功的要求:

  • required:此类模块必须返回肯定响应。 如果模块调用的结果包含否定响应,则会导致身份验证错误。 该请求将被删除,但其余模块将被调用。
  • Required:与 required 类似,但立即验证失败并忽略其他模块。
  • 足够:如果在该模块之前没有任何必需或足够的模块返回否定结果,则该模块将返回肯定响应。 其余模块将被忽略。
  • 可选:如果堆栈上没有必需的模块,并且没有足够的模块返回正结果,则至少有一个可选模块必须返回正结果。

完整文件内容 /usr/share/pam-configs/rutoken-gost-pam:
Name: Rutoken PAM GOST
Default: yes
Priority: 800
Auth-Type: Primary
Auth: sufficient /usr/lib/librtpam.so.1.0.0 /usr/lib/librtpkcs11ecp.so

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

保存文件,然后执行
$ sudo pam-auth-update
在出现的窗口中,在其旁边添加一个星号 Rutoken PAM GOST 并推 OK

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

8) 检查设置

要了解一切都已配置,但同时又不失去登录系统的能力,请输入命令
$ sudo login
输入你的用户名。 如果系统需要设备 PIN 码,则一切配置均正确。

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

9) 配置提取令牌时阻止计算机

包含在包装中 libpam-pkcs11 包括实用程序 pkcs11_eventmgr, 它允许您在 PKCS#11 事件发生时执行各种操作。
对于设置 pkcs11_eventmgr 作为配置文件: /etc/pam_pkcs11/pkcs11_eventmgr.conf
对于不同的 Linux 发行版,当智能卡或令牌被移除时导致帐户被锁定的命令会有所不同。 厘米。 event card_remove.
配置文件示例如下所示:

pkcs11_eventmgr
{
    # Запуск в бэкграунде
    daemon = true;
     
    # Настройка сообщений отладки
    debug = false;
 
    # Время опроса в секундах
    polling_time = 1;
 
    # Установка тайм-аута на удаление карты
    # По-умолчанию 0
    expire_time = 0;
 
    # Выбор pkcs11 библиотеки для работы с Рутокен
    pkcs11_module = usr/lib/librtpkcs11ecp.so;
 
    # Действия с картой
    # Карта вставлена:
    event card_insert {
        # Оставляем значения по умолчанию (ничего не происходит)
        on_error = ignore ;
 
        action = "/bin/false";
    }
 
    # Карта извлечена
    event card_remove {
        on_error = ignore;
         
        # Вызываем функцию блокировки экрана
        
        # Для GNOME 
        action = "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock";
        
        # Для XFCE
        # action = "xflock4";
        
        # Для Astra Linux (FLY)
        # action = "fly-wmfunc FLYWM_LOCK";
    }
 
    # Карта долгое время извлечена
    event expire_time {
        # Оставляем значения по умолчанию (ничего не происходит)
        on_error = ignore;
 
        action = "/bin/false";
    }
}

之后添加应用程序 pkcs11_eventmgr 启动。 为此,请编辑 .bash_profile 文件:
$ nano /home/<имя_пользователя>/.bash_profile
将行 pkcs11_eventmgr 添加到文件末尾并重新启动。

所描述的设置操作系统的步骤可以用作任何现代 Linux 发行版(包括国内发行版)的说明。

如何使用 PAM 模块在 Linux 中使用 Rutoken 上的 GOST-2012 密钥进行本地身份验证

结论

Linux PC 在俄罗斯政府机构中越来越受欢迎,在该操作系统中设置可靠的双因素身份验证并不总是那么容易。 我们很乐意通过本指南帮助您解决“密码问题”,并可靠地保护对您电脑的访问,而无需花费大量时间。

来源: habr.com

添加评论