brunch

10탄- 보안 그룹을 이용한 ECS보안 강화

by Master Seo

ECS를 이용한 서비스를 하자.

ECS는 테스크 새작업 정의 , 클러스터 , 서비스 3개를 만들어야 한다.


요건

Private망은 인터넷이 안되어야 한다.

NAT를 통해서도 인터넷이 안되어야 한다.

NAT를 통해 데이터가 유출될 수 있다.

Private Subnet에 있는 ECS가 인터넷이 안되더라도 서비스가 되도록 하자



엔드포인트를 이용해 ECS 가 서비스가 되도록 한다.


보안 그룹을 통해 ECS에서 통신해야만 하는 부분만 허용하자.


< EC2 기반 구축 >


<1> 도커 이미지 준비 , ECR에 올리기

<2> 작업 정의 등록 - EC2

<3> 클러스터 생성 - EC2 Linux+ 네트워킹 구성

<4> 서비스 생성과 LB 만들기

<5> 제약조건

<6> ECS 모니터링




< FARGATE 기반 구축>


<1> 새 작업 정의 - FARGATE

<2> 서비스 생성 - FARGATE

<3> 클러스터 생성 - 네트워크 전용 구성

<4> 엔드포인트 설정으로 내부 통신하자

<5> 보안 그룹 아웃바운드 제어는 ECS 보안 그룹에서 통신해야 할 모든 서비스를 허용해야 한다.

<6> 제약 조건

<7> ECS 모니터링




< EC2 기반 >


<1> 도커 이미지 준비 , ECR에 올리기


1

아마존 리눅스 하나 설치


2

도커 이미지 만들기, ECR에 올리기


https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/docker-basics.html


인스턴스에 로그인

$ sudo su -


sudo yum update -y

sudo amazon-linux-extras install docker -y


sudo yum install docker

sudo service docker start

sudo usermod -a -G docker ec2-user

docker info


touch Dockerfile


// Dockerfile 내용

FROM ubuntu:18.04

# Install dependencies

RUN apt-get update && \

apt-get -y install apache2

# Install apache and write hello world message

RUN echo 'Hello World!' > /var/www/html/index.html

# Configure apache

RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \

echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \

echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \

echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \

chmod 755 /root/run_apache.sh

EXPOSE 80

CMD /root/run_apache.sh


docker build -t hello-world .


docker images --filter reference=hello-world

// 레파지토리 확인



3

// api 계정 생성하기


aws configure



4

aws ecr create-repository --repository-name hello-repository --region us-east-2

// aws ecr create-repository --repository-name hello-repository --region region

// us-east-2로 한다.


docker tag hello-world 99999999.dkr.ecr.us-east-2.amazonaws.com/hello-repository

//docker tag hello-world aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository


5

인증

aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin 999999999.dkr.ecr.us-east-2.amazonaws.com

// aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

// Login Succeeded


https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth


6

docker push 99999999999.dkr.ecr.us-east-2.amazonaws.com/hello-repository

// docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository







<2> 작업 정의 등록 - EC2

Task definition


1

ECS > 새 작업 정의를 한다. Task definition > EC2 > 맨아래 Configure via JSON


JSON 파일로 한 번에 만들기


https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/getting-started-ecs-ec2.html



or



1

수동으로 만들기


2

새 작업 정의를 한다.



네트워크 모드는 3가지 선택 가능

브리지, 호스트, AWS VPC





<3> 클러스터 생성 - EC2 Linux + 네트워킹 구성


1

VPC를 사용하는 구성이다.


EC2 인스턴스가 생성된다.

AWS > EC2 가면 서버가 있다.

AWS에 EC2가 없다면 클러스터 생성 - 네트워크 전용 구성이다.

클러스터 생성하면 EC2에 아래에서 만든 EC2 인스턴스가 있다.



2

회사에서 제공한 AWS VPC를 선택하자.

서비스용이면 절대 새로 만들지 않는다.

