다음을 통해 공유


SSH 자세 제어란?

SSH Posture Control을 사용하면 Ubuntu, Red Hat, Azure Linux 등을 비롯한 지원되는 Linux 배포판에서 SSH 서버 보안 태세를 감사하고 구성할 수 있습니다. SSH Posture Control은 Azure 거버넌스 서비스(정책, 컴퓨터 구성)와 원활하게 통합되므로 다음을 수행할 수 있습니다.

  • 업계 또는 조직의 sshd 표준을 사용하여 규정 준수 보장
  • sshd 기반 원격 관리의 공격 노출 영역 줄이기
  • 보안 및 생산성을 위해 플릿 전체에서 일관된 sshd 설정 보장

준수 SSH 검사 목록을 보여 주는 스크린샷

감사자의 규정 준수를 입증하고 필요한 경우 조치를 취하는 데 도움이 되도록 각 규정 준수 검사에는 규정 준수 또는 비준수 결정 방법을 나타내는 이유 필드를 통한 증거가 포함됩니다.

sshd 매개 변수(포트 번호, 허용된 그룹 등)를 사용자 지정하거나 Linux용 Azure 보안 기준에 맞는 정책 기본값을 사용할 수 있습니다.

시작하기 위한 설명서

  • 빠른 시작: 클릭 클릭 실습 환경은 빠른 시작을 참조하세요. 테스트 머신SSH Posture Control 적용합니다.
  • 개요 및 참조: 개념 정보, 참조 및 FAQ의 경우 이 문서에서 계속 진행합니다.

감사 전용 및 감사 및 구성 동작 선택

SSH Posture Control 정책을 할당할 때 감사 전용(즉, "감사") 동작을 선택하거나 감사 및 구성(즉, "구성") 동작을 수 있습니다.

정책 정의 Azure Policy 효과 예상되는 사항에 대한 참고 사항
감사 전용 동작 **Audit** SSH Posture Control on Linux machines auditIfNotExists 이 정책에는 널리 사용되는 많은 시스템 이미지에 비해 더 제한적인 설정이 포함됩니다. 예를 들어 루트 ssh 액세스 거부입니다. 따라서 비준수 상태가 보고됩니다.
감사 및 구성 동작 **Configure** SSH Posture Control on Linux machines deployIfNotExists 위와 같이 처음에 보고된 비준수 상태를 볼 수 있습니다. 그 후 머신이 정책과 일치하도록 다시 구성되어 최종 준수 상태가 됩니다.

기존 컴퓨터의 경우 관리자는 일반적으로 감사 전용 동작으로 시작하여 기존 상태를 확인하고 시스템 자동화에 허용되는 계정과 같은 종속성을 검색합니다. 기존 플릿을 SSH Posture Control 기본값과 비교한 후 사용자 지정할 SSH Posture Control 매개 변수를 결정합니다. 이 분석 및 계획 후에는 감사 및 구성 동작(링과 같은 안전한 배포 방법 포함)으로 전환합니다.

그린필드 시나리오 또는 삭제 가능한 테스트 머신의 경우 해당 분석을 건너뛰고 감사 및 구성 동작으로 직접 이동하여 강력한 SSH Posture Control 기본값으로 새로 시작할 수 있습니다.

주의

컴퓨터를 구성하기 전에 새 구성의 유효성을 검사하는 데 주의해야 합니다. 실수로 컴퓨터에 대한 액세스 권한을 잃을 수 있습니다.

실수로 자신을 잠그는 예는 다음과 같습니다.

  • 적용된 순 권한 부여 설정(allowUsers,denyGroups,permitRootLogin등의 조합)은 필요한 로그인을 허용하지 않습니다.
  • sshd에 대해 구성하는 port 사용자 환경의 다른 컨트롤(SELinux 정책, 호스트 방화벽 규칙, 네트워크 방화벽 규칙 등)에 의해 차단됩니다.
    • 많은 Red Hat 제품군 배포판에는 Sshd가 22 이외의 포트를 사용하지 못하도록 차단하는 SELinux 정책이 기본적으로 적용되어 있습니다.
    • 엔터프라이즈 팀 경계를 넘지 않도록 SSH Posture Control은 sshd만 구성했습니다. 현재 구성된 sshd 포트를 수용하기 위해 온-머신 SELinux 정책, 방화벽 규칙 등을 수정하려고 시도하지 않습니다. 이러한 시나리오에 대해 논의하려면 Microsoft에 문의하세요(아래 추가 리소스 참조).

