Restricting access to CloudFront by IP - amazon-web-services

I want to restrict bucket access to certain IPs. I know how to create a bucket policy from Restricting Access to Specific IP Addresses.
My question: Can this work with CloudFront? How? Can I allow only certain IPs to access CloudFront?

Web Application Firewall is your friend.
http://docs.aws.amazon.com/waf/latest/developerguide/web-acl-ip-conditions.html
Create your rule with your IP Addresses and rest "WAF" will take care.
You need to apply this to the required CloudFront Distribution.
You can restrict your bucket policies to CloudFront and restrict to your required IP's through CloudFront.

I have created the custom rule to whitelist IPs and restrict the application with CloudFront distribution with following steps.
Steps:
Go to AWS WAF.
Create following IP match conditions under IP Addresses.
staging-appname-whitelist-ips
Create following rules under Rules.
staging-appname-ui-stack-whitelisted-ips
with condition (similar for production one)
Finally create following Web ACLs:
staging-appname-acl
Please select the correct CloudFront Distribution, above created Rule and IP Address group.
*.
AWS Resource here.
Hope it helps!

Related

How do I limit an AWS S3 HTML bucket to VPN users only?

We have a complex AWS organization with many accounts. I need to allow web browser access to an S3 HTML bucket that is limited to the VPN private IP subnet users only.
I created a VPC Interface endpoint and gave it a Route 53 alias. It's in a private subnet in a VPC in one of the accounts. In theory I think it should work from anywhere, given the security groups/NACL allow it, because the interface is just translates to a private IP. The route works according to the Route 53 check.
I have the bucket set up with access allowed from the VPC endpoint in the bucket policy, and ListBucket and GetObject allowed.
There is an index.html at the root of the bucket.
My Route 53 alias is foo.test.company.com and it points to the vpce DNS name.
When I enter foo.test.company.com into the browser I get a timeout. But there is information missing, i.e. the name of the bucket and the key. How do I include that in the url?
I believe that Route 53 is getting my correct private IP address because I can access privately named hosts in the account with my browser.
Of course I will add the VPN private subnet to the bucket conditions for production, but for now I just allow based on the VPC endpoint condition.
Any ideas?
Sadly you can't do this. Website s3 endpoints are only accessible from the internet. You can't access them from any private subnet, unless you do this through NAT over the internet.
The only solution is to not to use s3 for hosting your private website not meant for internet access.
You can add a bucket policy that limits access to the Public IP address that traffic from the VPN would appear to come from.
To explain...
Let's say that you are on the VPN and you access https://dilbert.com/. Your request will 'appear' to come from the IP address of the router that connects your VPN to the Internet. You can see this by going to https://icanhazip.com/ -- it will show the IP address that you 'appear' as on the Internet.
All requests from the VPN will come from this same IP address because they all go through the same router. Therefore, you can create a Bucket Policy that grants access to requests coming from that specific IP address. No VPC endpoints/interfaces/domain names required.

How do I host a static website on a gcs bucket inside a vpc?

AWS makes this possible with private link: https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html
I want to do this with gcs
I have a static html site I want to host on a gcs bucket
BUT I want this to be hosted inside a vpc and use GCP VPC firewall rules to control access
Cloud Storage is hosted outside your VPC. You can't set firewall rules to access it.
However, to serve static files on internet, you can put your files on Cloud Storage, create a Global HTTPS load balancer and define your bucket as backend.
You can also serve your static file through App Engine and use the App Engine firewall feature to achieve something similar to your requirements.
I'm afraid that this is not currently a possibility. There is an ongoing Feature Request that you might find useful, as there are other customers trying to achieve your exact setup.
Access control in Google Cloud Storage is based on IAM permissions and ACLs, and they are not IP based in a way where you could make use of VPC Firewall Rules.
Nonetheless, I believe that the approach that currently will be most suitable to achieve the desired behavior will be to use VPC Service Controls, where you could define a service perimeter around storage.googleapis.com (notice that you won't be able to define the perimeter to an individual bucket, but to the whole service, meaning all the buckets within that project) and take advantage of this feature. Although, notice that it has certain limitations.
Strict VPC Firewall rules won't apply within this setup, but you could define access levels to allow access to your buckets from outside the perimeter. Such levels are based on different conditions, such as IP address or user and service accounts. However, you cannot block the access to certain ports as you could with VPC Firewall rules.

How to create inbound rule on EC2 instance for requests from hosted s3 bucket

I have my web app, written in vue, and deployed on S3 using static website hosting.
I also have an EC2 instance setup which will serve as the backend for my app.
My question is, I'd like to restrict access to the EC2 instance to only requests coming from the site hosted on S3. Is that possible?
I see in the security group for the EC2 instance, I can specify the inbound traffic rule to limit from a specific IP address. However I'm not sure how I can limit it to traffic from a particular domain
The S3 app speaking to your backend will actually be using the end users internet connection in order to communicate, so you cannot use a security group to prevent this access if your application should be available publicly.
You can however lock it down so that the application can only be called from valid domain(s) only.
To do this would need to be able to control traffic by the referer header, which would require you to configure an AWS WAF and add a rule set to allow where the referer header is your domain. Then for default logic it would need to block it.
To use a WAF it would need to attached to one of the following resources:
Application Load Balancer
CloudFront
API Gateway
The resource would sit in front of the EC2 host.
For more information take a look at the How to Prevent Hotlinking by Using AWS WAF, Amazon CloudFront, and Referer Checking blog post.

Is it possible to secure Cloud front distribution to be accessed only within VPC or ECS?

I want to read an S3 through Cloud front. I have made S3 as private and I want to secure cloud front distribution url as well. Is it possible to make Cloud front accessible only with in VPC or ECS?
Thanks.
You can attach WAF(Web Applicaton Firewall) to secure the cloudfront distribution. You can utilise IP Match Condition in the WAF to allow the traffic only from a set of IPs
If you want to allow or block web requests based on the IP addresses
that the requests originate from, create one or more IP match
conditions. An IP match condition lists up to 10,000 IP addresses or
IP address ranges that your requests originate from. Later in the
process, when you create a web ACL, you specify whether to allow or
block requests from those IP addresses.

Restrict access to objects in S3

I would like to restrict access to objects stored in an Amazon S3 bucket.
I would like to allow all the users on our LAN (they may or may not have amazon credentials since the entire infrastructure is not on AWS). I have seen some discussion around IP address filtering and VPC endpoint. Can someone please help me here? I am not sure if I can use VPC endpoint since all users on our lan are not in Amazon VPC.
Is this possible?
Thanks
Most likely your corporate LAN uses static IP addresses. You can create S3 policies to allow access (or deny) based upon IP addresses. Here is a good AWS article on this:
Restricting Access to Specific IP Addresses
VPC Endpoints are for VPC to AWS Services connectivity (basically using Amazon's private Internet instead of the public Internet. VPC Endpoints won't help you with Corporate connectivity (except if you are using Direct Connect).
Here is how I would solve it,
Configure
Configure Users from a corporate directory who use identity federation with SAML.
Create Groups
Apply Policies to Group
This will give fine-grained control and less maintenance overhead.
This will help you not only to control S3 but any future workloads you migrate to AWS and permissions to those resources as well.
IP based filtering are prone to security risk and with high maintenance in the long run and not scalable.
EDIT:
Adding more documentation to do the above,
Integrating ADFS with AWS IAM:
https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/
IAM Groups:
http://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups_create.html