주요 콘텐츠로 건너뛰기

Amazon S3

목적

이벤트 알림 기능과 Lambda 함수를 통해 Glasswall Halo API를 사용하여 Amazon S3 버킷에서 자동 파일 sanitization을 설정합니다.

Amazon S3 통합 가이드


필수 조건

  • 다음 권한 policy가 있는 AWS 계정 및 IAM (Identity and Access Management) 역할:

    • Amazons3fullaccess: S3 버킷을 생성하고 구성하기 위한 권한입니다.
    • Amazonsqsfullaccess: 트리거에 사용되는 SQS 대기열을 생성하고 구성하기 위한 권한입니다.
    • Awslambda_fullaccess: Glasswall Halo를 호출하는 람다 함수를 생성하고 구성하기 위한 권한입니다.
    • (선택 사항) iamfullaccess: 새 함수의 기본 실행 역할을 생성하고 구성하는 데 필요합니다. 이 역할을 할당할 수 없는 경우, 이 가이드의 관련 단계를 따라 역할 생성을 요청한 다음, 미리 생성된 이 역할을 사용하세요.
  • Glasswall Halo의 동기식 API에 대한 인증된 액세스.


1단계 - S3 버킷 생성

먼저 원본 파일이 추가될 S3 버킷을 생성해야 하며, 이 버킷은 워크플로를 트리거하는 이벤트의 소스가 됩니다.

  1. AWS management console에 로그인합니다.

  2. Navigate to the Amazon S3 console by entering “S3” in the search bar or by selecting S3 under the Services > Storage menu.

Awss3 - step 1a

  1. 왼쪽 탐색 창에서 Buckets를 선택합니다.

  2. Create bucket를 클릭합니다. Create bucket 페이지가 열립니다.

Awss3 - step 1b

  1. 버킷 이름에는 버킷의 이름을 입력합니다. 버킷 이름은 다음 조건을 충족해야 합니다:
  • 파티션 내에서 고유해야 합니다. 파티션은 리전의 그룹이며, AWS에는 현재 세 개의 파티션이 있습니다: aws(표준 리전), aws-cn(중국 리전), aws-us-gov(AWS govcloud (us) 리전).
  • 길이는 3자에서 63자 사이여야 합니다.
  • 소문자, 숫자, 점(.), 하이픈(-)만 사용해야 합니다. 최상의 호환성을 위해 정적 웹사이트 호스팅에만 사용하는 버킷이 아닌 경우에는 버킷 이름에 점(.)을 사용하지 않는 것을 권장합니다.
  • 문자 또는 숫자로 시작하고 끝나야 합니다.

버킷 이름은 전역적으로 고유해야 하며, 입력한 버킷 이름이 이미 사용 중인 경우 AWS 콘솔의 유효성 검사에서 알려줍니다.

참고: 버킷을 생성한 후에는 이름을 변경할 수 없습니다. 버킷 이름 지정에 대한 자세한 내용은 bucket naming rules를 참조하세요.

  1. Region에서는 버킷을 위치시킬 AWS 리전을 선택합니다.

참고: 지연 시간과 비용을 최소화하고 규제 요구 사항을 충족하려면 가까운 리전을 선택하세요. 리전에 저장된 객체는 명시적으로 다른 리전으로 전송하지 않는 한 해당 리전을 벗어나지 않습니다. Amazon S3 AWS 리전 목록은 amazon web services general reference의 AWS service endpoints를 참조하세요.

액세스 제어, 로깅, 버전 관리 또는 암호화와 같이 버킷에 추가 설정이 필요한 경우 그에 맞게 구성할 수 있습니다.

또한 권한 설정 섹션에서 버킷 policy, 액세스 제어 목록(ACL) 또는 모든 퍼블릭 액세스 차단과 같은 옵션을 선택하여 누가 버킷과 해당 객체에 액세스할 수 있는지 정의할 수 있습니다. 계속 진행하기 전에 요구 사항에 따라 이러한 구성을 검토하고 설정해야 합니다.

