효과적인 로깅 및 모니터링은 Databricks 앱에서 보안 이벤트를 감지하고 대응하는 데 도움이 됩니다. 앱은 진단, 성능 추적 및 보안 분석에 사용할 수 있는 애플리케이션 수준 로그와 플랫폼 감사 로그를 모두 생성합니다.
애플리케이션 로그
Databricks 앱 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;
운영 모니터링
시스템 테이블을 사용하여 비용 및 리소스 사용량과 같은 앱의 운영 측면을 모니터링합니다.
앱 비용 모니터링
테이블을 사용하여 Databricks 앱 비용을 모니터링합니다 system.billing.usage . 다음 쿼리를 사용하여 일별 또는 월별 앱에 대한 정확한 비용 정보를 가져옵니다.
-- 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는 비용을 추적하는 데 도움이 되는 예산 정책을 지원합니다. 예산 정책 구성에 대한 자세한 내용은 서버리스 예산 정책에 대한 특성 사용을 참조하세요.