零信任架构的核心理念与实践应用解析 ¶
零信任安全架构的核心理念可凝练为八字原则:“永不信任、持续验证”。当前业界厂商的基础实现,往往以强化访问控制体系为核心抓手,通过在业务系统前端部署专用网关,构建动态可信的访问链路。以下结合技术逻辑与应用场景展开说明,使用开源项目 authelia
充当零信任网关。
一、传统访问控制与零信任网关的技术差异 ¶
1. 传统业务系统访问模式(以 Web 应用为例) 当编辑需在公司外访问内容管理平台时,传统方案通常在 Web 应用前端网关添加 “认证机制”:
- 公网用户访问 URL 时,未登录请求会被重定向至登录页面;
- 完成身份验证后,方可访问内容管理平台。
此模式虽能解决基础访问控制问题,但存在安全漏洞:公网暴露的业务系统在登录前可能遭受暴力破解,且无法防御 API 接口漏洞攻击。
2. 零信任架构的网关代理机制 零信任体系的核心改造,是在业务系统前部署零信任网关(可类比为具备增强身份鉴权能力的 Nginx)。所有访问流量必须经网关代理,未通过身份验证的请求会被直接拦截。其核心逻辑在于:将信任验证前置到网关层,通过 “身份 - 权限 - 访问” 的动态关联,实现对不可信流量的实时阻断。
二、零信任架构下的用户访问流程优化 ¶
1. 传统登录流程的痛点 未优化的零信任访问流程可能出现 “双重登录” 现象:
- 用户访问 Web 应用 → 2. 零信任网关拦截,重定向至网关登录页 → 3. 完成网关登录后,重定向至业务系统登录页 → 4. 业务系统登录成功后进入应用。
此流程易引发用户体验问题,但通过技术整合可实现 “一次登录、多系统信任”,核心方案如下:
2. 单登录体验的技术实现路径
- 方案一:统一身份源(IAM 集成) 若零信任网关与业务系统共用同一 IAM(身份管理系统),用户首次登录后,后续访问其他业务系统时,系统会自动重定向至 IAM 页面完成无感认证。例如:使用 Google 账号登录 A 服务后,访问 B、C 等同源服务时,系统会基于 IAM 会话状态自动完成登录,无需重复输入凭证。
- 方案二:业务系统身份联动改造 当用户完成零信任网关登录后,业务系统可通过接口向零信任平台请求用户身份信息,实现 “网关认证 - 业务系统鉴权” 的联动。此时用户只需在网关层完成一次登录,业务系统即可通过信任传递机制获取身份凭证,省略重复登录步骤。
以上两种方案本质上其实是同一种,对于用户而言它只需要登陆一次即可。
三、使用开源项目 authelia
充当零信任网关。 ¶
1. 部署并配置 authelia ¶
按照之前的文档参考部署
2. 使用 Authelia 作为OpenID Connect 1.0提供程序 ¶
1. 生成密钥对 ¶
会生成 private.pem 和 public.crt 文件、填写到下方配置文件。
openssl req -x509 -nodes -newkey rsa:2048 -keyout private.pem -out public.crt -sha256 -days 365 -subj '/CN=linuxcdn.com'
2. 配置 oidc ¶
identity_providers:
oidc:
# OIDC身份提供者核心配置
# 其他未显示的配置项保持原有设置
hmac_secret: '123123123' # 使用生成: openssl rand -hex 64
jwks:
- # 密钥配置块,用于JWT签名和验证
key_id: 'authelia-key-1' # 自定义密钥标识符,需唯一
algorithm: 'RS256' # 签名算法,匹配RSA密钥
use: 'sig' # 密钥用途:签名(signature)
# RSA私钥内容(注意缩进与key:对齐) # private.pem
key: |
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
# 证书链配置(需与私钥对应,用于验证签名) public.crt
certificate_chain: |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
3. 配置Jenkins以使用 Authelia 作为OpenID Connect 1.0提供程序 ¶
1. 安装插件 ¶
2. 配置插件 ¶
打开网址配置插件
https://
/manage/configureSecurity/
https:// |
按照 authelia 登录的用户组、配置矩阵权限。 |
---|---|
![]() |
![]() |
3. 配置 authelia ¶
https://www.authelia.com/integration/openid-connect/jenkins/
clients:
- client_id: 'jenkins'
client_name: 'Jenkins'
client_secret: '$pbkdf2-sha512$' # 生成 client_secret: docker run --rm -it authelia/authelia:latest authelia crypto hash generate pbkdf2 --variant sha512
public: false
authorization_policy: 'one_factor'
redirect_uris:
- 'https://jenkins.<host>.com:60000/securityRealm/finishLogin'
scopes:
- 'openid'
- 'profile'
- 'email'
- 'groups'
response_types:
- 'code'
grant_types:
- 'authorization_code'
userinfo_signed_response_alg: 'none'
token_endpoint_auth_method: 'client_secret_basic'
4. 结合 gitea ¶
1. 配置 authelia ¶
clients:
- client_id: 'gitea'
client_name: 'Gitea'
client_secret: '$pbkdf2-sha512$' # 生成 client_secret:docker run --rm -it authelia/authelia:latest authelia crypto hash generate pbkdf2 --variant sha512
public: false
authorization_policy: 'one_factor'
redirect_uris:
- 'https://gitea.<host>/user/oauth2/authelia/callback'
scopes:
- 'openid'
- 'email'
- 'profile'
userinfo_signed_response_alg: 'none'
token_endpoint_auth_method: 'client_secret_basic'
2. 配置 gitea ¶
1. 配置 ouath2 源 ¶
要配置Gitea以使用 Authelia 作为OpenID Connect 1.0提供程序,请按照以下说明操作:
- 扩展用户选项
- 访问网站管理
- 访问身份验证源
- 访问添加身份验证源
- 配置以下选项:
- 身份验证名称:
authelia
- OAuth2 提供程序:
OpenID Connect
- 客户端 ID(密钥):
gitea
- 客户端机密:
insecure_secret
- OpenID Connect 自动发现 URL:
https://auth.example.com/.well-known/openid-configuration
配置 ouath2 | |
---|---|
![]() |
2. 配置 gitea 自动创建用户 ¶
配置 Gitea
通过 OpenID Connect 1.0 为域执行自动用户创建:auth.example.com
1. 修改 gitea
服务器的 app.ini
配置:
[openid]
ENABLE_OPENID_SIGNIN = false
ENABLE_OPENID_SIGNUP = true
WHITELISTED_URIS = auth.example.com
[oauth2_client]
REGISTER_EMAIL_CONFIRM = false # 强制邮箱确认
OPENID_CONNECT_SCOPES = profile email # 请求头像和邮箱
ENABLE_AUTO_REGISTRATION = true # 自动注册用户
USERNAME = preferred_username # 使用首选用户名
ACCOUNT_LINKING = login # 自动关联账户
[service]
DISABLE_REGISTRATION = false # 禁止用户注册,仅管理员可创建账号
ALLOW_ONLY_EXTERNAL_REGISTRATION = true # 仅允许使用第三方服务注册
SHOW_REGISTRATION_BUTTON = false # 隐藏网页端的注册按钮,用户无法直接从登录页面进入注册流程。
5. 对接 argocd ¶
1. 配置 authelia ¶
identity_providers:
oidc:
## The other portions of the mandatory OpenID Connect 1.0 configuration go here.
## See: https://www.authelia.com/c/oidc
clients:
- client_id: 'argocd'
client_name: 'Argo CD'
client_secret: '$pbkdf2-sha512$310000$c8p78n7pUMln0jzvd4aK4Q$JNRBzwAo0ek5qKn50cFzzvE9RXV88h1wJn5KGiHrD0YKtZaR/nCb2CJPOsKaPK0hjf.9yHxzQGZziziccp6Yng' # The digest of 'insecure_secret'.
public: false
authorization_policy: 'two_factor'
require_pkce: true
pkce_challenge_method: 'S256'
redirect_uris:
- 'https://argocd.example.com/auth/callback'
- 'https://argocd.example.com/pkce/verify'
scopes:
- 'openid'
- 'groups'
- 'email'
- 'profile'
response_types:
- 'code'
grant_types:
- 'authorization_code'
access_token_signed_response_alg: 'none'
userinfo_signed_response_alg: 'none'
token_endpoint_auth_method: 'client_secret_basic'
- client_id: 'argocd-cli'
client_name: 'Argo CD (CLI)'
public: true
authorization_policy: 'two_factor'
require_pkce: true
pkce_challenge_method: 'S256'
redirect_uris:
- 'http://localhost:8085/auth/callback'
scopes:
- 'openid'
- 'offline_access'
- 'groups'
- 'email'
- 'profile'
response_types:
- 'code'
grant_types:
- 'authorization_code'
- 'refresh_token'
access_token_signed_response_alg: 'none'
userinfo_signed_response_alg: 'none'
token_endpoint_auth_method: 'none'
2. 配置 argocd ¶
argocd-cm.yaml
oidc.config: |
name: 'Authelia'
issuer: 'https://auth.example.com'
clientID: 'argocd'
clientSecret: 'insecure_secret'
cliClientID: 'argocd-cli'
requestedScopes:
- 'openid'
- 'profile'
- 'email'
- 'groups'