1. PowerShell의 인증
PowerShell 을 사용하면서 외부의 스크립트를 실행하거나 , 로컬에서 스크립트를 실행해야 하는 경우가 발생하게 되는데 , 이때 대부분 실행정책 (Execution_Policy) 로 인하여 정상적인 실행이 되지 않는 경우가 발생 합니다 .
이 문제를 해결하기 위해서는 Execution Policy 를 RemoteSigned 로 수정하거나 , 인증서를 생성하여 인증 절차를 진행해야 하는데 , RemoteSigned 에 대한 내용은 너무 쉽고 간단하므로 , 인증서를 발급받아 처리 하는 과정에 대하여 보도록 하겠습니다 .
- RemoteSigned 설정 방법 보기 ▼ more Click!
더보기 접기
RemoteSigned 설정방법
- Get-ExecutionPolicy 를 입력하시면 현재 설정된 실행정책(Execution_Policy)를 확인 할 수가 있습니다. 별도로 재설정을 하지 않았다면, 대부분 Restricted로 설정되어 있을 것 입니다.
이 실행정책을 변경하여 로컬에서 만든 스크립트를 실행 하려면 다음 명령을 입력하시면 됩니다.
> Set-ExecutionPolicy RemoteSigned
너무 쉽죠? - ㅠ-..
접기
우선 인증서를 생성하기 위해서는 인증 과정을 알아야 할 것 입니다 .
PowerShell 은 이러한 인증 과정에 대하여 상세하게 매뉴얼로 설명을 하고 있으며 , 이 매뉴얼을 PowerShell 내에서도 확인 할 수가 있습니다 .
- About_Signing 관련 문서 : http://technet.microsoft.com/ko-kr/library/dd347649.aspx
- About_Signing 매 뉴얼 명령어 : [Get-Help about_signing]
Microsoft 에서 제공하는 매 뉴얼을 보면 스크립트 서명 방법에 대하여 2 가지를 제시하고 있습니다 .
공인 인증 기관에서 만든 인증서 : 공인 인증기관에서 유료로 사용자에게 발급하는 코드 서명 인증서
사용자가 만든 인증서 : 사용자가 자신의 컴퓨터를 인증기관 역할을 할 수 있도록 설정하여 자체 서명된 인증서를 발급하므로 무료로 발급하여 사용이 가능 .
PowerShell 을 공부하는데 돈이 들어가면 안되겠죠? 우리는 여기서 사용자가 만든 인증서(개인 인증서)를 이용하도록 하겠습니다 .
2. PowerShell의 개인 인증서 만들기
인증서를 만들기 위해서는 우선 인증서 생성 도구가 있어야 하며 , 이 도구는 .Net Framework SDK 1.1 이상 버전에 포함되어 있으며 아래 URL 에서 다운로드 받을 수 있습니다 .
.NET Framework SDK 2.0 Download : http://www.microsoft.com/downloads/details.aspx?familyid=fe6f2099-b7b4-4f47-a244-c96d69c35dec&displaylang=en
Window SDK Download : http://msdn.microsoft.com/ko-kr/windows/bb980924.aspx
MakeCert 관련 문서 : http://go.mic rosoft.com/fwlink/?LinkId=119097
저는 제가 사용중인 Windows7 에 맞는 SDK 인 Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 를 다운로드 받아 설치하였습니다 .
모든 설치가 완료 되었다면 , 이제 인증서 생성 도구인 makecert 를 실행해야 하지만 , 그전에 사전 준비 작업을 진행하도록 하겠습니다.
1) 우선 시작 버튼을 누른 후 mmc.exe 를 실행 하도록 합니다 .
2)
콘솔 창이 열리면 [ 파일 ] -> [ 스냅인 추가 / 제거 ] 버튼을 눌러 스냅인 페이지를 띄워줍니다 . ( 단축키는 Ctrl + M)
3) [ 스냅인 추가 / 제거 ] 창이 열리면 [ 인증서 ] 를 선택 한 후 추가 버튼을 누릅니다 .
4)
스냅인이 관리할 인증서 대상은 [ 내 사용자 계정 ] 을 선택 한 후 마침을 눌러 스냅인을 완료 합니다 .
스냅인이 완료 되었다면 , 이제 실제 개인 인증서를 생성해야 합니다 . 이를 생성하기 위해서는 위에서 말씀 드린바와 같이 makecert 툴을 사용해야 합니다 .
Windows SDK를 설치한 경우라면 , Windows 7 SDK 에 포함된 CMD 를 띄워서 실행하도록 하겠습니다 .
위와 같이 makecert 가 실행되는 것을 확인 했다면 , 다음 명령어를 실행하여 인증서를 생성하도록 합니다 .
<Root 인증서 >
makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr LocalMachine
Root 인증서를 생성하기 위해 위와 같이 명령어를 실행했다면 , 아래 그림과 같이 개인키 암호 만들기 라는 창이 보여질 것 입니다 .
보안상 암호를 설정 하도록 하겠습니다 .
2 번의 암호 설정 입력이 끝나면 , 입력한 암호에 대하여 확인하는 암호 입력창이 다시 한번 출력됩니다 .
정상적으로 Root 인증서와 사용자 인증서가 설치되었다면 , MMC 에서 해당 내용을 확인 할 수 있습니다 .
[MMC 실행 후 인증서 스냅인 추가 ] -> [ 신뢰할 수 있는 루트 인증기관 ] -> [ 인증서 ] -> [PowerShell Local Certificate Root]
관리자 인증서 생성이 완료되었으니 , 이제 사용자 인증서를 생성해 보도록 하겠습니다 .
<사용자 인증서 >
makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer
Root 인증서를 만들때와 마찬가지로 개인키 암호를 입력하는 창이 출력되며 , 해당 창에 개인키에 대한 암호를 입력하시면 정상적으로 생성이 됩니다 .
이제 Root 인증서와 사용자 인증서 2 개 모두 생성이 되었으니 , 사용자 인증서에 대한 내용을 PowerShell 에서 확인해 보도록 하겠습니다 .
PowerShell 창에서 아래 명령어 입력을 통해 확인이 가능 합니다 .
PS C:\Windows\system32> Get-Childitem cert:\CurrentUser\my -codesigning
디렉터리: Microsoft.PowerShell.Security\Certificate::CurrentUser\my
Thumbprint Subject
---------- -------
A9BB73523B24247BCFBE9B7B7E0B7723F559209C CN=PowerShell User
생성된 인증서는 MMC 의 스냅인을 통해서도 확인이 가능 합니다 .
정상적으로 인증서를 만들었다면 , 이 인증서를 이용해서 자신이 실행하고자 하는 스크립트 또는 작성한 스크립트에 Signing 을 진행해 보도록 하겠습니다 .
아래 내용은 Sign 이 되지 않은 스크립트와 Sign 이 된 스크립트의 실행 결과 차이 입니다 .
PS C:\Users\mrmsm.SDS> Set-ExecutionPolicy Allsigned
PS C:\Users\mrmsm.SDS> .\GetProcess_Script.ps1
C:\Users\mrmsm.SDS\GetProcess_Script.ps1 파일을 로드할 수 없습니다. C:\Users\mrmsm.SDS\GetProcess_Script.ps1 파일에 디
지털 서명하지 않았습니다. 스크립트가 시스템에서 실행되지 않습니다. 자세한 내용은 "get-help about_signing"을 참조하십시오..
위치 줄:1 문자:24
+ .\GetProcess_Script.ps1 <<<<
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException
PS C:\Users\mrmsm.SDS> $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\GetProcess_Script.ps1 $cert
디렉터리: C:\Users\mrmsm.SDS
SignerCertificate Status Path
----------------- ------ ----
79DBB89D221B3B7A4266E39D8F79F049CE03A644 Valid GetProcess_Script.ps1
PS C:\Users\mrmsm.SDS> .\GetProcess_Script.ps1
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
420 10 6140 8696 88 9.80 3532 atbsvc
535 5 1304 1868 49 1356 atieclxx
97 4 820 1240 27 940 atiesrxx
118 5 15352 14208 40 5108 audiodg
74 4 1672 1388 55 4032 CKAgent
75 7 11044 532 84 0.08 5864 ClientSM
95 5 4956 9364 64 1.97 6272 conhost
--- 생략 ---
위의 내용을 보면 ExecutionPolicy 를 Allsigned 로 설정함으로써 Sign 된 스크립트만 실행하도록 설정하였고 , Sign 되지 않은 스크립트는 로드 되지 않고 에러메세지가 출력됨을 확인 할 수 있습니다 . 스크립트에 Set-AuthenticodeSignature 명령을 이용하여 Sign 을 진행 하였고 , 실행 결과가 정상적으로 출력됨을 확인 할 수 있습니다 .
Set-AuthenticodeSignature 명령에 대한 자세한 사용 방법은 [Get-Help Set-AuthenticodeSignature] 명령을 입력하여 확인이 가능 합니다 .
!! 알고 가세요
P owerShell ISE 에서 작성한 스크립트를 Signature 할 경우 아래 내용과 같이 정상적인 Signing 이 되지 않는 현상이 발생 할 수 있습니다 . 이는 PowerShell ISE 의 버그로 ISE 에서 생성된 스크립트는 Signing 이 되지 않음을 아래 URL 에서 확인하실 수 있습니다 .
# notepad 에서 작성한 Script
PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\GetProcess_Script.ps1 $cert
디렉터리: C:\Users\mrmsm.SDS
SignerCertificate Status Path
----------------- ------ ----
79DBB89D221B3B7A4266E39D8F79F049CE03A644 Valid GetProcess_Script.ps1
# PowerShell ISE 에서 작성한 Scirpt
PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\ISE_Script.ps1 $cert
디렉터리: C:\Users\mrmsm.SDS
SignerCertificate Status Path
----------------- ------ ----
UnknownError ISE_Script.ps1
- ISE 버그 관련 참고 URL : http://connect.microsoft.com/PowerShell/feedback/details/483431/set-authenticodesignature-fails-on-scripts-created-from-i Se
!! 알고 가세요
Set-ExecutionPolicy 를 사용하는데에 있어 실행 정책들이 어떤 내용을 가지고 있는지 모르고 설정 하면 안되겠죠 ?
다음 내용은 ExecutionPolicy 에 대한 각 변수들의 설명입니다 .
Restricted : 구성 파일을 로드하거나 스크립트를 실행하지 않습니다 . 기본값 입니다 .
AllSigned : 로컬 컴퓨터에 ㅈ가성하는 스크립트를 포함하여 모든 스크립트 및 구성파일에 신뢰된 게시자가 서명해야 합니다 .
RemoteSigned : 인터넷에서 다운로드한 모든 스크립트 및 구성파일에 대해 신뢰된 게시자가 서명해야 합니다 . ( 즉 , 로컬에서 작성한 스크립트는 문제가 없습니다 .)
Unrestricted : 모든 구성파일을 로드하고 모든 스크립트를 실행합니다 . 인터넷에서 다운로드한 서명되지 않은 스크립트를 실행할 경우 실행하기 전에 사용권한을 묻는 메시지가 표시됩니다 .
ByPass : 아무것도 차단하지 않으며 , 경고나 메시지도 표시되지 않습니다 .
Underfinded : 현재 할당된 실행 정책을 현재 범위에서 제거 합니다 . 이 매개변수는 그룹정책 범위에 설정된 실행 정책을 제거하지 않습니다 .
우리가 흔히 Local 상에서 작성한 스크립트가 실행되지 않을 때 [Set-ExecutionPolicy RemoteSigned] 를 실행하라고 합니다 . 이 명령을 실행하면 인터넷에서 다운로드한 모든 스크립트에 대해서만 Signature 가 필요하기 때문에 Local 에서 작성한 스크립트는 아무런 제약 없이 실행 할 수가 있는 것입니다 .
<참고 URL>
http://technet.microsoft.com/ko-kr/library/dd347649.aspx
http://www.hanselman.com/blog/SigningPowerShellScripts.aspx
http://technet.microsoft.com/ko-kr/library/dd347628.aspx