본문 바로가기
Computer Science/Linux

[Linux] SSH가 무엇인가요?

by yhames 2023. 11. 28.

shell

쉘(shell)은 kernel을 제어하기 위한 인터페이스이다. kernel을 마치 껍데기처럼 감싸고 있다는 의미에서 shell이라는 이름이 붙었다.

 

커널(Kernel)은 쉘로부터 명령(cat, ls 등)을 받아 CPU, I/O, 메모리 등 다양한 리소스에 접근한다.

 

쉘은 bash, zsh 등 여러가지 종류가 있다.

  • bash는 기존의 Bourne Shell을 대체하기 위해 만들어진 Unix용 쉘이다. 대부분의 리눅스 운영체제에서 기본으로 채택하고 있다.
  • zsh은 bash, ksh, tcsh의 기능을 결합하여 만든 쉘로 bash보다 다양한 기능을 지원한다. 현재 macOS에서 기본으로 채택하고 있다.

ssh

ssh(Secure Shell)는 네트워크 상의 다른 컴퓨터에 원격으로 시스템에서 명령을 실행할 수 있게 해주는 보안 프로토콜이다. 강력한 인증 방법 및 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공한다.

 

기존의 텔넷(Telnet) 방식은 WireShark같은 패킷 분석 프로그램을 이용하면 전송되는 비밀번호나 파일 내용 등을 쉽게 탈취할 수 있었다.
하지만 ssh는 암호화 기법을 사용하기 때문에 통신이 노출된다고 하더라도 이해할 수 없는 암호화된 문자로 보인다.

 

ssh 프로토콜이기 때문에 ssh 통신을 하기 위해서는 해당 프로토콜을 만족하는 프로그램를 설치해야한다. 윈도우에서는 puTTY, 리눅스에서는 openssh를 주로 사용한다. macOS에는 기본적으로 설치되어있다.

ssh의 동작원리

ssh는 비대칭키와 대칭키 방식를 사용하여 데이터를 안전하게 전송한다.

 

비대칭키란 public-private 키 쌍으로 구성되며, public 키를 통해 암호화된 데이터는 해당 private 키를 사용해야만 해독이 가능하다. 주로 서버에서 해당 클라이언트를 인증하거나, 세션키(대칭키)를 암호화 및 복호화하는데 사용된다.

 

대칭키란 하나의 키를 클라이언트와 서버가 공유하는 방식이다. 데이터를 암호화 및 복호화하는데 사용되는 세션키를 생성하는데 사용되며, 일반적으로 Diffie-Hellman 키 교환 프로토콜 등 키 교환 알고리즘(KEA, Key Exchagne Algorithm)을 사용하여 안전하게 교환한다.

 

다음은 최초 접속부터 ssh 데이터 전송할때까지 수행되는 절차이다.

    1. 클라이언트에서 ssh를 통해 서버에 접속 시도

    2. 서버 인증 및 세션 키 생성

         2-1. 서버에서 클라이언트로 서버 공개키(비대칭키) 전송

         2-2.  공개키를 사용하여 클라이언트와 서버 간 세션키(대칭키) 생성

    3. 클라이언트 인증 : 클라이언트에서 서버로 비밀번호 혹은 클라이언트 공개키 전송하여 클라이언트 인증

    4. 세션 키 기반의 데이터 통신

         4-1. 클라이언트에서 생성된 세션키를 사용하여 데이터를 암호화 후 서버에 전송

         4-2. 서버에서 생성된 세션키를 사용하여 데이터 복호화

    5. 세션이 종료되면 해당 세션키 만료

서버 인증 및 세션 키 생성

클라이언트에서 최초로 ssh 서버에 접속을 요청하면, 서버로부터 전달받은 서버 공개키(비대칭키)를 로컬에 저장할 건지 물어본다.

The authenticity of host 'ab1-2-3-4-5.as-asia-6.compute.naver.com (1.2.3.4)' can't be established.
ECDSA key fingerprint is SHA256:7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069.
Are you sure you want to continue connecting (yes/no)?

yes를 입력하면, 공개키가 ~/.ssh/known_hosts 파일 안에 추가된다.

이후부터는 해당 서버에 접속할 때마다 서버로부터 전달받은 공개키가 로컬에 저장되어 있는 공개키와 같은지 검증한다.

 

이후 서버 공개키를 사용하여 세션 키(대칭키)를 생성한다. 세션 키를 생성하는 과정은 클라이언트와 서버가 각종 키를 주고받기 때문에 키 교환(Key Exchange, 줄여서 KEX)이라고 불린다. KEX 알고리즘으로 가장 대표적인 것은 디피-헬만(Diffie-Hellman) 알고리즘이다.

 

KEX 알고리즘은 생성하는 과정에서 서버와 클라이언트가 모두 참여하게 되므로, 양쪽이 동일한 세션 키( 대칭키)를 생성할 수 있도록 한다.

클라이언트 인증

서버 측에서는 비밀번호와 비대칭 키 방식으로 클라이언트를 인증할 수 있다.

비밀번호 기반 인증

비밀번호 기반 인증은 단순히 비밀번호를 사용하여 인증하는 방식이다. 사용자가 비밀번호를 입력하면, 세션키로 암호화되어 전송된다. 하지만 비밀번호가 암호화가 된다고 해도 자동화된 스크립트를 이용하면 쉽게 탈취될 수 있기 때문에 일반적으로 권장되지 않는다.

비대칭키 기반 인증

비대칭키 기반 인증은 클라이언트에서 서버를 인증하는 것과 동일한 방식으로 인증하는 방식이다. 클라이언트에서는 공개키와 비공개키 쌍을 생성하고, 공개키를 서버의 ~/.ssh/authorized_keys 파일 안에 작성한다.

 

다음과 같이 scp 명령어를 사용하면 클라이언트 공개키를 ssh를 통해 복사할 수 있다.

# scp [옵션] [파일명] [원격지_id]@[원격지_ip]:[받는 위치]
scp -P 42 ~/.ssh/id_ras.pub user@10.0.2.15:/home/user

 

세션 키 기반의 데이터 통신

클라이언트와 서버가 서로에 대한 인증을 성공하면, 세션 키를 통해 암호화된 데이터를 주고받으며 통신한다. 세션키는 대칭키이기 때문에 서버와 클라이언트는 동일한 세션 키를 사용하여 암호화 및 복호화하게 된다.

 

통신이 종료되면, 즉 ssh 세션이 종료되면 해당 세션 키는 만료된다.


 

'Computer Science > Linux' 카테고리의 다른 글

[Linux] Flex와 Bison  (0) 2024.02.28
[Linux] 쉘 변수와 환경변수  (0) 2024.02.27
[Linux] 접근 통제 방법 DAC와 MAC  (0) 2023.11.28
[Linux] Debian과 Rocky Linux  (0) 2023.11.28