소스 함수 ARN으로 함수 접근 동작 제어
소스 함수 ARN으로 함수 접근 동작 제어
Lambda 함수 코드가 다른 AWS 서비스에 API 요청을 하는 것은 흔합니다. 이런 요청을 하기 위해 Lambda는 함수의 실행 역할을 가정하여 임시 자격 증명 집합을 생성합니다. 이 자격 증명은 함수 호출 중 환경 변수로 사용할 수 있습니다. AWS SDK로 작업할 때는 코드에서 SDK에 자격 증명을 직접 제공할 필요가 없습니다. 기본적으로 자격 증명 공급자 체인은 자격 증명을 설정할 수 있는 각 위치를 순차적으로 확인하고 첫 번째 사용 가능한 것을 선택합니다. 보통 환경 변수(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN)입니다.
본문
요청이 실행 환경 내부에서 오는 AWS API 요청이면 Lambda는 자격 증명 컨텍스트에 소스 함수 ARN(source function ARN)을 주입합니다. Lambda는 또한 실행 환경 밖에서 사용자를 대신해 만드는 다음 AWS API 요청에 대해서도 소스 함수 ARN을 주입합니다.
| 서비스 | 액션 | 이유 |
|---|---|---|
| CloudWatch Logs | CreateLogGroup, CreateLogStream, PutLogEvents | CloudWatch Logs 로그 그룹에 로그를 저장하기 위해 |
| X-Ray | PutTraceSegments | 추적 데이터를 X-Ray로 보내기 위해 |
| Amazon EFS | ClientMount | 함수를 Amazon Elastic File System(Amazon EFS) 파일 시스템에 연결하기 위해 |
Lambda가 실행 환경 밖에서 같은 실행 역할을 사용해 사용자를 대신해 만드는 다른 AWS API 호출에는 소스 함수 ARN이 포함되지 않습니다. 실행 환경 밖의 API 호출 예시는 다음과 같습니다.
- 환경 변수를 자동으로 암호화·복호화하기 위한 AWS Key Management Service(AWS KMS) 호출.
- VPC 활성화 함수의 탄력적 네트워크 인터페이스(ENI) 생성을 위한 Amazon Elastic Compute Cloud(Amazon EC2) 호출.
- 이벤트 소스 매핑으로 설정된 이벤트 소스에서 읽기 위한 Amazon Simple Queue Service(SQS) 같은 AWS 서비스 호출.
자격 증명 컨텍스트의 소스 함수 ARN으로 리소스에 대한 호출이 특정 Lambda 함수 코드에서 왔는지 검증할 수 있습니다. 이를 검증하려면 IAM 자격 증명 기반 정책 또는 서비스 제어 정책(SCP)에서 lambda:SourceFunctionArn 조건 키를 사용하세요.
리소스 기반 정책에서는 lambda:SourceFunctionArn 조건 키를 사용할 수 없습니다.
자격 증명 기반 정책이나 SCP에 이 조건 키를 사용하면 함수 코드가 다른 AWS 서비스에 만드는 API 액션에 대한 보안 제어를 구현할 수 있습니다. 여기에는 자격 증명 유출의 출처를 식별하는 데 도움이 되는 것 같은 몇 가지 핵심 보안 용도가 있습니다.
lambda:SourceFunctionArn 조건 키는 lambda:FunctionArn 및 aws:SourceArn 조건 키와 다릅니다. lambda:FunctionArn 조건 키는 이벤트 소스 매핑에만 적용되며 이벤트 소스가 호출할 수 있는 함수를 정의하는 데 도움을 줍니다. aws:SourceArn 조건 키는 Lambda 함수가 대상 리소스인 정책에만 적용되며 어떤 다른 AWS 서비스와 리소스가 그 함수를 호출할 수 있는지 정의하는 데 도움을 줍니다. lambda:SourceFunctionArn 조건 키는 어떤 자격 증명 기반 정책이나 SCP에든 적용해 다른 리소스에 특정 AWS API 호출을 할 권한이 있는 특정 Lambda 함수를 정의할 수 있습니다.
정책에서 lambda:SourceFunctionArn을 사용하려면 ARN 조건 연산자 중 하나와 조건으로 포함하세요. 키 값은 유효한 ARN이어야 합니다.
예를 들어 Lambda 함수 코드가 특정 Amazon S3 버킷을 대상으로 하는 s3:PutObject 호출을 한다고 가정하세요. 하나의 특정 Lambda 함수만 그 버킷에 s3:PutObject 접근 권한을 가지도록 하고 싶을 수 있습니다. 이 경우 함수의 실행 역할에는 다음과 같은 정책이 연결되어야 합니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "ExampleSourceFunctionArn",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::lambda_bucket/*",
"Condition": {
"ArnEquals": {
"lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
}
}
}
]
}
이 정책은 소스가 ARN arn:aws:lambda:us-east-1:123456789012:function:source_lambda인 Lambda 함수일 때만 s3:PutObject 접근을 허용합니다. 이 정책은 다른 호출 자격 증명에는 s3:PutObject 접근을 허용하지 않습니다. 다른 함수나 엔티티가 같은 실행 역할로 s3:PutObject 호출을 해도 마찬가지입니다.
lambda:SourceFunctionARN 조건 키는 Lambda 함수 버전이나 함수 별칭을 지원하지 않습니다. 특정 함수 버전이나 별칭의 ARN을 사용하면 함수가 지정한 액션을 수행할 권한이 없게 됩니다. 버전이나 별칭 접미사가 없는 정규화되지 않은(unqualified) 함수 ARN을 사용하세요.
SCP에서도 lambda:SourceFunctionArn을 사용할 수 있습니다. 예를 들어 버킷 접근을 단일 Lambda 함수의 코드나 특정 Amazon Virtual Private Cloud(VPC)의 호출로 제한하려고 한다고 가정해보세요. 다음 SCP가 이를 보여줍니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::lambda_bucket/*",
"Effect": "Deny",
"Condition": {
"StringNotEqualsIfExists": {
"aws:SourceVpc": [
"vpc-12345678"
]
}
}
},
{
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::lambda_bucket/*",
"Effect": "Deny",
"Condition": {
"ArnNotEqualsIfExists": {
"lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
}
}
}
]
}
이 정책은 ARN arn:aws:lambda:*:123456789012:function:source_lambda인 특정 Lambda 함수에서 오거나 지정된 VPC에서 오는 경우가 아니면 모든 S3 액션을 거부합니다. StringNotEqualsIfExists 연산자는 요청에 aws:SourceVpc 키가 있을 때만 이 조건을 처리하도록 IAM에 지시합니다. 마찬가지로 IAM은 lambda:SourceFunctionArn이 존재할 때만 ArnNotEqualsIfExists 연산자를 고려합니다.