다음을 통해 공유


Windows 컨테이너용 gMSA 만들기

적용 대상: Windows Server 2025, Windows Server 2022, Windows Server 2019

Windows 기반 네트워크는 일반적으로 AD(Active Directory)를 사용하여 사용자, 컴퓨터 및 기타 네트워크 리소스 간의 인증 및 권한 부여를 용이하게 합니다. 엔터프라이즈 애플리케이션 개발자는 종종 AD 통합으로 앱을 디자인하고 도메인에 가입된 서버에서 실행하여 Windows 통합 인증을 활용하므로 사용자 및 기타 서비스가 ID를 사용하여 애플리케이션에 자동으로 투명하게 로그인할 수 있습니다. 이 문서에서는 Windows 컨테이너와 함께 Active Directory 그룹 관리 서비스 계정을 사용하는 방법을 설명합니다.

Windows 컨테이너는 도메인에 가입할 수 없지만 Active Directory 도메인 ID를 사용하여 다양한 인증 시나리오를 지원할 수 있습니다. 이를 위해 Windows Server 2012에서 도입되고 여러 컴퓨터가 암호를 알 필요 없이 ID를 공유할 수 있도록 설계된 특수한 유형의 서비스 계정인 그룹 gMSA(관리 서비스 계정)로 실행되도록 Windows 컨테이너를 구성할 수 있습니다. Windows 컨테이너는 도메인에 가입할 수 없지만 Windows 컨테이너에서 실행되는 많은 Windows 애플리케이션에는 여전히 AD 인증이 필요합니다. AD 인증을 사용하려면 gMSA(그룹 관리 서비스 계정)로 실행되도록 Windows 컨테이너를 구성할 수 있습니다.

Windows 컨테이너용 gMSA가 처음 도입되었을 때 컨테이너 호스트를 도메인에 가입해야 했기 때문에 사용자가 Windows 작업자 노드를 도메인에 수동으로 조인하는 오버헤드가 많이 발생했습니다. 이 제한 사항은 도메인에 가입되지 않은 컨테이너 호스트에 대한 Windows 컨테이너 지원용 gMSA를 사용하여 해결되었습니다. 도메인에 가입된 컨테이너 호스트를 사용하기 위해 원래 gMSA 기능을 계속 지원합니다.

도메인에 가입되지 않은 컨테이너 호스트를 사용하는 경우 gMSA의 향상된 기능은 다음과 같습니다.

  • Windows 작업자 노드를 도메인에 수동으로 조인해야 하는 요구 사항은 사용자에게 많은 오버헤드를 발생시켰기 때문에 제거됩니다. 크기 조정 시나리오의 경우 도메인에 가입되지 않은 컨테이너 호스트를 사용하면 프로세스가 간소화됩니다.
  • 롤링 업데이트 시나리오에서 사용자는 더 이상 노드를 도메인에 다시 가입할 필요가 없습니다.
  • gMSA 서비스 계정 암호를 검색하기 위해 작업자 노드 컴퓨터 계정을 관리하는 것이 더 쉬운 프로세스입니다.
  • Kubernetes를 사용하여 gMSA를 구성하는 것은 덜 복잡한 엔드투엔드 프로세스입니다.

메모

Kubernetes 커뮤니티가 Windows 컨테이너에서 gMSA를 사용하는 것을 어떻게 지원하는지 알아보려면, 에 있는 gMSA구성 정보를 참조하세요.

gMSA 아키텍처 및 개선 사항

Windows 컨테이너용 gMSA의 초기 구현 제한 사항을 해결하기 위해 도메인에 가입되지 않은 컨테이너 호스트에 대한 새 gMSA 지원은 호스트 컴퓨터 계정 대신 이식 가능한 사용자 ID를 사용하여 gMSA 자격 증명을 검색합니다. 따라서 Windows 작업자 노드를 도메인에 수동으로 조인할 필요는 없지만 여전히 지원됩니다. 사용자 ID/자격 증명은 인증된 사용자가 검색할 수 있는 컨테이너 호스트(예: Kubernetes 비밀)에 액세스할 수 있는 비밀 저장소에 저장됩니다.

