当前位置: 首页 > 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不可用场景,验证重试和错误处理逻辑。
http://www.xdnf.cn/news/30709.html

相关文章:

  • linux学习 5 正则表达式及通配符
  • 聊聊Spring AI Alibaba的ElasticsearchDocumentReader
  • JavaScript中的Event事件对象详解
  • 自由学习记录(56)
  • 背包 DP 详解
  • 【mongodb】数据库操作
  • TIM_ITConfig() 和 TIM_Cmd()
  • 当HTTP遇到SQL注入:Java开发者的攻防实战手册
  • 实用电脑工具,轻松实现定时操作
  • 《目标检测双雄:YOLO与Faster R-CNN,谁主沉浮?》
  • dotnet core webapi 实现 异常处理中间件
  • [密码学基础]GMT 0002-2012 SM4分组密码算法 技术规范深度解析
  • LNA设计
  • spring Ai---向量知识库(一)
  • 43.[前端开发-JavaScript高级]Day08-ES6-模板字符串-展开运算符-ES7~ES11
  • PyTorch深度学习框架60天进阶学习计划 - 第46天:自动化模型设计(一)
  • 在RK3588上使用哪个流媒体服务器合适
  • 在swiftui项目中使用WKWebView加载自定义脚本文件
  • 【HDFS入门】HDFS性能调优实战:关键参数对吞吐量的影响深度解析
  • c++ 类的语法1
  • UI文件上传
  • 深入解析进程与线程:区别、联系及Java实现
  • 设计模式-桥接模式
  • 14.解码器的Mask
  • End-to-End从混沌到秩序:基于LLM的Pipeline将非结构化数据转化为知识图谱
  • 从GET到POST:HTTP请求的攻防实战与CTF挑战解析
  • EF Core中动态加载关联的导航属性
  • 直线轴承的正确安装方式是什么?
  • LeetCode 热题 100_乘积最大子数组(88_152_中等_C++)(动态规划)
  • 虚拟现实(VR)技术在教育领域的创新应用