VPC and Subnets for me or user? - amazon-web-services

I am trying to hook up my mobile app to AWS RDS. I want my users to be able to access the Database from anywhere and I want to view my database in SQL Workbench. Are the VPC and Subnet for allowing me access to the database or my users?

Further to the answer by strongjz, I would highly recommend you put your database in a private subnet and prevent any direct connections from the internet.
To connect to it from SQL Workbench you can set up a Bastion server. This is a server that acts as a middleman between the outside internet and your private subnets. There is quite a good tutorial here on how to set one up. They are connecting to Redshift, however the process is exactly the same for connecting to RDS.
To help with the design of the subnet IP ranges, VPC Designer is a good tool for designing the different subnets.
Full disclosure, I am the creator of VPC Designer.

For security reasons and proper Mobile app architecture I would not give the mobile client direct access to the database. Just one compromised machine and your data is gone, corrupted or stolen.
Setup an API that the mobile client reach out for data requests.
Give only the API access to the Database.
Have the mobile client use something like Incognito to access resources.
Here is a reference architecture from AWS for a mobile web app.
Also a paper on how to create a backend for a mobile application
For securely connecting to the database I would use a Software VPN and allow only your IP to connect it and then allow only connections from the Private IP of that VPN to the database. VPC design considerations here . I personally use OpenVPN, it is free for 2 concurrent users minus ec2 time.
As far as VPC subnet design goes, the Database instance should always be placed in private subnets, the api in public subnets exposed with https. AWS cert manager is free to use with ELB/ALB's.

Related

moving from publicly accessible rds database to using bastion ec2 instance to connect to it

If one has a publicly accessible rds database on aws, and wants to instead use a bastion ec2 instance to access and perform database functions (anyone on the internet should be able to use the app and perform database functions in accordance with the features provided by the app), how should one go about performing this shift? I have tried searching the internet but often I get loads of information with terminology that isn't entirely easy to digest. Any assistance would be greatly appreciated.
Again, I want the general public to be able to use and access the app's provided db functions, but not have them be able to access the database directly.
A typical 3-tier architecture is:
A Load Balancer across public subnets, which sends traffic to...
Multiple Amazon EC2 instances in private subnets, preferable provisioned through Amazon EC2 Auto Scaling, which can scale based on demand and can also replace failed instances, which are all talking to...
A Database in a private subnet, preferably in Multi-AZ mode, which means that a failure in the database or in an Availability Zone will not lose any data
However, your application may not require this much infrastructure. For low-usage applications, you could just use:
An Amazon EC2 instance as your application server running in a public subnet
An Amazon RDS database in a private subnet, with a security group configured to permit access from the Amazon EC2 instance
Users would connect to your application server. The application server would connect to the database. Users would have no direct access to the database.
However, YOU might require access to the database for administration and testing purposes. Since the database is in a private subnet, it is not reachable from the Internet. To provide you with access, you could launch another Amazon EC2 instance in a public subnet, with a security group configured to permit you to access the instance. This instance "sticks out" on the Internet, and is thus called a Bastion server (named after the part of a castle wall that sticks out to allow archers to fire on invaders climbing the caste wall).
You can use port forwarding to connect to the Bastion server and then through to the database. For example:
ssh -i key.pem ec2-user#BASTION-IP -L 3306:DATABASE-DNS-NAME:3306
This configures the SSH connection to forward localhost:3306 to port 3306 on the named database server. This allows your local machine to talk to the database via the Bastion server.
You will need to create private subnets for this and update DBsubnet groups accordingly with private subnets only. Moreover in DB security group add bastion and app instances security group as source for db port.
Like if you're using mysql engine, allow 3306 for target instances secuirty group id's.

How to develop a AWS Web App that uses AWS RDS locally?

