
Я создал два экземпляра EC2 с помощью CloudFormation — один для веб-сервера Apache, другой для базы данных PostgreSQL. По какой-то причине веб-сервер не может подключиться по telnet к экземпляру базы данных на порту 5432, хотя экземпляр базы данных может подключиться по telnet к экземпляру веб-сервера на порту 80. Когда я проверяю экземпляр базы данных с локального хоста, он работает нормально и успешно подключается по telnet к локальному хосту 5432. Для каждого экземпляра есть две группы безопасности:
"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" } ]
}
},
Что может быть не так с конфигурацией? Любая помощь приветствуется.
UPD: Я попробовал добавить следующие входящие/исходящие правила, но из-за этого становится невозможно устанавливать пакеты через yum:
"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"
]
}
}
},
Я также пробовал добавить только входящее правило (без исходящего), но это тоже не работает.
решение1
Вы не определили выход для своих групп безопасности. Неограничен ли выход по умолчанию? Я нечасто использую SG с диапазонами CIDR. Предлагаю вам отредактировать свой вопрос, включив в консоль скриншот входа и выхода SG.
Я предпочитаю использовать правила групп безопасности для доступа внутри AWS, а не на основе CIDR. Поэтому я бы сделал следующее:
- TheWebServerSecurityGroup разрешает выход в TheDBSecurityGroup через порт 5432
- TheDBSecurityGroup разрешает вход из TheWebServerSecurityGroup на порт 5432
- TheWebServerSecurityGroup разрешает входящий трафик с 0.0.0.0/0 на порт 443 - и, я полагаю, 80, если вам это нужно
Вместо того, чтобы разрешать порт 22, я предлагаю вам взглянуть наМенеджер сеанса. Он более безопасен, чем SSH, поскольку вы фактически получаете SSH из консоли AWS после входа в систему, но вам не нужно открывать порт 22. По памяти, сервер открывает порт 443 для конечной точки VPC (исходящий), которая ретранслирует входящий SSH. Его немного сложно настроить, но если вы сделаете это с помощью CloudFormation один раз, вы сможете использовать его повторно во многих ситуациях.