분류 전체보기: 279개의 글

[보안장비-Security] SWG(Secure Web Gateway)

Posted by nkjok
2025. 6. 15. 19:20 인프라/보안장비-Security
반응형

네트워크 보안의 핵심, SWG(Secure Web Gateway)의 이해

디지털 전환이 가속화되면서 기업의 네트워크 환경은 점점 더 복잡해지고 있으며, 이에 따라 보안 위협도 정교해지고 있다. 특히 클라우드 기반 업무 환경과 원격 근무의 확산은 기존의 경계 기반 보안 모델의 한계를 드러내고 있다. 이러한 변화 속에서 기업은 외부 웹 트래픽에 대한 실시간 보안 제어가 가능한 솔루션을 필요로 하며, 그 중심에 **SWG(Secure Web Gateway)**가 있다. 본 글에서는 SWG의 정의, 주요 기능, 기술적 동작 방식, 그리고 기업 환경에서의 역할에 대해 심층적으로 살펴본다.

 

 

1. SWG란 무엇인가?

**Secure Web Gateway(SWG)**는 사용자의 웹 트래픽을 필터링하고, 악성 콘텐츠를 차단하며, 기업의 보안 정책을 적용하는 네트워크 보안 장비 또는 클라우드 기반 서비스이다. SWG는 일반적으로 인터넷으로 나가는 모든 HTTP/HTTPS 트래픽을 중간에서 검사하고, 위협 요소를 차단하거나 로깅하며, 사용자 활동을 제어한다.

 

 

2. SWG의 주요 기능

SWG는 단순한 웹 필터링을 넘어 다음과 같은 고급 보안 기능을 제공한다:

2.1 URL 필터링

  • 사전 정의된 카테고리 또는 블랙리스트 기반으로 웹사이트 접근을 제어한다.
  • 사용자 그룹별로 정책을 다르게 적용할 수 있다.

2.2 악성 코드 탐지 및 차단

  • 웹 페이지, 다운로드 파일, 스크립트 등을 실시간으로 분석하여 악성 요소를 탐지한다.
  • 시그니처 기반 탐지 외에도 행동 기반 분석(Behavioral Analysis), 샌드박싱(Sandboxing) 기술을 활용한다.

2.3 HTTPS 트래픽 복호화 및 검사

  • SSL/TLS 트래픽을 중간에서 복호화(SSL Inspection)하여 암호화된 위협을 탐지한다.
  • 프라이버시 및 성능 이슈를 고려해 예외 도메인 설정이 가능하다.

2.4 데이터 유출 방지(DLP)

  • 웹을 통한 민감 정보의 외부 유출을 방지하기 위해 콘텐츠를 검사하고 정책을 적용한다.
  • 예: 주민등록번호, 신용카드 번호, 기업 기밀 문서 등.

2.5 사용자 인증 및 정책 기반 제어

  • LDAP, SAML, OAuth 등과 연동하여 사용자 인증을 수행하고, 사용자별/그룹별 정책을 적용한다.

 

3. 기술적 동작 방식

SWG는 네트워크 트래픽을 중간에서 가로채고 분석하는 프록시 기반 아키텍처를 주로 사용한다. 동작 방식은 다음과 같다:

3.1 프록시 아키텍처

  • 사용자의 웹 요청은 먼저 SWG를 거치며, SWG는 해당 요청을 분석한 후 인터넷으로 전달한다.
  • 응답 역시 SWG를 통해 사용자에게 전달되며, 이 과정에서 콘텐츠 검사 및 정책 적용이 이루어진다.

3.2 SSL/TLS 복호화

  • HTTPS 요청 시, SWG는 자체 서명된 인증서를 사용자에게 제공하고, 실제 서버와는 별도로 TLS 세션을 맺는다.
  • 이를 통해 암호화된 콘텐츠를 복호화하여 검사할 수 있다.

