PowerShell에는 스크립팅 환경의 보안을 향상하도록 설계된 몇 가지 기능이 있습니다.
실행 정책
PowerShell의 실행 정책은 PowerShell이 구성 파일을 로드하고 스크립트를 실행하는 조건을 제어하는 안전 기능입니다. 이 기능은 악성 스크립트의 실행을 방지하는 데 도움이 됩니다. 그룹 정책 설정을 사용하여 컴퓨터 및 사용자의 실행 정책을 설정할 수 있습니다. 실행 정책은 Windows 플랫폼에만 적용됩니다.
자세한 내용은 about_Execution_Policies를 참고하십시오.
SecureString 클래스 사용
PowerShell에는 클래스 사용을 지원하는 여러 cmdlet이 있습니다 System.Security.SecureString .
또한 .NET 클래스와 마찬가지로 사용자 고유의 스크립트에서 SecureString을 사용할 수 있습니다. 그러나 Microsoft는 새 개발에 SecureString을 사용하지 않는 것이 좋습니다. Microsoft는 암호를 사용하지 않도록 하고 인증서 또는 Windows 인증 같은 다른 인증 방법을 사용하는 것이 좋습니다.
PowerShell은 이전 버전과의 호환성을 위해 SecureString 클래스를 계속 지원합니다. SecureString을 사용하는 것이 일반 텍스트 문자열을 사용하는 것보다 더 안전합니다. PowerShell은 콘텐츠를 콘솔 또는 로그에 실수로 노출하지 않도록 SecureString 형식을 계속 사용합니다. SecureString은 일반 텍스트 문자열로 쉽게 변환할 수 있으므로 신중하게 사용합니다. SecureString 사용에 대한 자세한 내용은 System.Security.SecureString 클래스 설명서를 참조하세요.
모듈 및 스크립트 블록 로깅
모듈 로깅을 사용하면 선택한 PowerShell 모듈에 로깅을 사용하도록 설정할 수 있습니다. 이 설정은 컴퓨터의 모든 세션에서 적용됩니다. PowerShell은 Windows PowerShell 이벤트 로그에서 지정된 모듈에 대한 파이프라인 실행 이벤트를 기록합니다.
스크립트 블록 로깅을 사용하면 대화형으로 호출되거나 자동화를 통해 명령, 스크립트 블록, 함수 및 스크립트를 처리할 수 있습니다. PowerShell은 이 정보를 Microsoft-Windows-PowerShell/Operational 이벤트 로그에 기록합니다.
자세한 내용은 다음 문서를 참조하세요.
AMSI 지원
AMSI(Windows 맬웨어 방지 검사 인터페이스)는 애플리케이션이 Windows Defender와 같은 맬웨어 방지 스캐너에 작업을 전달하여 악의적인 페이로드를 검색할 수 있는 API입니다. PowerShell 5.1부터 Windows 10 이상에서 실행되는 PowerShell은 모든 스크립트 블록을 AMSI에 전달합니다.
PowerShell 7.3은 검사를 위해 AMSI로 보내는 데이터를 확장합니다. 이제 모든 .NET 메서드 호출이 포함됩니다.
AMSI에 대한 자세한 내용은 AMSI가 주는 도움을 참조하세요.
제한된 언어 모드
ConstrainedLanguage 모드는 PowerShell 세션에서 허용되는 cmdlet 및 .NET 형식을 제한하여 시스템을 보호합니다. 전체 설명은 about_Language_Modes 참조하세요.
응용 프로그램 제어
Windows 10에는 애플리케이션을 제어하는 데 사용할 수 있는 두 가지 기술인 비즈니스 용 App Control과 AppLocker 가 포함되어 있습니다. PowerShell은 시스템 전체 애플리케이션 제어 정책이 적용되는지 검색합니다. 이 정책은 시스템에서 임의의 코드 실행을 방지하기 위해 스크립트 블록, 스크립트 파일 또는 모듈 파일을 로드할 때 특정 동작을 적용합니다.
비즈니스용 앱 제어는 MSRC(Microsoft Security Response Center)에서 정의한 서비스 기준에 따라 보안 기능으로 설계되었습니다. 앱 컨트롤은 Windows에 대한 기본 애플리케이션 제어 시스템입니다.
PowerShell에서 AppLocker 및 App Control을 지원하는 방법에 대한 자세한 내용은 App Control을 사용하여 PowerShell을 보호하는 방법을 참조하세요.
SBOM(소프트웨어 제품 구성 정보)
PowerShell 7.2부터, 모든 설치 패키지에 SBOM(소프트웨어 제품 구성 정보)이 포함됩니다. 또한 PowerShell 팀은 소유하지만 PowerShell과 독립적으로 제공되는 모듈에 대한 SBOM을 생성합니다.
다음 위치에서 SBOM 파일을 찾을 수 있습니다.
- PowerShell에서 SBOM을 찾습니다
$PSHOME/_manifest/spdx_2.2/manifest.spdx.json. - 모듈의 경우 아래의 모듈 폴더에서 SBOM을 찾습니다
_manifest/spdx_2.2/manifest.spdx.json.
SBOM의 생성 및 게시는 연방 정부의 사이버 보안을 현대화하고 소프트웨어 공급망 보안을 강화하기 위한 첫 번째 단계입니다. 이 이니셔티브에 대한 자세한 내용은 Microsoft의 SPDX를 사용하여 SBOM 생성 블로그 게시물을 참조하세요.
PowerShell 원격에서 데이터 전송 보안
PowerShell v7.6-preview5 Session_Key 이전에는 PowerShell 원격 세션을 보내기 전에 SecureString을 암호화하는 데 사용됩니다. PSRP(PowerShell Remoting Protocol)는 개체를 전송해야 할 때 클라이언트와 서버 간에 키 교환을 SecureString 수행합니다. 교환에는 다음 단계가 포함됩니다.
- 클라이언트 쪽은 퍼블릭/프라이빗 키 쌍을 생성하고 공개 키를 서버에 보냅니다.
- 서버는 대칭 암호화를 위한 세션 키를 생성합니다.
- 서버는 공개 키를 사용하여 세션 키를 암호화하고 클라이언트에 보냅니다.
- 클라이언트와 서버 모두 새 세션 키를 사용하여 SecureString 개체를 암호화합니다.
PowerShell 원격 프로토콜(PSRP)은 키 교환 중에 알고리즘을 사용합니다 RSAEncryptionPadding.Pkcs1 . 알고리즘 은 안전하지 않으므로 키 교환은 추가 보안을 제공하지 않습니다.
중요합니다
PSRP를 통한 보안 데이터 전송을 보장하려면 보안 전송 계층을 사용해야 합니다.
PowerShell v7.6-preview.5부터 키 교환은 더 이상 사용되지 않습니다. PSRP 버전은 v2.4로 증가했으며 다음과 같은 변경 내용을 포함합니다.
클라이언트와 서버가 모두 v2.4 이상인 경우 다음 PSRP 메시지는 더 이상 사용되지 않습니다.
- PUBLIC_KEY
- PUBLIC_KEY_REQUEST
- ENCRYPTED_SESSION_KEY
클라이언트와 서버가 모두 v2.4 이상인 경우 암호화 및 암호 해독 단계를
SecureString건너뜁습니다.
이 변경 내용은 이전 버전과 호환됩니다.
- 이전 클라이언트 또는 서버(v2.3 이하)의 경우 필요한 경우 키 교환이 계속 사용됩니다.
- PSRP는 클라이언트와 서버가 모두 동일한 컴퓨터에 있는 경우 명명된 파이프 원격 세션을 사용할 수 있습니다.
원격 클라이언트가 명명된 파이프에 연결할 수 있고 데이터가 더 이상 세션 키로 암호화되지 않으므로 명명된 파이프(사용
Enter-PSHostProcess)는 원격 클라이언트를 거부합니다.
보안 서비스 기준
PowerShell은 Windows용 Microsoft 보안 서비스 기준을 따릅니다. 보안 기능만 서비스 기준을 충족합니다.
보안 기능
- 비즈니스용 App Control을 사용하여 시스템 잠금
- 비즈니스용 App Control을 사용하는 제한된 언어 모드
심층 방어 기능
- AppLocker를 사용하는 시스템 잠금
- AppLocker를 사용하는 제한된 언어 모드
- 실행 정책
PowerShell