VanDyke VShell SFTP 로그 수집
이 문서에서는 Syslog가 포함된 Bindplane 또는 로그 발송자가 포함된 Amazon S3를 사용하여 VanDyke VShell SFTP 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- VanDyke VShell 서버 또는 관리 콘솔에 대한 액세스 권한
- 옵션 1: Bindplane 에이전트용
systemd가 있는 Windows 2016 이상 또는 Linux 호스트 - 옵션 2: S3 액세스 권한이 있는 AWS 계정 및 VShell 서버의 NXLog/Fluent Bit
Google SecOps 수집 인증 파일 가져오기
- 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: 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 주소를 바꿉니다.
YOUR_CUSTOMER_ID를 실제 고객 ID로 바꿉니다.- 인증 파일이 저장된 파일 경로로
/path/to/ingestion-authentication-file.json를 업데이트합니다. - UDP 대신 TCP의 경우
udplog을tcplog으로 바꿉니다.
변경사항을 적용하려면 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 로깅을 구성합니다.
- 원격 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 필드의 값을 직접 매핑합니다. |
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의 심각도를 결정하는 데 사용됩니다. |
변경 로그
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.