SSH Posture Control 범위: 규칙, 기본값 및 사용자 지정

다음 표에서는 SSH Posture Control을 사용하여 감사하거나 구성할 수 있는 항목을 나열합니다. 이러한 각 규칙을규칙이라고 합니다.

각 규칙에는 Linux용 Azure 보안 기준에 맞춰 기본 구성 값이 있습니다.

대부분의 규칙은 감사하거나 구성하고 감사할 정책 할당 매개 변수를 통해 사용자 지정 값을 부여할 수 있습니다. 예를 들어 조직의 표준이 sshd에 포트 1111(22가 아닌)을 사용하는 경우 정책 할당에서 해당 매개 변수를 설정합니다. 이러한 매개 변수에는 아래 표에 포함된 식별자가 있습니다. 일반적으로 짧은 매개 변수 이름은 프로그래밍 방식으로 사용되는 반면(예: az policy assignment create --params ...), Azure Portal 워크플로에서 더 긴 매개 변수 표시 이름이 사용됩니다.

값을 사용자 지정할 때는 sshd와 호환되는 값을 제공해야 합니다. 예를 들어 allowGroups 그룹 이름 패턴의 공백으로 구분된 목록을 사용합니다. 참조는 sshd_config man 페이지참조하세요. sshd_config 참조는 허용하고 거부 목록이 교차하는 방법과 같은 다른 sshd 동작을 이해하는 데에도 유용합니다.

메모

표 레이아웃을 유지하기 위해 일부 셀 값이 표 아래 각주로 이동되었습니다.

규칙 이름 기본값 매개 변수 이름 매개 변수 표시 이름
/etc/ssh/sshd_config 대한 권한이 구성되었는지 확인합니다. 600 <각주 1> sshd_config 대한 액세스 권한
IgnoreRhosts가 설정되어 있는지 확인 ignoreHosts 로스트와 쇼스트 무시
LogLevel이 설정되었는지 확인 정보 logLevel 로그 세부 정보 표시 수준
MaxAuthTries가 설정되었는지 확인 6 maxAuthTries 최대 인증 시도 횟수
SSH 액세스에 허용되는 사용자가 구성되었는지 확인 각주 5 참조 allowUsers SSH에 허용되는 사용자
SSH 액세스에 대해 거부된 사용자가 구성되었는지 확인 뿌리 denyUsers SSH에 대해 거부된 사용자
SSH 액세스에 허용되는 그룹이 구성되었는지 확인합니다. * allowGroups SSH에 허용되는 그룹
SSH 액세스에 대해 거부된 그룹이 구성되었는지 확인 뿌리 denyGroups SSH에 대해 거부된 그룹
HostbasedAuthentication이 설정되었는지 확인합니다. 아니요 hostBasedAuthentication 호스트 기반 인증
PermitRootLogin이 설정되었는지 확인 아니요 permitRootLogin 루트가 ssh를 사용하여 로그인할 수 있는지 여부
PermitEmptyPasswords가 설정되어 있는지 확인 아니요 permitEmptyPasswords 서버에서 빈 암호 문자열이 있는 계정에 로그인할 수 있는지 여부
ClientAliveCountMax가 설정되었는지 확인 0 clientAliveCountMax sshd가 클라이언트에서 메시지를 다시 받지 않고 전송될 수 있는 클라이언트 활성 메시지 수
ClientAliveInterval이 설정되었는지 확인 3600 clientAliveInterval 시간 제한 간격(초)으로, 클라이언트에서 데이터를 받지 않은 경우 sshd는 응답을 요청하는 메시지를 보냅니다.
MAC가 구성되었는지 확인 <각주 2> <각주 3> MAC(사용 가능한 메시지 인증 코드) 알고리즘 목록
배너가 구성되어 있는지 확인합니다. <각주 4> banner 인증이 허용되기 전에 원격 사용자에게 전송되는 배너 파일의 내용
PermitUserEnvironment가 설정되었는지 확인합니다. 아니요 permitUserEnvironment ~/.ssh/environment 및 environment= ~/.ssh/authorized_keys 옵션이 sshd에서 처리되는지 여부
암호화가 구성되었는지 확인 aes128-ctr,aes192-ctr,aes256-ctr ciphers 허용되는 암호 목록
SSH 포트가 구성되어 있는지 확인합니다. 22 port SSH 포트
모범 사례 프로토콜이 사용되는지 확인 2 매개 변수 없음 매개 변수 없음

