前言
云计算架构作为一种基础设施服务几乎已经成为了现代Web开发的标配,它显著地降低了 DevOps
(Development and Operations)的门槛,通过云服务商提供的管理平台,Web应用开发人员可以轻松地在云上搭建自己的系统。作为一名云时代的全栈开发工程师,了解云计算架构背后的机制可以让我们更好地利用这个强大的基础设施,在设计、开发、部署和维护应用程序时做出更明智的决策。同时云计算是互联网技术的延伸,通过学习云计算架构,可以更深入地掌握互联网基础知识,这对于个人的技术水平也是一个很大的提升。
为了对云计算有一个全面的了解,最近在读 《图解云计算架构——基础设施和API》 一书,这本书主要以OpenStack
和AWS
为例,通过API来重点讲解IaaS云服务的本质。下面是边读边整理的学习笔记,一方面可以随时回顾,另一方面希望通过输出来促进自己思考。
正文
在云环境中,由于人们会以共享的方式使用API和资源,所以安全就成了一个需要重要考虑的问题。本章着重讲解与认证相关的机制以及安全的基础知识。
1. HTTPS协议
1.1 HTTPS协议机制
在Web API中使用HTTP协议会以明文通信,通信内容可能会被监听。为了避免这个问题,在云环境中访问重要的元数据时往往采用的是HTTPS协议。
HTTPS协议本质上是HTTP over SSL/TLS,默认端口号是443。HTTPS协议可用于数据加密,作为防篡改策略保护数据的完整性,同时还兼具确认URI是否可信的证书认证功能。
HTTPS通信的三个过程:建立TCP连接、TLS握手、TCL加密通信
1.2 证书
证书分为客户端证书和服务器证书两种。在云环境中,端点的服务器用的是服务器证书;而对于客户端的认证,主要使用的是云提供的认证功能和HTTP消息头的用户代理(user agent)。
典型的加密方式有对称加密和非对称加密两种。其中对称加密计算简单成本低,非对称加密安全性高但计算复杂成本高。HTTPS会先使用非对称加密方式进行加密通信,待安全地传递完共享密钥后,再改用对称加密进行加密通信。
基本概念:
- 服务器证书:服务器证书是一种数字证书,用于证明特定服务器的身份。它包含了服务器的公钥、服务器所有者的标识信息(如域名)、有效期以及其他元数据。
- CA:CA(Certificate Authority)是一个被广泛信任的组织或实体,负责验证申请者身份的真实性,并为其签发数字证书。
- 信任链:客户端(例如Web浏览器)在访问受保护的网站时,会检查服务器提供的证书是否由一个可信赖的CA签发。浏览器内置了一个预配置的可信CA列表,只有当服务器证书能够追溯到这个列表中的某个CA时,浏览器才会认为它是合法的。
数字证书签发过程:
- 服务器生成密钥对:服务器生成一对密钥,即公钥和私钥。
- 颁发证书:CA验证服务器的身份后,使用CA的私钥对服务器的公钥和相关信息进行签名,生成数字证书。
- 安装证书:服务器安装CA签发的数字证书。
客户端验证数字证书:
- 验证证书的完整性和签名:使用CA的公钥验证证书的签名,确保证书没有被篡改。
- 检查证书的有效期:确认证书在有效期内。
- 验证证书的颁发机构:确认CA是受信任的机构。
- 检查证书吊销状态:通过证书吊销列表(CRL)或在线证书状态协议(OCSP)检查证书是否被吊销。
TLS握手过程:
sequenceDiagram
participant Client
participant Server
participant CA as Certificate Authority
%% 1. 客户端发送Client Hello消息
Client->>Server: Client Hello (支持的版本, 加密套件, 随机数)
%% 2. 服务器回应Server Hello及其它消息
Server-->>Client: Server Hello (选择的加密套件, 随机数)
Server-->>Client: Certificate (服务器证书)
Server-->>Client: Server Key Exchange (如果需要临时密钥材料)
Server-->>Client: Certificate Request (可选, 如果需要客户端认证)
Server-->>Client: Server Hello Done
%% 3. 客户端处理服务器的响应并准备自己的消息
Client->>CA: 验证服务器证书 (通过CA信任链)
note right of Client: 确认证书的有效性、日期、域名匹配等
%% 4. 客户端发送必要的回复
Client->>Server: Client Certificate (如果被请求)
Client->>Server: Client Key Exchange (预主密钥或参与密钥交换)
%% 5. 可选的证书验证 alt 如果使用了客户端认证
Client->>Server: Certificate Verify (证明拥有私钥)end
%% 6. 更改密码规范并发送完成消息
Client->>Server: Change Cipher Spec
Client->>Server: Finished (基于新协商的密钥加密的消息)
%% 7. 服务器更改密码规范并发送完成消息
Server-->>Client: Change Cipher Spec
Server-->>Client: Finished (基于新协商的密钥加密的消息)
%% 8. 握手成功后开始加密通信
note over Client,Server: 握手完成,开始安全的数据传输
2. 用户、组、角色和策略
这一节主要介绍对用户进行认证的组件,包括OpenStack的Keystone和AWS的IAM。
2.1 基本概念
租户
租户(Tenant)是指使用云计算服务的一个逻辑实体或组织单元。每个租户通常代表一个独立的客户、部门、项目团队,或者是在同一企业内部的不同业务单元。租户之间的资源和服务是相互隔离的,即使它们共享相同的物理基础设施。
用户
在云中,用户也是一种资源,我们可以以某个用户的身份通过API创建、修改和删除某个资源。
OpenStack提供了角色功能,并支持Admin和Member两种角色。
- 在租户创建时,第一个用户资源会以Admin用户的身份创建,它跟操作系统的管理员用户一样。
- 然后可以通过API来创建一般用户,创建好的用户还需要分配权限,才能以这个用户身份进行API操作
组
与操作系统一样,云环境中也有组的概念,可以集中管理用户。对一个组应用策略,就可以应用于组内的所有用户。
策略
我们可以编写策略,通过权限来控制用户的操作。策略是JSON编写的,比如AWS IAM策略包含的基本元素有:
- Effect:结果,Allow表示允许,Deny表示拒绝
- Action:动作,指定允许或拒绝调用的API
- Resource:资源,指定允许或拒绝的资源
2.2. 认证密钥、令牌
认证密钥
- 用户在调用API时,除了ID还需要提供认证密钥。认证密钥具有认证功能,相当于传统的密码。
- 认证密钥是在云服务控制台中配置的。
令牌
- 如果将认证密钥直接嵌入CLI/SDK的初始配置中,或者放到API调用的请求消息头/查询参数中,可能会产生安全隐患。因此,大多数云环境会提供相当于临时密码的令牌功能。
- 生成令牌:通过调用获取令牌的API,就可以将用户名/密码转换成令牌,然后将令牌用于后续API请求的消息头中,就可以带着令牌信息调用API了。
2.3. 签名
对于端点散布于各地的云环境来说,除了使用HTTPS协议确保通信安全外,还用到API签名来确保请求完整性和来源验证,防止中间人攻击、篡改请求内容或伪造请求,进一步确保安全性。
API签名过程:
- 构建签名字符串:将API请求相关的值拼接成字符串,比如:
HTTP_METHOD + "\n" +
REQUEST_URI + "\n" +
QUERY_STRING + "\n" +
HEADERS + "\n" +
BODY_HASH + "\n" +
TIMESTAMP + "\n" +
NONCE (if applicable)
- 创建签名:选择加密算法,对构建好的签名字符串进行加密处理,得到最终的签名值。如果是非对称加密,则使用发送方的私钥;如果是对称加密,则使用预先共享的秘密密钥。
- 添加签名到请求:将生成的签名添加到HTTP请求头发送给服务器,常见的头部名称有
Authorization
、X-Signature
等。同时还需要传递用于生成签名的时间戳和其他必要参数,以便接收方能够重现相同的签名过程。 - 服务器端验证签名:
- 提取签名材料:从收到的请求中提取出所有用于签名的组件。
- 重建签名字符串:按照与客户端相同的方式重新构造待签名字符串。
- 解密签名:使用公钥(非对称加密)或共享密钥(对称加密)解密传入的签名。
- 对比签名:将解密后的签名与自己计算的结果进行比较。如果匹配,则认为请求是合法的;否则拒绝请求。
2.4 IAM角色、基于资源的策略
除了基于用户和组分配策略之外,在云环境我们还可以使用面向资源的架构来管理。
- AWS提供了两个面向资源分配策略的功能:IAM角色和基于资源的策略。
- 将IAM角色赋予资源后,无须认证密钥就能从该资源调用API;只要分配了策略的IAM角色,内部会使用STS实现免密钥调用API,进而提升安全性。
- IAM角色:IAM角色中的策略可以定义允许访问的资源,IAM角色只能访问其策略允许的资源
- 基于资源的策略:资源策略可以定义允许访问的IAM用户,资源只能被允许访问的IAM用户访问
2.5 跨租户的操作权限
我们可以创建跨租户的策略。
- 在OpenStack中,一个用户可以同时属于多个租户,因此我们可以为用户和租户的组合配置角色。当一个用户同时属于多个租户,那么它操作某个租户的资源时,所使用的是就是对应租户的角色(更具体来说,它使用的是对应租户的令牌)。
- 在AWS中,需要先在IAM角色的委托人中指定账户编号,然后调用AssumeRole API,这样才能允许来自其他租户的访问。只要为需要限制访问的资源指定好允许访问的第三方账户(租户)编号,就可以防止来自第三方的恶意访问。
3. 联合身份验证
联合身份验证机制(federation)是令牌的常见应用场景,它将权限委派给其他ID,从而提升认证过程的效率,很多互联网服务都充分利用了联合身份认证。比如很多网站都支持使用Google、Amazon网站的ID进行单点登录,基于HTTP的Web API同样支持这样的访问方式。
在联合身份验证中,像Google、Amazon这样的ID提供者(Identity Provider,IdP)就相当于替代用户(alternate-user),通过ID提供者和其他ID之间建立信任关系来实现联合身份验证。
对于现有的ID系统,既可以使用Google、Amazon这样的WebID进行联合身份验证,也可以使用SAML和OpenID Connect等访问方法。
- SAML:SAML(Security Assertion Markup Language,安全断言标记语言)是一种基于XML的标记语言,用于编写与用户认证、属性及访问许可相关的信息。通过HTTP协议交换SAML,即可实现单点登录。在云环境中,通过应用云提供的SAML元数据,即可建立其他ID与ID提供者之间的信任关系。
- OpenID Connect:OpenID Connect(简称OIDC)是基于OAuth 2.0协议的身份验证层,它会根据OpenID提供的认证信息,在其他ID和ID提供者之间建立信任关系。
小结
本章主要介绍了云环境中认证资源组件相关的机制以及安全的基础知识,包括证书、签名、令牌、联合身份认证等。