Как правильно экстернализовать SecurityGroupEgress и SecurityGroupIngress в CloudFormation

С помощью приведенного ниже шаблона CloudFormation я могу подключиться по SSH к экземпляру EC2.

PublicSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
        GroupName: PublicSecurityGroup
        GroupDescription: Public Security Group
        VpcId:
            Ref: Vpc
        SecurityGroupEgress:
            - IpProtocol: "-1"
                FromPort: 0
                ToPort: 65535
                CidrIp: 0.0.0.0/0
        SecurityGroupIngress:
            - IpProtocol: tcp
                FromPort: 22
                ToPort: 22
                CidrIp: 0.0.0.0/0
PublicEc2Instance:
    Type: AWS::EC2::Instance
    Properties:
        ImageId:
            Ref: ImageId
        InstanceType:
            Ref: InstanceType
        KeyName:
            Ref: KeyName
        SecurityGroupIds:
            - Fn::GetAtt:
                    - PublicSecurityGroup
                    - GroupId
        SubnetId:
            Ref: PublicSubnet
        Tags:
            - Key: Name
                Value: PublicEc2Instance

Когда я изменяю определение SecurityGroup на приведенную ниже структуру

PublicSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
        GroupName: PublicSecurityGroup
        GroupDescription: Public Security Group
        VpcId:
            Ref: Vpc
PublicOutboundRule1:
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
        GroupId: !Ref PublicSecurityGroup
        SourceSecurityGroupId: !Ref PublicSecurityGroup
        IpProtocol: "-1"
        FromPort: 0
        ToPort: 65535
PublicInboundRule1:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
        GroupId: !Ref PublicSecurityGroup
        SourceSecurityGroupId: !Ref PublicSecurityGroup
        IpProtocol: tcp
        FromPort: 22
        ToPort: 22

Я больше не могу использовать SSH в экземпляре EC2.

Почему экстернализация SecurityGroupEgress и SecurityGroupIngress блокирует доступ SSH к EC2?

Благодарю вас!


person Volodymyr Prokopyuk    schedule 14.03.2019    source источник


Ответы (2)


Вы ограничили трафик в своем входящем правиле до PublicSecurityGroup в этой строке: SourceSecurityGroupId: !Ref PublicSecurityGroup Вместо SourceSecurityGroupId укажите блок CIDR, который вы использовали в верхнем фрагменте yaml:

PublicSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
        GroupName: PublicSecurityGroup
        GroupDescription: Public Security Group
        VpcId:
            Ref: Vpc
PublicOutboundRule1:
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
        GroupId: !Ref PublicSecurityGroup
        IpProtocol: "-1"
        FromPort: 0
        ToPort: 65535
        CidrIp: 0.0.0.0/0

PublicInboundRule1:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
        GroupId: !Ref PublicSecurityGroup
        IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: 0.0.0.0/0

Обратите внимание, что я также удалил SourceSecurityGroupId из вашего правила Egress, потому что правила Egress не ожидают источников, они ожидают назначения (другие SG, блоки CIDR), потому что они, в общем, являются выходом :).

person Vladyslav Usenko    schedule 14.03.2019
comment
Привет Владислав! Большое спасибо за точное и очень полезное объяснение. Оно работало завораживающе! - person Volodymyr Prokopyuk; 15.03.2019

Вы не устанавливаете правильную связь между AWS::EC2::SecurityGroup и AWS::EC2::SecurityGroupIngress/AWS::EC2::SecurityGroupEgress.

В вашем первом описании вы разрешаете доступ к порту 22 из любого места: SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

Но во втором определении вы определяете доступ к порту 22 только из той же группы безопасности, потому что параметр SourceSecurityGroupId указывает идентификатор группы безопасности Amazon EC2, чтобы разрешить доступ, и вы хотите предоставить доступ из 0.0.0.0/, это не такой же:

SourceSecurityGroupId: !Ref PublicSecurityGroup IpProtocol: tcp FromPort: 22 ToPort: 22

Вам нужно удалить параметр SourceSecurityGroupId

person Miguel Conde    schedule 14.03.2019
comment
Привет кондей! Ты прав! Я не должен использовать SourceSecurityGroupId и вместо этого использовать CidrIp. Большое спасибо! - person Volodymyr Prokopyuk; 15.03.2019