AWS에서 보안 네트워크 구축(섹션 2)
이것은 일련의 두 편의 문장이다.첫 번째 기사에서는 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 내재 함수를 사용합니다.
이 예에서 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 속성이 전달되지 않아 스택이 실패합니다.이 문제를 해결하려면 다음 절차를 따르십시오. Parameters:
KeyName:
Description: EC2 KeyPair
Type: AWS::EC2::KeyPair::KeyName
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>
.또는 콘솔을 사용하여 템플릿을 업로드하고 스택을 만들면 수동으로 매개 변수를 전달할 수 있습니다.인바운드 액세스 허용
이 섹션에서는 관리자가 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/.만약 당신이 빠른 버전을 좋아한다면, 다음은 총결산이다.eval ssh-agent
(MacOS에서) - 에이전트에 프로세스 번호가 있으면 실행 중ssh-add -K ./ec2-instance.pem
입니다."표지가 추가되었습니다"라는 출력을 받아야 합니다.ssh -i "ec2-instance.pem" [email protected]
ssh -i -A "ec2-instance.pem" [email protected]
ssh [email protected]
인터넷에 접근하는 실례를 주의하십시오.오늘은 여기까지.나는 이것이 유익하길 희망하며, 어떠한 피드백, 평론, 문제도 듣고 싶다.
Reference
이 문제에 관하여(AWS에서 보안 네트워크 구축(섹션 2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ahaydar/building-a-secure-network-in-aws-part-2-19k8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)