CLOUDWAVE

Public Cloud(AWS) : Network Security - NACL, Security Group / Computing Service - EC2, AMI, Public IP & Elastic IP, User Data

갬짱 2025. 1. 21. 22:33

 

Network Baseline : Network Security

 

NACL( Network Access Control List )

: 서브넷에 접근허용할 트래픽정보를 관리하는 가상의 방화벽 서비스

  • 서브넷 단위로 적용 → 서브넷 내부의 모든 리소스에 규칙이 적용
  • 서브넷에는 1개의 NACL만 적용가능( 1:1 ), 1개의 NACL이 여러 서브넷에 적용가능
  • In-bound( 외부→내부 )트래픽의 허용/차단 규칙 정의 Out-bond( 내부→외부 )트래픽의 허용/차단 규칙 정의
  • 우선순위 기반 순차적 평가
  • 상태 비저장( stateless ) 방식의 방화벽
  • : 정상통신을 위해서는 양방향 모두에 동일정책을 정의해야함( 특정 트래픽의 한방향만 정의하면 반대방향 통신에서는 차단됨 )
  • Net ACL Quatos : 최대 기본 20개의 규칙

⇒ 제한이 있어서 많이 사용되지는 않음

 

보안그룹( Security Group )

: 리소스에 접근허용할 트래픽 정보를 관리하는 가상의 방화벽 서비스

  • 리소스 단위로 적용 : VPC내 ENI(Elastic Network Interface, 가상의 네트워크 카드, 네트워크 관련 설정의 집합체)를 가지는 모든 리소스( ex. EC2 인스턴스 )
  • 1개의 ENI에 여러 SG이 적용가능( 1:N ), 최대 5개
  • In-bound( 외부→내부 )트래픽, Out-bond( 내부→외부 )트래픽의 허용규칙만 정의
  • 상태 저장( stateful )방식의 방화벽 : In-bound 허용 규칙이 있을 경우 Out-bound 허용 규칙이 없어도 통과, 통신가능
  • 모든 규칙을 평가하여 허용된 트래픽만 통과
  • Security Group Quotas : 최대 60개의 규칙 → ENI별 최대 5개할당 ⇒ 리소스 단위 최대 규칙 1000개

소스(Source) 값이 다른 보안 그룹의 ID : 해당 보안 그룹에 속한 모든 리소스에서 오는 트래픽을 허용한다는 의미 ( 보안그룹에 속한 리소스간의 통신 )

 

Network ACL과Security Group의비교( 중요 )

트래픽 흐름 : 인터넷 → NACL(서브넷) → 보안 그룹(ENI) → EC2 인스턴스

  • NACL : 모든 트래픽을 허용, 차단할 IP대역이나 포트를 지정하여 차단
  • SG : 리소스단위로 허용되어야할 프로토콜, 포트를 세부적으로 지정

 


 

Computing Service

 

Elastic Compute Cloud( EC2 )

AWS에서 제공하는 가상 서버 서비스 → 탄력성( scale-out, scale-in ), 워크로드에 맞는 인스턴스 제공, 온드맨드 방식, 커스터마이징, 고가용성 등

 

[ Virtual Server Structure ]

: 대표적인 IaaS 서비스로 가상화된 컴퓨팅자원(인스턴스)을 제공

  • Hpyervisor로 하드웨어 자원(인프라)를 가상화 → 여러 가상서버 독립적 구축, 독립적인 운영체제( guestOS )를 가지고 실행
  • 여러 리소스와 연계하여 동작 ( AMI, 데이터 : EBS, 네트워크 : VPC, 백업 : snapshot, 고정 IP : Elastic IP )

 

 

[ EC2 Instance type ]

: Family, Generation, Attributes, Size로 구성 → 서비스 요구사항에 적합한 컴퓨팅 리소스 선택 가능

  • Instance Family : 기능별, 성능별로 인스턴스 유형을 묶어 패밀리단위로 구분

 

  • Instance Generation : 주기적으로 최신기술을 반영한 신규세대 인스턴스가 출시 ( 비용절감 혹은 성능향상 ) ⇒ Region, AZ별로 지원되는 인스턴스 세대가 다름

 

  • Instance Attribute : 추가지원되는 기능 → d,b,e속성은 스토리지에 최적화

 

  • Size : 인스턴스 크기에 따라 처리량이 상이( nano (최소)< small < medium < large < xlarge< … 112xlarge (최대)까지 확장 )
    사이즈가 커질때마다 리소스 사용량이 2배씩 커지는 규칙

 

[ AMI( Amazon Machine Image ) ]

