클라우드용 Microsoft Defender 보안 권장 사항은 보안 상태를 개선하고 강화하는 데 도움이 됩니다. 권장 사항은 Azure 구독, AWS(Amazon Web Services) 계정 및 클라우드용 Defender 사용하도록 설정된 GCP(Google Cloud Platform) 프로젝트에 대해 정의된 보안 표준에 대한 평가를 기반으로 합니다.
이 문서에서는 다음과 같이 방법을 설명합니다.
- KQL(Kusto Query Language) 쿼리를 사용하여 모든 클라우드(Azure, AWS 및 GCP)에 대한 사용자 지정 권장 사항을 만듭니다.
- 사용자 지정 보안 표준에 사용자 지정 권장 사항을 할당합니다.
시작하기 전에
- 새 보안 표준을 만들려면 구독에 대한 소유자 권한이 필요합니다.
- 사용자 지정 권장 사항을 만들려면 보안 관리자 권한이 필요합니다.
- KQL(Kusto Query Language)을 기반으로 사용자 지정 권장 사항을 만들려면 Defender CSPM(Cloud Security Posture Management) 계획을 사용하도록 설정해야 합니다. 모든 고객은 Azure Policy를 기반으로 사용자 지정 권장 사항을 만들 수 있습니다.
- 사용자 지정 권장 사항을 보려면 Azure 클라우드의 지원을 검토합니다.
사용자 지정 권장 사항 및 KQL 쿼리 작성 방법에 대해 자세히 알아보려면 이 클라우드용 Defender 에피소드를 시청하는 것이 좋습니다.
사용자 지정 권장 사항 만들기
수정 단계, 심각도 및 권장 사항을 할당해야 하는 표준을 포함하여 사용자 지정 권장 사항을 만듭니다. KQL을 사용하여 권장 사항 논리를 추가합니다. 필요에 따라 조정할 수 있는 기본 제공 쿼리 템플릿과 함께 간단한 쿼리 편집기를 사용하거나 KQL 쿼리를 처음부터 작성할 수 있습니다.
사용자 지정 권장 사항을 만들려면 다음을 수행합니다.
Azure Portal에 로그인합니다.
클라우드용 Microsoft Defender> 환경 설정> 관련 구독으로 이동합니다.
보안 정책>+ 사용자 지정 권장 사항 만들기를 선택합니다.
세부 정보: 필수: 이름, 범위, 심각도 및 보안 문제를 입력합니다. 선택 사항: 설명, 수정.
다음을 선택합니다.
KQL 쿼리를 입력하거나 쿼리 편집기 열기를 선택합니다.
다음을 선택합니다.
권장 사항에 대한 관련 표준을 선택합니다.
다음을 선택합니다.
할당할 사용자 지정 표준을 선택합니다.
검토 및 생성을 선택하십시오.
권장 사항 세부 정보를 검토합니다.
만들기를 선택합니다.
쿼리 편집기 사용
권장 사항 쿼리를 만들려면 쿼리 편집기를 사용하는 것이 좋습니다. 제공된 쿼리 템플릿 및 예제를 사용하여 샘플 쿼리를 보고 직접 빌드하는 방법을 알아볼 수도 있습니다.
- 편집기를 사용하면 사용을 시작하기 전에 쿼리를 빌드하고 테스트하는 데 도움이 됩니다.
- 쿼리 구성에 대한 도움말과 추가 지침 및 링크를 보려면 방법을 선택합니다.
- 편집기에서는 사용자 고유의 쿼리를 빌드하는 데 사용할 수 있는 기본 제공 권장 사항 쿼리 예제를 포함합니다. 데이터는 API와 동일한 구조로 나타납니다.
새 쿼리를 선택합니다.
예제 쿼리 템플릿을 해당 지침과 함께 사용하거나 페이지 아래쪽에서 기본 제공 권장 사항 쿼리 예제를 선택하여 시작합니다.
작성한 쿼리를 테스트하려면 쿼리 실행을 선택합니다.
쿼리가 준비되면 편집기에서 잘라내어 권장 사항 쿼리 창에 붙여넣습니다.
사용자 지정 권장 사항 만들기 섹션에서 7단계를 계속 진행합니다.
쿼리 템플릿 및 예제
쿼리 편집기에서는 기본 제공 예제를 포함하고, 이 섹션의 템플릿은 일반적인 보안 검사를 구성하는 방법을 보여 줍니다. 각 템플릿은 범위 내 리소스를 반환하고 비준수 리소스를 UNHEALTHY로 표시합니다. 이 템플릿 패턴에서는 condition 식만 편집하고 HealthStatus 줄은 변경하지 않은 상태로 유지합니다.
메모
이 섹션의 템플릿은 Azure 리소스 종류를 사용합니다. AWS 및 GCP 리소스의 경우 Environment == 'Azure'Environment == 'AWS' 또는 Environment == 'GCP' 변경하고 환경의 리소스 유형과 일치하도록 Identifiers.Type 업데이트합니다.
KQL 출력 스키마 요구 사항
쿼리를 작성하기 전에 필요한 출력 스키마를 이해합니다. 클라우드용 Microsoft Defender 결과를 해석하고 결과를 리소스에 매핑하는 방법입니다.
필수 출력 열:
| Column | Type | Purpose |
|---|---|---|
Id |
문자열(필수) | 클라우드용 Defender 리소스를 참조하는 데 사용하는 리소스 식별자입니다. |
Name |
문자열(필수) | 결과에서 사람이 읽을 수 있는 리소스 이름입니다. |
Environment |
문자열(필수) | 클라우드 환경: Azure, AWS 또는 GCP. |
Identifiers |
동적(필수) | 원본 레코드에서 전달된 리소스 종류 및 식별자입니다. |
AdditionalData |
동적(필수) | 원본 레코드에서 전달된 추가 리소스 메타데이터입니다. |
Record |
동적(필수) | 모든 속성을 포함하는 전체 리소스 레코드입니다. |
HealthStatus |
문자열(필수) | 평가 결과: UNHEALTHY (비준수) 또는 HEALTHY (준수). |
항상 다음을 사용하여 쿼리를 종료합니다. | project Id, Name, Environment, Identifiers, AdditionalData, Record, HealthStatus
평가 매핑:
모든 쿼리는 각 리소스에 HealthStatus 대한 값을 설정해야 합니다. 함수를 iff() 사용하여 조건을 평가하고 상태를 할당합니다.
| extend condition = (your condition here)
| extend HealthStatus = iff(condition, 'UNHEALTHY', 'HEALTHY')
이 패턴에서는 condition 식만 편집하세요.
HealthStatus 줄을 변경하지 않고 유지합니다.
| extend HealthStatus = iff(condition, 'UNHEALTHY', 'HEALTHY')
HealthStatus가 UNHEALTHY인 리소스는 클라우드용 Defender에서 비규정 준수 결과로 표시됩니다.
HealthStatus가 HEALTHY인 리소스는 규정을 준수하며 결과에 표시되지 않습니다.
Important
항상 둘 중 하나 HealthStatus 또는 'UNHEALTHY'.로 설정합니다'HEALTHY'. 범위 내의 모든 리소스를 반환합니다. 클라우드용 Defender HealthStatus 열을 사용하여 규정 준수를 확인합니다. 결과 집합에서 리소스가 생략되면 정상 상태가 아니라 데이터 없음으로 처리됩니다.
일반적인 오류 및 해결 방법:
-
필요한 열이 없습니다. 필요한 열 7개가 누락된 경우 쿼리가 실패합니다. 항상 .로 끝납니다
| project Id, Name, Environment, Identifiers, AdditionalData, Record, HealthStatus. -
잘못된
HealthStatus값: 유효한 값은'UNHEALTHY'및'HEALTHY'뿐입니다(대/소문자 구분). 다른 값 또는 null로 인해 구문 분석 오류가 발생합니다. -
잘못된 속성 경로: 속성은 직접 액세스하는 것이 아니라
Record.properties.*를 통해 액세스됩니다. 예를 들어Record.properties.httpsOnly아니라properties.httpsOnly사용합니다. -
리소스 유형의 대/소문자 구분:
Identifiers.Type비교에는=~(대/소문자를 구분하지 않는 일치)를 사용합니다.Identifiers.Type =~ 'Microsoft.Storage/storageAccounts'을 예로 들 수 있습니다. -
여러 구독에 걸친 null 속성: 구성이 서로 다른 여러 구독에 걸쳐 쿼리를 테스트하세요. 속성이 없을 수 있는 경우에는
isnull()검사를 사용합니다.
대규모 사용자 지정 권장 사항 사용
Azure 포털에서 사용자 지정 권장 사항을 만드는 것이 대부분의 사용자에게 가장 적합합니다. 인터페이스는 편리한 KQL 편집기 및 기본 제공 유효성 검사 도구를 제공합니다. 프로그래밍 방식도 여러 환경 또는 구독에 권장 사항을 배포해야 하는 경우에 유용할 수 있습니다.
API를 통해 자동화
KQL 쿼리의 유효성을 미리 검사하고 사용자 지정 권장 사항 만들기를 자동화하려는 경우 클라우드용 Microsoft Defender API를 사용할 수 있습니다. 이 방법을 사용하면 클라우드 환경에서 일관되고 확장 가능한 권장 사항을 신속하게 배포할 수 있습니다.
- 장점: 사용자 지정 권장 사항의 배포를 자동화하고 확장할 수 있습니다.
- 사용 시기: 이 메서드는 여러 환경에서 일관되게 권장 사항을 적용해야 하는 대규모 구현에 적합합니다.
API를 사용하여 사용자 지정 권장 사항을 관리하는 방법에 대한 자세한 내용은 클라우드용 Defender 복합 API 참조 참조하세요.
사용자 지정 표준 만들기
사용자 지정 권장 사항은 하나 이상의 사용자 지정 표준에 할당될 수 있습니다.
사용자 지정 표준을 만들려면 다음을 수행합니다.
Azure Portal에 로그인합니다.
클라우드용 Microsoft Defender> 환경 설정> 관련 구독으로 이동합니다.
보안 정책>+ 만들기>표준을 선택합니다.
사용자 지정 표준에 추가하려는 권장 사항을 선택합니다.
(선택 사항) Azure 구독의 경우 원본 열을 검토합니다.
만들기를 선택합니다.
Azure Policy(레거시)를 사용하여 사용자 지정 권장 사항 만들기 및 향상
Azure 구독의 경우 Azure Policy를 사용하여 사용자 지정 권장 사항 및 표준을 만들고 개선할 수 있습니다. 이 기능은 레거시 기능이며 새 사용자 지정 권장 사항 기능을 사용하는 것이 좋습니다.
사용자 지정 권장 사항 및 표준 만들기(레거시)
Azure Policy에서 정책 정의 및 이니셔티브를 만들고 이를 클라우드용 Defender에 온보딩하여 클라우드용 Defender에서 사용자 지정 권장 사항과 표준을 만들 수 있습니다.
Azure Policy(레거시)를 사용하여 사용자 지정 권장 사항 또는 표준을 만들려면 다음을 수행합니다.
- Azure Policy 포털에서 또는 프로그래밍 방식으로 하나 이상의 정책 정의를 만듭니다.
- 사용자 지정 정책 정의가 포함된 정책 이니셔티브를 만듭니다.
이니셔티브를 사용자 지정 표준(레거시)으로 온보딩
정책 할당은 Azure Policy에서 정책이나 이니셔티브에 Azure 리소스를 할당하는 데 사용됩니다.
클라우드용 Defender 사용자 지정 보안 표준에 이니셔티브를 등록하려면 여기에 표시된 대로 요청 본문에 "ASC":"true" 포함해야 합니다. 이 ASC 필드는 클라우드용 Microsoft Defender에 이니셔티브를 온보딩합니다.
사용자 지정 이니셔티브를 등록하려면 다음을 수행합니다.
사용자 지정 이니셔티브 온보딩 예
PUT https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policySetDefinitions/{policySetDefinitionName}?api-version=2021-06-01
요청 본문(JSON):
{
"properties": {
"displayName": "Cost Management",
"description": "Policies to enforce low cost storage SKUs",
"metadata": {
"category": "Cost Management",
"ASC":"true"
},
"parameters": {
"namePrefix": {
"type": "String",
"defaultValue": "myPrefix",
"metadata": {
"displayName": "Prefix to enforce on resource names"
}
}
},
"policyDefinitions": [
{
"policyDefinitionId": "/subscriptions/<Subscription ID>/providers/Microsoft.Authorization/policyDefinitions/7433c107-6db4-4ad1-b57a-a76dce0154a1",
"policyDefinitionReferenceId": "Limit_Skus",
"parameters": {
"listOfAllowedSKUs": {
"value": [
"Standard_GRS",
"Standard_LRS"
]
}
}
},
{
"policyDefinitionId": "/subscriptions/<Subscription ID>/providers/Microsoft.Authorization/policyDefinitions/ResourceNaming",
"policyDefinitionReferenceId": "Resource_Naming",
"parameters": {
"prefix": {
"value": "[parameters('namePrefix')]"
},
"suffix": {
"value": "-LC"
}
}
}
]
}
}
할당을 제거하는 예
이 예제는 할당을 제거하는 방법을 보여줍니다.
DELETE https://management.azure.com/{subscription}/providers/Microsoft.Authorization/policyAssignments/{policyAssignmentName}?api-version=2018-05-01
사용자 지정 권장 사항 강화(레거시)
클라우드용 Microsoft Defender에서 제공하는 기본 제공 권장 사항에는 심각도 수준과 수정 지침 등의 세부 정보가 포함됩니다. 이러한 형식의 정보를 Azure에 대한 사용자 지정 권장 사항에 추가하려면 REST API를 사용합니다.
다음과 같은 두 가지 유형의 정보를 추가할 수 있습니다.
- RemediationDescription – 문자열
- 심각도 – 열거형 [낮음, 보통, 높음]
사용자 지정 이니셔티브의 일부인 정책에 대한 정의에 메타데이터를 추가해야 합니다. 이는 다음과 같이 ‘securityCenter’ 속성에 있어야 합니다.
{
"metadata": {
"securityCenter": {
"RemediationDescription": "Custom description goes here",
"Severity": "High"
}
}
}
다음은 metadata/securityCenter 속성을 포함하는 사용자 지정 정책의 또 다른 예입니다.
{
"properties": {
"displayName": "Security - ERvNet - AuditRGLock",
"policyType": "Custom",
"mode": "All",
"description": "Audit required resource groups lock",
"metadata": {
"securityCenter": {
"RemediationDescription": "Resource Group locks can be set via Azure Portal -> Resource Group -> Locks",
"Severity": "High"
}
},
"parameters": {
"expressRouteLockLevel": {
"type": "String",
"metadata": {
"displayName": "Lock level",
"description": "Required lock level for ExpressRoute resource groups."
},
"allowedValues": [
"CanNotDelete",
"ReadOnly"
]
}
},
"policyRule": {
"if": {
"field": "type",
"equals": "Microsoft.Resources/subscriptions/resourceGroups"
},
"then": {
"effect": "auditIfNotExists",
"details": {
"type": "Microsoft.Authorization/locks",
"existenceCondition": {
"field": "Microsoft.Authorization/locks/level",
"equals": "[parameters('expressRouteLockLevel')]"
}
}
}
}
}
}
다른 securityCenter 속성 예제는 평가 메타데이터에 대한 REST API 예제를 참조하세요.
다음 단계
다음 링크를 사용하여 Kusto 쿼리에 대해 자세히 알아볼 수 있습니다.