实现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).value

def 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}")
        raise

def 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不可用场景,验证重试和错误处理逻辑。

你可能感兴趣的:(azure,云计算,开发语言,python)