: EC2 인스턴스를 생성하기 위한 템플릿으로( 생성시 항상 설정 ) 운영체제 및 필요한 소프트웨어가 포함( 인스턴스의 특정시점을 캡처하여 백업할 수 있도록 함 )

  • 3가지 구성요소
    • 루트 볼륨 템플릿 : 운영체제, 라이브러리 등
    • 인스턴스 시작 설정값
    • AMI 권한관리정보( permission ) : Public / Private
  • Region단위로 저장 → 해당 Region에 존재하지 않으면 Region간 복사 n번 Region에서 생성후 m번 Region, k번 Region으로 복사
  • S3에 저장되며 저장비용 발생
  • EC2 백업 및 복제 ( 장애발생시, Auto Scale진행시 활용 )
    DevOps CI/CD 환경에서 개발환경을 사전구성하여 테스트수행

 

  • EC2 Instance AMI & Marketplace
    • AWS AMI : AWS에서 기본으로 제공하는 이미지 ( 자주 사용되는 운영체제 위주 ), 정기적인 보안 업데이트 제공
    • Marketplace AMI : Thrid-party벤더가 생성한 이미지 ( 보안 소프트웨어, DB서버 용도 ), 사용시 사용료 부과( EC2 비용 제외 플랫폼자체의 비용 ) 솔루션에서 AMI를 설치한 EC2를 제공
    • Community AMI : AWS사용자(개인)가 생성한 이미지를 공유( Permission설정은 Public으로 설정 ) → 보안과 안정성 검토 필수( 가급적 사용하지 말 것 )
    • Sharing AMI : 특정 사용자(허가된 계정)간 공유하는 이미지( 조직내 협업, 프로젝트에서 이용 )

 

[ Public IP와 Elastic IP ]

  • Public IP : 생성시에 자동할당되는 IP 생성되는 public subnet에 퍼블릭 IP자동할당 체크 인스턴스 중지후 재시작마다 새로운 IP 할당( 무료 )
  • Private IP : 생성후 명시적으로 할당하는 IP를 EC2에 매핑 → 영구적인 IP( 유료 )

 

[ User Data ]

EC2 인스턴스 시작시 초기설정을 자동화하는 스크립트( 명령어 )

인스턴스가 최초 생성되는 부팅시에 한번만 실행 ⇒ 인스턴스 설정 자동화( 서버가 꺼졌다 켜질때도 자동으로 실행 )

root권한 & 운영체제에 따라 다른 형식 ( 리눅스 서버 : bash script, 윈도우 서버 : power shell script )

 

EC2 서비스 구성 실습

 

[ Bastion host 생성 (lab-edu-ec2-bastion) ]

  • AMI는 Amazon Linux 2023, type은 t3.micro, RSA유형의 키페어생성(lab-edu-key-ec2.pem)
  • 네트워크 설정 : VPC설정, 첫번째 pub서브넷에 할당, 퍼블릭IP 자동할당 활성화
  • 보안그룹 생성(lab-edu-sg-bastion)
    • SSH : 인바운드의 소스(트래픽의 발신지)로 내 IP설정( 소스 유형을 위치 무관으로 하면 탈취될 수 있음 내 IP로 한정 )
    • HTTP : Anyopen → 내 IP로 추가

 

Bastion host 접속 ( mobaxterm ) : 생성한 키 페어를 사용하여 접속

 

퍼블릭 IP주소를 이용하여 접속 → 프라이빗 IP주소(서브넷에서 할당받은 IP주소)에 접속

 

윈도우 CMD로도 접속가능

ssh -i 인증키파일 ec2-user@{bastion의 PUBLIC_IP}

 

[ Web server 생성 ( lab-edu-ec2-web ) ]

  • AMI는 Amazon Linux 2023, type은 t3.micro, 기존의 키페어 등록(lab-edu-key-ec2.pem)
  • 네트워크 설정 : VPC설정, 첫번째 private서브넷에 할당, 퍼블릭IP 자동할당 비활성화
  • 보안그룹 생성(lab-edu-sg-web)
    • SSH : 인바운드의 소스(트래픽의 발신지)로 사용자지정 VPC네트워크를 지정( 10.0.0.0/16 )  = VPC내부에서만 SSH접속을 허용
    • HTTP : 기존보안그룹? 10.0.0.0/16? 해당 보안그룹의 인스턴스나 리소스가 출발지로 설정

 

 

User Data영역( 고급세부정보 )에 파이썬 설치 스크립트(install_python.sh)를 저장

 

[ Putty를 이용한 Web서버 접속 ] : bastion을 이용한 접속

PuTTYgen으로 pem키 사전등록 : 키본 ppk형식이 아닌 *.*형식에서 pem 키 찾아서 로드 ( PuTTY는 PPK(PuTTY Private Key) 형식만 지원 )

 

