[AWS-Security] 1.2. 클라우드 네이티브 보안 도구
[AWS-Security] 1.2. 클라우드 네이티브 보안 도구
1. 개요
- IAM (Identity and Access Management)
- IAM은 기술 자산에 대한 접근을 제어하는 데 사용되는 모든 도구와 정책을 의미한다. (AWS에 국한되는 개념 x)
- VPC (Virtual Private Cloud)
- 격리된 가상 네트워크를 생성하는 데 사용되는 서비스이다.
- EC2 인스턴스 및 파생 컴퓨팅 리소스에 대한 네트워크 접근을 제어할 수 있다.
- 일반화
- 애플리케이션 보안을 위한 대규모 서비스 제품군이 있다.
- 이미 사용 중인 서비스와 통합하여 사용 가능하다.
AWS에서 실행되는 워크로드용으로 구축되어 편리하다는 장점이 있다.
- AWS Key Management Service는 S3와 DynamoDB 같은 서비스와 통합해 클릭 한 번으로 암호화를 제공한다.
- Amazon GuradDuty는 CloudTrail과 통합해 계정의 모든 활동을 지속적으로 모니터링하고 무단 행동이나 악의적인 행동이 있을 경우 경고한다.
2. IAM
2.1. 개요
- 사용자 (User)
- 사람이나 애플리케이션을 의미한다.
- IAM 사용자로 인증해야만 AWS 서비스에 접근할 수 있다.
- 정책 (Policy)
- 사용자가 AWS 서비스 내에서 수행할 수 있는 작업을 설명하는 JSON 문서다.
- ex) Policy를 통해 사용자가 모든 DynamoDB 테이블을 나열할 수 있도록 가능
AWS IAM의 Policy는 화이트리스트 기반으로, 명시적으로 허용하지 않는 한 모든 작업은 거부된다.
2.2. Policy 부여
1
2
3
4
5
6
7
8
9
10
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "dynamodb:ListTables",
"Resource": "*"
}
]
}
"Effect": "Allow",: 허용(Allow)하는 설정에 대한 정책(Policy)"Action": "dynamodb:ListTables",: 허용되는 권한은 Dynamo DB 서비스의 ListTables 메소드에 한정된다."Resource": "*": ListTables 작업은 모든 리소스에 대해 허용한다. (단일 리소스만 한정해서 허용하고 싶은 경우, 지정)
2.3. Policy 전 후 비교
- Policy 부여 전
1 2 3
$ aws dynamodb list-tables An error occurred (AccessDeniedException) when calling the ListTables operation: User: arn:aws:iam::123412341234:user/alice is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:ap-northeast-2:123412341234:table/* because no identity-based policy allows the dynamodb:ListTables action
- Policy 부여 후
1 2 3 4
$ aws dynamodb list-tables { "TableNames": [] }
3. VPC
3.1. AWS IDC
- 리전 (Region)
- 하나의 큰 지리적 영역으로 그룹화 된다.
- 가장 큰 리전 중 하나는 버지니아 북부에 있는 us-east-1이다.
- AZ (Available Zone)
- 리전 내의 존재하며, 더 작고 격리된 데이터센터의 모음이다.
- 일부 AWS 서비스는 EC2(어느 AZ에서 실행할지 선택 가능)와 같이 AZ 레벨에서 동작한다. (S3와 같은 서비스는 리전 수준에서 실행되므로 객체를 저장할 리전을 선택한다.)
- 글로벌 서비스
- IAM과 같은 일부 서비스는 모든 리전 및 AZ에서 공유되는 리소스다.
3.2. VPC
- VPC는 리전(Region) 내에 생성할 수 있는 Private Network이다.
- VPC를 통해 AWS 리소스와 연결하려는 다른 네트워크 영역의 리소스 간에 안전한 네트워크 연결을 생성할 수 있으며, 그렇지 않은 리소스 간에는 차단할 수 있다.
- 이를 구현할 수 있는 도구들 중, AWS에서 제공하는 네이티브 도구는 Security Group과 Network Security Group이다. (Security Group 위주 설명)
3.2.1. Security Group
- Security Group은 허용된 연결에 대한 인바운드 및 아웃바운드 규칙 집합을 정의할 수 있는 Stateful 방화벽이다.
- 지정되지 않은 다른 모든 연결을 거부된다.
- EC2 인스턴스를 Security Group과 연결하여 VPC에 위치한 EC2에 적용할 수 있다.
3.2.2. Subnet
- Subnet은 VPC를 구성하는 하위 네트워크 구성 요소다.
- 개별 서브넷에는 VPC에 지정된 IP 범위의 블록이 할당되며, AZ 내의 존재한다.
- EC2 인스턴스와 기타 리소스는 VPC에 직접 넣을 수 없으며, Subent 중 하나에 추가되어야 한다.
- Public과 Private의 두 가지 유형이 있다.
- Public
- Internet Gateway에 대한 경로가 있다.
- 외부와 통신할 수 있다.
- Private
- 인터넷으로 연결되는 경로가 없다.
3.2.3. Private Subnet에 대한 접근 방법
- EC2에 구성된 애플리케이션이 동작 가능한 경우
- 연결을 허용하지 않는 Security Group을 통해 이 인스턴스를 서브넷 및 VPC에 위치시킨다.
(결과적으로, 아무도 인스턴스에 접근할 수 없다.)
- 아래의 CloudFormation 코드를 사용하면 리소스를 모두 생성할 수 있다. (us-east-1 / EC2에 대한 SSH Key 쌍 필요)
AZ(us-east-1a), EC2, VPC, Private Subnet, Security Group(인바운드 허용 x)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
--- AWSTemplateFormatVersion: "2010-09-09" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 172.16.0.0/16 EnableDnsHostnames: true PrivateSubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 172.16.0.0/24 AvailabilityZone: us-east-1a ApplicationSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: For Sample Internal Application VpcId: !Ref VPC ApplicationInstance: Type: AWS::EC2::Instance Properties: ImageId: ami-0dc2d3e4c0f9ebd18 KeyName: mykeypair SubnetId: !Ref PrivateSubnet SecurityGroupIds: - !Ref ApplicationSecurityGroup
- 연결을 허용하지 않는 Security Group을 통해 이 인스턴스를 서브넷 및 VPC에 위치시킨다.
- 애플리케이션 디버깅을 위해 접근이 필요한 경우
- Bastion Host를 통한 Private Host 접근
- Bastion Host에 SSH로 연결하고, Bastion Host에서 Private Host로 SSH 연결하는 방법이다.
기존 폐쇄된 네트워크 다이어그램(위 CloudFormation)에서 몇 개의 리소스를 추가하여 해당 네트워크 다이어그램 구성이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
--- AWSTemplateFormatVersion: "2010-09-09" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 172.16.0.0/16 EnableDnsHostnames: true PrivateSubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 172.16.0.0/24 AvailabilityZone: us-east-1a ApplicationSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: For Sample Internal Application VpcId: !Ref VPC ApplicationInstance: Type: AWS::EC2::Instance Properties: ImageId: ami-0dc2d3e4c0f9ebd18 KeyName: mykeypair SubnetId: !Ref PrivateSubnet SecurityGroupIds: - !Ref ApplicationSecurityGroup InternetGateway: Type: AWS::EC2::InternetGateway VPCGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC InternetGatewayId: !Ref InternetGateway PublicSubnet: Type: AWS::EC2::Subnet Properties: AvailabilityZone: us-east-1a VpcId: !Ref VPC CidrBlock: 172.16.1.0/24 MapPublicIpOnLaunch: true RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC InternetRoute: Type: AWS::EC2::Route DependsOn: VPCGatewayAttachment Properties: DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway RouteTableId: !Ref RouteTable RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref RouteTable SubnetId: !Ref PublicSubnet BastionSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: For Bastion Host VpcId: !Ref VPC BastionInstance: Type: AWS::EC2::Instance Properties: ImageId: ami-0dc2d3e4c0f9ebd18 KeyName: mykeypair SubnetId: !Ref PublicSubnet SecurityGroupIds: !Ref BastionSecurityGroup ApplicationAllowInboundSSHFromBastion: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref ApplicationSecurityGroup IpProtocol: tcp FromPort: 22 ToPort: 22 SourceSecurityGroupId: !Ref BastionSecurityGroup BastionAllowInboundSSHFromInternet: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref BastionSecurityGroup IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0 BastionAllowOutboundSSHToApplication: Type: AWS::EC2::SecurityGroupEgress Properties: GroupId: !Ref BastionSecurityGroup IpProtocol: tcp FromPort: 22 ToPort: 22 DestinationSecurityGroupId: !Ref ApplicationSecurityGroup
두 호스트 간의 SSH 접근만 필요한 상황임에도, 14개의 서로 다른 리소스를 생성해야 한다. 실수로 인해 보안 취약성이 발생하지 않도록 이러한 제어를 이해하는 것은 매우 중요하다.
4. 그 외 보안 도구
4.1. AWS Native Service
| 보안 서비스 | 요약 |
|---|---|
| Amazon Inspector | EC2 인스턴스에서 에이전트를 실행해 취약성을 검사하는 서비스 |
| AWS Certificate Manager | AWS 애플리케이션에 대한 SSL/TLS 인증서를 관리하는 서비스 |
| AWS Secrets Manager | 데이터베이스 자격증명 또는 API 키와 같은 암호 정보의 저장, 접근, 교체를 관리하는 서비스 |
| Amazon Macie | S3에 저장된 민감한 데이터를 분류하고 보호하기 위한 도구 |
| AWS CloudHSM | 암호화 키를 생성하기 위한 하드웨어 보안 모듈 |
| AWS Key Management Service | 암호화 키를 관리하고 다른 AWS 서비스와 편리한 통합 관리 기능 제공 |
| AWS Security Hub | 개별 AWS 계정의 보안 이벤트 및 규정 준수 상태에 대한 중앙 집중화된 관리 서비스 |
| AWS Web Application Firewall | 일반적인 웹 애플리케이션 공격을 방어하기 위한 웹 방화벽 서비스 |
| AWS Firewall Manager | AWS WAF 등 조직의 방화벽 규칙에 대한 중앙 집중화된 관리 서비스 |
| Amazon GuradDuty | AWS 계정의 허가받지 않은 행동 및 악의적인 활동 탐지 |
| AWS Directory Service | AWS 애플리케이션에 대한 관리형 Microsoft Active Directory 서비스 |
| AWS Resource Access Manager | AWS 계정 간 리소스 공유 간소화 서비스 |
| AWS Shield | DDoS 공격에 대한 보호 서비스 |
| AWS Trusted Advisor | 기본 보안 모범 사례 권장 사항 제공 서비스 |
| AWS Config | AWS 리소스의 모든 구성 변경 사항 모니터링 |
| AWS CloudTrail | AWS 계정의 모든 활동 모니터링 |
| AWS Organizations | 다수의 AWS 계정 관리 간소화 서비스 |
| AWS Control Tower | 안전한 모범 사례를 바탕으로 신규 계정 및 애플리케이션을 시작할 수 있는 방법 제공 |
4.2. Maketplace
- 타사 보안 서비스로 구성된 대규모 생태계가 있다. (차세대 방화벽, 벤치마크, 보안 벤치마크, 취약성 스캐너 등)
- 이들 중 다수는 AWS Marketplace를 통해 설치할 수 있다.
This post is licensed under CC BY 4.0 by the author.


