본문 바로가기
운영체제 (LNX,WIN)

Windows 원격 데스크톱 클립보드 및 파일전송 통제

by 날으는물고기 2023. 8. 29.

Windows 원격 데스크톱 클립보드 및 파일전송 통제

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. 예외 처리

  • 스크립트 전체는 trycatch 블록으로 둘러싸여 있습니다.
  • 예외가 발생하면 해당 예외에 따라 사용자에게 메시지를 표시하여 스크립트 오류가 발생했음을 알립니다.

 

이와 같이 시스템 보안을 강화하고 원격 데스크톱 세션에서의 보안 위험을 최소화하기 위한 목적이며, 주의해야 할 점은 실행하기 전에 충분한 테스트와 백업을 수행하고, 필요한 경우 시스템 관리자와 상의하도록 하는 것입니다. 또한 모든 동작과 설정이 조직의 보안 정책과 규정을 준수하는지 확인해야 합니다.

# 클립보드, 파일복사 등 보안을 강화하기 위한 레지스트리 설정
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

댓글