MS14-025: 그룹 정책 기본 설정의 취약성으로 인해 권한 상승이 허용됩니다. 2014년 5월 13일

적용 대상
Windows RT 8.1 Windows 8.1 Windows 8.1 Enterprise Windows 8.1 Pro Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows Server 2012 R2 Standard Windows 8 Windows 8 Enterprise Windows 8 Pro Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2012 Standard Windows Server 2012 Standard Windows 7 Service Pack 1 Windows 7 Enterprise Windows 7 Professional Windows 7 Ultimate Windows 7 Home Premium Windows 7 Home Basic Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Standard Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Datacenter Windows Server 2008 Service Pack 2 Windows Server 2008 for Itanium-Based Systems Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 Web Edition Windows Vista Service Pack 2 Windows Vista Business Windows Vista Enterprise Windows Vista Home Basic Windows Vista Home Premium Windows Vista Starter Windows Vista Ultimate Windows Vista Enterprise 64-bit Edition Windows Vista Home Basic 64-bit Edition Windows Vista Home Premium 64-bit Edition Windows Vista Ultimate 64-bit Edition Windows Vista Business 64-bit Edition

소개

Microsoft는 보안 공지 MS14-025를 릴리스했습니다. 이 보안 게시판에 대해 자세히 알아보려면 다음을 수행합니다.

이 보안 업데이트에 대한 도움과 지원을 받는 방법

업데이트 설치 지원:
Microsoft Update 지원

IT 전문가용보안솔루션:
TechNet 보안문제해결및지원

바이러스 및 맬웨어로부터 Windows 기반 컴퓨터 Windows를 보호하는 데 도움이 됩니다.
바이러스 솔루션 및 보안 센터

지역별 지원 정보:
국가별 지원

추가 정보

알려진 문제 및 이 보안 업데이트에 대한 자세한 정보

다음 문서에는 개별 제품 버전과 관련된 이 보안 업데이트에 대한 자세한 정보가 포함되어 있습니다. 문서에는 알려진 문제 정보가 포함될 수 있습니다. 이 경우 알려진 문제가 각 문서 링크 아래에 나열됩니다.

  • 2928120

    MS14-025: 업데이트 2919355 설치된 시스템의 Windows 원격 서버 관리 도구 보안 업데이트에 대한 설명: 2014년 5월 13일

  • 2961899

    MS14-025: 업데이트 2919355 설치되지 않은 시스템의 Windows 원격 서버 관리 도구 보안 업데이트 설명: 2014년 5월 13일

그룹 정책 기본 설정

개요

일부 그룹 정책 기본 설정은 암호를 저장할 수 있습니다. 암호가 안전하지 않게 저장되었기 때문에 이 기능이 제거되고 있습니다. 이 문서에서는 사용자 인터페이스 변경 내용 및 사용 가능한 해결 방법을 설명합니다.

다음 그룹 정책 기본 설정은 더 이상 사용자 이름 및 암호를 저장할 수 없습니다.

  • 드라이브 맵
  • 로컬 사용자 및 그룹
  • 예약된 작업
  • 서비스
  • 데이터 원본

이 동작은 이러한 기본 설정에 포함된 암호를 사용하는 사용자 환경의 기존 그룹 정책 개체(GPO)의 동작에 영향을 줍니다. 또한 이 기능을 사용하여 새 그룹 정책 기본 설정을 만들지 못하게 됩니다.

드라이브 맵, 로컬 사용자 및 그룹 및 서비스의 경우 Windows에서 더 안전한 다른 기능을 통해 비슷한 목표를 달성할 수 있습니다.

예약된 작업 및 데이터 원본의 경우 그룹 정책 기본 설정 암호의 안전하지 않은 기능을 통해 사용할 수 있었던 것과 동일한 목표를 달성할 수 없습니다.

시나리오

다음 그룹 정책 기본 설정은 이 변경의 영향을 받습니다. 각 기본 설정은 간략하게 그리고 더 자세히 설명합니다. 또한 동일한 작업을 수행할 수 있는 해결 방법이 제공됩니다.

영향을 받는 기본 설정 사용자에게 적용됩니다.
컴퓨터에 적용
로컬 사용자 관리
매핑된 드라이브 아니요
서비스 아니요
예약된 작업(상위 수준)
예약된 작업(하위 수준)
즉각적인 작업(상위 수준)
즉각적인 작업(하위 수준)
데이터 원본

변경 요약

  • 영향을 받는 모든 기본 설정의 암호 필드는 사용하지 않도록 설정됩니다. 관리자는 이러한 암호 필드를 사용하여 새 기본 설정을 만들 수 없습니다.
  • 사용자 이름 필드는 일부 기본 설정에서 사용하지 않도록 설정됩니다.
  • 암호를 포함하는 기존 기본 설정을 업데이트할 수 없습니다. 특정 기본 설정에 따라 삭제하거나 사용하지 않도록 설정할 수 있습니다.
  • 기본 설정에 대해 삭제 및 사용 안 함 작업에 대한 동작이 변경되지 않았습니다.
  • 관리자가 CPassword 특성이 포함된 기본 설정을 열면 관리자가 다음 경고 대화 상자를 수신하여 최근 사용 중단을 알릴 수 있습니다. CPassword 특성이 필요한 새 또는 기존 기본 설정에 대한 변경 내용을 저장하려고 하면 동일한 대화 상자가 트리거됩니다. 삭제 및 사용 안 함 작업만 경고 대화 상자를 트리거하지 않습니다.

             a0a4e39c-aa0a-936b-e086-593dfb035a8e
            
            
            
          

시나리오 1: 로컬 사용자 관리

로컬 사용자 관리 기본 설정은 컴퓨터에 알려진 암호가 있는 로컬 관리자를 만드는 데 자주 사용됩니다. 이 기능은 그룹 정책 기본 설정에서 암호를 저장하는 방식 때문에 안전하지 않습니다. 따라서 이 기능은 더 이상 사용할 수 없습니다. 다음 기본 설정이 영향을 받습니다.

  • 컴퓨터 구성 -> 제어판 설정 -> 로컬 사용자 및 그룹 -> 신규-> 로컬 사용자
  • 사용자 구성 -> 제어판 설정 -> 로컬 사용자 및 그룹 -> 신규-> 로컬 사용자

중요한 변경 내용

작업: 만들기 또는 바꾸기

  • 사용자 이름, 암호암호 확인 필드를 사용할 수 없습니다.
  • 경고 대화 상자는 관리자가 열리거나 암호를 포함하는 기존 기본 설정에 대한 변경 내용을 저장하려고 할 때 나타납니다.

                
                 41da12b9-527c-80ac-986c-82de889869ab
                
작업: 업데이트

  • 암호암호 확인 필드를 사용할 수 없습니다.
  • 경고 대화 상자는 관리자가 열리거나 암호를 포함하는 기존 기본 설정에 대한 변경 내용을 저장하려고 할 때 나타납니다.

                
                 183f7c58-79e3-db1b-72e9-3144fcefc0e4
                
작업: 삭제

  • 동작이 변경되지 않음

해결 방법

이전에 로컬 관리자 암호를 설정하기 위한 그룹 정책 기본 설정에 의존했던 경우 CPassword에 대한 보안 대안으로 다음 스크립트가 제공됩니다. 내용을 복사하여 새 Windows PowerShell 파일에 저장한 다음, 에 표시된 대로 스크립트를 실행합니다. 예제 섹션입니다.

Microsoft는 명시적이거나 묵시적인 보증 없이 설명용으로만 프로그래밍 예제를 제공합니다. 여기에는 상품성 또는 특정 목적에의 적합성에 대한 묵시적 보증이 포함되지만 이에 국한되지 않습니다. 이 문서에서는 설명 중인 프로그래밍 언어와 프로시저를 만들고 디버깅하는 데 사용되는 도구에 대해 잘 알고 있다고 가정합니다. Microsoft 지원 엔지니어는 특정 절차의 기능을 설명하는 데 도움을 줄 수 있습니다. 그러나 추가 기능을 제공하거나 특정 요구 사항을 충족하는 절차를 구성하기 위해 이러한 예제를 수정하지는 않습니다.

함수 Invoke-PasswordRoll
{
<#
. 시놉시스

이 스크립트는 원격 머신의 로컬 계정 암호를 임의 암호로 설정하는 데 사용할 수 있습니다. 사용자 이름/암호/서버 조합은 CSV 파일에 저장됩니다.
CSV 파일에 저장된 계정 암호는 지우기 텍스트 계정 암호가 디스크에 기록되지 않도록 선택하는 관리자의 암호를 사용하여 암호화할 수 있습니다.
암호화된 암호는 이 파일의 다른 함수를 사용하여 암호 해독할 수 있습니다ConvertTo-CleartextPassword

함수: Invoke-PasswordRoll
작성자: Microsoft
버전: 1.0

. 설명

이 스크립트는 원격 머신의 로컬 계정 암호를 임의 암호로 설정하는 데 사용할 수 있습니다. 사용자 이름/암호/서버 조합은 CSV 파일에 저장됩니다.
CSV 파일에 저장된 계정 암호는 지우기 텍스트 계정 암호가 디스크에 기록되지 않도록 선택하는 관리자의 암호를 사용하여 암호화할 수 있습니다.
암호화된 암호는 이 파일의 다른 함수를 사용하여 암호 해독할 수 있습니다ConvertTo-CleartextPassword

. PARAMETER ComputerName

PowerShell 원격을 사용하여 스크립트를 실행할 컴퓨터의 배열입니다.

. PARAMETER LocalAccounts

암호를 변경해야 하는 로컬 계정의 배열입니다.

. PARAMETER TsvFileName

사용자 이름/암호/서버 조합을 출력할 파일입니다.

. PARAMETER EncryptionKey

TSV 파일을 암호화하는 암호입니다. AES 암호화를 사용합니다. TSV 파일에 저장된 암호만 암호화되고 사용자 이름과 서버 이름은 텍스트가 지워질 것입니다.

. PARAMETER PasswordLength

로컬 계정에 대해 임의로 생성되는 암호의 길이입니다.

. PARAMETER NoEncryption

TSV 파일에 저장된 계정 암호를 암호화하지 마세요. 이렇게 하면 텍스트 지우기 암호가 디스크에 기록됩니다.

. 예제

. .\Invoke-PasswordRoll.ps1 #Loads 이 스크립트 파일의 함수
Invoke-PasswordRoll -ComputerName(Get-Content computerlist.txt) -LocalAccounts @("administrator","CustomLocalAdmin") -TsvFileName "LocalAdminCredentials.tsv" -EncryptionKey "Password1"

"computerlist.txt" 파일에 저장된 모든 컴퓨터에 연결합니다. 로컬 계정 "administrator" 및/또는 "CustomLocalAdmin"이 시스템에 있으면 해당 암호가 변경됩니다.
길이가 20(기본값)인 임의로 생성된 암호입니다. 사용자 이름/암호/서버 조합은 LocalAdminCredentials.tsv에 저장되며 계정 암호는 암호 "Password1"을 사용하여 암호화된 AES입니다.

. 예제

. .\Invoke-PasswordRoll.ps1 #Loads 이 스크립트 파일의 함수
Invoke-PasswordRoll -ComputerName(Get-Content computerlist.txt) -LocalAccounts @("administrator") -TsvFileName "LocalAdminCredentials.tsv" -NoEncryption -PasswordLength 40

"computerlist.txt" 파일에 저장된 모든 컴퓨터에 연결합니다. 로컬 계정 "관리자"가 시스템에 있는 경우 해당 암호는 임의의 생성됨으로 변경됩니다.
길이 40의 암호입니다. 사용자 이름/암호/서버 조합은 LocalAdminCredentials.tsv 암호화되지 않은 상태로 저장됩니다.

. 노트
요구 사항:
-PowerShellv2 이상을 설치해야 합니다.
-스크립트가 실행되는 모든 시스템에서 PowerShell 원격을 사용하도록 설정해야 합니다.

스크립트 동작:
-로컬 계정이 시스템에 있지만 LocalAccounts 매개 변수에 지정되지 않은 경우 스크립트는 화면에 경고를 작성하여 이 로컬 계정의 존재를 경고합니다. 이 경우 스크립트가 계속 실행됩니다.
-LocalAccounts 매개 변수에 로컬 계정이 지정되었지만 컴퓨터에 계정이 없으면 아무 일도 발생하지 않습니다(계정이 만들어지지 않음).
-이 파일에 포함된 ConvertTo-CleartextPassword 함수를 사용하여 TSV 파일에 암호화된 암호를 해독할 수 있습니다.
-ComputerName에 지정된 서버를 연결할 수 없는 경우 PowerShell에서 오류 메시지를 출력합니다.
-Microsoft는 회사에 모든 로컬 및 도메인 계정 암호를 정기적으로 롤하도록 권고합니다.

#>
    [CmdletBinding(DefaultParameterSetName="Encryption")]
    Param(
        [Parameter(Mandatory=$true)]
        [String[]]
        $ComputerName

        [Parameter(Mandatory=$true)]
        [String[]]
        $LocalAccounts

        [Parameter(Mandatory=$true)]
        [문자열]
        $TsvFileName

        [Parameter(ParameterSetName="Encryption", Mandatory=$true)]
        [문자열]
        $EncryptionKey

        [Parameter()]
        [ValidateRange(20,120)]
        [Int]
        $PasswordLength = 20,

        [Parameter(ParameterSetName="NoEncryption", Mandatory=$true)]
        [스위치]
        $NoEncryption
    )

    필요한 .net 클래스 #Load
    Add-Type -AssemblyName "System.Web" -ErrorAction 중지

    #This ComputerName에 지정된 모든 컴퓨터에서 실행되는 scriptblock입니다.
    $RemoteRollScript = {
        Param(
            [Parameter(Mandatory=$true, Position=1)]
            [String[]]
            $Passwords

            [Parameter(Mandatory=$true, Position=2)]
            [String[]]
            $LocalAccounts

            #This 여기에 있으므로 스크립트가 연결된 서버 이름을 기록할 수 있고 DNS 레코드가 엉망이 되는 경우도 있습니다.
            [Parameter(Mandatory=$true, Position=3)]
            [문자열]
            $TargettedServerName
        )

        $LocalUsers = Get-WmiObject Win32_UserAccount -Filter "LocalAccount=true" | Foreach {$_. Name}

        이 스크립트에서 암호를 롤업하지 않을 로컬 사용자 계정이 컴퓨터에 있는 경우 #Check
        foreach($LocalUsers $User)
        {
            if($LocalAccounts -inotcontains $User)
            {
                Write-Warning "서버: '$($TargettedServerName)'에 이 스크립트에서 암호를 변경하지 않는 로컬 계정 '$($User)'이 있습니다."
            }
        }

        이 서버에 있는 모든 로컬 계정을 #For 암호를 변경합니다.
        $PasswordIndex = 0
        foreach($LocalAccounts $LocalAdmin)
        {
            $Password = $Passwords[$PasswordIndex]

            if($LocalUsers -icontains $LocalAdmin)
            {
                없습니다
                {
                    $objUser = [ADSI]"WinNT://localhost/$($LocalAdmin), 사용자"
                    $objUser.psbase.Invoke("SetPassword", $Password)

                    $Properties = @{
                        TargettedServerName = $TargettedServerName
                        사용자 이름 = $LocalAdmin
                        암호 = $Password
                        RealServerName = $env:computername
                    }

                    $ReturnData = New-Object PSObject -Property $Properties
                    Write-Output $ReturnData
                }
                잡을
                {
                    Write-Error "server:$($TargettedServerName)에서 사용자:$($LocalAdmin)의 암호를 변경하는 동안 오류가 발생했습니다."
                }
            }

            $PasswordIndex++
        }
    }

    원격 컴퓨터가 아닌 이 스크립트를 실행하는 클라이언트에서 암호를 #Generate. System.Web.Security는 .NET 클라이언트 프로필에서 사용할 수 없습니다. 이 호출 만들기
    스크립트를 실행하는 클라이언트의 #은 1개의 컴퓨터만 전체 .NET 런타임을 설치해야 합니다(암호가 롤된 모든 시스템과 반대).
    함수 Create-RandomPassword
    {
        Param(
            [Parameter(Mandatory=$true)]
            [ValidateRange(20,120)]
            [Int]
            $PasswordLength
        )

        $Password = [System.Web.Security.Membership]::GeneratePassword($PasswordLength, $PasswordLength/4)

        #This 실패해서는 안되지만, 어쨌든 여기에 정신 검사 넣고 있습니다.
        if($Password.Length -ne $PasswordLength)
        {
            throw new Exception("GeneratePassword에서 반환된 암호는 필요한 길이와 같지 않습니다. 필수 길이: $($PasswordLength). 생성된 길이: $($Password.Length)")
        }

        return $Password
    }

    #Main 기능 - 지정된 로컬 계정의 암호를 변경하기 위해 컴퓨터에 암호 및 원격을 생성합니다.
    if ($PsCmdlet.ParameterSetName -ieq "Encryption")
    {
        없습니다
        {
            $Sha 256 = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
            $SecureStringKey = $Sha 256.ComputeHash([System.Text.UnicodeEncoding]::Unicode.GetBytes($EncryptionKey))
        }
        잡을
        {
            Write-Error "TSV 암호화 키 만들기 오류" -ErrorAction 중지
        }
    }

    foreach($ComputerName $Computer)
    {
        변경할 수 있는 각 계정에 대해 1개의 암호를 생성하는 #Need
        $Passwords = @()
        for ($i = 0; $i -lt $LocalAccounts.Length; $i++)
        {
            $Passwords += Create-RandomPassword -PasswordLength $PasswordLength
        }

        Write-Output "지정된 로컬 관리자 암호를 롤하는 서버 '$($Computer)'에 연결"
        $Result = Invoke-Command -ScriptBlock $RemoteRollScript -ArgumentList @($Passwords, $LocalAccounts, $Computer) -ComputerName $Computer
        암호화를 사용하는 #If 디스크에 쓰기 전에 사용자가 제공한 키를 사용하여 암호를 암호화합니다.
        if($Result -ne $null)
        {
            if ($PsCmdlet.ParameterSetName -ieq "NoEncryption")
            {
                $Result | Select-Object Username,Password,TargettedServerName,RealServerName | Export-Csv -Append -Path $TsvFileName -NoTypeInformation
            }
            else
            {
                반환된 $null 항목 #Filters
                $Result = $Result | Select-Object 사용자 이름, 암호, TargettedServerName, RealServerName

                foreach($Result $Record)
                {
                    $PasswordSecureString = ConvertTo-SecureString -AsPlainText -Force -String($Record.Password)
                    $Record | Add-Member -MemberType NoteProperty -Name EncryptedPassword -value(ConvertFrom-SecureString -Key $SecureStringKey -SecureString $PasswordSecureString)
                    $Record.PSObject.Properties.Remove("Password")
                    $Record | Select-Object Username,EncryptedPassword,TargettedServerName,RealServerName | Export-Csv -Append -Path $TsvFileName -NoTypeInformation
                }
            }
        }
    }
}