Connection-SSH-Auth-Credentials등록, Session에서 HostName+IP입력하고 세션 save

 

lab-edu-ec2-bastion에 접속 → pem 키페어를 복사하여 파일로 내용 저장 ( vim Editor 이용 → 파일명: lab-edu-key-ec2.pem )

 

 

pem 키파일 권한설정 ( chmod 600 ) → 보호

chmod 600 lab-edu-key-ec2.pem

 

Bastion 서버(10.0.0.59)에서 pem키를 이용하여 web서버의 private IP주소(10.0.40.245)로 ssh 접속

ssh -i lab-edu-key-ec2.pem ec2-user@{ web서버 private IP }

 

 

로그확인

vim /var/log/cloud-init-output.log

User data관련사항
완료된 부팅

 

[ Proxy설정 ]

Bastion Server를 Proxy Server로 사용 → private IP에서 만든 Web Server를 public IP로 접근가능

 

setting_bastion.sh 파일 : Bastion Server를 web server로 접속하기 위한 프록시 환경을 세팅하는 스크립트 파일

lab-edu-ec2-web이라는 이름값을 가진 웹서버 EC2 인스턴스의 private_ip를 조회하여( AWS CLI로 검색 ) 변수저장
nginx 설치후 프록시 수행하도록 설정 ( Nginx가 클라이언트로부터 받은 HTTP 요청을 $WEB_PRIVATE_IP:80 으로 전달 )

 

 

AWS 계정인증( lab-edu-iam-user-22에서 엑세스키 생성하여 이용 )

aws configure : IAM user가 자격 증명(access/secret key)을 사용해 AWS 서비스에 접근 권한을 설정하는 명령

 

파일권한 설정

sudo chmod +x setting_bastion.sh

 

파일 실행

./setting_bastion.sh

 

 

Bastion 서버의 Public IP로 접속하면(포트없음) Web Server로 자동연결 이때 web server에는 EC2 관련 데이터 접근을 위한 IAM 권한이 없기에 에러페이지가 반환됨( admin권한으로 EC2를 생성 하였지만 없음, Crendential Error발생 )

 

[ Instance Profile (IAM Role)를 통한 EC2 인스턴스에 권한할당 ]

EC2 서비스에 부여가능한 IAM Role을 생성한다 ( lab-edu-role-ec2 )

 

AmazonEC2FullAccess : EC2와 관련된 모든 작업을 허용하는 광범위한 권한을 부여 = EC2 리소스를 완전히 관리

 

 

EC2 인스턴스에 할당 EC2 메인 콘솔 화면 → 인스턴스 리소스 탭 → lab-edu-ec2-web 선택 → 작업 → 보안 → IAM 역할 수정

 

이후 인스턴스 재부팅

웹서버에서 80번 포트가 LITSEN 상태가 아니라면 → 브라우저를 통해 Streamlit 애플리케이션에 접근할 수 있도록 설정

 

정상권한으로 접근된다.

 

[ VS Code server 생성(lab-edu-ec2-vscode) ]

  • AMI는 Ubuntu 24.04 LTS type은 c7i.2xlarge 기존의 키페어 등록(lab-edu-key-ec2)
  • 네트워크 설정 : VPC설정, 두번째 public 서브넷에 할당, 퍼블릭IP 자동할당 활성화
  • 보안그룹 생성(lab-edu-sg-vscode)
    • SSH : 인바운드의 소스(트래픽의 발신지)로 내 IP 지정
    • TCP : 인바운드의 소스(트래픽의 발신지)로 내 IP 지정 & 포트범위 8080 ⇒ 로컬 컴퓨터에서 8080 포트로 접속 가능

이외 설정 : 스토리지 구성 : 100GiB, gp3 유형

 

고급세부확장 - Userdata영역에 install_vscode.sh 복사 AWS_ACCOUNT_ID, AWS_REGION에 적절한 값 입력 USER_NAME = rudals, PW = CJ_CloudWave2025!!

 

접속 : 웹 브라우저에서 {VS_CODE_SERVER_PUBLIC_IP}:8080 접속

 

Workspace Setting & github에서 sample 소스코드 다운로드

 

Workshop 폴더 open시에 새로운 코드가 세팅되어있음

 

 

SSH Config 설정 : VS Code Terminal에서 Bastion, Web Server에 SSH로 접속하기 위한 설정

인증키를 생성 → /.ssh경로로 이동

 

config파일을 생성하고 등록하여 bastion, web-server에 접속가능하도록 함 ( VSCode의 SSH 연결 설정 ) → /.ssh 경로로 이동하여 키 확인

 

VS Code Terminal에서 ssh 명령을 통해 Web Server 접속