Khắc phục lỗi AWS AccessDenied: Đã xảy ra lỗi (AccessDenied) khi gọi thao tác: Access Denied

intermediate☁️ AWS2026-03-16| AWS CLI, AWS SDK (Python, Node.js, Java, v.v.), Bảng điều khiển quản lý AWS, bất kỳ hệ điều hành nào (Linux, macOS, Windows)

Error Message

An error occurred (AccessDenied) when calling the operation: Access Denied

Bối cảnh: Các lỗi AccessDenied phổ biến của AWS

Bạn đang cố gắng thực hiện một tác vụ nào đó trong AWS—như liệt kê các bucket S3, gọi một hàm Lambda hoặc truy cập bảng DynamoDB. Sau đó, đột nhiên, bạn gặp phải một bức tường. Thiết bị đầu cuối của bạn báo: An error occurred (AccessDenied) when calling the operation: Access Denied. Thật bực bội phải không?

Thông báo này là cách AWS muốn nói, "Bạn không có quyền làm điều đó." Mặc dù đây là một tính năng bảo mật, không phải lỗi, nhưng nó chắc chắn có thể gây khó khăn đáng kể khi bạn không biết bắt đầu tìm giải pháp từ đâu.

Nguyên nhân gốc rễ hầu như luôn nằm ở AWS Identity and Access Management (IAM). Điều này có thể xuất phát từ một vấn đề với người dùng IAM, một vai trò IAM, hoặc thậm chí là một chính sách dựa trên tài nguyên (chẳng hạn như chính sách S3 bucket) đang chặn hành động của bạn. Mục tiêu của chúng tôi ở đây là giúp bạn khắc phục sự cố và giải quyết hiệu quả những vấn đề đau đầu về quyền phổ biến này.

Quy trình gỡ lỗi: Xác định vấn đề về quyền

Khi lỗi AccessDenied xuất hiện, hãy kiềm chế thôi thúc thêm quyền một cách mù quáng. Đó là một rủi ro bảo mật đáng kể. Thay vào đó, hãy áp dụng một phương pháp gỡ lỗi có hệ thống để xác định chính xác quyền bị thiếu.

1. Xác định Người dùng (Principal) và Tài nguyên (Resource)

Trước khi đi sâu, hãy làm rõ ba câu hỏi cơ bản: ai đang cố gắng làm với tài nguyên nào? Điều này có vẻ đơn giản, nhưng đây là bước đầu tiên rất quan trọng:

  • Người dùng (Principal): Yêu cầu đến từ Người dùng IAM (IAM User), Vai trò IAM (IAM Role) (có thể gắn với một phiên bản EC2, một hàm Lambda, hoặc được lấy thông qua AWS SSO), hay thông tin đăng nhập tạm thời?
  • Hành động (Action): Bạn đang cố gắng thực hiện lệnh gọi API AWS cụ thể nào? Các ví dụ phổ biến bao gồm s3:ListBucket, s3:GetObject, lambda:InvokeFunction, hoặc dynamodb:GetItem. Thông thường, thông báo lỗi sẽ cung cấp manh mối về thao tác đã thất bại.
  • Tài nguyên (Resource): Amazon Resource Name (ARN) của tài nguyên cụ thể bạn đang cố gắng truy cập là gì? Ví dụ, đó có thể là arn:aws:s3:::my-unique-bucket cho một S3 bucket, hoặc arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function cho một hàm Lambda.

2. Kiểm tra nhật ký CloudTrail

Để khắc phục các lỗi AccessDenied, CloudTrail là một công cụ không thể thiếu. Nó ghi lại một cách tỉ mỉ gần như tất cả các lệnh gọi API được thực hiện trong tài khoản AWS của bạn. Nếu bạn đã cấu hình một trail đúng cách, điều này thường cung cấp con đường nhanh nhất để có được thông tin chi tiết:

  • Truy cập Bảng điều khiển quản lý AWS và điều hướng đến dịch vụ CloudTrail.
  • Chọn Lịch sử sự kiện (Event history).
  • Lọc các sự kiện theo "Tên sự kiện" (lệnh gọi API bạn đã thử) hoặc theo "Tên người dùng" (người dùng IAM hoặc vai trò đã khởi tạo yêu cầu bị lỗi).
  • Tìm kiếm các sự kiện trong "Bản ghi sự kiện" hiển thị rõ ràng "errorCode": "AccessDenied".

