포스팅을 앞두고…

어제는 SI업체에서 면접을 보고 왔습니다. 담주 중으로 결과가 나오는데, 좋은 결과 있기를 바라고 있습니다.

제 블로그를 들려주는 사람이 거의 없지만, 포스트가 하나하나 늘어나는게 뿌듯합니다. 구글 서치 콘솔을 통해 보니 두명이었나… 예전에 블로그 리뉴얼 전에 코테 풀이를 올렸을 때는 엄청난 조회수와 노출을 자랑했는데 말이죠(과거의 영광)

요즘 학습하는 내용은 쿠버네티스(Kubernetes), MSA(MicroService Architecture), 리눅스(Linux)를 중점으로 공부하고 있습니다. 코테 공부도 해야하는데..

SSH(Secure Shell)

SSH(Secure Shell)를 설명하기 위해선 Telnet이라는 프로토콜을 먼저 알아야 합니다. Telenet은 주로 23번 포트를 사용하고 있는데요. Telnet은 원격 시스템에 접속하고 명령을 실행할때 사용합니다. 하지만, 데이터 전송 중 정보가 암호화되지 않아 보안에 취약합니다.

따라서 Telnet에 보안 기능이 추가된 암호화 버전이 SSH(Secure Shell)프로토콜입니다. Telnet을 기반으로 데이터를 암호화하여 전송함으로써 보안을 강화한 프로토콜입니다. 이외에도 원격과 관련된 프로토콜들이 있는데요. 나중에 네트워크 공부를 하면서 자세히 다뤄보면 좋을 것 같습니다.

SSH(Secure Shell)프로토콜은 주로 22번 포트를 사용합니다. AWS EC2 생성하고 접속하시면서 가장 쉽게, 자주 접하는 프로토콜이죠. 아마 개인적으로 또는 팀으로 프로젝트 진행하시면서 굳이 SSH 포트를 변경해서 사용하시는 분은 없을겁니다. 근데 실제 서비스 환경을 생각한다면 SSH 포트를 변경하는 일은 당연한 일이 됩니다.

저는 해킹을 두번 당해봤습니다. 첫번째는 AWS 환경에서 Redis Sentinel구조 사용해볼때 모든 트래픽 허용했다가 해커에게 서버의 Redis 메모리 자원을 Lock당해본 경험, 두번째는 도커 컨테이너 MySQL 데이터를 인질로 잡혀본 경험. 이렇다 보니 고도의 보안 설정까진 하지 못하더라도 기본은 갖추려고 노력하게 되더라구요.

오늘 포스팅에선 SSH(Secure Shell)와 관련하여 여러 실습을 진행하면서 SSH(Secure Shell)를 깊이 이해해보도록 하겠습니다.

Ubuntu 환경에서 SSH(Secure Shell) 포트번호 변경하기

스크린샷 2023-10-19 오후 4 19 48 * [그림1.1]

간단하게 [그림1.1]과 같이 EC2 인스턴스를 생성해줬습니다. 보안그룹은 SSH(port:22)만 허용해준 상태입니다.

스크린샷 2023-10-19 오후 4 22 45 * [그림1.2]

인스턴스를 생성할때 이렇게 PEM 키 파일도 생성해서 다운로드 받아 놓았습니다.

스크린샷 2023-10-19 오후 4 33 56 * [그림1.3]

[그림1.3]을 보시면 보통 이렇게 접속 많이 하실겁니다. 기본적으로 ssh 명령어를 입력할때 포트번호를 따로 지정해주지 않으면 웰노운(Well Known)포트인 22번이 디폴트(default)로 설정되어 접속됩니다.

그럼 포트번호 변경을 해볼까요

vi /etc/ssh/sshd_config

위 명령어를 통해 설정파일을 편집기로 열게 되면 아래 [그림1.4]와 같은 화면이 뜹니다.

스크린샷 2023-10-19 오후 4 42 19 * [그림1.4]

여기서 저는 14번째 줄의 Port 번호를 행운의 숫자 7777로 변경해보겠습니다.

스크린샷 2023-10-19 오후 4 43 49 * [그림1.5]

그다음 아래 명령어를 입력하여 ssh를 재시작하겠습니다.

sudo systemctl restart ssh

스크린샷 2023-10-19 오후 4 47 53 * [그림1.6]

[그림1.6]을 보면 포트번호를 변경하고 로그아웃한 이후에 다시 이전과 같은 명령어로 접속하려고 보니 연결이 거부가 되었습니다.

ssh -i key.pem ubuntu@107.20.110.101 -p7777

그럼 이렇게 명령어를 바꿔볼까요.. 아마 Operation timed out이 뜰겁니다. 왜냐하면 보안그룹 설정을 안바꿨으니까요ㅎㅎ 보안그룹에서 포트번호까지 바꿔주겠습니다.

스크린샷 2023-10-19 오후 4 52 54 * [그림1.7]

그럼 다시 접속 시도를 해보겠습니다.

스크린샷 2023-10-19 오후 4 55 49 * [그림1.8]

[그림 1.8]을 보시면 변경된 포트번호 7777로 접속이 된 걸 확인하실 수 있습니다. 이렇게 웰노운 포트를 피해 포트번호를 변경하는 것만으로 여러분의 인스턴스의 보안을 한 단계 향상킬 수 있습니다.

PEM(Privacy Enhanced Mail)키 파일을 사용한 SSH(Secure Shell) 접속 과정

ssh-pem (1) * [그림1.9]

클라우드 서비스가 제공하는 가상 서버(인스턴스)에 접속을 위해 PEM 키 파일을 많이 사용할 겁니다. 그 과정을 살펴보자면

사용자가 인스턴스를 처음 생성할 때, 키 페어(Public Key, Private Key)가 생성됩니다. 사용자가 다운로드 하는것은 Private Key(.pem파일)입니다.

생성된 Public Key는 서버(인스턴스)에 자동으로 저장됩니다. 이는 인스턴스에 접속해서 확인할 수 있습니다.

사용자가 인스턴스에 접속하려고 시도할 때, SSH 클라이언트는 서버(인스턴스)에 저장된 Public Key와 일치하는 Private Key(.pem파일)를 사용하여 인증을 시도합니다. 이 과정에서 Public Key와 Private Key의 쌍이 일치해야만 사용자는 인스턴스에 안전하게 접속할 수 있습니다.

PKI(Public Key Infrastructure)

이런 인증 방식은 PKI(Public Key Infrastructure)라는 체계에서 파생되었습니다. PKI는 디지털 인증서와 Public/Private 키 쌍을 사용하여 개체의 신원을 확인하고, 데이터 암호화, 무결성, 인증을 제공하는 체계입니다.

그럼 이제 Server에 저장된 Public Key를 직접 확인해볼까요.

스크린샷 2023-10-19 오후 9 03 37 * [그림2.0]

ubuntu라는 이름으로 접속을 했으니 ubuntuuser의 디렉토리에 들어가게 되면 이렇게 인증에 사용된 Public Key(authorized_keys)가 있습니다.

스크린샷 2023-10-19 오후 9 06 46 * [그림2.1]

cat명령어를 사용해서 authorized_keys를 확인해볼수도 있겠네요.

Wireshark를 이용해서 SSH(Secure Shell) 패킷 분석하기

Wireshark는 네트워크 패킷 분석기입니다. 네트워크를 톨해 전송되는 패킷의 내용을 실시간으로 볼 수 있게 해줍니다.

Wireshark를 이용해 네트워크 패킷을 캡처하는동안 원격접속을 시도하고 캡처되는 내용을 살펴보겠습니다.

스크린샷 2023-10-19 오후 9 43 25(2) * [그림2.2]

[그림2.2]를 보시면 TCP 3-way handshake에서 첫번째(SYN)와 두번째(SYN-ACK) 단계를 보실 수 있습니다. port번호가 22가 아니라 7777이라 SSHv2프로토콜은 볼수가 없었는데, 아래 그림처럼 TCP Stream을 Follow해보면, 클라이언트가 사용한 SSH의 프로토콜 버전이 SSH-2.0-OPENSSH_8.1인 것을 확인할 수 있었습니다. 또, 서버가 사용중인 SSH 프로토콜의 버전은 SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.4인 것을 볼 수 있었습니다. 암호화 알고리즘 목록도 보이구요. 다만 SSH는 암호화된 연결을 제공하므로, [그림2.3]처럼 패킷 내용의 대부분은 암호화되어 읽을 수 없습니다.

스크린샷 2023-10-19 오후 10 28 06(2) * [그림2.3]

글을 마치며

오늘은 SSH(Secure Shell)에 대해 알아보았는데요. 위키백과보시면 SSH 버전의 역사도 보실 수 있습니다. 저도 네트워크에 대한 이해도가 높아지게 된다면 이처럼 프로토콜을 개발할 일이 올 수 있을려나요. 긴 글 읽어주셔서 감사합니다.