함수 ConvertTo-CleartextPassword
{
<#
. 시놉시스
이 함수를 사용하여 Invoke-PasswordRoll 함수에 의해 암호화된 암호를 해독할 수 있습니다.

함수: ConvertTo-CleartextPassword
작성자: Microsoft
버전: 1.0

. 설명
이 함수를 사용하여 Invoke-PasswordRoll 함수에 의해 암호화된 암호를 해독할 수 있습니다.

. PARAMETER EncryptedPassword

TSV 파일에 저장된 암호화된 암호입니다.

. PARAMETER EncryptionKey

암호화를 수행하는 데 사용되는 암호입니다.

. 예제

. .\Invoke-PasswordRoll.ps1 #Loads 이 스크립트 파일의 함수
ConvertTo-CleartextPassword -EncryptionKey "Password1" -EncryptedPassword 76492d1116743f0423413b16050a5345MgB8AGcAZgBaAHUAaQBwADAAQgB2AGgAcABNADMASwBaAFoAQQBzADEAeABjAEEAPQA9AHwAZgBiAGYAMAA1ADYANgA2ADEANwBkADQAZgAwADMANABjAGUAZQAxAGIAMABiADkANgBiADkAMAA4ADcANwBhADMAYQA3AGYAOABkADcAMQA5ADQAMWBmAGYANQBhADEAYQBjADcANABkADIANgBhADUANwBlADgAMAAyADQANGA1ADIAOQA0AGMAZQA0ADEAMwAzADcANQAyADUANAAzADYAMAA1AGEANgAzADEAMQA5ADAAYwBmADQAZAA2AGQA"

TSV 파일에 저장된 암호화된 암호를 해독합니다.

#>
    Param(
        [Parameter(Mandatory=$true)]
        [문자열]
        $EncryptedPassword

        [Parameter(Mandatory=$true)]
        [문자열]
        $EncryptionKey
    )

    $Sha 256 = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
    $SecureStringKey = $Sha 256.ComputeHash([System.Text.UnicodeEncoding]::Unicode.GetBytes($EncryptionKey))

    [SecureString]$SecureStringPassword = ConvertTo-SecureString -String $EncryptedPassword -Key $SecureStringKey
    Write-Output([System.Runtime.InteropServices.Marshal]::P trToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($SecureStringPassword))
}
   관리자는 Active Directory 그룹을 만들고 그룹 정책 기본 설정 -> 로컬 그룹을 통해 로컬 관리자 그룹에 추가하여 컴퓨터에 로컬 관리자 계정을 추가할 수 있습니다. 이 작업은 자격 증명을 캐시하지 않습니다. 대화 상자는 다음과 유사합니다. 이 해결 방법을 사용하려면 사용자가 이러한 자격 증명을 사용하여 로그온할 때 Active Directory Domain Services 연결이 필요합니다.