Bản ghi sự kiện CloudTrail có thể tiết lộ các chi tiết quan trọng, bao gồm:

  • userIdentity.arn: Amazon Resource Name (ARN) của người dùng (principal) đã thực hiện yêu cầu.
  • eventName: Hành động API cụ thể đã bị từ chối.
  • requestParameters: Thông tin bổ sung về yêu cầu, chẳng hạn như tài nguyên mục tiêu.
  • errorMessage: Thường là một thông báo chính xác hơn, đôi khi còn trực tiếp xác định quyền bị thiếu. Ví dụ: "User: arn:aws:iam::ACCOUNT_ID:user/myuser is not authorized to perform: s3:ListBucket on resource: arn:aws:s3:::my-unique-bucket".

3. Kiểm tra Chính sách dựa trên danh tính (IAM User/Role)

Sau khi đã xác định người dùng (principal) và hành động bị từ chối, bước tiếp theo của bạn là kiểm tra các chính sách được liên kết với người dùng hoặc vai trò IAM cụ thể đó:

  • Đi đến dịch vụ IAM trong Bảng điều khiển quản lý AWS.
  • Chuyển đến Người dùng (Users) hoặc Vai trò (Roles) và định vị người dùng (principal) có liên quan.
  • Xem xét tất cả các chính sách được đính kèm, bao gồm cả chính sách nội tuyến (inline policies) và chính sách được quản lý (managed policies). Cụ thể, tìm kiếm hành động đã bị từ chối (ví dụ: s3:ListBucket).

Luôn ưu tiên tìm kiếm bất kỳ câu lệnh Deny nào. Hãy nhớ rằng, một Deny rõ ràng luôn có quyền ưu tiên hơn một câu lệnh Allow. Nếu không có Deny nào, vấn đề có thể là thiếu câu lệnh Allow cho hành động và tài nguyên cụ thể đó.

4. Kiểm tra Chính sách dựa trên tài nguyên

Một số dịch vụ AWS, bao gồm S3 buckets, hàng đợi SQS và khóa KMS, cho phép bạn đính kèm chính sách trực tiếp vào chính tài nguyên. Đây được gọi là chính sách dựa trên tài nguyên. Điều quan trọng là, chính sách S3 bucket, chẳng hạn, có thể từ chối quyền truy cập ngay cả khi người dùng hoặc vai trò IAM của bạn có các quyền cần thiết.

Hãy xem xét ví dụ S3 này:

  • Điều hướng đến dịch vụ S3 trong Bảng điều khiển AWS.
  • Chọn bucket cụ thể có liên quan đến vấn đề của bạn.
  • Chuyển đến tab Quyền (Permissions) và xem lại Chính sách bucket (Bucket policy).

Quét tìm bất kỳ câu lệnh Deny nào có thể ảnh hưởng đến người dùng (principal) của bạn hoặc hành động bạn đang cố gắng thực hiện. Đôi khi, một Deny rộng cho các kết nối không được mã hóa hoặc các người dùng (principal) chung có thể là nguyên nhân gốc rễ của các vấn đề truy cập.

5. Cân nhắc Chính sách kiểm soát dịch vụ (SCPs)

Trong một AWS Organization, Chính sách kiểm soát dịch vụ (SCPs) đóng vai trò quan trọng bằng cách hạn chế quyền cho các tài khoản riêng lẻ. Hãy coi SCPs như những hàng rào bảo vệ; chúng định nghĩa các quyền tối đa mà một tài khoản có thể có. Nếu một SCP từ chối rõ ràng một hành động, thì không chính sách IAM nào, bất kể cấu hình của nó, có thể cấp quyền đó. Nếu bạn nghi ngờ một SCP đang ảnh hưởng đến quyền truy cập của mình, hãy tham khảo ý kiến quản trị viên AWS Organization của bạn.

