使用源函數 ARN 控制函數訪問行為 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用源函數 ARN 控制函數訪問行為

Lambda 函數程式碼通常會向其他 AWS 服務發出 API 要求。若要提出這些請求,Lambda 會擔任函數的執行角色,以產生一組暫時性憑證。這些憑證在函數調用期間可當成環境變數使用。使用 AWS SDK 時,您不需要直接在程式碼中提供 SDK 的憑證。根據預設,憑證提供者鏈會依序檢查您可以設定憑證的每個位置,並選取第一個可用的位置,通常是環境變數 (AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN)。

如果請求是來自執行環境中的 AWS API 請求,則 Lambda 會將來源函數 ARN 插入認證內容中。針對 Lambda 代表您在執行環境外發出的下列 AWS API 請求,Lambda 也會插入來源函數 ARN:

服務 動作 原因
CloudWatch 日誌 CreateLogGroup, CreateLogStream, PutLogEvents

將記錄檔儲存到 CloudWatch 記錄檔記錄群組

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) 以自動加密和解密您的環境變數。

  • 對 Amazon Elastic Compute Cloud (Amazon EC2) 發出的呼叫,目的是為已啟用 VPC 的函數建立彈性網絡介面 (ENI)。

  • 呼叫 AWS 服務 (例如 Amazon Simple Queue Service (Amazon SQS),以便從設定為事件來源映射的事件來源讀取。

您可以使用憑證內容中的來源函數 ARN,驗證對資源的呼叫是否來自特定 Lambda 函數的程式碼。若要驗證這一點,請在 IAM 身分型政策或服務控制政策 (SCP) 中使用lambda:SourceFunctionArn條件金鑰。

注意

您無法在資源型政策中使用 lambda:SourceFunctionArn 條件索引鍵。

在您的身分型政策或 SCP 中使用此條件,您可以針對函數程式碼對其他服務執行的 API 動作實作安全性控制。 AWS 此操作具有一些關鍵的安全保護作用,例如,協助您識別憑證洩漏的來源。

注意

lambda:SourceFunctionArn 條件索引鍵與 lambda:FunctionArnaws:SourceArn 條件索引鍵不同。lambda:FunctionArn 條件索引鍵僅適用於事件來源映射,會協助定義您的事件來源可以呼叫哪些函數。aws:SourceArn條件金鑰僅適用於 Lambda 函數作為目標資源的政策,並協助定義哪些其他 AWS 服務和資源可以叫用該函數。lambda:SourceFunctionArn條件金鑰可套用至任何以身分識別為基礎的政策或 SCP,以定義具有對其他資源進行特定 AWS API 呼叫之權限的特定 Lambda 函數。

若要在政策中使用 lambda:SourceFunctionArn,請將其作為任何 ARN 條件運算子的條件,納入到政策中。索引鍵的值必須為有效的 ARN。

例如,假設您的 Lambda 函數程式碼會進行 s3:PutObject 呼叫,該呼叫以特定 Amazon S3 儲存貯體為目標。您可能希望僅允許一個特定 Lambda 函數擁有對該儲存貯體的 s3:PutObject 存取權。在此情況下,您函數的執行角色應連接有類似以下的政策:

範例 授予特定 Lambda 函數存取權以存取 Amazon S3 資源的政策
{ "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 用於特定函數版本或別名,則您的函數將無權執行您指定的動作。務必為您的函數使用不符資格的 ARN,而不使用版本或別名後綴。

您也可以lambda:SourceFunctionArn在 SCP 中使用。例如,假設您要僅讓單一 Lambda 函數的程式碼或來自 Amazon 虛擬私有雲端 (VPC) 的呼叫能存取儲存貯體。以下 SCP 對此進行說明。

範例 在特定條件下拒絕對 Amazon S3 的存取的政策
{ "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" } } } ] }

除非 S3 動作來自具有 ARN arn:aws:lambda:*:123456789012:function:source_lambda 的特定 Lambda 函數,或是其來自指定的 VPC,否則此政策會拒絕所有 S3 動作。僅在請求中包含 aws:SourceVpc 索引鍵時,StringNotEqualsIfExists 運算子才會告訴 IAM 處理此條件。同樣地,僅在 lambda:SourceFunctionArn 存在時,IAM 才會考慮 ArnNotEqualsIfExists 運算子。