SSH(Secure Shell)는 네트워크를 통해 다른 컴퓨터에 안전하게 접속해 명령을 실행하거나 파일을 전송할 수 있게 해주는 암호화 프로토콜이다. 텔넷(Telnet)과 rsh(remote shell)의 보안 한계를 보완하기 위해 등장했으며, 오늘날에는 OpenSSH가 사실상의 표준 구현체로 널리 사용된다. Ubuntu에서 SSH 서버를 설치하고 설정하면 로컬 네트워크는 물론 인터넷을 통해서도 서버를 원격으로 관리할 수 있다. 이 글에서는 OpenSSH 서버 설치부터 기본 설정과 보안 강화까지의 과정을 단계별로 설명한다.

SSH 프로토콜 개요

SSH(Secure Shell)란?

SSH는 암호화된 통신 채널을 통해 원격 시스템에 안전하게 접속하는 프로토콜로, 22번 포트를 기본으로 사용하며 대칭키 암호화, 비대칭키 암호화, 해시 함수를 조합하여 기밀성, 무결성, 인증을 보장한다.

SSH는 초기 SSH-1 프로토콜에서 발전하여 현재 SSH-2가 표준으로 사용되며, SSH-2는 보안 취약점이 개선되고 SFTP(SSH File Transfer Protocol)를 지원하여 파일 전송 기능이 강화되었다. SSH 연결은 클라이언트와 서버 간의 키 교환으로 시작되어 세션 키를 생성하고, 이후 모든 통신은 이 세션 키로 암호화되어 전송된다.

SSH vs 기존 원격 접속 프로토콜

프로토콜암호화포트보안 수준현재 상태
Telnet없음 (평문 전송)23매우 낮음사용 비권장
rsh/rlogin없음513/514매우 낮음사용 비권장
SSHAES, ChaCha20 등22높음표준
MoshAES-128-OCBUDP 60000+높음SSH 보완용

SSH 인증 방식

SSH는 여러 가지 인증 방식을 지원하며, 보안 수준과 편의성에 따라 선택할 수 있다.

인증 방식설명보안 수준권장 여부
비밀번호 인증사용자 계정 비밀번호로 인증중간내부망 한정
공개키 인증RSA, Ed25519 등 키 쌍 사용높음권장
인증서 기반CA 서명 인증서 사용매우 높음대규모 환경
GSSAPI/Kerberos중앙 집중 인증높음엔터프라이즈

사전 준비 사항

SSH 서버를 설치하기 전에 시스템 상태를 확인하고 필요한 정보를 미리 파악해 두는 것이 좋다. 이 과정은 Ubuntu 데스크톱과 서버 버전에서 동일하게 진행할 수 있다.

필요 정보

항목설명확인 방법
서버 IP 주소접속할 서버의 네트워크 주소ip a 또는 hostname -I
사용자 계정SSH 접속에 사용할 계정whoami
네트워크 상태인터넷 또는 로컬 네트워크 연결ping 8.8.8.8
방화벽 상태UFW 활성화 여부sudo ufw status

SSH 서버 설치

1단계: 시스템 업데이트 및 OpenSSH 설치

시스템 패키지 목록을 업데이트하고 OpenSSH 서버를 설치하며, 설치가 완료되면 SSH 서비스가 자동으로 시작된다.

# 패키지 목록 업데이트
sudo apt update

# OpenSSH 서버 설치
sudo apt install openssh-server -y

2단계: SSH 서비스 상태 확인

설치 후 SSH 서비스가 정상적으로 실행 중인지 확인하고, 부팅 시 자동 시작되도록 설정한다.

# 서비스 상태 확인
sudo systemctl status ssh

# 서비스가 실행 중이 아니면 시작
sudo systemctl start ssh

# 부팅 시 자동 시작 설정
sudo systemctl enable ssh

서비스 상태 출력에서 Active: active (running)이 표시되면 SSH 서버가 정상적으로 실행 중인 것이다.

SSH 서버 설정

sshd_config 파일

/etc/ssh/sshd_config는 SSH 데몬(sshd)의 설정 파일로, 포트 번호, 인증 방식, 접속 제한 등 SSH 서버의 모든 동작을 제어한다. 설정 변경 후에는 SSH 서비스를 재시작해야 적용된다.

SSH 설정 파일을 수정하여 보안을 강화하고 필요에 맞게 커스터마이징할 수 있으며, 설정 파일 수정 전에 백업을 권장한다.

# 설정 파일 백업
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

# 설정 파일 편집
sudo nano /etc/ssh/sshd_config

주요 설정 항목

설정 항목기본값권장값설명
Port22비표준 포트SSH 접속 포트
PermitRootLoginprohibit-passwordno루트 로그인 허용 여부
PasswordAuthenticationyesno (키 인증 시)비밀번호 인증 허용
PubkeyAuthenticationyesyes공개키 인증 허용
MaxAuthTries63최대 인증 시도 횟수
ClientAliveInterval0300클라이언트 활성 확인 간격(초)

설정 예시

# 포트 변경 (기본 22번 대신 사용)
Port 2222

# 루트 로그인 비활성화
PermitRootLogin no

# 비밀번호 인증 비활성화 (공개키 인증 사용 시)
PasswordAuthentication no

# 공개키 인증 활성화
PubkeyAuthentication yes

# 빈 비밀번호 허용 안 함
PermitEmptyPasswords no

# 최대 인증 시도 횟수
MaxAuthTries 3

