about_Session_Configurations — PowerShell 세션 구성
about_Session_Configurations — PowerShell 세션 구성
원격으로 컴퓨터에 연결할 때 "누가, 무엇을 실행할 수 있는지"를 정해 두면 좋겠다는 생각 해 보신 적 있나요? 이 문서에서 다루는 **세션 구성(Session Configuration)**이 바로 그 일을 하는 기능이에요. 쉽게 말해 이 컴퓨터에 들어오는 PowerShell 세션이 어떤 모습이어야 하는지를 담아 두는 "설정 묶음"이라고 볼 수 있어요. 관리자라면 이 기능으로 컴퓨터를 보호하고, 사용자별로 맞춤 환경을 만들어 줄 수 있어요. 지금부터 하나씩 살펴볼게요.
본문
세션 구성이란 무엇인가요
세션 구성은 "엔드포인트(endpoint)"라고도 불러요. 로컬 컴퓨터 위에 있는 일련의 설정 값들로, 원격 사용자든 로컬 사용자든 PowerShell에 연결할 때 만들어지는 PowerShell 세션의 환경을 정의해 줘요.
컴퓨터의 관리자는 이 세션 구성을 이용해서 컴퓨터를 보호하고, 연결하는 사용자에게 맞춤 환경을 만들어 줄 수 있어요. 또 원격으로 연결하는 데 필요한 권한도 정할 수 있는데요. 기본적으로는 Administrators 그룹 멤버만이 세션 구성을 이용해 원격 연결할 수 있어요. 하지만 이 기본 설정을 바꾸면 모든 사용자나, 지정한 일부 사용자만 원격으로 연결하게 할 수도 있어요.
PowerShell 3.0부터는 **세션 구성 파일(session configuration file)**로 세션 구성을 정의할 수 있게 되었어요. 이 기능 덕분에 코드를 짜지 않고도 세션을 손쉽게 커스터마이즈하고, 세션 구성의 속성도 쉽게 확인할 수 있어요. 세션 구성 파일을 만들려면 New-PSSessionConfiguration cmdlet을 쓰면 되고, 세션 구성 파일에 대한 자세한 내용은 about_Session_Configuration_Files 문서에서 확인할 수 있어요.
세션 구성은 WSMAN 기반 PowerShell 원격 기능의 일부예요. New-PSSession, Invoke-Command, Enter-PSSession cmdlet으로 원격 Windows 컴퓨터에 연결할 때만 사용돼요.
창고해 두실 점은, Windows 컴퓨터에서 세션 구성을 관리하려면 PowerShell을 관리자 권한으로 실행해야 한다는 거예요.
모든 세션에는 세션 구성이 붙어요
사실 모든 PowerShell 세션은 어떤 세션 구성을 하나씩 사용해요. 여기에는 New-PSSession이나 Enter-PSSession으로 만드는 영구 세션(persistent session)은 물론, Invoke-Command처럼 WS-Management 기반 원격 기술을 쓰는 cmdlet의 ComputerName 매개 변수로 PowerShell이 임시로 만드는 세션까지 포함돼요.
관리자는 세션 구성을 통해 컴퓨터의 리소스를 보호하고, 연결하는 사용자에게 맞춤 환경을 만들 수 있어요. 예를 들어 세션이 받는 개체 크기를 제한하거나, 세션의 언어 모드(language mode)를 정하거나, 세션에서 쓸 수 있는 cmdlet·프로바이더·함수를 지정할 수 있어요.
세션 구성의 **보안 설명자(Security Descriptor)**를 설정하면 누가 그 세션 구성을 이용해 컴퓨터에 연결할 수 있는지가 정해져요. 사용자가 세션에서 그 세션 구성을 쓰려면 Execute 권한이 있어야 해요. 컴퓨터의 세션 구성 어느 것도 쓸 권한이 없는 사용자는 원격으로 컴퓨터에 연결할 수 없어요.
기본적으로는 컴퓨터의 Administrators만이 기본 세션 구성들을 쓸 수 있어요. 하지만 보안 설명자를 바꾸면 모두에게, 아무에게도, 또는 선택한 사용자에게만 세션 구성을 허용하도록 바꿀 수 있어요.
PowerShell에 내장된 세션 구성
PowerShell 3.0에는 Microsoft.PowerShell과 Microsoft.PowerShell.Workflow라는 이름의 내장 세션 구성이 들어 있어요. 64비트 Windows를 쓰는 컴퓨터에서는 32비트용 세션 구성인 Microsoft.PowerShell32도 함께 제공돼요.
Microsoft.PowerShell 세션 구성은 세션을 만들 때 기본으로 사용돼요. 즉, 세션을 만드는 명령에서 New-PSSession, Enter-PSSession, Invoke-Command cmdlet의 ConfigurationName 매개 변수를 쓰지 않을 때가 그 경우예요.
기본 세션 구성들의 보안 설명자는 로컬 컴퓨터의 Administrators 그룹 멤버만 사용할 수 있게 되어 있어요. 그래서 설정을 바꾸지 않는 한, Administrators 그룹 멤버만 원격으로 컴퓨터에 연결할 수 있어요.
기본 세션 구성은 $PSSessionConfigurationName 기본 설정 변수(preference variable)로 바꿀 수 있어요. 자세한 내용은 about_Preference_Variables 문서를 참고하세요.
로컬 컴퓨터의 세션 구성 확인하기
로컬 컴퓨터의 세션 구성을 가져오려면 Get-PSSessionConfiguration cmdlet을 쓰면 돼요. 예를 들어 이렇게 입력해요.
PS C:> Get-PSSessionConfiguration | Format-List -Property Name, Permission
Name : microsoft.powershell
Permission : BUILTIN\Administrators AccessAllowed
Name : microsoft.powershell.workflow
Permission : BUILTIN\Administrators AccessAllowed
Name : microsoft.powershell32
Permission : BUILTIN\Administrators AccessAllowed
PowerShell 3.0부터 세션 구성 개체가 확장되어, 세션 구성 파일로 설정한 세션 구성의 속성들까지 보여 줘요. 예를 들어 세션 구성 개체의 모든 속성을 보려면 이렇게 입력해요.
PS C:> Get-PSSessionConfiguration | Format-List -Property *
세션 구성은 PowerShell의 WSMan 프로바이더로도 볼 수 있어요. WSMan 프로바이더는 세션 안에 WSMan: 드라이브를 만들어 줘요.
WSMan: 드라이브에서 세션 구성은 Plugin 노드에 있어요. (모든 세션 구성이 Plugin 노드에 있는 건 맞지만, Plugin 노드에 있는 항목이 전부 세션 구성인 건 아니라는 점 주의하세요.)
예를 들어 로컬 컴퓨터의 세션 구성을 보려면 이렇게 입력해요.
PS C:> dir WSMan:\localhost\plugin\microsoft*
WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Plugin
Type Keys Name
---- ---- ----
Container {Name=microsoft.powershell} microsoft.powershell
Container {Name=microsoft.powershell.workflow} microsoft.powershell.workflow
Container {Name=microsoft.powershell32} microsoft.powershell32
원격 컴퓨터의 세션 구성 확인하기
원격 컴퓨터의 세션 구성을 보려면 Connect-WSMan cmdlet으로 그 원격 컴퓨터에 대한 노드를 로컬 컴퓨터의 WSMan: 드라이브에 추가한 다음, WSMan: 드라이브에서 세션 구성을 확인하면 돼요.
예를 들어 다음 명령은 Server01 원격 컴퓨터에 대한 노드를 로컬 컴퓨터의 WSMan: 드라이브에 추가해요.
PS C:> Connect-WSMan server01.corp.fabrikam.com
명령이 끝나면 Server01 컴퓨터의 노드로 이동해서 세션 구성을 확인할 수 있어요. 예를 들어:
PS C:> cd WSMan:
PS WSMan:> dir
ComputerName Type
------------ ----
localhost Container
server01.corp.fabrikam.com Container
PS WSMan:> dir server01\plugin\
WSManConfig: Microsoft.WSMan.Management\WSMan::server01.corp.fabrikam.com\Plugin
Type Keys Name
---- ---- ----
Container {Name=microsoft.powershell} microsoft.powershell
Container {Name=microsoft.powershell.workflow} microsoft.powershell.workflow
Container {Name=microsoft.powershell32} microsoft.powershell32
세션 구성의 보안 설명자 바꾸기
Windows Server 2012 이상에서는 내장 세션 구성이 기본으로 원격 사용자에게 활성화되어 있어요. 그 외에 지원되는 Windows 버전에서는 원격 접근을 허용하려면 세션 구성의 보안 설명자를 직접 바꿔 줘야 해요.
컴퓨터의 세션 구성에 원격 접근을 허용하려면 Enable-PSRemoting cmdlet을 쓰면 돼요. 이 cmdlet은 두 개의 세션 구성을 만들어요:
- 이름이
"PowerShell."+"현재 PowerShell 버전"으로 정의된 것 - 특정 PowerShell 버전에 묶이지 않은
"PowerShell.6"이라는 이름의 것
또 기본적으로는 컴퓨터의 Administrators 그룹 멤버만이 기본 세션 구성에 Execute 권한을 갖고 있어요. 하지만 기본 세션 구성과 직접 만든 세션 구성을 가리지 않고 보안 설명자를 바꿀 수 있어요.
다른 사용자에게 원격 연결 권한을 주려면 Set-PSSessionConfiguration cmdlet으로 그 사용자들에게 Microsoft.PowerShell, Microsoft.PowerShell32 세션 구성의 보안 설명자에 "Execute" 권한을 추가하면 돼요.
예를 들어 다음 명령은 Microsoft.PowerShell 기본 세션 구성의 보안 설명자를 바꿀 수 있는 속성 페이지를 열어 줘요.
Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
모든 사용자에게 컴퓨터의 모든 세션 구성 권한을 거부하려면 Disable-PSSessionConfiguration cmdlet을 쓰면 돼요. 예를 들어 다음 명령은 컴퓨터의 기본 세션 구성을 비활성화해요.
PS C:> Disable-PSSessionConfiguration -Name Microsoft.PowerShell
원격 사용자의 연결은 막되 로컬 사용자의 연결은 허용하려면 Disable-PSRemoting cmdlet을 쓰면 돼요. Disable-PSRemoting은 컴퓨터의 모든 세션 구성에 "Network_Deny_All" 항목을 추가해요.
PS C:> Disable-PSRemoting
원격 사용자가 컴퓨터의 모든 세션 구성을 쓰도록 허용하려면 Enable-PSRemoting이나 Enable-PSSessionConfiguration cmdlet을 쓰면 돼요. 예를 들어 다음 명령은 내장 세션 구성에 원격 접근을 활성화해요.
PS C:> Enable-PSSessionConfiguration -Name Microsoft.Power*
세션 구성의 보안 설명자를 다른 방식으로 바꾸려면 Set-PSSessionConfiguration cmdlet을 쓰면 돼요. SecurityDescriptorSDDL 매개 변수로 SDDL 문자열 값을 제출하거나, ShowSecurityDescriptorUI 매개 변수로 새 SDDL을 만드는 데 도움이 되는 사용자 인터페이스 속성 시트를 표시할 수 있어요.
예를 들어:
Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
새 세션 구성 만들기
로컬 컴퓨터에 새 세션 구성을 만들려면 Register-PSSessionConfiguration cmdlet을 쓰면 돼요. 새 세션 구성을 정의하는 방법은 C# 어셈블리, PowerShell 스크립트, 그리고 Register-PSSessionConfiguration cmdlet의 매개 변수를 사용하는 것 중에서 고를 수 있어요.
예를 들어 다음 명령은 Microsoft.PowerShell 세션 구성과 같지만, 원격 명령에서 받는 데이터를 20MB로 제한하는 세션 구성(기본값은 50MB예요)을 만들어요.
$registerPSSessionConfigurationSplat = @{
Name = 'NewConfig'
MaximumReceivedDataSizePerCommandMB = 20
}
Register-PSSessionConfiguration @registerPSSessionConfigurationSplat
세션 구성을 만들면 다른 세션 구성 cmdlet으로 관리할 수 있고, WSMan: 드라이브에도 나타나요. 자세한 내용은 Register-PSSessionConfiguration 문서를 참고하세요.
세션 구성 제거하기
로컬 컴퓨터에서 세션 구성을 제거하려면 Unregister-PSSessionConfiguration cmdlet을 쓰면 돼요. 예를 들어 다음 명령은 컴퓨터에서 NewConfig 세션 구성을 제거해요.
Unregister-PSSessionConfiguration -Name NewConfig
자세한 내용은 Unregister-PSSessionConfiguration 문서를 참고하세요.
세션 구성 복원하기
실수로 삭제(등록 취소)한 기본 세션 구성을 복원하려면 Enable-PSRemoting cmdlet을 쓰면 돼요.
Enable-PSRemoting cmdlet은 컴퓨터에 존재하지 않는 모든 기본 세션 구성을 다시 만들어 줘요. 이미 존재하는 세션 구성의 속성 값을 덮어쓰거나 바꾸지는 않아요.
기본 세션 구성의 원래 속성 값을 복원하려면 Unregister-PSSessionConfiguration으로 그 세션 구성을 삭제한 다음, Enable-PSRemoting cmdlet으로 다시 만들면 돼요.
세션 구성 선택하기
세션에 특정 세션 구성을 선택하려면 New-PSSession, Enter-PSSession, Invoke-Command의 ConfigurationName 매개 변수를 쓰면 돼요.
예를 들어 다음 명령은 New-PSSession cmdlet으로 Server01 컴퓨터에 PSSession을 시작해요. 명령에서 ConfigurationName 매개 변수로 Server01 컴퓨터의 WithProfile 구성을 선택해요.
New-PSSession -ComputerName Server01 -ConfigurationName WithProfile
이 명령은 현재 사용자가 WithProfile 세션 구성을 쓸 권한이 있거나, 필요한 권한을 가진 사용자의 자격 증명을 제공할 수 있을 때만 성공해요.
$PSSessionConfigurationName 기본 설정 변수로 컴퓨터의 기본 세션 구성을 바꿀 수도 있어요. $PSSessionConfigurationName 기본 설정 변수에 대한 자세한 내용은 about_Preference_Variables 문서를 참고하세요.
Keywords
about_Endpoints
about_SessionConfigurations
더 알아보기
- about_Preference_Variables
- about_PSSessions
- about_Remote
- about_Session_Configuration_Files
- New-PSSession
- Disable-PSSessionConfiguration
- Enable-PSSessionConfiguration
- Get-PSSessionConfiguration
- Register-PSSessionConfiguration
- Set-PSSessionConfiguration
- Unregister-PSSessionConfiguration
- New-PSSessionConfigurationFile
- Test-PSSessionConfigurationFile