감사 구현

완료됨

감사는 데이터베이스 활동에 대한 가시성을 제공하여 보안 위협을 감지하고 규정 준수를 추적하고 인시던트를 조사하는 데 도움이 됩니다. 감사는 누가 어떤 데이터에 액세스하고 언제 액세스했는지 기록하여 보안 모니터링 및 규정 요구 사항을 모두 지원하는 책임 추적을 만듭니다.

Microsoft Fabric의 SQL Server, Azure SQL 및 SQL 데이터베이스는 애플리케이션을 변경하지 않고도 데이터베이스 이벤트를 캡처하는 기본 제공 감사 기능을 제공합니다. 감사를 구성하고 관리하는 방법을 이해하면 데이터베이스 환경에 대한 적절한 감독을 유지할 수 있습니다.

감사 옵션 이해

감사는 데이터베이스 이벤트를 캡처하고 감사 로그에 씁니다. 감사하는 이벤트, 로그를 저장하는 위치 및 로그를 분석하는 방법은 보안 요구 사항 및 인프라에 따라 달라집니다.

Azure SQL Database가 세 가지 대상으로 감사 로그를 보내는 것을 보여 주는 다이어그램: 장기 보존을 위한 Azure Blob Storage, KQL 쿼리용 Log Analytics 작업 영역 및 실시간 스트리밍을 위한 Event Hubs.

SQL Server 감사 는 확장 이벤트 인프라를 사용하여 활동을 기록합니다. 파일, Windows 보안 로그 또는 Windows 애플리케이션 로그에 감사 레코드를 쓸 수 있습니다. 이러한 유연성을 통해 기존 로그 관리 시스템과 통합할 수 있습니다.

Azure SQL Database 감사는 Azure Blob Storage, Log Analytics 또는 Event Hubs에 기록합니다. 관리되는 서비스는 인프라를 처리하므로 스토리지를 관리하지 않고 감사할 항목을 결정하는 데 집중할 수 있습니다.

Microsoft Fabric의 SQL 데이터베이스는 패브릭의 활동 로깅 및 감사 데이터에 Microsoft Purview를 사용합니다. Microsoft Purview와 통합하면 전체 데이터 자산에 대한 통합 감사를 제공합니다.

SQL Server 감사 구성

SQL Server 감사를 사용하려면 감사 레코드를 작성할 위치를 정의하는 서버 감사 개체를 만든 다음 캡처할 항목을 정의하는 감사 사양을 만들어야 합니다.

먼저 파일에 기록하는 서버 감사를 설정합니다.

CREATE SERVER AUDIT SecurityAudit
TO FILE (FILEPATH = 'C:\AuditLogs\', MAXSIZE = 100 MB, MAX_ROLLOVER_FILES = 10)
WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE);

매개 변수는 QUEUE_DELAY 쓰기 전에 이벤트를 버퍼링할 시간(밀리초)을 지정합니다. 값이 낮을수록 실시간 로깅이 더 많이 제공되지만 성능에 영향을 줄 수 있습니다. 설정은 감사 기록이 실패할 때의 동작을 결정합니다. 누락된 감사 레코드가 허용되지 않는 중요한 규정 준수 시나리오에 사용합니다 SHUTDOWN .

이제 감사를 사용하도록 설정합니다.

ALTER SERVER AUDIT SecurityAudit WITH (STATE = ON);

다음으로 서버 수준 이벤트를 캡처하는 서버 감사 사양을 만듭니다.

CREATE SERVER AUDIT SPECIFICATION ServerAuditSpec
FOR SERVER AUDIT SecurityAudit
ADD (FAILED_LOGIN_GROUP),
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (SERVER_PERMISSION_CHANGE_GROUP),
ADD (DATABASE_PERMISSION_CHANGE_GROUP)
WITH (STATE = ON);

데이터베이스 수준 이벤트의 경우 데이터베이스 감사 사양을 만듭니다.

USE MyDatabase;
GO

CREATE DATABASE AUDIT SPECIFICATION DatabaseAuditSpec
FOR SERVER AUDIT SecurityAudit
ADD (SELECT, INSERT, UPDATE, DELETE ON dbo.SensitiveData BY public),
ADD (EXECUTE ON SCHEMA::dbo BY public),
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP)
WITH (STATE = ON);

본 사양은 SensitiveData 테이블 내 모든 데이터에 대한 접근, 저장 프로시저의 실행, 그리고 역할 구성원 변경 내역을 감사하는 기능을 제공합니다.

Azure SQL 감사 구성

Azure SQL Database 감사는 서버 또는 데이터베이스 수준에서 구성됩니다. 서버 수준 정책은 논리 서버의 모든 데이터베이스에 적용됩니다.

Azure Portal에서 또는 T-SQL을 사용하여 감사를 사용하도록 설정할 수 있습니다.

-- Enable auditing to blob storage (configured in Azure portal)
ALTER DATABASE AUDIT SPECIFICATION AzureAuditSpec
ADD (SELECT, INSERT, UPDATE, DELETE ON DATABASE::MyDatabase BY public)
WITH (STATE = ON);

