본문 바로가기

AWS/파워쉘로 배우는 AWS

#15 [EC2] 논리 방화벽 Security Group

방화벽이라고 소개하였지만, 사실 방화벽과는 조금 성격이 다릅니다. 간단하게 설명하자면 Port ACL Firewall 중간 어디쯤(?) 위치한 녀석입니다. Hyper-V 비교하자면 VMNetworkAdapterExtendedAcl 정도라고 할까요?

여기서 확실하게 짚고 넘어갈 이야기가 있습니다. 바로 가상 네트워크에 대한 이야기입니다.

 

가상 네트워크란, 다른 말로 표현하면 Software Networking 이야기 합니다. Network Software 아니라는 이야기 입니다. 기존 Switch에서 동작하는 Network Software들은 물리적인 Network 연결을 보다 쉽게, 간편하게, 단순하게 하기 위해 개발된 프로그램 입니다. ISO 7 Layer 기준으로(이해를 돕기 위해 ISO 7 Layer 사용하였습니다.) 제작되었기 때문에 우리가 알고 있는 Network Flower에서 벗어나지 않습니다.

 

하지만, Software Networking 구현한 가상 네트워크는 "가상 서버(VM), 가상 서버와 외부 망과 통신을 하기 위해 개발된 LAN" 입니다. 개발의 시작이 다르다는 입니다. 기존 네트워크 장비에서 동작하는 Software 편의성을 위해 개발되었지만, 가상 네트워크는 통신을 위해 개발되었습니다. 것은 시사하는 바가 크며, 생각보다 많은 곳에서 이해가 되는 동작을 하기도 합니다. 차이를 줄이고자 네트워크 벤더사들(Cisco ) 가상 장비를 제작해(Virtual Appliance Machine) 논리 네트워크를 처리하는 컴퓨팅 영역을 자신들의 기술로 구현하여 서비스하는 입니다.

 

, 논리 네트워크의 추가적인 기능들은 가상 장비를 구매하여 사용하시면 AWS 기능과 별개로 기존 네트워크 엔지니어들이 사용하는 명령어로 논리네트워크를 조작할 있게 됩니다. 물론 내용은 AWS에만 국한된 내용이 아닌, Azure 모든 Cloud Infra 가진 논리 데이터센터에 해당하는 개념입니다.

 

개념을 이해하시고 네트워크 쪽에서 "AWS(Azure) 되는 기능이 많다" 라고 생각하시지 마시고, "기다려보면 보안되겠지" 라는 생각을 하셨으면 하는 바람입니다. AWS(또는 Azure ) 인프라에서 되는 기능은 거의 없습니다. 단지 3rd party 제품을 구매해야 입니다.

 

서론이 길었네요. 그럼 지체하지 말고 cmdlet 실행해 봅시다.


PS> Get-EC2SecurityGroup


 

 


언제나 Default VPC 우릴 반겨주네요. 그럼 속성을 확인해 봅시다.

Description: 표시 이름입니다.

GroupId: Security Group ID입니다.

GroupName: Group 이름입니다.

IpPermissions: Inbound Rule 입니다.

IpPermissionsEgress: Outbound Rule 입니다.

OwnerId: 소유자 ID 입니다.

Tags: Tag 입니다.

VpcId: Security Group 속한 VPC ID 입니다.

크게 설명할 내용이 없네요. 그럼 곧장 Security Group부터 만들어 봅시다. 먼저 AWS니까 Linux 기본 Security Group부터 만들어 보죠


