Daily CS) SSH

goldenGlow_21·2024년 12월 7일
0

Daily CS

목록 보기
13/50

SSH

Secure SHell

SSH는 네트워크 상의 다른 컴퓨터에 로그인하여 명령을 실행하고 정보를 보고 받을 수 있도록 해주는 통신 프로토콜이다. 컴공 학부생이라면 2학년만 되어도 한번쯤은 접해볼 만한 주제이나, 보안 공부를 하는 사람으로서 한번쯤은 직접 조사해보고 싶어 선택했다.


1. SSH의 개요

1.1 SSH의 정의와 역할

SSH(Secure Shell)는 네트워크를 통해 원격 시스템에 안전하게 접근할 수 있는 프로토콜이다. 일반적으로 원격 서버 관리, 파일 전송, 네트워크 터널링 등 다양한 작업에 사용된다. SSH는 데이터를 암호화하여 통신 중간에서 발생할 수 있는 스니핑(sniffing)이나 중간자 공격(MITM, Man-In-The-Middle Attack)을 방지한다.

SSH는 기본적으로 TCP 포트 22를 사용하며, 클라이언트-서버 모델로 작동한다. 사용자는 로컬 시스템에서 SSH 클라이언트를 실행해 원격 서버로 연결하고, 이를 통해 명령어를 실행하거나 파일을 조작할 수 있다.

1.2 SSH의 역사와 발전

SSH는 1995년 핀란드의 타투 이홀라(Tatu Ylönen)가 개발했다. 당시 네트워크 보안 위협이 증가하면서 기존의 원격 접속 프로토콜인 Telnet, Rlogin, FTP 등은 보안상의 문제로 대체가 필요했다. SSH는 이러한 문제를 해결하며 빠르게 표준화되었고, 현재는 OpenSSH와 같은 오픈소스 구현체가 널리 사용되고 있다.

단계별 발전 과정

  • SSH-1: 초기 버전으로 기본적인 암호화와 인증 기능을 제공. 현재는 보안 취약점 때문에 사용되지 않음.
  • SSH-2: 2006년 발표된 표준으로, 더 강력한 암호화 알고리즘과 키 교환 프로토콜(Diffie-Hellman)을 도입하여 보안을 강화함.

1.3 SSH와 Telnet, FTP의 차이점

SSH는 보안 통신을 제공하는 반면, Telnet과 FTP는 데이터를 평문으로 전송하여 네트워크에서 쉽게 가로챌 수 있다.

특징SSHTelnetFTP
보안성데이터 암호화평문 전송평문 전송
사용 목적원격 시스템 관리, 파일 전송 등원격 시스템 관리파일 전송
포트222321

2. SSH의 작동 원리

2.1 SSH 프로토콜의 구조

SSH는 데이터를 안전하게 전송하기 위해 세 가지 계층으로 구성된 프로토콜이다. 이 계층은 각각 특정한 역할을 담당하며, 안정적이고 안전한 연결을 제공한다.

  1. 전송 계층(Transport Layer)

    • 데이터 암호화와 인증을 처리
    • 클라이언트와 서버 간 보안 채널을 생성하고 데이터의 무결성과 기밀성을 유지
    • 주로 AES, RSA, SHA 등 현대적인 암호화 알고리즘을 사용
  2. 인증 계층(Authentication Layer)

    • 클라이언트가 서버에 접근하기 위해 사용자 인증을 담당
    • 비밀번호 기반 인증, 공개 키 기반 인증, Kerberos 등을 지원
  3. 연결 계층(Connection Layer)

    • 명령 실행, 포트 포워딩, 파일 전송 등의 세션 작업을 관리
    • 다중 채널을 하나의 SSH 연결로 관리하며, 효율성을 높임

2.2 SSH 키(Key) 기반 인증

SSH 키 기반 인증은 비밀번호보다 강력하고 안전한 인증 방식이다. 이 방식은 비대칭 키 암호화를 사용하며, 클라이언트와 서버는 각각 공개 키(public key)와 개인 키(private key)를 통해 통신한다.

  • 공개 키: 서버에 저장되며, 클라이언트가 이를 사용해 인증 요청을 보낸다.
  • 개인 키: 클라이언트가 보유하며, 외부에 절대 노출되어서는 안 된다.

키 생성 예시

  1. SSH 키 생성

클라이언트에서 공개 키와 개인 키 쌍을 생성. 아래의 예시에서는 RSA 알고리즘을 사용하여 4096비트 길이의 키를 생성!

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  1. 공개 키를 서버에 복사

생성된 공개 키를 원격 서버에 업로드한다. 여기서 공개 키는 서버의 ~/.ssh/authorized_keys 파일에 저장!

ssh-copy-id user@remote_server
  1. SSH 키 기반 접속

