ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Data Formulator 凭证保险箱(Credential Vault)深度解析:加密存储、安全模型与部署实践

Data Formulator 凭证保险箱(Credential Vault)深度解析:加密存储、安全模型与部署实践 Data Formulator 凭证保险箱Credential Vault深度解析加密存储、安全模型与部署实践【免费下载链接】data-formulator Data Formulator is an interactive AI-powered data analysis system makes it easy to connect, explore and visualize data.项目地址: https://gitcode.com/GitHub_Trending/da/data-formulator适用版本Data Formulator 0.7 | 面向读者部署运维人员、管理员、需要理解凭证保存行为的用户Data Formulator 是面向交互式 AI 数据分析的开放系统支持连接并探索数据库、数据湖等外部数据源。为了在服务端安全保存数据库密码、访问 token、API key 等敏感凭证项目引入了 Credential Vault凭证保险箱机制。本文以 docs/docs-cn/6-credential-vault.md 为主体结合py-src/data_formulator/auth/vault/源码与测试用例系统讲解 Vault 的零配置启动、Fernet 加密安全模型、DataConnector 生命周期集成、TokenStore 优先级链、手动 REST API 以及 Docker 部署与密钥管理帮助读者完整掌握凭证的安全保存与恢复策略。1. 功能简介Vault 到底保存什么、不保存什么Credential Vault 用于在服务端加密保存外部数据源凭证典型内容包括数据库密码MySQL、PostgreSQL、SQL Server、Kusto、MongoDB、CosmosDB 等访问 tokenSuperset 等 SSO 数据源的 service tokenAPI keyBigQuery、S3、Azure Blob、Athena 等云服务的凭证。DataConnector 连接成功后可以把敏感凭证保存到 vault后续用户打开同一个连接时无需重新输入直接由后端从 vault 解密取出并重建 loader。需要特别强调边界Vault只保存凭证不保存连接卡片本身。连接卡片connector 定义保存在 YAML 配置文件中按管理员全局与用户个人分两级DATA_FORMULATOR_HOME/connectors.yaml # 管理员全局连接 DATA_FORMULATOR_HOME/users/identity/connectors.yaml # 用户个人连接注从 data_connector.py 的create_connector实现看用户连接除了上述users/identity/connectors.yaml还会以 JSON 形式持久化到DATA_FORMULATOR_HOME/users/identity/connectors/source_id.json二者共同构成连接定义层而密码等敏感字段被_connector_config_paramsdata_connector.py剥离只把非敏感参数落盘敏感凭证一律进入 vault。这种定义与凭证分离的设计是本文理解一切后续行为的基础。2. 零配置启动本地开箱即用本地使用无需任何配置。首次使用 vault 时系统自动完成两件事生成 Fernet 加密密钥写入DATA_FORMULATOR_HOME/.vault_key创建加密数据库DATA_FORMULATOR_HOME/credentials.db。首次运行后数据目录结构大致如下~/.data_formulator/ ├── .vault_key ├── credentials.db ├── connectors.yaml # 可选管理员预配置连接 └── users/ └── identity/ ├── connectors.yaml # 用户创建的连接 └── ...这些文件在重启和升级后持续保留迁移服务器时必须一起备份详见 docs/docs-cn/7-server-migration-guide.md。源码级印证密钥解析与库表结构零配置自动化的实现位于 auth/vault/init.py 的_resolve_key先检查CREDENTIAL_VAULT_KEY环境变量未设置时读取.vault_key文件若文件也不存在则调用Fernet.generate_key()自动生成并写回文件key_file.write_text(new_key \n, encodingutf-8)。get_credential_vault()是全局单例工厂还有两个特殊分支当通过disable_data_connectors禁用数据连接器时如 ephemeral demo 部署跳过 vault 创建当密钥解析失败时返回None插件退化为仅会话存储。credentials.db的库表由 auth/vault/local_vault.py 的_init_db创建核心为一张credentials表CREATE TABLE IF NOT EXISTS credentials ( user_id TEXT NOT NULL, source_key TEXT NOT NULL, encrypted_data BLOB NOT NULL, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (user_id, source_key) )encrypted_data是经 Fernet 加密后的密文 BLOB主键(user_id, source_key)直接对应下文访问隔离按身份 数据源 key 的设计。3. 安全模型Fernet 加密 逻辑隔离Vault 的安全设计可归纳为下表方面设计加密算法FernetAES-128-CBC HMAC-SHA256密钥存储DATA_FORMULATOR_HOME/.vault_key或CREDENTIAL_VAULT_KEY环境变量数据库位置DATA_FORMULATOR_HOME/credentials.db访问隔离按(user_identity, connector_id)逻辑隔离前端隔离明文凭证不返回前端前端只看到连接状态、参数表单和非敏感配置传输安全生产环境应使用 HTTPS几个要点需要展开Vault 是逻辑隔离不是每用户一个数据库文件。所有用户的凭证都放在同一个credentials.db中通过user_id区分。因此服务端进程持有加密密钥备份与权限管理应以整个DATA_FORMULATOR_HOME为单位处理。加密写入store将凭证字典json.dumps后经self._fernet.encrypt(...)加密再写入 SQLiteretrieve则decrypt后json.loads还原见 local_vault.py。若解密失败如密钥不匹配retrieve返回None并记录 warning而不是崩溃。身份命名空间user_id来自 auth/identity.py 的get_identity_id()取值形如user:alicecorp.comOIDC 认证用户、local:os_username单用户 localhost、browser:uuid匿名浏览器 UUID。前缀命名空间确保认证用户的数据无法通过伪造 header 访问匿名用户也无法读取他人凭证。前端隔离所有凭证 API 都不向浏览器返回明文。/api/credentials/list只返回哪些 source key 存了凭证。传输层安全不在 vault 本身范畴生产环境必须通过反向代理或直接配置启用 HTTPS避免凭证在网络上明文传输。4. DataConnector 工作流程创建 / 重连 / 断开与删除4.1 创建连接用户填写连接参数后后端依次执行用户填写连接参数 ↓ POST /api/connectors ↓ 后端创建用户 connector 定义 ↓ 如果参数足够立即连接并测试 ↓ 非敏感参数写入 users/identity/connectors.yaml 敏感凭证加密写入 credentials.db从源码看create_connectordata_connector.py会先剥离敏感参数生成default_params并持久化连接定义随后若提供了connect_params调用connector._connect(connect_params)建 loader 并test_connection()测试通过后调用connector._persist_credentials(connect_params)由_vault_store将完整user_params含密码加密写入 vault见 data_connector.py。注意只有连接测试成功才会持久化凭证避免把错误密码写进库。4.2 重新连接用户点击已存在的数据源卡片 ↓ 后端按 identity connector_id 查找连接定义 ↓ 如需要凭证则从 vault 取出并创建 loader ↓ 连接成功后进入 catalog 浏览和导入界面实际重连逻辑在_try_auto_reconnectdata_connector.py从 vault 取出stored_params与默认参数合并创建 loader 并test_connection()。关键实现细节包括重试与退避最多尝试_RECONNECT_MAX_ATTEMPTS 3次退避间隔为0.5s、1.0s_RECONNECT_BACKOFF_BASE 0.5用于扛过网络抖动、token 交换等瞬时故障过期凭证清理只有当所有尝试都失败时才_vault_delete(identity)清除失效凭证两级兜底无 vault 凭证时对 token/SSO 模式走_try_sso_auto_connect对 Kusto 这类使用DefaultAzureCredential/托管身份的环境凭据连接器走_try_ambient_reconnect直接用持久化的连接参数重连见 data_connector.py。4.3 断开和删除操作连接卡片当前 loaderVault 凭证Disconnect保留清除清除当前服务 token/凭证Delete删除清除删除Disconnect适合临时切换账号或清理当前授权连接定义保留方便之后一键重连Delete表示不再需要该用户连接连接定义、内存 loader、vault 凭证一并清除管理员预配置的连接不能由普通用户删除从 data_connector.py 的delete_connector看删除用户连接时同时清除 vault 凭证并移除配置文件管理员admin连接删除会返回 403。在 TokenStore 侧clear_service_tokentoken_store.py会同时清除 Session 缓存和 vault 凭证并对sso_exchange模式的数据源在当前浏览器会话中阻止自动重连直到用户显式重新登录。5. TokenStore 与 SSO六级凭证解析优先级链对于 Superset 等支持 SSO 或弹窗委托登录的数据源系统并非直接使用 vault而是通过统一的 auth/token_store.py 解析凭证。其get_access(system_id)实现了一个六级优先级链Session 中已有目标系统 token未过期则直接返回access_tokenrefresh token 可续期向token_url发起 refresh_token 换取新 token用 Data Formulator 的 SSO token 换取目标系统 tokensso_exchangePOST 到exchange_url使用弹窗委托登录保存的 tokendelegated模式使用 vault 中保存的静态凭证_try_vault→vault.retrieve(identity, system_id)无可用凭证提示用户重新授权或重新输入。其中第 5 级的_vault_retrievetoken_store.py会通过get_identity_id()取得当前身份再调用 vault 单例按(identity, system_id)读取。这解释了文档中TokenStore 会优先使用当前 Session 中的 service token 或通过 SSO exchange 获取目标系统 token静态凭证是更靠后的兜底的行为动态 token 优先于静态密码vault 主要用于没有 SSO 能力的场景或刷新链路全部失效时的最后手段。从源码结构看_all_auth_configs会遍历所有已注册的DATA_LOADERS收集声明了auth_config()mode 为sso_exchange/oauth2/delegated等的 loader为其建立 token 解析通道。OIDC/TokenStore 的完整开发细节见 docs/dev-guides/4-authentication-oidc-tokenstore.md。6. 手动 API通用凭证接口尽管普通 DataConnector 流程无需直接调用系统仍保留一套通用的凭证 REST API实现于 routes/credentials.py方法路径用途GET/api/credentials/list列出有存储凭证的 source key不暴露密码POST/api/credentials/store存储或更新凭证POST/api/credentials/delete删除凭证接口行为要点全部按身份隔离每个端点都通过get_identity_id()取得当前用户只能读写自己的凭证/list不暴露明文只返回{sources: [...]}即存有凭证的 source_key 列表见 credentials.py/store校验必填字段缺少source_key或credentials时返回INVALID_REQUESTvault 未配置时返回SERVICE_UNAVAILABLE见 credentials.py。DataConnector 的连接、断开、删除操作会通过/api/connectors/*路由完成对应的 vault 生命周期处理因此普通用户通常不需要直接调用上述三个端点。7. Docker 部署挂载数据目录 外部密钥注入7.1 挂载整个数据目录Docker 部署时只需挂载完整数据目录密钥、凭证库、连接配置和用户数据都会包含其中volumes: - df-data:/root/.data_formulator注意挂载点必须是DATA_FORMULATOR_HOME的实际路径镜像内默认~/.data_formulator且必须保留.vault_key与credentials.db两个文件——只挂载部分目录会导致密钥与密文分离vault 将无法解密。7.2 使用外部 Secret Manager 注入密钥如果使用外部 Secret Manager如云厂商的密钥托管服务管理密钥可以通过环境变量注入避免密钥落盘CREDENTIAL_VAULT_KEYyour-fernet-key设置后.vault_key文件将被忽略系统直接使用环境变量中的密钥。这为容器化部署提供了确定性密钥_resolve_key中环境变量优先级高于文件见 auth/vault/init.py。8. 生成 Vault 密钥与密钥丢失后果需要外部生成 Fernet 密钥例如在 CI/CD 中预生成再注入 Secret Manager时使用python -c from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())密钥丢失的后果如果密钥丢失credentials.db中的已保存凭证无法恢复——Fernet 的 HMAC-SHA256 完整性校验会直接拒绝解密对应retrieve中except Exception返回None的分支。届时用户需要重新输入外部数据源密码或重新走 SSO/弹窗委托授权流程。因此运维上的建议是DATA_FORMULATOR_HOME含.vault_key、credentials.db、connectors.yaml应整体纳入备份策略密钥本身应像其他主密钥一样受控保管并考虑定期轮换轮换时需同步迁移已加密数据或接受重新授权成本。9. 相关文件与源码地图Vault 功能的核心源码位于py-src/data_formulator/auth/vault/ ├── __init__.py # 工厂密钥解析env .vault_key 自动生成、单例创建 ├── base.py # CredentialVault 抽象接口store/retrieve/delete/list_sources └── local_vault.py # LocalCredentialVaultSQLite Fernet 实现周边配合模块auth/token_store.py —— 六级凭证解析链统一供 Agent、DataConnector、routes 调用auth/identity.py —— 身份解析与命名空间user:/local:/browser:data_connector.py —— 连接生命周期与 vault 集成_vault_store/_vault_retrieve/_vault_delete、自动重连routes/credentials.py —— 手动凭证 APItests/backend/auth/test_credential_vault.py 与 tests/backend/auth/test_credential_vault_factory.py —— 覆盖加解密、工厂密钥解析优先级、vault 未配置等分支的单元测试。相关文档docs/docs-cn/1-data-source-connections.mddocs/docs-cn/7-server-migration-guide.mddocs/dev-guides/4-authentication-oidc-tokenstore.mddocs/dev-guides/5-data-connector-api.md小结Data Formulator 的 Credential Vault 用一条清晰的职责边界连接定义落盘 YAML、敏感凭证加密入库解决了多数据源场景下免重复输入密码与明文凭证不落盘的矛盾本地单用户零配置即可启用 Fernet 加密多用户部署按(identity, source_key)逻辑隔离Docker/生产环境可通过CREDENTIAL_VAULT_KEY把密钥管理上移到 Secret Manager。理解密钥丢失即凭证不可恢复这一约束并在备份、迁移参考 docs/docs-cn/7-server-migration-guide.md与轮换策略中把.vault_key与credentials.db作为一个整体对待是安全运维该功能的关键。【免费下载链接】data-formulator Data Formulator is an interactive AI-powered data analysis system makes it easy to connect, explore and visualize data.项目地址: https://gitcode.com/GitHub_Trending/da/data-formulator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表