S3 버킷 생성 및 구성에 대한 자세한 내용은 AWS S3 user guide를 참조하세요.


2단계 - SQS 큐 생성

S3 버킷이 생성된 후에는 Amazon SQS (Simple Queue Service) 큐를 생성해야 합니다. 이 큐는 소스 S3 버킷의 이벤트 알림이 전송되고 Lambda 함수가 이를 가져가는 위치입니다.

  1. Navigate to the Amazon SQS console by searching for “SQS” in the search bar or by selecting Simple Queue Service under the Services > Application integration menu.

  2. Create queue를 클릭합니다.

Awss3 - step 2a

  1. SQS 큐의 두 가지 유형인 Standard 또는 FIFO 중에서 선택합니다.

Standard 큐는 높은 처리량과 최선형 순서 보장을 제공하는 반면, FIFO 큐는 메시지 그룹 ID를 기반으로 “정확히 한 번” 처리와 엄격한 순서를 보장합니다. 기본적으로 standard 큐 유형이 설정됩니다.

참고: 큐가 생성된 후에는 큐 유형을 변경할 수 없습니다.

  1. 큐에 사용할 고유한 Name을 입력합니다. 예: s3cdrevents.

FIFO 큐의 이름은 반드시 .fifo 접미사로 끝나야 합니다. 이 접미사는 80자 큐 이름 할당량에 포함됩니다. 큐가 fifo인지 확인하려면, 큐 이름이 해당 접미사로 끝나는지 확인하면 됩니다.

  1. 콘솔은 큐 configuration parameters의 기본값을 설정합니다. SQS에 익숙하다면 Configuration에서 매개변수의 새 값을 설정할 수 있습니다. 이 사용 사례에서는 대부분의 값을 기본값으로 유지하겠습니다.

  2. Access policy 섹션으로 스크롤합니다.

  3. S3 서비스가 큐에 메시지를 게시할 수 있도록 고급 편집기를 통해 policy JSON을 편집하려면 Advanced 옵션을 선택합니다.

  4. “__owner_statement” 요소 뒤에 쉼표를 추가한 다음, 다음 JSON 스니펫을 붙여넣습니다:

{ 
"Sid": "AllowS3ToPublish",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sqs:SendMessage",
"Resource": "<ARN-OF-QUEUE>"
}

참고: 스니펫의 arn-of-queue를 큐의 ARN (Amazon Resource Name)으로 바꿔야 합니다. 이는 기존 JSON의 owner statement에 있는 리소스 ARN과 동일합니다.

Awss3 - step 2b

  1. 입력한 구성 값을 검토한 후 Create queue를 클릭합니다.

나중에 사용할 수 있도록 큐의 ARN을 기록해 둡니다.

Amazon SQS 생성 및 구성에 대한 더 자세한 내용은 AWS S3 user guide를 참조하세요.


3단계 - 이벤트 알림 켜기

다음 단계는 이벤트 알림을 켜는 것입니다. 이렇게 하면 소스 S3 버킷에 파일이 저장될 때마다 SQS 큐가 알림을 받습니다.

  1. Amazon S3 콘솔로 이동한 다음, Buckets 목록에서 앞서 생성한 버킷을 선택합니다.

  2. Bucket overview 페이지에서 Properties 탭을 선택합니다.

  3. Event notifications 섹션까지 아래로 스크롤한 다음 Create event notification을 클릭합니다.

  4. General configuration 섹션에서 이벤트 알림에 사용할 설명이 포함된 Event name을 지정합니다. 선택적으로 PrefixSuffix도 지정하여, 키가 지정된 문자로 끝나는 객체로 알림을 제한할 수 있습니다.

  5. Event types 섹션에서 알림을 받을 하나 이상의 이벤트 유형을 선택할 수 있습니다. 이 예제에서는 새 객체 또는 복사된 객체에 대해 알림이 생성되고, 그 결과 해당 객체에 CDR가 수행되도록 Object creation 이벤트에 초점을 맞춥니다.