3.3 클라우드 기반 SWG

  • 온프레미스 장비 대신 클라우드에서 제공되는 SWG는 글로벌 PoP(Point of Presence)를 통해 트래픽을 처리한다.
  • ZTNA(Zero Trust Network Access) 및 SASE(Secure Access Service Edge) 아키텍처와 통합되어 원격 근무 환경에서도 보안을 유지할 수 있다.

 

4. 기업 환경에서의 역할

SWG는 다음과 같은 보안 및 운영상의 이점을 제공한다:

  • 보안 강화: 웹 기반 위협(피싱, 랜섬웨어, 드라이브 바이 다운로드 등)에 대한 실시간 방어.
  • 정책 준수: 기업의 보안 정책 및 컴플라이언스 요구사항을 일관되게 적용.
  • 가시성 확보: 사용자 웹 활동에 대한 로깅 및 분석을 통해 이상 행위 탐지 가능.
  • 유연한 확장성: 클라우드 기반 SWG는 지사, 원격 근무자 등 다양한 환경에 쉽게 적용 가능.

 

SWG는 단순한 웹 필터링 장비를 넘어, 현대 기업의 보안 전략에서 핵심적인 역할을 수행하는 보안 게이트웨이이다. 특히 클라우드 전환과 원격 근무가 일상화된 오늘날, SWG는 네트워크 경계가 사라진 환경에서도 일관된 보안 정책을 적용하고, 웹 기반 위협으로부터 기업 자산을 보호하는 데 필수적인 솔루션이다. 향후에는 AI 기반 위협 탐지, 사용자 행동 분석(UEBA), SASE 통합 등과의 연계를 통해 더욱 지능화된 보안 플랫폼으로 진화할 것으로 기대된다.

🔍 SWG vs. L7 스위치 : 비교

기능 목적 보안: 웹 트래픽 필터링, 악성 코드 차단, 정책 적용 트래픽 분산: 애플리케이션 기반 로드 밸런싱
주요 역할 사용자 웹 요청 검사 및 제어 HTTP/HTTPS 요청을 기반으로 서버에 트래픽 분산
동작 계층 OSI 7계층 중 애플리케이션 계층 동일하게 Layer 7에서 동작
기술적 동작 프록시 방식으로 트래픽 중간 분석 및 제어 패킷의 URL, 쿠키, 헤더 등을 기반으로 라우팅
보안 기능 URL 필터링, SSL 복호화, DLP, 악성 탐지 등 보안 기능은 제한적, 주로 트래픽 최적화에 집중
사용 위치 인터넷 경계, 사용자와 외부 간 데이터센터 내부, 서버 앞단

 

  • SWG는 보안 장비이고, L7 스위치는 네트워크 최적화 장비입니다.
  • 둘 다 Layer 7에서 동작하지만, SWG는 보안 정책 적용과 위협 탐지에 초점, L7 스위치는 트래픽 분산과 애플리케이션 성능 향상에 초점을 둡니다.

 

[ Layer 7에서 동작하는 보안 프록시 ]

 

반응형

[Python] 패킷 필터 도구 코드 해설

Posted by nkjok
2025. 5. 27. 12:31 낙서장[1]/94. Python
반응형

[소스코드]

import socket
import struct

