AWS S3 and CloudFront Restrict Bucket Access - amazon-web-services

How do you restrict bucket access of an endpoint?
Here's my password protected CloudFront page:
d2hyhnit1e4g1k.cloudfront.net where the protection is created through a Lambda function.
I want to restrict access to my endpoint so I can't access the endpoint through http://data-flood.s3-website-us-east-1.amazonaws.com only through CloudFront.

It's easy: Simply do not grant public access to the bucket.
By default, Amazon S3 buckets are private. Therefore, nobody should be able to access the bucket.
But, you ask, how can CloudFront access the bucket to serve content? The answer is Restricting Access to Amazon S3 Content by Using an Origin Access Identity - Amazon CloudFront. That way, CloudFront can access the bucket, but nobody else can access it.

Related

How to access objects in S3 bucket, without making the object's folder public

I have provided AmazonS3FullAccess policy for both the IAM user and group. Also the buket that I am trying to access says "Objects can be public". I have explicitly made the folder inside the bucket public. Despite all this I am getting access denied error when I tried to access it through its url. Any idea on this?
Objects in Amazon S3 are private by default. This means that objects are not accessible by anonymous users.
You have granted permission for your IAM User to be able to access S3. Therefore, you have access to the objects but you must identify yourself to S3 so that it can verify your identity.
You should be able to access S3 content:
Via the Amazon S3 management console
Using the AWS CLI (eg aws s3 ls s3://bucketname)
Via authenticated requests in a web browser
I suspect that you have been accessing your bucket via an unauthenticated request (eg bucketname.s3.amazonaws.com/foo.txt. Unfortunately, this does not tell Amazon S3 who you are, so it will deny the request.
To access content with this type of URL, you can generate an Amazon S3 pre-signed URLs, which appends some authentication information to the URL to prove your identity. An easy way to generate the URL is with the AWS CLI:
aws s3 presign s3://bucketname/foo.txt
It will return a URL that looks like this:
https://bucketname.s3.amazonaws.com/foo.txt?AWSAccessKeyId=AKIAxxx&Signature=xxx&Expires=1608175109
The URL will be valid for one hour by default, up to 7 days.
There are two ways I will recommend.
go to s3 dashboard, and download the object you need, one by one manually, the bucket can be kept private at the same time.
build a gateway/a small service, to handle authentication for you, set a policy and give the permission to the service container/lambda to visit the private bucket, and restrict only specific users to download the objects.
References
download from aws s3
aws policy, permission and roles

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.

Enable CDN to S3 bucket without granting public access in AWS

I am trying to set up Amazon cloud front with s3 bucket behind. As per my company policy i cannot grant public access to the bucket.
How can we achieve this without violating company security?
People should able to access content with only URL.

Restrict world access to Amazon S3 URLs

I've configured an S3 bucket with CloudFront and using alternate domain name provided by CludFront (I setup the domain alias images.mydomain.com at my DNS zone file).
At my DNS host the CNAME I'm pointing to xyz.cloudfront.net. Both my s3 bucket name and CNAME domain alias are images.mydomain.com.
I want world to access my images at images.mydomain.com/image.jpg and this is working perfectly.
The problem is the same resource is directly accessible by the world via below two URLs too and I don't want this to happen. I want only images.mydomain.com/image.jpg to work for world and not the below two.
images.mydomain.com.s3.amazonaws.com/image.jpg
s3.amazonaws.com/images.mydomain.com/image.jpg
How do I achieve this? please help.
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html
You restrict access to Amazon S3 content by creating an origin access
identity, which is a special CloudFront user. You change Amazon S3
permissions to give the origin access identity permission to access
your objects, and to remove permissions from everyone else. When your
users access your Amazon S3 objects using CloudFront URLs, the
CloudFront origin access identity gets the objects on your users'
behalf. If your users try to access objects using Amazon S3 URLs,
they're denied access. The origin access identity has permission to
access objects in your Amazon S3 bucket, but users don't.