跳转至

零信任架构的核心理念与实践应用解析

零信任安全架构的核心理念可凝练为八字原则:“永不信任、持续验证”。当前业界厂商的基础实现,往往以强化访问控制体系为核心抓手,通过在业务系统前端部署专用网关,构建动态可信的访问链路。以下结合技术逻辑与应用场景展开说明,使用开源项目 authelia 充当零信任网关。

一、传统访问控制与零信任网关的技术差异

1. 传统业务系统访问模式(以 Web 应用为例) 当编辑需在公司外访问内容管理平台时,传统方案通常在 Web 应用前端网关添加 “认证机制”:

  • 公网用户访问 URL 时,未登录请求会被重定向至登录页面;
  • 完成身份验证后,方可访问内容管理平台。

此模式虽能解决基础访问控制问题,但存在安全漏洞:公网暴露的业务系统在登录前可能遭受暴力破解,且无法防御 API 接口漏洞攻击

2. 零信任架构的网关代理机制 零信任体系的核心改造,是在业务系统前部署零信任网关(可类比为具备增强身份鉴权能力的 Nginx)。所有访问流量必须经网关代理,未通过身份验证的请求会被直接拦截。其核心逻辑在于:将信任验证前置到网关层,通过 “身份 - 权限 - 访问” 的动态关联,实现对不可信流量的实时阻断

二、零信任架构下的用户访问流程优化

1. 传统登录流程的痛点 未优化的零信任访问流程可能出现 “双重登录” 现象:

  1. 用户访问 Web 应用 → 2. 零信任网关拦截,重定向至网关登录页 → 3. 完成网关登录后,重定向至业务系统登录页 → 4. 业务系统登录成功后进入应用。

此流程易引发用户体验问题,但通过技术整合可实现 “一次登录、多系统信任”,核心方案如下:

2. 单登录体验的技术实现路径

  • 方案一:统一身份源(IAM 集成) 若零信任网关与业务系统共用同一 IAM(身份管理系统),用户首次登录后,后续访问其他业务系统时,系统会自动重定向至 IAM 页面完成无感认证。例如:使用 Google 账号登录 A 服务后,访问 B、C 等同源服务时,系统会基于 IAM 会话状态自动完成登录,无需重复输入凭证。
  • 方案二:业务系统身份联动改造 当用户完成零信任网关登录后,业务系统可通过接口向零信任平台请求用户身份信息,实现 “网关认证 - 业务系统鉴权” 的联动。此时用户只需在网关层完成一次登录,业务系统即可通过信任传递机制获取身份凭证,省略重复登录步骤。

以上两种方案本质上其实是同一种,对于用户而言它只需要登陆一次即可。

三、使用开源项目 authelia 充当零信任网关。

1. 部署并配置 authelia

按照之前的文档参考部署

https://mkdocs.linuxnbg.com/K8s/0005-Traefik-sso-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'

https://www.authelia.com/reference/guides/generating-secure-values/#generating-a-random-alphanumeric-string

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. 安装插件

https://plugins.jenkins.io/oic-auth/

https://www.authelia.com/integration/openid-connect/frequently-asked-questions/#how-do-i-generate-a-client-identifier-or-client-secret

2. 配置插件

打开网址配置插件

https:///manage/configureSecurity/

https:///.well-known/openid-configuration 按照 authelia 登录的用户组、配置矩阵权限。
image-20250702104928770 image-20250702105044940

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

https://www.authelia.com/integration/openid-connect/gitea/

https://www.authelia.com/integration/openid-connect/frequently-asked-questions/#how-do-i-generate-a-client-identifier-or-client-secret

    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提供程序,请按照以下说明操作:

  1. 扩展用户选项
  2. 访问网站管理
  3. 访问身份验证源
  4. 访问添加身份验证源
  5. 配置以下选项:
  6. 身份验证名称:authelia
  7. OAuth2 提供程序:OpenID Connect
  8. 客户端 ID(密钥):gitea
  9. 客户端机密:insecure_secret
  10. OpenID Connect 自动发现 URL:https://auth.example.com/.well-known/openid-configuration
配置 ouath2
image-20250702110320387
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'