def capture_packets(interface):
    sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
    sock.bind((interface, 0))

    while True:
        packet = sock.recvfrom(65565)[0]

        eth_length = 14
        eth_header = packet[:eth_length]
        eth = struct.unpack('!6s6sH', eth_header)
        eth_protocol = socket.ntohs(eth[2])

        if eth_protocol == 8:  # IP 패킷
            ip_header = packet[eth_length:eth_length+20]
            iph = struct.unpack('!BBHHHBBH4s4s', ip_header)
            version_ihl = iph[0]
            ihl = version_ihl & 0xF
            iph_length = ihl * 4
            protocol = iph[6]
            s_addr = socket.inet_ntoa(iph[8])
            d_addr = socket.inet_ntoa(iph[9])

            print(f'[IP] From: {s_addr} To: {d_addr} Protocol: {protocol}')

            if protocol == 6:  # TCP
                t = eth_length + iph_length
                tcp_header = packet[t:t+20]
                tcph = struct.unpack('!HHLLBBHHH', tcp_header)
                source_port = tcph[0]
                dest_port = tcph[1]
                sequence = tcph[2]
                acknowledgment = tcph[3]
                doff_reserved = tcph[4]
                tcph_length = doff_reserved >> 4

                print(f'[TCP] Src Port: {source_port} Dst Port: {dest_port} Seq: {sequence} Ack: {acknowledgment}')

                h_size = eth_length + iph_length + tcph_length * 4
                data = packet[h_size:]
                print(f'[Data] {data[:64]}...')  # 처음 64바이트만 출력

            elif protocol == 17:  # UDP
                u = eth_length + iph_length
                udp_header = packet[u:u+8]
                udph = struct.unpack('!HHHH', udp_header)
                source_port = udph[0]
                dest_port = udph[1]
                length = udph[2]

                print(f'[UDP] Src Port: {source_port} Dst Port: {dest_port} Length: {length}')

                h_size = eth_length + iph_length + 8
                data = packet[h_size:]
                print(f'[Data] {data[:64]}...')  # 처음 64바이트만 출력

if __name__ == "__main__":
    capture_packets("eth0")  # 실제 사용하는 인터페이스 이름으로 변경

 

 1. 모듈 임포트

import socket
import struct
  • socket: 네트워크 통신을 위한 저수준 소켓 API를 제공합니다.
  • struct: 바이트 데이터를 구조체로 변환하거나 그 반대로 변환할 때 사용합니다 (예: 패킷 헤더 파싱).

 2. 패킷 캡처 함수 정의

def capture_packets(interface):
  • interface: 예를 들어 "eth0" 또는 "wlan0" 같은 네트워크 인터페이스 이름을 인자로 받습니다.

 3. RAW 소켓 생성 및 바인딩

    sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
    sock.bind((interface, 0))
  • AF_PACKET: 이더넷 프레임을 직접 캡처할 수 있는 소켓 타입 (Linux 전용).
  • SOCK_RAW: 원시 소켓으로, 모든 패킷을 캡처할 수 있습니다.
  • 0x0003: 모든 프로토콜을 캡처하겠다는 의미 (ETH_P_ALL).
  • bind: 특정 인터페이스에 소켓을 바인딩합니다.

 4. 무한 루프에서 패킷 수신

    while True:
        packet = sock.recvfrom(65565)[0]
  • recvfrom: 최대 65565 바이트까지 수신.
  • [0]: 실제 패킷 데이터만 추출 (두 번째 값은 송신자 주소).

 5. 이더넷 헤더 파싱

        eth_length = 14
        eth_header = packet[:eth_length]
        eth = struct.unpack('!6s6sH', eth_header)
        eth_protocol = socket.ntohs(eth[2])
  • 이더넷 헤더는 14바이트: 목적지 MAC(6) + 출발지 MAC(6) + 프로토콜(2)
  • !6s6sH: 네트워크 바이트 순서로 6바이트 문자열 2개와 2바이트 정수
  • eth_protocol: 상위 계층 프로토콜 (예: 0x0800은 IP)

 6. IP 패킷인지 확인

        if eth_protocol == 8:  # IP 패킷
  • 0x0800은 IP 프로토콜을 의미합니다. 8은 ntohs(0x0800)의 결과입니다.

 7. IP 헤더 파싱

            ip_header = packet[eth_length:eth_length+20]
            iph = struct.unpack('!BBHHHBBH4s4s', ip_header)
  • IP 헤더는 최소 20바이트.
  • iph: IP 헤더 필드들을 튜플로 파싱.
            version_ihl = iph[0]
            ihl = version_ihl & 0xF
            iph_length = ihl * 4
            protocol = iph[6]
            s_addr = socket.inet_ntoa(iph[8])
            d_addr = socket.inet_ntoa(iph[9])
  • ihl: IP 헤더 길이 (단위: 4바이트)
  • protocol: 상위 계층 프로토콜 (TCP=6, UDP=17 등)
  • s_addr, d_addr: 출발지/목적지 IP 주소

 8. TCP 패킷 처리

            if protocol == 6:  # TCP
  • TCP 프로토콜이면...
                t = eth_length + iph_length
                tcp_header = packet[t:t+20]
                tcph = struct.unpack('!HHLLBBHHH', tcp_header)
  • TCP 헤더는 최소 20바이트.
  • tcph: TCP 헤더 필드들을 파싱.
                source_port = tcph[0]
                dest_port = tcph[1]
                sequence = tcph[2]
                acknowledgment = tcph[3]
                doff_reserved = tcph[4]
                tcph_length = doff_reserved >> 4
  • tcph_length: TCP 헤더 길이 (단위: 4바이트)
                h_size = eth_length + iph_length + tcph_length * 4
                data = packet[h_size:]
                print(f'[Data] {data[:64]}...')  # 처음 64바이트만 출력
  • 실제 데이터(payload)를 추출하고 처음 64바이트만 출력

 9. UDP 패킷 처리

            elif protocol == 17:  # UDP
  • UDP 프로토콜이면...
                u = eth_length + iph_length
                udp_header = packet[u:u+8]
                udph = struct.unpack('!HHHH', udp_header)
  • UDP 헤더는 8바이트
                source_port = udph[0]
                dest_port = udph[1]
                length = udph[2]
  • 포트 번호와 길이 출력
                h_size = eth_length + iph_length + 8
                data = packet[h_size:]
                print(f'[Data] {data[:64]}...')  # 처음 64바이트만 출력
  • UDP 데이터도 처음 64바이트만 출력

 요약

