윈도우 파워셀(PowerShell) 스크립트의 실행 권한을 확인하는 Get-ExecutionPolicy Cmdlet과, 실행 권한을 변경하는 Set-ExecutionPolicy Cmdlet 의 사용 방법에 대해 설명한다.
나름대로 열심히 삽질해 가면서 파워셀 스크립트를 만들었거나, 어디에서인가 굉장한 스크립트 파일을 구했다 치자. 이제 더 이상의 반복작업과 노가다는 없다! 라 외치며, 작성한 스크립트를 실행하려고 하면 실행 되지 않고 이런 에러를 내 뱉을 때가 있다.
& : 이 시스템에서 스크립트를 실행할 수 없으므로 x:\xxxxxxx\xx xxxx.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오. 위치 줄:1 문자:3 + & '.\xx xxxx.ps1' + ~~~~~~~~~~~~~~ + CategoryInfo : 보안 오류: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
한마디로, '니가 뭔데 이걸 돌려? 택도 없는 소리 하지 마!' 되겠다. 이 버르장머리 없는 컴퓨터놈이 주인 얼굴도 못 알아보고 일 못한다고 뻐팅기고 있는 거다. 어떻게 해야 이놈의 버르장버리를 고쳐 놓을 수 있을까?
Get-ExecutionPolicy 파워셀 스크립트의 실행권한 확인
파워셀은 윈도우 시스템에 대한 직접적인 설정 변경이 가능한 도구이다. 허가받지 않은 사용자가 다른 마음을 품고 스크립트를 실행하거나, 뭐가 들어있는지 잘 모르는 스크립트 파일을 별 생각 없이 실행 했다가는, 무슨 엄한 일이 생길 지 모른다. 때문에 파워셀은 기본적으로 스크립트의 실행 권한을 제한 해 두며, 스크립트를 실행하기 위해서는 별도의 권한이 필요하다. 먼저, 현재의 권한이 어떻게 설정 되어 있는가 Get-ExecutionPolicy 명령을 이용해 확인해 본다.
PS C:\TMPDIR> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine Undefined PS C:\TMPDIR>
실행 범위(Scope)에 대해 현재 설정된 실행 정책(ExecutionPolicy) 의 현황을 볼 수 있다. 이 중, Scope 항목이 의미하는 것은
Scope | 범위 | 설정값 저장 위치 |
MachinePolicy | 컴퓨터의 모든 사용자 | HKLM:\Software\Policies\Microsoft\Windows\Powershell |
UserPolicy | 현재 사용자 | HKCU:\Software\Policies\Microsoft\Windows\Powershell |
Process | 현재 열려있는 파워셀 세션 | |
LocalMachine | 컴퓨터의 모든 사용자 | HKLM:\Software\Microsoft\Powershell\1\ShellIds |
CurrentUser | 현재 사용자 | HKCU:\Software\Microsoft\Powershell\1\ShellIds |
그리고 각각의 범위별로 현재 적용되고 있는 정책이 표시되고 있는데, 각 정책에 표시되는 정책명들은 다음과 같은 의미를 가진다.
정책 | 의미 |
AllSigned | 서명이 있는 스크립트만 실행할 수 있음. | Bypass | 차단되지 않음. | Default | 기본 구성된 정책 (서버OS는 RemoteSigned, 일반OS는 Restricted) | RemoteSigned | 로컬 컴퓨터에서 에서 작성된 스크립트는 실행 가능, 외부에서 가져온 스크립트는 서명된 것만 가능 | Restricted | 허용하지 않음. | Undefined | 정의되지 않음. (이 경우 Default를 따름) | Unrestricted | 모든 스크립트(서명되지 않은 스크립트 포함)를 실행 가능 |
즉, 위의 예에서 모든 범위에 대해 Undefined 상태인 것은, 모든 범위에 대해서 권한이 정의되지 않았다는 의미다. 권한 정의가 되어있지 않다는 것은, 사용자가 직접 작성했거나 외부에서 가지고 온 서명 없는 스크립트는 실행할 수 있는 권한이 없다는 의미이다.
Set-ExecutionPolicy : 파워셀 스크립트의 실행권한 설정
실행 권한이 없는 것을 확인 했으니, 이제는 권한을 부여해 주어야 한다. 실행 권한을 설정하는 Cmdlet은 Set-ExecutionPolicy 이다. 아래와 같이 입력해 보자.
PS C:\TMPDIR> Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
현재 사용자 (CurrentUser)에 대해서 제한 없이 스크립트 실행을 허용(Unrestricted) 하도록 하겠다는 명령이다. 상황에 따라 위의 권한과 정책을 변경해 사용해 주면 되겠다.
실행하면 아래와 같이 실제로 적용 하겠는가 물어보는 메세지가 뜬다. y를 입력해 주면 해당 정책이 적용 된다.
실행 규칙 변경 실행 정책은 신뢰하지 않는 스크립트로부터 사용자를 보호합니다. 실행 정책을 변경하면 about_Execution_Policies 도움말항목(https://go.microsoft.com/fwlink/?LinkID=135170)에 설명된 보안 위험에 노출될 수 있습니다. 실행 정책을 변경하시겠습니까? [Y] 예(Y) [A] 모두 예(A) [N] 아니요(N) [L] 모두 아니요(L) [S] 일시 중단(S) [?] 도움말 (기본값은 "N"): y PS C:\TMPDIR>
이렇게 하면, 현재 로그인 되어 있는 사용자에게 모든 종류의 스크립트를 실행할 수 있는 권한이 부여 되게 된다. 이제 컴퓨터의 버르장머리를 고쳐 놨으니, 스크립트를 마음껏 사용해 열심히 일하도록 시켜보자.
끝으로
파워셀 스크립트는 윈도우 시스템의 모든 설정과 정책을 조정할 수 있는 막강한 기능을 가지고 있다. 때문에 파워셀 스크립트의 허용 권한을 아무렇게나 풀어놓았다간 뭔 일을 어떻게 당할 지 모른다. 보안의 기본은 '필요한 것 만 허용'이다. 귀찮더라도 바른 정책을 수립해서 사용하고, 꼭 필요할 경우 사용을 한 후 다시 권한을 막아 두는게 정신건강에 여러모로 좋을 듯 하다.