Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell 스크립트 실행 정책(Execution Policy) 설정 및 구성 완벽 가이드

기본적으로 Windows는 PowerShell 스크립트 실행을 차단하도록 설정되어 있습니다. 보안 관점에서 신뢰할 수 없는 코드나 악성 코드가 PowerShell 스크립트를 통해 실행되지 않도록 제한하는 것은 매우 중요합니다. 이러한 동작을 결정하는 것이 바로 실행 정책(Execution Policy)입니다.

이 글에서는 Windows에서 PowerShell(PS) 스크립트 실행에 사용할 수 있는 다양한 실행 정책 값, 실행 정책을 변경하는 방법, 그리고 GPO(그룹 정책)를 사용해 도메인 환경의 컴퓨터에 PowerShell 스크립트 실행 정책을 배포하는 방법까지 자세히 살펴보겠습니다.

"이 시스템에서 스크립트 실행이 비활성화되어 있습니다" 오류

초기 상태의 Windows 10에서 PS1 파일과 같은 PowerShell 스크립트를 실행하려고 하면 다음과 같은 오류가 발생합니다.

File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess

현재 시스템에 적용된 PowerShell 실행 정책은 아래 명령어로 확인할 수 있습니다.

Get-ExecutionPolicy

PowerShell 실행 정책 종류

PowerShell에서 사용할 수 있는 실행 정책 값은 다음과 같습니다.

  • Restricted(제한됨) – PowerShell 스크립트 실행이 비활성화됩니다. PS 콘솔에서 대화형 명령만 실행할 수 있습니다.
  • AllSigned(모두 서명됨) – 신뢰할 수 있는 게시자가 디지털 서명한 PS 스크립트만 실행할 수 있습니다(자체 서명 인증서로 스크립트에 서명하고 신뢰할 수 있는 루트 인증서에 추가하는 방식도 가능). 신뢰할 수 없는 스크립트를 실행하면 다음과 같은 경고가 표시됩니다.
    Do you want to run software from this untrusted publisher? File .ps1 is published by CN=test1 and is not trusted on your system. Only run scripts from trusted publishers.
  • RemoteSigned(원격 서명됨) – 로컬 PowerShell 스크립트는 제한 없이 실행할 수 있으며, 원격 PS 파일은 디지털 서명이 있는 경우에만 실행할 수 있습니다. 즉, 인터넷에서 다운로드한 PS1 파일이나 UNC 경로를 통한 공유 네트워크 폴더의 스크립트는 실행할 수 없습니다.
  • Unrestricted(제한 없음) – 모든 PowerShell 스크립트 실행이 허용됩니다. 다만 타사 스크립트를 실행하려고 할 때 실행 확인 메시지가 표시될 수 있습니다.
  • Bypass(바이패스) – 모든 PS 파일 실행이 허용되며 어떤 경고도 표시되지 않습니다. 주로 GPO, SCCM, 작업 스케줄러 등을 통해 스크립트를 자동 실행할 때 사용되며, 상시 사용은 권장되지 않습니다.
  • Default(기본값) – 실행 정책을 기본값으로 초기화합니다. Windows 10의 기본값은 Restricted이고, Windows Server 2016의 기본값은 RemoteSigned입니다.
  • Undefined(정의되지 않음) – 실행 정책이 설정되지 않은 상태입니다. 이 경우 데스크톱 OS에는 Restricted가, 서버 OS에는 RemoteSigned가 적용됩니다.

실행 정책을 사용해 PowerShell 스크립트 실행 허용하기

현재 적용된 PowerShell 실행 정책 값을 변경하려면 Set-ExecutionPolicy cmdlet을 사용합니다.

예를 들어 로컬 PS 스크립트 파일의 실행을 허용하려면 다음과 같이 입력합니다.

Set-ExecutionPolicy RemoteSigned

변경 확인 메시지가 표시되면 Y(예) 또는 A(모두 예)를 눌러 실행 정책 변경을 승인합니다.

확인 프롬프트 없이 즉시 적용하려면 Force 매개변수를 함께 사용하면 됩니다.

Set-ExecutionPolicy RemoteSigned –Force

실행 정책을 Unrestricted로 설정했더라도, UNC 경로의 공유 폴더에 있는 원격 스크립트나 인터넷에서 다운로드한 파일을 실행할 때는 여전히 확인 메시지가 나타납니다.

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the
Unblock-File cmdlet to allow the script to run without this warning message.
Do you want to run?
[D] Do not run [R] Run once [S] Suspend [?] Help (default is "D")

로컬 스크립트와 원격 스크립트의 구분 기준

PowerShell은 어떻게 로컬 스크립트와 원격 스크립트를 구분할까요? 그 비밀은 브라우저가 파일을 다운로드할 때 NTFS 대체 데이터 스트림에 기록하는 ZoneId 식별자에 있습니다. 파일 속성에서 차단 해제(Unblock)를 체크하거나, Unblock-File cmdlet으로 영역 표시를 제거하면 해당 파일을 차단 해제할 수 있습니다.

실행 정책의 범위(Scope) 이해하기