6d3013b5-df8c-898a-0a22-33a829d3755f

시나리오 2: 매핑된 드라이브

관리자는 드라이브 맵을 사용하여 사용자에게 네트워크 위치를 할당합니다. 암호 보호 기능은 드라이브에 대한 권한 있는 액세스를 확인하는 데 사용됩니다. 다음 기본 설정이 영향을 받습니다.

  • 사용자 구성 -> Windows 설정 -> 드라이브 맵 -> 새로 만들기 -> 매핑된 드라이브

중요한 변경 내용

작업: 만들기, 업데이트 또는 바꾸기

  • 사용자 이름, 암호암호 확인 필드를 사용할 수 없습니다.

                 78e7a904-5d9c-8655-e4b6-2d7c8dc3c3f9
                
작업: 삭제

  • 동작이 변경되지 않음

해결 방법

인증에 암호 방법을 사용하는 대신 Windows Explorer 사용하여 공유 권한을 관리하고 사용자에게 권한을 할당할 수 있습니다. Active Directory 개체를 사용하여 폴더에 대한 권한을 제어할 수 있습니다.

시나리오 3: 서비스

서비스 기본 설정을 사용하여 원래 보안 컨텍스트가 아닌 컨텍스트에서 실행되는 방식으로 서비스 속성을 변경할 수 있습니다. 다음 기본 설정이 영향을 받습니다.

  • 컴퓨터 구성 -> 제어판 설정 -> 서비스 - 새로 만들기 ->> 서비스

중요한 변경 내용

시작: 변경 없음, 자동 또는 수동

  • 암호암호 확인 필드를 사용할 수 없습니다.
  • 관리자는 기본 제공 계정만 사용할 수 있습니다.

                 bd4e263c-d8e6-e20f-b57a-9c1c5caca355
                
시작: 사용 안 함

  • 동작이 변경되지 않음

새 대화 상자

  • 이 계정에 기본 제공이 아닌 사용자를 사용하려고 하는 관리자는 다음 경고를 받습니다.

                 975f73f7-e950-ad09-d46b-b68ac9a5e4cb
                
                
              

해결 방법

                
                
서비스는 여전히 로컬 시스템 계정으로 실행할 수 있습니다. Microsoft 기술 자료의 다음 문서에 설명된 대로 서비스 권한을 변경할 수 있습니다.

256345 시스템 서비스에 대한 보안을 설정하도록 그룹 정책 설정을 구성하는 방법

참고 구성하려는 서비스가 없는 경우 서비스가 실행되는 컴퓨터에서 설정을 구성해야 합니다. 

시나리오 4: 예약 및 즉시 작업(상위 수준)

이러한 작업은 특정 보안 컨텍스트에서 예약된 작업을 실행하는 데 사용됩니다. 해당 사용자가 로그온되지 않은 경우 임의 사용자로 실행되도록 예약된 작업에 대한 자격 증명을 저장하는 기능은 더 이상 사용할 수 없습니다. 다음 기본 설정이 영향을 받습니다. (일부 플랫폼에서는 "Windows 7 이상"이 "Windows Vista 이상"으로 대체됩니다.)

  • 컴퓨터 구성 -> 제어판 설정 -> 예약된 작업 -> 새 -> 예약된 작업(Windows 7 이상)
  • 컴퓨터 구성 -> 제어판 설정 -> 예약된 작업 -> 새 작업 -> 즉각적인 작업(Windows 7 이상)
  • 사용자 구성 -> 제어판 설정 -> 예약된 작업 -> 새로 만들기 -> 예약된 작업(Windows 7 이상)
  • 사용자 구성 -> 제어판 설정 -> 예약된 작업 -> 새 작업 -> 즉각적인 작업(Windows 7 이상)

중요한 변경 내용

작업: 만들기, 업데이트 또는 바꾸기

  • 사용자가 로그온했는지 여부 실행을 선택하면 더 이상 관리자에게 자격 증명을 묻는 대화 상자가 표시되지 않습니다.
  • 암호 저장 안 함 검사 상자를 사용할 수 없습니다. 기본적으로 상자도 선택되어 있습니다.

                 60ff2409-1c24-a2aa-466d-89afaadaf0a0
                
작업: 삭제

동작이 변경되지 않음

해결 방법

"예약된 작업(Windows 7 이상)" 및 "즉각적인 작업(최소 Windows 7)" 작업의 경우 관리자는 지정된 사용자가 로그온할 때 특정 사용자 계정을 사용할 수 있습니다. 또는 해당 사용자로 로컬 리소스에만 액세스할 수 있습니다. 이러한 작업은 여전히 로컬 서비스의 컨텍스트에서 실행할 수 있습니다.

            
시나리오 5: 예약된 즉시 작업(하위 수준) 특정 보안 컨텍스트에서 예약된 작업을 실행하는 데 사용되는 기본 설정의 하위 수준 버전입니다. 해당 사용자가 로그온되지 않은 경우 임의 사용자로 실행되도록 예약된 작업에 대한 자격 증명을 저장하는 기능은 더 이상 사용할 수 없습니다. 다음 기본 설정이 영향을 받습니다.

  • 컴퓨터 구성 -> 제어판 설정 -> 예약된 작업 -> 새로 만들기 -> 예약된 작업
  • 컴퓨터 구성 -> 제어판 설정 -> 예약된 작업 - 새 작업> -> 즉시 작업(Windows XP)
  • 사용자 구성 -> 제어판 설정 -> 예약된 작업 -> 새 -> 예약된 작업
  • 사용자 구성 -> 제어판 설정 -> 예약된 작업 -> 새로 만들기 -> 즉시 작업(Windows XP)