이제 개인 키를 사용해 비밀번호 없이 서버에 접속할 수 있다.

ssh user@remote_server

2.3 암호화와 터널링의 원리

SSH는 통신 데이터를 암호화하여 네트워크를 통한 도청 및 데이터 변조를 방지한다. 이 과정은 비대칭 암호화와 대칭 암호화를 결합하여 이루어진다.

  1. 세션 키 생성
    클라이언트와 서버는 초기 연결 시 Diffie-Hellman 키 교환 알고리즘을 사용해 세션 키를 생성한다. 세션 키는 이후 데이터 암호화에 사용되며, 클라이언트와 서버만 이 키를 알고 있다.
  2. 데이터 암호화
    세션 키를 사용해 데이터를 암호화한다. 주로 AES, ChaCha20 같은 대칭 키 암호화 알고리즘이 사용된다.
  3. SSH 터널링
    SSH 터널링은 안전한 통신 채널을 생성하여 데이터를 전송한다. 이를 통해 방화벽을 우회하거나, 비보안 프로토콜(HTTP, FTP 등)을 안전하게 사용할 수 있다.

포트 포워딩 예시

ssh -L 8080:localhost:80 user@remote_server

위의 명령은 로컬의 8080 포트를 원격 서버의 MySQL 포트(3306)와 연결하여, 로컬에서 MySQL 클라이언트를 안전하게 실행할 수 있도록 한다.

3. SSH의 활용 사례

3.1 원격 서버 관리

SSH는 원격 서버 관리에서 가장 널리 사용되는 도구다. 이를 통해 사용자는 원격 서버에 접속하여 시스템을 제어하고, 명령어를 실행하거나 파일을 수정할 수 있다. SSH는 클라우드 서버(AWS, Azure 등)와 리눅스 기반 서버 관리에서 필수적이다.

원격 서버 접속 기본

ssh user@remote_server

위 명령어는 user 계정으로 remote_server에 접속한다. 접속 후 사용자는 로컬 환경에서 서버 명령어를 실행하듯 작업할 수 있다.

SSH로 소프트웨어 설치

원격 서버에 접속하여 패키지를 설치하거나 업데이트하는 작업도 가능하다. 아래의 명령어는 원격 서버에서 Nginx 웹 서버를 설치한다.

sudo apt update
sudo apt install nginx

3.2 파일 전송(SCP, SFTP)

SSH를 통해 파일을 전송할 수 있는 두 가지 주요 방법은 SCP(Secure Copy Protocol)와 SFTP(Secure File Transfer Protocol)이다.

SCP(Secure Copy Protocol)

SCP는 단순히 파일을 복사하는 데 사용된다. 로컬에서 원격 서버로 파일을 업로드하거나, 원격 서버에서 로컬로 파일을 다운로드할 수 있다.

파일 업로드 예시 (SCP)

이 명령어는 local_file.txt를 원격 서버의 /path/to/destination 디렉토리에 업로드한다.

scp local_file.txt user@remote_server:/path/to/destination
파일 다운로드 예시 (SCP)
scp user@remote_server:/path/to/remote_file.txt local_directory/

SFTP(Secure File Transfer Protocol)

SFTP는 SSH를 기반으로 작동하며, 파일 탐색과 디렉토리 관리 기능을 제공한다.

SFTP 접속
sftp user@remote_server

접속 후, ls, get, put 등의 명령어를 사용해 파일을 관리할 수 있다.

SFTP 명령어 예시
  • ls: 원격 디렉토리 목록 보기.
  • get file.txt: 원격 파일을 로컬로 다운로드.
  • put file.txt: 로컬 파일을 원격 서버로 업로드.
사용 사례
  • 데이터베이스 백업 파일을 로컬로 다운로드.
  • 웹 서버에 새로운 애플리케이션 코드 업로드.

3.3 포트 포워딩과 네트워크 터널링

SSH 포트 포워딩은 네트워크 트래픽을 안전하게 전달하기 위한 기술로, 방화벽을 우회하거나 암호화된 터널을 통해 데이터를 전송할 수 있다. 이 기능은 로컬 포트 포워딩, 원격 포트 포워딩, 다이내믹 포트 포워딩의 세 가지 방식으로 제공된다.

  1. 로컬 포트 포워딩(Local Port Forwarding)

로컬 시스템에서 특정 포트를 원격 서버의 특정 포트로 연결하는 방식이다. 예를 들어, 로컬 컴퓨터에서 데이터베이스에 접근할 수 없는 상황에서도 SSH 터널을 사용해 안전하게 연결할 수 있다.

ssh -L 8080:remote_server:3306 user@remote_server
  1. 원격 포트 포워딩(Remote Port Forwarding)

