반응형
망 구성
지난 포스팅에서 망 분리는 다음과 같다.
- VPC 생성
- CIDR C 클래스 선택
- 서브넷 생성
- 외부망으로 사용할 서브넷 2개
- IP 64개 할당 (/26) 및 접근 허용
- 데이터 센터 A, C 사용
- 라우팅 테이블 - 모든 네트워크 (0.0.0.0) 에 대해 인터게이트웨이 생성
- 외부망 보안 그룹 적용
- 내부망으로 사용할 서브넷 2개
- IP 32개 할당(/27) 및 접근 허용
- 데이터 센터 A, C 사용
- 라우팅 테이블 - 모든 네트워크에 대해 NAT 게이트웨이 생성
- 내부망 보안 그룹 적용
- 외부망으로 사용할 서브넷 2개
- EC2 생성
- 외부망 EC2 1대, 내부망 EC2 1대
- 외부망 : 보안 그룹 - ICMP(핑 테스트) 전체 오픈, SSH (22) 공인 IP 오픈
- 내부망 : ICMP(핑 테스트) 전체 오픈, SSH(22) 관리망 오픈
- t3.medium 사용
- EIP 적용
- 외부망 EC2 1대, 내부망 EC2 1대
Bastion 이란?
기존 망 구성에서 관리망 용도로 EC2 서버를 한대 더 증설하고 Bation을 적용하자. Bastion이란 성 외곽을 보호하기 위해 돌출된 부분을 뜻하며, 이를 아키텍쳐에 적용하여 보안을 강화할 수 있다. 예를 들어 22번 포트와 같이 SSH가 보안이 허술하다면 심각한 문제를 야기할 수 있다. Bastion을 사용하면 서비스 트래픽과 관리자용 트래픽을 구분할 수 있으며, 디도스와 같은 공격을 받더라도 Bastion 서버만 재구성하면 되므로 서비스에 피해를 최소화할 수 있다.
서브넷 생성
- 기존에 내부망으로 사용하던
sasca37-internal-a
를 관리망 용도인sasca37-bastion-a
로 변경하자.
라우팅 테이블 생성
- 관리망 용도로 사용할 라우팅 테이블을 생성하고, 관리망 용도로 사용할 서브넷을 연결하자.
- 전체 라우팅 테이블은 다음과 같다.
보안 그룹 생성
- 보안 그룹은 다음과 같다.
- 외부망 : 8080포트 전체 대역 오픈, 22번 포트 관리망 오픈
- 내부망 : 3306포트 외부망 오픈, 22번 포트 관리망 오픈
- 관리망 : 22번 포트 공인IP 오픈
EC2 생성
EC2-sasca37-bastion
이란 태그 네임으로 EC2 인스턴스를 생성하고 EIP를 적용하자. 전체 생성한 EC2는 다음과 같다.
Bastion 서버 환경 설정
공개키 생성 및 적용
## Bastion Server에서 공개키를 생성합니다.
bastion $ ssh-keygen -t rsa
bastion $ cat ~/.ssh/id_rsa.pub
## 접속하려는 서비스용 서버에 키를 추가합니다.
$ vi ~/.ssh/authorized_keys
## Bastion Server에서 접속을 해봅니다.
bastion $ ssh ubuntu@[서비스용 서버 IP]
- 보안그룹에서 내부망과 외부망의 SSH를 전체 네트워크로 열어두고 다음과 같이 적용시켜보자.
- 적용하는 과정은 다음과 같다. Bastion 서버에서 생성한 RSA 키를 내부망, 외부망 서버에 모두 키를 등록한 후 내부망, 외부망의 보안그룹에서 SSH를 관리망 대역으로 한정지어 변경하자.
bastion $ sudo vi /etc/hosts
[서비스용IP] [별칭]
bastion $ ssh [별칭]
- 다음과 같이
vi /etc/hosts
에서 호스트 알리아스를 설정해두자.
Shell Prompt 변경하기
$ 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 서버는 구분해야하는 서버이므로 쉘 프롬프트를 설정하자.
환경변수 적용하기
$ sudo vi ~/.profile
HISTTIMEFORMAT="%F %T -- " ## history 명령 결과에 시간값 추가
export HISTTIMEFORMAT
export TMOUT=600 ## 세션 타임아웃 설정
$ source ~/.profile
$ env
- 세션 타임아웃 설정 하여 일정 시간 동안 작업하지 않을 경우 터미널을 해제할 수 있다. 600초로 설정하자.
logger 사용하기
$ 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
환경 세팅 및 자바 설치
# 현재 위치를 확인합니다.
$ 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
빌드
$ ./gradlew clean build
# jar파일을 찾아본다.
$ find ./* -name "*jar"
실행
$ 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 &
를 활용하여 해결가능하다.
로그 확인
# java applicaion이 남기는 로그를 확인합니다.
$ tail -f [로그파일명]
# 파일을 압축하고 파일 소유자와 모드를 변경해봅니다.
$ tar -cvf [파일명] [압축할파일 또는 디렉터리]
$ sudo chown [소유자계정명]:[소유그룹명] [file이름]
$ chmod [옵션] [파일명]
> https://ko.wikipedia.org/wiki/Chmod
종료
$ ps -ef | grep java
$ pgrep -f java
$ kill -2 [PID]
명령어 이력 확인
$ history
도메인 등록하기
# 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
반응형