用 opkssh 实现通过 OIDC 身份验证的SSH登录

opkssh 是一个将 OpenID Connect (OIDC) 单点登录(SSO)与 SSH 协议集成的开源工具。
它通过 OpenID 身份验证来生成 SSH 密钥,使用户免去管理多个 SSH 密钥的烦恼。
文中以 Authentik 举例,演示 OIDC 身份验证平台如何对接 opkssh

1.在 Authentik 上配置 opkssh认证程序


打开 Authentik 管理员界面,侧边栏点击 应用程序 -> 应用程序 -> 以提供程序创建

依次设置好 应用程序 和 提供程序,
提供程序类型选择 OAuth2/OpenID Provider,
记录好 应用Slug、客户端 ID 和 客户端 Secret(待会要用),提供程序的重定向 URI设置为以下三行:

重定向 URI
匹配类型 | URI
strict: http://localhost:3000/login-callback
strict: http://localhost:10001/login-callback
strict: http://localhost:11110/login-callback

2.在 Linux 远程服务器上安装 opkssh


# 运行简易配置脚本来安装opkssh
wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash

为什么不在Releases那里直接安装软件包?
1. 需要手动创建 opksshuser 用户
2. 需要手动为 /etc/opk 里的文件设置 640权限
3. 需要手动重启sshd

在 Linux 远程服务器上安装好 opkssh(服务器端)之后,依次进行以下操作:

# “https://authentik.company/application/o/<slug>/”为你的 Authentik域名,请自行替换
# /<slug>/这里的 '/' 不要删

# 设置provider (这里的 24h 指的是 一次 SSH 密钥的有效时间)
echo 'https://authentik.company/application/o/<slug>/ <客户端ID> 24h' > /etc/opk/providers
# 设置auth_id(允许谁以谁的身份登录)
# 这里有两种设置方法
# 允许单个用户使用 opkssh 登录(例如 [email protected] 使用服务器的 root 身份登录)
sudo opkssh add root [email protected] https://authentik.company/application/o/<slug>/
# 允许Authentik里设置的某个用户组使用 opkssh 登录(例如 ssh-users)
sudo opkssh add root oidc:groups:ssh-users https://authentik.company/application/o/<slug>/

3. 安装 opkssh 客户端


opkssh 支持在 Windows、macOS、Linux 和 Android系统上使用,其中的Android端通过 Termux App来使用:


在 Windows 上安装 opkssh
1. 键盘敲击 Win+S 按键,搜索 PowerShell 并打开
2. 在终端模执行以下命令,安装 opkssh

winget install openpubkey.opkssh

3. 安装完成后,在 C:\Users\{USER}\.opk\config.yml 写入配置文件


在 Linux 上安装 opkssh
1.在终端模执行以下命令,安装 opkssh

# 如果是 x86-64
curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-amd64 -o opkssh; chmod +x opkssh

# 如果是 arm64
curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-arm64 -o opkssh; chmod +x opkssh

2. 安装完成后,在 ~/.opk/config.yml 写入配置文件

config.yml配置文件示例:


---
default_provider: webchooser

providers:
  - alias: "Authentik"
    issuer: https://authentik.company/application/o/<slug>/
    client_id: <客户端 ID>
    client_secret: <客户端 Secret>
    scopes: openid email profile
    access_type: offline
    prompt: consent
    redirect_uris:
      - http://localhost:3000/login-callback
      - http://localhost:10001/login-callback
      - http://localhost:11110/login-callback

使用 opkssh :


在 终端模 里依次执行以下命令:

opkssh login
ssh user@hostname

即可开始使用