实现Azure Databricks安全地请求企业内部API返回数据
需要编写一个Databricks在Azure云上运行,它需要访问企业内部的API获取JSON格式的数据,企业有网关和防火墙,API有公司的okta身份认证,通过公司的域账号来授权访问,现在需要创建一个专用的域账号,让Databricks访问Azure Key Vault,来获取账号密码,然后通过配置访问公司内部API的数据,请写出所有的开发配置步骤,以及完成这一功能的所有的Python源代码,需要确保安全性和可靠性。
完整开发配置步骤
一、前置条件准备
-
企业网络配置:
- 在Azure与企业内部网络之间建立 ExpressRoute 或 Site-to-Site VPN 确保Databricks可访问内网API。
- 在防火墙规则中允许来自Azure Databricks的IP范围和端口。
-
创建专用域账号:
- 在企业的Active Directory中创建专用服务账号(如
svc-databricks-api
),授予该账号API访问权限。
- 在企业的Active Directory中创建专用服务账号(如
二、Azure资源配置
-
创建Azure Key Vault:
- 在Azure Portal中创建Key Vault(如
kv-company-secrets
)。 - 启用 软删除 和 清除保护 增强安全性。
- 在Azure Portal中创建Key Vault(如
-
存储敏感信息到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"
-
配置Azure Databricks托管身份:
- 在Databricks工作空间启用 Managed Identity。
- 在Key Vault的访问策略中,授予该托管身份 Get 和 List 秘密的权限。
三、Okta应用配置
- 在Okta管理控制台:
- 创建新应用(如
Databricks Internal API
),选择 OAuth 2.0 Client Credentials 或 Resource 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))# 发送警报或记录到监控系统
五、安全增强措施
- 网络隔离:
- 将Databricks集群部署在Azure 虚拟网络(VNet) 中,启用网络安全组(NSG)限制入站流量。
- 密钥轮换:
- 在Key Vault中启用 自动密钥轮换策略,定期更新密码和客户端密钥。
- 日志与监控:
- 启用Azure Monitor和Databricks审计日志,跟踪所有秘密访问和API调用。
- 最小权限原则:
- 确保托管身份和Okta应用仅拥有必要的最小权限。
六、部署与验证
- 部署到Databricks:
- 将代码上传至Databricks工作区,配置Job或Notebook使用 高并发模式 集群。
- 端到端测试:
- 验证从Key Vault获取秘密、Okta令牌颁发、API调用的完整链路。
- 故障恢复测试:
- 模拟网络中断、Key Vault不可用场景,验证重试和错误处理逻辑。