Giải pháp: Cấp quyền phù hợp

Khi nỗ lực gỡ lỗi của bạn đã xác định được khoảng trống quyền cụ thể, bạn sẽ cần điều chỉnh chính sách IAM hoặc chính sách tài nguyên. Khi thực hiện những thay đổi này, hãy luôn tuân thủ nghiêm ngặt nguyên tắc đặc quyền tối thiểu: chỉ cung cấp những quyền hoàn toàn cần thiết cho tác vụ.

Kịch bản 1: Thiếu quyền trong chính sách IAM

Ví dụ, hãy tưởng tượng CloudTrail báo cáo rằng hành động s3:ListBucket đã bị từ chối đối với người dùng IAM myuser của bạn khi cố gắng truy cập bucket my-unique-bucket.

Đoạn chính sách IAM đề xuất:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3ListSpecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::my-unique-bucket"
        },
        {
            "Sid": "AllowS3GetObjectsInSpecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::my-unique-bucket/*"
        }
    ]
}

Bạn sẽ đính kèm đoạn chính sách này trực tiếp vào người dùng hoặc vai trò IAM cần quyền truy cập. Lưu ý việc bao gồm /* quan trọng đối với các hành động cấp đối tượng, chẳng hạn như GetObject, để chỉ định đúng quyền cho tất cả các đối tượng trong bucket.

Kịch bản 2: Chính sách S3 Bucket hạn chế

Hãy tưởng tượng người dùng IAM của bạn có quyền s3:GetObject, nhưng chính sách S3 bucket từ chối rõ ràng quyền truy cập đối với các người dùng (principal) bên ngoài một VPC Endpoint cụ thể. Kịch bản này sẽ ghi đè hiệu quả câu lệnh Allow của người dùng IAM của bạn.

Ví dụ về chính sách S3 Bucket có vấn đề:

{
    "Version": "2012-10-17",
    "Id": "Policy1684344555",
    "Statement": [
        {
            "Sid": "DenyAllExceptVPCEndpoint",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-unique-bucket",
                "arn:aws:s3:::my-unique-bucket/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-0a1b2c3d"
                }
            }
        }
    ]
}

Nếu lỗi AccessDenied phát sinh từ một chính sách như vậy, bạn thường có hai hướng hành động chính:

  • Sửa đổi chính sách bucket: Nếu nó phù hợp với tư thế bảo mật của bạn, hãy thêm một câu lệnh Allow rõ ràng vào chính sách bucket dành riêng cho người dùng (principal) của bạn, hoặc nới lỏng điều kiện Deny hiện có.
  • Truy cập từ một nguồn được phép: Nếu Deny là có chủ đích và được thực thi nghiêm ngặt (ví dụ: chỉ cho phép truy cập từ một VPC endpoint), bạn phải truy cập tài nguyên từ trong môi trường được ủy quyền đó.

Một giải pháp thường xuyên liên quan đến việc thêm một câu lệnh Allow rõ ràng vào chính sách bucket. Điều này cho phép vai trò hoặc người dùng IAM cụ thể của bạn truy cập bucket, ngay cả khi tồn tại các điều kiện Deny khác không trực tiếp khớp với Principal của bạn:

{
    "Version": "2012-10-17",
    "Id": "Policy1684344555",
    "Statement": [
        {
            "Sid": "AllowMySpecificRole",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_ID:role/my-trusted-role"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-unique-bucket/*"
        },
        {
            "Sid": "DenyAllExceptVPCEndpoint",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-unique-bucket",
                "arn:aws:s3:::my-unique-bucket/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-0a1b2c3d"
                }
            }
        }
    ]
}

Điều quan trọng là phải nhớ rằng các chính sách IAM và chính sách tài nguyên được đánh giá độc lập. Quyền truy cập bị từ chối nếu một trong hai chính sách từ chối rõ ràng. Ngược lại, nếu không có chính sách nào từ chối rõ ràng, và ít nhất một chính sách cho phép, thì quyền truy cập được cấp.

Các bước xác minh: Xác nhận sửa lỗi

Sau khi triển khai các thay đổi của bạn, hãy luôn xác minh kỹ lưỡng việc sửa lỗi:

1. Chạy lại lệnh/thao tác bị lỗi

Nếu bạn đang sử dụng AWS CLI, chỉ cần thực thi lại lệnh đã bị lỗi trước đó. Ví dụ, để liệt kê các S3 bucket:

aws s3 ls my-unique-bucket

Hoặc để truy xuất một đối tượng:

aws s3 cp s3://my-unique-bucket/my-file.txt ./my-file.txt

Nếu lỗi xảy ra trong một ứng dụng hoặc lệnh gọi SDK, hãy khởi động lại ứng dụng hoặc kích hoạt lại hàm cụ thể.

2. Kiểm tra lại CloudTrail

Sau khi cố gắng xác minh, hãy kiểm tra lại CloudTrail. Bạn sẽ thấy một sự kiện thành công (được chỉ ra bởi "errorCode": null hoặc không có trường errorCode) cho hành động bạn vừa thực hiện. Điều này xác nhận vấn đề về quyền đã được giải quyết.

3. Sử dụng Trình mô phỏng chính sách IAM

Đối với các tình huống phức tạp hơn hoặc để thử nghiệm chủ động, Trình mô phỏng chính sách IAM (IAM Policy Simulator) trong Bảng điều khiển AWS cực kỳ hữu ích. Bạn có thể chọn người dùng hoặc vai trò IAM, chỉ định các hành động và tài nguyên AWS, và xem trước cách các chính sách hiện có—bao gồm các chính sách dựa trên tài nguyên và SCP—sẽ ảnh hưởng đến kết quả.

Bài học: Tránh các lỗi AccessDenied trong tương lai

  • Nguyên tắc đặc quyền tối thiểu: Luôn bắt đầu bằng cách cấp các quyền tối thiểu tuyệt đối cần thiết, chỉ thêm khi thực sự cần. Việc cấp quyền quá mức thể hiện một lỗ hổng bảo mật đáng kể.
  • Sử dụng vai trò IAM: Đối với các dịch vụ AWS như phiên bản EC2, hàm Lambda, và các dịch vụ khác, hãy luôn sử dụng vai trò IAM thay vì mã hóa cứng thông tin đăng nhập hoặc đính kèm trực tiếp chính sách vào người dùng cho các quy trình tự động.
  • Gắn thẻ tài nguyên: Sử dụng thẻ (tags) để tổ chức tài nguyên của bạn một cách hiệu quả. Các thẻ này sau đó có thể được tham chiếu trong các chính sách IAM để cấp quyền truy cập cho các nhóm tài nguyên, ví dụ: Allow S3 actions on resources with Tag:Environment = Production.
  • Hiểu logic đánh giá chính sách: Luôn nhớ rằng một câu lệnh Deny rõ ràng sẽ luôn ghi đè một Allow. Các chính sách IAM và chính sách tài nguyên được đánh giá khác nhau, vì vậy việc hiểu rõ sự tương tác của chúng là chìa khóa.
  • Giám sát bằng CloudTrail và AWS Config: Đảm bảo CloudTrail được bật trên tất cả các khu vực để ghi nhật ký toàn diện. Ngoài ra, AWS Config có thể giúp giám sát các chính sách tài nguyên không tuân thủ.
  • Kiểm tra chính sách bằng Trình mô phỏng chính sách IAM: Trước khi triển khai các chính sách mới hoặc thực hiện các sửa đổi đáng kể, hãy tận dụng Trình mô phỏng chính sách để dự đoán chính xác các tác động của chúng.

Xử lý các lỗi AccessDenied là một trải nghiệm phổ biến đối với bất kỳ ai làm việc với AWS. Bằng cách gỡ lỗi một cách có hệ thống, hiểu rõ việc đánh giá chính sách và tuân thủ nghiêm ngặt các phương pháp hay nhất, bạn sẽ giải quyết những vấn đề này nhanh hơn và góp phần xây dựng một môi trường đám mây an toàn hơn.

Related Error Notes