제육's 휘발성 코딩
반응형

1. 망 구성

image

지난 포스팅에서 망 분리는 다음과 같다.

  • VPC 생성
    • CIDR C 클래스 선택
  • 서브넷 생성
    • 외부망으로 사용할 서브넷 2개
      • IP 64개 할당 (/26) 및 접근 허용
      • 데이터 센터 A, C 사용
      • 라우팅 테이블 - 모든 네트워크 (0.0.0.0) 에 대해 인터게이트웨이 생성
      • 외부망 보안 그룹 적용
    • 내부망으로 사용할 서브넷 2개
      • IP 32개 할당(/27) 및 접근 허용
      • 데이터 센터 A, C 사용
      • 라우팅 테이블 - 모든 네트워크에 대해 NAT 게이트웨이 생성
      • 내부망 보안 그룹 적용
  • EC2 생성
    • 외부망 EC2 1대, 내부망 EC2 1대
      • 외부망 : 보안 그룹 - ICMP(핑 테스트) 전체 오픈, SSH (22) 공인 IP 오픈
      • 내부망 : ICMP(핑 테스트) 전체 오픈, SSH(22) 관리망 오픈
      • t3.medium 사용
      • EIP 적용

2. Bastion 이란?

image

기존 망 구성에서 관리망 용도로 EC2 서버를 한대 더 증설하고 Bation을 적용하자. Bastion이란 성 외곽을 보호하기 위해 돌출된 부분을 뜻하며, 이를 아키텍쳐에 적용하여 보안을 강화할 수 있다. 예를 들어 22번 포트와 같이 SSH가 보안이 허술하다면 심각한 문제를 야기할 수 있다. Bastion을 사용하면 서비스 트래픽과 관리자용 트래픽을 구분할 수 있으며, 디도스와 같은 공격을 받더라도 Bastion 서버만 재구성하면 되므로 서비스에 피해를 최소화할 수 있다.

2.1. 서브넷 생성

image

  • 기존에 내부망으로 사용하던 sasca37-internal-a 를 관리망 용도인 sasca37-bastion-a 로 변경하자.

2.2. 라우팅 테이블 생성

image

  • 관리망 용도로 사용할 라우팅 테이블을 생성하고, 관리망 용도로 사용할 서브넷을 연결하자.

image

  • 전체 라우팅 테이블은 다음과 같다.

2.3. 보안 그룹 생성

image

  • 보안 그룹은 다음과 같다.
    • 외부망 : 8080포트 전체 대역 오픈, 22번 포트 관리망 오픈
    • 내부망 : 3306포트 외부망 오픈, 22번 포트 관리망 오픈
    • 관리망 : 22번 포트 공인IP 오픈

2.4. EC2 생성

image

  • EC2-sasca37-bastion 이란 태그 네임으로 EC2 인스턴스를 생성하고 EIP를 적용하자. 전체 생성한 EC2는 다음과 같다.

2.5. Bastion 서버 환경 설정

공개키 생성 및 적용

<code />
## Bastion Server에서 공개키를 생성합니다. bastion $ ssh-keygen -t rsa bastion $ cat ~/.ssh/id_rsa.pub ## 접속하려는 서비스용 서버에 키를 추가합니다. $ vi ~/.ssh/authorized_keys ## Bastion Server에서 접속을 해봅니다. bastion $ ssh ubuntu@[서비스용 서버 IP]
  • 보안그룹에서 내부망과 외부망의 SSH를 전체 네트워크로 열어두고 다음과 같이 적용시켜보자.

image

  • 적용하는 과정은 다음과 같다. Bastion 서버에서 생성한 RSA 키를 내부망, 외부망 서버에 모두 키를 등록한 후 내부망, 외부망의 보안그룹에서 SSH를 관리망 대역으로 한정지어 변경하자.
<code />
bastion $ sudo vi /etc/hosts [서비스용IP] [별칭] bastion $ ssh [별칭]
  • 다음과 같이 vi /etc/hosts 에서 호스트 알리아스를 설정해두자.

Shell Prompt 변경하기

<code />
$ sudo vi ~/.bashrc USERNAME=BASTION PS1='[\e[1;31m$USERNAME\e[0m][\e[1;32m\t\e[0m][\e[1;33m\u\e[0m@\e[1;36m\h\e[0m \w] \n\$ \[\033[00m\]' $ source ~/.bashrc
  • Bastion 서버는 구분해야하는 서버이므로 쉘 프롬프트를 설정하자.

환경변수 적용하기

<code />
$ sudo vi ~/.profile HISTTIMEFORMAT="%F %T -- " ## history 명령 결과에 시간값 추가 export HISTTIMEFORMAT export TMOUT=600 ## 세션 타임아웃 설정 $ source ~/.profile $ env
  • 세션 타임아웃 설정 하여 일정 시간 동안 작업하지 않을 경우 터미널을 해제할 수 있다. 600초로 설정하자.

logger 사용하기

<code />
$ sudo vi ~/.bashrc tty=`tty | awk -F"/dev/" '{print $2}'` IP=`w | grep "$tty" | awk '{print $3}'` export PROMPT_COMMAND='logger -p local0.debug "[USER]$(whoami) [IP]$IP [PID]$$ [PWD]`pwd` [COMMAND] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"' $ source ~/.bashrc $ sudo vi /etc/rsyslog.d/50-default.conf local0.* /var/log/command.log # 원격지에 로그를 남길 경우 local0.* @원격지서버IP $ sudo service rsyslog restart $ tail -f /var/log/command.log

환경 세팅 및 자바 설치

<code />
# 현재 위치를 확인합니다. $ pwd # 파일시스템별 가용공간을 확인합니다. $ df -h # 각 디렉토리별로 디스크 사용량을 확인합니다. $ sudo du -shc /* # 현재 경로의 파일들(숨김파일 포함)의 정보를 확인합니다. $ ls -al # 소스코드를 관리할 디렉토리를 생성하고 이동합니다. $ mkdir nextstep && cd nextstep # git 명령어의 위치를 확인해봅니다. $ which git && which java $ sudo apt update $ sudo apt install default-jre $ sudo apt install default-jdk

빌드

<code />
$ ./gradlew clean build # jar파일을 찾아본다. $ find ./* -name "*jar"

실행

<code />
$ java -jar [jar파일명] & $ curl http://localhost:8080
  • -Dserver.port=8080 옵션을 활용해서 port를 변경할 수 있다.
  • 서버 시작 시간이 오래 걸리는 경우 $ java -Djava.security.egd=file:/dev/./urandom -jar [jar파일명] & 를 통해 해결 가능하다.
  • 터미널 세션이 끊어질 경우 background로 실행중인 프로세스에 hang-up signal이 발생해 죽는 경우가 있는데 $ nohup java -jar [jar파일명] 1> [로그파일명] 2>&1 & 를 활용하여 해결가능하다.

로그 확인

<code />
# java applicaion이 남기는 로그를 확인합니다. $ tail -f [로그파일명] # 파일을 압축하고 파일 소유자와 모드를 변경해봅니다. $ tar -cvf [파일명] [압축할파일 또는 디렉터리] $ sudo chown [소유자계정명]:[소유그룹명] [file이름] $ chmod [옵션] [파일명] > https://ko.wikipedia.org/wiki/Chmod

종료

<code />
$ ps -ef | grep java $ pgrep -f java $ kill -2 [PID]

명령어 이력 확인

<code />
$ history

도메인 등록하기

<code />
# 80포트 접근시 8080포트로 리다이렉트 설정 sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 # 체이닝 확인 sudo iptables -t nat -L --line-number

REFERENCES

https://edu.nextstep.camp

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^