题图摄于圣安东尼奥
注:微信公众号不按照时间排序,请关注“亨利笔记”,并加星标以置顶,以免错过更新。
(本文作者何威威系Harbor开源项目贡献者,本文节选自《Harbor权威指南》一书。)
《Harbor权威指南》目前京东优惠中,点击下图直接购买。
访问控制是 Harbor 系统数据安全的一个基本组成部分,定义了哪些用户可以访问和使用 Harbor 里的项目(project)、项目成员、Repository 仓库、Artifact 等资源。通过身份认证和授权,访问控制策略可以确保用户身份真实和拥有访问 Harbor 资源的相应权限。在大多数生产环境下,访问控制都是运维中需要关注的问题。
1. 概述
认证(Authentication)确定访问者的身份,目前Harbor支持本地数据库、LDAP、OIDC 等认证模式,可在“系统管理”→“配置管理”→“认证模式”里进行配置。在本地数据库认证模式下,用户信息都被存储在本地数据库中,Harbor 系统管理员可以管理用户的各种信息。在 LDAP 和 OIDC 认证模式下,用户信息和密码都被存储在 Harbor 之外的其他系统中,在用户登录后,Harbor 会在本地数据库中创建一个对应的用户账户,并在用户每次登录后都更新对应用户的账户信息。
授权(Authorization)决定访问者的权限,目前 Harbor 基于 RBAC 模型进行权限控制。Harbor 中的角色有三大类型:系统管理员、项目成员和匿名用户。系统管理员可以访问 Harbor 系统中的所有资源,项目成员按照不同的角色可以访问项目中的不同资源,匿名用户仅可以访问系统中公开项目的某些资源。
Harbor 系统中的资源分为两类:一类是仅系统管理员可以访问和使用的;另一类是基于项目来管理的,供普通用户访问和使用。Harbor 的系统管理员对两类资源均可访问。
仅系统管理员可以访问的资源包括用户、Registry 仓库、复制(Replication)、标签、项目定额、审查服务、垃圾回收和系统配置管理。
基于项目来管理的资源包括项目概要、Artifact仓库、Helm Charts、项目成员、标签、扫描器、Artifact(Tag)保留、不可变Artifact(Tag)、机器人账户、Webhook、日志、项目配置管理。(本文为公众号:亨利笔记 原创文章)
当用户请求访问系统资源时,Harbor 首先使用 Core 组件中的 security 中间件(middleware)获得Security Context(安全上下文)实例,然后根据Security Context确定对资源的授权。
2. 用户认证
为支持用户的多种身份认证系统,Harbor提供了三种认证模式:本地数据库认证、LDAP 认证和 OIDC 认证。本节讲解不同认证模式的原理,并举例说明如何配置LDAP 和 OIDC 认证模式。(本文为公众号亨利笔记原创文章)
Harbor 默认使用本地数据库认证模式,在这种认证模式下,用户信息被存储在 PostgreSQL 数据库中,允许用户自注册 Harbor 账号。
在“系统管理”→“用户管理”页面,系统管理员可以创建、删除用户,也可以重置用户密码和设置其他用户为系统管理员。
在“用户管理”页面单击“创建用户”按钮,在“创建用户”对话框中填写上用户名、邮箱、全名、密码和确认密码后即可创建一个新用户。(本文为公众号:亨利笔记 原创文章)
Harbor可以对支持LDAP的软件进行认证,如 OpenLDAP 和 Active Directory(AD) 等。
LDAP(Lightweight Directory Access Protocol)是一个基于 X.500 标准的轻量级目录访问协议。目录是为了查询、浏览和搜索而优化的数据库,在 LDAP 中信息以树状方式组织,树状信息中的基本单元是条目(Entry),每个条目都由属性(Attribute)构成,在属性中存储属性的值。一个条目有若干个属性和值,有些条目还可包含子条目。
条目就像是数据库中记录,对 LDAP 的添加、删除、修改和搜索通常都是以条目为基本对象的。下图是一个典型的目录树,图中的每个方框就是一个条目,根节点是“dc=goharbor,dc=io”。
域名组件 DC(Domain Component)是条目标识的域名部分,其格式是将完整的域名分成几部分,如域名 “goharbor.io” 变成 “dc=goharbor,dc=io”。(本文为公众号亨利笔记原创文章)
识别名 DN(Distinguished Name)指从目录树的根出发的绝对路径,是条目的唯一标识,例如 “cn=user1,ou=Users,dc=goharbor,dc=io”。
基准识别名 Base DN(Base Distinguished Name)一般指整个目录树的根。例如 “dc=goharbor,dc=io”。
OIDC(OpenID Connect)是一个基于 OAuth 2.0 协议的身份认证标准协议。
OAuth 2.0 是一个授权协议,它引入了一个授权层以便区分出两种不同的角色:资源的所有者和客户端,客户端从资源服务器处获得的令牌可替代资源所有者的凭证来访问被保护的资源。OAuth 2.0 的实质就是客户端从第三方应用中获得令牌,它规定了4种获得令牌的方式:
◎授权码(Authorization Code)方式;
◎隐藏式(Implicit);
◎密码式(Password);
◎客户端凭证(Client Credentials)方式。
授权码方式指第三方应用先获取一个授权码,然后使用该授权码换取令牌。这是最常见的流程,安全性也最高,适合同时具有前端和后端的应用,授权码被传递给前端,令牌则被存储在后端。(本文为公众号:亨利笔记 原创文章)
隐藏式适合只有前端没有后端的应用,因为在前端保留授权码不安全,所以这种方式跳过了授权码这个步骤,由 OAuth 2.0 授权层直接向前端颁发令牌。这种方式安全性较低,适合对安全性要求不高的场景。
密码式指用户直接把用户名和密码告诉应用,应用使用用户名和密码去申请令牌,这种方式要求用户高度信任应用。
客户端凭证方式适用于应用的客户端获取令牌,使用的是应用的客户端ID和密码,与用户的凭证无关,适合客户端调用第三方的API服务。
OIDC 借助 OAuth 2.0 的授权服务来为第三方客户端提供用户的身份认证,并把认证信息传递给客户端。OIDC 在 OAuth 2.0 的基础上提供了 ID Token 来解决第三方客户端用户身份认证的问题,还提供了 UserInfo 接口供第三方客户端获取更完整的用户信息。
Harbor 可以与支持 OIDC 的 OAuth 服务提供商集成来进行用户认证,并通过授权码方式获取令牌,其流程如图所示,步骤如下。
(1)用户通过浏览器访问 Harbor 的登录页面,并单击“通过OIDC提供商登录”按钮,该按钮在 Harbor 使用 OIDC 认证时才会显示。
(2)用户被重定向到 OIDC 提供商的身份验证页面。(本文为公众号亨利笔记原创文章)
(3)在用户经过身份验证后,OIDC 提供商将使用授权代码重定向至Harbor。
(4)Harbor 将与 OIDC 提供商交换此授权代码以获得访问令牌。
(5)Harbor 使用访问令牌请求 UserInfo 接口获取用户信息。
(6)Harbor 在系统中创建或更新用户账户并将用户重定向到 Harbor 的门户首页。
下面是一些支持 OIDC 的 OAuth 服务提供商:
◎Apple
◎GitLab
◎Google App Engine
◎Keycloak
◎Microsoft(Hotmail、Windows Live、Messenger、Active Directory、Xbox)
◎NetIQ
◎Okta
◎Salesforce.com
◎WSO2 Identity Server
除了这些支持 OIDC 的 OAuth 服务提供商,我们也可以通过 Dex 搭建自己的OIDC 提供商。Dex 是一个联邦式 OIDC 服务提供商程序,为客户端应用或者终端用户提供了一个 OIDC 服务,实际的用户认证功能通过 connectors 由上游的身份认证提供商来完成。如图所示,Dex 作为中间层连接客户端和上游身份认证提供商。
Connector(连接器)是 Dex 用来调用一个身份提供商进行用户认证的策略。目前 Dex 的最新版本是 2.24.0,其实现的连接器如下表所示。
名 称 | 是否支持刷新令牌 | 是否支持组 | 是否支持首选用户名 |
---|---|---|---|
LDAP | 支持 | 支持 | 支持 |
GitHub | 支持 | 支持 | 支持 |
SAML 2.0 | 不支持 | 支持 | 不支持 |
GitLab | 支持 | 支持 | 支持 |
OpenID Connect | 支持 | 不支持 | 不支持 |
支持 | 支持 | 支持 | |
支持 | 不支持 | 不支持 | |
Microsoft | 支持 | 支持 | 不支持 |
AuthProxy | 不支持 | 不支持 | 不支持 |
Bitbucket Cloud | 支持 | 支持 | 不支持 |
OpenShift | 不支持 | 支持 | 不支持 |
Atlassian Crowd | 支持 | 支持 | 支持 |
欢迎转发、收藏以及点 “在看”和赞。
《Harbor权威指南》目前京东优惠中,点击下图直接购买。
要想了解云原生、机器学习和区块链等技术原理,请立即长按以下二维码,关注本公众号亨利笔记 ( henglibiji ),以免错过更新。