그룹 관리 서비스 계정 버전 2의 다이어그램

도메인에 가입되지 않은 컨테이너 호스트에 대한 gMSA 지원은 도메인에 호스트 노드를 조인하지 않고도 gMSA를 사용하여 컨테이너를 유연하게 만들 수 있도록 합니다. Windows Server 2019부터 플러그 인 메커니즘이 Active Directory에서 gMSA 자격 증명을 검색할 수 있도록 하는 ccg.exe 지원됩니다. 해당 ID를 사용하여 컨테이너를 시작할 수 있습니다. 이 플러그 인 메커니즘에 대한 자세한 내용은 ICcgDomainAuthCredentials 인터페이스참조하세요.

메모

Azure Stack HCI의 Azure Kubernetes Service에서 플러그 인을 사용하여 ccg.exe AD로 통신한 다음 gMSA 자격 증명을 검색할 수 있습니다. 자세한 내용은 azure Stack HCI AKS를 사용하여 그룹 관리 서비스 계정 구성참조하세요.

Container Credential Guard 프로세스의 단계를 수행하려면 아래 다이어그램을 참조하세요.

  1. CredSpec 파일을 입력으로 사용하여 노드 호스트에서 ccg.exe 프로세스가 시작됩니다.

  2. ccg.exe CredSpec 파일의 정보를 사용하여 플러그 인을 시작하고 플러그 인과 연결된 비밀 저장소에서 계정 자격 증명을 검색합니다.

  3. ccg.exe 검색된 계정 자격 증명을 사용하여 AD에서 gMSA 암호를 검색합니다.

  4. ccg.exe 자격 증명을 요청한 컨테이너에서 gMSA 암호를 사용할 수 있도록 합니다.

  5. 컨테이너는 gMSA 암호를 사용하여 도메인 컨트롤러에 인증하여 Kerberos Ticket-Granting Ticket(TGT)을 가져옵니다.

  6. 컨테이너에서 네트워크 서비스 또는 로컬 시스템으로 실행되는 애플리케이션은 이제 gMSA와 같은 도메인 리소스를 인증하고 액세스할 수 있습니다.

    ccg.exe 프로세스 다이어그램

필수 구성 요소

그룹 관리 서비스 계정으로 Windows 컨테이너를 실행하려면 다음이 필요합니다.

  • Windows Server 2012 이상을 실행하는 도메인 컨트롤러가 하나 이상 있는 Active Directory 도메인입니다. gMSA를 사용하기 위한 포리스트 또는 도메인 기능 수준 요구 사항은 없지만 gMSA 암호는 Windows Server 2012 이상을 실행하는 도메인 컨트롤러에서만 배포할 수 있습니다. 자세한 내용은 gMSA 대한Active Directory 요구 사항을 참조하세요.
  • gMSA 계정을 만들 수 있는 권한입니다. gMSA 계정을 만들려면 도메인 관리자이거나 msDS-GroupManagedServiceAccount 개체 생성 권한()이 위임된 계정()을 사용해야 합니다.
  • 인터넷에 액세스하여 CredentialSpec PowerShell 모듈을 다운로드합니다. 연결이 끊긴 환경에서 작업하는 경우 인터넷에 액세스할 수 있는 컴퓨터에 모듈 저장하고 개발 컴퓨터 또는 컨테이너 호스트에 복사할 있습니다.

Active Directory 준비 작업 한 번 수행

도메인에서 gMSA를 아직 만들지 않은 경우 KDS(키 배포 서비스) 루트 키를 생성해야 합니다. KDS는 gMSA 암호를 만들고, 변경하며, 권한 있는 호스트에 배포하는 작업을 담당합니다. 컨테이너 호스트가 gMSA를 사용하여 컨테이너를 실행해야 하는 경우 KDS에 연결하여 현재 암호를 검색합니다.

