PowerShell 로깅 소개
PowerShell 로깅 소개 (Linux와 macOS)
PowerShell이 엔진과 공급자, cmdlet에서 일어난 내부 동작을 어떻게 로그로 남기는지 알아볼게요. 이 문서에서는 Linux와 macOS에서 로그가 어디에 쌓이고, 어떻게 설정하고, 어떻게 확인하는지 하나씩 설명해 드려요.
본문
짧은 설명
PowerShell은 엔진, 공급자, cmdlet에서 발생한 내부 작업을 로그로 기록해요.
자세한 설명
PowerShell은 엔진의 시작·종료, 공급자의 시작·종료 같은 작업 내용을 자세히 기록하고, PowerShell 명령에 대한 세부 정보도 남겨요.
Windows PowerShell 5.1에서의 로깅에 대한 내용은 about_Logging 문서를 참고해 주세요.
로그가 저장되는 위치는 플랫폼에 따라 달라요.
- Linux에서는 PowerShell이 systemd 저널(journal)에 로그를 기록하며, 여기서 syslog 서버로 전달할 수 있어요. 자세한 내용은 사용 중인 Linux 배포판의 man 페이지를 확인해 보세요.
- macOS에서는 Apple의 통합 로깅 시스템(unified logging system)을 사용해요. 자세한 내용은 Apple의 로깅 개발자 문서를 참고하세요.
PowerShell은 두 가지 범주의 로깅을 설정할 수 있어요.
모듈 로깅(Module logging) — 지정한 모듈의 멤버에서 실행되는 파이프라인 실행 이벤트를 기록해요. 모듈 로깅은 세션과 특정 모듈 모두에서 활성화해야 해요. 설정 방법은 about_PowerShell_Config 문서를 참고하세요.
구성(configuration)을 통해 모듈 로깅을 활성화했다면, 모듈의 LogPipelineExecutionDetails 속성 값을 바꿔 세션에서 특정 모듈의 로깅을 켜거나 끌 수 있어요.
예를 들어 PSReadLine 모듈의 모듈 로깅을 활성화하려면 이렇게 해요:
$psrl = Get-Module PSReadLine
$psrl.LogPipelineExecutionDetails = $true
Get-Module PSReadLine | Select-Object Name, LogPipelineExecutionDetails
Name LogPipelineExecutionDetails
---- ---------------------------
PSReadLine True
스크립트 블록 로깅(Script block logging) — 대화형으로든 자동화를 통해서든 호출되는 명령, 스크립트 블록, 함수, 스크립트의 처리를 기록해요.
Script Block Logging을 활성화하면 PowerShell이 처리하는 모든 스크립트 블록의 내용을 기록해요. 일단 활성화되면 이후 새로 시작하는 모든 PowerShell 세션이 이 정보를 기록하게 되죠.
참고
Script Block Logging을 진단 목적이 아닌 용도로 사용한다면, Protected Event Logging을 함께 활성화하는 걸 권장해요. 자세한 내용은 about_PowerShell_Config 문서를 참고하세요.
Linux나 macOS에서 로깅 설정하기
Linux와 macOS의 로깅 설정은 powershell.config.json 파일에 저장돼요. 이 파일은 PowerShell $PSHOME 디렉터리에 있는 JSON 형식 파일로, 기본 설정을 바꾸려면 파일이 없다면 직접 만들어 줘야 해요. PowerShell 설치본마다 저마다의 파일 사본을 사용해요.
기본적으로 PowerShell은 Operational 채널에 Informational 수준의 로깅을 활성화해요. verbose 같은 추가 로그 출력이나 분석 로그(analytic log) 출력이 필요하다면 구성을 변경하면 돼요.
다음은 구성 예시예요:
{
"ModuleLogging": {
"EnableModuleLogging": false,
"ModuleNames": [
"PSReadLine",
"PowerShellGet"
]
},
"ScriptBlockLogging": {
"EnableScriptBlockInvocationLogging": true,
"EnableScriptBlockLogging": true
},
"LogLevel": "verbose"
}
PowerShell 로깅을 구성하는 속성 목록은 다음과 같아요. 구성에 나열되지 않은 속성은 기본값을 사용해요.
LogIdentity
- 값:
<문자열 이름>,powershell - 설명: 로깅할 때 사용할 이름이에요. 기본 정체성은
powershell이에요. 이 값을 쓰면 release 버전과 beta 버전처럼 한 PowerShell 설치본의 두 인스턴스를 구분할 수 있어요. 이 값은 로그 출력을 별도 파일로 리다이렉트할 때도 사용돼요.
LogChannels
- 값:
Operational,Analytic - 설명: 활성화할 채널이에요. 둘 이상을 지정할 때는 쉼표로 구분해요. 기본값은
Operational이에요.
LogLevel
- 값:
Always,Critical,Error,Warning,Informational,Verbose,Debug - 설명: 하나의 값을 지정해요. 값들은 장황함(verbosity)이 커지는 순서대로 나열돼요. 선택한 값은 자기 자신과 그 이전의 모든 값을 활성화해요. 기본값은
Informational이에요.
LogKeywords
- 값:
Runspace,Pipeline,Protocol,Transport,Host,Cmdlets,Serializer,Session,ManagedPlugin - 설명: 키워드는 로깅을 PowerShell 내 특정 구성 요소로 제한할 수 있게 해줘요. 기본적으로 모든 키워드가 활성화되어 있고, 이 값을 바꾸는 것은 전문적인 문제 해결에만 유용해요.
PowerShellPolicies
- 설명:
PowerShellPolicies설정은ModuleLogging,ProtectedEventLogging,ScriptBlockLogging옵션을 담아요. 자세한 내용은 "Common configuration settings"를 참고하세요.
Linux의 journald에서 PowerShell 로그 데이터 보기
PowerShell은 Ubuntu나 Red Hat Enterprise Linux(RHEL) 같은 Linux 배포판에서 journald 데몬을 통해 systemd 저널에 로그를 기록해요.
journald 데몬은 로그 메시지를 이진 형식으로 저장해요. journalctl 유틸리티를 사용해 저널 로그에서 PowerShell 항목을 조회할 수 있어요.
journalctl --grep powershell
journald 데몬은 로그 메시지를 시스템 로깅 프로토콜(Syslog) 서버로 전달할 수 있어요. Linux 시스템에서 syslog 로깅을 사용하고 싶다면 /etc/systemd/journald.conf journald 구성 파일에서 ForwardToSysLog 옵션을 활성화하세요. 많은 Linux 배포판에서 이 값이 기본 구성이에요.
Linux의 syslog에서 PowerShell 로그 데이터 보기
Linux 시스템에서 syslog 로깅을 사용하고 싶다면 사용 중인 배포판의 패키지 관리자로 rsyslog 같은 syslog 서버를 설치해요. Ubuntu 같은 일부 배포판은 rsyslog를 미리 설치해 두기도 해요.
syslog 프로토콜은 로그 메시지를 표준화된 텍스트 형식으로 저장해요. 어떤 텍스트 처리 유틸리티를 써도 syslog 내용을 조회하거나 볼 수 있어요.
기본적으로 syslog는 다음 위치에 로그 항목을 기록해요.
- Ubuntu를 포함한 Debian 계열 배포판:
/var/log/syslog - RHEL 계열 배포판:
/var/log/messages
다음 예시는 Ubuntu에서 cat 명령으로 PowerShell syslog 항목을 조회해요.
cat /var/log/syslog | grep -i powershell
Syslog 메시지 형식
Syslog 메시지는 다음과 같은 형식이에요.
TIMESTAMP MACHINENAME powershell[PID]: (COMMITID:TID:CID)
[EVENTID:TASK.OPCODE.LEVEL] MESSAGE
TIMESTAMP— 로그 항목이 생성된 날짜/시간이에요.MACHINENAME— 로그가 생성된 시스템의 이름이에요.PID— 로그 항목을 기록한 프로세스의 프로세스 ID예요.COMMITID— 빌드를 만드는 데 사용된 git commit ID나 태그예요.TID— 로그 항목을 기록한 스레드의 스레드 ID예요.CID— 로그 항목의 16진수 채널 식별자예요.0x10= Operational0x11= Analytic
EVENTID— 로그 항목의 이벤트 식별자예요.TASK— 이벤트 항목의 작업 식별자예요.OPCODE— 이벤트 항목의 opcode예요.LEVEL— 이벤트 항목의 로그 수준이에요.MESSAGE— 이벤트 항목과 연결된 메시지예요.
EVENTID, TASK, OPCODE, LEVEL은 Windows 이벤트 로그에 기록할 때 사용하는 값과 같아요.
PowerShell 로그 메시지를 별도 파일로 쓰기
PowerShell 로그 항목을 별도 파일로 리다이렉트할 수도 있어요. 별도 파일로 리다이렉트되면 더 이상 기본 syslog 파일에는 기록되지 않아요.
다음 단계는 Ubuntu에서 PowerShell 로그 항목을 powershell.log라는 로그 파일에 쓰도록 구성해요.
- nano 같은 텍스트 편집기로
/etc/rsyslog.d디렉터리에 PowerShell 로그 구성을 위한 conf 파일을 만들어요. 기본값보다 작은 숫자를 파일명 앞에 붙여요. 예를 들어 기본값이50-default.conf라면40-powershell.conf처럼요.
sudo nano /etc/rsyslog.d/40-powershell.conf
40-powershell.conf파일에 다음 내용을 추가해요.
:syslogtag, contains, "powershell[" /var/log/powershell.log
& stop
/etc/rsyslog.conf에 새 파일을 포함하는 include 문이 있는지 확인해요. 다음과 같은 일반적인 include 문이 새 파일을 포함해 줄 수도 있어요.
$IncludeConfig /etc/rsyslog.d/*.conf
없다면 include 문을 수동으로 추가해야 해요.
- 속성과 권한이 올바르게 설정됐는지 확인해요.
ls -l /etc/rsyslog.d/40-powershell.conf
-rw-r--r-- 1 root root 67 Nov 28 12:51 40-powershell.conf
만약 40-powershell.conf 파일의 소유권이나 권한이 다르다면 다음 단계를 진행해요.
- 소유권을 root로 설정해요.
sudo chown root:root /etc/rsyslog.d/40-powershell.conf
- 접근 권한을 설정해요 — root는 읽기/쓰기, 일반 사용자는 읽기.
sudo chmod 644 /etc/rsyslog.d/40-powershell.conf
- rsyslog 서비스를 다시 시작해요.
sudo systemctl restart rsyslog.service
pwsh를 실행해 로그로 기록할 PowerShell 정보를 만들어요.
pwsh
참고
/var/log/powershell.log파일은 rsyslog 서비스를 다시 시작하고 PowerShell이 로그 정보를 생성한 뒤에야 만들어져요.
powershell.log파일을 조회해 PowerShell 정보가 새 파일에 기록되고 있는지 확인해요.
cat /var/log/powershell.log
macOS에서 PowerShell 로그 데이터 보기
PowerShell은 Apple의 통합 로깅 시스템(unified logging system)에 로그를 기록해요. 이 시스템은 시스템 로그와 애플리케이션 로그를 한곳에 모아 수집·저장하는 macOS의 기능이에요.
Apple의 통합 로깅 시스템은 로그 메시지를 이진 형식으로 저장해요. PowerShell 로그 이벤트를 조회하려면 log 도구를 사용해야 해요. PowerShell 로그 이벤트는 macOS의 Console 앱에는 나타나지 않아요. Console 앱은 통합 로깅 시스템 이전의 syslog 기반 로깅을 위해 설계된 거예요.
macOS에서 명령줄로 PowerShell 로그 데이터 보기
macOS에서 명령줄로 PowerShell 로그 데이터를 보려면 Terminal이나 다른 셸 호스트 앱에서 log 명령을 사용해요. 이 명령들은 PowerShell, Z Shell, Bash 어디서든 실행할 수 있어요.
다음 예시에서 log 명령은 시스템에서 실시간으로 발생하는 로그 데이터를 보여줘요. process 매개 변수는 로그 데이터를 pwsh 프로세스만으로 필터링해요. pwsh 인스턴스가 여러 개 실행 중이라면 process 매개 변수에 프로세스 ID를 값으로 줄 수도 있어요. level 매개 변수는 지정한 수준과 그 이하의 메시지를 보여줘요.
log stream --predicate "subsystem == 'com.microsoft.powershell'" --level info
log show 명령은 로그 항목을 내보낼 때 사용해요. log show 명령은 마지막 N개 항목, 특정 시점 이후 항목, 특정 시간 범위 내 항목을 내보내는 옵션을 제공해요.
예를 들어 다음 명령은 2022년 4월 5일 오전 9시 이후의 항목을 내보내요.
log show --start "2022-04-05 09:00:00" --predicate "subsystem == 'com.microsoft.powershell'"
자세한 내용은 log show --help를 실행해 log show 명령의 도움말을 확인하면 돼요.
로그 데이터를 JSON 형식으로도 출력할 수 있어요. 그러면 이벤트 데이터를 PowerShell 객체로 변환할 수 있어요. 다음 예시는 이벤트를 JSON 형식으로 출력해요. ConvertFrom-Json cmdlet으로 JSON 데이터를 PowerShell 객체로 변환해서 $logRecord 변수에 저장해요.
log show --predicate "subsystem == 'com.microsoft.powershell'" --style json |
ConvertFrom-Json | Set-Variable logRecord
로그를 보안 정보 및 이벤트 관리(SIEM) 수집기처럼 더 안전한 위치에 저장하는 것도 고려해 볼 만해요. Microsoft Defender for Cloud Apps를 사용하면 Azure에서 SIEM을 설정할 수 있어요. 자세한 내용은 "Generic SIEM integration"을 참고하세요.
macOS에서 PowerShell 로그 데이터의 모드와 수준
기본적으로 PowerShell 서브시스템은 macOS에서 info 수준 메시지를 메모리(모드)로 기록하고, default 수준 메시지를 디스크(영속성)에 기록해요. 이 동작은 log config 명령으로 다른 모드와 수준의 로깅을 활성화하도록 바꿀 수 있어요.
다음 예시는 PowerShell 서브시스템에 info 수준 로깅과 영속성을 활성화해요.
sudo log config --subsystem com.microsoft.powershell --mode level:info,persist:info
reset 매개 변수로 PowerShell 서브시스템의 로그 설정을 기본값으로 되돌릴 수 있어요.
sudo log config --subsystem com.microsoft.powershell --reset
더 알아보기
- about_Logging — Windows PowerShell 5.1 로깅
- about_Logging_Windows — Windows에서의 로깅
- about_PowerShell_Config — 로깅 구성 설정
- Linux syslog와 rsyslog.conf 정보 — Linux 컴퓨터의 로컬 man 페이지
- macOS 로깅 정보 — Apple의 로깅 개발자 문서
- Generic SIEM integration — Azure에서 SIEM 설정