当前位置: 首页 > news >正文

实现Azure Databricks安全地请求企业内部API返回数据

需要编写一个Databricks在Azure云上运行,它需要访问企业内部的API获取JSON格式的数据,企业有网关和防火墙,API有公司的okta身份认证,通过公司的域账号来授权访问,现在需要创建一个专用的域账号,让Databricks访问Azure Key Vault,来获取账号密码,然后通过配置访问公司内部API的数据,请写出所有的开发配置步骤,以及完成这一功能的所有的Python源代码,需要确保安全性和可靠性。

完整开发配置步骤


一、前置条件准备
  1. 企业网络配置

    • 在Azure与企业内部网络之间建立 ExpressRouteSite-to-Site VPN 确保Databricks可访问内网API。
    • 在防火墙规则中允许来自Azure Databricks的IP范围和端口。
  2. 创建专用域账号

    • 在企业的Active Directory中创建专用服务账号(如 svc-databricks-api),授予该账号API访问权限。

二、Azure资源配置
  1. 创建Azure Key Vault

    • 在Azure Portal中创建Key Vault(如 kv-company-secrets)。
    • 启用 软删除清除保护 增强安全性。
  2. 存储敏感信息到Key Vault

    az keyvault secret set --vault-name kv-company-secrets --name "api-username" --value "svc-databricks-api"
    az keyvault secret set --vault-name kv-company-secrets --name "api-password" --value "P@ssw0rd!"
    az keyvault secret set --vault-name kv-company-secrets --name "okta-client-id" --value "0oa12b3c4d"
    az keyvault secret set --vault-name kv-company-secrets --name "okta-client-secret" --value "abc123-secret"
    
  3. 配置Azure Databricks托管身份

    • 在Databricks工作空间启用 Managed Identity
    • 在Key Vault的访问策略中,授予该托管身份 GetList 秘密的权限。

三、Okta应用配置
  1. 在Okta管理控制台:
    • 创建新应用(如 Databricks Internal API),选择 OAuth 2.0 Client CredentialsResource Owner Password 授权类型。
    • 绑定专用域账号并配置所需权限(Scopes)。

四、Python代码实现
from azure.identity import ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry# 安全配置
KEY_VAULT_URL = "https://kv-company-secrets.vault.azure.net"
OKTA_TOKEN_URL = "https://company.okta.com/oauth2/v1/token"
INTERNAL_API_URL = "https://internal-api.company.com/data"# 初始化Azure Key Vault客户端
credential = ManagedIdentityCredential()
secret_client = SecretClient(vault_url=KEY_VAULT_URL, credential=credential)def get_secret(secret_name):"""安全获取Key Vault中的秘密"""return secret_client.get_secret(secret_name).valuedef get_okta_token():"""通过Okta认证获取访问令牌"""client_id = get_secret("okta-client-id")client_secret = get_secret("okta-client-secret")username = get_secret("api-username")password = get_secret("api-password")data = {'grant_type': 'password','username': username,'password': password,'scope': 'api_access'}session = requests.Session()retries = Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504])session.mount('https://', HTTPAdapter(max_retries=retries))try:response = session.post(OKTA_TOKEN_URL,auth=(client_id, client_secret),data=data,timeout=10)response.raise_for_status()return response.json()['access_token']except requests.exceptions.RequestException as e:print(f"Okta token request failed: {e}")raisedef fetch_internal_data(token):"""调用内部API获取数据"""headers = {'Authorization': f'Bearer {token}'}session = requests.Session()session.headers.update(headers)try:response = session.get(INTERNAL_API_URL, timeout=15)response.raise_for_status()return response.json()except requests.exceptions.RequestException as e:print(f"API request failed: {e}")raise# 主逻辑
if __name__ == "__main__":try:access_token = get_okta_token()data = fetch_internal_data(access_token)print("Data retrieved successfully:", data)except Exception as e:print("Critical error:", str(e))# 发送警报或记录到监控系统

五、安全增强措施
  1. 网络隔离
    • 将Databricks集群部署在Azure 虚拟网络(VNet) 中,启用网络安全组(NSG)限制入站流量。
  2. 密钥轮换
    • 在Key Vault中启用 自动密钥轮换策略,定期更新密码和客户端密钥。
  3. 日志与监控
    • 启用Azure Monitor和Databricks审计日志,跟踪所有秘密访问和API调用。
  4. 最小权限原则
    • 确保托管身份和Okta应用仅拥有必要的最小权限。

六、部署与验证
  1. 部署到Databricks
    • 将代码上传至Databricks工作区,配置Job或Notebook使用 高并发模式 集群。
  2. 端到端测试
    • 验证从Key Vault获取秘密、Okta令牌颁发、API调用的完整链路。
  3. 故障恢复测试
    • 模拟网络中断、Key Vault不可用场景,验证重试和错误处理逻辑。

相关文章:

  • 【MySQL】004.MySQL数据类型
  • 【Openlayers】Openlayers 入门教程
  • ARINC818-实现
  • 解决 IntelliJ IDEA 项目启动时端口冲突问题
  • Spring Boot中Excel处理完全指南
  • 基于chatgpt和deepseek解答显卡的回答
  • PyTorch数据操作基础教程:从张量创建到高级运算
  • STM32 外部中断EXTI
  • 原生localStorage到zustand + persist改造
  • [密码学基础]密码学发展简史:从古典艺术到量子安全的演进
  • 碰一碰发视频系统源码搭建全解析:定制化开发
  • 芝法酱躺平攻略(21)——kafka安装和使用
  • LabVIEW 程序维护:为何选靠谱团队?
  • 纯FPGA控制AD9361的思路和实现之一 概述
  • JVM 系列:JVM 内存结构深度解析
  • Day10【基于encoder- decoder架构实现新闻文本摘要的提取】
  • 面向对象设计中的类的分类:实体类、控制类和边界类
  • 暨南大学 2024年ACM程序设计校赛 题解与知识点分析
  • SOA 核心三要素:服务、构件与对象的深度解析
  • 毕业答辩的PPT应该包括哪些内容?
  • 淄博张店区国资公司挂牌转让所持“假国企”股权,转让底价为1元
  • 黄仁勋结束年内第二次中国行:关键时刻,重申对中国市场承诺
  • 专访|《触碰你》导演长井龙雪:“秩父铁三角”不只是朋友
  • 本周看啥|孤独的美食家,蛮好的人生
  • 硅基世界的“缘分”——系统与人工智能携手进化
  • 经济日报:扩大内需与扩大开放并行不悖