원격 서버의 포트를 로컬 시스템의 특정 포트로 연결하는 방식이다. 외부 사용자들이 로컬 시스템의 리소스에 접근할 때 유용하다. 아래의 명령은 원격 서버의 9090 포트를 로컬 호스트의 80번 포트와 연결한다.

ssh -R 9090:localhost:80 user@remote_server
  1. 다이내믹 포트 포워딩(Dynamic Port Forwarding)

SOCKS 프록시를 사용하여 동적으로 포트를 연결하는 방식으로, 여러 목적지와 유연하게 연결할 수 있다. 아래의 명령은 로컬의 8080 포트를 통해 프록시를 생성하며, 이를 통해 여러 원격 리소스에 접근할 수 있다.

ssh -D 8080 user@remote_server

4. SSH 보안 이슈와 대책

4.1 브루트포스 공격과 방어

브루트포스 공격은 무작위로 비밀번호를 시도하여 SSH 서버에 접근하려는 공격 방식이다. 이는 자동화된 도구를 사용해 짧은 시간 내에 수천 개의 비밀번호를 시도할 수 있다. 공격은 일반적으로 잘 알려진 포트(22번)를 대상으로 한다.

방어 방법

  1. 비밀번호 인증 비활성화: SSH 키 인증으로만 접근 허용
  2. 포트 변경: 기본 포트를 비표준 포트(예: 2222)로 변경하여 공격자를 혼란시킴
sudo nano /etc/ssh/sshd_config
...
# Port 2222 로 변경 후, SSH 서비스를 재시작
...
sudo systemctl restart sshd
  1. Fail2Ban 설치: 특정 IP에서 실패한 로그인 시도가 반복될 경우 차단
sudo apt install fail2ban
sudo systemctl enable fail2ban

4.2 SSH 설정 최적화 (비밀번호 인증 비활성화 등)

SSH 설정 최적화는 서버의 보안을 강화하는 데 필수적이다. 기본 설정을 사용하는 것보다 사용자 인증 방식을 엄격히 설정하고, 불필요한 기능을 비활성화하는 것이 중요하다.

설정 파일 주요 변경사항

  1. 루트 계정 로그인 비활성화
PermitRootLogin no
  1. 비밀번호 인증 비활성화
PasswordAuthentication no
  1. 로그 수준 강화 - 로그를 남겨 의심스러운 활동을 감지 가능
LogLevel VERBOSE

4.3 Fail2Ban을 이용한 SSH 보안 강화

Fail2Ban은 SSH 로그인 실패 시도를 기반으로 IP를 차단하는 도구이다. 설정 파일인 jail.local을 수정하여 SSH 보안을 강화할 수 있다.

Fail2Ban 설정

sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5

이후 재시작

sudo systemctl restart fail2ban

5. SSH와 관련된 최신 기술

5.1 OpenSSH와 그 기능

OpenSSH는 가장 널리 사용되는 SSH 구현체로, SSH 클라이언트 및 서버 기능을 제공한다. OpenSSH는 기본적으로 암호화 프로토콜, 공개 키 인증, 포트 포워딩, SFTP 등을 지원한다. 최신 OpenSSH는 다음과 같은 고급 기능을 포함한다.

  • U2F 및 FIDO2 지원: 하드웨어 보안 키를 사용하여 다단계 인증 구현
  • Connection Multiplexing: 여러 SSH 연결을 단일 TCP 연결로 통합하여 성능 향상

OpenSSH 설치 및 사용

sudo apt update
sudo apt install openssh-server

5.2 SSH 대체 기술 (Mosh 등)

Mosh(Mobile Shell)는 SSH의 대안으로, 모바일 환경이나 불안정한 네트워크에서 안정적인 연결을 제공한다. Mosh는 UDP를 사용하여 패킷 손실이나 네트워크 변경에도 연결을 유지한다.

  • 특징: 연결이 끊어지더라도, 네트워크가 복구되면 세션이 다시 활성화됨

설치 및 사용

sudo apt install mosh
mosh user@remote_server

5.3 클라우드 환경에서의 SSH 활용

클라우드 환경에서는 가상 머신(VM)에 안전하게 접근하기 위해 SSH가 필수적으로 사용된다. AWS, Azure, Google Cloud 등 대부분의 클라우드 플랫폼은 SSH 키 기반 인증을 기본 보안 설정으로 제공한다.

+) 클라우드 환경에서 SSH를 사용할 때는 퍼미션 제한, 로그 모니터링, IP 화이트리스트를 설정하여 보안을 강화하는 것이 중요!

AWS EC2에 SSH 연결하는 예시

  1. EC2 인스턴스 생성 시, 키 페어(.pem 파일)를 다운로드
  2. SSH를 사용해 EC2 인스턴스에 접속
ssh -i "my-key.pem" ec2-user@<EC2_PUBLIC_IP>
profile
안드로이드는 리눅스의 꿈을 꾸는가

0개의 댓글