회사에서 제공하는 VPC를 사용해야 관리가 된다.





<4> 서비스 생성과 LB 만들기


1

서비스 2개 만들자.

ECS > Clusters > 해당 클러스터 클릭 > Services 탭 > Create



2

EC2로 서비스 구성하자

서비스 이름과 작업 개수를 지정해야 한다.!!!


3

생성시 LB를 만든다.

EC2기반

LB 에 타켓도 등록해야 한다.

LB DNS이름으로 접속 확인한다.



4

만든 서비스 확인

ECS > Clusters

EC2로 만든 서비스 2개가 보인다.



4

서비스 확인


ECS > Cluster > 해당 클릭 Cluster > Services

Launch type 확인 => 서비스가 EC2로 돌아가는지 FARGATE로 돌아가는지 확인 가능하다.






< FARGATE 기반>


<1> 새 작업 정의 - FARGATE


1

새 작업 정의하기

Jason으로 한 번에 만든다.



https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/AWS_Fargate.html




https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/getting-started-fargate.html



또는

하나씩 수동으로 만든다.


FARGATE는 네트워크 모드가 무조건 AWS VPC이다.





<2> 서비스 생성 - FARGATE

서비스 만들자



1

서비스 확인

Clusters > 해당 클러스터 클릭 > Services

Launch type 확인 => 서비스가 EC2로 돌아가는지, FARGATE로 돌아가는지 확인 가능하다.








<3> 클러스터 생성 - 네트워크 전용 구성


VPC는 선택사항이다.

중간에 VPC를 만들 수 있다.

회사에서는 따로 만들지 않도록 한다. 왜냐하면 회사들은 IP 블록이 중복되지 않도록 관리하고 있다.

아무 IP 블록의 VPC 만들면 통신이 되지 않는다.




2

네트워크 전용 구성 완료








<4> 엔드포인트 설정으로 내부 통신하자


1

잡아야 할 엔드포인트 --- 서비스


s3


monitoring - cloudwatch

logs - cloudwatch logs


ecr.dkr

ecr.api


ecs

ecs-agent

ecs-telemetry


kms


2

보안 그룹 설정?

인바운드, 아웃바운드 모두 허용







<5> 보안 그룹 아웃바운드 제어는 ECS 보안 그룹에서 통신해야 할 모든 서비스를 허용해야 한다.


1

보안 그룹 설정 시

보안 그룹은 기본 모두 차단이다, 그래서 모두 허용해야 한다.


2

보안 그룹 아웃바운드 제어해서 데이터 유출을 차단하자!!!


S3는 Prefix list로 허용할 수 있다. Pl-xxxxxxxxxxx

보안 그룹에 대해 허용할 수 있다. sg-xxxxxxxxxxxxx

접속해야 할 ip 블록 단위로 허용할 수 있다. ip /32


3

실제 작업

ECR, ECS, 모니터링 시스템으로 나가는 쪽과 통신해야 한다. 해당 보안 그룹을 허용한다. sg-xxxxxxxxxxxxx

DB로 접속해야 한다. sg-xxxxxxxxxxxxx

연동된 내부 구간과 통신해야 한다. ip /32


4

대상

s3


monitoring - cloudwatch

logs - cloudwatch logs


ecr.dkr

ecr.api


ecs

ecs-agent

ecs-telemetry


kms








https://medium.com/@ravi.aakula/deploying-asp-net-core-microservices-in-aws-ecs-using-fargate-p art-ii-d03108bdcfaa



<6> 제약 조건

엔드포인트가 없는 서비스는 외부통신 필요

Ecr대신 마켓플레이스에서 가져다 사용하는 경우 외부와 통신 필요

배치 서비스는 외부와 https통신 필요.



<7> ECS 모니터링


https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/monitoring-automated-manual.html



추가 공부 자료

https://brunch.co.kr/@topasvga/1629


감사합니다.

keyword
매거진의 이전글520. Kinesis에이전트 설치로 웹서버 로그 분석