1. Giới thiệu
Mặc định , tất cả các object là private - nghĩa là chỉ bucket account owner mới có quyền truy cập vào đối tượng . Nếu bạn muốn user có thể truy cập đến bucket cụ thể hoặc object mà không public chúng bạn có thể cung cấp cho user với quyền thích hợp sử dụng IAM policy . Ngoài ra để cho phép truy cập sử dụng IAM policy ban cũng có thể tạo một presigned URL - nghĩa là user có thể tương tác với object mà không cần AWS credentials or IAM permissions.
Presigned URLs là gì ?
Một presigned URLs là một URl mà bạn có thể cung cấp cho user của bạn quyền truy cập tạm thời vào một s3 object cụ thể . Sử dụng URL một user có thể read hoặc write một object . URL chứa những parammeters cụ thể được set bởi application của bạn . Một presigned URLs sử dụng 3 parameters để giới hạn truy cập của user
Bucket : Bucket mà chúng ta muốn upload một object vào đó
Key : Tên của object
expires : Thời gian hết hợn của URL . Người dùng không thể tương tác với object khi URL đã hết hạn
AWS cho truy cập object thông qna presigned URL URl này được ký xác nhận bởi S3 bucket owner.
Bất kỳ một pre signed URl hợp lệ có thể tương tác với object được chỉ định trong quá trình được tạo . Ví dụ nếu là GET(READ) pre-signed URL thì user không thể PUT(write ) object lên s3
Bản thân URL là một cấu trúc sử dụng các parameters khác nhau và được tạo tự động thông qua AWS JS SDK . Bao gồm :
-
- X-AMZ-Algorithm
-
- X-AMZ-Credential
-
- X-AMZ-Date
-
- X-AMZ-Expires
-
- X-AMZ-Signature
-
- X-AMZ-SignedHeaders
https://presignedurldemo.s3.eu-west-2.amazonaws.com/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJJWZ7B6WCRGMKFGQ%2F20180210%2Feu-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180210T171315Z&X-Amz-Expires=1800&X-Amz-Signature=12b74b0788aa036bc7c3d03b3f20c61f1f91cc9ad8873e3314255dc479a25351&X-Amz-SignedHeaders=host
Ví dụ presigned URL ở trên có thể sử để GET object . Presign URl có thời gian expires tối đa là 7 ngày
2. Làm thế nào để tạo một presigned URL ?
Đầu tiên chúng ta cần tạo một IAM user có thể truy cập READ và Write object đến s3. Một API key được tạo cho IAM user . Nó sẽ được lưu là một biến môi trường trên server.
- Đi đến s3 và tạo một bucket . Tên bucket phải là duy nhất.
- Đi đến IAM
- Tạo một user với Programmatic access
- Click NEXT: Permissions
- Click vào Attach existing policies directly và Create policy
- Sử sdungj visual editor để chọn s3 Service. Chúng tôi chỉ cần một vài yêu cầu truy cập Vì vậy hãy mở rộng access level groups
- Hãy đảm bảo rằng GetObject cho READ và PutOject cho WRITE được đánh dấu tick
- Set resources mà bạn muốn cho phpes truy cập cụ thể là tên bucket mà bạn đã tạo trước đó và bất kỳ tên đối tượng nào.
- Chúng ta không chỉ định bất kỳ yêu cầu điều kiên
- Click Review Policy và enter tên cho policy và lưu lại
- Apply policy mới cho user mới mà bạn đã tạo mà chú ý thông tin xác thực quyền truy cập
Tạo preSigned URL sử dụng AWS JS SDK
Dưới đây có 2 phương thức để tạo GET URL and PUT URL sử dụng lớp AWS s3
3. Sử dụng presigned URL
Sử dụng GET URL bạnh có thể dơn gian sử dụng bất kì trình duyệt nào . Để sử dụng PUT URL bạn có thể sử dụng POSTMAN
Sau khi upload :
- Nhược điểm của presigned URL Hiệ n tại thì presigned URL không support giới hạn dung lương file upload . PUT Presigned URl giới hạn file có dung lượng 5GB. Sử dụng POST mang lại sự linh hoạt hơn khi implement upload file . Một object có thể upload sử dụng multipart upload API và giwosi hạn size 5TB.
4. Presigned POST URLS POST presigned giống như PUT cho phép bạn thêm một object lên s3 bucket . POST presinged URL có nhiều parameters hơn PUT presinged. Nó có thể giới hạn kích cỡ file tải lên và nó cho phép upload trực tiếp đến s3 sử dụng HTML form .
5. POST URL Parameters
Chi tiết bạn có thể tham khảo : https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html
Bucket : process.env.S3_BUCKET (tên bucket)
Expires: 1800 (Thời gian hết hạn)
key: 'image.jpg' (Filename)
{ acl: 'private' } (Nó xác định tài khoản hoặc nhóm AWS nào được cấp quyền truy cập và loại quyền truy cập)
success_action_status: "201" Http status code sẽ được trả về nếu upload thành công
['starts-with', '$key', ''] (Giá trị phải bắt đầu với giá trị được chỉ định)
['content-length-range', 0, 100000] Xác định kích cỡ fiel được upload
{'x-amz-algorithm': 'AWS4-HMAC-SHA256'} : Chỉ định thuật toán ký được sử dụng trong quá trình tính toán chữ ký
6. Tham khảo
Bài viết được dịch từ https://medium.com/@aidan.hallett/securing-aws-s3-uploads-using-presigned-urls-aa821c13ae8d
Bạn có thể tham khỏa thêm : https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html
Cảm ơn các bạn đã đọc baif viết !