网络安全分类:访问控制、身份管理、数据加密与网络防护的清晰分类
澄清认证和授权的区别
认证(Authentication)和授权(Authorization)是信息安全领域中两个重要但不同的概念。他们结合起来使用。通过了身份验证,然后被授权,是一个普遍应该有的过程。
- 认证是确认用户身份的过程。在这个过程中,系统验证用户声称的身份是否与其真实身份相匹配。
- 认证通常涉及提供一些凭据来证明身份,比如用户名和密码、数字证书、生物特征(如指纹、虹膜扫描)等。认证通常依赖于凭据的验证,确保用户提供的凭据是合法和有效的。
- 认证过程通常由系统提供一些认证机制来实现,比如基于用户名密码的认证、单点登录(SSO)、多因素认证等。
- 授权是确定用户是否有权执行某项操作的过程。在这个过程中,系统验证用户是否被允许执行特定的操作或访问特定的资源。
- 授权的内容涉及用户被授予的权限和访问范围。
- 授权通常定义了用户能够执行的操作,以及能够访问的资源。
- 授权通常在认证成功后进行,因为需要先确认用户的身份,然后才能确定其是否有权执行特定操作或访问特定资源。
他们经常结合使用,比如OAuth和OpenIDConnect的功用:
- OAuth是进行授权(日语叫做认可)的协议,OIDC是进行认证的协议。
- OAuth使用token进行资源授权,身份认证,和权限转移。它是为了保护API而诞生的。有了token它就不需要进行ID和密码验证了。
- OIDC是使用IDtoken进行身份验证的协议,更加安全。
之前做的GCP workload identity可以进行应用的认证,而内部的属性mapping可以进行更详细的认可授权。然后针对要使用的SA会生成一个IAM,它对SA享有使用权限,然后就可以操作云内部的服务了,是一个很不错的服务。
关于token令牌:
在授权过程中,token(令牌)是一种用于表示用户身份和权限的凭证。它是在用户通过认证后生成的,并被用于在系统中进行授权和访问控制。
具体来说,token通常包含了一些信息,比如用户的身份信息、权限信息、有效期等。系统根据这些信息来验证用户的身份和权限,从而决定是否授权用户执行某项操作或访问某个资源。
在实际应用中,常见的token包括:
- 访问令牌(Access Token):
- 访问令牌是最常见的一种token,用于表示用户在系统中进行操作的权限。
- 当用户通过认证后,系统会生成一个访问令牌,并在用户每次请求时将其发送给服务器。
- 服务器在收到访问令牌后,会验证其有效性,并根据其中包含的信息决定是否授权用户执行请求的操作。
- 刷新令牌(Refresh Token):
- 刷新令牌用于获取新的访问令牌。
- 通常情况下,访问令牌具有一定的有效期,在过期之后需要使用刷新令牌来获取新的访问令牌。
- 刷新令牌通常比访问令牌更长期有效,但它本身不能用于执行操作或访问资源。
- 身份令牌(ID Token):
- 身份令牌用于表示用户的身份信息。
- 在一些场景中,认证成功后会生成身份令牌用于传递用户的身份信息,但并不用于访问控制。
这些token通常使用JWT(JSON Web Token)或类似的格式进行编码和传输,以确保其安全性和可靠性。在授权过程中,token起到了非常重要的作用,它们是系统进行访问控制和权限管理的基础。
ID token:
ID令牌(ID Token)是在 OpenID Connect(OIDC)协议中使用的一种令牌,用于表示用户的身份信息。OIDC是建立在OAuth 2.0协议之上的身份认证协议,它允许客户端应用程序验证终端用户并获取关于用户的信息。
ID令牌的作用:
- 提供了有关身份认证的信息,如用户ID、姓名、电子邮件等。
- 充当身份验证的证明,以便客户端应用程序可以验证用户的身份。
- 通常使用JWT(JSON Web Token)格式编码和传输,以确保其安全性和可靠性。
OIDC 如何通过 ID 令牌工作:
- 客户端应用程序向认证服务器发起认证请求,请求授权并获取用户身份信息。
- 用户被重定向到认证服务器进行身份验证。用户提供必要的凭据(例如用户名和密码)进行认证。
- 认证服务器验证用户身份后,颁发一个 ID 令牌给客户端应用程序。
- 客户端应用程序接收到 ID 令牌后,会验证令牌的签名、有效期等信息,确保令牌的可靠性和有效性。
- 客户端应用程序解析 ID 令牌,从中提取有关用户的信息,如用户ID、姓名、电子邮件等。
- 客户端应用程序根据获取的用户信息,完成用户身份认证和授权操作。
通过这个过程,OIDC允许客户端应用程序在与认证服务器通信时安全地获取用户身份信息,并使用 ID 令牌进行身份验证和授权操作。这种机制使得客户端应用程序能够轻松地集成身份认证功能,同时保障了用户身份信息的安全性和隐私。
一、访问控制认证和授权:守卫网络安全的第一道防线
重要知识点:
- 访问控制的基本概念:控制谁可以访问什么以及可以做什么。
- 访问控制模型:强制访问控制(MAC)、自主访问控制(DAC)、角色基访问控制(RBAC)等。
- 访问控制技术:用户身份验证、授权、权限管理等。
核心概念:
- 最小特权原则:用户只拥有完成工作所需的最低权限。
- 分离职责原则:不同的用户或实体应承担不同的职责,以降低安全风险。
- 审计和日志记录:记录用户活动,以便跟踪和分析安全事件。
必须掌握的技术:
- 用户身份验证技术:用户名和密码、生物识别、多因素身份验证等。
- 授权技术:访问控制列表(ACL)、角色分配(RBAC)、属性基访问控制(ABAC)等。
- 权限管理技术:权限分配、权限变更、权限撤销等。
二、用户身份管理和验证:确保只有合法用户才能进入
重要知识点:
- 用户身份管理的基本概念:创建、维护和管理用户帐户。
- 用户身份验证技术:用户名和密码、生物识别、多因素身份验证等。
- 身份认证协议:SAML、OAuth、OpenID Connect等。
核心概念:
- 强密码策略:要求用户使用强密码,并定期更改密码。
- 账号锁定策略:在多次登录失败后锁定账号,以防止暴力破解。
- 身份验证日志记录:记录身份验证事件,以便跟踪和分析可疑活动。
必须掌握的技术:
- 用户帐户管理:创建、修改、删除用户帐户。
- 身份验证配置:配置身份验证协议和参数。
- 身份验证日志分析:分析身份验证日志,识别可疑活动。
三、加密数字签名和数据安全:为数据穿上坚实的盔甲
重要知识点:
- 加密的基本概念:将数据转换为无法读取的格式。
- 加密算法:对称加密、非对称加密、哈希函数等。
- 数字签名:用于验证数据完整性和来源。
核心概念:
- 机密性:保护数据不被未经授权的访问。
- 完整性:确保数据未被篡改。
- 非否认性:确保数据发送者无法否认其发送过数据。
必须掌握的技术:
- 加密算法的应用:使用加密算法加密和解密数据。
- 数字签名生成和验证:生成和验证数字签名。
- 密钥管理:生成、存储和管理加密密钥。
- 哈希化的技术和原理。(加密可以被解密,哈希化无法返回原来的内容)
四、网络安全和防火墙和入侵防护:抵御网络攻击的坚固盾牌
重要知识点:
- 网络安全的基本概念:保护网络和系统免受攻击。
- 网络安全威胁:病毒、木马、蠕虫、网络钓鱼、SQL注入等。
- 网络安全防护技术:防火墙、入侵检测系统(IDS)、入侵防护系统(IPS)等。
核心概念:
- 防御深度:部署多层防护措施,以提高安全防护能力。
- 持续监测:持续监测网络活动,以发现和响应安全威胁。
- 风险评估:定期评估网络安全风险,并采取相应的防护措施。
必须掌握的技术:
- 防火墙配置:配置防火墙规则,以允许或阻止特定类型的流量。
- IDS/IPS部署:部署IDS/IPS系统,以检测和阻止网络攻击。
- 安全漏洞管理:识别和修复安全漏洞。
其他技术概念和帮助理解的补充
JWT(JSON Web Token)是一种用于在网络应用之间安全地传输信息的开放标准(RFC 7519)。它是一种轻量级、紧凑且自包含的令牌(Token)格式,通常用于身份验证和声明传输。
创建 JWT 主要涉及以下几个步骤:
- Payload 数据:定义需要在令牌中传输的数据。Payload 是一个 JSON 对象,通常包含用户身份信息、权限声明以及其他任何相关数据。
- Header 数据:定义令牌的元数据信息,例如令牌类型、加密算法等。Header 也是一个 JSON 对象。
- 签名(可选):如果需要对令牌进行签名以确保数据的完整性和验证来源,则需要使用密钥对 Header 和 Payload 进行签名。
- 编码:将 Header 和 Payload 数据进行 Base64 编码,并通过句点(.)连接起来。
- 生成令牌:将编码后的 Header 和 Payload 数据与可选的签名组合在一起,形成最终的 JWT。
JWT 的工作流程通常如下:
- 用户进行身份认证后,服务器生成 JWT,并将其发送给客户端。
- 客户端在以后的请求中将 JWT 放入 HTTP 请求头部(通常是 Authorization 头部)或其他适当的位置。
- 服务器接收到包含 JWT 的请求后,验证 JWT 的签名(如果有的话)并解码 Payload 中的数据,以验证用户的身份和权限。
- 当服务器收到令牌时,它会从该令牌中获取标头和有效负载。然后,它使用密钥或公钥(在非对称签名的情况下)从标头和有效负载生成签名。如果生成的签名与 JWT 中提供的签名匹配,则认为它是有效的。
-
如果 JWT 验证通过,则服务器处理请求,并根据 Payload 中的数据执行相应的操作。
- SSL证书(Secure Sockets Layer certificate)是用于在互联网上加密通信的一种数字证书。它是由认证机构(CA,Certificate Authority)签发的,用于验证网站身份并加密数据传输。SSL证书通常用于HTTPS协议,以确保在客户端和服务器之间传输的数据是安全的。
-
TLS(Transport Layer Security)是一种用于在互联网上安全地传输数据的协议,它通过加密和认证机制保护客户端和服务器之间的通信安全,防止数据被窃听、篡改或伪造。TLS利用握手协议进行版本和加密算法的协商,通过数字证书实现身份验证,使用对称密钥和公钥加密技术对数据进行加密,并通过消息认证码验证数据的完整性,确保通信过程的安全性和可靠性。TLS在互联网上的各种应用场景中得到了广泛的应用,如HTTPS、SMTPS和FTPS等协议,为用户隐私和数据安全提供了有效的保障。
- 基于会话的身份验证中,用户信息存储在服务器上。这导致了许多与性能和可扩展性相关的问题。但是如果我们不想在服务器上保存用户信息怎么办?我们无法将用户信息保存在 cookie 中,因为它们有大小限制,而且也不安全。我们有 cookie 的替代方案,这个替代方案就是令牌(JWT)。令牌可以以加密的形式存储所有用户信息,并且该令牌可以存储在客户端。
-
OAuth(开放授权)协议定义了多种授权方式,以满足不同场景下的授权需求。以下是OAuth协议中常见的授权方式:
- 授权码模式(Authorization Code Grant):客户端通过授权服务器中转,使用授权码换取访问令牌。
- 隐式授权模式(Implicit Grant):客户端直接从授权服务器获取访问令牌,跳过授权码交换步骤。
- 密码模式(Resource Owner Password Credentials Grant):客户端直接使用用户的用户名和密码向授权服务器请求访问令牌。
- 客户端凭证模式(Client Credentials Grant):客户端使用自身凭证向授权服务器请求访问令牌,无需用户参与。
- 设备授权模式(Device Authorization Grant):用于设备上无法直接输入用户凭据的情况下,通过其他设备进行身份验证。
-
JWT Bearer授权模式:客户端通过携带JWT令牌直接向授权服务器请求访问令牌,无需额外的授权码或用户凭据。
- 身份提供商(Identity Providers)是指提供用户身份验证和认证服务的服务提供商。它们负责管理和验证用户的身份信息,并为用户生成安全令牌以授权他们访问受保护的资源。身份提供商的意义在于统一管理用户身份验证流程,减少了网站和应用程序需要自行处理身份验证的工作量,提高了安全性和用户体验。通过身份提供商,用户可以使用单一的身份验证凭据(例如用户名和密码)在多个网站和应用程序之间进行身份验证,而无需为每个网站或应用程序创建新的账户和凭据,从而简化了用户管理和身份验证的流程。此外,身份提供商还能够提供多种身份验证方法,如多因素身份验证、社交登录等,以满足不同用户和应用的需求。
使用 Python 创建 OAuth 授权
这段代码演示了如何使用 Python 创建 OAuth 授权的过程,主要流程包括以下几个步骤:
- 定义 OAuth 配置信息:
- 在代码中首先定义了 OAuth 所需的配置信息,包括客户端 ID(client_id)、客户端密钥(client_secret)、授权 URL(authorization_base_url)、令牌 URL(token_url)和重定向 URI(redirect_uri)等。
- 创建 OAuth 会话:
- 使用 requests_oauthlib 库中的 OAuth2Session 类创建了一个 OAuth 会话对象(oauth),并传入了客户端 ID 和重定向 URI。
- 获取授权 URL:
- 使用 OAuth 会话对象的
authorization_url()
方法获取了授权 URL,并返回给用户。用户需要访问此 URL 来进行授权。
- 用户授权:
- 用户访问授权 URL 后,将被重定向到 OAuth 提供商的授权页面,在该页面中用户需要登录并授权客户端应用的访问权限。授权完成后,用户会被重定向回指定的重定向 URI,并携带授权码。
- 获取访问令牌:
- 用户在重定向后的页面中,将授权码输入到客户端应用中,客户端应用使用授权码和客户端密钥向 OAuth 提供商发送请求,获取访问令牌。这一步通过调用 OAuth 会话对象的
fetch_token()
方法来完成,传入了令牌 URL 和授权码等参数。
- 访问受保护资源:
- 获取到访问令牌后,客户端应用可以使用该令牌来访问受保护的资源。在示例中,使用 OAuth 会话对象的
get()
方法发送了一个 GET 请求,获取了受保护资源的信息,并将返回的响应打印出来。
整个流程涵盖了 OAuth 的授权过程,包括获取授权 URL、用户授权、获取访问令牌以及访问受保护资源等步骤,通过这些步骤可以实现安全的身份验证和资源访问。
以下是一个简单的使用 Python 创建 OAuth 授权的示例代码,使用了 requests_oauthlib 库:
from requests_oauthlib import OAuth2Session
# 定义 OAuth 配置信息
client_id = 'your_client_id'
client_secret = 'your_client_secret'
authorization_base_url = 'authorization_url'
token_url = 'token_url'
redirect_uri = 'redirect_uri'
api_endpoint_url = 'api_endpoint_url'
# 创建 OAuth 会话
oauth = OAuth2Session(client_id, redirect_uri=redirect_uri)
# 获取授权 URL,重定向用户到该 URL 进行授权
authorization_url, state = oauth.authorization_url(authorization_base_url)
# 打印授权 URL,用户需要访问此 URL 进行授权
print('Please go to %s and authorize access.' % authorization_url)
# 获取用户授权后的重定向 URL,并从中提取授权码
redirect_response = input('Paste the full redirect URL here: ')
token = oauth.fetch_token(token_url, authorization_response=redirect_response, client_secret=client_secret)
# 使用授权后获得的访问令牌,发送请求获取用户信息
response = oauth.get(api_endpoint_url)
# 打印用户信息
print(response.json())
请注意替换示例代码中的 your_client_id
、your_client_secret
、authorization_url
、token_url
、redirect_uri
和 api_endpoint_url
为实际的值,以符合你的 OAuth 配置和应用需求。此示例演示了如何使用 OAuth2Session 类创建 OAuth 会话,并通过获取授权码和访问令牌来访问受保护的资源。