! [중요] 이 문서에서는 SSH Posture Control의 초기 미리 보기 버전에 대해 설명합니다. 최신 설명서는 SSH Posture Control이란? 을 참조하세요.
SSH Posture Control을 사용하면 Azure Policy 및 Machine Configuration의 친숙한 워크플로를 사용하여 다음을 수행할 수 있습니다.
- 업계 또는 조직의 표준 준수 보장
- 원격 관리 기능의 공격 노출 영역 줄이기
- 보안 및 생산성을 위해 차량 전체에서 일관된 설정 보장
SSH 자세 제어는 규정 준수 또는 비준수 결정 방법을 설명하는 자세한 이유 도 제공합니다. 이러한 이유로 인해 더 쉽게 조치를 취하거나 규정 준수를 완전히 문서화할 수 있습니다.
SSH Posture Control은 약 20개의 SSH 서버(sshd) 매개 변수를 분석하고 적용합니다. 기본적으로 Linux용 Azure Compute 보안 기준과 일치하는 모범 사례를 감사하고 적용합니다. 환경에 맞게 특정 매개 변수를 사용자 지정할 수도 있습니다. 예를 들어 SSH 액세스가 허용되는 사용자 및 그룹을 사용자 지정할 수 있습니다.
프라이빗 미리 보기 제한 사항
중요
SSH Posture Control은 프라이빗 미리 보기로 제공되며, 사용자와 Microsoft 간의 대화 상자를 트리거하기 위한 것입니다.
- 미리 보기는 모든 문제(실수로 SSH 액세스에서 자신을 잠그는 것 포함)가 중요한 결과를 초래하지 않는 격리된 개발/테스트 머신에서 사용하기 위한 것입니다.
- 미리 보기에는 Azure Policy 기본 제공 목록에서 선택하는 대신 정책 정의를 가져오는 작업이 포함됩니다.
- 지원되는 Linux 배포판은 처음에 Ubuntu Server(20.04, 22.04) 및 Debian(11, 12)으로 제한됩니다. 다음에 미리 보기를 입력할 배포판을 알려주세요(페이지 끝에 있는 연락처 정보).
시작 예제
이 예제는 빠르게 시작하는 데 중점을 줍니다. 가정을 단순화하고 가능한 모든 것을 탐색하지는 않습니다. 예를 들어 허용되는 사용자 및 그룹과 같은 매개 변수를 사용자 지정하는 대신 PolicyDefinition의 기본 SSH 설정을 사용합니다. 설정 및 동작을 포함한 SSH Posture Control에 대한 보다 포괄적인 정보는 가까운 장래에 예상됩니다.
팁
이 문서 전체에서 사용되는 정신 모델 및 용어는 다음과 같습니다.
- PolicyDefinition : Azure Policy 서비스에 표시된 대로 SSH Posture Control 정의 및 메타데이터입니다.
- PolicyAssignment : SSH Posture Control PolicyDefinition을 리소스 그룹과 같이 해당 정책을 적용해야 하는 범위에 연결합니다.
- 컴퓨터 : Azure Policy 및 Machine Configuration(즉, 게스트 구성)에서 관리할 수 있는 엔드포인트입니다. 즉, Arc 지원 컴퓨터 또는 Azure VM.
A. 필수 구성 요소
- 리소스 그룹, VM(또는 Arc 컴퓨터), 정책 정의 및 정책 할당을 만들 수 있는 권한이 있는 Azure 계정.
- 추가 필수 구성 요소를 보려면 원하는 환경을 선택합니다.
- 다음 모듈이 설치된 PowerShell 환경:
- Az.ResourceGraph
- Az.Accounts
- Az.Resources
- 및/또는
Set-AzContext cmdlet을 사용하여 Get-AzContext 원하는 Azure 환경이 대상으로 지정되도록 합니다.
B. 리소스 그룹 만들기
- 리소스 그룹을 만듭니다. 향후 단계에서는 정책의 범위를 지정하고 새 테스트 머신을 포함하는 데 사용됩니다.
$myResourceGroupName = "ssh_demo_resource_group"
$myAzureLocation = "eastus" ## Modify as needed
$myResourceGroup = New-AzResourceGroup -Name $myResourceGroupName -Location $myAzureLocation
C. PolicyDefinition 만들기
참고
이 추가 단계(PolicyDefinition을 선택하는 대신 만들기)는 프라이빗 미리 보기 중에 필요합니다.
$sshPolicyDefinitionJsonUri = "https://raw.githubusercontent.com/Azure/azure-osconfig/main/src/adapters/mc/sshpreview/OsConfigPolicy_DeployIfNotExists.json"
$sshPolicyDefinitionName = "[Preview] SSH Posture Control policy"
$sshPolicyDefinition = New-AzPolicyDefinition -Name $sshPolicyDefinitionName -Policy $sshPolicyDefinitionJsonUri
D. PolicyAssignment를 사용하여 리소스 그룹에 PolicyDefinition 적용
주의
이 정책은 범위 내 컴퓨터에서 sshd 구성을 수정합니다. 이러한 지침은 처음에 빈 리소스 그룹에 할당하여 나중에 테스트 머신을 만들도록 합니다. 더 넓은 범위에 할당하도록 선택하는 경우 주의해야 합니다.
- 정책 | 로 이동합니다. 사용 가능한 모든 정책 정의를 나열하는 정의 페이지입니다.
- [미리 보기] SSH Posture Control 정책 정책 이전에 만든 정의 선택
- 할당을 클릭합니다.
- 범위에서 나중에 새 테스트 머신을 만들 리소스 그룹을 선택합니다.
- 매개 변수 탭으로 이동합니다.
- Arc 연결된 컴퓨터를 특별히 제외하지 않으려면 Arc 연결된 컴퓨터 포함에 대해 "true"를 선택합니다.
- 참고: 허용된 그룹과 같은 SSH 설정을 사용자 지정하려면 매개 변수만 표시... 상자의 선택을 취소하여 사용 가능한 모든 매개 변수를 표시합니다. 허용되거나 거부된 사용자 또는 그룹을 지정하도록 선택하는 경우 공백으로 구분된 문자열(예
userA userB: )을 입력해야 합니다.
- 수정 탭으로 이동합니다.
- 참고: 이 데모는 새 컴퓨터에 중점을 두지만 PolicyAssignment를 기존 컴퓨터에 적용하려는 다른 시나리오에서는 수정 작업 만들기 확인란을 선택할 수 있습니다.
- 시스템이 할당된관리 ID 만들기 및 선택한 ID 위치를 선택합니다.
- 검토 + 만들기로 진행
- 만들기를 선택하여 PolicyAssignment를 완료합니다.
$myResourceGroupName = "ssh_demo_resource_group"
$myAzureLocation = "eastus"
$sshPolicyDefinitionName = "[Preview] SSH Posture Control policy"
$sshPolicyAssignmentName = "[Preview] SSH Posture Control assignment"
$myResourceGroup = Get-AzResourceGroup -Name $myResourceGroupName
$sshPolicyDefinition = Get-AzPolicyDefinition -Name $sshPolicyDefinitionName
## Assign our new SSH policy to the resource group
$sshPolicyAssignment = New-AzPolicyAssignment -Name $sshPolicyAssignmentName -PolicyDefinition $sshPolicyDefinition -Scope $myResourceGroup.ResourceId -AssignIdentity -Location $myAzureLocation
## Complete RBAC assignment
New-AzRoleAssignment -ObjectId $sshPolicyAssignment.Identity.PrincipalId -RoleDefinitionId $sshPolicyDefinition.Properties.PolicyRule.then.details.roleDefinitionIds[0].split("/")[4] -Scope "/subscriptions/$((Get-AzContext).Subscription.Id)"
E. 새 컴퓨터 만들기
새 PolicyAssignments는 기존 머신에 적용할 수 있지만 프로세스는 최대 24시간이 걸릴 수 있습니다. 이 빠른 시작에서는 새 머신을 평가하는 데 집중합니다. 이 예제에서는 Azure VM을 만들지만 원하는 경우 Arc 지원 컴퓨터를 만들 수 있습니다.
- Azure Virtual Machines 환경으로 이동합니다.
- 새 VM을 만들어 다음 속성을 확인합니다.
- 구독 및 리소스 그룹은 PolicyAssignment 범위가 지정된 위치와 일치해야 합니다.
- 이미지는 "Unbuntu Server 22.04..."여야 합니다.
- VM 아키텍처는 x64여야 합니다.
- VM 이름, 크기 등과 같은 다른 속성은 원하는 대로 될 수 있습니다.
- VM 만들기가 완료되기를 기다린 다음 리소스로 이동을 클릭하여 컴퓨터 개요 페이지에 도달합니다.
- 왼쪽 탐색 영역에서 ID를 선택하고 컴퓨터에 시스템 관리 ID가 있는지 확인합니다.
- 왼쪽 탐색 영역에서 확장 + 애플리케이션,+ 추가를 차례로 선택합니다.
- Azure Automanage Machine Configuration 확장을 선택하고 다음을 선택합니다.
- 검토 + 만들기를 선택한 다음, 만들기
$myResourceGroupName = "ssh_demo_resource_group"
$myNameForNewVM = "sshdemovm01"
## Creates a new VM which is prepped to work with MachineConfiguration
## by having a system assigned identity and the GuestConfiguration extension
New-AzVM -Name $myNameForNewVM -ResourceGroupName $myResourceGroupName -SystemAssignedIdentity -Image Ubuntu2204
Set-AzVMExtension -ResourceGroupName $myResourceGroupName -VMName $myNameForNewVM -ExtensionType "ConfigurationforLinux" -Publisher "Microsoft.GuestConfiguration" -Name "AzurePolicyForLinux" -TypeHandlerVersion 1.0
F. 계속하기 전에 휴식을 취하십시오.
새 PolicyDefinitions, PolicyAssignments 및 컴퓨터가 관련된 경우 모든 항목이 안정적인 상태에 도달하는 데 몇 분 정도 걸릴 수 있습니다. 다음 단계로 진행하기 전에 30분 이상 기다리는 것이 좋습니다.
G. 규정 준수 결과 관찰
다음 단계를 통해 다양한 고도에서 규정 준수 롤업을 볼 수 있습니다.
- PolicyAssignment에 의한 규정 준수
- 규격 및 비규격 컴퓨터 수
- 가장 높은 고도, 큰 함대에 특히 유용
- 컴퓨터별 규정 준수
- 특정 머신에 대해 를 설정하여 규정 준수
- 이 문서의 맨 위에 있는 스크린샷과 같은 가장 깊은 수준의 세부 정보입니다.
팁
새 컴퓨터가 처음으로 정책을 발견하면 비준수로 판단될 수 있습니다. 정책의 기본 SSH 설정은 기본적으로 구성된 많은 OS 이미지보다 더 엄격합니다. 20분 정도 더 지나면 SSH Posture Control에 기본 제공되는 수정 논리 덕분에 컴퓨터가 규격이 되는 것을 확인할 수 있습니다.
- 정책으로 이동 | 준수 페이지.
- [미리 보기] SSH 자세 제어 정책을 선택합니다.
- 규격/비규격 컴퓨터 수가 보고되는지 확인합니다.
- 리소스 준수에서 개별 머신의 상태를 볼 수 있습니다.
- 특정 머신에 대한 설정별 세부 정보로 드릴다운하려면 다음을 수행합니다.
- 컴퓨터 옆에 있는 ... 를 클릭하고 리소스 보기를 선택하여 컴퓨터의 개요 페이지에 도달합니다.
- 작업 아래의 왼쪽 탐색 영역에서 구성 관리(설정 아래 의 구성 아님)를 클릭합니다.
- LinuxSSHServerSecurityBaseline을 클릭합니다.
- 결과 페이지에는 규정 준수 및 규정 준수 결정 방법에 대한 세부 정보가 포함된 구성의 각 설정이 표시됩니다.
가장 높은 고도(컴퓨터 수)에서 상태를 관찰하려면 다음을 사용할 수 있습니다.
$machineCountsQuery = @'
guestconfigurationresources
| where name startswith("LinuxSshServerSecurityBaseline")
| extend complianceStatus = tostring(properties.complianceStatus)
| summarize machineCount = count() by complianceStatus
'@
Search-AzGraph -Query $machineCountsQuery
<#
Sample output from an environment with two machines:
complianceStatus machineCount
---------------- ------------
Pending 1
Compliant 1
#>
컴퓨터별 규정 준수를 보려면 다음을 사용할 수 있습니다.
$machinePerRowQuery = @'
guestconfigurationresources
| where name startswith("LinuxSshServerSecurityBaseline")
| project
machine = split(properties.targetResourceId,'/')[-1],
complianceStatus = properties.complianceStatus,
lastComplianceStatusChecked = properties.lastComplianceStatusChecked
'@
Search-AzGraph -Query $machinePerRowQuery
<#
Sample output:
machine complianceStatus lastComplianceStatusChecked
------- ---------------- ---------------------------
sshdemovm01 Compliant 2/15/2024 11:07:21 PM
sshdemovm02 Pending 1/1/0001 12:00:00 AM
#>
설정별 세부 정보를 보려면 다음을 사용할 수 있습니다.
$settingPerRowQuery = @'
guestconfigurationresources
| where name startswith ('LinuxSshServerSecurityBaseline')
| extend machine = split(properties.targetResourceId,'/')[-1]
| mvexpand properties.latestAssignmentReport.resources
| mvexpand properties_latestAssignmentReport_resources.reasons
| project machine,
complianceCheck = tostring(properties_latestAssignmentReport_resources.resourceId),
complianceStatus = tostring(properties.complianceStatus),
complianceReason = tostring(properties_latestAssignmentReport_resources_reasons.phrase)
'@
Search-AzGraph $settingPerRowQuery
<#
Sample output:
machine complianceCheck complianceStatus complianceReason
------- --------------- ------ ------
sshdemovm01 Ensure permissions on /etc/ssh/sshd_config are configured Compliant Access to '/etc/ssh/sshd_config' matches required ...
sshdemovm01 Ensure SSH is configured to meet best practices (protocol 2) Compliant 'Protocol 2' is found uncommented in /etc/ssh/sshd_config
sshdemovm01 Ensure SSH is configured to ignore rhosts Compliant The sshd service reports that 'ignorerhosts' is set to 'yes'
sshdemovm01 Ensure SSH LogLevel is set to INFO Compliant The sshd service reports that 'loglevel' is set to 'INFO'
sshdemovm01 Ensure SSH MaxAuthTries is configured Compliant The sshd service reports that 'maxauthtries' is set to '6'
sshdemovm01 Ensure allowed users for SSH access are configured Compliant The sshd service reports that 'allowusers' is set to '*@*'
sshdemovm01 Ensure denied users for SSH are configured Compliant The sshd service reports that 'denyusers' is set to 'root'
sshdemovm01 Ensure allowed groups for SSH are configured Compliant The sshd service reports that 'allowgroups' is set to '*'
sshdemovm01 Ensure denied groups for SSH are configured Compliant The sshd service reports that 'denygroups' is set to 'root'
sshdemovm01 Ensure SSH host-based authenticationis disabled Compliant The sshd service reports that 'hostbasedauthentication' is ...
#>
다음 단계
피드백, 기능 요청 등을 제공하려면 Microsoft 팀에 문의하세요.