개요
흔히 AWS나, GCP와 같은 IaaS(Infrastructure as a Service)에서 인스턴스에 접속할 때 SSH를 사용한다.
자주 사용하지만 간과했던 SSH의 개념과 원리를 알아보자
목표
- SSH의 작동 원리를 이해한다
- 직접 인스턴스를 생성하며 SSH를 사용해본다.
여정
SSH란?
SSH는 Secure Shell의 줄임말로, 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜이다.
기존 원격 접속은 ‘텔넷(Telnet)’이라는 방식을 사용했는데,
암호화를 제공하지 않기 때문에 보안상 취약하다는 단점이 있었다.
이를 암호화하는 SSH 기술이 등장했고, 현재 원격 접속 보안을 위한 필수적인 요소로 자리잡고 있다.
따라서, AWS의 EC2 같은 IaaS(Infrastructure as a Service) 에서 인스턴스를 생성해보면
SSH 접속을 위해 ‘인증키’나 ‘키 페어’라는 것을 생성하는 과정을 반드시 거치게 된다.
생성하면 pem이라는 낯선 형식의 파일을 다운로드받게 되는데, 이게 대체 무엇일까?
SSH의 작동원리
SSH를 구성하는 가장 핵심적인 키워드는 ‘KEY(키, 열쇠)’이다.
사용자(클라이언트)와 서버(호스트)는 각각의 키를 보유하고 있으며,
이 키를 이용해 연결 상대를 인증하고 안전하게 데이터를 주고 받게 된다.
여기서 키를 생성하는 방식이 두 가지가 있는데,
그것이 SSH를 검색했을 때 가장 쉽게 볼 수 있는 ‘대칭키’와 ‘비대칭키(또는 공개 키)’ 방식이다.
대칭키 방식
- 사용자 또는 서버는 하나의 대칭 키를 만들어 서로 공유
- 송신자 측에서 평문(원본 데이터)를 공유된 대칭 키를 이용해 암호화
- 수신자 측에서 동일한 대칭 키로 암호를 풀어 정보를 습득
비대칭키 방식
- 서버 또는 사용자가 Key Pair(키 페어, 키 쌍)를 생성
- 비대칭 키(공개 키)의 경우 .pub, 개인 키의 경우 .pem의 파일 형식.
- 공개 키는 유출되어도 크게 문제가 되지 않음
- 서버는 공개 키를 받아서, 이 공개 키로 만들어진 랜덤한 값을 생성
- 사용자는 개인 키를 이용해 랜덤한 값을 해석
- 해석 결과를 서버로 전송한 결과, 일치한다면 접속 허용
생성하기
1. 오라클 계정 생성
2. 구획(Compartments) 생성
- 구획은 클라우드 내에서 작업 내용을 분리하기 위해 사용하는 가상의 작업 공간입니다.
- 메뉴 → Identity & Security 탭 → Compartments 선택 후 생성
- 가상 클라우드 네트워크(Virtual Cloud Networks) 생성
- 메뉴 → Networking 탭 → Virtual Cloud Networks 선택
- VCN 마법사의 Create VCN with Internet Connectivity 메뉴를 이용하여 생성 (옵션은 따로 건드리지 않음)
방화벽 설정
- 우리가 생성한 인스턴스에 접속하기 위해서는 SSH에 대한 방화벽을 허용해주어야 한다.
- 방금 생성한 VCN에 속한 공용 서브넷(Public Subnet)을 클릭하여 세부정보 페이지로 이동한다
- 공용 서브넷이 사용하는 보안 목록의 수신 규칙을 아래와 같이 추가한다.
- 80 : HTTP 접속
- 443 : HTTPS 접속
- 22 : SSH 접속
- 이 때, 보안을 위해 본인 집의 IP나 CIDR 블럭을 지정하는 것을 권장한다
- 아래와 같이 포트 22번에 2가지 규칙이 있다면 좁은 범위의 규칙이 우선 적용된다.
- + @ : 자신이 인스턴스에 사용한 어플리케이션의 Port도 추가하면 좋다. (여기서는 8000번 포트)
공용 IP 생성
- 메뉴 → Networking 탭 → Reserved Public IPs 선택 후 생성 (인스턴스를 만들지 않아 선택할 게 없음)
인스턴스 생성
- 메뉴 → Compute 탭 → Instances 선택
- Create instance 버튼을 눌러 인스턴스 생성
- 자신이 사용할 인스턴스의 이미지 선택 (필자는 Ubuntu 22.04 선택)
- SSH 키 추가 (필자는 Generate a key pair for me 선택) 후 Save private key 버튼으로 개인 키 저장
- 이 때, 공용키는 서버에 저장됨
- Volume 지정은 따로 설정하지 않았음
- 위에서 발급했던 공용IP 부착을 위해 인스턴스 상세 페이지로 이동
- 하단 메뉴 중 Attached VNICs 클릭 → View details 선택
- 하단 메뉴 중 IPv4 Addresses 클릭 → Edit 선택
- Public IP Type을 No public IP로 변경 후 저장(Update)
- 다시 한번 Edit를 눌러 Reserved public IP를 선택하고 위에서 생성했던 공용 IP를 선택 후 적용
접속하기
자, 이제 길고 긴 인스턴스 생성과 공용 IP 적용이 완료되었다.
여기까지 오신 여러분에게 박수를 보낸다! (짝짝짝)
필자는 IntelliJ를 사용하고 있기 때문에 IntelliJ 기준으로 설명하지만
다른 Remote Host 프로그램(Putty, VS Code)도 비슷하기 때문에 큰 차이는 없다
IntelliJ의 설정 창(Settings) 진입 → Tools → SSH Configurations 선택 후 인스턴스 정보 작성
- Host : 공용 IP 주소
- Username : 자신이 선택한 이미지에 따라 다름(필자와 같이 Ubuntu라면 ubuntu가 기본값이다)
- Authentication Type : Key Pair로 선택
- Private key file : 다운로드 받았던 Private Key를 선택
자, 이제 원격 터미널로 접속하면 아래와 같은 화면을 볼 수 있다.
Q & A
- 공용 IP에 DNS를 연결하고 싶어요!
여기 링크를 참조하자
- 인스턴스에 어떤 걸 깔아야하죠? 추천해주세요
사람마다 다르겠지만, 필자는 API 서버를 Docker로 띄워 사용하기 위해 생성했다.
때문에 아래와 같은 설정을 적용하였다.
# 필수 프로그램 설치
sudo apt-get install git curl
# Docker 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
추가로, 인스턴스 자체 방화벽 설정을 하고 싶다면 아래와 같이 사용할 수도 있다.
# 방화벽
sudo apt install iptables-persistent netfilter-persistent
# 80번 포트 개방 http
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# 443번 포트 개방 https
sudo iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT
# 8000번 포트 개방 https
sudo iptables -I INPUT 1 -p tcp --dport 8000 -j ACCEPT
# 27017번 포트 개방 https
sudo iptables -I INPUT 1 -p tcp --dport 27017 -j ACCEPT
# 재부팅시에도 적용 되도록 저장
sudo netfilter-persistent save
# 리로드
sudo netfilter-persistent reload
# 확인
sudo iptables -L
마무리
여기까지 자주 접하면서도 막상 몰랐던 SSH의 개념과
오라클 인스턴스를 접속하기 위해 SSH를 사용해보았다.
오라클 인스턴스는 다른 클라우드 업체와는 조금 다르게 공용 IP도 1개 무료로 발급해준다(타사는 유료임)이를 이용해서 DNS 설정도 할 수 있고, 사양이 낮긴 하지만 정적 페이지나 소형 API 서버도 문제없이 띄울 수 있다다양한 활용도를 찾아봐야겠다.
참고자료
SSH 명칭부터 접속까지 한 번에 이해하기 1 | 가비아 라이브러리 (gabia.com)
SSH 명칭부터 접속까지 한 번에 이해하기 2 | 가비아 라이브러리 (gabia.com)
오라클 클라우드 프리티어 서버 구축 작업1 (구획, 가상네트워크, 방화벽, 공용IP) — 🐾자 멍멍쌤의 컴퓨터 및 코딩 공부 (tistory.com)
오라클 클라우드 프리티어 서버 구축 작업2 (인스턴스 생성, SSH 접속) — 🐾자 멍멍쌤의 컴퓨터 및 코딩 공부 (tistory.com)
'Do you know?' 카테고리의 다른 글
아시나요? 마이크로 서비스와 도메인 주도 설계 (1) (0) | 2023.08.13 |
---|---|
아시나요? 함수형 프로그래밍 - (5) 체이닝(Chaining) (0) | 2023.08.06 |
아시나요? 함수형 프로그래밍 - (4) 고차 함수 (0) | 2023.07.25 |
아시나요? 함수형 프로그래밍 - (3) 추상화 레벨 (0) | 2023.07.23 |
아시나요? 함수형 프로그래밍 - (2) 분류하기 (0) | 2023.07.18 |