Zalando Skipper 认证与授权机制详解
前言
在现代微服务架构中,认证与授权是保障系统安全的重要环节。Zalando Skipper 作为一款高性能的 HTTP 路由器和反向代理,提供了丰富的认证与授权机制。本文将深入解析 Skipper 支持的各种认证方式,帮助开发者构建安全的微服务系统。
基础认证(Basic Auth)
基础认证是最简单的 HTTP 认证方式,遵循 RFC7617 标准。
配置步骤
-
安装工具: 在 Debian 系统中安装
htpasswd
工具:apt-get install apache2-utils
-
创建密码文件: 创建包含用户凭据的密码文件:
htpasswd -bcB foo.passwd captain apassword
-
启动 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 令牌进行认证,支持两种令牌格式:
- OAuth2 访问令牌(RFC6750)
- JWT(RFC7519)
Tokeninfo 认证
Tokeninfo 是一种常见的非标准协议,仅支持 Authorization 头中的 Bearer 令牌。
示例路由:
all: Path("/") -> oauthTokeninfoAnyScope("read-X", "readwrite-X") -> "http://localhost:9090/"
工作流程:
- 客户端发送带有 Bearer 令牌的请求
- Skipper 将令牌转发到 Tokeninfo 端点验证
- 验证通过后转发请求到后端服务
Tokenintrospection 认证(RFC7662)
这是标准化的令牌验证方式,支持自动发现令牌基础设施配置。
示例路由:
all: * -> oauthTokenintrospectionAnyKV("https://identity.example.com/managed-id", "jdoe") -> "http://localhost:9090/";
工作流程:
- 客户端发送带有 Bearer 令牌的请求
- Skipper 按照 RFC7662 规范将令牌发送到 Tokenintrospection 端点
- 验证通过后转发请求到后端服务
OpenID Connect 认证
OpenID Connect 是基于 OAuth2.0 的认证机制,Skipper 可以作为代理处理认证流程。
工作原理
-
初始化参数:
- 提供者 URL
- 客户端 ID 和密钥
- 回调 URL
- 请求的 scope
- 需要的 claims
-
认证流程:
- 检查 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)是获取用户访问令牌的标准方式。
工作原理
- 用户访问受保护路由
- Skipper 检查
oauth-grant
cookie - 未认证则重定向到 OAuth2 提供者
- 用户登录后回调到 Skipper
- Skipper 用授权码换取访问令牌
- 存储加密令牌到 cookie
- 后续请求携带 cookie 直接通过
配置步骤
-
配置凭证:
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
-
配置端点:
skipper -enable-oauth2-grant-flow \ -oauth2-auth-url=<OAUTH2_AUTHORIZE_ENDPOINT> \ -oauth2-token-url=<OAUTH2_TOKEN_ENDPOINT> \ -oauth2-tokeninfo-url=<OAUTH2_TOKENINFO_ENDPOINT>
-
保护路由:
foo: Path("/foo") -> oauthGrant() -> "http://localhost:9090";
-
登出路由:
logout: Path("/logout") -> grantLogout() -> redirectTo(302) -> <shunt>;
Open Policy Agent 集成
Skipper 集成了 OPA 作为 Go 库,无需额外部署。
配置方式
-
启用功能:
skipper -enable-open-policy-agent
-
配置文件: 使用 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 }}"
-
启动参数:
skipper -open-policy-agent-config-template=/path/to/config.yaml
总结
Zalando Skipper 提供了全面的认证与授权解决方案,从简单的基础认证到复杂的 OAuth2 和 OpenID Connect 流程,满足不同场景的安全需求。通过灵活的过滤器机制,开发者可以轻松实现细粒度的访问控制,保障微服务架构的安全性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考