PS> New-EC2SecurityGroup -Description "Example Linux" -GroupName "Example Linux DefaultGroup" `
-VpcId vpc-21e2df44


 

 


Security Group ID 출력되네요. 어디까지 설정되어 있는지 기본 값을 살펴보죠


PS> Get-EC2SecurityGroup -GroupId sg-dbc7c9bf


 

 


봐서 느낌상 Inbound Rule 없다는 것이 보이시나요? Outbound Rule 있네요. 현재 있는 Rule부터 확인해 봅시다.


PS> (Get-EC2SecurityGroup -GroupId sg-dbc7c9bf).IpPermissions

PS> (Get-EC2SecurityGroup -GroupId sg-dbc7c9bf).IpPermissionsEgress


 

 


역시 생각대로 Inbound Rule 없습니다. Outbound Rule 보니 뭔가 여러가지가 있네요. 살펴보도록 하죠

FromPort: 들어오는 Port Number 시작을 나타냅니다. ICMP -1 출력합니다.

IpProtocol: Protocol Type 입니다. 모든 Protocol 설정 -1값을 출력합니다.

IpRanges: IP Range 값들 입니다.

PrefixListIds: VPC Endpoint 통해 액세스 AWS 서비스 ID 나타냅니다.

ToPort: 나가는 Port Number 시작을 나타냅니다. ICMP -1 출력합니다.

UserIdGroupPairs : Security Group ID 나타냅니다.

이번 속성값들은 전부 중요한 값들 이네요. CIDR 기준으로 정책을 적용시킬 있고, Security Group끼리 정책을 적용시킬 있으며, AWS Service들간에도 정책 적용이 가능하다는 것을 보실 있습니다. 안타까운 것은 DNS로는 정책 적용이 불가능 하다는 점이네요.

 

정책 만드는 것도 EC2Tag처럼 지정해주는 cmdlet 없습니다. 안타깝죠… 그래서 Tag 처럼 Object 생성하여 처리해 주어야 합니다. 우리가 만들 Object [Amazon.EC2.Model.IpPermission] 입니다. 그럼 Object 선언하고 RDP SSH연결할 있게 3389 22 Port Any 접속할 있도록 값을 지정해 봅시다.


PS> $IpPerm01 = new-object Amazon.EC2.Model.IpPermission

PS> $IpPerm01.IpProtocol = "tcp"

PS> $IpPerm01.FromPort = 22

PS> $IpPerm01.ToPort = 22

PS> $IpPerm01.IpRanges.Add("0.0.0.0/0")

PS> $IpPerm02 = @{ IpProtocol="tcp"; FromPort="3389"; ToPort="3389"; IpRanges="0.0.0.0/0" }

PS> $IpPerm01

PS> $IpPerm02


 

 


각각의 형이 조금 다른 것을 있습니다. $IpPerm01는 선언한 대로 [Amazon.EC2.Model.IpPermission] Object 이지만, $IpPerm02는 Type 선언하지 않아 기본 Object [System.Collections.Hashtable]으로 생성되었습니다. 가지 선언 방법이 있으니 입맛에 맞는 방식으로 작업하면 같습니다. 골라먹는 재미죠 뭐…

 

그럼 제작한 Security Group 적용해 봅시다.


PS> Grant-EC2SecurityGroupIngress -GroupId sg-dbc7c9bf -IpPermission @( $IpPerm01, $IpPerm02 )

PS> (Get-EC2SecurityGroup -GroupId sg-dbc7c9bf).IpPermissions


 

 


설정 모두 정상적으로 적용된 모습을 보실 있습니다. 위와 같이 설정하는 말고 줄로 해결하고 싶으신 분들은 아래와 같은 명령으로 실행하여도 정상 적용됩니다.


PS> Grant-EC2SecurityGroupIngress -GroupId sg-dbc7c9bf `
-IpPermission @( @{ IpProtocol="tcp"; FromPort="80"; ToPort="80"; IpRanges="0.0.0.0/0" } )

PS> (Get-EC2SecurityGroup -GroupId sg-dbc7c9bf).IpPermissions


 

 


정책 제거도 마찬가지 방법으로 진행하시면 됩니다.


PS> Revoke-EC2SecurityGroupIngress -GroupId sg-dbc7c9bf -IpPermission @( $IpPerm01 )

PS> (Get-EC2SecurityGroup -GroupId sg-dbc7c9bf).IpPermissions


 

 


당연한 결과지만, 아래와 같이 현재 설정을 Get하여서 삭제 속성에 넣어도 됩니다.


PS> Revoke-EC2SecurityGroupIngress -GroupId sg-dbc7c9bf `

-IpPermission (Get-EC2SecurityGroup -GroupId sg-dbc7c9bf).IpPermissions

PS> (Get-EC2SecurityGroup -GroupId sg-dbc7c9bf).IpPermissions


 

 

Security Group 설정을 확인해 봤습니다. 설정이 까다롭지만, 어렵진 않기 때문에 쉽게 따라 하실 있으실 겁니다. 우리 모두 디테일한 Security Group 정의하여 보안에 힘씁시다.


참고자료 : http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html