AWS에서 보안 네트워크 구축(섹션 2)

11416 단어
가령 AWS에 가상 머신을 만들어서 당신의 업무를 위해 관건적인 조작을 실행하도록 요구받는다면인터넷에 액세스해야 하지만 소프트웨어를 설치/업그레이드하려는 관리자/서비스 담당자만 액세스할 수 있습니다.어떻게 할 거예요?
이것은 일련의 두 편의 문장이다.첫 번째 기사에서는 AWS에서 EC2 인스턴스(VM)를 만들 때 어떤 일이 벌어지는지, 이 인스턴스가 기본 VPC에 어떻게 연결되는지, 트래픽이 어떻게 라우팅되는지에 대해 설명했다.
두 번째 글은 완전히 안전한 네트워크를 만드는 방법을 소개할 것입니다. 새로 만든 가상 컴퓨터가 그 안에서 실행될 것입니다.
왜 우리는 기본 vpc를 사용할 수 없습니까?
기본 VPC는 기본 네트워크를 고려하지 않고도 빠르게 시작할 수 있습니다.따라서 간단한 배치나 AWS에서 테스트나 실험을 진행하고 있다면 매우 유용할 것입니다.
기본 VPC에는 서브넷, NACL, 보안 그룹 및 라우팅 테이블과 같은 여러 관련 구성 요소가 있습니다.그 중 일부 구성 요소는 공개되었는데, 이것은 결코 가장 믿을 만한 안전 실천이 아니다.
또한 기본 VPC를 사용하면 사용자 사용172.31.0.0/116 범위가 제한됩니다.VPC를 맞춤형으로 구성하면 고객은 필요에 따라 네트워크를 맞춤형으로 구성하여 IP 주소가 중첩되지 않도록 할 수 있습니다. 이는 내부 네트워크를 포함합니다.
네트워크 모델과 구성 요소를 완벽하게 제어할 수 있는 사용자 정의 VPC를 구성하는 것이 좋습니다.이것은 개인 서브넷 내에서 응용 프로그램과 체계 구조를 확장하는 것을 더욱 쉽게 한다.

사용자 정의 VPC 및 아웃바운드 액세스


구조는 아래 그림에서 보듯이 우리는 VPC에서 인터넷으로의 오프라인 접근만 허용한다(우리는 아래 부분에서 VM 관리자에게 오프라인 접근을 어떻게 사용하는지 소개하고 이에 따라 도표를 업데이트할 것이다).
다음 소절에서 우리는 구름을 이용하여 점차적으로 필요한 자원을 만들 것이다.이 섹션의 매 단계에서, 템플릿을 클라우드 프로모션에 업로드하고, 이 스택으로 만든 자원을 보는 것을 권장합니다.편리한 경우 다음 명령을 사용하거나 콘솔에서 템플릿을 수동으로 업로드합니다.
스택을 작성하려면 - aws cloudformation create-stack --stack-name private-network --template-body file://infra/template-custom-vpc.yml스택 업데이트하기 - aws cloudformation update-stack --stack-name private-network --template-body file://infra/template-custom-vpc.yml

전용 네트워크


다음 템플릿을 사용하여 사용자 정의 VPC를 만듭니다.
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 192.168.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: awesome-vpc
앞의 코드 세션에서 우리는 VPC를 명명했다. 이것은CidrBlock이고 사용할 수 있는 IP 범위를 정의했다. (이 예는 192.168.0.0에서 192.168.255.255)Enable DnsSupport와 Enable DnsHostnames 로고를 true로 설정하면 공공 IP 주소가 있는 실례는 해당하는 공공 DNS 호스트 이름을 얻을 수 있고, Amazon Route 53 분석 프로그램 서버는 Amazon이 제공하는 개인 DNS 호스트 이름을 분석할 수 있다.자세한 내용은 AWS 설명서https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html를 참조하십시오.

