목차

리눅스 SSH 프로토콜 가이드

이 문서는 리눅스 시스템에서 Secure Shell (SSH) 프로토콜을 사용하는 방법에 대한 포괄적인 가이드입니다. SSH는 원격 서버에 안전하게 접속하고, 파일을 전송하며, 보안 채널을 통해 다양한 네트워크 서비스를 이용할 수 있게 해주는 필수적인 도구입니다. 이 가이드를 통해 SSH의 기본 개념부터 고급 활용법까지 상세하게 이해하고 적용할 수 있을 것입니다.


1. SSH란 무엇인가?

SSH (Secure Shell)는 네트워크를 통해 컴퓨터에 원격으로 접근하고 명령을 실행하며, 파일을 안전하게 전송할 수 있도록 하는 암호화된 네트워크 프로토콜입니다. 기존의 안전하지 않은 프로토콜(예: Telnet, FTP)이 평문으로 데이터를 전송하여 스니핑 및 중간자 공격에 취약했던 것과 달리, SSH는 강력한 암호화 기술을 사용하여 모든 통신을 보호합니다.

1) SSH의 주요 기능

2) SSH 작동 방식

SSH는 클라이언트-서버 모델로 작동합니다. SSH 클라이언트는 SSH 서버에 연결을 요청하고, 서버는 클라이언트의 인증을 확인한 후 안전한 통신 채널을 설정합니다. 이 과정에서 대칭키 암호화, 비대칭키 암호화, 해싱 등의 기술이 복합적으로 사용되어 데이터의 기밀성, 무결성, 인증을 보장합니다.


2. SSH 핵심 개념

SSH를 효과적으로 사용하기 위해 이해해야 할 몇 가지 핵심 개념들이 있습니다.

1) 기본 포트

2) 인증 방식

SSH는 크게 두 가지 주요 인증 방식을 제공합니다.

3) SSH 에이전트 (ssh-agent)


3. SSH 기본 사용법

SSH 클라이언트를 사용하여 원격 서버에 접속하는 가장 기본적인 방법과 일반적인 옵션들을 알아봅니다.

1) 원격 서버 접속

기본적인 SSH 접속 명령어 형식은 다음과 같습니다.

ssh ''[사용자명]''@''[호스트명_또는_IP주소]''
ssh [email protected]
  <code>ssh [email protected]</code>
ssh -p 2222 [email protected]

2) 첫 접속 시 호스트 키 확인

원격 서버에 처음 접속할 때, SSH 클라이언트는 서버의 '호스트 키'를 확인합니다. 이는 중간자 공격을 방지하기 위함입니다.

The authenticity of host 'example.com (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:.............................
Are you sure you want to continue connecting (yes/no/[fingerprint])?

3) 자주 사용되는 SSH 옵션

옵션 설명
-p <포트> 지정된 포트로 접속합니다.
-i <개인키 파일> 지정된 개인키 파일을 사용하여 인증합니다.
-X X11 포워딩을 활성화하여 원격 GUI 애플리케이션을 로컬에서 실행할 수 있게 합니다.
-Y -X와 유사하지만, X11 신뢰할 수 있는 포워딩을 활성화합니다.
-v 상세한 디버그 메시지를 출력하여 접속 문제를 진단하는 데 도움을 줍니다.
-A SSH 에이전트 포워딩을 활성화하여, 원격 서버에서 다른 SSH 서버로 접속할 때 로컬 에이전트의 키를 사용할 수 있게 합니다.

4. SSH 키 기반 인증 설정

SSH 키 기반 인증은 비밀번호 인증보다 훨씬 안전하고 편리합니다.

1) SSH 키 쌍 생성

ssh-keygen 명령어를 사용하여 공개키와 개인키 쌍을 생성합니다.

ssh-keygen -t rsa -b 4096

명령을 실행하면 키를 저장할 경로와 비밀번호(Passphrase)를 묻습니다.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.

2) 공개키를 서버에 복사

생성된 공개키를 원격 서버의 ~/.ssh/authorized_keys 파일에 추가해야 합니다. 가장 쉬운 방법은 ssh-copy-id 명령어를 사용하는 것입니다.

ssh-copy-id ''[사용자명]''@''[호스트명_또는_IP주소]''
ssh-copy-id [email protected]

이 명령어는 비밀번호 인증을 사용하여 서버에 접속한 후, 자동으로 공개키를 ~/.ssh/authorized_keys 파일에 추가합니다. ssh-copy-id가 없는 경우, 수동으로 공개키 내용을 복사하여 추가할 수 있습니다.

1.  로컬에서 공개키 내용 확인:
  <code>cat ~/.ssh/id_rsa.pub</code>
2.  원격 서버에 비밀번호로 접속:
  <code>ssh [email protected]</code>
3.  원격 서버에서 ''~/.ssh'' 디렉토리 생성 (없을 경우) 및 권한 설정:
  <code>mkdir -p ~/.ssh</code>
  <code>chmod 700 ~/.ssh</code>