All object create events 체크박스를 선택합니다.

Awss3 - step 3a

  1. 마지막으로 Destination 섹션에서 이벤트 알림 대상(이 경우 우리가 생성하고 구성한 SQS queue)을 선택합니다.

대상으로 SQS queue를 선택하고, 앞서 생성하고 구성한 SQS queue를 선택합니다.

  1. Save changes를 선택하면 Amazon S3가 이벤트 알림 대상으로 테스트 메시지를 전송합니다.

이벤트 알림이 생성되며, S3 버킷 속성으로 돌아갑니다.

이벤트 알림에 대한 더 자세한 내용은 AWS S3 user guide를 참조하세요.


4단계 - Lambda function 생성

이벤트 알림을 활성화한 후에는 새 Lambda function을 생성해야 합니다.

  1. Navigate to the Lambda service by searching for “Lambda” in the search bar or by selecting Lambda under the Services > Compute menu.

  2. 왼쪽 탐색 창에서 Functions를 선택합니다.

  3. Create function을 클릭합니다.

  4. Create function 페이지에는 세 가지 옵션이 표시됩니다. Author from scratch를 선택합니다.

  5. Lambda 함수에 적절한 Function name을 입력합니다. 예: CDR-file.

Awss3 - step 4a

  1. 다음으로, 사용하려는 언어에 맞는 Runtime을 선택합니다.

참고: Glasswall github를 통해 샘플 코드를 찾을 수 있습니다. 코드는 이후 단계에서 업로드할 수 있습니다.

  1. (Optional) If you are familiar with Lambda functions, you can set additional configurations via the General configuration option under the Configurations tab.

  2. Create function을 클릭합니다. Function overview 페이지로 이동합니다.

Awss3 - step 4b

  1. Assigning the execution role can be done in two ways:
    • iamfullaccess를 사용하여 새 role 요청 및 할당
    • Assigning an already existing role
      • 이는 Lambda 서비스에서 수행할 수 있습니다: Function overview > Configuration > Permissions > Edit.

[선택 사항] iamfullaccess

iamfullaccess 권한을 할당받을 수 없는 경우, 다음 권한으로 role 생성을 요청하세요:

Logs :createlogstream

Logs :putlogevents

role을 생성할 수 있도록 Configure execution role 단계에서 완료된 JSON을 권한 있는 사용자에게 제공하세요.

이 새 role은 새 기본 role 생성을 허용하는 대신 Lambda 생성 사용자 인터페이스에서 선택할 수 있습니다.

  • Change default execution role 섹션으로 스크롤합니다.
  • Use an existing role을 선택하고 미리 생성된 role을 선택합니다.

이제 실행 role 구성의 다음 단계는 건너뛸 수 있으며 Step 6 - Upload lambda code로 진행할 수 있습니다.


5단계 - 실행 role 구성

Lambda 함수가 AWS 서비스(S3, SQS)에 액세스할 수 있도록 하려면 Lambda의 실행 role에 추가 권한을 할당해야 합니다.

  1. AWS Lambda 콘솔에서 왼쪽 탐색 창의 Functions를 선택합니다.

  2. Lambda 함수의 세부 정보 페이지에서 Configuration 탭을 선택한 다음, 왼쪽 탐색 창에서 Permissions를 클릭합니다.

  3. Execution role 아래에서 역할 이름 링크를 선택합니다. 그러면 IAM 콘솔이 열립니다.

  4. Lambda 함수 실행 역할에 대한 IAM 콘솔의 Summary 페이지에서 Permissions 탭을 선택합니다.

  5. Add permissions 메뉴에서 Create inline policy를 선택합니다.

  6. JSON 편집기로 전환합니다.

  7. 아래 스니펫에서 아래 섹션(resource)을 이전 단계에서 생성하고 기록해 둔 SQS 대기열의 ARN으로 바꿉니다:

Arn:AWS:sqs:{region}:{account}:{queuename}"