인터넷 게이트웨이


템플릿 파일의 에셋에서 다음을 추가합니다.
  InternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Properties:
      Tags:
      - Key: Name
        Value: awesome-internet-gateway
이것은 인터넷 게이트웨이를 만들지만 VPC에 연결되지 않습니다:
다음 리소스를 템플릿에 추가하여 만든 VPC에 인터넷 게이트웨이를 연결합니다.
  VpcInternetGatewayAttachment:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

서브넷


이후에 우리는 두 개의 서브넷을 만들 것이다. 하나는 사유이고 하나는 공공이다. 사유의 서브넷은 우리의 EC2 실례를 포함하고 다른 서브넷은 인터넷 인터페이스를 통해 인터넷에 연결할 수 있다.
  SubnetPrivate:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      CidrBlock: 192.168.0.0/17
      Tags:
        - Key: Name
          Value: subnet-private
  SubnetPublic:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      CidrBlock: 192.168.128.0/17
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: subnet-public
서브넷을 만들 때, 우리는 만들 때의 설정을 통해 그것이 개인적인지 공공적인지 결정하지 않기 때문에, 이 단계에서 이러한 서브넷은 개인적이고 공공적일 것이다.이 구성은 다음 단계에서 수행됩니다.
VPC의 CIDR 블록을 서브넷당 하나의 2개의 CIDR 블록으로 분할하는 방법에 주의하십시오.Availability zone 속성은 2개의 CloudFormation 내재 함수를 사용합니다.
  • GetAZs, 특정 영역에서 사용 가능한 모든 영역의 목록을 반환합니다.빈 문자열 지정은 CloudFormation 스택을 만들 영역
  • 을 지정하는 것과 같습니다.
  • Select, 색인에 따라 개체 목록에서 개별 개체를 반환합니다
  • .
    이 예에서 us-east-1 구역의 첫 번째 사용 가능한 구역을 얻을 것입니다. 이 구역에 창고를 만들 것입니다.
    공용 서브넷의 MapPublicIpOnLaunch 속성은 이 서브넷에서 시작된 인스턴스가 공용 IPv4 주소를 수신하는지 여부를 나타냅니다.전용 네트워크에서 EC2 인스턴스를 만드는 것에 대해 논의할 때 당혹스러울 수 있습니다. 그렇다면 이 구성을 추가하는 이유는 무엇입니까?간단히 말해서, Google은 공공 서브넷에 또 다른 EC2 실례를 만들 것입니다. 이것은 잠시 후 SSH에서 개인 서브넷으로 실례를 만드는 유틸리티입니다.다음 단계에서, 우리는 이 실례에 대한 더 많은 세부 사항으로 돌아갈 것이다.

    라우팅 테이블 - 공통 서브넷


    기본 루트를 제외하고, 우리는 현재 루트 테이블을 만들고 그것을 공공 서브넷과 연결할 것이다
      RouteTablePublic:
        Type: AWS::EC2::RouteTable
        Properties:
          VpcId: !Ref VPC
          Tags:
          - Key: Name
            Value: route-table-public
      RouteTableAssociationSubnetPublic:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          SubnetId: !Ref SubnetPublic
          RouteTableId: !Ref RouteTablePublic
      RouteTableDefaultPublic:
        Type: AWS::EC2::Route
        DependsOn: VpcInternetGatewayAttachment
        Properties:
          RouteTableId: !Ref RouteTablePublic
          DestinationCidrBlock: '0.0.0.0/0'
          GatewayId: !Ref InternetGateway
    
    작성된 라우팅 테이블을 보면 공용 서브넷과 연관되어 다음 라우팅이 표시됩니다. - 목표가 0.0.0.0/0인 기록은 창설된 인터넷 스위치를 목표로 한다:

    NAT 게이트웨이


    NAT(네트워크 주소 변환)는 개인 리소스의 인터넷 액세스를 허용하는 방법입니다.항상 유연한 IP(정적 공용 IP)를 사용합니다.
      NatGatewayEIP:
        Type: AWS::EC2::EIP
        DependsOn: VpcInternetGatewayAttachment
        Properties:
          Domain: vpc
      NatGateway:
        Type: AWS::EC2::NatGateway
        Properties:
          AllocationId: !GetAtt NatGatewayEIP.AllocationId
          SubnetId: !Ref SubnetPublic
    
    우리가 만든 NAT 게이트웨이는 공용 서브넷과 연결됩니다.

    라우팅 테이블 - 개인 서브넷


    NAT 게이트웨이를 생성했으므로 NAT 게이트웨이를 대상으로 하는 라우팅 테이블 중 하나를 생성하여 전용 네트워크와 연결합니다.이렇게 해야 합니다.
      RouteTablePrivate:
        Type: AWS::EC2::RouteTable
        Properties:
          VpcId: !Ref VPC
          Tags:
          - Key: Name
            Value: route-table-private
      RouteTableAssociationSubnetPrivate:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          SubnetId: !Ref SubnetPrivate
          RouteTableId: !Ref RouteTablePrivate
      RouteTableDefaultPrivate:
        Type: AWS::EC2::Route
        Properties:
          RouteTableId: !Ref RouteTablePrivate
          DestinationCidrBlock: '0.0.0.0/0'
          NatGatewayId: !Ref NatGateway
    

    개인 가상 머신 생성


    지난 절에서 우리는 이미 전유 네트워크와 필요한 구성 요소를 구축하여 우리의 사유 가상 기기와 인터넷이 상호작용을 할 수 있도록 했다.개인 EC2 인스턴스와 연관된 보안 그룹을 만든 다음 SSH를 사용하여 연결하려고 합니다.
      AwesomeEC2Instance:
        Type: AWS::EC2::Instance
        Properties:
          InstanceType: t2.micro
          ImageId: ami-0947d2ba12ee1ff75
          Tags:
            - Key: Name
              Value: Private Instance
          KeyName: !Ref KeyName
          NetworkInterfaces:
            - AssociatePublicIpAddress: true
              DeviceIndex: 0
              GroupSet:
                - !Ref AwesomeSecurityGroup
              SubnetId:
                !Ref SubnetPrivate
      AwesomeSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          VpcId: !Ref SubnetPrivate
          GroupDescription: Enable SSH access via port 22
          SecurityGroupIngress:
            - IpProtocol: tcp
              FromPort: 22
              ToPort: 22
              CidrIp: 0.0.0.0/0
    
    KeyName 속성이 전달되지 않아 스택이 실패합니다.이 문제를 해결하려면 다음 절차를 따르십시오.
  • ssh에서 EC2 실례에 사용할 키 쌍을 만듭니다. https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#prepare-key-pair
  • 클라우드가 템플릿을 형성하는'자원'부분에 다음과 같은 내용을 추가한다.
  •   Parameters:
        KeyName:
          Description: EC2 KeyPair
          Type: AWS::EC2::KeyPair::KeyName
    
  • CloudFormation 스택을 만들 때 전송 키 - 명령줄에서 다음 명령을 사용할 수 있습니다. aws cloudformation create-stack --stack-name private-network --template-body file://infra/template-custom-vpc.yml --parameters ParameterKey=KeyName,ParameterValue=<Name of the key you created in the first step>.또는 콘솔을 사용하여 템플릿을 업로드하고 스택을 만들면 수동으로 매개 변수를 전달할 수 있습니다.
  • 좋습니다. 현재 당신은 EC2 실례를 가지고 개인 서브넷에서 실행해야 합니다.콘솔에서 마우스 오른쪽 버튼을 클릭한 다음 연결 을 클릭합니다.EC2 인스턴스 연결 탭에서 연결 버튼 -->을(를) 클릭하면 EC2 인스턴스가 SSH 연결을 허용하는 보안 그룹에 연결되어 있지만 오류가 발생했습니다.그러나 전용 네트워크에 있기 때문에 SSH를 통해 인터넷에서 연결할 수 없습니다.

    인바운드 액세스 허용


    이 섹션에서는 관리자가 SSH를 개인 EC2 실례에 연결할 수 있도록 필요한 구성 요소를 구축할 것입니다. 이전 섹션에서 이 실례를 만들 것입니다.

    보루 주인


    서브넷 섹션에서는 공통 서브넷에 EC2 인스턴스를 작성하는 방법에 대해 설명합니다.그것은 보루의 주인이 될 것이다.그것은 외부 네트워크(예를 들어 인터넷)에서 전용 네트워크에 대한 접근을 제공하는 서버이다.
    이것은 우리의 체계 구조도에서 유일하게 관리자로부터의 ssh통신을 허용하는 보충이다.
      BastionHostEC2Instance:
        Type: AWS::EC2::Instance
        Properties:
          InstanceType: t2.micro
          ImageId: ami-0947d2ba12ee1ff75
          Tags:
            - Key: Name
              Value: Bastion Host
          KeyName: !Ref KeyName
          NetworkInterfaces:
            - AssociatePublicIpAddress: true
              DeviceIndex: 0
              GroupSet:
                - !Ref AwesomeSecurityGroup
              SubnetId:
                !Ref SubnetPublic
    
    따라서 내부 (개인) 실례에 연결하려면 사용자 (관리자가) ssh를 bastion 호스트에 연결하고 개인 실례에 연결해야 한다.SSH 프록시 전달에 대한 자세한 내용은 다음 기사를 참조하십시오.https://aws.amazon.com/blogs/security/securely-connect-to-linux-instances-running-in-a-private-amazon-vpc/.만약 당신이 빠른 버전을 좋아한다면, 다음은 총결산이다.
  • OS에서 SSH 에이전트가 실행 중인지 확인: eval ssh-agent (MacOS에서) - 에이전트에 프로세스 번호가 있으면 실행 중
  • 키의 개인 부분을 에이전트에 추가합니다. 제 키 이름이ec2라고 가정하십시오.pem, MacOS의 명령은 ssh-add -K ./ec2-instance.pem입니다."표지가 추가되었습니다"라는 출력을 받아야 합니다.
  • AWS 컨트롤러로 이동하고 새로 만든 실례(Bastion 호스트)를 오른쪽 단추로 클릭한 다음 연결
  • 을 클릭합니다.
  • SSH 클라이언트 탭에서 지침에 따라 터미널
  • 에서 SSH
  • 마지막 명령에서 SSH 전송을 구성하려면 업데이트해야 합니다.따라서 다음 명령을 실행하십시오. ssh -i "ec2-instance.pem" [email protected]
  • 오류가 발생하지 않으면 Bastion 호스트 실례
  • 에 연결합니다
  • 이제 Bastion 호스트에서 전용 네트워크에 연결된 EC2 실례(Bastion 호스트와 같은 연결 정보를 얻기) - SSH 클라이언트 옵션 카드의 마지막 명령에서'-i'와 키 이름을 삭제합니다.그래서 명령이 이렇게 보여요ssh -i -A "ec2-instance.pem" [email protected]
  • 지금 보실 수 있습니다. 저희는 지금 사적인 일을 처리하고 있습니다.실행을 시도하고 ssh [email protected] 인터넷에 접근하는 실례를 주의하십시오.
  • 다음은 전체 CloudFormation 템플릿에 대한 링크입니다.https://gist.github.com/AHaydar/c0e60b68f38e980c87ca8cc355627a7b
    오늘은 여기까지.나는 이것이 유익하길 희망하며, 어떠한 피드백, 평론, 문제도 듣고 싶다.

    좋은 웹페이지 즐겨찾기