Google SecOps와 AWS S3 통합
이 문서에서는 AWS S3를 Google Security Operations와 통합하는 방법을 설명합니다.
사용 사례
- 버킷 관리
- 버킷에서 파일 다운로드
- 버킷에 파일 업로드
시작하기 전에
Google SecOps에서 AWS S3 통합을 구성하기 전에 네트워크 환경과 AWS 사용자 인증 정보가 모든 운영 필수 요건을 충족하는지 확인하세요.
통합을 위해 환경을 준비하려면 다음을 완료해야 합니다.
Google SecOps와 AWS S3 리전 서비스 엔드포인트 간의 네트워크 가시성을 확인합니다.
적절한 IAM 권한이 있는 AWS 프로그래매틱 API 사용자 인증 정보 (액세스 키 ID 및 보안 비밀 액세스 키)를 획득합니다.
Google SecOps 내에서 통합 인스턴스를 구성하고 테스트합니다.
네트워크 요구사항
Google SecOps는 HTTPS REST API와 AWS Python SDK (boto3)를 사용하여 AWS S3 서비스와 직접 통신합니다.
네트워크 환경이 다음 연결 규칙을 충족하는지 확인하세요.
아웃바운드 HTTPS 액세스: 포트
443/TCP을 통해 Google SecOps 인스턴스 또는 원격 에이전트에서 AWS S3 리전 엔드포인트 (s3.<region>.amazonaws.com또는s3.amazonaws.com)로 아웃바운드 HTTPS 통신을 사용 설정합니다.자세한 내용은 AWS 문서의 AWS 서비스 엔드포인트를 참고하세요.
프록시 구성: 조직에서 HTTP/HTTPS 프록시를 통해 아웃바운드 트래픽을 라우팅하는 경우 Google SecOps 서버 또는 원격 에이전트 호스트에서 표준 환경 프록시 변수(
HTTP_PROXY,HTTPS_PROXY,NO_PROXY)를 구성합니다.
인증 및 사용자 인증 정보
AWS S3 통합에는 AWS 서명 버전 4를 사용하여 요청을 인증하기 위한 프로그래매틱 API 사용자 인증 정보가 필요합니다.
AWS 환경이 다음 인증 요구사항을 충족하는지 확인합니다.
프로그래매틱 사용자 인증 정보: AWS IAM 사용자 또는 역할과 연결된 유효한 AWS 액세스 키 ID 및 AWS 보안 비밀 키를 가져옵니다.
IAM ID를 만들고 사용자 인증 정보를 생성하는 방법은 AWS 문서의 IAM 사용자의 액세스 키 관리 및 IAM ID를 참고하세요.
최소 권한: 자동화된 워크플로에 필요한 작업 및 버킷 리소스로만 권한을 제한하고 정기적으로 사용자 인증 정보를 순환합니다.
보안 권장사항에 관한 자세한 내용은 AWS 문서의 IAM의 보안 권장사항을 참고하세요.
작업 권한 구성
인증된 AWS IAM ID에 Google SecOps 플레이북이 실행하는 작업에 필요한 특정 권한을 부여합니다.
다음 표에서 AWS S3 작업에 필요한 최소 권한을 참고하세요.
| 액션명 | 필수 AWS IAM 권한
(ActionName:Permission) |
필수 권한 | 설명 / 리소스 범위 |
|---|---|---|---|
| 버킷에서 파일 다운로드 | s3:GetObject |
s3:ListAllMyBuckets |
S3 버킷에서 객체를 다운로드합니다. 리소스:
arn:aws:s3:::<bucket-name>/* |
| 버킷 정책 가져오기 | s3:GetBucketPolicy |
s3:ListAllMyBuckets |
버킷 액세스 정책을 가져옵니다. 리소스:
arn:aws:s3:::<bucket-name> |
| 버킷 객체 나열 | s3:ListBucket |
s3:ListAllMyBuckets |
S3 버킷 내의 객체를 나열합니다. 리소스:
arn:aws:s3:::<bucket-name> |
| 버킷 나열 | s3:ListAllMyBuckets |
— | 계정이 소유한 모든 S3 버킷을 나열합니다. 리소스: * |
| Ping | s3:ListAllMyBuckets |
— | 통합 연결을 검증합니다. 리소스: * |
| 버킷 정책 설정 | s3:PutBucketPolicy |
s3:ListAllMyBuckets |
S3 버킷 정책을 설정하거나 수정합니다. 리소스:
arn:aws:s3:::<bucket-name> |
| 버킷에 파일 업로드 | s3:PutObject |
s3:ListAllMyBuckets |
S3 버킷에 객체를 업로드합니다. 리소스:
arn:aws:s3:::<bucket-name>/* |
빠른 참조 (ActionName:Permission)
다음 빠른 참조를 사용하여 각 작업에 필요한 권한을 검토하세요.
Ping: s3:ListAllMyBuckets
Download File From Bucket: s3:GetObject, s3:ListAllMyBuckets
Get Bucket Policy: s3:GetBucketPolicy, s3:ListAllMyBuckets
List Bucket Objects: s3:ListBucket, s3:ListAllMyBuckets
List Buckets: s3:ListAllMyBuckets
Set Bucket Policy: s3:PutBucketPolicy, s3:ListAllMyBuckets
Upload File To Bucket: s3:PutObject, s3:ListAllMyBuckets
샘플 IAM 정책 (최소 권한)
다음 예시 정책은 Google SecOps에서 모든 AWS S3 작업을 실행하는 데 필요한 권한을 보여줍니다.
IAM 정책을 만들고 연결하는 방법은 AWS 문서의 IAM 정책 만들기를 참고하세요.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SecOpsS3Discovery",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "*"
},
{
"Sid": "SecOpsS3BucketOperations",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketPolicy",
"s3:PutBucketPolicy"
],
"Resource": "arn:aws:s3:::*"
},
{
"Sid": "SecOpsS3ObjectOperations",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::*/*"
}
]
}
통합 매개변수
다음 매개변수를 사용하여 통합을 구성합니다.
| 매개변수 표시 이름 | 유형 | 기본값 | 필수 항목 | 설명 |
|---|---|---|---|---|
| AWS 액세스 키 ID | 문자열 | 해당 사항 없음 | 예 | 통합에 사용할 AWS 액세스 키 ID입니다. |
| AWS 보안 비밀 키 | 비밀번호 | 해당 사항 없음 | 예 | 통합에 사용할 AWS 보안 비밀 키입니다. |
| AWS 기본 리전 | 문자열 | 해당 사항 없음 | 예 | 통합에 사용할 AWS 기본 리전입니다(예: us-west-2). |
| 원격 실행 | 체크박스 | 선택 해제 | No | 구성된 통합을 원격으로 실행하려면 필드를 선택합니다. 선택하면 원격 사용자(에이전트)를 선택하는 옵션이 나타납니다. |
Google SecOps에서 통합을 구성하는 방법에 대한 안내는 통합 구성을 참고하세요.
필요한 경우 이후 단계에서 변경할 수 있습니다. 통합 인스턴스를 구성한 후 플레이북에서 사용할 수 있습니다. 여러 인스턴스를 구성하고 지원하는 방법에 관한 자세한 내용은 여러 인스턴스 지원을 참고하세요.
작업
작업에 대한 자세한 내용은 Workdesk에서 대기 중인 작업에 응답 및 직접 조치 실행을 참고하세요.
버킷에서 파일 다운로드
AWS S3의 버킷에서 파일을 다운로드합니다.
매개변수
| 매개변수 표시 이름 | 유형 | 기본값 | 필수 항목 | 설명 |
|---|---|---|---|---|
| 버킷 파일 경로 | 문자열 | s3://{bucket_name}/{file_name} | 예 | 버킷에 있는 파일의 경로를 지정합니다. 예: s3://siemplify/syslog/log.txt |
| 다운로드 경로 | 문자열 | 해당 사항 없음 | 예 | 파일을 다운로드할 경로를 지정합니다. |
실행
이 작업은 항목에서 실행되지 않습니다.
작업 결과
스크립트 결과
| 스크립트 결과 이름 | 값 옵션 | 예 |
|---|---|---|
| is_success | True/False | is_success:False |
JSON 결과
{
"bucket_file_path": "s3://testsiemplify/test/123.txt"
"download_path": "/usr/bin/share/download.txt"
}
케이스 월
| 결과 유형 | 값 / 설명 | 유형 |
|---|---|---|
| 출력 메시지* | 작업이 실패하거나 플레이북 실행을 중지하지 않습니다. 상태 코드 == 200 (is_success = true)인 경우 'AWS S3에서 '{0}'을 다운로드했습니다.'.format(bucket_file_path) 다른 상태 코드인 경우 (is_success=false): '작업에서 AWS S3에서 '{0}'을 다운로드하지 못했습니다. 이유: 해당 다운로드 경로에 파일이 이미 있습니다.' 작업이 실패하고 플레이북 실행을 중지합니다. 잘못된 사용자 인증 정보, 서버 연결 없음과 같은 치명적인 오류, SDK 오류가 보고되는 경우: ''버킷에서 파일 다운로드' 작업을 실행하는 중에 오류가 발생했습니다. 이유: {0}'.format(error.Stacktrace) |
일반 |
버킷 정책 가져오기
AWS S3에서 버킷 정책에 관한 정보를 가져옵니다.
매개변수
| 매개변수 표시 이름 | 유형 | 기본값 | 필수 항목 | 설명 |
|---|---|---|---|---|
| 버킷 이름 | 문자열 | 해당 사항 없음 | 예 | 정책 정보를 가져올 버킷의 이름을 지정합니다. |
실행
이 작업은 항목에서 실행되지 않습니다.
작업 결과
스크립트 결과
| 스크립트 결과 이름 | 값 옵션 | 예 |
|---|---|---|
| is_success | True/False | is_success:False |
JSON 결과
{
"Policy": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::testsiemplify/*"
}
]
}
케이스 월
| 결과 유형 | 값 / 설명 | 유형 |
|---|---|---|
| 출력 메시지* | 작업이 실패하거나 플레이북 실행을 중지하지 않습니다. 상태 코드가 200인 경우 (is_success = true) 'AWS S3에서 '{0}' 버킷의 정책에 관한 정보를 가져왔습니다.'.format(bucket_name) 다른 상태 코드인 경우 (is_success=false): '작업에서 AWS S3의 '{0}' 버킷 정책에 관한 정보를 반환할 수 없습니다.'.format(bucket_name) 작업이 실패하고 플레이북 실행을 중지합니다. 잘못된 사용자 인증 정보, 서버 연결 없음과 같은 치명적인 오류: ''버킷 정책 가져오기' 작업을 실행하는 중에 오류가 발생했습니다. 이유: {0}'.format(error.Stacktrace) |
일반 |
버킷 객체 나열
사용자가 사용자 계정을 비활성화할 수 있도록 지원합니다. 요청 본문에는 사용 중지할 사용자가 포함됩니다. 계정의 account enabled 속성은 false로 설정해야 합니다.
매개변수
| 매개변수 표시 이름 | 유형 | 기본값 | 필수 항목 | 설명 |
|---|---|---|---|---|
| 버킷 이름 | 문자열 | 해당 사항 없음 | 예 | 객체를 가져올 버킷의 이름을 지정합니다. |
| 반환할 최대 객체 수 | 정수 | 해당 사항 없음 | 아니요 | 반환할 객체 수를 지정합니다. |
실행
이 작업은 항목에서 실행되지 않습니다.
작업 결과
스크립트 결과
| 스크립트 결과 이름 | 값 옵션 | 예 |
|---|---|---|
| is_success | True/False | is_success:False |
JSON 결과
"Contents": [
{
"Key": "text.txt",
"LastModified": %Y-%m-%dT%H:%M:%S,
"ETag": "d41d8cd98f00b204e9800998ecf8427e",
"Size": 0,
"StorageClass": "STANDARD",
"Owner": {
"DisplayName": "lab_aws",
"ID": "935dc3fed0e1d2c5b12242cf9927370824f2438681a2d3c0523f254dbde41aba"
}
},
{
"Key": "text_1.txt",
"LastModified": %Y-%m-%dT%H:%M:%S,
"ETag": "d41d8cd98f00b204e9800998ecf8427e",
"Size": 0,
"StorageClass": "STANDARD",
"Owner": {
"DisplayName": "lab_aws",
"ID": "935dc3fed0e1d2c5b12242cf9927370824f2438681a2d3c0523f254dbde41aba"
}
}
]
케이스 월
| 결과 유형 | 값 / 설명 | 유형 |
|---|---|---|
| 출력 메시지* | 작업이 실패하거나 플레이북 실행을 중지하지 않습니다. 상태 코드 == 200 (is_success = true)인 경우 'AWS S3에서 '{0}' 버킷의 객체를 반환했습니다.'.format(bucket_name) 다른 상태 코드인 경우 (is_success=false): '작업에서 AWS S3의 '{0}' 버킷 객체를 반환할 수 없습니다.'.format(bucket_name) 작업이 실패하고 플레이북 실행을 중지합니다. 잘못된 사용자 인증 정보, 서버 연결 없음과 같은 치명적인 오류가 보고되는 경우: ''버킷 객체 나열' 작업을 실행하는 중에 오류가 발생했습니다. 이유: {0}'.format(error.Stacktrace) |
일반 |
| 케이스 월 테이블 | 표 이름: '{0}' 버킷 객체 열:
|
일반 |
버킷 나열
AWS S3에서 버킷 목록을 가져옵니다.
실행
이 작업은 항목에서 실행되지 않습니다.
작업 결과
스크립트 결과
| 스크립트 결과 이름 | 값 옵션 | 예 |
|---|---|---|
| is_success | True/False | is_success:False |
JSON 결과
{
"Buckets": [
{
"CreationDate": %Y-%m-%dT%H:%M:%S,
"Name": "testsiemplify"
}
],
"Owner": {
"DisplayName": "lab_aws",
"ID": "935dc3fed0e1d2c5b12242cf9927370824f2438681a2d3c0523f254dbde41aba"
},
케이스 월
| 결과 유형 | 값 / 설명 | 유형 |
|---|---|---|
| 출력 메시지* | 작업이 실패하거나 플레이북 실행을 중지하지 않습니다. 상태 코드 == 200 (is_success = true)인 경우 'AWS S3에서 사용 가능한 버킷을 나열했습니다.' 다른 상태 코드인 경우 (is_success=false): '작업에서 AWS S3의 사용 가능한 버킷을 나열할 수 없습니다. 작업이 실패하고 플레이북 실행을 중지합니다. 잘못된 사용자 인증 정보, 서버 연결 없음과 같은 치명적인 오류가 보고되는 경우: ''버킷 나열' 작업을 실행하는 중에 오류가 발생했습니다. 이유: {0}'.format(error.Stacktrace) |
일반 |
핑
Google Security Operations Marketplace 탭의 통합 구성 페이지에서 제공된 매개변수를 사용하여 AWS S3에 대한 연결을 테스트합니다.
사용 사례
연결을 테스트합니다.
실행
이 작업은 항목에서 실행되지 않습니다.
작업 결과
스크립트 결과
| 스크립트 결과 이름 | 값 옵션 | 예 |
|---|---|---|
| is_success | True/False | is_success:False |
케이스 월
| 결과 유형 | 값 / 설명 | 유형 |
|---|---|---|
| 출력 메시지* | 작업이 실패하거나 플레이북 실행을 중지하지 않습니다. 성공한 경우: '제공된 연결 매개변수를 사용하여 AWS S3 서버에 성공적으로 연결되었습니다.' 작업이 실패하고 플레이북 실행을 중지합니다. 실패한 경우: 'AWS S3 서버에 연결할 수 없습니다. 오류: {0}".format(exception.stacktrace) |
일반 |
버킷 정책 설정
AWS S3의 버킷에 정책을 설정합니다.
매개변수
| 매개변수 표시 이름 | 유형 | 기본값 | 필수 항목 | 설명 |
|---|---|---|---|---|
| 버킷 이름 | 문자열 | 해당 사항 없음 | 예 | 정책을 업데이트할 버킷의 이름을 지정합니다. |
| 정책 JSON 객체 | 문자열 | 해당 사항 없음 | 예 | 버킷에 설정할 정책의 JSON 객체를 지정합니다. 예는 https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html에서 확인할 수 있습니다. |
실행
이 작업은 항목에서 실행되지 않습니다.
작업 결과
스크립트 결과
| 스크립트 결과 이름 | 값 옵션 | 예 |
|---|---|---|
| is_success | True/False | is_success:False |
JSON 결과
bucket_policy = {
'Version': '2012-10-17',
'Statement': [{
'Sid': 'AddPerm',
'Effect': 'Allow',
'Principal': '*',
'Action': ['s3:GetObject'],
'Resource': f'arn:aws:s3:::{bucket_name}/*'
}]
}
케이스 월
| 결과 유형 | 값 / 설명 | 유형 |
|---|---|---|
| 출력 메시지* | 작업이 실패하거나 플레이북 실행을 중지하지 않습니다. 상태 코드 == 204 (is_success = true인 경우) 'AWS S3에서 '{0}' 버킷의 정책을 업데이트했습니다.'.format(bucket_name) 다른 상태 코드인 경우 (is_success=false): 'AWS S3에서 '{0}' 버킷의 정책을 업데이트할 수 없습니다.'.format(bucket_name) 작업이 실패하고 플레이북 실행을 중지합니다. 잘못된 사용자 인증 정보, 서버 연결 없음과 같은 치명적인 오류의 경우: ''버킷 정책 설정' 작업을 실행하는 중에 오류가 발생했습니다. 이유: {0}'.format(error.Stacktrace) |
버킷에 파일 업로드
AWS S3의 버킷에 파일을 업로드합니다.
매개변수
| 매개변수 표시 이름 | 유형 | 기본값 | 필수 항목 | 설명 |
|---|---|---|---|---|
| 파일 경로 | 문자열 | 해당 사항 없음 | 예 | 업로드해야 하는 파일의 경로를 지정합니다. |
| 버킷 업로드 경로 | 문자열 | s3://{bucket_name}/{file_name} | 예 | 경로를 업로드할 버킷의 경로를 지정합니다. 예: s3://siemplify/syslog/log.txt |
실행
이 작업은 항목에서 실행되지 않습니다.
작업 결과
스크립트 결과
| 스크립트 결과 이름 | 값 옵션 | 예 |
|---|---|---|
| is_success | True/False | is_success:False |
JSON 결과
{
"bucket_upload_path": "s3://testsiemplify/test/123.txt"
"file_path": "/usr/bin/share/download.txt"
}
케이스 월
| 결과 유형 | 값 / 설명 | 유형 |
|---|---|---|
| 출력 메시지* | 작업이 실패하거나 플레이북 실행을 중지하지 않습니다. 상태 코드 == 200(is_success = true인 경우) '{0}을(를) AWS S3 {1} 버킷에 업로드했습니다.'.format(file_path, bucket name aka first string after s3://) 파일이 없는 경우(is_success = false) '작업이 '{0}'을(를) AWS S3에 업로드할 수 없습니다. 이유: 해당 업로드 경로의 파일이 존재하지 않습니다.' 작업이 실패하고 플레이북 실행을 중지합니다. 잘못된 사용자 인증 정보, 서버 연결 없음과 같은 치명적인 오류, SDK 오류인 경우: ''버킷에 파일 업로드' 작업을 실행하는 중에 오류가 발생했습니다. 이유: {0}'.format(error.Stacktrace) |
일반 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.