보다 세부적인 제어를 위해 Azure Policy 또는 ARM 템플릿을 통해 감사를 구성합니다. 스토리지 계정, 보존 기간 및 감사 작업 그룹을 지정하는 예제는 다음과 같습니다.

{
  "properties": {
    "state": "Enabled",
    "storageEndpoint": "https://myauditlogs.blob.core.windows.net",
    "retentionDays": 90,
    "auditActionsAndGroups": [
      "SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP",
      "FAILED_DATABASE_AUTHENTICATION_GROUP",
      "BATCH_COMPLETED_GROUP"
    ]
  }
}

비고

Log Analytics에 대한 Azure SQL 감사를 사용하면 KQL(Kusto Query Language)을 사용하여 강력한 쿼리 및 경고 기능을 사용할 수 있습니다. 이 통합은 보안 모니터링 및 규정 준수 보고를 간소화합니다.

감사 작업 선택

보안 및 규정 준수 요구 사항에 따라 감사 작업을 선택합니다. 일반적인 작업 그룹은 다음과 같습니다.

인증 이벤트:

  • SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP - 성공적인 로그인
  • FAILED_DATABASE_AUTHENTICATION_GROUP - 실패한 로그인 시도

사용 권한 변경:

  • DATABASE_PERMISSION_CHANGE_GROUP - 권한 부여, 해지, 거부 작업
  • DATABASE_ROLE_MEMBER_CHANGE_GROUP - 역할 멤버 자격 변경
  • DATABASE_PRINCIPAL_CHANGE_GROUP - 사용자 만들기 및 수정

데이터 액세스:

  • BATCH_COMPLETED_GROUP - 완료된 모든 일괄 처리(대용량)
  • SELECT 특정 개체에 대한 - 특정 읽기 액세스 모니터링
  • INSERT, UPDATEDELETE 특정 개체에서 - 데이터 수정 추적

스키마 변경 내용:

  • SCHEMA_OBJECT_CHANGE_GROUP - 테이블 및 개체 수정
  • DATABASE_OBJECT_CHANGE_GROUP - DDL 문

중요합니다

모든 항목을 캡처하는 대신 집중된 감사 작업 집합으로 시작합니다. 대용량 감사는 성능에 영향을 미치고 분석하기 어려운 로그를 생성합니다.

감사 로그 쿼리 및 분석

SQL Server 파일 기반 감사의 경우 함수를 fn_get_audit_file 사용하여 로그를 쿼리합니다.

SELECT 
    event_time,
    action_id,
    succeeded,
    session_server_principal_name AS UserName,
    database_name,
    object_name,
    statement
FROM fn_get_audit_file('C:\AuditLogs\*.sqlaudit', DEFAULT, DEFAULT)
WHERE event_time > DATEADD(day, -7, GETUTCDATE())
ORDER BY event_time DESC;

Log Analytics에서 Azure SQL 감사를 사용하는 경우 KQL을 사용하여 쿼리할 수 있습니다.

AzureDiagnostics
| where Category == "SQLSecurityAuditEvents"
| where TimeGenerated > ago(7d)
| where action_name_s == "SELECT"
| summarize count() by client_ip_s, server_principal_name_s
| order by count_ desc

이 쿼리는 지난 주에 가장 많은 SELECT 쿼리를 생성한 사용자 및 IP 주소를 식별하여 비정상적인 액세스 패턴을 식별하는 데 도움이 됩니다.

감사 보존 및 보호 구현

감사 로그는 변조로부터 보호해야 하며 규정 준수 요구 사항에 따라 보존해야 합니다.

SQL Server의 경우 감사 파일에 대해 변경할 수 없는 스토리지를 구성하고 Windows 파일 시스템 권한을 사용하여 삭제를 방지합니다. Azure SQL의 경우 변경할 수 없는 Blob Storage를 사용하여 스토리지를 구성하고 Azure Storage 수명 주기 관리에서 보존 정책을 설정합니다.

중요합니다

감사 로그를 모니터링하는 데이터베이스와 별도로 저장합니다. 이렇게 하면 공격자가 데이터베이스를 손상하더라도 감사 내역을 변조할 수 없습니다.

규정 준수 시나리오의 경우 다음 보존 사례를 고려합니다.

  • 규정 요구 사항에 따라 보존 기간 정의(재무 데이터의 경우 7년).
  • 변경할 수 없는 스토리지를 사용하여 로그 삭제 방지
  • 비용 관리를 위해 콜드 스토리지에 로그 보관 구현
  • 감사 로그 검토 및 경고를 위한 프로세스 설정

감사 데이터를 정기적으로 검토하면 인시던트가 되기 전에 보안 문제를 식별할 수 있습니다. 실패한 로그인 시도, 유지 관리 기간 외부의 권한 변경 및 비정상적인 데이터 액세스 패턴에 대한 경고를 만듭니다.