KDS 루트 키가 이미 만들어졌는지 확인하려면 AD PowerShell 도구가 설치된 도메인 컨트롤러 또는 도메인 멤버에서 도메인 관리자로 다음 PowerShell cmdlet을 실행합니다.

Get-KdsRootKey

명령이 키 ID를 반환하면 모든 준비가 완료된 것이므로 그룹 관리 서비스 계정을 만들기 위한 섹션으로 건너뛸 수 있습니다. 그렇지 않은 경우 KDS 루트 키를 계속 만듭니다.

중요하다

포리스트당 하나의 KDS 루트 키만 만들어야 합니다. 여러 KDS 루트 키를 만들면 gMSA 암호가 회전된 후 gMSA가 점차적으로 실패하기 시작할 수 있습니다.

여러 도메인 컨트롤러가 있는 프로덕션 환경 또는 테스트 환경에서 PowerShell에서 다음 cmdlet을 도메인 관리자로 실행하여 KDS 루트 키를 만듭니다.

# For production environments
Add-KdsRootKey -EffectiveImmediately

이 명령은 키가 즉시 적용됨을 의미하지만 KDS 루트 키가 복제되고 모든 도메인 컨트롤러에서 사용할 수 있게 되기까지 10시간을 기다려야 합니다.

도메인에 도메인 컨트롤러가 하나만 있는 경우 10시간 전에 키를 적용하도록 설정하여 프로세스를 신속하게 처리할 수 있습니다.

중요하다

프로덕션 환경에서는 이 기술을 사용하지 마세요.

# For single-DC test environments only
Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10)

그룹 관리 서비스 계정 만들기

Windows 통합 인증을 사용하는 모든 컨테이너에는 하나 이상의 gMSA가 필요합니다. 기본 gMSA는 시스템 또는 네트워크 서비스로 실행되는 앱이 네트워크의 리소스에 액세스할 때마다 사용됩니다. gMSA의 이름은 컨테이너에 할당된 호스트 이름에 관계없이 네트워크에서 컨테이너의 이름이 됩니다. 컨테이너 컴퓨터 계정과 다른 ID로 컨테이너에서 서비스 또는 애플리케이션을 실행하려는 경우 추가 gMSA를 사용하여 컨테이너를 구성할 수도 있습니다.

gMSA를 만들 때 여러 컴퓨터에서 동시에 사용할 수 있는 공유 ID도 만듭니다. gMSA 암호에 대한 액세스는 Active Directory 액세스 제어 목록에 의해 보호됩니다. 각 gMSA 계정에 대한 보안 그룹을 만들고 보안 그룹에 관련 컨테이너 호스트를 추가하여 암호에 대한 액세스를 제한하는 것이 좋습니다.

마지막으로 컨테이너는 SPN(서비스 사용자 이름)을 자동으로 등록하지 않으므로 gMSA 계정에 대한 호스트 SPN을 수동으로 만들어야 합니다.

일반적으로 호스트 또는 http SPN은 gMSA 계정과 동일한 이름을 사용하여 등록되지만 클라이언트가 부하 분산 장치 뒤에서 컨테이너화된 애플리케이션에 액세스하거나 gMSA 이름과 다른 DNS 이름에 액세스하는 경우 다른 서비스 이름을 사용해야 할 수 있습니다.

예를 들어 gMSA 계정의 이름이 "WebApp01"이지만 사용자가 mysite.contoso.com사이트에 액세스하는 경우 gMSA 계정에 http/mysite.contoso.com SPN을 등록해야 합니다.

일부 애플리케이션에는 고유한 프로토콜에 대한 추가 SPN이 필요할 수 있습니다. 예를 들어 SQL Server에는 MSSQLSvc/hostname SPN이 필요합니다.

다음 표에서는 gMSA를 만드는 데 필요한 특성을 나열합니다.

gMSA 속성 필수 값 본보기
이름 유효한 계정 이름이면 됩니다. WebApp01
DNS 호스트 이름 계정 이름에 추가된 도메인 이름입니다. WebApp01.contoso.com
서비스 프린스플 이름 적어도 호스트 SPN을 설정하고 필요에 따라 다른 프로토콜을 추가합니다. 'host/WebApp01', 'host/WebApp01.contoso.com'
관리 비밀번호를 검색할 수 있는 주체들 컨테이너 호스트를 포함하는 보안 그룹입니다. WebApp01Hosts