중요한 변경 내용

작업: 만들기, 업데이트 또는 바꾸기

  • 실행 검사 상자를 사용할 수 없습니다. 따라서 사용자 이름, 암호암호 확인 필드는 모두 사용하지 않도록 설정됩니다.

                 2baacb70-2e5a-e72d-7fd6-3e358608d76c
                
작업: 삭제

 동작이 변경되지 않음

해결 방법

"예약된 작업" 및 "Windows XP(직접 작업)" 항목의 경우 예약된 작업은 로컬 서비스에서 현재 사용할 수 있는 권한을 사용하여 실행됩니다. 

시나리오 6: 데이터 원본

데이터 원본 기본 설정은 데이터 원본을 컴퓨터 또는 사용자와 연결하는 데 사용됩니다. 이 기능은 암호로 보호되는 데이터 원본에 액세스할 수 있도록 자격 증명을 더 이상 저장하지 않습니다. 다음 기본 설정이 영향을 받습니다.

  • 컴퓨터 구성 -> 제어판 설정 -> 데이터 원본
  • 사용자 구성 -> 제어판 설정 -> 데이터 원본

중요한 변경 내용

작업: 만들기, 업데이트 또는 바꾸기

  • 사용자 이름, 암호암호 확인 필드를 사용할 수 없습니다.

                 92beb16c-1b15-8903-a694-f471212d4a45
                
작업: 삭제

  • 동작이 변경되지 않음

해결 방법

사용할 수 있는 해결 방법이 없습니다. 이 기본 설정은 암호로 보호되는 데이터 원본에 대한 액세스를 허용하기 위해 자격 증명을 더 이상 저장하지 않습니다. 

CPassword 사용 중단

CPassword 제거

이 Microsoft 기술 자료 문서에 포함된 Windows PowerShell 스크립트는 도메인에 CPassword를 사용할 수 있는 그룹 정책 기본 설정이 포함되어 있는지 여부를 검색합니다. CPassword XML이 지정된 기본 설정에서 검색되면 이 목록에 표시됩니다. 

CPassword 기본 설정 검색

이 스크립트는 클린 도메인 컨트롤러의 로컬 디렉터리에서 실행해야 합니다. 내용을 복사하여 새 Windows PowerShell 파일에 저장하고, 시스템 드라이브를 확인한 다음, 다음 사용량에 표시된 대로 스크립트를 실행합니다.

  <#
. 시놉시스
도메인의 그룹 정책 개체에는 다음과 같은 다양한 작업에 대한 암호를 저장하는 기본 설정이 있을 수 있습니다.
1. 데이터 원본
2. 드라이브 맵
3. 로컬 사용자
4. 예약된 작업(XP 및 상위 수준 모두)
5. 서비스
이러한 암호는 GP 기본 설정의 일부로 SYSVOL에 저장되며 약한 암호화(32바이트 AES)로 인해 안전하지 않습니다.
따라서 도메인 환경에 이러한 기본 설정을 배포하고 이러한 기존 기본 설정을 제거하지 않는 것이 좋습니다.
선호. 이 스크립트는 관리자가 암호가 포함된 도메인의 SYSVOL에서 GP 기본 설정을 찾는 데 도움이 됩니다.

. 설명
이 스크립트는 DC 또는 RSAT와 함께 설치된 클라이언트 컴퓨터에서 실행하여 포함된 모든 기본 설정을 인쇄해야 합니다.
이 기본 설정이 정의된 GPO, 기본 설정 이름, GPEdit 경로와 같은 정보가 포함된 암호입니다.
영향을 받는 기본 설정 목록이 있으면 그룹 정책 관리 콘솔의 편집기를 사용하여 이러한 기본 설정을 제거할 수 있습니다.

. 구문
Get-SettingsWithCPassword.ps1 [-Path <String>]
. 예제
Get-SettingsWithCPassword.ps1 -Path %WinDir%\SYSVOL\domain
Get-SettingsWithCPassword.ps1 -Path <GPO Backup 폴더 경로>

. 노트
그룹 정책 PS 모듈을 찾을 수 없는 경우 출력에는 GPO 이름 대신 GPO GUID가 포함됩니다. 둘 중 하나를 실행할 수 있습니다.
도메인 컨트롤러에서 이 스크립트를 실행하거나 RSAT 및 를 설치한 후 클라이언트에서 스크립트를 다시 실행합니다.
그룹 정책 모듈을 사용하도록 설정했습니다.
또는 GET-GPO cmdlet을 사용하여 GPO GUID를 사용하여 GPO 이름을 가져올 수 있습니다.

. 링크
http://go.microsoft.com/fwlink/?LinkID=390507

#>
#----------------------------------------------------------------------------------------------------------------

입력 매개 변수

#--------------------------------------------------------------------------------------------------------------
param(
    [string]$Path = $(throw "-Path가 필요합니다.") # GPP가 있는 디렉터리 경로입니다.
 )
