本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用源函數 ARN 控制函數訪問行為
Lambda 函數程式碼通常會向其他 AWS 服務發出 API 要求。若要提出這些請求,Lambda 會擔任函數的執行角色,以產生一組暫時性憑證。這些憑證在函數調用期間可當成環境變數使用。使用 AWS
SDK 時,您不需要直接在程式碼中提供 SDK 的憑證。根據預設,憑證提供者鏈會依序檢查您可以設定憑證的每個位置,並選取第一個可用的位置,通常是環境變數 (AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_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:FunctionArn
和 aws: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
運算子。