Windows 시스템에서 원격 데스크톱 세션 중 보안 위험을 줄이기 위한 조치를 수행하고자 합니다.
수동처리
- 시작 >> gpedit.msc(로컬 그룹 정책 편집기) >> 컴퓨터 구성 >> 관리 템플릿 >> Windows 구성 요소 >> 터미널 서비스 >> 원격 데스크톱 세션 호스트 >> 장치 및 리소스 리디렉션 >> 클립보드 리디렉션 허용 안 함 >> 사용 >> 확인
여러 가지 레지스트리 설정 및 스케줄 작업을 통해 클립보드 공유, 파일 복사 등을 제한하고 해당 시스템의 상태를 로그로 전송하는 주요 내용과 동작을 설명해드리겠습니다.
1. 레지스트리 설정
- 스크립트는 먼저 레지스트리를 사용하여 원격 데스크톱 서비스 관련 설정을 변경합니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
경로에 다양한 설정 값을 추가합니다.fDisableClip
,fDisableCdm
,fDisableCcm
,ffDisableLPT
,ffDisableCameraRedir
등 여러 설정을1
로 변경하여 원격 데스크톱 세션에서 클립보드, 파일 복사, 카메라 리다이렉션 등을 제한합니다.
2. 실행 제어
- 레지스트리 설정 이후에는 실행을 제어하기 위해 다음과 같은 작업을 수행합니다.
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
경로에DisallowRun
값을 추가하여 실행을 제한합니다.- 특정 실행 파일도 제한합니다. 여기서는
mmc.exe
를 실행하지 못하도록 설정합니다.
3. 스케줄 작업 생성
- 스크립트는 스케줄 작업을 생성하여 주기적으로 실행되도록 합니다.
schtasks.exe
를 사용하여 "Remote hour Check"라는 이름의 작업을 생성합니다.- 이 작업은
c:\security\remote.bat
스크립트를 시간별로 실행하도록 설정합니다. - 작업이 생성되면 현재 사용자에게 메시지를 표시하여 스크립트가 설치 및 구동되었음을 알립니다.
4. 시스템 상태 로그 전송
- 두 번째 부분은 시스템 상태를 로그로 전송하는 부분입니다.
SendTo-SysLog
함수를 정의하여 해당 함수 내에서 다양한 설정 값을 하나의 메시지로 합칩니다.- 이 메시지를 지정된 IP와 포트로 TCP 소켓을 통해 전송합니다.
- 이를 통해 해당 시스템의 설정 상태 및 제한 사항을 외부 서버에 로그로 전달합니다.
5. 예외 처리
- 스크립트 전체는
try
와catch
블록으로 둘러싸여 있습니다. - 예외가 발생하면 해당 예외에 따라 사용자에게 메시지를 표시하여 스크립트 오류가 발생했음을 알립니다.
이와 같이 시스템 보안을 강화하고 원격 데스크톱 세션에서의 보안 위험을 최소화하기 위한 목적이며, 주의해야 할 점은 실행하기 전에 충분한 테스트와 백업을 수행하고, 필요한 경우 시스템 관리자와 상의하도록 하는 것입니다. 또한 모든 동작과 설정이 조직의 보안 정책과 규정을 준수하는지 확인해야 합니다.
# 클립보드, 파일복사 등 보안을 강화하기 위한 레지스트리 설정
try{
# 클립보드 비활성화 설정
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fDisableClip" /t REG_DWORD /d 1 /f
# 클립보드 특수 포맷 비활성화 설정
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fDisableCdm" /t REG_DWORD /d 1 /f
# 클립보드 표준 포맷 비활성화 설정
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fDisableCcm" /t REG_DWORD /d 1 /f
# LPT 포트 리다이렉션 비활성화 설정
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "ffDisableLPT" /t REG_DWORD /d 1 /f
# 카메라 리다이렉션 비활성화 설정
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "ffDisableCameraRedir" /t REG_DWORD /d 1 /f
# 실행 제한 설정
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v "DisallowRun" /t REG_DWORD /d 1 /f
# 특정 실행 파일 제한 (mmc.exe)
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun" /v "mmc" /d mmc.exe /f
# 기존에 "Remote hour Check" 작업이 있는지 확인
$schedule = schtasks /Query | findstr /C:"Remote hour Check"
if($schedule -eq $null){
# "Remote hour Check" 작업 생성
schtasks.exe /create /F /tn "Remote hour Check" /tr "c:\security\remote.bat" /sc hourly /RL HIGHEST
# 사용자에게 메시지로 알림
msg $env:USERNAME "스크립트 설치 및 구동완료"
}
# 레지스트리 설정 값을 변수에 저장
$fDisableClip = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services').fDisableClip
$fDisableCdm = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services').fDisableCdm
$fDisableCcm = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services').fDisableCcm
$ffDisableLPT = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services').ffDisableLPT
$ffDisableCameraRedir = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services').ffDisableCameraRedir
$DisallowRun = (Get-ItemProperty -Path 'Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer').DisallowRun
$mmc = (Get-ItemProperty -Path 'Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun').mmc123
# 설정 값이 없을 경우 "null"로 대체
if($fDisableClip -eq $null){
$fDisableClip = "null"
}
if($fDisableCdm -eq $null){
$fDisableCdm = "null"
}
if($fDisableCcm -eq $null){
$fDisableCcm = "null"
}
if($ffDisableLPT -eq $null){
$ffDisableLPT = "null"
}
if($ffDisableCameraRedir -eq $null){
$ffDisableCameraRedir = "null"
}
if($DisallowRun -eq $null){
$DisallowRun = "null"
}
if($mmc -eq $null){
$mmc = "null"
}
}
catch{
# 오류가 발생하면 사용자에게 오류 메시지 표시
msg $env:USERNAME "스크립트 오류 발생."
}
try{
# 시스템 상태를 로그로 전송하는 함수 정의
function SendTo-SysLog{
Param(
[string] $IP = "IP입력",
[int] $Port = "PORT입력"
)
# 설정 값들을 하나의 메시지로 합침
$msg = [string]$fDisableClip + "," + $fDisableCdm + "," + $fDisableCcm + "," + $ffDisableLPT + "," + $ffDisableCameraRedir + "," + $DisallowRun + "," + $mmc
# TCP 소켓을 통해 메시지 전송
$socket = new-object System.Net.Sockets.TcpClient($IP, $Port)
$stream = $socket.GetStream()
$writer = new-object System.IO.StreamWriter $stream
$writer.WriteLine($msg)
$writer.Close()
$stream.Close()
$socket.Close()
}
# SendTo-SysLog 함수 호출하여 시스템 상태 로그 전송
SendTo-SysLog
}
catch{
# 오류가 발생하면 사용자에게 오류 메시지 표시
msg $env:USERNAME "서버와 통신이 성공하지 않았습니다."
}
위 스크립트 코드는 원격 데스크톱 환경에서의 보안 강화를 위해 여러 설정을 조작하고, 시스템 상태를 로그로 전송하는 스크립트입니다. 주의하여 실행해야하며, 이러한 변경 사항 이 조직의 정책을 준수하며 수행되어야 합니다.
728x90
댓글