AWS 클라우드 구축 (3) - Bastion Host, OS 계정 생성

2021. 07. 31.

PROJECT

가상의 고객사 시스템 구축과 운영

  • SI

    • AWS 클라우드 환경 구성
    • 쿠버네티스 기반 EKS 환경 구성, 웹서비스 구축
  • SM

    • 로그 수집을 위한 EFK Stack 구축
    • CloudWatch 알람을 Slack으로 전송하여 실시간 모니터링

Work

  • ssh 접속시 비밀번호 로그인 허용
  • sudo 권한 부여
  • Security group: 회사 IP만 허용

 Bastion Host란?

Bastion Host

침입 차단 소프트웨어가 설치되어 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 수행하는 호스트이다.

다음 그림을 보자. Bastion host가 없는 경우 외부 네트워크에서 공격을 받아 패스워드를 해킹 당한다면 내부 네트워크인 회사의 Server에 접근이 가능해진다. 반면 Bastion host를 운영하고 있다면 외부 네트워크의 패스워드가 해킹 당하더라도 회사 Server까지는 접근할 수 없다.

 **NAT로 서버 보호하기**

NAT

Network address translation. 공인 네트워크와 사설 네트워크 영역의 경계에서 IP를 매칭해주는 역할을 한다. NAT를 사용하면 다음과 같은 이점이 있다. 

1. IP 주소를 절약할 수 있다.

하나의 공인 IP 주소를 사용하여 여러 대의 호스트가 인터넷에 접속할 수 있다. 우리는 집집마다 인터넷 공유기를 설치해서 여러 기기를 연결해서 사용한다. 공유기에 NAT 기능이 들어있어 공인 IP를 사설 IP로 바꿔주는 것이다. NAT로 공인 IP를 절약하기 때문에 저렴하게 인터넷을 이용할 수 있는 것이다.

2. 네트워크와 호스트를 보호할 수 있다.

NAT는 IP를 숨길 수 있다. 라우터 외부로 트래픽이 나갈 때 사설 IP가 공인 IP로 바뀐다. 공격자는 라우터 안쪽에 있는 사설 IP를 알 수 없으므로 내부 네트워크와 호스트를 공격할 수 없다. 

우리는 NAT를 사용해서 서버를 외부에서 접근할 수 없도록 보호하려고 한다.

AWS에서 NAT 구성

1. AWS의 완전관리형 서비스인 NAT Gateway 사용

AWS에서 유지 관리 작업을 수행해준다. 성능이 뛰어나고 안정성 측면에서 유리하지만 비용이 많이 부과된다는 단점이 있다.

2. EC2 Instance를 NAT 용도로 사용

우리는 비용상의 이점으로 EC2 Instance를 NAT 용도로 사용하기로 했다.

위 그림을 보자. 하나의 VPC 안에 public, private subnet이 있고, public subnet에 NAT Instance가 있다.

Public subnet의 route table을 보면 0.0.0.0/0이 igw-id와 연결 되어 있는데, 이것은 서버에서 인터넷으로 통신을 할 때 Internet Gateway(igw)를 사용한다는 것이다. 외부에서 VPC 내부의 공인 IP로 접근할 때도 igw를 통해 접근한다.

Private subnet에는 igw가 없고 nat-instance-id가 있다. 이것은 public subnet의 NAT instance를 의미한다. Private subnet은 NAT instance를 거쳐 외부 인터넷과 통신이 가능하며, 외부에서는 private subnet의 IP를 알 수 없다.

 **NAT Instance 생성**

1. [EC2 > 인스턴스 > 인스턴스 시작]

2. [ AMI 선택 > 커뮤니티 AMI > Amazon Linux 2 AMI 선택 > 다음(검토 및 시작 누르면 안됨) ] 

3. [ 인스턴스 유형 선택 > t2.micro > 다음 ]

4. 인스턴스 세부 정보 구성을 다음과 같이 설정한다.

  • 네트워크: mission-vpc
  • 서브넷: public-subnet A

5. 스토리지 추가를 다음과 같이 설정한다.

  • 크기: 8
  • 볼륨 유형: 범용 SSD(gp2)
  • 암호화: 암호화되지 않음

6. 5단계 기본 설정으로 넘기고, 보안 그룹 구성에서 다음과 같이 설정한다. 

7. 검토 및 시작

새 키페어를 생성하고 키 페어를 다운로드한다. 인스턴스에 접속할 때 필요하므로 잘 보관해둔다. 한 번만 다운로드 가능하므로 절대! 삭제하지 않는다.

8. 인스턴스가 생성된 것을 확인할 수 있다. 

 라우팅 수정

