Yubico PAM 模块提供了一种将 YubiKey 集成到现有用户身份验证基础设施中的简单方法。 GNU/Linux、Solaris 和 Mac OS X 以及其他专用应用程序(例如 NCSA MyProxy)使用 PAM 进行用户身份验证。
该模块适用于多用户系统。主要操作模式是使用 YubiKey 验证服务(例如 YubiCloud 或使用“urllist”参数配置的私有服务)进行在线验证。
在 2.6 版本中,还可以通过使用 YubiKey 2.2 及更高版本中的 HMAC-SHA1 质询-响应来实现离线验证。这引入了 ykpersonalize 包中 libykpers-1 的依赖项。通过--without-cr
进行configure
以避免这种依赖性。
开发社区通过 GitHub 项目页面进行协调。
该项目是根据 BSD 许可证获得许可的。请参阅文件 COPYING 了解确切的措辞。对于此包中指定为 YYYY-ZZZZ 的任何版权年份范围,请注意该范围指定该闭合间隔中的每个年份。
如果您使用的是官方打包版本,请跳至下一部分。
您可以通过以下命令使用 Git 查看源代码:
$ git 克隆 https://github.com/Yubico/yubico-pam.git
这将创建目录yubico-pam
。
必须安装 Autoconf、automake、libtool、asciidoc、xsltproc 和 docbook-xsl 才能创建可编译的源代码树。
使用以下命令生成构建系统:
$ cd yubico-pam $ autoreconf --安装
您需要安装 libykclient(ykclient.h、libykclient.so)和 libpam-dev(security/pam_appl.h、libpam.so)。它又需要您需要安装的 cURL 和 libyubikey。
质询-响应离线身份验证需要来自 yubikey-personalization 项目的 libykpers-1:
自测试需要安装了 Net::LDAP::Server 模块的 perl。
构建系统使用 Autoconf 来设置构建系统运行:
./配置
使用 --without-ldap 禁用 ldap 支持。
然后构建代码,运行自测试并安装二进制文件:
进行检查安装
Fedora/EPEL 中已经有 yubico-pam 的包,可以使用 yum 安装:
$ sudo yum install pam_yubico
yubico-pam 有一个 Ubuntu PPA(个人包存档),可以在相当现代的 Ubuntu 平台上使用以下命令进行安装:
$ sudo add-apt-repository ppa:yubico/stable $ sudo apt-get 更新 $ sudo apt-get install libpam-yubico
安装后请参阅文件/usr/share/doc/libpam-yubico/README.Debian
。
yubico-pam 和支持的 Yubico 软件包有相应的 FreeBSD 端口。安装:
$ cd /usr/ports/security/pam_yubico $ 使安装干净
高级配置说明可在此处获取。
通过在/etc/pam.d/
中的相应文件中添加一行来将其安装到您的 PAM 设置中:
验证足够 pam_yubico.so id=[您的 API 客户端 ID] 调试
并将 pam_yubico.so 移至 /lib/security/ (或系统中 PAM 模块所在的任何位置):
mv /usr/local/lib/security/pam_yubico.so /lib/security/
有关更多信息,请参阅项目文档。
支持的 PAM 模块参数有:
授权文件 | 指示保存 YubiKey 令牌 ID 到用户名的映射的文件的位置。 |
ID | 您在 Yubico 验证服务器中的 API 客户端 ID。如果您想使用默认的 YubiCloud 服务,请转到此处。 |
钥匙 | 以 base64 格式指示您的客户端密钥。客户端密钥也称为 API 密钥,它提供客户端(您)和验证服务器之间通信的完整性。如果您想获得一个与默认 YubiCloud 服务一起使用的产品,请转到此处。 |
调试 | 启用调试输出。 |
调试文件 | 要写入调试的文件名,文件必须存在并且是常规文件。标准输出是默认值。 |
总是好 | 使所有身份验证尝试都能成功(也称为演示模式)。 |
尝试首先通过 | 在提示用户输入密码之前,模块首先尝试之前堆叠的模块的密码,以防也满足该模块的要求。 |
使用第一遍 | 参数 use_first_pass 强制模块使用先前堆叠的模块密码,并且永远不会提示用户 - 如果没有可用的密码或密码不合适,用户将被拒绝访问。 |
总是提示 | 如果设置,则不要尝试进行查找来确定用户是否配置了 YubiKey,而是无论如何都会提示输入。这在启用 ldap_bind_as_user 但该模块用于读取用户密码的情况下非常有用(在 YubiKey+OTP 身份验证场景中)。 |
努洛克 | 如果设置,当授权映射文件或 LDAP 中没有为用户声明令牌时,不会失败。这可用于使 YubiKey 身份验证可选,除非用户具有关联的令牌。 |
ldap_starttls | 如果设置,请在尝试绑定到 LDAP 连接之前向 LDAP 连接发出 STARTTLS 命令。这是仅侦听端口 389 但仍需要 TLS 的服务器的常见设置。 |
ldap_bind_as_user | 如果设置,则使用登录的用户绑定到 LDAP。这将使用用户通过 PAM 提供的密码。如果设置了此项,则还必须设置 ldapdn 和 uid_attr。启用此功能将导致“ldap_bind_user”和“ldap_bind_password”被忽略 |
网址列表 | 要使用的 URL 模板列表。这是通过调用 ykclient_set_url_bases 设置的。该列表的格式应为: |
网址 | 不应使用此选项,请改用 urllist 选项。指定要使用的 URL 模板,这是通过调用 yubikey_client_set_url_template 设置的,默认为: |
卡帕斯 | 指定X509证书的存储路径。如果“url”和“ldap_uri”中分别使用“https”或“ldaps”,则这是必需的。 |
凯福 | 允许使用 CA 捆绑包而不是路径的选项。 |
代理人 | 指定连接到验证服务器的代理。有效方案为 http://、https://、socks4://、socks4a://、socks5:// 或ocks5h://。 Socks5h 要求代理进行 dns 解析。如果未指定方案或端口,则将使用 HTTP 代理端口 1080。 |
详细_otp | 该参数用于在输入时显示 OTP(一次性密码),即启用输入字符的终端回显。如果您使用双因素身份验证,建议您不要使用此选项,因为这会在屏幕上显示您的密码。这需要使用PAM模块的服务来显示自定义字段。此选项不能与 OpenSSH 一起使用。 |
ldap_uri | 指定 LDAP 服务器 URI(例如 ldap://localhost)。 |
LDAP服务器 | 指定 LDAP 服务器主机(使用默认 LDAP 端口)。已弃用。请改用“ldap_uri”。 |
LDAPDN | 指定存储用户的 dn(例如:ou=users,dc=domain,dc=com)。 |
ldap_clientcertfile | 与 LDAP 服务器通信时使用的客户端证书文件的路径。请注意,这还需要设置“ldap_clientkeyfile”。 |
ldap_client密钥文件 | 与 LDAP 服务器通信时与客户端证书一起使用的密钥的路径。请注意,这还需要设置“ldap_clientcertfile”。 |
ldap_bind_user | 尝试 LDAP 绑定的用户。 |
ldap_bind_password | 用于 LDAP 绑定的密码。 |
ldap_过滤器 | 用于尝试在 LDAP 中查找正确对象的 LDAP 过滤器。在此字符串中, |
ldap_cacert文件 | 用于 LDAP 连接的 CA 证书文件。 |
用户属性 | 指定用于存储用户名的 LDAP 属性(例如:cn)。 |
yubi_attr | 指定用于存储 YubiKey ID 的 LDAP 属性。 |
yubi_attr_前缀 | 指定 LDAP 属性值的前缀(如果是通用属性),用于存储多种类型的 ID。 |
令牌 ID 长度 | OTP 前缀的 ID 长度(如果使用 YubiCloud,则为 12)。 |
模式 | 运作方式。使用“客户端”通过 YubiKey 验证服务(例如 YubiCloud)进行在线验证,或者使用具有 HMAC-SHA-1 挑战-响应配置的 YubiKeys 使用“挑战-响应”进行离线验证。有关如何配置离线质询-响应验证的更多详细信息,请参阅手册页 ykpamcfg(1)。 |
chalresp_路径 | 在系统范围配置的情况下用于存储质询文件的目录(与存储在用户主目录中的质询文件相反)。该位置只能由 root 读写。有关此类设置的更多信息,请参阅 |
mysql_服务器 | 用于映射的 mysql 服务器的主机名/地址。 |
mysql_端口 | mysql服务器的网络端口。 |
mysql_用户 | 访问mysql数据库的用户。 |
mysql_密码 | mysql 用户的密码。 |
mysql_数据库 | 要使用的 mysql 数据库。 |
如果您使用“调试”,您可能会发现创建一个世界可写的日志文件很有用:
touch /var/run/pam-debug.log
chmod go+w /var/run/pam-debug.log
笔记 | 请记住,对系统的物理访问通常可以规避安全控制。如果攻击者可以物理访问您的系统(例如留在酒店房间的笔记本电脑)并且可以启动到单用户模式,他们可以在您的系统配置中禁用 yubico-pam。 |
必须在 YubiKey 令牌 ID 和它所附加的用户 ID 之间建立映射。有两种方法可以执行此操作,一种是集中在一个文件中,另一种是单独地,用户可以在其主目录中创建映射。如果正在使用中央授权映射文件,则不会使用用户主目录映射,反之亦然,如果正在使用用户主目录映射,则不会使用中央授权映射文件。
创建/etc/yubikey_mappings
,该文件必须包含您想要允许使用 YubiKey 进入系统的每个用户的用户名和 YubiKey 令牌 ID,并用冒号分隔(与 passwd 文件的格式相同)。
映射应该如下所示,每行一个:
<第一个用户名>:: :...。 <第二个用户名>: : :...。
现在将authfile=/etc/yubikey_mappings
添加到 PAM 配置行,如下所示:
auth 足够 pam_yubico.so id=[您的 API 客户端 ID] authfile=/etc/yubikey_mappings
每个用户在其主目录中创建一个~/.yubico/authorized_yubikeys
文件并将映射放置在该文件中,该文件必须只有一行:
<用户名>::
这与 SSHauthorized_keys 文件的概念非常相似。
您可以通过多种方式获取 YubiKey 令牌 ID。一种方法是删除使用 YubiKey 生成的任何 OTP(一次性密码)的最后 32 个字符。另一种方法是使用 modhex 计算器。
输入您的 YubiKey OTP 并进行转换,您的 YubiKey 令牌 ID 为 12 个字符,列出为:
Modhex 编码: XXXXXXX
不确定最后一点是什么意思?以下是获取 OTP 副本的方法。
打开终端
按下 YubiKey 的按钮,它会将 OTP 输出到 shell 中:
$ cccccccgklgcvnkcvnnegrnhgrjkhlkfhdkclfncvlgj
bash: cccccccgklgcvnkcvnnegrnhgrjkhlkfhdkclfncvlgj: command not found
可以将其粘贴到 Modhex_Calculator 页面中。
这要求您启用 pam 模块并打开“调试”。当提示输入 YubiKey 时,请按按钮。 pam 模块会将调试信息(包括 OTP 和令牌 ID)打印到 shell - 将 ID 复制到配置文件中,然后您就可以开始运行了。
“youruser”的 YubiKey: [pam_yubico.c:pam_sm_authenticate(867)] 转换返回 44 个字节 [pam_yubico.c:pam_sm_authenticate(885)] 跳过前 0 个字节。长度为 44,token_id 设置为 12,令牌 OTP 始终为 32。 [pam_yubico.c:pam_sm_authenticate(892)] OTP:ccccccclabcabkhbdncicglfltnukadfoifadfhhhhfe ID:ccccccclabcab
在强制模式(Fedora 17+ 上的默认模式)下使用 SELinux 的用户可能会遇到服务登录问题,包括通过 polkit-agent-helper-1、sshd 和登录验证的服务。
这在 Red Hat bugzilla 中有记录,包括 ssh 的解决方法(可以为其他服务创建等效文件)。处于“宽容”模式的系统将生成 AVC 警告,但身份验证将成功。
要确定您是否强制执行 SELinux,请运行sestatus
命令。
如果您想在 Linux 控制台登录时使用 YubiKey 进行身份验证,请将以下内容添加到/etc/pam.d/login
的顶部:
验证足够 pam_yubico.so id=[您的 API 客户端 ID] 调试
请参阅 Michael Ludvig 的示例 Active Directory 架构扩展,了解 YubiKey 公共 ID 属性存储/与特定用户帐户的关联:https://github.com/mludvig/yubikey-ldap/tree/master/microsoft-schema
创建文件“/etc/pam.d/openvpn”:
需要身份验证 pam_yubico.so ldap_uri=ldap://contoso.com debug id=[您的 API ID] yubi_attr=YubiKeyID ldapdn=DC=contoso,DC=com ldap_filter=(&(sAMAccountName=%u)(objectClass=user)(memberOf=CN=somegroup,DC=contoso,DC=com)) [ldap_bind_user=CN=binduser、OU=服务帐户、DC=contoso、DC=com] ldap_bind_password=bind_password try_first_pass 需要帐户 pam_yubico.so
创建文件“openvpn.conf”
插件 openvpn-plugin-auth-pam.so openvpn