조직은 Serverless Framework 생태계 내에서 가장 높은 수준의 엔터티입니다. 이는 여러 프로젝트, 팀 및 애플리케이션을 포함하는 집단 그룹을 나타냅니다. 예를 들어 회사, 부서 또는 대규모 엔터티가 될 수 있습니다.
팀
팀은 조직 내에서 접근 권한이 있는 사용자들입니다. 팀은 역할에 따라 구성원을 조직하는 데 도움을 줍니다. **협력자**는 기존 앱을 보고 배포할 수 있으며, **관리자**는 새로운 앱을 생성하고 조직 설정을 관리할 수 있습니다.
애플리케이션
앱은 조직 내 관련 서비스의 논리적 그룹입니다. 이는 여러 서버리스 서비스로 구성된 완전한 애플리케이션을 나타내며, 이 서비스들은 함께 작동하여 일관된 기능을 제공합니다.
서비스
서비스는 서버리스 애플리케이션의 핵심 구성 요소입니다. 이는 전체 서버리스 프로젝트를 나타내며, 필요한 모든 함수, 구성 및 리소스를 캡슐화합니다. 일반적으로 serverless.yml 파일에 정의되며, 서비스에는 서비스 이름, 제공자 구성, 함수, 이벤트, 리소스, 플러그인 및 사용자 정의 변수를 포함한 메타데이터가 포함됩니다.
# Create temp folder for the tutorialmkdir/tmp/serverless-tutorialcd/tmp/serverless-tutorial# Install Serverless clinpminstall-gserverless# Generate templateserverless#Choose first one (AWS / Node.js / HTTP API)## Indicate a name like "Tutorial"## Login/Register## Create A New App## Indicate a name like "tutorialapp)
이것은 app을 tutorialapp이라고 생성했어야 하며, serverless.com에서 확인할 수 있고, helloworld 코드가 포함된 JS 코드가 있는 handler.js 파일과 해당 함수를 선언하는 serverless.yml 파일이 있는 Tutorial이라는 폴더를 생성했어야 합니다:
exports.hello=async (event) => {return {statusCode:200,body:JSON.stringify({message:"Go Serverless v4! Your function executed successfully!",}),};};
# "org" ensures this Service is used with the correct Serverless Framework Access Key.org:testing12342# "app" enables Serverless Framework Dashboard features and sharing them with other Services.app:tutorialapp# "service" is the name of this project. This will also be added to your AWS resource names.service:Tutorialprovider:name:awsruntime:nodejs20.xfunctions:hello:handler:handler.helloevents:- httpApi:path:/method:get
이 템플릿은 **SFRole-<ID>**라는 역할을 생성하며, **arn:aws:iam::aws:policy/AdministratorAccess**를 통해 Serverless.com AWS 계정이 역할에 접근할 수 있도록 허용하는 신뢰 ID를 갖습니다.
Yaml roleTemplate
```yaml Description: This stack creates an IAM role that can be used by Serverless Framework for use in deployments. Resources: SFRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: arn:aws:iam::486128539022:root Action: - sts:AssumeRole Condition: StringEquals: sts:ExternalId: !Sub 'ServerlessFramework-${OrgUid}' Path: / RoleName: !Ref RoleName ManagedPolicyArns: - arn:aws:iam::aws:policy/AdministratorAccess ReporterFunction: Type: Custom::ServerlessFrameworkReporter Properties: ServiceToken: 'arn:aws:lambda:us-east-1:486128539022:function:sp-providers-stack-reporter-custom-resource-prod-tmen2ec' OrgUid: !Ref OrgUid RoleArn: !GetAtt SFRole.Arn Alias: !Ref Alias Outputs: SFRoleArn: Description: 'ARN for the IAM Role used by Serverless Framework' Value: !GetAtt SFRole.Arn Parameters: OrgUid: Description: Serverless Framework Org Uid Type: String Alias: Description: Serverless Framework Provider Alias Type: String RoleName: Description: Serverless Framework Role Name Type: String ```
튜토리얼에서는 기본적으로 새로운 API 엔드포인트를 생성하는 createCustomer.js 파일을 만들고, 생성된 람다를 사용할 역할을 정의하며 새로운 DynamoDB 테이블을 생성하고 환경 변수를 정의하기 위해 serverless.yml 파일을 수정하라고 요청합니다.
# "org" ensures this Service is used with the correct Serverless Framework Access Key.org:testing12342# "app" enables Serverless Framework Dashboard features and sharing them with other Services.app:tutorialapp# "service" is the name of this project. This will also be added to your AWS resource names.service:Tutorialprovider:name:awsruntime:nodejs20.xenvironment:DYNAMODB_CUSTOMER_TABLE:${self:service}-customerTable-${sls:stage}iam:role:statements:- Effect:'Allow'Action:- 'dynamodb:PutItem'- 'dynamodb:Get*'- 'dynamodb:Scan*'- 'dynamodb:UpdateItem'- 'dynamodb:DeleteItem'Resource:arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage}functions:hello:handler:handler.helloevents:- httpApi:path:/method:getcreateCustomer:handler:createCustomer.createCustomerevents:- httpApi:path:/method:postresources:Resources:CustomerTable:Type:AWS::DynamoDB::TableProperties:AttributeDefinitions:- AttributeName:primary_keyAttributeType:SBillingMode:PAY_PER_REQUESTKeySchema:- AttributeName:primary_keyKeyType:HASHTableName:${self:service}-customerTable-${sls:stage}
serverless deploy 실행하여 배포합니다.
배포는 CloudFormation Stack을 통해 수행됩니다.
람다 함수는 직접 URL이 아닌 API 게이트웨이를 통해 노출됩니다.
테스트합니다.
이전 단계에서 API 엔드포인트 람다 함수가 배포된 URL이 출력됩니다.
Serverless.com의 보안 검토
잘못 구성된 IAM 역할 및 권한
과도하게 허용된 IAM 역할은 클라우드 리소스에 대한 무단 액세스를 허용하여 데이터 유출 또는 리소스 조작으로 이어질 수 있습니다.
상세한 오류 메시지는 인프라 또는 코드베이스에 대한 민감한 정보를 유출할 수 있으며, 처리되지 않은 예외는 애플리케이션 충돌로 이어질 수 있습니다.
완화 전략
일반 오류 메시지: 오류 응답에서 내부 세부 정보를 노출하지 않도록 합니다.
javascriptCopy code// Node.js의 예exports.hello=async (event) => {try {// 함수 로직} catch (error) {console.error(error);return {statusCode:500,body:JSON.stringify({ message:'Internal Server Error' }),};}};
중앙 집중식 오류 처리: 모든 함수에서 일관되게 오류를 관리하고 정화합니다.
오류 모니터링 및 로깅: 세부 정보를 최종 사용자에게 노출하지 않고 내부적으로 오류를 추적하고 분석합니다.
안전하지 않은 배포 관행
노출된 배포 구성 또는 CI/CD 파이프라인에 대한 무단 액세스는 악의적인 코드 배포 또는 잘못된 구성을 초래할 수 있습니다.
완화 전략
CI/CD 파이프라인 보안: 엄격한 액세스 제어, 다단계 인증(MFA) 및 정기 감사 구현합니다.
구성을 안전하게 저장: 배포 파일에서 하드코딩된 비밀 및 민감한 데이터를 제거합니다.
코드로서의 인프라(IaC) 보안 도구 사용:Checkov 또는 Terraform Sentinel과 같은 도구를 사용하여 보안 정책을 시행합니다.
불변 배포: 불변 인프라 관행을 채택하여 배포 후 무단 변경을 방지합니다.
플러그인 및 확장 프로그램의 취약점
검증되지 않거나 악의적인 제3자 플러그인을 사용하면 서버리스 애플리케이션에 취약점을 도입할 수 있습니다.
완화 전략
플러그인 철저히 검토: 통합 전에 플러그인의 보안을 평가하고, 평판이 좋은 출처의 플러그인을 선호합니다.
플러그인 사용 제한: 공격 표면을 최소화하기 위해 필요한 플러그인만 사용합니다.
플러그인 업데이트 모니터링: 보안 패치를 활용하기 위해 플러그인을 업데이트합니다.
플러그인 환경 격리: 잠재적인 손상을 방지하기 위해 플러그인을 격리된 환경에서 실행합니다.
민감한 엔드포인트 노출
공개적으로 접근 가능한 함수 또는 제한 없는 API는 무단 작업에 악용될 수 있습니다.
완화 전략
함수 액세스 제한: VPC, 보안 그룹 및 방화벽 규칙을 사용하여 신뢰할 수 있는 출처로의 액세스를 제한합니다.
강력한 인증 구현: 모든 노출된 엔드포인트가 적절한 인증 및 권한 부여를 요구하도록 합니다.
API 게이트웨이를 안전하게 사용: API 게이트웨이를 구성하여 입력 검증 및 속도 제한을 포함한 보안 정책을 시행합니다.
사용하지 않는 엔드포인트 비활성화: 더 이상 사용되지 않는 엔드포인트를 정기적으로 검토하고 비활성화합니다.
팀원 및 외부 협력자에 대한 과도한 권한
팀원 및 외부 협력자에게 과도한 권한을 부여하면 무단 액세스, 데이터 유출 및 리소스 남용으로 이어질 수 있습니다. 여러 개인이 다양한 수준의 액세스를 가진 환경에서는 이러한 위험이 증가하여 공격 표면과 내부 위협의 가능성이 높아집니다.
완화 전략
최소 권한 원칙: 팀원 및 협력자가 작업을 수행하는 데 필요한 권한만 가지도록 합니다.
액세스 키 및 라이센스 키 보안
액세스 키 및 라이센스 키는 Serverless Framework CLI와의 상호 작용을 인증하고 권한을 부여하는 데 사용되는 중요한 자격 증명입니다.
라이센스 키: CLI를 통해 로그인할 수 있도록 하는 Serverless Framework 버전 4에 대한 인증에 필요한 고유 식별자입니다.
액세스 키: Serverless Framework Dashboard와 인증하기 위해 Serverless Framework CLI가 사용하는 자격 증명입니다. serverless cli로 로그인할 때 액세스 키가 생성되어 노트북에 저장됩니다. 또한 SERVERLESS_ACCESS_KEY라는 환경 변수로 설정할 수 있습니다.
보안 위험
코드 리포지토리를 통한 노출:
액세스 키 및 라이센스 키를 하드코딩하거나 우연히 버전 관리 시스템에 커밋하면 무단 액세스가 발생할 수 있습니다.
안전하지 않은 저장:
환경 변수나 구성 파일 내에 평문으로 키를 저장하면 유출 가능성이 높아집니다.
부적절한 배포:
안전하지 않은 채널(예: 이메일, 채팅)을 통해 키를 공유하면 악의적인 행위자에게 가로채질 수 있습니다.