有效的日志记录和监视有助于检测和响应 Databricks Apps 中的安全事件。 应用生成应用程序级日志和平台审核日志,可用于诊断、性能跟踪和安全分析。
应用程序日志
若要在 Databricks 应用 UI 中或通过应用的 URL 提供日志,应用必须向其写入输出stdout。stderr
通过以下方式访问应用程序日志:
- 应用 UI: 在应用详细信息页上,单击“ 日志 ”选项卡以查看标准输出和错误。 有关详细信息,请参阅 查看 Databricks 应用的详细信息。
-
直接 URL: 将
/logz附加到应用 URL。 例如,如果应用 URL 为https://my-app-1234567890.my-instance.databricksapps.com,则日志可在https://my-app-1234567890.my-instance.databricksapps.com/logz查看。
注释
应用计算关闭时,Azure Databricks 不会保留日志。 对于持久日志记录,请与外部日志记录服务集成,或将日志写入 Unity 目录卷或表。
与外部日志记录服务集成
对于持久性日志记录和高级监视功能,请使用以下内容:
- 应用程序性能监视 (APM) 工具: 使用 New Relic、Datadog 或类似的应用程序性能监视工具收集和分析日志、指标和跟踪。
- 自定义日志持久性: 定期将日志写入 Unity 目录卷或表,以便进行长期存储和分析。
有关日志格式和内容的指南,请参阅 建议的日志记录做法 。
建议的日志记录做法
若要与外部监视和实时警报系统集成,请执行以下作:
- 采用 JSON 或其他计算机可分析格式设置日志的格式。
- 使用上下文记录与安全相关的事件:
- 身份验证和授权事件,包括用户标识和结果
- 数据访问详细信息,例如目录、架构和表名称
- 与安全相关的错误,例如无效令牌、权限拒绝和可疑活动
- 将日志转发到外部系统。 与 APM 或日志聚合工具集成,以支持实时警报、安全事件响应、使用情况和性能分析以及与 Azure Databricks 系统日志的关联。
日志记录的安全注意事项
Databricks 应用设计了以下内置控件,以防止数据外泄:
- 仅限 API 的访问:应用只能通过公共 Azure Databricks API 访问 Azure Databricks 资源。 这些 API 可通过系统表日志进行审核。
- 加密通信:所有 API 流量都使用 TLS 1.2 或更高版本进行加密,以确保安全数据传输。
使用系统表进行安全监视
Azure Databricks 捕获表中应用相关活动的 system.access.audit 审核日志。 可以查询这些日志来跟踪用户作、应用配置更改和安全事件。
使用审核日志支持以下常见监视和安全方案:
使用以下查询监视与安全相关的活动,并检测应用的潜在问题。
监视应用权限更改
使用此查询检测应用权限修改:
-- Monitor all app permission modifications in the last 30 days
WITH permission_changes AS (
SELECT
event_date,
workspace_id,
request_params.request_object_id AS app_name,
user_identity.email AS modified_by,
explode(from_json(
request_params.access_control_list,
'array<struct<user_name:string,group_name:string,permission_level:string>>'
)) AS permission
FROM system.access.audit
WHERE action_name = 'changeAppsAcl'
AND event_date >= current_date() - 30
)
SELECT
event_date,
app_name,
modified_by,
permission.user_name,
permission.group_name,
permission.permission_level
FROM permission_changes
ORDER BY event_date DESC
使用用户 API 范围标识应用
使用此查询查找配置了用户 API 范围的应用:
-- Find apps created or updated in the last 30 days with user API scopes configured
SELECT
event_date,
get_json_object(request_params.app, '$.name') AS app_name,
user_identity.email AS creator_email,
get_json_object(request_params.app, '$.user_api_scopes') AS user_api_scopes
FROM system.access.audit
WHERE
action_name IN ('createApp', 'updateApp')
AND get_json_object(request_params.app, '$.user_api_scopes') IS NOT NULL
AND event_date >= current_date() - INTERVAL 30 DAYS
跟踪用户授权作
使用此查询列出使用用户授权执行的应用作:
-- List app actions performed on behalf of users in the last 30 days
WITH obo_events AS (
SELECT
event_date,
workspace_id,
audit_level,
identity_metadata.acting_resource AS app_id, -- OAuth App ID or name
user_identity.email AS user_email, -- Logged-in user
service_name,
action_name
FROM system.access.audit
WHERE event_date >= current_date() - 30
AND identity_metadata.acting_resource IS NOT NULL
)
SELECT
event_date,
app_id,
user_email,
service_name,
action_name,
audit_level,
COUNT(*) AS event_count
FROM obo_events
GROUP BY
event_date, app_id, user_email, service_name, action_name, audit_level
ORDER BY event_date DESC;
作监视
使用系统表监视应用的作方面,例如成本和资源使用情况。
监视应用成本
使用 system.billing.usage 表监视 Databricks Apps 成本。 使用以下查询获取每天或每月应用的准确成本信息:
-- Get Databricks Apps cost by app per day for the last 30 days
SELECT
us.usage_date,
us.usage_metadata.app_id,
us.usage_metadata.app_name,
SUM(us.usage_quantity) AS dbus,
SUM(us.usage_quantity * lp.pricing.effective_list.default) AS dollars
FROM
system.billing.usage us
LEFT JOIN system.billing.list_prices lp
ON lp.sku_name = us.sku_name
AND us.usage_start_time BETWEEN lp.price_start_time AND COALESCE(lp.price_end_time, NOW())
WHERE
billing_origin_product = 'APPS'
AND us.usage_unit = 'DBU'
AND us.usage_date >= DATE_SUB(NOW(), 30)
GROUP BY ALL
Databricks Apps 支持预算策略来帮助跟踪成本。 有关配置预算策略的信息,请参阅 无服务器预算策略的属性使用情况。