PowerShell 실행 정책은 적용 범위(Scope)에 따라 다르게 설정할 수 있으며, 각 범위는 다음과 같습니다.

  • MachinePolicy – GPO를 통해 설정되며 해당 컴퓨터의 모든 사용자에게 적용됩니다.
  • UserPolicy – 역시 GPO를 통해 설정되며 컴퓨터 사용자에게 적용됩니다.
  • Process – 현재 PowerShell 세션에만 적용되며, powershell.exe 프로세스가 종료되면 초기화됩니다.
  • CurrentUser – 현재 사용자에게만 적용됩니다(HKEY_CURRENT_USER 레지스트리 키에 저장).
  • LocalMachine – 해당 컴퓨터의 모든 사용자에게 적용됩니다(HKEY_LOCAL_MACHINE 레지스트리 키에 저장).

Set-ExecutionPolicy cmdlet의 Scope 매개변수를 사용하면 특정 범위에 정책을 지정할 수 있습니다.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force

모든 범위에 대한 현재 실행 정책 설정은 다음 명령어로 확인할 수 있습니다.

Get-ExecutionPolicy -List

Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Bypass
CurrentUser Undefined
LocalMachine RemoteSigned

레지스트리에 저장되는 실행 정책

CurrentUser와 LocalMachine 범위에 대해 Set-ExecutionPolicy로 설정한 값은 레지스트리에 저장됩니다. 예를 들어 다음 명령을 실행해 보겠습니다.

Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Restricted –Force

그런 다음 레지스트리 편집기에서 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell 키를 열면 ExecutionPolicy 매개변수(REG_SZ)의 값이 Restricted로 변경된 것을 확인할 수 있습니다. 허용되는 값은 Restricted, AllSigned, RemoteSigned, Bypass, Unrestricted, Undefined입니다.

CurrentUser 범위의 설정은 HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell에 위치합니다. 즉, 그룹 정책 기본 설정(GPP)을 활용하면 레지스트리를 통해 PowerShell 실행 정책을 배포할 수도 있습니다.

참고로 기업 환경에서는 LocalMachine 수준에서 AllSigned 값을 가장 많이 사용합니다. 보안과 편의성 사이의 최적의 균형을 제공하기 때문입니다. 개인 용도로는 컴퓨터에 RemoteSigned 설정을 사용하는 것이 좋으며, Bypass 정책은 GPO나 작업 스케줄러를 통한 특정 작업 실행 시에만 한정적으로 사용하는 것이 바람직합니다.

GPO를 사용해 Active Directory 도메인에서 PowerShell 실행 정책 설정하기

Active Directory 도메인 환경에서는 그룹 정책(GPO)을 사용해 서버나 도메인 컴퓨터의 PowerShell 실행 정책을 중앙에서 구성할 수 있습니다.

  1. 도메인 GPO 편집기(gpmc.msc)에서 새 GPO를 생성하거나 기존 GPO를 편집한 후, 실행 정책을 적용할 컴퓨터가 포함된 OU에 연결합니다.
  2. GPO 편집기에서 컴퓨터 구성 → 정책 → 관리 템플릿 → Windows 구성 요소 → Windows PowerShell로 이동하여 스크립트 실행 켜기(Turn on Script Execution) 정책을 찾습니다. 사용자 구성(User Configuration) 섹션에도 동일한 정책이 있지만, 컴퓨터 정책이 더 높은 우선순위를 가집니다.
  3. 이 정책은 세 가지 값을 가질 수 있습니다.
    1. 서명된 스크립트만 허용 – AllSigned 정책에 해당
    2. 로컬 스크립트 및 원격 서명된 스크립트 허용 – RemoteSigned 정책에 해당
    3. 모든 스크립트 허용 – Unrestricted 정책에 해당
  4. 원하는 정책 값을 설정하고 GPO를 저장한 후, 클라이언트 컴퓨터에서 그룹 정책 설정을 업데이트합니다.
  5. 새 실행 정책이 MachinePolicy 범위에 적용되었는지 확인합니다.

GPO로 실행 정책을 구성한 후에는 더 이상 로컬에서 수동으로 실행 정책을 변경할 수 없습니다. GPO가 적용된 컴퓨터에서 실행 정책을 변경하려고 하면 다음과 같은 오류가 표시됩니다.

Set-ExecutionPolicy: Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope. Due to the override, your shell will retain its current effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List" to view your execution policy settings.

동일한 방법으로 독립 실행형(비도메인) 컴퓨터에서도 로컬 그룹 정책 편집기(gpedit.msc)를 사용해 실행 정책을 구성할 수 있습니다.

Windows에서 PowerShell 실행 정책 우회하는 방법

실행 정책 설정을 변경하지 않고도 PowerShell 스크립트를 실행해야 하는 경우 유용하게 쓸 수 있는 몇 가지 방법이 있습니다. 예를 들어, 관리자 권한으로 실행되었는지 확인하는 간단한 PS1 스크립트를 실행한다고 가정해 보겠습니다.

첫 번째 방법은 Get-Content로 스크립트 내용을 읽어와 PowerShell 콘솔의 표준 입력 스트림으로 전달하는 것입니다.

Get-Content c:\ps\check_process_elevation.ps1 | PowerShell.exe -noprofile –

두 번째 방법은 Bypass 정책을 지정하여 새 powershell.exe 프로세스를 실행하는 것입니다.

powershell.exe -noprofile -executionpolicy bypass -file c:\ps\check_process_elevation.ps1

이 두 가지 방법 모두 시스템 전역 실행 정책 설정을 건드리지 않으면서 일회성으로 스크립트를 실행할 수 있는 안전한 방법입니다.