이 코드는 다음을 수행합니다:

  1. 네트워크 인터페이스에서 모든 패킷을 캡처
  2. 이더넷 → IP → TCP/UDP 헤더를 파싱
  3. 출발지/목적지 IP, 포트, 데이터 일부를 출력
    출력결과

 

반응형

'낙서장[1] > 94. Python' 카테고리의 다른 글

[Python] 함수 def 사용방법  (0) 2025.02.09

[IT실습] 스니핑 도구 만들기 실습

Posted by nkjok
2025. 5. 27. 12:16 실습/IT실습
반응형

Python의 raw socket 기능을 활용해 직접 패킷 스니퍼를 socket과 struct 모듈을 이용해 TCP/UDP 패킷을 실시간으로 캡처하고, 간단한 필터링하는 과정입니다


 준비물

  • 리눅스 환경 (WSL, Ubuntu 등)
  • Python 3.x
  • 루트 권한 (sudo)

 요약

  • Raw Socket: 운영체제의 네트워크 스택을 우회해, 이더넷 프레임부터 직접 접근할 수 있는 소켓.
  • Ethernet Header: MAC 주소와 프로토콜 정보를 담고 있음.
  • IP Header: 송수신 IP, 프로토콜(TCP/UDP) 정보 포함.
  • TCP/UDP Header: 포트 번호, 시퀀스 번호 등 전송 계층 정보 포함.

 코드 설명

 
  • AF_PACKET: 이더넷 프레임 단위로 수신
  • SOCK_RAW: 원시 패킷 수신
  • 0x0003: 모든 프로토콜 수신
 
  • 이더넷 헤더는 14바이트
  • !6s6sH: 목적지 MAC, 출발지 MAC, 프로토콜
 
  • IP 헤더에서 프로토콜 번호 추출
  • 6은 TCP, 17은 UDP
 
  • TCP 헤더에서 포트, 시퀀스, ACK 번호 추출

실행 방법

  1. 파일 저장: packet_sniffer.py
  2. 실행:
 
  1. 출력 예시:
[IP] From: 192.168.0.10 To: 192.168.0.1 Protocol: 6
[TCP] Src Port: 443 Dst Port: 52344 Seq: 123456 Ack: 654321
[Data] b'GET / HTTP/1.1\r\nHost: example.com\r\n'...

 


출력결과

 

 

 

 

[소스코드]

import socket
import struct

