AWS에서 Step 함수 데이터 읽기 방지

AWS Step Functions는 장기간 실행, 복잡성 또는 비즈니스 크리티컬 워크플로우(결제 또는 구독 흐름)를 처리하는 완벽한 도구입니다.그러나 간단한 실현은 민감한 데이터를 위험에 처하게 할 수 있다.

AWS 계단식 함수는 무엇입니까?


AWS Step Functions는 Amazon 클라우드 서비스로 상태기를 만들고 여러 Lambda 함수, 지점 논리와 외부 서비스를 한 위치에 조화롭게 하는 데 목적을 둔다.이것은 serverless services의 대부분의 장점을 보여 준다. 축소는 즉각적이고 가격은 계산 시간과 단계적 전환에 기초한 수량에 불과하다.
상태기는 JSON 구성을 통해 AWS 콘솔에서 직접 정의할 수 있으며, 워크플로우의 그래픽 표현을 직접 얻을 수 있습니다.

AWS 단계 기능 상태도
Theodo에서 우리는 Serverless를 우리의 프레임워크로 사용하고 Step Functions 플러그인을 사용하여 AWS Lambda 함수를 작성하여 우리의 자원(DynamoDB와 대기열)을 정의하고 우리의 코드 라이브러리에 AWS Step 함수와 상태기를 직접 설정합니다.

예: Step 기능이 있는 인증 워크플로우


위의 그림은 인증 워크플로우를 보여 줍니다.이것은 은행 응용 프로그램의 더 큰 검증 흐름의 일부분이다.
이것은 제3자 시스템에 표지 URL을 요청하여 문자로 이 링크를 신청자에게 보내고 인증이 완료되기를 기다리는 것이다.
완성된 후 제3자 시스템은 웹훅을 호출하고 웹훅은 상태기를 다시 시작하며 재시도를 터치하고 거부 이메일을 보내거나 전역 검증 과정을 계속합니다.

