VanDyke VShell SFTP 로그 수집
이 문서에서는 Syslog가 포함된 Bindplane 또는 로그 발송자가 포함된 Amazon S3를 사용하여 VanDyke VShell SFTP 로그를 Google Security Operations로 수집하는 방법을 설명합니다. 파서는 원시 로그를 구조화된 UDM 형식으로 변환합니다. JSON 및 SYSLOG 형식을 모두 처리하고, IP 주소, 포트, 이벤트 세부정보와 같은 관련 필드를 추출하고, 플랫폼 세부정보, 보안 심각도와 같은 컨텍스트 정보로 데이터를 보강합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- VanDyke VShell 서버 또는 관리 콘솔에 대한 액세스 권한
- 옵션 1: Bindplane 에이전트용
systemd가 설치된 Windows 2016 이상 또는 Linux 호스트 - 옵션 2: VShell 서버에서 S3 액세스 및 NXLog/Fluent Bit이 있는 AWS 계정
옵션 1: Bindplane 및 Syslog를 통한 통합
이 옵션은 지연 시간이 최소화된 실시간 로그 스트리밍을 제공하며 대부분의 배포에 권장됩니다.
- 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
Linux 설치
- 루트 또는 sudo 권한으로 터미널을 엽니다.
다음 명령어를 실행합니다.
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
추가 설치 리소스
- 추가 설치 옵션은 이 설치 가이드를 참고하세요.
Syslog를 수집하여 Google SecOps로 전송하도록 Bindplane 에이전트 구성
구성 파일에 액세스합니다.
config.yaml파일을 찾습니다. 일반적으로 Linux에서는/etc/bindplane-agent/디렉터리에 있고 Windows에서는 설치 디렉터리에 있습니다.- 텍스트 편집기 (예:
nano,vi, 메모장)를 사용하여 파일을 엽니다.
다음과 같이
config.yaml파일을 수정합니다.receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: YOUR_CUSTOMER_ID endpoint: malachiteingestion-pa.googleapis.com # Custom log type - requires parser extension log_type: 'VANDYKE_SFTP' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels- 인프라에 필요한 대로 포트와 IP 주소를 바꿉니다.
<customer_id>를 실제 고객 ID로 바꿉니다.- Google SecOps 수집 인증 파일 가져오기 섹션에서 인증 파일이 저장된 경로로
/path/to/ingestion-authentication-file.json를 업데이트합니다. - UDP 대신 TCP의 경우
udplog을tcplog으로 바꿉니다.
Bindplane 에이전트를 다시 시작하여 변경사항 적용
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart bindplane-agentWindows에서 Bindplane 에이전트를 다시 시작하려면 서비스 콘솔을 사용하거나 다음 명령어를 입력하면 됩니다.
net stop BindPlaneAgent && net start BindPlaneAgent
VanDyke VShell에서 Syslog 전달 구성
Windows의 VShell
- VShell 제어판에 로그인합니다.
- 로깅 설정으로 이동합니다.
- 원격 syslog 로깅을 구성합니다.
- 원격 syslog 서버에 로깅을 사용 설정합니다.
- 서버 주소: Bindplane 에이전트 IP 주소를 입력합니다.
- 포트: 514 (또는 구성된 포트)를 입력합니다.
- 프로토콜: UDP (또는 구성된 경우 TCP)를 선택합니다.
- 메시지 그룹: 연결, 인증, SFTP, FTPS, HTTPS, 오류, 경고, 정보를 선택합니다.
- 적용 > 확인을 클릭합니다.
Linux/macOS의 VShell
- vshelld_config 파일 (일반적으로
/etc/vshell/vshelld_config)을 수정합니다. 다음 매개변수를 구성합니다.
SyslogFacility LOG_LOCAL3 LogLevel INFOLOG_LOCAL3을 Bindplane 에이전트로 전달하도록 시스템의 syslog를 구성합니다.
/etc/rsyslog.conf또는/etc/syslog-ng/syslog-ng.conf수정- 추가:
local3.* @bindplane-agent-ip:514(UDP의 경우) 또는local3.* @@bindplane-agent-ip:514(TCP의 경우)
VShell 서비스와 syslog 서비스를 다시 시작합니다.
sudo systemctl restart vshelld sudo systemctl restart rsyslog
옵션 2: AWS S3를 통한 통합
이 옵션은 로그 보관이 필요하거나 직접 시스템 로그 전달이 불가능한 환경에 유용합니다. AWS Lambda는 온프레미스 파일에 액세스할 수 없으므로 VShell 서버에 로그 시퍼가 필요합니다.
Google SecOps용 AWS S3 버킷 및 IAM 구성
- 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 참조할 수 있도록 버킷 이름과 리전을 저장합니다(예:
vandyke-sftp-logs). - 이 사용자 가이드(IAM 사용자 만들기)에 따라 사용자를 만듭니다.
- 생성된 사용자를 선택합니다.
- 보안용 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키와 보안 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess 정책을 검색합니다.
- 정책을 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
VShell 서버에 로그 시퍼 설치 및 구성
운영체제에 따라 다음 옵션 중 하나를 선택합니다.
옵션 A: NXLog 사용 (Windows)
- nxlog.co에서 NXLog Community Edition을 다운로드하여 설치합니다.
C:\Program Files\nxlog\conf\nxlog.conf수정:<Extension json> Module xm_json </Extension> <Extension syslog> Module xm_syslog </Extension> <Input vshell_log> Module im_file File "C:\\Program Files\\VanDyke Software\\VShell\\Log\\VShell.log" SavePos TRUE <Exec> # Parse VShell log format if $raw_event =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) "(.*)"$/ { $EventTime = $1; $Protocol = $2; $EventType = $3; $SessionID = $4; $ClientIP = $5; $ClientPort = $6; $Username = $7; $Filename = $9; $BytesDown = $10; $BytesUp = $11; $ServerIP = $14; $ServerPort = $15; $EventMessage = $16; # Convert to JSON to_json(); } </Exec> </Input> <Output s3> Module om_exec Command C:\scripts\upload_to_s3.ps1 Args %FILEPATH% </Output> <Route vshell_to_s3> Path vshell_log => s3 </Route>PowerShell 스크립트
C:\scripts\upload_to_s3.ps1를 만듭니다.param([string]$FilePath) $bucket = "vandyke-sftp-logs" $key = "vshell/$(Get-Date -Format 'yyyy/MM/dd/HH')/$(Get-Date -Format 'yyyyMMddHHmmss').json" # Batch logs $logs = Get-Content $FilePath | ConvertFrom-Json $jsonLines = $logs | ForEach-Object { $_ | ConvertTo-Json -Compress } $content = $jsonLines -join "`n" # Upload to S3 Write-S3Object -BucketName $bucket -Key $key -Content $content -ProfileName defaultAWS 사용자 인증 정보 프로필을 만듭니다.
Set-AWSCredential -AccessKey YOUR_ACCESS_KEY -SecretKey YOUR_SECRET_KEY -StoreAs default- 작업 스케줄러를 사용하여 PowerShell 스크립트가 5분마다 실행되도록 예약합니다.
옵션 B: Fluent Bit 사용 (Linux)
Fluent Bit을 설치합니다.
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh/etc/fluent-bit/fluent-bit.conf을 구성합니다.[SERVICE] Flush 5 Daemon On Log_Level info [INPUT] Name tail Path /var/log/vshell/vshell.log Parser vshell_parser Tag vshell.* Refresh_Interval 5 Mem_Buf_Limit 10MB [PARSER] Name vshell_parser Format regex Regex ^(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<protocol>\S+) (?<event_type>\S+) (?<session_id>\S+) (?<client_ip>\S+) (?<client_port>\S+) (?<username>\S+) (?<dash>\S+) (?<filename>\S+) (?<bytes_down>\S+) (?<bytes_up>\S+) (?<field1>\S+) (?<field2>\S+) (?<server_ip>\S+) (?<server_port>\S+) "(?<event_message>[^"]*)" [OUTPUT] Name s3 Match vshell.* bucket vandyke-sftp-logs region us-east-1 use_put_object On total_file_size 5M upload_timeout 10s compression gzip s3_key_format /vshell/%Y/%m/%d/%H/%{hostname}_%{uuid}.json.gzAWS 사용자 인증 정보를 구성합니다.
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEYFluent Bit를 시작합니다.
sudo systemctl enable fluent-bit sudo systemctl start fluent-bit
VanDyke VShell 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
VanDyke VShell SFTP logs). - 소스 유형으로 Amazon S3 V2를 선택합니다.
- 로그 유형 (맞춤)으로 VanDyke SFTP를 선택합니다.
- 다음을 클릭합니다.
- 다음 입력 파라미터의 값을 지정합니다.
- S3 URI:
s3://vandyke-sftp-logs/vshell/ - 소스 삭제 옵션: 유지 (권장) 또는 환경설정에 따라 삭제 옵션을 선택합니다.
- 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
- 액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
- 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- S3 URI:
- 다음을 클릭합니다.
- 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| agent.id | read_only_udm.observer.asset_id | 'filebeat:'와 agent.id 필드 값을 연결합니다. |
| agent.type | read_only_udm.observer.application | agent.type 필드의 값을 직접 매핑합니다. |
| agent.version | read_only_udm.observer.platform_version | agent.version 필드의 값을 직접 매핑합니다. |
| ecs.version | read_only_udm.metadata.product_version | ecs.version 필드의 값을 직접 매핑합니다. |
| host.architecture | read_only_udm.target.asset.hardware.cpu_platform | host.architecture 필드의 값을 직접 매핑합니다. |
| host.hostname | read_only_udm.target.hostname | host.hostname 필드의 값을 직접 매핑합니다. |
| host.id | read_only_udm.principal.asset_id | 'VANDYKE_SFTP:'와 host.id 필드 값을 연결합니다. |
| host.ip | read_only_udm.target.ip | host.ip 배열의 각 IP 주소를 별도의 read_only_udm.target.ip 필드에 직접 매핑합니다. |
| host.mac | read_only_udm.target.mac | host.mac 배열의 각 MAC 주소를 별도의 read_only_udm.target.mac 필드에 직접 매핑합니다. |
| host.os.kernel | read_only_udm.target.platform_patch_level | host.os.kernel 필드의 값을 직접 매핑합니다. |
| host.os.platform | read_only_udm.target.platform | 값에 따라 host.os.platform 값을 WINDOWS, LINUX, MAC 또는 UNKNOWN_PLATFORM에 매핑합니다. |
| host.os.version | read_only_udm.target.platform_version | host.os.version 필드의 값을 직접 매핑합니다. |
| log.file.path | read_only_udm.principal.process.file.full_path | log.file.path 필드의 값을 직접 매핑합니다. |
| logstash.collect.timestamp | read_only_udm.metadata.collected_timestamp | logstash.collect.timestamp 필드에서 타임스탬프를 파싱하고 타임스탬프 객체로 변환합니다. |
| logstash.irm_environment | read_only_udm.additional.fields.value.string_value | logstash.irm_environment 필드의 값을 직접 매핑합니다. 키가 'irm_environment'로 설정됩니다. |
| logstash.irm_region | read_only_udm.additional.fields.value.string_value | logstash.irm_region 필드의 값을 직접 매핑합니다. 키가 'irm_region'으로 설정됩니다. |
| logstash.irm_site | read_only_udm.additional.fields.value.string_value | logstash.irm_site 필드의 값을 직접 매핑합니다. 키가 'irm_site'로 설정됩니다. |
| logstash.process.host | read_only_udm.observer.hostname | logstash.process.host 필드의 값을 직접 매핑합니다. |
| 메시지 | grok 패턴과 정규 표현식을 사용하여 다양한 필드를 추출하는 데 사용됩니다. | |
| read_only_udm.metadata.event_type | 'NETWORK_FTP'로 설정 | |
| read_only_udm.metadata.log_type | 'VANDYKE_SFTP'로 설정 | |
| read_only_udm.metadata.product_event_type | grok 패턴을 사용하여 메시지 필드에서 추출됨 | |
| read_only_udm.metadata.product_name | 'VANDYKE_SFTP'로 설정 | |
| read_only_udm.metadata.vendor_name | 'VANDYKE SOFTWARE'로 설정 | |
| read_only_udm.network.application_protocol | 설명 필드에 'SSH2' 또는 'SSH'가 포함된 경우 'SSH'로 설정하고, 메서드 필드가 HTTP 메서드와 일치하는 경우 'HTTP'로 설정합니다. | |
| read_only_udm.network.http.method | 일반적인 HTTP 메서드와 일치하는 경우에만 grok 패턴을 사용하여 메시지 필드에서 추출됩니다. | |
| read_only_udm.network.http.referral_url | grok 패턴을 사용하여 메시지 필드에서 추출됨 | |
| read_only_udm.network.http.response_code | grok 패턴을 사용하여 메시지 필드에서 추출하고 정수로 변환했습니다. | |
| read_only_udm.network.ip_protocol | 설명 필드에 'TCP'가 포함된 경우 'TCP'로 설정됩니다. | |
| read_only_udm.principal.ip | grok 패턴을 사용하여 메시지 필드에서 추출됨 | |
| read_only_udm.principal.port | grok 패턴을 사용하여 메시지 필드에서 추출하고 정수로 변환했습니다. | |
| read_only_udm.security_result.description | grok 패턴을 사용하여 메시지 필드에서 추출됨 | |
| read_only_udm.security_result.severity | syslog_severity가 'error' 또는 'warning'인 경우 'HIGH', 'notice'인 경우 'MEDIUM', 'information' 또는 'info'인 경우 'LOW'로 설정됩니다. | |
| read_only_udm.security_result.severity_details | syslog_severity 필드의 값을 직접 매핑합니다. | |
| read_only_udm.target.ip | grok 패턴을 사용하여 메시지 필드에서 추출됨 | |
| read_only_udm.target.port | grok 패턴을 사용하여 메시지 필드에서 추출하고 정수로 변환했습니다. | |
| read_only_udm.target.process.pid | grok 패턴을 사용하여 메시지 필드에서 추출됨 | |
| syslog_severity | security_result의 심각도를 결정하는 데 사용됩니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.