def capture_packets(interface):
    sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
    sock.bind((interface, 0))

    while True:
        packet = sock.recvfrom(65565)[0]

        eth_length = 14
        eth_header = packet[:eth_length]
        eth = struct.unpack('!6s6sH', eth_header)
        eth_protocol = socket.ntohs(eth[2])

        if eth_protocol == 8:  # IP 패킷
            ip_header = packet[eth_length:eth_length+20]
            iph = struct.unpack('!BBHHHBBH4s4s', ip_header)
            version_ihl = iph[0]
            ihl = version_ihl & 0xF
            iph_length = ihl * 4
            protocol = iph[6]
            s_addr = socket.inet_ntoa(iph[8])
            d_addr = socket.inet_ntoa(iph[9])

            print(f'[IP] From: {s_addr} To: {d_addr} Protocol: {protocol}')

            if protocol == 6:  # TCP
                t = eth_length + iph_length
                tcp_header = packet[t:t+20]
                tcph = struct.unpack('!HHLLBBHHH', tcp_header)
                source_port = tcph[0]
                dest_port = tcph[1]
                sequence = tcph[2]
                acknowledgment = tcph[3]
                doff_reserved = tcph[4]
                tcph_length = doff_reserved >> 4

                print(f'[TCP] Src Port: {source_port} Dst Port: {dest_port} Seq: {sequence} Ack: {acknowledgment}')

                h_size = eth_length + iph_length + tcph_length * 4
                data = packet[h_size:]
                print(f'[Data] {data[:64]}...')  # 처음 64바이트만 출력

            elif protocol == 17:  # UDP
                u = eth_length + iph_length
                udp_header = packet[u:u+8]
                udph = struct.unpack('!HHHH', udp_header)
                source_port = udph[0]
                dest_port = udph[1]
                length = udph[2]

                print(f'[UDP] Src Port: {source_port} Dst Port: {dest_port} Length: {length}')

                h_size = eth_length + iph_length + 8
                data = packet[h_size:]
                print(f'[Data] {data[:64]}...')  # 처음 64바이트만 출력

if __name__ == "__main__":
    capture_packets("eth0")  # 실제 사용하는 인터페이스 이름으로 변경

~      

 

반응형

[etc-기타] Linux/Mac, CMD, PowerShell에서 *.Identifier 삭제방법

Posted by nkjok
2025. 5. 9. 15:30 OS&기타/etc-기타
반응형

🚨 주의:
모든 파일이 복구 불가능하게 삭제되므로, 실행 전 테스트 필수 !

 

 

폴더 안에 여러 개의 하위 폴더가 있고, 그 안에 있는 모든 *.Identifier 파일을 삭제하고 싶다면, 다음 명령어를 사용하면 됩니다.

 

 

🔹 Linux / macOS (터미널)

find /micro-service1 -type f -name "*.Identifier" -exec rm -f {} +

설명

  • find /micro-service1 -type f -name "*.Identifier" → micro-service1 폴더 내부의 모든 파일 검색
  • -exec rm -f {} + → 검색된 파일을 삭제

 

 

🔹 Windows (CMD)

for /R C:\micro-service1 %f in (*.Identifier) do del "%f"

설명

  • /R 옵션을 사용해 폴더 내부까지 탐색
  • *.Identifier 파일을 찾아서 삭제

 

 

🔹 Windows (PowerShell)

Get-ChildItem -Path C:\micro-service1 -Recurse -Filter "*.Identifier" | Remove-Item -Force

설명

  • Get-ChildItem을 사용하여 모든 하위 폴더를 탐색
  • "*.Identifier" 파일을 찾은 후 삭제

 

반응형

[Java] VSCode Explorer 초기화 방법

Posted by nkjok
2025. 5. 9. 14:05 낙서장[1]/91. Java
반응형

VSCode Explorer 초기화 방법

Explorer 뷰 새로고침

Ctrl + Shift + P를 눌러 명령 팔레트를 열고
"View: Refresh Explorer" 입력 후 실행
파일 목록이 새로고침되면서 정상적으로 표시될 수 있음

반응형