Before moving to Amazon Web Services, I was using Google Cloud Platform to develop my aplication, CloudSQL to be specific, and GCP have something called Cloud SQL Proxy that allows me to connect to my CloudSQL instance using my computer, instead of having to deploy my code to the server and then test it. How can I make the same thing using AWS?
I have a python environment on Elastic Beanstalk, that uses Amazon RDS.
AWS is deny be default so you cannot access an RDS instance outside of the VPC that your application is running in. With that being said... you can connect to the RDS instance via a VPN that can be stood up in EC2 that has rules open to the RDS instance. This would allow you to connect to the VPN on whatever developer machine and then access the RDS instance as if your dev box was in the VPC. This is my preferred method because it is more secure. Only those with access to the VPN have access to the RDS instance. This has worked well for me in a production sense.
The VPN provider that I use is https://aws.amazon.com/marketplace/pp/OpenVPN-Inc-OpenVPN-Access-Server/B00MI40CAE
Alternatively you could open up a hole in your VPC to the RDS instance and make it publicly available. I don't recommend this however because it will leave your RDS instance open to attack as it is publicly exposed.
You can expose your AWS RDS to the internet by proper VPC setting, I did it before.
But it has some risks
So usually you can use those ways to figure it out:
Create a local database server and restore snapshot from your AWS RDS
or use VPN to connect to your private subnet which hold your RDS
A couple people have suggested putting your RDS instance in a public subnet, and allowing access from the internet.
This is generally considered to be a bad idea, and should be the last resort.
So you have a couple of options for getting access to RDS in a private subnet.
The first option is to set up networking between your local network and your AWS VPC. You can do this with Direct Connect, or with a point-point VPN. But based on your question, this isn't something you feel comfortable with.
The second option is to set up a bastion server in the public subnet, and use ssh port forwarding to get local access to the RDS over the SSH tunnel.
You don't say if you on linux or Windows, but this can be accomplished on either OS.
What I did to solve was:
Go to Elastic Beanstalk console
Chose you aplication
Go to Configurations
Click on the endpoint of your database in Databases
Click on the identifier of your DB Instance
In security group rules click in the security groups
Click in the inbound tab
Click edit
Change type to All Traffic and source to Anywhere
Save
This way you can expose the RDS connected to your Elastic Beanstalk aplication to the internet, which is not recommended as people sugested, but it is what I was looking for.

AWS keeping services on domain instead of having public

