AWS Network ACS causes SQL Server to disconnect - amazon-web-services

I have two EC2 serers in the same VPC. Server "W" hosts a web server and a TCP connections server. Server "S" hosts a web server and a SQL Server. Both web servers and the TCP connections server uses the same SQL Server. The servers on server "W" accesses the SQL Server on server "S" via its priviate IP and port 1433:
Server W's security group's inbound rules:
Server S's security group's inbound rules:
It has an inbound rule allowing port 1433 from the security group used by server "W".
The common network ACS's inbound rules:
My intension is to hide the SQL Server within the VPC and do not expose it to outside world.
What is strange and I can't understand, is that on the network ACL I have to allow inbound connection on port 1024-65535. If I change it to the proper ephemeral port range 32768-65535, both the web server and the TCP connections on server "W" can no longer access the SQL Server, and the following exception is thrown in server "W":
SqlException - A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
innerException Win32Exception - The network path was not found.
So it seems as if the SQL Server needs to allow an inbound connection from outside of the VPC, on a port between 1024-32768. But no one outside of the VPC needs to access the SQL Server. This is what puzzles me.

Network ACLs apply at subnet level. When a NACL is attached to a subnet, all internal/external traffic into and out of that subnet must be allowed through a rule. Security Groups apply at instance level, so essentially to inbound traffic that have already passed through the NACL (for outbound traffic it's in reverse, so SG before NACL).
In this case when server W tries to connect to server S on port 1433, that traffic encounters the deny all rule on your NACL since there are no other rules before it that match. It doesn't even reach the security group. When you add an allow rule for port 1024-65535, obviously this includes port 1433 so it works. You can confirm this behavior using the VPC Reachability Analyzer tool.
So the fix here is basically to have an allow rule for port 1433 on the NACL attached to your Server S subnet. This doesn't mean automatically allowing traffic from outside of the VPC - if this is a private subnet (ie. without an internet gateway) external traffic can't reach your instance plus your security group already restricts access.

Related

Error on connection to PPTP VPN on aws - The VPN connection between your computer and the VPN server could not be completed

I have an EC2 (t2.micro) on aws as a test server and I am trying to create a simple PPTP VPN server with internet connection.
I followed some tutorials and did as follow:
Add roles and feature (Remote Access)
Add a user in computer management with 'Allow access' option enabled.
Enabled and configured 'Routing and Remote Access' security MS-CHAP v2, and enabled IPv4 forwarding with range between 192.168.10.10-192.168.10.19
In 'Routing and Remote Access' Under IPv4-NAT created public Ethernet interface with NAT enabled.
In the server allow access for port 1723 (TCP Inbound rule).
On amazon console created allow access TCP inbound rule for port 1723.
Now when I try to connect to my server from my PC using PPTP connection (with MS-CHAP v2 and optional encryption) it shows the following error after a while:
AM I missing a step or something configuration?
After struggling on it for few days I found out that I needed to add GRE (47) as inbound rule in AWS console (security group) for the instance as well.

AWS EC2 security group https vs tcp vs ssh

I am confused about configuring the EC2 security group settings.
There are three options (TCP, SSH, HTTPS) and each of them requires you to add an IP/port number.
For context, in my work I'm usually running Flask apps over EC2 and I only want particular people to view them. My question is understanding the difference between TCP, SSH, and HTTPs but more importantly which of these are important for me to configure.
Within the EC2 Console, under Security Groups:
SSH and HTTPS in the Type dropdown, are presets which set the port to 22 and 443 respectively.
TCP is the protocol. Both SSH and HTTPS are TCP.
If you're running a server which you want to expose on a non standard port, you can select Custom TCP Rule, then set the port acordingly.
You should probably have one security group that allows SSH traffic, then assign this security group to the EC2 instances you wish to shell into:
Then have a separate security group that allows the webserver traffic, in this case I also have one for port 80, aswell as 443:
Of course you will then need a server running on that EC2 instance to receive the traffic. This might be a reverse proxy like nginx, which then proxies traffic to the correct port for your app server (run your flask app with something like gunicorn in production).
If nginx and gunicorn are running on the same box, and say gunicorn serves on port 8000, then you wouldn't need a security group for this as it's loopback traffic. Your nginx configuration points to port 8000.
However if you have a separate EC2 instance running gunicorn, you might wish to set up a secuirty group for this to allow internal traffic from your VPC CIDR range:
I only want particular people to view them
This is probably a job for authentication on the app, as oppose to security groups, unless your certain of the public IPs from which you wish people to connect.
In the above examples above a Source of 0.0.0.0/0 is allowing traffic from anywhere to reach that port. The console has a convenient dropdown which lets you set My IP if you only want to allow traffic from the IP you're using to connect to the console. Otherwise you'd need to manually calculate the CIDR blocks.
Hope this helps. It probably raises more questions.
Https/Http are important for you. Both are used with websites. Https is http over SSL, meaning more secure than http. You just need these.
Http/https uses TCP port 80 and 443 by default.
SSH is used to securely access a Unix based server.

Amazon RDS db connects locally but not on production

I was able to connect to the amazon rds aurora database locally, and run queries.
But on production EC2 server, the connection returns 500 server error "SQLSTATE[HY000] [2002] Connection timed out".
I've added the same credentials for the database to production, and can see they are being used in the error log.
I enabled the 'allow public access' setting.
I added all the security groups I have to the database (this is probably the problem, I didnt create any special groups, just whatever amazon suggested I let them do).
How could it be working locally but not on production?
Can you check your production server security group outbound rules. if it is connecting from local and not connecting from production machine , so should be some outbound traffic timeout.
It was a security group issue.
The default rds-setup-wizard security group was applied to my database instance, and this gave me local access. I guess it had my ip address or similar as an inbound rule.
I had to add a new security group and add that new group to the database instance.
My new security group needed an inbound rule that looked like this:
Type: MYSQL/Aurora
Protocol: TCP
Port Range: 3306
Source: my EC2's private ipv4 address with /32. Eg: 13.14.15.16/32

Can't resolve AWS RDS sql express server, Error, cant connect to ip,port

http://imgur.com/a/kzeVm
I have followed the guide, disabled my firewall, verified my security group allows access to everything (initially set to public). Still, 2 installs of mysql won't let ssms connect. No idea why this doesn't work
ACL
100
ALL Traffic
ALL
ALL
0.0.0.0/0
ALLOW
*
ALL Traffic
ALL
ALL
0.0.0.0/0
DENY
Security Group that my db is using
All traffic
All
All
sg-23ae465c (default)
postgres gives me
could not connect to server: Connection timed out (0x0000274C/10060) Is the server running on host "posttest.cnmcgcqc8rkx.us-east-1.rds.amazonaws.com" (52.2.0.231) and accepting TCP/IP connections on port 5432?
mysql can connect, might have to go with that
ecurity groups are not under RDS, they are under EC2's console. ACL's options are under VPC's console. This is not even mentioned in the guide. Seen someone connect on youtube with my exact settings...
This could be one of many things with the given information. The first thing I would check if you know your security groups are set up correctly is to open the port on the Network ACL Inbound Rules.

EC2 security group concern

EC2 --> RDS:
RDS (DB Engine): I have inbound and outbound open on port 3306 for the web server's security group.
EC2 (Web Server): I have inbound open for 80, 443 and 22(myIP). Outbound is open for 80,443 and 3306, and it needs all traffic as well to function properly.
My question is about the outbound rules of my web server. Why do I need all traffic to be open? Does this have any security concern?
Some people lock down outbound to prevent against data loss. It works better for immutable architecture since you've removed the ability to update packages from public sources.
Obviously you can choose your own security profile; generally speaking I consider this the levels of security:
Port 22 open to the world
Port 22 access by white listed IPs
Bastion host with white listed IPs
VPN (from here down, all using VPN)
Private IPs + NAT
Proxies server outbound access
That's my ec2 security maturity model. I'm sure I missed some- feel free to comment below.
The security group outbound rules let you to specify "destination", not source. Basically you don't need to worry being attack by Denial of Server through the outbound rules.
On the other hand, unless your Web server need to connect out to Internet without restriction, then you set 80+443 destination to 0.0.0.0/0.
Otherwise , if your web server only need to connect to OS repositories for security update (e.g. ubuntu, apache,etc), then you can explicitly specify the repositories IP address instead of using 0.0.0.0/0.
Other than that, there is little risk. Unless you load something that render webpage, e.g. load web browser in the web server that read random webpage, then it make you susceptible to browser/java engine/rendering engine exploit : if exploit can execute something like ssh reverse tunnel, then there is possibilities that attacker may gain access to your web server.