pfSense 로그 수집
이 문서에서는 Bindplane을 사용하여 pfSense 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
pfSense는 FreeBSD를 기반으로 하는 오픈소스 방화벽 및 라우터 소프트웨어 배포입니다. 스테이트풀(Stateful) 패킷 필터링, VPN, 트래픽 형태, NAT, DHCP 서버, DNS 전달자, 침입 감지 기능을 제공하며, 이 모든 기능은 웹 기반 인터페이스를 통해 관리됩니다. 파서는 pfSense syslog 형식 로그에서 필드를 추출합니다. grok을 사용하여 로그 메시지를 파싱한 다음 이러한 값을 통합 데이터 모델 (UDM)에 매핑합니다. 또한 이벤트 소스 및 유형의 기본 메타데이터 값을 설정합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Windows Server 2016 이상 또는
systemd가 설치된 Linux 호스트 - 프록시 뒤에서 실행하는 경우 Bindplane 에이전트 요구사항에 따라 방화벽 포트가 열려 있는지 확인합니다.
- pfSense 웹 인터페이스에 대한 액세스 권한
Google SecOps 수집 인증 파일 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 수집 에이전트로 이동합니다.
- 데이터 수집 인증 파일을 다운로드합니다. Bindplane이 설치될 시스템에 파일을 안전하게 저장합니다.
Google SecOps 고객 ID 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 프로필로 이동합니다.
- 조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.
Bindplane 에이전트 설치
다음 안내에 따라 Windows 또는 Linux 운영체제에 Bindplane 에이전트를 설치합니다.
Windows 설치
- 명령 프롬프트 또는 PowerShell을 관리자로 엽니다.
다음 명령어를 실행합니다.
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet설치가 완료될 때까지 기다립니다.
다음을 실행하여 설치를 확인합니다.
sc query observiq-otel-collector
서비스가 실행 중으로 표시되어야 합니다.
Linux 설치
- 루트 또는 sudo 권한으로 터미널을 엽니다.
다음 명령어를 실행합니다.
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh설치가 완료될 때까지 기다립니다.
다음을 실행하여 설치를 확인합니다.
sudo systemctl status observiq-otel-collector
서비스가 active (running)으로 표시되어야 합니다.
추가 설치 리소스
추가 설치 옵션 및 문제 해결은 Bindplane 에이전트 설치 가이드를 참고하세요.
syslog를 수집하여 Google SecOps로 전송하도록 Bindplane 에이전트 구성
구성 파일 찾기
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
구성 파일 설정
config.yaml의 전체 내용을 다음 구성으로 바꿉니다.receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: 'PFSENSE' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
구성 매개변수
다음 자리표시자를 바꿉니다.
수신기 구성:
udplog: UDP syslog의 경우udplog, TCP syslog의 경우tcplog사용0.0.0.0: 리슨할 IP 주소 (모든 인터페이스에서 리슨하려면0.0.0.0)514: 리슨할 포트 번호 (표준 syslog 포트)
내보내기 도구 구성:
creds_file_path: 수집 인증 파일의 전체 경로입니다.- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
YOUR_CUSTOMER_ID: 고객 ID 가져오기 섹션의 고객 IDendpoint: 지역 엔드포인트 URL:- 미국:
malachiteingestion-pa.googleapis.com - 유럽:
europe-malachiteingestion-pa.googleapis.com - 아시아:
asia-southeast1-malachiteingestion-pa.googleapis.com - 전체 목록은 리전 엔드포인트를 참고하세요.
- 미국:
log_type: Chronicle에 표시되는 것과 정확히 동일한 로그 유형 (PFSENSE)
구성 파일 저장
- 수정 후 파일을 저장합니다.
- Linux:
Ctrl+O,Enter,Ctrl+X순서로 누릅니다. - Windows: 파일 > 저장을 클릭합니다.
- Linux:
변경사항을 적용하려면 Bindplane 에이전트를 다시 시작하세요.
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart observiq-otel-collector서비스가 실행 중인지 확인합니다.
sudo systemctl status observiq-otel-collector로그에서 오류를 확인합니다.
sudo journalctl -u observiq-otel-collector -f
Windows에서 Bindplane 에이전트를 다시 시작하려면 다음 옵션 중 하나를 선택하세요.
명령 프롬프트 또는 PowerShell(관리자 권한)
net stop observiq-otel-collector && net start observiq-otel-collector서비스 콘솔:
Win+R를 누르고services.msc를 입력한 다음 Enter 키를 누릅니다.- observIQ OpenTelemetry Collector를 찾습니다.
마우스 오른쪽 버튼을 클릭하고 다시 시작을 선택합니다.
서비스가 실행 중인지 확인합니다.
sc query observiq-otel-collector로그에서 오류를 확인합니다.
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
pfSense에서 Syslog 전달 구성
pfSense는 FreeBSD에서 실행되며 원격 syslog 전달을 비롯한 모든 구성 작업을 위한 웹 기반 인터페이스를 제공합니다.
- pfSense 웹 인터페이스에 로그인합니다.
- 상태 > 시스템 로그 > 설정으로 이동합니다.
- 원격 로깅 옵션 섹션으로 이동합니다.
- 원격 로깅 사용 설정을 선택합니다.
- 다음 구성 세부정보를 제공합니다.
- 소스 주소: 모두 (또는 특정 인터페이스)를 선택합니다.
- IP Protocol(IP 프로토콜): IPv4를 선택합니다.
- 원격 로그 서버: 사용 가능한 첫 번째 필드에
BINDPLANE_IP:514를 입력합니다.BINDPLANE_IP를 Bindplane 에이전트 호스트의 IP 주소로 바꿉니다.
- 원격 Syslog 콘텐츠 섹션에서 전달할 로그 카테고리를 선택합니다.
- 시스템 이벤트
- 방화벽 이벤트
- DNS 이벤트 (리졸버/unbound, 포워더/dnsmasq)
- DHCP 이벤트 (DHCP 서비스)
- PPP 이벤트
- 인증 이벤트 (포털 인증, RADIUS)
- VPN 이벤트 (IPsec, OpenVPN, L2TP)
- 게이트웨이 이벤트 (게이트웨이 모니터)
- 라우팅 이벤트 (라우팅 데몬)
- NTP 이벤트
- 패키지 (설치된 패키지)
- 저장을 클릭합니다.
- Bindplane 에이전트 로그를 확인하여 syslog 메시지가 전송되는지 확인합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| 애플리케이션 | principal.application | 이 값은 grok 패턴을 사용하여 로그 메시지에서 추출됩니다. syslog 메시지의 경우 애플리케이션 이름은 일반적으로 호스트 이름과 타임스탬프 뒤에 있습니다. |
| 명령어 | principal.process.command_line | 로그가 명령어 실행을 나타낼 때 설명 필드에서 추출됩니다. |
| 설명 | metadata.description | 설명 필드는 syslog-ng 애플리케이션 로그를 제외하고 UDM 메타데이터 설명에 매핑됩니다. syslog-ng 애플리케이션 로그에서는 metadata.description에 매핑됩니다. DHCP 이벤트의 경우 dhcp_type이 설명 앞에 추가됩니다. |
| dhcp_type | metadata.product_event_type | DHCP 메시지 유형 (예: DHCPDISCOVER, DHCPOFFER)이 추출되어 매핑됩니다. |
| 호스트 | intermediary.hostname 또는 intermediary.ip | 호스트 값이 유효한 IP 주소인 경우 intermediary.ip에 매핑됩니다. 그렇지 않으면 intermediary.hostname에 매핑됩니다. |
| 호스트 | principal.hostname, principal.asset.hostname | 주 구성원 IP가 없으면 호스트가 주 구성원 호스트 이름으로 처리됩니다. |
| mac | principal.mac, network.dhcp.chaddr | DHCP 요청과 연결된 MAC 주소가 추출되어 매핑됩니다. |
| src_ip | principal.ip, principal.asset.ip | grok 패턴을 사용하여 특정 로그 형식에서 추출됩니다. |
| src_mac | principal.mac | grok 패턴을 사용하여 특정 로그 형식에서 추출됩니다. |
| dst_mac | target.mac | grok 패턴을 사용하여 특정 로그 형식에서 추출됩니다. |
| 타임스탬프 | metadata.event_timestamp | 타임스탬프는 로그 메시지에서 추출되어 UDM 타임스탬프 형식으로 변환됩니다. 시간대 정보(tz)는 전환 전에 타임스탬프에 추가됩니다(사용 가능한 경우). |
| timestamp_no_year | metadata.event_timestamp | 연도가 없는 타임스탬프가 있으면 파싱되고 파싱 프로세스 중에 현재 연도가 추가됩니다. |
| 사용자 | principal.user.userid | 이벤트와 연결된 사용자 이름이 추출되어 매핑됩니다. |
| 1 열 | security_result.rule_id | 설명이 CSV 형식인 경우 첫 번째 CSV 열에서 매핑됩니다. |
| column6 | security_result.rule_type | 설명이 CSV 형식인 경우 여섯 번째 CSV 열에서 매핑됩니다. |
| column7 | security_result.action | 설명이 CSV 형식인 경우 일곱 번째 CSV 열에서 매핑됩니다. 'BLOCK' 또는 'ALLOW'로 변환됩니다. |
| column8 | network.direction | 설명이 CSV 형식인 경우 여덟 번째 CSV 열에서 매핑됩니다. 'INBOUND' 또는 'OUTBOUND'로 변환됩니다. |
| column13 | network.ip_protocol (UDP 또는 ICMP인 경우) | 설명이 CSV 형식이고 프로토콜이 UDP 또는 ICMP인 경우 13번째 CSV 열에서 매핑됩니다. TCP/UDP 이벤트의 경우 키가 'Id'인 추가 필드를 만드는 데 사용됩니다. |
| column16 | principal.ip, principal.asset.ip (IPv6이고 column9가 6인 경우) | 설명이 CSV 형식이고 column9가 6인 경우 16번째 CSV 열에서 매핑됩니다. TCP/UDP 이벤트의 경우 column9가 4이면 프로토콜 식별에 사용됩니다. |
| column17 | target.ip, target.asset.ip (IPv6이고 ip_failure가 아닌 경우) | 설명이 CSV 형식이고 column9가 6이며 값이 유효한 IP인 경우 17번째 CSV 열에서 매핑됩니다. TCP/UDP 이벤트의 경우 프로토콜 식별에 사용됩니다. |
| column18 | principal.port (UDP인 경우) | 설명이 CSV 형식이고 프로토콜이 UDP인 경우 18번째 CSV 열에서 매핑됩니다. TCP/UDP 이벤트의 경우 network.received_bytes에 매핑됩니다. |
| column19 | target.port (UDP인 경우) | 설명이 CSV 형식이고 프로토콜이 UDP인 경우 19번째 CSV 열에서 매핑됩니다. DHCP 이벤트의 경우 network.dhcp.yiaddr에 매핑됩니다. 다른 이벤트의 경우 principal.ip, principal.asset.ip에 매핑됩니다. |
| column20 | additional.fields (키: 'data_length') (UDP인 경우) | 설명이 CSV 형식이고 프로토콜이 UDP인 경우 20번째 CSV 열에서 매핑됩니다. 다른 이벤트의 경우 target.ip, target.asset.ip에 매핑됩니다. |
| column21 | principal.port (TCP/UDP인 경우) | 설명이 CSV 형식이고 프로토콜이 TCP 또는 UDP인 경우 21번째 CSV 열에서 매핑됩니다. |
| column22 | target.port (TCP/UDP인 경우) | 설명이 CSV 형식이고 프로토콜이 TCP 또는 UDP인 경우 22번째 CSV 열에서 매핑됩니다. |
| column23 | additional.fields (키: 'data_length') (TCP/UDP인 경우) | 설명이 CSV 형식이고 프로토콜이 TCP 또는 UDP인 경우 23번째 CSV 열에서 매핑됩니다. |
| column24 | additional.fields (키: 'tcp_flags') (TCP인 경우) | 설명이 CSV 형식이고 프로토콜이 TCP인 경우 24번째 CSV 열에서 매핑됩니다. |
| column25 | additional.fields (키: 'sequence_number') (TCP/UDP인 경우) | 설명이 CSV 형식이고 프로토콜이 TCP 또는 UDP인 경우 25번째 CSV 열에서 매핑됩니다. |
| column29 | additional.fields (키: 'tcp_options') (TCP인 경우) | 설명이 CSV 형식이고 프로토콜이 TCP인 경우 29번째 CSV 열에서 매핑됩니다. |
| compression_algo | additional.fields (키: '압축 알고리즘') | 설명 필드에서 추출되어 추가 필드로 추가되었습니다. |
| 내림차순 | metadata.description | 메시지 필드에서 추출되어 설명으로 사용됩니다. |
| principal_ip | principal.ip, principal.asset.ip | 설명 필드에서 추출되며 주 구성원 IP 주소를 나타냅니다. |
| principal_username | principal.user.userid | 설명 필드에서 추출되며 주 구성원의 사용자 이름을 나타냅니다. |
| 상태 | security_result.detection_fields (키: 'status') | 설명 필드에서 추출되어 보안 결과 내에 감지 필드로 추가됩니다. |
| target_host | target.hostname, target.asset.hostname | 설명 필드에서 추출되며 타겟 호스트 이름을 나타냅니다. |
| src_port | principal.port | 설명 필드에서 추출되며 소스 포트를 나타냅니다. 다양한 로그 필드와 파서 로직을 기반으로 결정됩니다. NETWORK_CONNECTION, NETWORK_DHCP, STATUS_UPDATE 또는 GENERIC_EVENT일 수 있습니다. 'PFSENSE'로 하드코딩됩니다. 'PFSENSE'로 하드코딩됩니다. 'PFSENSE'로 하드코딩됩니다. DHCP 이벤트의 경우 'DHCP'로 설정합니다. DHCPDISCOVER 및 DHCPREQUEST의 경우 'BOOTREQUEST'로 설정하고 DHCPOFFER 및 DHCPACK의 경우 'BOOTREPLY'로 설정합니다. dhcp_type 필드에 따라 'DISCOVER', 'REQUEST', 'OFFER' 또는 'ACK'로 설정됩니다. |
pid |
intermediary.process.pid |
변경 로그에서 매핑됨 |
application |
intermediary.application |
변경 로그에서 매핑됨 |
ipv4" and "ipv6 |
principal.ip |
변경 로그에서 매핑됨 |
security_result.category |
AUTH_VIOLATION |
변경 로그에서 매핑됨 |
method |
network.http.method |
변경 로그에서 매핑됨 |
referer |
network.http.referral_url |
변경 로그에서 매핑됨 |
response_code |
network.http.response_code |
변경 로그에서 매핑됨 |
user_agent |
network.http.user_agent |
변경 로그에서 매핑됨 |
sent_bytes |
network.sent_bytes |
변경 로그에서 매핑됨 |
url |
target.url |
변경 로그에서 매핑됨 |
http_version |
additional.fields |
변경 로그에서 매핑됨 |
column19" which is "source-address |
network.dhcp.yiaddr |
변경 로그에서 매핑됨 |
column17" which is "destination-address |
target.ip |
변경 로그에서 매핑됨 |
column16" which is "source-address |
principal.ip |
변경 로그에서 매핑됨 |
column12" which is "hop_limit |
additional.fields |
변경 로그에서 매핑됨 |
column13" which is "ip_protocol |
network.ip_protocol |
변경 로그에서 매핑됨 |
ttl |
additional.fields |
변경 로그에서 매핑됨 |
Offset |
additional.fields |
변경 로그에서 매핑됨 |
Data length |
additional.fields |
변경 로그에서 매핑됨 |
Length |
additional.fields |
변경 로그에서 매핑됨 |
Sequence-number |
additional.fields |
변경 로그에서 매핑됨 |
변경 로그
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.