Cloudfront unable to access encrypted file in S3 - amazon-web-services

I have encrypted all files in S3, after that I am unable to access them using cloudfront, all the policies are same as before when files were not encrypted but still not accessable after encryption. I have used Origin Access Control but no luck.

Related

Protect s3 Object from Public

I want to protect my s3 object from Public access and the object can only be accessed from my origin. How can I do that? I tried by setting Objects Access control to Private, then Set in the buckets CORS settings, Allowed origin to my origin with the method GET but I'm getting an error while accessing the object.
How do I set the bucket to access the bucket objects only from my origin?
It sounds like you might be asking how to make an Amazon S3 bucket accessible to a specific Amazon CloudFront distribution.
From Restricting Access to Amazon S3 Content by Using an Origin Access Identity - Amazon CloudFront:
To restrict access to content that you serve from Amazon S3 buckets, follow these steps:
Create a special CloudFront user called an origin access identity (OAI) and associate it with your distribution.
Configure your S3 bucket permissions so that CloudFront can use the OAI to access the files in your bucket and serve them to your users. Make sure that users can’t use a direct URL to the S3 bucket to access a file there.
After you take these steps, users can only access your files through CloudFront, not directly from the S3 bucket.

Can I access S3 bucket using cloudflare without changing the bucket permission to public

I am trying to use S3 bucket to save pdf and image files uploaded by user for my website. I am accessing the S3 data using cloudflare and used setup as mentioned in S3 with Cloudflare disallow direct access and How to serve files from S3 via CloudFlare
But if I make the bucket not public then I m not able to access the data. Is there any way to access the S3 data through cloudflare without making the S3 bucket public ?
You can restrict access to your Amazon S3 bucket and objects to only the Cloudflare IP addresses.
Here's how to restrict S3 access to certain IP adresses using a bucket policy.

AWS S3 SSE : s3 managed keys encrypted object upload using python

I am simply trying to upload encrypted object to S3 bucket.
I have gone through the AWS documentation on SSE.
Most confusing part is I am not clear on :
1. If we need to set default server side encryption option to AES256(I am assuming it is S3 managed key) for bucket before uploading object to s3
or
2. we can directly upload to s3 bucket without having any server side encryption option set for that bucket?
Assuming second point true, I have tried to upload object on S3 specifying extra arguments:
s3_con.upload_file('abc.txt','s3_key_path/abc.txt',ExtraArgs={"ServerSideEncryption": "AES256"})
I was able to upload file using above code line but the file was not encrypted.
So I guess I need to try first point before uploading to bucket.
How can I upload encrypted object using server side encryption using S3 managed key in python and what steps I need to do for this?
The file is encrypted. Look at the Properties > Encryption tab in the AWS console for that S3 object.
You can see the contents because SSE-S3 (AES-256) is transparent at-rest encryption. S3 encrypts the object as it's written to disk, and decrypts it as it's read from disk. Because you have permission to get the object, that process is transparent to you.
You also have other encryption options including KMS managed keys, your own managed keys, and doing client-side encryption prior to sending to S3.

How to use AWS S3 server side encryption SSE?

Say for example I leave an AWS S3 bucket open to the public.
My goal is that if someone downloads a file from that bucket then what they get is an encrypted file.
I thought SSE-S3 would do this but it does not - it appears that any file downloaded is not encrypted.
So how can I reach my goal of ensuring that files served from S3 are encrypted?
What you are looking for is Protecting Data Using Client-Side Encryption. If you want S3 to serve encrypted files, then you have to save them as encrypted object. You manage encryption/decryption. SSE will store the data after encrypting it and will decrypt it automatically when it is downloaded.
From: Protecting Data Using Encryption
Use Server-Side Encryption – You request Amazon S3 to encrypt your object before saving it on disks in its data centers and decrypt it when you download the objects.
Use Client-Side Encryption – You can encrypt data client-side and upload the encrypted data to Amazon S3. In this case, you manage the encryption process, the encryption keys, and related tools.

Cloudfront 403 error while accessing files uploaded by another account

I have a Cloudfront distribution which takes one of my s3 buckets as its origin server. The files are uploaded to s3 by a third party attachment uploader.
When I try to access the file in s3 via cloudfront I am getting a 403 Forbidden error with an Access Denied XML (as below). But when I manually upload files to the s3 bucket I am able to access the file via cloudfront.
The permission for both the files are same except the owner of the file. For the file uploaded by me manually the owner, of the file is my account and for the file uploaded by the uploader, it is the uploader. The third party attachment uploader gives full access of the object to the bucket owner. Also, I have restricted bucket access but not viewer access.
What are the reasons which can cause this error? How do I go about debugging this?
When a second AWS account uploads content to an S3 bucket serving content via CloudFront with OAI, the uploaded file needs to have the OAI canonical ID added with the --grant read=id="OAI-canonical-ID" when the file is uploade; also add the S3 bucket owner as a grant full=id="BucketOwnerID". The aws cli was used to perform the uploaded. Adjust according for the method that is used.
When the file is viewed in the S3 bucket, the permissions will have CloudFront listed as a grantee. The file should be readable via CloudFront.
It is possible that the "Access Denied" response you are receiving is a response from S3 that is cached by CloudFront from before the object was available in S3.
For example, if you try the CloudFront URL and the file does not exist in S3, then you'll get the "Access Denied" response. Even after uploading the file, CloudFront will have the "Access Denied" response cached until the end of the TTL. During this time, you will continue to receive the "Access Denied" response.
Try invalidating the distribution. After that, request the file and see if you get the correct response.
If this solves the problem, then you need to figure out how to avoid requesting the object from CloudFront before it exists in S3.