I have hosted few services on AWS however all are public and can be accessed from anywhere which is a security threat, could you please let me know how to keep the services specific to internal users of organization without any authentication medium.
I found a workaround for this, if you have list of IP range may be a network administrator can help you, take that and put them in load balancers under security group.
You should spend some time reviewing security recommendations on AWS. Some excellent sources are:
Whitepaper: AWS Security Best Practices
AWS re:Invent 2017: Best Practices for Managing Security Operations on AWS (SID206) - YouTube
AWS re:Invent 2017: Security Anti-Patterns: Mistakes to Avoid (FSV301) - YouTube
AWS operates under a [Shared Responsibility Model, which means that AWS provides many security tools and capabilities, but it is your responsibility to use them correctly!
Basic things you should understand are:
Put public-facing resources in a Public Subnet. Everything else should go into a Private Subnet.
Configure Security Groups to only open a minimum number of ports and IP ranges to the Internet.
If you only want to open resources to "internal users of organization without any authentication medium", then you should connect your organization's network to AWS via AWS Direct Connect (private fiber connection) or via an encrypted VPN connection.
Security should be your first consideration in everything you put in the cloud — and, to be honest, everything you put in your own data center, too.
Consider a LEAST PRIVILEGE approach when planning Network VPC Architecture, NACL and Firewall rules as well as IAM Access & S3 Buckets.
LEAST PRIVILEGE: Configure the minimum permission and Access required in IAM,Bucket Policies, VPC Subnets, Network ACL and Security Groups with a need to know White-list approach.
Start from having specific VPCs with 2 Main Segments of Networks 1-Public and the other 2-Private.
You will place your DMZ components on the Public segment,
Components such as Internet Facing Web Server, load Balancers,
Gateways, etc falls here.
For the Rest such as Applications, Data, or Internal Facing
LoadBalancers or WebServers make sure you place them in the Private
Subnet where you will use an Internal IP address from specified
Internal Range to refer to the Components Inside the VPC.
If you have Multiple VPCs and you want them to talk with each
other you can Peer them together.
You also can use Route53 Internal DNS to simplify naming.
Just in case, If you need to have Internet access from the Private segment
you can Configure a NAT Gateway on the public subnet and handle
Outgoing Traffic routed to Internet from the NAT Gateway.
S3 Buckets can be Configured and Servered as VPC-END points. (Routing via an Internal Network rather than Internet Routed to S3 Buckets/Object).
In IAM you can create Policies to whitelist source IP and attached to Roles and Users which is a great combination to Mix Network VPN Connections/white-listed IPs and keep Network Access in harmony with IAM. That means even Console Access could be governed by a White-listed Policy.

Connecting to AWS Aurora DB running in private subnet from 'outside world'

We have an Aurora DB cluster running in a private subnet, and want to allow read only access to clients originating from a fixed set of ips (our company ips). Our requirements are:
The endpoint for DB read calls should be constant so that various ETL clients trying to read this data do not have to change their scripts repeatedly.
We do not want to make the DB instances publicly accessible.
The DB connections should use SSL.
Could someone please direct me with the right steps?
There are 2 things you need to do:
1. Setting up a OpenVPN Server
Setup a OpenVPN server that allows clients to 'be inside' the VPC allowing access to any resources inside the VPC. The access can be further restricted by implementing Network ACLs / Security Groups. You can set up a OpenVPN server by following the tutorial here. After setting up the server, the clients will have to log in to the VPN using the credentials you provide.
2. Setting up a User on AuroraDB with Read-Only Permissions
In order for clients to access the AuroraDB cluster from the private subnet (after logging in to VPN of course), you'll need to create a database user with read-only permissions to the DB. If you would like, you can further restrict the user to access only a specific set of tables in your DB.
Once these two are implemented, your clients will be able to access
the database in read only mode from inside the private subnet.

How to allow the application to communicate back to the on premise equipment?

One of the questions in a AWS practice exam is as below:
You are a solutions architect who has moved to a manufacturing company who has very legacy applications. One of these applications needs to communicate with services which are currently hosted on premise. The people who wrote this application have left the company and there is nothing to document how the application works. You need to ensure that this application can be hosted in a bespoke VPC but still be able to communicate to the back end services which are hosted on premise. Which of the three answers below will allow the application to communicate back to the on premise equipment without the need to reprogram the application?
And one of the correct answer was indicated to be:
You should ensure the VPC has an internet gateway attached to it so that you can establish a site to site VPN with the on premise environment.
From the VPC faq, my understanding is you do not need internet gateway for VPN to work.
From VPC FAQ
Q. How does a hardware VPN connection work with Amazon VPC?
A hardware VPN connection connects your VPC to your datacenter. Amazon supports Internet Protocol security (IPsec) VPN connections. Data transferred between your VPC and datacenter routes over an encrypted VPN connection to help maintain the confidentiality and integrity of data in transit. An Internet gateway is not required to establish a hardware VPN connection.
Anyone have experience with VPN on AWS, please clarify.
THIS QUESTION DOES NOT LACKS RESEARCH
It appears that discussions about this question can also be found at:
A Cloud Guru: Internet Gateway vs Virtual Private Gateway
A Cloud Guru: VPC - Internet Gateway for a Site to Site VPN? - Correct Answer?
A Cloud Guru: Direct Connect question
The question apparently asks for 3 correct answers out of 5. The question is badly written and does not have a correct set of answers.
The connection would need to be either via AWS Direct Connect or a VPN Connection, both of which connect to an Amazon VPC via a Virtual Private Gateway rather than an Internet Gateway.
It would be possible to establish a Software VPN connection back to on-premise, which would require software configuration, an Internet Gateway and a Public IP address (for the Software VPN). However, the provided answers make no mention of a Software VPN.