# 세션 타임아웃 설정
ClientAliveInterval 300
ClientAliveCountMax 2

설정 변경 후 SSH 서비스를 재시작하여 적용한다.

# 설정 문법 검사
sudo sshd -t

# SSH 서비스 재시작
sudo systemctl restart ssh

방화벽 설정

Ubuntu의 기본 방화벽인 UFW(Uncomplicated Firewall)를 사용하는 경우 SSH 접속을 허용해야 하며, 방화벽이 활성화되어 있지 않으면 이 단계를 건너뛸 수 있다.

# 방화벽 상태 확인
sudo ufw status

# SSH 허용 (기본 포트 22)
sudo ufw allow ssh

# 비표준 포트 사용 시
sudo ufw allow 2222/tcp

# 방화벽 활성화 (비활성화 상태인 경우)
sudo ufw enable

특정 IP에서만 SSH 허용

보안을 더욱 강화하려면 특정 IP 주소나 네트워크 대역에서만 SSH 접속을 허용할 수 있다.

# 특정 IP에서만 SSH 허용
sudo ufw allow from 192.168.1.100 to any port 22

# 특정 서브넷에서만 SSH 허용
sudo ufw allow from 192.168.1.0/24 to any port 22

공개키 인증 설정

공개키 인증이란?

공개키 인증은 비대칭 암호화를 사용하는 인증 방식으로, 개인키(private key)는 클라이언트에 보관하고 공개키(public key)를 서버에 등록하여 비밀번호 없이 안전하게 인증하며, 비밀번호보다 훨씬 강력한 보안을 제공한다.

클라이언트에서 키 쌍 생성

클라이언트 컴퓨터에서 SSH 키 쌍을 생성하며, 현재는 Ed25519를 가장 권장한다.

# Ed25519 키 생성 (권장)
ssh-keygen -t ed25519 -C "[email protected]"

# RSA 키 생성 (호환성 필요 시)
ssh-keygen -t rsa -b 4096 -C "[email protected]"

키 알고리즘 비교

알고리즘키 길이보안 수준성능권장 여부
Ed25519256비트매우 높음매우 빠름권장
RSA4096비트높음보통호환성 필요 시
ECDSA256/384/521비트높음빠름가능
DSA1024비트낮음보통사용 비권장

서버에 공개키 등록

생성된 공개키를 서버에 등록하면 비밀번호 없이 SSH 접속이 가능해진다.

# 자동으로 공개키 복사 (권장)
ssh-copy-id username@server_ip

# 수동으로 공개키 복사
cat ~/.ssh/id_ed25519.pub | ssh username@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

공개키 등록 후 비밀번호 인증을 비활성화하면 보안이 크게 강화된다.

SSH 접속

기본 접속

클라이언트에서 SSH 명령으로 서버에 접속하며, 처음 접속 시 서버의 호스트 키 지문(fingerprint)을 확인하는 메시지가 표시된다.

# 기본 접속
ssh username@server_ip

# 포트 지정 접속
ssh -p 2222 username@server_ip

# 특정 개인키 사용
ssh -i ~/.ssh/id_ed25519 username@server_ip

SSH 설정 파일로 접속 간소화

~/.ssh/config 파일을 생성하여 자주 접속하는 서버의 설정을 저장하면 접속이 간편해진다.

Host myserver
    HostName 192.168.1.100
    User ubuntu
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

설정 후 ssh myserver 명령으로 간단히 접속할 수 있다.

보안 강화

주요 보안 조치

보안 조치효과구현 난이도
비표준 포트 사용자동화된 스캔 회피쉬움
공개키 인증비밀번호 탈취 방지보통
루트 로그인 비활성화권한 상승 공격 방지쉬움
fail2ban 설치무차별 대입 공격 차단보통
2단계 인증(2FA)추가 인증 계층어려움

fail2ban 설치 및 설정

fail2ban은 로그 파일을 모니터링하여 반복적인 인증 실패를 감지하고 해당 IP를 자동으로 차단하는 도구로, 무차별 대입 공격(brute force attack)에 효과적이다.

# fail2ban 설치
sudo apt install fail2ban -y

# 서비스 시작 및 활성화
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

문제 해결

일반적인 문제와 해결 방법

문제원인해결 방법
Connection refusedSSH 서비스 미실행 또는 방화벽systemctl status ssh, ufw status 확인
Permission denied인증 실패 또는 키 권한 문제키 권한 확인: chmod 600 ~/.ssh/id_*
Host key verification failed서버 키 변경~/.ssh/known_hosts에서 해당 항목 삭제
Connection timed out네트워크 문제 또는 잘못된 IP네트워크 연결 및 IP 주소 확인

SSH 키 파일의 권한이 올바르지 않으면 접속이 거부되므로, 개인키는 소유자만 읽을 수 있도록 설정해야 한다.

# 개인키 권한 설정
chmod 600 ~/.ssh/id_ed25519

# .ssh 디렉토리 권한 설정
chmod 700 ~/.ssh

결론

지금까지 Ubuntu에서 SSH 서버를 설치하고 설정하는 과정을 살펴보았다. SSH는 서버 관리, 원격 개발, 파일 전송 등 다양한 용도로 활용되며, 공개키 인증과 적절한 보안 설정을 적용하면 안전한 원격 접속 환경을 구축할 수 있다. 특히 인터넷에 노출된 서버라면 비표준 포트 사용, 공개키 인증 전용, fail2ban 설치 같은 보안 조치를 함께 적용해 무차별 대입 공격 등의 위협에 대비해야 한다.