gMSA의 이름을 결정했으면 PowerShell에서 다음 cmdlet을 실행하여 보안 그룹 및 gMSA를 만듭니다.

Domain Admins 보안 그룹에 속하거나 msDS-GroupManagedServiceAccount 개체 생성 권한이 위임된 계정을 사용해서 다음 명령을 실행할 수 있습니다. New-ADServiceAccount cmdlet은 원격 서버 관리 도구AD PowerShell 도구의 일부입니다.

개발, 테스트 및 프로덕션 환경에 대해 별도의 gMSA 계정을 만드는 것이 좋습니다.

도메인에 가입된 컨테이너 호스트에 대한 gMSA 계정을 만드는 사용 사례

# Replace 'WebApp01' and 'contoso.com' with your own gMSA and domain names, respectively.

# To install the AD module on Windows Server, run Install-WindowsFeature RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see https://aka.ms/rsat

# Create the security group
New-ADGroup -Name "WebApp01 Authorized Hosts" -SamAccountName "WebApp01Hosts" -GroupScope DomainLocal

# Create the gMSA
New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.contoso.com" -ServicePrincipalNames "host/WebApp01", "host/WebApp01.contoso.com" -PrincipalsAllowedToRetrieveManagedPassword "WebApp01Hosts"

# Add your container hosts to the security group
Add-ADGroupMember -Identity "WebApp01Hosts" -Members "ContainerHost01$", "ContainerHost02$", "ContainerHost03$"

도메인에 가입되지 않은 컨테이너 호스트에 대한 gMSA 계정을 만드는 데 사용 사례

도메인에 가입되지 않은 호스트가 있는 컨테이너에 gMSA를 사용하는 경우 WebApp01Hosts 보안 그룹에 컨테이너 호스트를 추가하는 대신 표준 사용자 계정을 만들고 추가합니다.

# Replace 'WebApp01' and 'contoso.com' with your own gMSA and domain names, respectively.

# To install the AD module on Windows Server, run Install-WindowsFeature RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see https://aka.ms/rsat

# Create the security group
New-ADGroup -Name "WebApp01 Authorized Accounts" -SamAccountName "WebApp01Accounts" -GroupScope DomainLocal

# Create the gMSA
New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.contoso.com" -ServicePrincipalNames "host/WebApp01", "host/WebApp01.contoso.com" -PrincipalsAllowedToRetrieveManagedPassword "WebApp01Accounts"

# Create the standard user account. This account information needs to be stored in a secret store and will be retrieved by the ccg.exe hosted plug-in to retrieve the gMSA password. Replace 'StandardUser01' and 'p@ssw0rd' with a unique username and password. We recommend using a random, long, machine-generated password.
New-ADUser -Name "StandardUser01" -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled 1

# Add your container hosts to the security group
Add-ADGroupMember -Identity "WebApp01Accounts" -Members "StandardUser01"

컨테이너 호스트 준비

도메인에 가입된 컨테이너 호스트에 대한 컨테이너 호스트를 준비하기 위한 사용 사례

gMSA를 사용하여 Windows 컨테이너를 실행하는 각 컨테이너 호스트는 도메인에 가입되어 있어야 하며 gMSA 암호를 검색할 수 있는 액세스 권한이 있어야 합니다.

  1. 컴퓨터를 Active Directory 도메인에 가입합니다.

  2. 호스트가 gMSA 암호에 대한 액세스를 제어하는 보안 그룹에 속하는지 확인합니다.

  3. 컴퓨터를 다시 시작하여 새 그룹 멤버 자격을 가져옵니다.

  4. Docker Desktop을 Windows 10 또는 Windows Server용 Docker에 설정합니다.

  5. (권장) Test-ADServiceAccount실행하여 호스트가 gMSA 계정을 사용할 수 있는지 확인합니다. 명령이 False반환하는 경우 문제 해결 지침을따릅니다.

    # To install the AD module on Windows Server, run Install-WindowsFeature RSAT-AD-PowerShell
    # To install the AD module on Windows 10 version 1809 or later, run Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
    # To install the AD module on older versions of Windows 10, see https://aka.ms/rsat
    
    Test-ADServiceAccount WebApp01
    

