十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用 pam_authelia 让 SSH 登录走 Authelia 完成双因素认证

如何用 pam_authelia 让 SSH 登录走 Authelia 完成双因素认证 如何用 pam_authelia 让 SSH 登录走 Authelia 完成双因素认证【免费下载链接】autheliaThe Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready.项目地址: https://gitcode.com/GitHub_Trending/au/authelia如果你已经在用 Authelia 做 Web 应用的单点登录想把同一套认证体系延伸到服务器的 SSH 登录上——即 SSH 用户必须通过 Authelia 的密码校验和 TOTP 二次验证才能登录——[pam_authelia] 就是为此设计的 PAM 模块。它让sshd通过 PAM 把凭据校验和双因素挑战委托给 Authelia 服务器的 HTTP API服务端不需要任何改动。本文基于 pam-authelia 集成指南 介绍完整配置路径安装模块、接线sshd、配置1FA2FA流程并验证登录另附 Device Authorization 流程的可选方案。前提条件指南原文明确列出Authelia 已经部署、运行并且能从安装pam_authelia的主机通过 HTTPS 访问。使用自签名证书时CA 证书必须可用见下文ca-cert选项你要认证的 Linux 用户在 Authelia 的认证后端中已存在并已注册 TOTP或 Duo你拥有该主机的 root 权限可以编辑/etc/pam.d/*和/etc/ssh/sshd_config并重载sshd。工作原理一次 SSH 登录的链路是这样的sshd ──▶ PAM ──▶ pam_authelia.so ──forkexec──▶ pam_authelia (Go) ──HTTPS──▶ Authelia模块由两个文件协作pam_authelia.so是加载进sshd进程的 C shim负责 PAM 交互提示和凭据的内存清零pam_authelia是 Go 辅助二进制负责所有对 Authelia 的 HTTPS 请求、解析响应、编排 2FA 流程。凭据经 stdin/stdout 管道传递Go 辅助程序只走 HTTPS、不写凭据到日志用完后清零内存。安装 pam_authelia无论用哪种安装渠道最终安装的两个文件是文件目标位置pam_authelia/usr/bin/pam_autheliapam_authelia.so/lib/security/pam_authelia.so随发行版而异主路径Debian / Ubuntu 通过 APT 安装如果你已经把 Authelia 的 APT 仓库添加到系统发布签名包含 Authelia 和pam_authelia直接安装即可sudo apt update sudo apt install pam_authelia仓库带签名并自动处理升级无需手动下载.deb。还没有添加仓库时按 Authelia 官方文档中的 APT Repository 设置步骤先添加再执行上面的命令。也可以从发布渠道下载特定版本的.deb用apt install ./file.deb安装适合锁定版本或无法访问 APT 仓库的主机。可选其他发行版用通用 tarball发布物有.deb、glibc tarball 和 musl tarball 三种覆盖amd64、arm、arm64随版本发布校验和、SBOM 和 GPG 签名。没有原生包管的 glibc 发行版下载glibctarballAlpine 下载-musl版本。以 glibc 为例命令来自指南原文file.tar.gz以发布页实际文件名替换curl -LO https://github.com/authelia/pam/releases/latest/download/pam_authelia-v0.1.0-linux-amd64.tar.gz tar -xzf pam_authelia-v0.1.0-linux-amd64.tar.gz sudo install -m 0755 pam_authelia /usr/bin/pam_authelia sudo install -m 0644 pam_authelia.so $(dirname $(find /lib /usr/lib -name pam_unix.so -print -quit))/pam_authelia.sofind | dirname那一步的作用是自动定位你发行版的 PAM 模块目录Debian 用/lib/x86_64-linux-gnu/security/Alpine 用/lib/security/Arch 用/usr/lib/security/把pam_authelia.so装到与pam_unix.so同目录。安装完成后确认两个文件就位且权限正确ls -l /usr/bin/pam_authelia ls -l $(dirname $(find /lib /usr/lib -name pam_unix.so -print -quit))/pam_authelia.so配置 sshd让 PAM 走 keyboard-interactivepam_authelia通过 PAM 的 keyboard-interactive 通道提示密码和 2FA 码所以sshd必须启用 PAM 并允许 keyboard-interactive 认证。指南给出的最小/etc/ssh/sshd_config配置UsePAM yes KbdInteractiveAuthentication yes PasswordAuthentication no AuthenticationMethods keyboard-interactive编辑后重载sudo systemctl reload sshd如果后面要使用 Device Authorization 流程用户在手机浏览器上批准可以把LoginGraceTime从默认 2 分钟调大避免用户在扫码批准途中被超时断开LoginGraceTime 5m配置 PAM 栈启用 1FA2FA推荐的主路径是1FA2FA用户先被提示输入密码模块用/api/firstfactor校验成功后再提示输入 TOTP 码。编辑/etc/pam.d/sshdauth required pam_authelia.so urlhttps://auth.example.com auth-level1FA2FA account required pam_permit.so session required pam_permit.sourl是必填项且必须为https://Go 辅助程序所有 API 调用都以它为基址。把auth.example.com替换为你自己的 Authelia 部署地址。与常用选项对照均来自指南的选项表auth-level1FA仅密码、2FA密码取自PAM_AUTHTOK、1FA2FA默认值本文使用大小写敏感ca-cert私有 CA 时指定 PEM 证书路径默认用系统信任库。证书文件必须对sshd降权后的认证子进程通常是 root可读timeout整个 PAM 交互的上限秒数默认 60超时后 C shim 杀掉 Go 辅助程序并返回PAM_AUTH_ERRbinaryGo 辅助程序的绝对路径默认/usr/bin/pam_authelia装到非标准路径如/opt/时才需要改method-priority2FA 方法的尝试顺序可取totp、mobile_push、device_authorization和特殊关键字user。省略时按用户在 Authelia 里设置的偏好方法。如果你的本地 Unix 密码是凭据的权威来源、只想让 Authelia 出第二因子可用2FA模式在pam_authelia.so前加一行pam_unix.soauth required pam_unix.so auth required pam_authelia.so urlhttps://auth.example.com auth-level2FA注意指南的明确警告此模式下密码会被原样转发给 Authelia 的 firstfactor 端点本地 Unix 密码必须与 Authelia 密码一致两边一旦漂移pam_unix.so放行后 Authelia 的静默 1FA 校验仍会失败、登录被拒。不确定时用1FA2FA更稳。自签名 Authelia 的完整示例指南原文auth required pam_authelia.so urlhttps://auth.internal \ auth-level1FA2FA \ ca-cert/etc/ssl/certs/internal-ca.pem account required pam_permit.so session required pam_permit.so验证登录指南建议用一个存在于 Authelia 的专用非 root 用户测试避免把自己唯一的管理员账号锁死、被迫走带外控制台恢复。TOTP 流程验证ssh johnserver.example.com先提示输入密码再提示输入 6 位或 8 位 TOTP 码成功登录会落到 shell 提示符。需要看模块内部行为时在pam_authelia.so行加上debug布尔标志、无值诊断行写入 stderr 并被sshd捕获进 journal。systemd 发行版上读取方式sudo journalctl -u ssh -t pam_authelia --since 5 minutes ago启用debug后一次成功的 1FA2FA TOTP 登录会产生类似下面的日志文档示例实际值随你的部署而不同pam_authelia: POST https://auth.example.com/api/firstfactor pam_authelia: response status200 status_fieldOK pam_authelia: user info methodtotp has_totptrue has_webauthnfalse has_duofalse pam_authelia: selected totp (from priority entry totp) pam_authelia: POST https://auth.example.com/api/secondfactor/totp pam_authelia: response status200 status_fieldOK可选Device Authorization 流程如果你的用户希望用扫二维码的方式完成双因素在真实浏览器里登录 Authelia 门户那里 WebAuthn 等任何方法都可用可以在 PAM 侧启用 RFC 8628 的 Device Authorization grant。这是唯一需要 Authelia 服务端额外配置的 2FA 方法。Authelia 服务端配置需要三样东西一个device_codegrant 类型的 OIDC client、一个输出authelia.pam.username自定义 claim 的 claims policy、以及一个授予该 claim 的自定义 scope。指南给出的配置块identity_providers: oidc: claims_policies: pam: custom_claims: authelia.pam.username: attribute: username scopes: authelia.pam: claims: - authelia.pam.username clients: - client_id: pam-authelia client_name: pam_authelia device flow client_secret: hashed secret public: false authorization_policy: two_factor grant_types: - urn:ietf:params:oauth:grant-type:device_code token_endpoint_auth_method: client_secret_post claims_policy: pam scopes: - openid - authelia.pam其中client_secret必须是哈希形式先用authelia crypto hash generate命令用法见 生成安全值从一段随机明文生成哈希哈希值填进 Authelia 配置明文值则通过 PAM 侧的oauth2-client-secret传给pam_authelia。authorization_policy: two_factor让设备批准本身在 Authelia 侧也要过 2FA。如果不想把明文 secret 放在/etc/pam.d/*里该文件默认多为0644任何有读权限的人可见可以改为 public clientAuthelia 侧设public: true并去掉client_secretPAM 侧省略oauth2-client-secret。改完重载 Authelia。若 Authelia 里存的用户名与 Linux 账号不是逐字一致大小写、realm后缀等用派生 user attribute 归一化后再作为 claim 来源例如definitions: user_attributes: pam_username: expression: username.split()[0].lowerAscii() identity_providers: oidc: claims_policies: pam: custom_claims: authelia.pam.username: attribute: pam_usernamePAM 侧配置auth required pam_authelia.so urlhttps://auth.example.com \ auth-level1FA2FA \ method-prioritydevice_authorization,user \ oauth2-client-idpam-authelia \ oauth2-client-secret你的明文 secret \ oauth2-scopeopenid,authelia.pam \ timeout300 account required pam_permit.so session required pam_permit.sooauth2-client-id在method-priority含device_authorization时必填oauth2-scope的openid和authelia.pam两个 scope 都是强制项缺少任一个 Go 辅助程序会拒绝启动timeout300给用户五分钟完成手机上的批准。验证方式同前ssh登录时终端会渲染 QR 码和 verification URL在手机上扫码或在能访问 Authelia 的浏览器里打开 URL 完成批准回到 SSH 会话按 Enter模块轮询 token 端点并在确认后进入 shell。QR 需要 Unicode 终端使用半块字符渲染不支持的终端会退化为只显示 URL 和用户码仍然可用。常见问题排查以下条目均为指南 Troubleshooting 章节列出的现象与对应原因客户端报ssh: unable to authenticate, attempted methods [none keyboard-interactive], no supported methods remain说明 PAM 很早就返回了PAM_AUTH_ERR。依次检查Go 辅助程序是否缺失或不在默认路径确认/usr/bin/pam_authelia存在可执行或设置binaryca-cert路径错误stderr 出现failed to read CA certificatesshd_config缺少UsePAM yes或KbdInteractiveAuthentication yes。客户端报Authentication failed且 journal 里没有pam_authelia的行debug没开。在pam_authelia.so行加上debug复现后再查 journal。debug 日志出现response status429Authelia 的 regulation 限流命中了请求。等待限流窗口过去或调整 Authelia 侧regulation.max_retries和regulation.find_timepam_authelia不会自动重试被限流的请求。device authorization response status401PAM 侧的oauth2-client-id/oauth2-client-secret与 Authelia 配置不一致或 client 的 public/confidential 设定与 PAM 是否传 secret 不匹配把两侧对齐即可。claim authelia.pam.username missing from userinfo responseAuthelia 没有输出身份绑定 claim。按顺序核对claims policy 定义了authelia.pam.username且锚定正确的后端属性authelia.pamscope 存在且claims列表包含该 claimclient 挂了claims_policy: pam且scopes含authelia.pamPAM 的oauth2-scope请求了authelia.pam。authelia identity ... does not match pam username ...设备流批准者与 SSH 请求用户不一致——这可能是身份绑定防冒用机制在正常工作也可能是 Linux 用户名与 Authelia 用户名大小写/域后缀不匹配后者按上文归一化方案处理。device authorization token expired服务端 device code 有效期默认 10 分钟在批准前耗尽。这是 Authelia 侧超时调大 PAM 的timeout或LoginGraceTime都没有用要么更快批准要么按 OIDC provider 参考调大identity_providers.oidc.lifespans.device_code。限制与安全边界不支持 SSH 上的 WebAuthn / FIDO2硬件密钥需要 USB/NFC 直连客户端设备keyboard-interactive 通道无法透传。若用户只注册了 WebAuthn让它走 Device Authorization 流程真实浏览器里登录门户时 WebAuthn 正常工作或为其追加注册 TOTP/Duomethod-priority显式排除了user和device_authorization且无其他可用方法时认证会以no usable 2FA method for this user失败。TLS 始终校验没有 skip-verify 模式连接使用 TLS 1.2 及以上信任来源是系统信任库或ca-cert。凭据不进日志debug 日志只记录 HTTP 状态码和响应里的status字段不记录请求/响应体密码与 2FA 令牌用后清零。Authelia 的 regulation 照常生效限流、按 IP 节流等规则对经pam_authelia的每次登录尝试都适用之前依赖 SSH 自身惩罚机制的运维策略需要重新核对。进一步阅读pam-authelia 集成指南全文、OpenID Connect 1.0 Clients 配置参考、user attributes 表达式引擎。【免费下载链接】autheliaThe Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready.项目地址: https://gitcode.com/GitHub_Trending/au/authelia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表