#---------------------------------------------------------------------------------------------------------------
$isGPModuleAvailable = $false
$impactedPrefs = { "Groups.xml", "ScheduledTasks.xml","Services.xml", "DataSources.xml", "Drives.xml" }
#----------------------------------------------------------------------------------------------------------------

사용 가능한 경우 그룹 올리기 모듈 가져오기

#----------------------------------------------------------------------------------------------------------------
if (-not(Get-Module -name "GroupPolicy"))
{
   if (Get-Module -ListAvailable |
         Where-Object { $_. Name -ieq "GroupPolicy" })
    {
        $isGPModuleAvailable = $true
        Import-Module "GroupPolicy"
    }
    else
    {
        Write-Warning "PowerShell용 그룹 정책 모듈을 가져올 수 없습니다. 따라서 GPO GUID가 보고됩니다.
                       DC에서 이 스크립트를 실행하여 GPO 이름을 가져오거나 DC의 Get-GPO cmdlet을 사용하여 GPO guid에서 GPO 이름을 가져옵니다."
    }
}
else
{
    $isGPModuleAvailable = $true
}
함수 Enum-SettingsWithCpassword( [string]$sysvolLocation )
{
    # GPMC 트리 경로
    $commonPath = " -> 기본 설정 -> 제어판 설정 -> "
    $driveMapPath = " -> 기본 설정 -> Windows 설정 -> "

    # SYVOL 위치 내의 모든 xml 파일을 재귀적으로 가져옵니다.
    $impactedXmls = Get-ChildItem $sysvolLocation -Recurse -Filter "*.xml" | Where-Object { $impactedPrefs -cmatch $_. 이름 }

    # 각 xml 파일에는 여러 기본 설정이 포함되어 있습니다. 각 기본 설정을 반복하여 검사 여부
    #은 cpassword 특성을 포함하고 표시합니다.
    foreach( $impactedXmls $file )
    {
        $fileFullPath = $file. Fullname

        # GPP 범주를 설정합니다. 파일이 SYSVOL의 Machine 폴더 아래에 있는 경우
        # 설정은 컴퓨터 구성에서 정의됩니다. 그렇지 않으면
        # 설정은 사용자 구성에 대한 입니다.
        if ( $fileFullPath.Contains("Machine") )
        {
            $category = "컴퓨터 구성"
        }
        elseif( $fileFullPath.Contains("User") )
        {
            $category = "사용자 구성"
        }
        else
        {
            $category = "알 수 없음"
        }
        # XML로 파일 콘텐츠 가져오기
        없습니다
        {
            [xml]$xmlFile = get-content $fileFullPath -ErrorAction Continue
        }
        catch [Exception]{
            Write-Host $_. Exception.Message
        }
        if($xmlFile -eq $null)
        {
            계속
        }
        switch( $file. BaseName )
        {
            그룹
            {
                $gppWithCpassword = $xmlFile.SelectNodes("Groups/User") | where-Object { [String]::IsNullOrEmpty($_. Properties.cpassword) -eq $false }
                $preferenceType = "로컬 사용자"
            }
            ScheduledTasks
            {
                $gppWithCpassword = $xmlFile.SelectNodes("ScheduledTasks/*") | where-Object { [String]::IsNullOrEmpty($_. Properties.cpassword) -eq $false }
                $preferenceType = "예약된 작업"
            }
            DataSources
            {
                $gppWithCpassword = $xmlFile.SelectNodes("DataSources/DataSource") | where-Object { [String]::IsNullOrEmpty($_. Properties.cpassword) -eq $false }
                $preferenceType = "데이터 원본"
            }
            드라이브
            {
                $gppWithCpassword = $xmlFile.SelectNodes("드라이브/드라이브") | where-Object { [String]::IsNullOrEmpty($_. Properties.cpassword) -eq $false }
                $preferenceType = "드라이브 맵"
            }
            서비스
            {
                $gppWithCpassword = $xmlFile.SelectNodes("NTServices/NTService") | where-Object { [String]::IsNullOrEmpty($_. Properties.cpassword) -eq $false }
                $preferenceType = "서비스"
            }
            기본값
            { # 지우기 gppWithCpassword 및 preferenceType 다음 항목에 대 한.
                없습니다
                {
                    Clear-Variable -Name gppWithCpassword -ErrorAction SilentlyContinue
                    Clear-Variable -Name preferenceType -ErrorAction SilentlyContinue
                }
                catch [Exception]{}
            }
        }
        if($gppWithCpassword -ne $null)
        {
            # filePath에서 추출된 GUID에서 GPO 이름 빌드
            $guidRegex = [regex]"\{(.*)\}"
            $match = $guidRegex.match($fileFullPath)
            if($match. 성공)
            {
               $gpoGuid = $match.groups[1].value
               $gpoName = $gpoGuid
            }
            else
            {
               $gpoName = "알 수 없음"
            }
            if($isGPModuleAvailable -eq $true)
            {
                없습니다
                {
                    $gpoInfo = Get-GPO -Guid $gpoGuid -ErrorAction Continue
                    $gpoName = $gpoInfo.DisplayName
                }
                catch [Exception] {
                    Write-Host $_. Exception.Message
                }
            }
            cpassword를 포함하는 # 디스플레이 프리프렌즈
            foreach( $gppWithCpassword $gpp )
            {
                if ( $preferenceType -eq "Drive Maps" )
                {
                    $prefLocation = $category + $driveMapPath + $preferenceType
                }
                else
                {
                    $prefLocation = $category + $commonPath + $preferenceType
                }
                $obj = New-Object -typeName PSObject
                $obj | Add-Member –membertype NoteProperty –name GPOName –value ($gpoName) –passthru |
                       Add-Member -MemberType NoteProperty -name Preference -value($gpp. Name) -passthru |
                       Add-Member -MemberType NoteProperty -name Path -value($prefLocation)
                Write-Output $obj
            }
        } # end if $gppWithCpassword
    } # end foreach $file
} # end 함수 Enum-PoliciesWithCpassword
#-----------------------------------------------------------------------------------