4.  공개키 내용을 ''authorized_keys'' 파일에 추가:
  <code>echo "''[여기에_id_rsa.pub_내용_붙여넣기]''" >> ~/.ssh/authorized_keys</code>
5.  ''authorized_keys'' 파일 권한 설정:
  <code>chmod 600 ~/.ssh/authorized_keys</code>

3) SSH 에이전트 사용

개인키에 비밀번호가 설정되어 있다면, 매번 접속할 때마다 비밀번호를 입력해야 합니다. SSH 에이전트를 사용하면 이 불편함을 해소할 수 있습니다.

1.  SSH 에이전트 시작:
  <code>eval "$(ssh-agent -s)"</code>
2.  개인키를 에이전트에 추가:
  <code>ssh-add ~/.ssh/id_rsa</code>

5. SSH 설정 파일 (''~/.ssh/config'')

~/.ssh/config 파일은 SSH 클라이언트의 동작을 사용자 정의하고, 복잡한 접속 정보를 간소화하는 데 사용됩니다.

1) 설정 파일의 이점

2) 설정 파일 예시

다음은 ~/.ssh/config 파일의 일반적인 구조와 예시입니다.

Host myserver
  Hostname example.com
  User user
  Port 2222
  IdentityFile ~/.ssh/id_rsa_myserver
  ForwardAgent yes

Host *
  ServerAliveInterval 60
  ServerAliveCountMax 3

6. SSH 고급 활용법

SSH는 단순한 원격 접속을 넘어 다양한 고급 기능을 제공합니다.

1) SCP (Secure Copy Protocol)

SCP는 SSH를 통해 파일을 안전하게 복사하는 명령어입니다.

scp /path/to/local/file.txt [email protected]:/path/to/remote/directory/
scp [email protected]:/path/to/remote/file.txt /path/to/local/directory/
scp -r /path/to/local/directory/ [email protected]:/path/to/remote/parent_directory/
scp -P 2222 /path/to/local/file.txt [email protected]:/path/to/remote/directory/

2) SFTP (SSH File Transfer Protocol)

SFTP는 SSH를 통해 파일을 전송하는 대화형 프로토콜입니다. FTP와 유사하지만 보안성이 강화되었습니다.

sftp [email protected]

3) SSH 터널링 (포트 포워딩)

SSH 터널링은 암호화된 SSH 연결을 통해 네트워크 트래픽을 전달하여, 보안되지 않은 서비스를 안전하게 사용할 수 있게 합니다.

ssh -L ''[로컬포트]'':''[원격호스트]'':''[원격포트]'' ''[SSH사용자]''@''[SSH서버]''
ssh -L 8080:db.example.com:3306 [email protected]
      이제 로컬에서 ''localhost:8080''으로 접속하면 ''db.example.com:3306''으로 연결됩니다.
ssh -R ''[원격포트]'':''[로컬호스트]'':''[로컬포트]'' ''[SSH사용자]''@''[SSH서버]''
ssh -R 8080:localhost:80 [email protected]
      이제 원격 서버에서 ''localhost:8080''으로 접속하면 SSH 클라이언트가 실행 중인 로컬 머신의 80번 포트로 연결됩니다.
ssh -D ''[로컬포트]'' ''[SSH사용자]''@''[SSH서버]''
ssh -D 1080 [email protected]
      이제 브라우저의 프록시 설정을 ''SOCKS5, localhost:1080''으로 지정하면 모든 트래픽이 SSH 터널을 통해 전송됩니다.

7. SSH 보안 강화 팁

SSH 서버의 보안을 강화하는 것은 시스템을 외부 위협으로부터 보호하는 데 매우 중요합니다.

1) 기본 SSH 포트 변경

    #Port 22
    Port 2222
    

2) 비밀번호 인증 비활성화

    PasswordAuthentication no
    

3) 루트 로그인 비활성화

    PermitRootLogin no
    

4) SSH 접속 허용 사용자 제한

    AllowUsers user1 user2
    # 또는 AllowGroups sshusers
    

5) Fail2ban 사용

6) SSH 서비스 재시작

sshd_config 파일을 수정한 후에는 반드시 SSH 서비스를 재시작해야 변경 사항이 적용됩니다.

sudo systemctl restart sshd
sudo service ssh restart

결론

SSH는 리눅스 시스템 관리 및 원격 작업에 있어 없어서는 안 될 핵심 프로토콜입니다. 이 가이드에서 다룬 SSH의 기본 개념, 키 기반 인증 설정, 설정 파일 활용, 그리고 고급 기능 및 보안 강화 팁을 통해 사용자는 더욱 안전하고 효율적으로 원격 서버를 관리할 수 있을 것입니다. 강력한 보안 기능과 유연한 활용성을 제공하는 SSH를 숙달함으로써, 여러분의 리눅스 시스템 관리 역량을 한 단계 더 향상시키시길 바랍니다.