그림처럼 private subnet의 라우팅 테이블에 NAT instance를 연결해줄 것이다.

1. [ VPC 서비스 > 라우팅 테이블 > Internal-rt > 라우팅 탭 > 라우팅 편집 ]

대상: 0.0.0.0/0과 NAT Instance의 id

2. 인스턴스로 돌아가 생성한 인스턴스 우클릭 한 뒤 [ 네트워킹 > 소스/대상 확인 변경 > 중지 체크 ]

모든 수신, 발신 트래픽을 NAT 인스턴스에서 라우팅하기 위한 설정이다. IGW 밖으로 나가는 신호는 라우팅 테이블로 제어하고, IGW 안으로 들어오는 신호는 NAT 인스턴스에서 제어하기 위해 소스/대상 확인을 비활성화 해준다.

 인스턴스 보안그룹 설정

1. 인스턴스 선택한 뒤 [ 보안 > 보안그룹 > 인바운드 규칙 편집 ]

2. 규칙 추가 버튼을 누른 뒤 다음과 같이 설정한다. 내 IP에서만 인스턴스에 접속할 수 있게 해주는 보안 설정이다. 

  • 유형: SSH
  • 소스: 내 IP

 탄력적 IP 주소(Elastic IP) 연결

인스턴스에 퍼블릭 IPv4 주소가 없는 경우 탄력적 IP 주소를 인스턴스에 연결하여 인터넷 통신을 활성화할 수 있습니다. 탄력적 IP를 인스턴스에 부여해 외부에서 접속이 가능하게 만든다. 

1. EC2에서 [ 탄력적 IP > 탄력적 IP 주소 할당 ]

2. 탄력적 IP 주소(EIP)를 다음과 같이 할당한다. 

3. 할당받은 EIP를 생성한 인스턴스에 연결한다.

4. 인스턴스로 돌아가 인스턴스 요약을 열면 EIP가 제대로 연결된 것을 확인할 수 있다. 

 OS 계정 생성

  • 보안상의 이유로 운영 서버에서 ec2-user의 사용을 금지한다. 개인 계정을 생성한 뒤 비밀번호를 설정하여 로그인할 때 id와 pw를 통해 접속한다. 장애 발생 시 책임의 소재를 명확히 하기 위해 1인 1계정을 생성할 것이다.
  • 보안상 이유로 운영 서버에서 key 방식 로그인을 지양한다. ssh 접속시 비밀번호 로그인을 허용하도록 설정한다.
  • putty에서 작업했지만 어떤 리눅스 환경에서도 작업 가능하다.

1. puttygetn을 다운로드 받고 실행한다. Keygen > Load > 모든 파일 보기 > 앞에서 다운로드 받은 키페어 선택 

2. Save private key 버튼을 누르고 .ppk 형식으로 키를 다시 저장해준다. 키 보관에 주의한다(삭제 금지)!!

3. Putty 접속 > Host Name에 EIP 입력 (포트: 22)

4. Connection > SSH > Auth > 앞에서 puttygen으로 변환한 ppk 형식 키 불러오기 > Open

5. admin 계정을 생성해서 비밀번호를 부여한다.

login as: ec2-user

# sudo -i		// 루트로 계정 변경
# useradd admin		// admin 계정 생성
# passwd admin		// 비밀번호 입력
# cat /etc/passwd	// 생성된 계정 확인

6. 생성한 admin 계정에 ec2-user와 동일하게 sudo 권한을 부여하고 비밀번호 입력 없이 명령어를 수행 가능하게 설정한다. 

# sudo -i			// 루트로 계정 변경
# vi /etc/sudoers.d/cloud-init	// ec2-user와 동일한 권한 부여

// 위 파일을 열고 다음과 같이 입력 후 저장
admin ALL=(ALL) NOPASSWD:ALL

위 파일이 존재하지 않을 경우 ls로 디렉토리를 확인해서 다음과 같은 파일이 존재하는지 확인하고, 해당 파일에 똑같이 admin 권한을 수정해주면 된다. 

# ls -al /etc/sudoers.d

-r--r-----  1 root root  135 Jul 19 04:11 90-cloud-init-users

# vi /etc/sudoers.d/90-cloud-init-users

7. 키 방식 로그인을 차단하고 비밀번호 로그인을 허용한다.

# vi /etc/ssh/sshd_config

PasswordAuthentication	yes		// 파일에서 이 부분 주석 해제
# PasswordAuthentication	no	// 이 부분 주석 설정 후 파일 저장

#service sshd restart			// sshd 데몬 재시작

좋은 웹페이지 즐겨찾기