VanDyke VShell SFTP 로그 수집
이 문서에서는 Syslog가 포함된 Bindplane 또는 로그 배송 도구가 포함된 Amazon S3를 사용하여 VanDyke VShell SFTP 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- VanDyke VShell 서버 또는 관리 콘솔에 대한 액세스 권한
- 옵션 1: Bindplane 에이전트용
systemd가 있는 Windows 2016 이상 또는 Linux 호스트 - 옵션 2: VShell 서버에 S3 액세스 권한과 NXLog/Fluent Bit가 있는 AWS 계정
Bindplane 에이전트의 Google SecOps 사용자 인증 정보 가져오기
Google SecOps에 Bindplane 에이전트를 인증하려면 다음 방법 중 하나를 선택합니다.
- 새 배포: Chronicle API를 사용합니다(옵션 1).
- 기존 배포: 2027년 7월 20일에 Ingestion API가 중단될 때까지 데이터 수집 인증 파일(옵션 2)을 계속 사용합니다.
옵션 1: Chronicle API의 서비스 계정 만들기(권장)
- Google Cloud 콘솔에 로그인하고 Google SecOps 인스턴스에 연결된 Google Cloud 프로젝트를 선택합니다.
- IAM 및 관리자 > 서비스 계정으로 이동합니다.
- 서비스 계정 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 서비스 계정 이름: 계정 이름을 입력합니다(예:
bindplane-ingest). - 서비스 계정 설명: 설명을 입력합니다(예:
Bindplane agent log ingestion).
- 서비스 계정 이름: 계정 이름을 입력합니다(예:
- 만들고 계속하기를 클릭합니다.
- 이 서비스 계정에 프로젝트에 대한 액세스 권한 부여 섹션에서 역할 선택을 클릭하고 Chronicle 편집자를 선택합니다.
- 계속을 클릭한 다음 완료를 클릭합니다.
- 만든 서비스 계정을 클릭한 다음 키 탭으로 이동합니다.
- 키 추가 > 새 키 만들기를 클릭합니다.
- JSON을 선택하고 만들기를 클릭합니다. 키 파일이 컴퓨터에 다운로드됩니다.
- 키 파일을 Bindplane 수집기 디렉터리(Linux의 경우
/opt/observiq-otel-collector/ingestion-auth.json, Windows의 경우C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json)에ingestion-auth.json로 저장하거나config.yaml의creds_file_path를 업데이트하여 저장한 경로와 일치시킵니다. - IAM 및 관리자 > 설정으로 이동하여 프로젝트 번호를 복사합니다. 내보내기 도구 구성에 필요합니다.
옵션 2: 데이터 수집 인증 파일 다운로드(기존)
- Google SecOps 콘솔에 로그인합니다.
- 설정 > 데이터 관리 > 수집 에이전트로 이동합니다. SIEM 전용 플랫폼을 사용하는 경우 설정 > 수집 에이전트로 이동합니다.
- 데이터 수집 인증 파일을 다운로드합니다.
- Bindplane 에이전트가 설치될 시스템에 파일을 안전하게 저장합니다.
Google SecOps 고객 ID 가져오기
- Google SecOps 콘솔에 로그인합니다.
- 설정 > 관리 > 프로필로 이동합니다. SIEM 전용 플랫폼을 사용하는 경우 설정 > 프로필로 이동합니다.
- 조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.
옵션 1: Bindplane 및 Syslog를 통한 통합
이 옵션은 지연 시간을 최소화하면서 실시간 로그 스트리밍을 제공하며 대부분의 배포에 권장됩니다.
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
추가 설치 리소스
추가 설치 옵션은 Bindplane 에이전트 설치 가이드를 참조하세요.
Syslog를 수집하고 Google SecOps로 전송하도록 BindPlane 에이전트 구성
구성 파일에 액세스합니다.
config.yaml파일을 찾습니다. 일반적으로 Linux의/opt/observiq-otel-collector/디렉터리 또는 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: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' 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: chronicle.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 주소를 바꿉니다.
<LOCATION>을 Google SecOps 인스턴스의 리전(예:us,europe또는asia-southeast1)으로 바꿉니다. 내보내기 도구는 이 값으로chronicle.googleapis.com에 프리픽스를 추가합니다.<PROJECT_NUMBER>를 IAM 및 관리자 > 설정의 프로젝트 번호로 바꿉니다.YOUR_CUSTOMER_ID를 실제 고객 ID로 바꿉니다./path/to/ingestion-authentication-file.json을 서비스 계정 키 파일(옵션 1)이 저장된 파일 경로로 업데이트합니다.- UDP 대신 TCP를 사용하려면
udplog를tcplog로 바꿉니다.
기존 수집 API 내보내기 도구
옵션 2의 데이터 수집 인증 파일을 사용하는 경우
exporters블록을 다음으로 바꿉니다.creds_file_path를 데이터 수집 인증 파일의 경로로 설정하고 인스턴스가 미국 외부에 있는 경우malachiteingestion-pa.googleapis.com를 리전 엔드포인트(예:europe-malachiteingestion-pa.googleapis.com)로 바꿉니다.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:
Bindplane 에이전트를 다시 시작하여 변경사항을 적용합니다.
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart observiq-otel-collectorWindows에서 Bindplane 에이전트를 다시 시작하려면 서비스 콘솔을 사용하거나 다음 명령어를 입력합니다.
net stop observiq-otel-collector && net start observiq-otel-collector
VanDyke VShell에서 Syslog 전달 구성
Windows의 VShell
- VShell 제어판에 로그인합니다.
- 로깅 설정으로 이동합니다.
- 원격 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를 통한 통합
이 옵션은 로그 보관이 필요하거나 직접 syslog 전달이 불가능한 환경에 유용합니다. 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작업 스케줄러를 사용하여 5분마다 실행되도록 PowerShell 스크립트를 예약합니다.
옵션 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 필드의 값을 직접 매핑합니다. |
message |
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의 심각도를 확인하는 데 사용됩니다. | |
username |
event.idm.read_only_udm.target.user.userid |
변경 로그에서 매핑됨 |
username |
event.idm.read_only_udm.target.user.user_display_name |
변경 로그에서 매핑됨 |
id |
event.idm.read_only_udm.additional.fields |
변경 로그에서 매핑됨 |
reason |
security_result.summary |
변경 로그에서 매핑됨 |
srcip |
principal.ip |
변경 로그에서 매핑됨 |
username |
principal.user.user_display_name |
변경 로그에서 매핑됨 |
변경 로그
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.