Vault AppRole最佳实现过程

AppRole 是 Vault 中一种面向自动化工作流程的身份验证方法,适用于机器和服务。本文介绍了AppRole的工作原理、核心安全设计,如Cubbyhole Response Wrapping,并详细阐述了创建与管理AppRole的流程,包括Python实践中的封装和解封操作。
摘要由CSDN通过智能技术生成

AppRole

AppRole身份验证方法允许机器或应用程序使用 Vault 定义的角色进行身份验证。AppRole 的开放式设计支持使用不同的工作流和配置来应对大量应用程序。这种身份验证方法主要是面向自动化工作流程(机器和服务)设计的,对人类操作者不太有用。

“AppRole”代表一组 Vault 策略和登录约束,必须满足这些策略才能使用这些策略获取令牌。范围可以根据需要进行调整。可以为特定机器、甚至该机器上的特定用户或跨机器的服务创建 AppRole。成功登录所需的凭据取决于相关联的 AppRole 所设置的约束。

以下是基于封包机制,提供了几乎完美的过程保护机制。

图中第6、7、8、9是保护过程安全的核心设计(封包机制:Cubbyhole Response Wrapping,通过一个极短生命周期的凭证来尽可能减少过程暴露的风险)q qun 830709780。

AppRole

  • AppRole的管理只能通过cli或api操作,UI页面未提供功能。

  • 创建approle的参数
    • 如果您的 approle 签发的令牌需要能够创建子令牌,您需要将token_num_uses设置为0。
  • SecretID的维护机制

操作流程

1. 创建Approle认证挂载点

vault auth enable approle
# 查看挂载点
vault auth list

2. 创建一个基于approle认证方式的role——app-role

vault write auth/approle/role/app-role
# 列举角色
vault list auth/approle/role
# 查看角色app-role
vault read auth/approle/role/app-role

3. 查看app-role的role-id

vault read auth/approle/role/app-role/role-id

4. 将secret-id通过wrap封装,生成一个wrapping_token

# wrapping_token生命周期为60秒
vault write -f -wrap-ttl=60s auth/approle/role/app-role/secret-id

5. 将上一步生成的wrapping_token通过unwrap解封,拿到真正的secret-id

vault unwrap hvs.CAESIGjCf15OmzBiRgQGDKVJluJO8sUxwdQlxpCJz5hHpgqwGh4KHGh2cy5tVkEzbXVPekVubHBNcnZCUVdCRU16Z3U
# 生产环境整个过程中真实secret-id都不会被暴露出来!

python实践

通过wrap封装secret-id

# filename:approle.py
import hvac

client = hvac.Client(url='https://xxxx',token='hvsXXXX', verify=False)

def secret_id():
    client.write(path='auth/approle/role/test')
    response = client.write(path='auth/approle/role/test/secret-id',wrap_ttl='10s')
    unwrapped_token = client.sys.unwrap(response['wrap_info']['token'])
    return unwrapped_token['data']['secret_id']

应用获取secret-id,读取机密信息

import hvac
import approle # 获取secret-id模块

# 初始化Vault客户端
client = hvac.Client(url='https://xxxx', verify=False)

# 定义AppRole相关信息
role_id = '0bf98057-039c-5aa7-8b72-18131d5f325d'
secret_id = approle.secret_id()

client.auth.approle.login(
    role_id=role_id,
    secret_id=secret_id
)

secret_version_response = client.secrets.kv.v2.read_secret_version(mount_point='secret', path='kv/a2')

print(secret_version_response['data']['data'])
# {'email': 'example@qq.cn', 'password': 'acd', 'username': 'test'}

相关链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流浪法师12

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

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

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

打赏作者

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

抵扣说明:

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

余额充值