연습 - 데이터 분류, 동적 데이터 마스킹 및 SQL 감사

완료됨

이 연습에서는 모듈에서 학습한 것들을 결합하여 시나리오를 연습합니다. 새 데이터 분류 및 동적 데이터 마스크를 추가하는 방법을 알아보고, 데이터 분류를 위해 표시된 열을 보려는 사용자를 감사하는 다양한 방법을 알아봅니다. 이 연습에서는 모듈에서 이미 배운 보안 관리에 대한 몇 가지 개념을 결합합니다.

데이터 분류 및 마스킹 구성

  1. Azure Portal에서 Azure SQL Database 인스턴스(논리 서버가 아님)로 이동합니다.

    Azure Portal

  2. 왼쪽 창의 보안에서 데이터 검색 및 분류를 선택합니다.

  3. 분류 탭을 선택한 다음, 분류 추가를 선택합니다.

    Screenshot of how to add a new classification.

    이전 연습에서 모든 권장 열 분류를 추가했습니다. 이 단계에서는 분류된 열의 목록에 잠재적으로 중요한 열을 ‘수동으로’ 추가합니다.

  4. SalesLT Customer 테이블에서 데이터 검색 및 분류가 식별되고 FirstNameLastName 분류될 수 있지만 그렇지 않습니다 MiddleName. 드롭다운 목록을 사용하여 MiddleName을 지금 추가하고 분류 추가를 선택합니다.

    Screenshot of how to add a name-related classification for MiddleName.

  5. 저장을 선택합니다.

  6. 개요 탭에서 분류가 추가되었는지 확인하고, MiddleName이 이제 SalesLT 스키마의 분류된 열 목록에 표시되는지 확인합니다.

  7. 왼쪽 창에서 개요를 선택하여 데이터베이스의 개요로 돌아갑니다.

    DDM(동적 데이터 마스킹)은 Azure SQL 및 SQL Server에서 모두 사용할 수 있습니다. DDM은 이런 유형의 규칙을 코딩해야 하는 애플리케이션 수준 대신 SQL Server 수준에서 권한 없는 사용자를 대상으로 중요한 데이터를 마스킹하여 데이터 노출을 제한합니다. Azure SQL에서 마스킹할 항목을 권장합니다. 또는 마스크를 수동으로 추가할 수도 있습니다.

    다음 단계에서는 이전 단계에서 검토한 FirstName, MiddleNameLastName 열을 마스킹합니다.

  8. Azure Portal에서 Azure SQL Database로 이동합니다. 왼쪽 창에 있는 보안에서 동적 데이터 마스킹을 선택한 다음, 마스크 추가를 선택합니다.

  9. 드롭다운 목록에서 SalesLT 스키마, 고객 테이블 및 FirstName 열을 선택합니다. 마스킹 옵션을 검토할 수 있지만 이 시나리오에서는 기본값이 적합합니다. 추가를 선택하여 마스킹 규칙을 추가합니다.

    Screenshot of how to add First Name mask.

  10. 해당 테이블의 MiddleNameLastName에 대해 이전 단계를 반복합니다.

    이제 다음과 유사한 세 가지 마스킹 규칙이 있습니다.

    Screenshot of how to review all masking rules.

  11. 저장을 선택합니다.

  12. 왼쪽 창에서 개요를 선택하여 데이터베이스의 개요로 돌아갑니다.

분류 및 마스킹된 데이터 검색