표 각주:

  1. accessPermissionsForSshdConfig

  2. messageAuthenticationCodeAlgorithms

  3. hmac-sha2-256,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-512-etm@openssh.com

  4. #######################################################################\n\nAuthorized access only!\n\nIf you are not authorized to access or use this system, disconnect now!\n\n#######################################################################\n

    1. 참고: 최종 사용자에게 다음과 같이 표시됩니다.
    #######################################################################
    
    Authorized access only!
    
    If you are not authorized to access or use this system, disconnect now!
    
    #######################################################################
    
  5. allowUsers 기본값 "@"은 컴퓨터의 모든 계정을 나타냅니다.

추가(비 sshd) 정책 매개 변수

이러한 추가 정책 매개 변수는 정책 할당 중에 사용할 수 있습니다. 이는 머신의 sshd 설정과 달리 Azure Policy 할당 동작에 영향을 줍니다.

이름 묘사 기본값
Arc 연결된 서버 포함 이 옵션을 선택하면 Arc 연결된 컴퓨터당 매월 요금이 청구되는 데 동의합니다. FALSE
효과 이 정책의 실행을 사용하거나 사용하지 않도록 설정 감사 전용과 감사 및 구성 동작 선택하는 따라 달라집니다.

정책 정의? 정책 할당? 게스트 할당? 컴퓨터 구성? 이 모든 것이 어떻게 결합됩니까?

SSH Posture Control을 시작하기 위해 핵심 작업은 정책 할당만드는 것입니다. 정책 할당은 정책 정의(예: "Linux 머신에 대한 SSH Posture Control 감사")을 범위(예: "my_factory_3_resource_group")에 연결합니다.

시스템을 사용하면 다음에 요약된 대로 추가 리소스 종류 및 용어가 발생합니다.

정책 할당이 게스트 할당을 통해 머신 구성 서비스에 머신을 연결하는 방법을 보여 주는 다이어그램

묘사
정책 정의 정책 서비스 내에서 사용 가능한 감사 및/또는 구성 동작의 클러스터를 설명하는 추상 데이터입니다. 예를 들어 "Linux 컴퓨터에서 SSH 자세 제어 감사"가 있습니다.
정책 할당 추상 정책 정의를 리소스 그룹과 같은 구체적인 범위에 연결합니다. 정책 할당에는 매개 변수 및 해당 할당과 관련된 기타 속성이 포함될 수 있습니다.
컴퓨터 구성 OS 수준에서 감사 및 설정 구성을 처리하는 Azure 서비스 및 에이전트입니다.
게스트 할당 정책 할당, 컴퓨터 및 컴퓨터 구성 서비스 간의 3방향 링크 역할을 하는 리소스입니다. 정책은 필요에 따라 게스트 할당 리소스를 만들고 모니터링합니다.
"게스트" 및 "컴퓨터" 용어에 대한 자세한 내용은 "게스트 구성" 및 "Automanage"라는 용어가 장소에서 표시되는 이유는 무엇인가요?
컴퓨터 Arc 지원 컴퓨터 또는 Azure VM.

호환성 정보(배포판, SSH 서버 구현 등)

SSH Posture Control은 단일 장기 실행 SSH Server 인스턴스의 일반적인 범용 Linux 시나리오를 위해 설계되었습니다.

  • init 시스템 sush에서 systemd로 수명 주기를 관리합니다.
  • openSSH sshd 동작과 일치하는 sshd_config 파일의해 동작이 고브렌딩됩니다.
  • 유효한 구성/상태가 sshd -T 출력에 의해 표시되며 OpenSSH sshd 동작과 일치합니다.

