Microsoft는 PowerShell 스크립트에서 저장된 암호(시크릿)를 안전하게 보관하고 사용할 수 있도록 매우 유용한 SecretManagement 모듈을 공개했습니다. 이 모듈은 두 가지 구성 요소로 이루어져 있습니다. 하나는 기본 암호 저장소 역할을 하는 SecretStore 볼트(Vault)이고, 다른 하나는 다양한 암호 볼트에 접근할 수 있게 해주는 SecretManagement 엔진입니다.
기본 제공되는 SecretStore 볼트뿐만 아니라 KeePass, LastPass, HashiCorp Vault, Azure Key Vault, Bitwarden, Windows 자격 증명 관리자 같은 서드파티 암호 볼트도 지원합니다. SecretManagement를 활용하면 암호(자격 증명)를 시크릿 볼트에 저장해두고 언제든지 꺼내 쓸 수 있으며, 라이선스 키나 액세스 키 등 기타 민감한 정보도 저장할 수 있습니다. 지원되는 개체 유형은 Hashtable, Byte, String, SecureString, PSCredential입니다.
이 글에서는 PowerShell 스크립트에서 SecretManagement 모듈을 사용해 자격 증명을 저장하고 불러오는 방법과, KeePass 연동 예제까지 소개합니다.
목차
- SecretManagement 모듈 설치
- PowerShell로 암호 저장소(SecretStore 볼트) 만들기
- SecretManagement 모듈로 저장된 자격 증명 관리
- PowerShell 스크립트에서 볼트의 저장된 암호 활용
- PowerShell로 KeePass 암호 및 시크릿 관리
SecretManagement 모듈 설치
SecretManagement 모듈을 사용하려면 Windows PowerShell 5.1 이상 또는 PowerShell Core 6.x, 7.x가 필요합니다.
NuGet 패키지 관리자를 통해 설치하려면 다음 명령을 실행하세요.
Install-Module -Name Microsoft.PowerShell.SecretManagement
Microsoft에서 제공하는 기본 SecretStore 볼트를 설치하려면 아래 명령을 실행합니다.
Install-Module -Name Microsoft.PowerShell.SecretStore
모듈에서 사용할 수 있는 cmdlet 목록을 확인하려면 다음 명령을 사용하세요.
Get-Command -Module Microsoft.PowerShell.SecretManagement
Get-Command -Module Microsoft.PowerShell.SecretStore
PowerShell로 암호 저장소(SecretStore 볼트) 만들기
먼저 로컬 시크릿 볼트를 생성합니다. 여기서는 MyDomainPassdb라는 이름으로 만들고 기본 암호 저장소로 지정하겠습니다.
Register-SecretVault -Name MyDomainPassdb -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
PowerShell 스크립트 실행 정책 설정 때문에 모듈이 실행되지 않는다면, 현재 세션에 한해 다음과 같이 설정을 변경할 수 있습니다.
Set-ExecutionPolicy -Scope Process Unrestricted
로컬 암호 볼트와 원격 암호 볼트를 모두 만들어 사용할 수 있습니다.
아래 명령은 현재 사용자에게 등록된 암호 볼트 목록을 표시합니다.
Get-SecretVault
SecretStore 볼트에 접근할 마스터 암호를 설정하려면 다음 명령을 실행합니다.
Get-SecretStoreConfiguration
주의: SecretStore 볼트의 마스터 암호를 잊어버리면 저장된 데이터에 접근할 수 없게 되므로, 암호 관리에 각별히 신경 써야 합니다.
기본 설정에 따르면 암호 저장소에 누가, 어떤 방식으로 접근할 수 있는지는 다음 항목들이 결정합니다.
- Scope –
CurrentUser(현재 사용자만 SecretStore에 접근 가능) - Authentication –
Password(마스터 암호로 볼트에 접근) - PasswordTimeout –
900(마스터 암호를 다시 입력하지 않아도 되는 세션 유지 시간, 초 단위. 세션 시간은Set-SecretStoreConfiguration -PasswordTimeout 1200처럼 연장할 수 있음) - Interaction –
Prompt(변경 작업 시 마스터 암호 입력 여부)
시크릿 볼트 접근 시 마스터 암호 입력을 생략하려면(권장하지 않음) Authentication = None으로 설정합니다.
Set-SecretStoreConfiguration -Authentication None
마스터 암호를 변경하려면 Set-SecretStorePassword cmdlet을 사용하세요.
Windows에서 로컬 암호 저장소는 사용자 프로필 폴더의 %LOCALAPPDATA%\Microsoft\PowerShell\secretmanagement 경로에 위치합니다.
아쉽게도 MSA/gMSA(관리 서비스 계정)는 프로필이 생성되지 않기 때문에 SecretManagement 모듈을 사용할 수 없습니다.
SecretManagement 모듈로 저장된 자격 증명 관리
Set-Secret cmdlet은 SecureString 유형의 시크릿을 암호 볼트에 추가할 때 사용합니다. 볼트 이름과 항목 이름을 지정하세요.
Set-Secret -Vault MyDomainPassdb -Name user1
명령을 실행하면 저장할 암호(시크릿)를 입력하라는 메시지가 표시됩니다.
또는 다음과 같이 보호된 값을 직접 저장할 수도 있습니다(예: GitHub 키).
Set-Secret -Vault MyDomainPassdb -Name MY_GITHUB_TOKEN -Secret 'GitHub_AUTH_API_Token'
주의: PowerShell 콘솔에 민감한 정보를 일반 텍스트로 입력할 때는 주의해야 합니다. 입력 내용이 PowerShell 명령 기록에 그대로 남기 때문입니다.
시크릿 볼트에 저장된 항목 목록은 다음 명령으로 확인할 수 있습니다.
Get-SecretInfo
PowerShell 7.x에서는 –AsPlainText 옵션을 사용해 볼트의 보호된 값을 일반 텍스트로 표시할 수 있습니다(필요하다면 PowerShell 버전을 업데이트하세요).
Get-Secret -Vault MyDomainPassdb -Name user1 | ConvertFrom-SecureString –AsPlainText
Windows 네트워크 환경에서는 대부분 암호만 저장하는 것보다 사용자 이름과 암호를 함께 저장해야 하는 경우가 많습니다. 이럴 때는 자격 증명을 PSCredential 개체로 저장하면 됩니다. 저장된 항목에 대한 설명 같은 메타데이터도 추가할 수 있습니다.
Set-Secret -Vault MyDomainPassdb -Name adm_maxbak -Secret (Get-Credential) -Metadata @{description = "AD enterprise admin woshub.com"}
Get-Credential 창에 계정 이름을 직접 입력하기 번거롭다면 다음처럼 미리 지정할 수 있습니다.
Set-Secret -Vault MyDomainPassdb -Name adm_maxbak -Secret (Get-Credential woshub\adm_maxbak)
저장된 암호 목록과 설명을 함께 표시하려면 다음 명령을 사용하세요.
Get-SecretInfo | Ft Name, Metadata
PowerShell 스크립트에서 볼트의 저장된 암호 활용
이제 저장된 암호를 PowerShell 스크립트와 명령에서 활용할 수 있습니다. 예를 들어, 필자의 고객 중 한 곳은 보안 및 관리 계정 보호를 위해 관리자마다 수십 개의 계정을 사용하고, 서비스·작업별로도 계정을 분리해 운영합니다. 동일한 암호 사용은 금지되어 있고 암호는 정기적으로 감사를 받습니다. 관리자들은 매번 서로 다른 암호를 입력하는 일이 매우 번거롭다고 호소합니다.
SecretManagement 모듈을 사용하면 암호를 로컬 볼트에 안전하게 보관하고, 필요할 때 바로 꺼내 쓸 수 있습니다.
예를 들어 PowerShell Remoting을 통해 원격 컴퓨터에 접속해 명령을 실행하려면 다음 코드를 사용할 수 있습니다.
Enter-PSSession -ComputerName mun-dc01 -Credential (Get-Secret -Vault MyDomainPassdb -Name adm_maxbak)
같은 방식으로 Exchange나 Microsoft 365(구 Office 365)에도 더 쉽게 연결할 수 있습니다.
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://mun-exch1.woshub.com/PowerShell/ -Authentication Kerberos -Credential (Get-Secret -Vault MyDomainPassdb -Name adm_ex_maxbak)
Azure AD 테넌트에 연결할 수도 있습니다.
Connect-AzureAD -Credential (Get-Secret -Vault MyDomainPassdb -Name azadm_maxbak)
단순히 자격 증명을 가져와 PowerShell 변수에 담아두고 싶다면 다음과 같이 하면 됩니다.
$Cred = Get-Secret -Vault MyDomainPassdb user1
PowerShell로 KeePass 암호 및 시크릿 관리
SecretManagement 모듈은 그 외에도 다양한 인기 암호 볼트에 접근하는 데 활용할 수 있습니다. KeePass 파일(*.kdbx)에 저장된 암호에 접근하는 방법을 살펴보겠습니다.
먼저 KeePass와 연동할 수 있는 SecretManagement 모듈을 설치합니다.
Install-Module -Name SecretManagement.KeePass
그다음 사용자 프로필에 있는 KeePass 볼트 파일을 등록합니다.
Register-SecretVault -Name "KeePassDB" -ModuleName "SecretManagement.Keepass" -VaultParameters @{
Path = "C:\Users\maxbak\Documents\personal_creds.kdbx"
UseMasterPassword = $true
}
KeePass 파일에 대한 접근이 정상인지 확인하려면 다음 명령을 실행합니다.
Test-SecretVault -Name KeePassDB
KeePass 볼트에 접근하기 위한 마스터 암호를 입력하세요. 암호가 올바르게 입력되면 명령이 True를 반환합니다.
이제 KeePass 데이터베이스에 저장된 암호 목록을 표시할 수 있습니다.
Get-SecretInfo -Vault KeePassDB
KeePass에 새 시크릿을 저장하려면 다음과 같이 합니다.
Set-Secret -Vault KeePassDB -Name "ILO_adm" -Secret (Get-Credential woshub\ILO_adm)
이와 같은 방식으로 다른 인기 암호 저장 솔루션에도 연결해 PowerShell에서 활용할 수 있습니다.