Secure SHell
SSH는 네트워크 상의 다른 컴퓨터에 로그인하여 명령을 실행하고 정보를 보고 받을 수 있도록 해주는 통신 프로토콜이다. 컴공 학부생이라면 2학년만 되어도 한번쯤은 접해볼 만한 주제이나, 보안 공부를 하는 사람으로서 한번쯤은 직접 조사해보고 싶어 선택했다.
SSH(Secure Shell)는 네트워크를 통해 원격 시스템에 안전하게 접근할 수 있는 프로토콜이다. 일반적으로 원격 서버 관리, 파일 전송, 네트워크 터널링 등 다양한 작업에 사용된다. SSH는 데이터를 암호화하여 통신 중간에서 발생할 수 있는 스니핑(sniffing)이나 중간자 공격(MITM, Man-In-The-Middle Attack)을 방지한다.
SSH는 기본적으로 TCP 포트 22를 사용하며, 클라이언트-서버 모델로 작동한다. 사용자는 로컬 시스템에서 SSH 클라이언트를 실행해 원격 서버로 연결하고, 이를 통해 명령어를 실행하거나 파일을 조작할 수 있다.
SSH는 1995년 핀란드의 타투 이홀라(Tatu Ylönen)가 개발했다. 당시 네트워크 보안 위협이 증가하면서 기존의 원격 접속 프로토콜인 Telnet, Rlogin, FTP 등은 보안상의 문제로 대체가 필요했다. SSH는 이러한 문제를 해결하며 빠르게 표준화되었고, 현재는 OpenSSH와 같은 오픈소스 구현체가 널리 사용되고 있다.
SSH는 보안 통신을 제공하는 반면, Telnet과 FTP는 데이터를 평문으로 전송하여 네트워크에서 쉽게 가로챌 수 있다.
특징 | SSH | Telnet | FTP |
---|---|---|---|
보안성 | 데이터 암호화 | 평문 전송 | 평문 전송 |
사용 목적 | 원격 시스템 관리, 파일 전송 등 | 원격 시스템 관리 | 파일 전송 |
포트 | 22 | 23 | 21 |
SSH는 데이터를 안전하게 전송하기 위해 세 가지 계층으로 구성된 프로토콜이다. 이 계층은 각각 특정한 역할을 담당하며, 안정적이고 안전한 연결을 제공한다.
전송 계층(Transport Layer)
인증 계층(Authentication Layer)
연결 계층(Connection Layer)
SSH 키 기반 인증은 비밀번호보다 강력하고 안전한 인증 방식이다. 이 방식은 비대칭 키 암호화를 사용하며, 클라이언트와 서버는 각각 공개 키(public key)와 개인 키(private key)를 통해 통신한다.
클라이언트에서 공개 키와 개인 키 쌍을 생성. 아래의 예시에서는 RSA 알고리즘을 사용하여 4096비트 길이의 키를 생성!
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
생성된 공개 키를 원격 서버에 업로드한다. 여기서 공개 키는 서버의 ~/.ssh/authorized_keys
파일에 저장!
ssh-copy-id user@remote_server
이제 개인 키를 사용해 비밀번호 없이 서버에 접속할 수 있다.
ssh user@remote_server
SSH는 통신 데이터를 암호화하여 네트워크를 통한 도청 및 데이터 변조를 방지한다. 이 과정은 비대칭 암호화와 대칭 암호화를 결합하여 이루어진다.
ssh -L 8080:localhost:80 user@remote_server
위의 명령은 로컬의 8080 포트를 원격 서버의 MySQL 포트(3306)와 연결하여, 로컬에서 MySQL 클라이언트를 안전하게 실행할 수 있도록 한다.
SSH는 원격 서버 관리에서 가장 널리 사용되는 도구다. 이를 통해 사용자는 원격 서버에 접속하여 시스템을 제어하고, 명령어를 실행하거나 파일을 수정할 수 있다. SSH는 클라우드 서버(AWS, Azure 등)와 리눅스 기반 서버 관리에서 필수적이다.
ssh user@remote_server
위 명령어는 user
계정으로 remote_server
에 접속한다. 접속 후 사용자는 로컬 환경에서 서버 명령어를 실행하듯 작업할 수 있다.
원격 서버에 접속하여 패키지를 설치하거나 업데이트하는 작업도 가능하다. 아래의 명령어는 원격 서버에서 Nginx 웹 서버를 설치한다.
sudo apt update
sudo apt install nginx
SSH를 통해 파일을 전송할 수 있는 두 가지 주요 방법은 SCP(Secure Copy Protocol)와 SFTP(Secure File Transfer Protocol)이다.
SCP는 단순히 파일을 복사하는 데 사용된다. 로컬에서 원격 서버로 파일을 업로드하거나, 원격 서버에서 로컬로 파일을 다운로드할 수 있다.
이 명령어는 local_file.txt
를 원격 서버의 /path/to/destination
디렉토리에 업로드한다.
scp local_file.txt user@remote_server:/path/to/destination
scp user@remote_server:/path/to/remote_file.txt local_directory/
SFTP는 SSH를 기반으로 작동하며, 파일 탐색과 디렉토리 관리 기능을 제공한다.
sftp user@remote_server
접속 후, ls
, get
, put
등의 명령어를 사용해 파일을 관리할 수 있다.
ls
: 원격 디렉토리 목록 보기.get file.txt
: 원격 파일을 로컬로 다운로드.put file.txt
: 로컬 파일을 원격 서버로 업로드.SSH 포트 포워딩은 네트워크 트래픽을 안전하게 전달하기 위한 기술로, 방화벽을 우회하거나 암호화된 터널을 통해 데이터를 전송할 수 있다. 이 기능은 로컬 포트 포워딩, 원격 포트 포워딩, 다이내믹 포트 포워딩의 세 가지 방식으로 제공된다.
로컬 시스템에서 특정 포트를 원격 서버의 특정 포트로 연결하는 방식이다. 예를 들어, 로컬 컴퓨터에서 데이터베이스에 접근할 수 없는 상황에서도 SSH 터널을 사용해 안전하게 연결할 수 있다.
ssh -L 8080:remote_server:3306 user@remote_server
원격 서버의 포트를 로컬 시스템의 특정 포트로 연결하는 방식이다. 외부 사용자들이 로컬 시스템의 리소스에 접근할 때 유용하다. 아래의 명령은 원격 서버의 9090 포트를 로컬 호스트의 80번 포트와 연결한다.
ssh -R 9090:localhost:80 user@remote_server
SOCKS 프록시를 사용하여 동적으로 포트를 연결하는 방식으로, 여러 목적지와 유연하게 연결할 수 있다. 아래의 명령은 로컬의 8080 포트를 통해 프록시를 생성하며, 이를 통해 여러 원격 리소스에 접근할 수 있다.
ssh -D 8080 user@remote_server
브루트포스 공격은 무작위로 비밀번호를 시도하여 SSH 서버에 접근하려는 공격 방식이다. 이는 자동화된 도구를 사용해 짧은 시간 내에 수천 개의 비밀번호를 시도할 수 있다. 공격은 일반적으로 잘 알려진 포트(22번)를 대상으로 한다.
sudo nano /etc/ssh/sshd_config
...
# Port 2222 로 변경 후, SSH 서비스를 재시작
...
sudo systemctl restart sshd
sudo apt install fail2ban
sudo systemctl enable fail2ban
SSH 설정 최적화는 서버의 보안을 강화하는 데 필수적이다. 기본 설정을 사용하는 것보다 사용자 인증 방식을 엄격히 설정하고, 불필요한 기능을 비활성화하는 것이 중요하다.
PermitRootLogin no
PasswordAuthentication no
LogLevel VERBOSE
Fail2Ban은 SSH 로그인 실패 시도를 기반으로 IP를 차단하는 도구이다. 설정 파일인 jail.local
을 수정하여 SSH 보안을 강화할 수 있다.
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
이후 재시작
sudo systemctl restart fail2ban
OpenSSH는 가장 널리 사용되는 SSH 구현체로, SSH 클라이언트 및 서버 기능을 제공한다. OpenSSH는 기본적으로 암호화 프로토콜, 공개 키 인증, 포트 포워딩, SFTP 등을 지원한다. 최신 OpenSSH는 다음과 같은 고급 기능을 포함한다.
sudo apt update
sudo apt install openssh-server
Mosh(Mobile Shell)는 SSH의 대안으로, 모바일 환경이나 불안정한 네트워크에서 안정적인 연결을 제공한다. Mosh는 UDP를 사용하여 패킷 손실이나 네트워크 변경에도 연결을 유지한다.
sudo apt install mosh
mosh user@remote_server
클라우드 환경에서는 가상 머신(VM)에 안전하게 접근하기 위해 SSH가 필수적으로 사용된다. AWS, Azure, Google Cloud 등 대부분의 클라우드 플랫폼은 SSH 키 기반 인증을 기본 보안 설정으로 제공한다.
+) 클라우드 환경에서 SSH를 사용할 때는 퍼미션 제한, 로그 모니터링, IP 화이트리스트를 설정하여 보안을 강화하는 것이 중요!
ssh -i "my-key.pem" ec2-user@<EC2_PUBLIC_IP>