지원되는 모든 배포판의 경우(아래 참조) 기본 SSH 서버 사용 사례입니다.

원칙에 따라 컴퓨터에는 코드베이스 수에 따라 다양한 수명으로 실행되는 SSH 서버 인스턴스 수가 있을 수 있으며, 여러 위치(구성 파일, 명령줄 인수, 컴파일 시간 매개 변수 등)에서 구성을 수행할 수 있습니다. 이러한 경우는 현재 SSH Posture Control의 범위를 벗어났습니다. 이러한 경우 미래에 관심이 있는 경우 문의하여 논의하세요.

SSH Posture Control은 개발 당시 추가 지원을 받은 배포판을 제외하고 Azure Policy 및 Machine Configuration에서 지원하는 Linux 배포판에서 사용하기 위한 것입니다. 특히 다음 범위는 2024-06-05년입니다.

  • AlmaLinux 9
  • Amazon Linux 2
  • Ubuntu Server 20.04
  • Ubuntu Server 22.04
  • Debian 10
  • Debian 11
  • Debian 12
  • Azure Linux(CBL Mariner) 2
  • Oracle Linux 7
  • Oracle Linux 8
  • CentOS 7.3
  • CentOS 8
  • RHEL 7.4
  • RHEL 8
  • RHEL 9
  • Rocky Linux 9
  • SLES 15

가능한 한, SSH 자세 제어는 위의 배포판의 특정 널리 사용되는 시스템 컴퍼지션으로 테스트됩니다. 예를 들어 Azure 갤러리의 배포판 유지 관리자가 게시한 OS 이미지 컴퍼지션입니다. sysadmins 및 이미지 작성기는 OS에서 구성 요소를 제거하고, 파일 시스템을 읽기 전용으로 만들고, SELinux로 에이전트 작업을 차단하는 등의 작업을 자유롭게 수행할 수 있으므로 런타임에 특정 컴퓨터와의 호환성을 보장할 수 없습니다.

sshd_config Include 지시문과의 호환성

SSH Posture Control은 다음과 같이 sshd_config Include 지시문을 수용하고 사용하려고 시도합니다.

  • 감사/읽기 작업의 경우: sshd의 관점에서 모든 포함을 고려하여 sshd -T 순 구성을 반영합니다.
  • 구성/쓰기 작업의 경우:
    • 컴퓨터의 sshd 구현이 Include를 지원하는 경우 새 SSH Posture Control 특정 파일을 sshd_config 연결합니다(Include). 그 후 연결된 SSH Posture Control 파일에 모든 쓰기를 배치합니다. 이렇게 하면 시스템 변경의 시스템 위생 및 추적 가능성이 향상됩니다.
    • 컴퓨터의 sshd 구현이 Include 지시문을 지원하지 않는 경우 구성 변경 내용을 sshd_config 직접 작성합니다.

sshd_config Match 지시문과의 호환성

SSH Posture Control은 핵심 sshd 동작을 감사하고 구성하도록 설계되었습니다. 특정 모집단에 다른 sshd 구성을 적용할 수 있는 조건부 Match 블록(있는 경우)과 상호 작용을 시도하지 않습니다.

결과를 프로그래밍 방식으로 쿼리하는 방법