{ 
"Version": "2012-10-17",
"Statement": [
{
"Sid": "UseCaseStatement0",
"Effect": "Allow",
"Action": [
"sqs:DeleteMessage",
"sqs:GetQueueUrl",
"sqs:ReceiveMessage",
"sqs:GetQueueAttributes",
"sqs:ListQueueTags"
],
"Resource": [
"arn:aws:sqs:{Region}:{Account}:{QueueName}"
]
},
{
"Sid": "UseCaseStatement1",
"Effect": "Allow",
"Action": [
"sqs:ListDeadLetterSourceQueues",
"sqs:ListMessageMoveTasks",
"sqs:ListQueues",
"s3:GetObject",
"s3:CreateBucket",
"s3:PutObject"
],
"Resource": "*"
}
]
}
  1. 업데이트된 리소스를 포함하여 스니펫을 JSON 편집기에 붙여넣습니다.

  2. Next를 클릭합니다.

  3. policy에 Name을 지정합니다. 예: usecasepolicy.

  4. Create policy를 클릭합니다.

이제 Lambda 함수에 필요한 서비스와 상호 작용할 수 있는 권한이 있습니다.


6단계 - Lambda 코드 업로드

파일이 소스 S3 버킷에 업로드되면, Lambda가 호출될 때 이를 처리하기 위해 실행할 코드가 필요합니다.

사용 중인 framework에 따라 의도한 코드를 실행하는 Lambda function을 구동하는 방법은 여러 가지가 있지만, 이 가이드는 zip 업로드 기능에 중점을 둡니다.

framework와 관계없이 Lambda function에는 다음과 같은 로직이 적용됩니다:

  • 파일 검색: SQS 메시지를 해석하여 소스 bucket에서 파일을 검색합니다.
  • CDR 파일: 인증된 요청을 Glasswall Halo Rest API에 보냅니다.
  • 응답 처리: 성공 및 실패 응답을 모두 처리합니다.

시작하는 데 더 많은 정보가 필요하다면, 이 로직이 구현된 전체 샘플 코드베이스를 Glasswall engineering github에서 확인할 수 있습니다. 이 저장소는 여기에서 생성한 Lambda에 업로드하는 방법에 대한 지침과 함께 샘플 코드를 제공합니다. 또한 Lambda function에 사용할 수 있는 사전 빌드된 zip 파일도 제공됩니다. .md 파일 내의 지침을 참조하세요.


7단계 - 트리거 추가

이 단계에서는 트리거를 추가하여 SQS 메시지가 queue에 게시될 때 Lambda function이 호출되도록 구성합니다.

  1. function의 콘솔 페이지에 있는 Function 개요 창에서 Add trigger를 선택합니다.

  2. 사용 가능한 트리거 목록에서 SQS를 선택합니다.

  3. 이전에 생성한 SQS queue를 선택하고 Add를 클릭합니다.

Awss3 - step 7a

이제 프로세스가 완료되었으며 테스트할 준비가 되었습니다.


8단계 - 테스트

이제 모든 설정이 완료되었으므로 소스 S3 bucket에 파일을 업로드하면 몇 초 내에 동일한 이름의 파일이 clean S3 bucket에 나타납니다.

Awss3 - step 8a

Awss3 - step 8b

이 파일은 원본 파일과 시각적으로 동일한 클린 복사본이며, malware를 포함할 수 있는 위험한 콘텐츠나 구조적 결함이 제거되어 있습니다.

Glasswall Halo Portal에서 확인

  • Glasswall의 Clean a file 애플리케이션을 사용하여 원본 파일을 처리합니다.

    • 파일에는 나열된 위험한 콘텐츠 항목 또는 구조적 결함과 함께 위험 수준이 부여됩니다.
  • Clean a file 애플리케이션에서 clean S3 bucket의 정리된 파일을 처리합니다.

    • 파일은 위험한 콘텐츠나 구조적 결함 없이 clean 상태로 반환되어야 합니다.