도메인에 가입되지 않은 컨테이너 호스트에 대한 컨테이너 호스트를 준비하기 위한 사용 사례

도메인에 가입되지 않은 컨테이너 호스트에서 Windows 컨테이너용 gMSA를 사용하는 경우 각 컨테이너 호스트에는 이전 단계에서 지정한 이식 가능한 사용자 계정 및 자격 증명을 검색하는 데 사용할 ccg.exe 대한 플러그 인이 설치되어 있어야 합니다. 플러그 인은 이식 가능한 사용자 계정 자격 증명을 보호하는 데 사용되는 비밀 저장소에 고유합니다. 예를 들어 계정 자격 증명을 Azure Key Vault와 Kubernetes 비밀 저장소에 저장하려면 다른 플러그 인이 필요합니다.

Windows는 현재 기본 제공 기본 플러그 인을 제공하지 않습니다. 플러그 인에 대한 설치 지침은 구현에 따라 다릅니다. ccg.exe플러그 인을 만들고 등록하는 방법에 대한 자세한 내용은 ICcgDomainAuthCredentials 인터페이스참조하세요.

자격 증명 사양 만들기

자격 증명 사양 파일은 컨테이너에서 사용할 gMSA 계정에 대한 메타데이터를 포함하는 JSON 문서입니다. ID 구성을 컨테이너 이미지와 별도로 유지하면 단순히 자격 증명 사양 파일을 교환하여 컨테이너에서 사용하는 gMSA를 변경할 수 있으며 코드 변경이 필요하지 않습니다.

자격 증명 사양 파일은 도메인에 가입된 컴퓨터에서 CredentialSpec PowerShell 모듈 사용하여 생성됩니다. 파일을 만든 후에는 다른 컨테이너 호스트 또는 컨테이너 오케스트레이터에 복사할 수 있습니다. 컨테이너 호스트가 컨테이너를 대신하여 gMSA를 검색하므로 자격 증명 사양 파일에는 gMSA 암호와 같은 비밀이 포함되지 않습니다.

Docker는 Docker 데이터 디렉터리의 CredentialSpecs 디렉터리에서 자격 증명 사양 파일을 찾을 것으로 예상합니다. 기본 설치에서는 C:\ProgramData\Docker\CredentialSpecs이 폴더를 찾을 수 있습니다.

컨테이너 호스트에서 자격 증명 사양 파일을 만들려면 다음을 수행합니다.

  1. RSAT AD PowerShell 도구 설치

    • Windows Server의 경우 RSAT-AD-PowerShell Install-WindowsFeature 실행합니다.
    • Windows 10 버전 1809 이상에서는 'Rsat.ActiveDirectory.DS-LDS.Tools~~~0.0.1.0' Add-WindowsCapability -Online -Name 실행합니다.
    • 이전 버전의 Windows 10은 https://aka.ms/rsat참조하세요.
  2. 다음 cmdlet을 실행하여 최신 버전의 CredentialSpec PowerShell 모듈설치합니다.

    Install-Module CredentialSpec
    

    컨테이너 호스트에서 인터넷에 액세스할 수 없는 경우 인터넷에 연결된 컴퓨터에서 Save-Module CredentialSpec 실행하고 모듈 폴더를 C:\Program Files\WindowsPowerShell\Modules 또는 컨테이너 호스트의 $env:PSModulePath 다른 위치에 복사합니다.

  3. 다음 cmdlet을 실행하여 새 자격 증명 사양 파일을 만듭니다.

    # Replace 'WebApp01' with your own gMSA
    New-CredentialSpec -AccountName WebApp01
    

    기본적으로 cmdlet은 제공된 gMSA 이름을 컨테이너의 컴퓨터 계정으로 사용하여 자격 증명 사양을 만듭니다. 파일 이름은 gMSA 도메인 및 계정 이름을 사용하여 Docker CredentialSpecs 디렉터리에 저장됩니다.

    파일을 다른 디렉터리에 저장하려면 -Path 매개 변수를 사용합니다.

    New-CredentialSpec -AccountName WebApp01 -Path "C:\MyFolder\WebApp01_CredSpec.json"
    

    컨테이너에서 서비스 또는 프로세스를 보조 gMSA로 실행하는 경우 추가 gMSA 계정을 포함하는 자격 증명 사양을 만들 수도 있습니다. 이렇게 하려면 -AdditionalAccounts 매개 변수를 사용합니다.

    New-CredentialSpec -AccountName WebApp01 -AdditionalAccounts LogAgentSvc, OtherSvc
    

    지원되는 매개 변수의 전체 목록을 보려면 Get-Help New-CredentialSpec -Full실행합니다.

  4. 다음 cmdlet을 사용하여 모든 자격 증명 사양 및 전체 경로 목록을 표시할 수 있습니다.

    Get-CredentialSpec
    

