[AWS] Bastion Host 를 활용한 SSH 접근통제 #1



AWS 에서 Instance 를 생성하여 사용하고 있다면 유지관리를 위하여 서버에 SSH 접속을 하는 경우가 생기게 됩니다.
기본적으로 무료로 제공되는  Security Group(SG) 을 Chaining으로 구성 하게 되면 간략하게  특정 EC2 인스턴스 에게만 SSH 접속을 허용하는 보안 구성이 가능합니다.

구성하고자 하는 모형은 아래와 같습니다.
cloudcraft - Web App Reference Architecture (1)

















[SecurityGroup을 통한 SSH 접근제어 구성]


AWS 보안 구성을 하기전에는 먼저 Security Group을 생성한 후 EC2 인스턴스 생성시 해당 Security 그룹을 적용하는 방법을 사용하는 것이 순서입니다.
하지만 이미 서버가 운영중에  추가 보안구성을 하는 경우를 감안해서 EC2 인스턴스를 먼저 생성한 후에 Security Group 설정을 진행 하겠습니다.


우선 Bastion Host 역할을 할 EC2 인스턴스를 생성해 보도록 하겠습니다.

EC2 Dashboard 로 이동해 Launch Instance 를 선택합니다.
image



Amazone Linux 를 선택 합니다.
image


Free Tier 가 적용되는 T2 Micro 를 선택하고 Review and Launch 를 선택 합니다.
image


Review 화면이 나오면 Launch 를 선택합니다.
image


Key Pair 를 새로 생성하고 Download Key Pair 를 선택하여 Key 파일을 다운로드 한후
Launch Instance 를 선택합니다.
image


View Instance를 선택하여 생성된 EC2 인스턴스를 확인 합니다.
image


인스턴스가 정상적으로 생성되었습니다.
image
접속 IP가  54.157.118.232 인  Instance 가 생성되었습니다.


동일한 방법으로 Web Server 역할을 수행할 EC2 Instance 를 생성해 보도록 하겠습니다.
image
접속 IP 가 34.224.165.38 인 instance가 생성되었습니다.
분류하기 쉽게 Name 태크에 Bastion , Web 이라고 각각 설정하였습니다. 



새로 생성된 Instance 는 아직까지 아무런 보안설정을 적용하지 않았으므로 기본적으로 SSH 접속이 가능합니다.

image



이제 두개의 인스턴스의 Security 그룹 설정을 각각 진행하도록 하겠습니다.

EC2 Dashboard 좌측 메뉴에 Security Group 을 선택하고 Create SecurityGroup을 선택  합니다.
image
Group NameSG_Bastion으로 설정 하겠습니다.


Inbound TAB 에서 Add Rule 을 선택합니다.
Type SSH 로 선택한 후
Source  영역에 MyIP  를 선택하면 현재 접속중인 네트워크의  공인 IP 주소가 자동으로 등록됩니다.
image
이렇게 설정하게 되면 Security Group 에서 현재 지정된 IP만 접속을 허용하게 됩니다.
별도로 특정 IP나 대역을 설정하고 싶다면 Custom 으로 입력이 가능합니다.



Create 를 선택하여 그룹 생성을 완료 합니다.
image
WebSVR 의 SecurityGroup 설정시 필요하므로
생성된 SecurityGroup의 Group-ID 를 따로 메모해 둡니다.



동일한 방법으로 Web 서버에 사용할 Security Group
SG_Web 으로  생성하겠습니다.
image
Source 항목Custom 을 선택하고 아까 메모해 두었던 SG_Bastion 의 Group-ID 를 입력합니다.

이렇게 되면
SG_Bastion 그룹에 속해있는 인스턴스만 SG_Web 그룹에 속해 있는 인스턴스에 접속 가능 합니다.



이제 각각의 인스턴스에 Security-Group을 적용 하도록 하겠습니다.
다시 EC2 메뉴로 이동합니다.


Bastion Instance 를 선택하고
Action – Networking- Change Security Groups 을 선택합니다.
image



좀전에 생성한 SG_bastion 을 선택합니다.
image

같은 방식으로 Web instance 를 선택하고 SG_Web으로 SecurityGroup을 설정합니다.