ARG(Azure Resource Graph) 쿼리를 사용하여 할당 및 상태 데이터를 고유한 워크플로에 통합할 수 있습니다. 이러한 예제에서는 PowerShell에서 Search-AzGraph 사용하여 ARG 쿼리를 실행하지만 PowerShell은 필요하지 않습니다. Azure Portal, Azure CLI, REST 호출 등을 비롯한 여러 진입점에서 ARG를 사용할 수 있습니다.

  1. 가장 높은 요약 고도에서 규정 준수 상태 버킷당 컴퓨터 수를 가져올 수 있습니다. 예를 들어:

    $machineCountsQuery = @'
    // SSH machine counts by compliance status
    guestconfigurationresources
    | where name contains "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
    #>
    
  2. 컴퓨터별로 전반적인 규정 준수 상태를 볼 수 있도록 드릴인하려면 다음을 사용할 수 있습니다.

    $machinePerRowQuery = @'
    // SSH machine level compliance
    guestconfigurationresources
    | where name contains "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
    #>
    
  3. 설정별 세부 정보로 드릴다운하려면 다음을 사용할 수 있습니다.

    $settingPerRowQuery = @'
    // SSH rule level detail
    GuestConfigurationResources
    | where name contains "LinuxSshServerSecurityBaseline"
    | project report = properties.latestAssignmentReport,
     machine = split(properties.targetResourceId,'/')[-1],
     lastComplianceStatusChecked=properties.lastComplianceStatusChecked
    | mv-expand report.resources
    | project machine,
     rule = report_resources.resourceId,
     ruleComplianceStatus = report_resources.complianceStatus,
     ruleComplianceReason = report_resources.reasons[0].phrase,
     lastComplianceStatusChecked
    '@
    
    Search-AzGraph $settingPerRowQuery
    
    <#
    Sample output:
    
    machine     rule                                                  ruleComplianceStatus     ruleComplianceReason
    -------     ---------------                                                  ------               ------
    sshdemovm01 Ensure permissions on /etc/ssh/sshd_config are configured        true            Access to '/etc/ssh/sshd_config' matches required ...
    sshdemovm01 Ensure SSH is configured to meet best practices (protocol 2)     true            'Protocol 2' is found uncommented in /etc/ssh/sshd_config
    sshdemovm01 Ensure SSH is configured to ignore rhosts                        true            The sshd service reports that 'ignorerhosts' is set to 'yes'
    sshdemovm01 Ensure SSH LogLevel is set to INFO                               true            The sshd service reports that 'loglevel' is set to 'INFO'
    sshdemovm01 Ensure SSH MaxAuthTries is configured                            true            The sshd service reports that 'maxauthtries' is set to '6'
    sshdemovm01 Ensure allowed users for SSH access are configured               true            The sshd service reports that 'allowusers' is set to '*@*'
    sshdemovm01 Ensure denied users for SSH are configured                       true            The sshd service reports that 'denyusers' is set to 'root'
    sshdemovm01 Ensure allowed groups for SSH are configured                     true            The sshd service reports that 'allowgroups' is set to '*'
    sshdemovm01 Ensure denied groups for SSH are configured                      true            The sshd service reports that 'denygroups' is set to 'root'
    sshdemovm01 Ensure SSH host-based authenticationis disabled                  true            The sshd service reports that 'hostbasedauthentication' is ...
    #>
    

"게스트 구성" 및 "Automanage"라는 용어가 장소에서 표시되는 이유는 무엇인가요?

Machine Configuration 서비스는 게스트 구성컴퓨터 구성알려져 있습니다. 서비스 및 설명서와 상호 작용할 때 이러한 이름이 발생할 수 있습니다. 예를 들어:

  • 이 문서의 Azure Resource Graph 쿼리 예제에서 데이터 테이블을 guestconfigurationresources.
  • Azure Portal에서 결과를 관찰하는 데 유용한 보기를 "게스트 할당"이라고 합니다.
  • Azure Portal에서 관련 VM 확장을 적용하여 Machine Configuration을 사용하도록 설정하는 경우 확장 제목은 "Automanage Machine Configuration"입니다.

SSH Posture Control의 목적을 위해 "guest"와 "machine"을 의미 있는 구분이 없습니다. Arc 지원 머신 및 Azure VM이 적격합니다.

기본 제공 정책 정의의 식별자는 무엇인가요?

Azure CLI를 사용하여 정책 할당을 만드는 등의 경우에 표시 이름 대신 ID로 정책 정의를 참조하는 것이 유용하거나 필요할 수 있습니다.

displayName 아이디
Linux 컴퓨터에서 SSH 자세 제어 감사 /providers/Microsoft.Authorization/policyDefinitions/a8f3e6a6-dcd2-434c-b0f7-6f309ce913b4
Linux 컴퓨터에서 SSH Posture Control 구성 /providers/Microsoft.Authorization/policyDefinitions/e22a2f03-0534-4d10-8ea0-aa25a6113233