경로가 유효한지 확인합니다. cpassword를 포함하는 모든 설정을 열거합니다.

#-----------------------------------------------------------------------------------
if(Test-Path $Path )
{
    Enum-SettingsWithCpassword $Path
}
else
{
    Write-Warning "이러한 디렉터리 없음: $Path"
}

사용 예(시스템 드라이브가 C라고 가정)

.\Get-SettingsWithCPassword.ps1 –path "C:\Windows\SYSVOL\domain" | Format-List
참고 도메인 대신 경로 에 대한 백업 GPO를 대상으로 지정할 수도 있습니다.

검색 스크립트는 다음과 유사한 목록을 생성합니다.

f9c1582e-a8d3-6f33-ffdd-7c143530043d

더 긴 목록의 경우 출력을 파일에 저장하는 것이 좋습니다.

.\Get-SettingsWithCPassword.ps1 –path "C:\Windows\SYSVOL\domain" | > ConvertTo-Html gpps.html

CPassword 기본 설정 제거

CPassword 데이터가 포함된 기본 설정을 제거하려면 도메인 컨트롤러 또는 원격 서버 관리 도구가 설치된 클라이언트에서 GPMC(그룹 정책 관리 콘솔)를 사용하는 것이 좋습니다. 이러한 콘솔의 5단계에서 기본 설정을 제거할 수 있습니다. 그러려면 다음 단계를 따르세요.

  1. GPMC에서 CPassword 데이터가 포함된 기본 설정을 엽니다.
  2. 기본 설정에 해당하는 경우 작업을 삭제 또는 사용 안 함으로 변경합니다.
  3. 확인을 클릭하여 변경 내용을 저장합니다.
  4. 변경 내용이 클라이언트에 전파되도록 하나 또는 두 그룹 정책 새로 고침 주기를 기다립니다.
  5. 모든 클라이언트에 변경 내용이 적용되면 기본 설정을 삭제합니다.
  6. 필요에 따라 1~5단계를 반복하여 전체 환경을 클린. 검색 스크립트가 0개 결과를 반환하면 완료됩니다.
파일 해시 정보
파일 이름 SHA1 해시 SHA256 해시
Windows6.0-KB2928120-ia64.msu B2A74305CB56191774BFCF9FCDEAA983B26DC9A6 DCE8C0F9CEB97DBF1F7B9BAF76458B3770EF01C0EDC581621BC8C3B2C7FD14E7
Windows6.0-KB2928120-x64.msu 386457497682A2FB80BC93346D85A9C1BC38FBF7 1AF67EB12614F37F4AC327E7B5767AFA085FE676F6E81F0CED95D20393A1D38D
Windows6.0-KB2928120-x86.msu 42FF283781CEC9CE34EBF459CA1EFE011D5132C3 016D7E9DBBC5E487E397BE0147B590CFBBB5E83795B997894870EC10171E16D4
Windows6.1-KB2928120-ia64.msu 5C2196832EC94B99AAF9B074D3938525B7219690 9958FA58134F55487521243AD9740BEE0AC210AC290D45C8322E424B3E5EBF16
Windows6.1-KB2928120-x64.msu EA5332F4E289DC799611EAB8E3EE2E86B7880A4B 417A2BA34F8FD367556812197E2395ED40D8B394F9224CDCBE8AB3939795EC2A
Windows6.1-KB2928120-x86.msu 7B7B6EE24CD8BE1AB3479F9E1CF9C98982C8BAB1 603206D44815EF2DC262016ED13D6569BE13D06E2C6029FB22621027788B8095
Windows8-RT-KB2928120-x64.msu E18FC05B4CCA0E195E62FF0AE534BA39511A8593 FCAED97BF1D61F60802D397350380FADED71AED64435D3E9EAA4C0468D80141E
Windows8-RT-KB2928120-x86.msu A5DFB34F3B9EAD9FA78C67DFC7ACACFA2FBEAC0B 7F00A72D8A15EB2CA70F7146A8014E39A71CFF5E39596F379ACD883239DABD41
Windows8.1-KB2928120-x64.msu A07FF14EED24F3241D508C50E869540915134BB4 6641B1A9C95A7E4F0D5A247B9F48887AC94550B7F1D7B1198D5BCBA92F7A753
Windows8.1-KB2928120-x86.msu DE84667EC79CBA2006892452660EB99580D27306 468EE4FA3A22DDE61D85FD3A9D0583F504105DF2F8256539051BC0B1EB713E9C
Windows8.1-KB2961899-x64.msu 10BAE807DB158978BCD5D8A7862BC6B3EF20038B EC26618E23D9278FC1F02CA1F13BB289E1C6C4E0C8DA5D22E1D9CDA0DA8AFF51
Windows8.1-KB2961899-x86.msu 230C64447CC6E4AB3AD7B4D4655B8D8CEFBFBE98 E3FAD567AB6CA616E42873D3623A777185BE061232B952938A8846A974FFA7AF