다음에는 분류된 열을 쿼리하는 사람을 시뮬레이션하고 작동 중인 동적 데이터 마스킹을 탐색합니다.

  1. SSMS(SQL Server Management Studio)로 이동합니다.

  2. AdventureWorks 데이터베이스에서 새 쿼리를 만들려면 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다.

  3. 다음 쿼리를 실행하면 분류된 데이터, 그리고 경우에 따라 마스킹된 데이터로 표시되는 열이 반환됩니다. 실행을 선택하여 쿼리를 실행합니다.

    SELECT TOP 10 FirstName, MiddleName, LastName
    FROM SalesLT.Customer;
    

    결과에는 마스킹이 적용되지 않은 처음 10개의 이름이 표시됩니다. 그 이유는 사용자가 Azure SQL Database 논리 서버에 대한 관리자이기 때문입니다.

    Screenshot of SQL query results with no mask.

  4. 다음 쿼리에서는 새 사용자를 만들고 이전 쿼리를 해당 사용자로 실행합니다. 또한 EXECUTE AS를 사용하여 Bob을 가장합니다. EXECUTE AS 문을 실행하면 세션의 실행 컨텍스트가 로그인 또는 사용자로 전환됩니다. 이에 따라 EXECUTE AS 명령을 실행하는 사용자(이 경우에는 본인) 대신 로그인 또는 사용자에 대해 사용 권한을 확인합니다. REVERT는 로그인 또는 사용자의 가장을 중지하는 데 사용됩니다.

    이전 연습의 내용이 반복되므로 다음에 나오는 명령의 처음 몇 부분이 익숙할 수 있습니다. 다음 명령을 사용하여 새 쿼리를 만든 다음, 실행을 선택하여 쿼리를 실행하고 결과를 관찰합니다.

    -- Create a new SQL user and give them a password
    CREATE USER Bob WITH PASSWORD = 'c0mpl3xPassword!';
    
    -- Until you run the following two lines, Bob has no access to read or write data
    ALTER ROLE db_datareader ADD MEMBER Bob;
    ALTER ROLE db_datawriter ADD MEMBER Bob;
    
    -- Execute as our new, low-privilege user, Bob
    EXECUTE AS USER = 'Bob';
    SELECT TOP 10 FirstName, MiddleName, LastName
    FROM SalesLT.Customer;
    REVERT;
    

    이제 결과에 처음 10개의 이름이 표시되지만, 이번에는 마스킹이 적용된 상태입니다. Bob에게는 마스킹되지 않은 데이터에 대한 액세스 권한이 부여되지 않았습니다.

    Screenshot of SQL query results with mask.

    만약 어떠한 이유로든 Bob에게 이름에 대한 액세스가 필요해서 해당 액세스 권한을 얻게 된다면 어떻게 해야 할까요?

    보안에 있는 동적 데이터 마스킹 창으로 이동하여 Azure Portal에서 마스킹에서 제외된 사용자를 업데이트할 수 있지만, T-SQL을 사용하여 이를 수행할 수도 있습니다.

  5. AdventureWorks 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택한 다음, 다음 쿼리를 입력하여 Bob이 마스킹 없이 이름 결과를 쿼리할 수 있도록 합니다. 실행을 선택하여 쿼리를 실행합니다.

    GRANT UNMASK TO Bob;  
    EXECUTE AS USER = 'Bob';
    SELECT TOP 10 FirstName, MiddleName, LastName
    FROM SalesLT.Customer;
    REVERT;  
    

    결과에는 이름 전체가 포함되어야 합니다.

    Screenshot of SQL query results with no mask.

  6. 새 쿼리에서 다음 T-SQL 명령을 실행하여 사용자의 마스킹 해제 권한을 제거하고 해당 작업을 확인할 수도 있습니다.

    -- Remove unmasking privilege
    REVOKE UNMASK TO Bob;  
    
    -- Execute as Bob
    EXECUTE AS USER = 'Bob';
    SELECT TOP 10 FirstName, MiddleName, LastName
    FROM SalesLT.Customer;
    REVERT;  
    

    결과에는 마스킹된 이름이 포함되어야 합니다.

    Screenshot of SQL query results with mask.

SSMS에서 감사 로그 검토

