需要编写一个Synapse Analytics在Azure云上运行,它需要访问企业内部的API获取JSON格式的数据,企业有网关和防火墙,API有公司的okta身份认证,通过公司的域账号来授权访问,现在需要创建一个专用的域账号,让Synapse Analytics访问Azure Key Vault,来获取账号密码,然后通过配置访问公司内部API的数据,请写出所有的开发配置步骤,以及完成这一功能的所有的Python源代码,需要确保安全性和可靠性。
此方案通过多层安全防护确保数据访问的合规性和可靠性。
开发配置步骤
1. 创建专用域账号(企业IT协作)
- 联系企业IT部门创建专用域账号,仅授权访问目标API。
- 确保账号使用强密码,启用账户安全策略(如定期轮换)。
2. Azure Key Vault配置
- 创建Key Vault:
- 在Azure门户中创建Key Vault,启用软删除和清除保护。
- 存储凭据:
- 将域账号的
username
和password
分别存储为两个Secret。
- 将域账号的
- 配置访问策略:
- 在Key Vault中为Synapse工作区的托管身份授予
Get
权限。 - 禁用不必要的访问方式(如HTTP)。
- 在Key Vault中为Synapse工作区的托管身份授予
3. Azure Synapse配置
- 启用托管身份:
- 在Synapse工作区设置中启用系统分配的托管身份。
- 网络配置:
- 获取Synapse出站IP地址,提交给企业IT部门加入防火墙白名单。
- 或配置Azure ExpressRoute/VPN实现混合连接。
4. Okta应用配置(企业IT协作)
- 确认Okta应用使用
Resource Owner Password
或Client Credentials
授权模式。 - 获取必要的认证参数(如
client_id
、scope
)。
Python源代码
python
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
import requests
import json
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# 配置参数
KEY_VAULT_NAME = "<your-key-vault-name>"
USERNAME_SECRET_NAME = "api-username"
PASSWORD_SECRET_NAME = "api-password"
OKTA_TOKEN_URL = "https://<company>.okta.com/oauth2/v1/token"
CLIENT_ID = "<okta-client-id>" # 根据实际情况调整
API_URL = "https://internal-api.company.com/data"
# 初始化Azure凭证和Key Vault客户端
credential = DefaultAzureCredential()
key_vault_uri = f"https://{KEY_VAULT_NAME}.vault.azure.net"
secret_client = SecretClient(vault_url=key_vault_uri, credential=credential)
def get_secret(secret_name):
"""安全获取Key Vault中的机密"""
try:
secret = secret_client.get_secret(secret_name)
return secret.value
except Exception as e:
raise ValueError(f"Key Vault访问失败: {str(e)}")
try:
# 获取API凭据
username = get_secret(USERNAME_SECRET_NAME)
password = get_secret(PASSWORD_SECRET_NAME)
# 配置带自动重试的HTTP会话
session = requests.Session()
retries = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504],
allowed_methods=["POST", "GET"]
)
session.mount('https://', HTTPAdapter(max_retries=retries))
# 获取Okta访问令牌
token_data = {
'grant_type': 'password',
'username': username,
'password': password,
'client_id': CLIENT_ID,
'scope': 'api_access' # 根据实际情况调整
}
token_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
token_response = session.post(
OKTA_TOKEN_URL,
data=token_data,
headers=token_headers,
timeout=10
)
token_response.raise_for_status()
access_token = token_response.json().get('access_token')
if not access_token:
raise ValueError("Okta未返回有效访问令牌")
# 调用企业API
api_headers = {
'Authorization': f'Bearer {access_token}',
'Accept': 'application/json'
}
api_response = session.get(API_URL, headers=api_headers, timeout=10)
api_response.raise_for_status()
# 处理JSON数据
data = api_response.json()
print("成功获取数据:", json.dumps(data, indent=2))
# 此处可添加数据存储逻辑(如写入ADLS Gen2)
except requests.exceptions.RequestException as e:
print(f"API请求异常: {str(e)}")
except json.JSONDecodeError:
print("API响应非JSON格式")
except Exception as e:
print(f"未处理异常: {str(e)}")
finally:
session.close() # 确保释放连接
安全增强措施
-
最小权限原则:
- Key Vault仅允许Synapse托管身份读取必要机密。
- 域账号仅能访问特定API端点。
-
传输安全:
- 强制使用HTTPS(Okta和API均需SSL/TLS加密)。
-
敏感数据处理:
- 避免在日志中输出凭据或令牌。
- 使用环境变量或Azure管理控制台传递非机密配置参数。
-
监控与审计:
- 启用Key Vault日志和Synapse运行日志。
- 设置Azure Monitor告警检测异常访问。
-
凭据轮换:
- 定期更新Key Vault中的密码,并同步企业AD账号。
架构图
+----------------+ HTTPS +-------------+
| Azure Synapse |-------------->| 企业防火墙 |
| (托管身份) |<-------------| (白名单IP) |
+----------------+ +-------------+
| |
| 获取凭据 | 允许访问
V V
+----------------+ +-------------+
| Azure Key Vault| | 内部API网关 |
| (存储username/)|<------------->| (Okta认证) |
+----------------+ +-------------+