방화벽이라고 소개하였지만, 사실 방화벽과는 조금 성격이 다릅니다. 간단하게 설명하자면 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
'AWS > 파워쉘로 배우는 AWS' 카테고리의 다른 글
#17 [EC2] Windows Instance를 만들어 보자. (0) | 2016.01.08 |
---|---|
#16 [EC2] Linux Instance를 생성해 보자. (0) | 2016.01.08 |
#14 [EC2] Instance의 Password Key-Pair (0) | 2015.12.24 |
#13 [EC2] Instance Type은 뭘까요? (0) | 2015.12.23 |
#12 [EC2] EC2 Image! AMI를 검색해 보자 (2/2) (0) | 2015.12.23 |