
Ich habe mit CloudFormation zwei EC2-Instanzen erstellt – eine für den Apache-Webserver, eine andere für die PostgreSQL-Datenbank. Aus irgendeinem Grund kann der Webserver keine Telnet-Verbindung zur Datenbankinstanz über Port 5432 herstellen, obwohl die Datenbankinstanz keine Telnet-Verbindung zur Webserverinstanz über Port 80 herstellen kann. Wenn ich die Datenbankinstanz vom lokalen Host aus überprüfe, funktioniert sie einwandfrei und die Telnet-Verbindung zum lokalen Host 5432 ist erfolgreich. Für jede Instanz gibt es zwei Sicherheitsgruppen:
"TheWebServerSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Security Group for The web-server instance",
"SecurityGroupIngress" : [
{ "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" }
],
"VpcId" : { "Ref": "TheVPC" },
"Tags" : [ { "Key": "Name", "Value": "TheWebServerSecurityGroup" } ]
}
},
"TheDBSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Security Group for The DB instance",
"SecurityGroupIngress" : [
{ "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "5432", "ToPort" : "5432", "CidrIp" : "0.0.0.0/0" }
],
"VpcId" : { "Ref": "TheVPC" },
"Tags" : [ { "Key": "Name", "Value": "TheDBSecurityGroup" } ]
}
},
Was könnte mit der Konfiguration nicht stimmen? Jede Hilfe ist willkommen.
UPD: Ich habe versucht, die folgenden eingehenden/ausgehenden Regeln hinzuzufügen, aber damit wird es unmöglich, Pakete über Yum zu installieren:
"TheOutboundRule": {
"Type": "AWS::EC2::SecurityGroupEgress",
"Properties":{
"IpProtocol": "tcp",
"FromPort": 0,
"ToPort": 5432,
"DestinationSecurityGroupId": {
"Fn::GetAtt": [
"TheDBSecurityGroup",
"GroupId"
]
},
"GroupId": {
"Fn::GetAtt": [
"TheWebServerSecurityGroup",
"GroupId"
]
}
}
},
"TheInboundRule": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties":{
"IpProtocol": "tcp",
"FromPort": 0,
"ToPort": 5432,
"SourceSecurityGroupId": {
"Fn::GetAtt": [
"TheWebServerSecurityGroup",
"GroupId"
]
},
"GroupId": {
"Fn::GetAtt": [
"TheDBSecurityGroup",
"GroupId"
]
}
}
},
Ich habe auch versucht, nur die Regel für eingehenden Datenverkehr hinzuzufügen (ohne eine Regel für ausgehenden Datenverkehr), aber das funktioniert auch nicht.
Antwort1
Sie haben für Ihre Sicherheitsgruppen keinen Ausgang definiert. Ist der Standardausgang unbegrenzt? Ich verwende SGs mit CIDR-Bereichen nicht sehr oft. Ich schlage vor, dass Sie Ihre Frage bearbeiten und einen Screenshot des Eingangs und Ausgangs der SGs in der Konsole einfügen.
Ich bevorzuge die Verwendung von Inter-Security-Group-Regeln für den Intra-AWS-Zugriff gegenüber CIDR-basierten Regeln. Ich würde also Folgendes tun:
- TheWebServerSecurityGroup erlaubt den Ausgang zu TheDBSecurityGroup auf Port 5432.
- TheDBSecurityGroup erlaubt den Zugriff von TheWebServerSecurityGroup auf Port 5432.
- TheWebServerSecurityGroup erlaubt den Ingress von 0.0.0.0/0 auf Port 443 - und ich schätze 80, wenn Sie das brauchen
Anstatt Port 22 zuzulassen, schlage ich vor, dass Sie sich Folgendes ansehen:Sitzungsmanager. Es ist sicherer als SSH, da Sie nach der Anmeldung effektiv SSH von der AWS-Konsole erhalten, aber Port 22 nicht öffnen müssen. Aus dem Speicher öffnet der Server Port 443 zu einem VPC-Endpunkt (ausgehend), der SSH weiterleitet. Die Einrichtung ist etwas knifflig, aber wenn Sie es einmal mit CloudFormation machen, können Sie es in vielen Situationen wiederverwenden.