brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Dec 06. 2020

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

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


감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari