Zalando Skipper 认证与授权机制详解

Zalando Skipper 认证与授权机制详解

skipper An HTTP router and reverse proxy for service composition, including use cases like Kubernetes Ingress skipper 项目地址: https://gitcode.com/gh_mirrors/sk/skipper

前言

在现代微服务架构中,认证与授权是保障系统安全的重要环节。Zalando Skipper 作为一款高性能的 HTTP 路由器和反向代理,提供了丰富的认证与授权机制。本文将深入解析 Skipper 支持的各种认证方式,帮助开发者构建安全的微服务系统。

基础认证(Basic Auth)

基础认证是最简单的 HTTP 认证方式,遵循 RFC7617 标准。

配置步骤

  1. 安装工具: 在 Debian 系统中安装 htpasswd 工具:

    apt-get install apache2-utils
    
  2. 创建密码文件: 创建包含用户凭据的密码文件:

    htpasswd -bcB foo.passwd captain apassword
    
  3. 启动 Skipper: 使用 basicAuth 过滤器引用密码文件:

    ./bin/skipper -address :8080 -inline-routes 'r: * -> basicAuth("foo.passwd") -> status(200) -> <shunt>'
    

验证流程

  • 无凭证请求: 返回 401 未授权状态码,并提示需要基础认证。

  • 有效凭证请求: 使用 curl 携带凭证访问:

    curl captain:apassword@localhost:8080/ -v
    

    返回 200 成功状态码。

服务间令牌认证

服务间通信通常使用 Bearer 令牌进行认证,支持两种令牌格式:

  1. OAuth2 访问令牌(RFC6750)
  2. JWT(RFC7519)

Tokeninfo 认证

Tokeninfo 是一种常见的非标准协议,仅支持 Authorization 头中的 Bearer 令牌。

示例路由

all: Path("/") -> oauthTokeninfoAnyScope("read-X", "readwrite-X") -> "http://localhost:9090/"

工作流程

  1. 客户端发送带有 Bearer 令牌的请求
  2. Skipper 将令牌转发到 Tokeninfo 端点验证
  3. 验证通过后转发请求到后端服务

Tokenintrospection 认证(RFC7662)

这是标准化的令牌验证方式,支持自动发现令牌基础设施配置。

示例路由

all: * -> oauthTokenintrospectionAnyKV("https://identity.example.com/managed-id", "jdoe") -> "http://localhost:9090/";

工作流程

  1. 客户端发送带有 Bearer 令牌的请求
  2. Skipper 按照 RFC7662 规范将令牌发送到 Tokenintrospection 端点
  3. 验证通过后转发请求到后端服务

OpenID Connect 认证

OpenID Connect 是基于 OAuth2.0 的认证机制,Skipper 可以作为代理处理认证流程。

工作原理

  1. 初始化参数

    • 提供者 URL
    • 客户端 ID 和密钥
    • 回调 URL
    • 请求的 scope
    • 需要的 claims
  2. 认证流程

    • 检查 cookie 中的认证信息
    • 未认证则重定向到 OpenID 提供者
    • 用户完成认证后回调到 Skipper
    • Skipper 获取 ID 令牌并设置加密 cookie
    • 重定向回原始请求 URL

配置示例

Claims 验证

oauthOidcAllClaims("https://accounts.identity-provider.com", "some-client-id",
    "some-client-secret", "http://callback.com/auth/provider/callback", "scope1 scope2",
    "claim1 claim2") -> "https://internal.example.org";

用户信息验证

oauthOidcUserInfo("https://oidc-provider.example.com", "client_id", "client_secret",
    "http://target.example.com/subpath/callback", "email profile",
    "name email picture") -> "https://internal.example.org";

授权与访问控制

使用 oidcClaimsQuery 过滤器实现细粒度访问控制:

oauthOidcAnyClaims(...) -> oidcClaimsQuery("/login:groups.#[==\"appX-Tester\"]", "/:@_:email%\"*@example.org\"")

OAuth2 授权码流程

授权码流程(RFC6749)是获取用户访问令牌的标准方式。

工作原理

  1. 用户访问受保护路由
  2. Skipper 检查 oauth-grant cookie
  3. 未认证则重定向到 OAuth2 提供者
  4. 用户登录后回调到 Skipper
  5. Skipper 用授权码换取访问令牌
  6. 存储加密令牌到 cookie
  7. 后续请求携带 cookie 直接通过

配置步骤

  1. 配置凭证

    skipper -oauth2-client-id-file=/path/to/client_id \
        -oauth2-client-secret-file=/path/to/client_secret \
        -oauth2-secret-file=/path/to/cookie_encryption_secret
    
  2. 配置端点

    skipper -enable-oauth2-grant-flow \
        -oauth2-auth-url=<OAUTH2_AUTHORIZE_ENDPOINT> \
        -oauth2-token-url=<OAUTH2_TOKEN_ENDPOINT> \
        -oauth2-tokeninfo-url=<OAUTH2_TOKENINFO_ENDPOINT>
    
  3. 保护路由

    foo: Path("/foo") -> oauthGrant() -> "http://localhost:9090";
    
  4. 登出路由

    logout: Path("/logout") -> grantLogout() -> redirectTo(302) -> <shunt>;
    

Open Policy Agent 集成

Skipper 集成了 OPA 作为 Go 库,无需额外部署。

配置方式

  1. 启用功能

    skipper -enable-open-policy-agent
    
  2. 配置文件: 使用 Go 模板配置 OPA 实例:

    services:
      - name: bundle-service
        url: https://my-example-opa-bucket.s3.eu-central-1.amazonaws.com
    labels:
      environment: production
    discovery:
      name: discovery
      prefix: "/applications/{{ .bundlename }}"
    
  3. 启动参数

    skipper -open-policy-agent-config-template=/path/to/config.yaml
    

总结

Zalando Skipper 提供了全面的认证与授权解决方案,从简单的基础认证到复杂的 OAuth2 和 OpenID Connect 流程,满足不同场景的安全需求。通过灵活的过滤器机制,开发者可以轻松实现细粒度的访问控制,保障微服务架构的安全性。

skipper An HTTP router and reverse proxy for service composition, including use cases like Kubernetes Ingress skipper 项目地址: https://gitcode.com/gh_mirrors/sk/skipper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时飞城Herdsman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值