식별 프로세스
이러한 모든 작업을 수행하기 위해 민감한 정보는 상태 머신 단계의 입력과 출력을 통과합니다.
  • 👤 신청인의 개인정보는 제3자 서비스로 발송하여 신원을 검사한다
  • 📱 신청인이 문자를 보낸 전화번호
  • ✉️ 신청인이 보낸 메일의 이메일 주소
  • ✔️ 인증 결과
  • 문제: 민감한 데이터를 공개하고 있습니다.


    이를 통해 우리는 민감한 데이터가 상태기의 입력과 출력을 직접 통과하는 것을 볼 수 있다.
    state-machine.yaml
    ----------
    
    SendIdentificationRequest:
      Type: Task
      Resource: arn:aws:states:::lambda:invoke
      Parameter:
        FunctionName:
          Fn::ImportValue: ${self:provider.stage}-sendSMS-Function-arn
        Payload:
          creditApplicationId.$: $.creditApplicationId
          creditApplicant.$: $.creditApplicant
          phoneNumber.$: $.phoneNumber
          message.$: $.smsBody
      ResultPath: $.identificationSMS
      Next: WaitIdentification
    
    입력과 출력을 통한 민감한 데이터 예
    문제는 현재 대부분의 DevOps 엔지니어, 개발자, 심지어 일부 제품 매니저들이 AWS를 방문하여 이러한 정보를 볼 수 있다는 것이다.GDPR은 우호적이지 않습니까?또한 AWS Lambda 덤프는 S3 저장소에 저장되며, 이 저장소는 기본 설정 암호화를 사용하지 않습니다.AWS 스택에 대한 악의적인 접근은 데이터베이스 파괴보다 민감한 정보를 누설할 수 있다.여러 서비스 간에 민감한 정보를 전파할수록 위험은 커진다.마지막으로 AWS documentation 설명:

    Any data that you enter into Step Functions or other services might get picked up for inclusion in diagnostic logs.


    이 점을 기억하십시오. AWS 단계 함수를 완전히 저장하거나 해결 방안을 찾으려고 시도할 수 있습니다. 이 도구는 여전히 훌륭하고 당신의 요구에 적합하기 때문입니다!

    Dell의 솔루션


    민감한 정보가 누설되는 것을 방지하기 위해서, 우리는 모든 단계의 함수 입력과 출력을 정리해야 한다.여기에는 두 가지 방법이 있다.
  • 입력과 출력에 데이터를 보존하지만 단계별로 암호화 및 복호화

  • 단계 간에 민감한 데이터를 전송하고 실행 중에 직접 검색하지 마십시오
  • 이 두 가지 해결 방안은 모두 실행할 수 있다.그러나 우리는 두 번째 방법을 더욱 좋아한다. 왜냐하면 우리는 민감한 데이터를 안전한 곳에 저장하고 그곳에서 안전성을 매우 중시하기 때문이다.
    우리는 이미 AWS DynamoDB를 lambda 함수의 대기 영패로 사용하고 있기 때문에 절차 간의 민감한 데이터를 저장할 새 표를 만들기로 결정했다.
    외부 KMS 키를 사용하여 다음과 같이 구성합니다.
    resources.yaml
    ----------
    
    StepSentiveInputTable:
      Type: AWS::DynamoDB::Table
      DeletetionPolicy: Retain
      Properties:
        TableName: step-sensitive-input-table
        AttributeDefinitions:
          - AttributeName: sensitiveInputId
            AttributeType: S
        KeySchema:
          - AttributeName: sensitiveInputId
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST
        PointInTimeRecoverySpecification:
          PointINTimeRecoveryEnabled: true
        SSESpecification:
          SSEEnabled: true
          SSEType: KMS
          KeyId: hsm-key-id
    
    서버에서 DynamoDB 테이블 정의 없음
    우리는 이미 lambda의 DynamoDB를 사용하여 기다리는 작업 영패를 저장하고 있으며, 단계 사이의 민감한 데이터를 저장하기 위해 다른 표를 추가하기로 했습니다.또한 AWS에서 DynamoDB 테이블의 암호화 키를 AWS에 저장하는 것을 선택할 수 있습니다. 이것은 저희에게 큰 장점입니다.
    중복을 피하기 위해서, 우리는 모든 lambda에 사용할 포장기를 만들었다.다음 작업을 수행합니다.
    lambda로 돌아가면 포장기:
  • 출력에서 민감한 데이터 키를 찾아 삭제하고 이 정보로 대상을 구축
  • 민감한 데이터 대상을dynamo 항목에 저장
  • 출력
  • 의 "sensitive Data"키에 새로운dynamo 항목의 id를 추가합니다
    주 lambda 함수를 실행하기 전에 패키지:
  • 입력에서 SensiveData 찾기
  • 특정 ID에서 컨텐츠 검색
  • SensiveData 키를 입력의 결과 객체로 교체
  • // encryption-wrapper.ts
    
    export default (lambdaHandler: LambdaHandler): LambdaHandler => {
      const decryptHandler = async (event: any) => {
        const decryptedInformation = await getSensitiveData(event.sensitiveInputId);
        return lambdaHandler({ ...event, ...decryptedInformation });
      };
    
      return async (event: any) => {
        const clearOutput = await decryptHandler(event);
        const sensitiveInputId = await storeSensitiveData(clearOutput);
    
        for (const sensitiveKey of sensitiveInputKeys) {
          delete clearOutput[sensitiveKey];
        }
    
        return { sensitiveInputId, ...clearOutput };
      };
    };
    
    사용자 정의 암호화 패키지
    마지막으로, 우리는 API의 상태기가 시작할 때 첫 번째 입력을 암호화하여 최종적으로 사용자 정보의 안전을 보호해야 한다!

    활주로

  • lambda와 AWS의 상태기 이벤트 중 어떤 정보가 있는지 주의하세요
  • 로그에 입력한 데이터에 대해 곰곰이 생각해 보십시오
  • 가능한 한 적은 서비스에서 귀하의 비밀과 안전 실시를 전파
  • 여러 lambda 함수에서 행동을 반복하려면 포장기를 사용하십시오.
  • 내 글을 읽어줘서 고마워요.AWS Step 함수를 사용할 때 발생하는 문제에 대해 언제든지 의견을 발표하고 세부 사항을 문의하십시오.

    좋은 웹페이지 즐겨찾기