Databricks 应用的日志记录和监视

有效的日志记录和监视有助于检测和响应 Databricks Apps 中的安全事件。 应用生成应用程序级日志和平台审核日志,可用于诊断、性能跟踪和安全分析。

应用程序日志

若要在 Databricks 应用 UI 中或通过应用的 URL 提供日志,应用必须向其写入输出stdoutstderr

通过以下方式访问应用程序日志:

  • 应用 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 支持预算策略来帮助跟踪成本。 有关配置预算策略的信息,请参阅 无服务器预算策略的属性使用情况