効果的なログ記録と監視は、Databricks Apps のセキュリティ イベントを検出して対応するのに役立ちます。 アプリは、アプリケーション レベルのログとプラットフォーム監査ログの両方を生成します。このログは、診断、パフォーマンス追跡、およびセキュリティ分析に使用できます。
アプリケーション ログ
Databricks Apps UI またはアプリの URL を使用してログを使用できるようにするには、アプリが stdout と stderrに出力を書き込む必要があります。
次の方法でアプリケーション ログにアクセスします。
- アプリ UI: アプリの詳細ページで、[ ログ ] タブをクリックして、標準の出力とエラーを表示します。 詳細については、「 Databricks アプリの詳細を表示する」を参照してください。
-
直接 URL: アプリの URL に
/logzを追加します。 たとえば、アプリの 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 またはその他のコンピューターで解析可能な形式でログを書式設定します。
- コンテキストを使用してセキュリティ関連のイベントをログに記録します。
- 認証イベントと承認イベント (ユーザー ID と結果を含む)
- カタログ、スキーマ、テーブル名などのデータ アクセスの詳細
- 無効なトークン、アクセス許可拒否、疑わしいアクティビティなど、セキュリティ関連のエラー
- 外部システムにログを転送します。 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 のコストを監視します。 次のクエリを使用して、1 日または 1 か月あたりのアプリの正確なコスト情報を取得します。
-- 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 では、コストの追跡に役立つ予算ポリシーがサポートされています。 予算ポリシーの構成の詳細については、「 サーバーレス予算ポリシーでの属性の使用」を参照してください。