자격 증명 사양의 예는 다음과 같습니다.

{
    "CmsPlugins": [
        "ActiveDirectory"
    ],
    "DomainJoinConfig": {
        "Sid": "S-1-5-21-702590844-1001920913-2680819671",
        "MachineAccountName": "webapp01",
        "Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
        "DnsTreeName": "contoso.com",
        "DnsName": "contoso.com",
        "NetBiosName": "CONTOSO"
    },
    "ActiveDirectoryConfig": {
        "GroupManagedServiceAccounts": [
            {
                "Name": "webapp01",
                "Scope": "contoso.com"
            },
            {
                "Name": "webapp01",
                "Scope": "CONTOSO"
            }
        ]
    }
}

도메인에 가입되지 않은 컨테이너 호스트 사용 사례에 대한 추가 자격 증명 사양 구성

도메인에 가입되지 않은 컨테이너 호스트에서 gMSA를 사용하는 경우 사용할 ccg.exe 플러그 인에 대한 정보를 자격 증명 사양에 추가해야 합니다. 이는 HostAccountConfig자격 증명 사양의 섹션에 추가됩니다. HostAccountConfig 섹션에는 채워야 하는 세 개의 필드가 있습니다.

  • PortableCcgVersion: "1"로 설정해야 합니다.
  • PluginGUID: ccg.exe 플러그 인에 대한 COM CLSID입니다. 이는 사용 중인 플러그 인에 고유합니다.
  • PluginInput: 비밀 저장소에서 사용자 계정 정보를 검색하기 위한 플러그 인 특정 입력입니다.

다음은 HostAccountConfig 섹션이 추가된 자격 증명 사양의 예입니다.

{
    "CmsPlugins": [
        "ActiveDirectory"
    ],
    "DomainJoinConfig": {
        "Sid": "S-1-5-21-702590844-1001920913-2680819671",
        "MachineAccountName": "webapp01",
        "Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
        "DnsTreeName": "contoso.com",
        "DnsName": "contoso.com",
        "NetBiosName": "CONTOSO"
    },
    "ActiveDirectoryConfig": {
        "GroupManagedServiceAccounts": [
            {
                "Name": "webapp01",
                "Scope": "contoso.com"
            },
            {
                "Name": "webapp01",
                "Scope": "CONTOSO"
            }
        ],
        "HostAccountConfig": {
            "PortableCcgVersion": "1",
            "PluginGUID": "{GDMA0342-266A-4D1P-831J-20990E82944F}",
            "PluginInput": "contoso.com:gmsaccg:<password>"
        }
    }
}

다음 단계

이제 gMSA 계정을 설정했으므로 다음을 수행할 수 있습니다.

설치하는 동안 문제가 발생하는 경우 문제 해결 가이드 가능한 솔루션을 확인하세요.

추가 리소스