관리자는 데이터베이스와 특히 분류된 데이터에 액세스하는 사용자를 검토하고 감사하는 것이 좋습니다. 다음으로, Azure Blob Storage로 전송되는 감사 파일을 살펴볼 수 있습니다. 가장 먼저 해야 할 일은 로그가 여러 파일에 걸쳐 있는 경우 감사 파일을 병합하는 것입니다. 이렇게 하려면 SSMS에서 다음을 수행할 수 있습니다.

  1. 파일>열기>감사 파일 병합을 선택합니다.

    Screenshot of how to open audit files.

  2. 추가를 선택합니다.

    Screenshot of how to add a new file.

  3. Azure Blob 스토리지에서 추가를 선택한 다음, 연결을 선택합니다.

    Screenshot of how to add from Azure Blob storage.

  4. 이 모듈에 사용하는 계정으로 Azure에 로그인합니다.

    Screenshot of how to sign in to Azure.

  5. 감사 로그를 이동할 구독, 스토리지 계정 및 Blob 컨테이너를 선택합니다. 스토리지 계정은 sql로 시작되어야 합니다. 컨테이너는 sqldbauditlogs라 합니다. 해당 이름의 컨테이너가 없는 경우 감사를 위해 만든 다른 스토리지 계정을 대신 사용합니다.

  6. Azure SQL Database 논리 서버 및 AdventureWorks 데이터베이스를 선택합니다. 시작 시간이 연습을 시작한 시간보다 이전인지 확인합니다. 확인을 선택합니다.

  7. 확인 창에서 다운로드 및 병합되는 파일 수를 확인할 수 있습니다. 확인을 선택합니다.

  8. 파일을 검토하고 마지막으로 확인을 선택합니다.

    이제 모든 감사 로그가 표시됩니다. Bob과 함께 마스킹을 테스트하던 위치를 찾습니다. 목록은 아래쪽에 있을 것입니다.

  9. 문을 선택한 다음, 세부 정보 창의 정보를 검토합니다. 예를 들어 Bob이 분류된 데이터를 보려고 하는 쿼리 중 하나에 대해 data_sensitivity_information 필드에서 해당 데이터가 분류된 것을 알 수 있습니다.

  10. 세부 정보 창에서 data_sensitivity_information의 값을 두 번 클릭합니다. 데이터를 더 쉽게 읽을 수 있도록 팝업 창이 열립니다.

    data_sensitivity_information 아래에 표시되는 항목의 예시입니다.

    <sensitivity_attributes max_rank="20" max_rank_desc="Medium"><sensitivity_attribute label="Confidential - GDPR" label_id="bf91e08c-f4f0-478a-b016-23422b2a65ff" information_type="Name" information_type_id="57845286-7598-22f5-3422-15b24aeb125e" rank="20" rank_desc="Medium"/></sensitivity_attributes>
    

    그런 다음, 추가 분석을 위해 이 병합된 파일을 XEL 파일, CSV 파일 또는 테이블로 내보낼 수 있습니다. Azure PowerShell을 사용하여 확장 이벤트 파일을 쿼리할 수도 있습니다.

Azure Portal에서 감사 로그 검토

