Lambda 격리 기술 - AWS Lambda 보안 개요

Lambda 격리 기술

Lambda는 다양한 오픈 소스 및 독점 격리 기술을 사용하여 작업자와 실행 환경을 보호합니다. 각 실행 환경에는 다음 항목의 전용 복사본이 포함되어 있습니다.

  • 특정 함수 버전의 코드

  • 함수 버전에 대해 선택된 모든 AWS Lambda 계층

  • 선택한 함수 런타임(예: Java 11, NodeJS 12, Python 3.8 등) 또는 함수의 사용자 지정 런타임

  • 쓰기 가능한 /tmp 디렉터리

  • Amazon Linux 2를 기반으로 한 최소한의 Linux 사용자 공간

실행 환경은 AWS 독점 격리 기술과 함께 Linux 커널에 내장된 여러 컨테이너 유사 기술을 사용하여 서로 격리됩니다. 이러한 기술은 다음과 같습니다.

  • cgroups– CPU 및 메모리에 대한 함수의 액세스를 제한하는 데 사용됩니다.

  • namespaces – 각 실행 환경은 전용 네임스페이스에서 실행됩니다. 고유한 그룹 프로세스 ID, 사용자 ID, 네트워크 인터페이스 및 기타 Linux 커널에 의해 관리되는 리소스를 사용하여 이를 수행합니다.

  • seccomp-bpf – 실행 환경 내에서 사용할 수 있는 시스템 호출(syscalls)을 제한합니다.

  • iptables 라우팅 테이블 – 수신 네트워크 통신을 방지하고 MVM 간의 네트워크 연결을 분리합니다.

  • chroot – 기반 파일 시스템에 대한 범위가 한정된 액세스를 제공합니다.

  • Firecracker 구성 – 블록 디바이스 및 네트워크 디바이스 처리량을 제한하는 데 사용됩니다.

  • Firecracker 보안 기능 – Firecracker의 현재 보안 설계에 대한 자세한 내용은 Firecracker의 최신 설계 문서를 참조하세요.

이러한 메커니즘은 AWS의 고유한 격리 기술과 함께 실행 환경 간의 강력한 격리 기능을 제공합니다.

스토리지 및 상태

실행 환경은 서로 다른 함수 버전이나 고객 간에 재사용되지 않지만 동일한 함수 버전을 호출하는 사이에 단일 환경을 재사용할 수 있습니다. 즉, 호출 사이에 데이터와 상태가 지속될 수 있습니다. 데이터 및/또는 상태는 정상적인 실행 환경 수명 주기 관리의 일부로 제거되기 전에 몇 시간 동안 계속 유지될 수 있습니다. 성능상의 이유로 함수는 호출 간에 로컬 캐시 또는 오래 지속되는 연결을 유지하고 재사용하여 효율성을 향상할 수 있습니다. 실행 환경 내에서 이러한 여러 호출은 단일 프로세스에 의해 처리되므로, 재사용된 실행 환경에서 호출이 발생하는 경우 프로세스 차원의 상태(예: Java의 정적 상태)를 향후 재사용할 호출에 사용할 수 있습니다.

각 Lambda 실행 환경에는 /tmp에서 사용할 수 있는 쓰기 가능한 파일 시스템도 포함되어 있습니다. 이 스토리지는 실행 환경 간에 액세스하거나 공유할 수 없습니다. 프로세스 상태와 마찬가지로 /tmp에 기록된 파일은 실행 환경의 수명 기간 동안 유지됩니다. 따라서 ML(기계 학습) 모델을 다운로드하는 것과 같은 값비싼 전송 작업을 여러 호출에 걸쳐 분할할 수 있습니다. 호출 간에 데이터를 유지하지 않을 함수의 경우, 호출 사이에 /tmp에 쓰거나 /tmp에서 파일을 삭제하지 않아야 합니다. /tmp 디렉터리는 Amazon EC2 인스턴스 스토어에서 지원되며 저장 시 암호화됩니다.

실행 환경 외부에서 파일 시스템에 데이터를 유지하려는 고객은 Lambda와 Amazon Elastic File System(Amazon EFS)을 통합하는 것을 고려해야 합니다. 자세한 내용은 AWS Lambda와 함께 Amazon EFS 사용을 참조하세요.

고객이 호출 간에 데이터 또는 상태를 유지하지 않으려는 경우, 실행 컨텍스트 또는 실행 환경을 사용하여 데이터나 상태를 저장하지 않는 것이 좋습니다. 고객이 호출 전반에 걸쳐 데이터 또는 상태 유출을 적극적으로 방지하려는 경우, Lambda는 각 상태에 대해 고유한 함수를 생성할 것을 권장합니다. Lambda는 보안에 중요한 상태가 호출 간에 변경될 수 있으므로 고객이 실행 환경에 사용하거나 저장하는 것을 권장하지 않습니다. 대신 각 호출 상태를 다시 계산하는 것이 좋습니다.