이제 다시 Web 서버로 SSH 접속을 시도해 보겠습니다.
image
접속이 되지 않고  Network Error 가 발생하는 것을 확인 할 수 있습니다.



그럼 Bastion instance 로 접속해 보겠습니다.
image
Bastion Host 에 정상적으로 접속 되었습니다.



이제 Bastion Host 에서 Web 서버로 접속이 가능한지 확인해 보겠습니다.

현재 Default VPC 에서 모든 작업이 이루어 졌으므로 생성된 모든 Instance 간에는
내부 IP 를 통해 통신이 가능합니다.

Web Server 상세 정보에서 Private IPs 를 확인하여 해당 IP로 접속하도록 하겠습니다.

image

* VPC 와 Subnet 구성에 관한 내용은 차후 별도의 포스팅으로 정리하도록 하겠습니다. 



Bastion Host 에서 Web 서버로 SSH 접속을 진행합니다.

image


BastionHost 와 동일한 Key 를 사용하여 서버가 생성 되었지만 BastionHost 가 해당 키를 소유하고 있지 않기 때문에 Permission denied 가 호출되며 서버 접속이 되지 않습니다.


아래와 같이 접속이 가능하도록 인프라 설정은 모두 마무리 되었습니만 실제 서버 접속을 위해서는 Putty Pageant  설정을 추가로 진행해 주셔야 합니다.









Bastion Host : 관리자 IP 만 SSH 접속허용
Web Server   : Bastion Host 만 SSH 접속허용


Windows에서 Putty 를 활용하여 인스턴스에 접속하는 방법과
Pageant 를 활용해 EC2 접속 Key 를 분리하여 보안을 강화하는 방법은 다음 포스팅을 통해 다시 설명하도록 하겠습니다.


다음 포스팅 보러가기 ->  [AWS] Bastion Host 를 활용한 SSH 접근통제 #2









댓글

  1. 글 잘 보았습니다. 그런데 마지막 글에 대하여 문의드릴게 있어서 코멘트 남겨요.
    "
    Bastion Host 에서 Web 서버로 SSH 접속을 진행합니다.
    동일한 서버 접속 Key로 서버가 생성되었기 때문에 별도의 설정없이 서버 접속이 가능합니다.
    "
    라고 글을 적고 사진을 하단에 넣어두셨는데요.

    사진을 보면 172.31.30.139서버에서 172.31.16.161 으로 permission denied로 접속을 못한것으로 보여서요. bash명도 [ec2-user@ip-172-31-30-139 ~] 로
    보이는데 어떤 부분으로 172.31.16.161서버로 접속되었다고 얘기하신건지 문의 드립니다.

    답글삭제
    답글
    1. 내용에 일부 오류가 있었네요
      동일한 Key 로 서버가 생성되었지만 관리자가 서버 접속시에는 Pageant 설정을 통한 Key 관리가 필요합니다.
      다음 포스팅에 있는 Pageant 사용방법을 통해 Key 정보 입력 후 접속 시 문제 없이 진행 가능합니다.
      (내용 수정하였습니다)

      삭제
  2. 캡처화면에 permission denied 라고 나오는데 접속이 안된거 아닐까요?

    답글삭제
  3. 이거 마지막 부분 SSH permission denied 떠서 실패하셧는데요?

    답글삭제
  4. 마지막 사진처럼 Permission denied (Publickey). 라고 뜨는데 혹시 해결 하셨나요?

    답글삭제
  5. 올리신 글 잘 보고있습니다. 다만 크롬에서 게시글이 제대로 표시되지 않는 이슈가 있는것 같네요. 잘 모르고 계신듯하여 글 남겼습니다.

    답글삭제
  6. bastion에서 instance로 ssh 연결 하실때 permission denied 되신 것 같습니다

    답글삭제

댓글 쓰기

주간 인기글

남산 케이블카 이야기

Kotlin, Java 그 다음?

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[Angular] 모델, 값이 바뀌었는데 화면 template 이 업데이트 되지 않을 때 조치 팁

안드로이드에서 당겨서 새로고침(SwipeRefreshLayout) 쉽게 구현하기