감사 로그 분석은 기본 설정에 따라 다릅니다. 이 섹션에서는 Log Analytics를 사용하여 Azure Portal에서 보안 로그를 쿼리하는 방법을 알아봅니다.

  1. Azure Portal에서 AdventureWorks 데이터베이스로 이동합니다. 왼쪽 창의 보안에서 감사를 선택한 다음, 작업 표시줄에서 감사 로그 보기 단추를 선택합니다.

    이제 이벤트 레코드의 쿼리, 쿼리 편집기(Portal을 통해 T-SQL 쿼리 실행)의 실행 옵션, Log Analytics, 대시보드 보기 옵션 등을 볼 수 있을 것입니다.

    Screenshot of how to view audit records.

    자유롭게 둘러보면서 몇 가지 옵션을 파악할 수 있습니다.

  2. Log Analytics를 선택합니다. Log Analytics 단추에 액세스하려면 새로 고침을 선택해야 할 수 있습니다. 시작 화면이 표시되면 확인을 선택합니다. 그러면 쿼리 편집기로 이동하지만 T-SQL 편집기는 아닙니다. 이 보기에서는 SQL 전문가가 쉽게 사용하고 이해하도록 설계된 KQL(Kusto Query Language)을 사용하여 로그를 쿼리할 수 있습니다.

    기본 쿼리는 SQLSecurityAuditEvents 범주를 쿼리하는 것입니다. 이 범주를 사용하여 보안 관련 인시던트를 볼 수도 있지만, 이 도구를 사용하여 로그 분석의 다른 Azure 로그 및 범주를 쿼리할 수도 있습니다. 이 단계에서는 Bob이 중요한 정보에 액세스하려고 시도한 문을 찾을 수 있습니다. SSMS에서 본 것과 동일한 정보를 가져오려면 > 단추를 선택하여 행 세부 정보를 확장합니다.

    여기에 결과가 표시되는 데 몇 분 정도 걸릴 수 있습니다. 실행을 다시 선택하여 쿼리를 새로 고칠 수 있습니다.

    이 활동에서 로그의 KQL 쿼리를 자세히 살펴보지는 않겠지만, 이후 추가 연습이 필요한 경우 이전 참조에서 다양한 리소스를 활용할 수 있습니다.

    다음 단계에서는 SQL 보안에서 로그 및 기타 SQL 활동을 모니터링하고 감사할 수 있도록 Log Analytics 기반 대시보드를 만드는 방법을 알아봅니다. 감사 레코드 창으로 돌아가려면 오른쪽 위에 있는 X를 선택하여 Log Analytics 쿼리 창을 닫습니다.

  3. 대시보드 보기를 선택합니다.

    Screenshot of the log analytics dashboard.

    개요 대시보드가 표시됩니다.

  4. Azure SQL - Access to Sensitive Data(Azure SQL - 중요한 데이터에 액세스)를 선택하여 자세한 내용을 확인합니다.

    3~5분 정도 기다린 다음, 항목이 여기에 표시될 수 있도록 새로 고침을 선택해야 할 수 있습니다.

    이 자세한 정보를 사용하여 다음을 확인할 수 있습니다.

    • 중요한 데이터에 액세스하는 쿼리의 수
    • 액세스되는 데이터의 유형과 중요도
    • 중요한 데이터에 액세스하는 보안 주체
    • 중요한 데이터에 액세스하는 IP

    제공된 정보와 이 도구를 사용하여 사용량을 감사할 수 있는 방법을 검토합니다. 이러한 각 로그를 선택하고 Log Analytics에서 관련 로그를 볼 수도 있습니다.

  5. 완료되면 오른쪽 위에 있는 X를 선택하여 Azure SQL - Access to Sensitive Data(Azure SQL - 중요한 데이터에 액세스) 창을 닫습니다.

  6. 감사 대시보드의 개요 창으로 돌아가서 Azure SQL - 보안 인사이트를 선택합니다.

    이 대시보드는 데이터베이스 작업을 이해하고 이상에 대한 인사이트를 얻는 데 도움이 되는 추가 감사 정보를 표시합니다. 몇 분 동안 이 옵션을 검토하고 자세히 살펴보세요.

Azure SQL 서비스에 대한 이러한 인사이트를 보는 것 외에도 Azure에서 클라우드용 Microsoft Defender를 활용하여 전체 Azure 자산에서 발생하는 문제를 모니터링 및 관리하고 대응할 수 있습니다. Azure SQL 클라우드용 Defender 외부에서 사용할 수 있는 기능을 살펴보려면 Azure Portal에서 클라우드용 Microsoft Defender를 검색하고 선택할 수 있습니다. 구독 수준에 따라 액세스가 제한될 수 있습니다.