SSH

"The SSH protocol (also referred to as Secure Shell) is a method for secure remote login and other secure network services over an insecure network."

— IETF RFC 4251 - SSH 프로토콜 아키텍처 개요

전 세계 거의 모든 리눅스 클라우드 인프라가 관리자의 명령을 받아들이기 위해 22번 포트를 열어둔 채 숨죽여 대기하고 있는 소통의 정수이자, 해커들이 무작위 무차별 대입 공격(Brute Force)으로 문을 두드려 대는 주된 표적. 매번 포트 번호를 바꾸고 패스워드 로그인을 막는 걸 깜빡하면, 하루만 지나도 중국이나 동유럽 IP에서 수만 번의 무단 로그인 시도 로그가 쌓여 있는 호러물을 보게 된다

1. 개요

SSH(Secure Shell)는 암호화되지 않은 네트워크 상에서 컴퓨터 간에 안전하게 통신하기 위해 사용하는 네트워크 프로토콜이자 프로그램이다. 주로 멀리 떨어진 리눅스 서버에 원격 접속하여 명령어를 실행하거나, 파일을 안전하게 복사(scp, sftp)하는 용도로 전 세계 개발자들과 시스템 관리자들이 인공호흡기처럼 사용하는 필수 도구다. 텔넷(Telnet)이나 rlogin 같은 과거의 평문 통신 도구들이 패킷을 그대로 노출시켜 비밀번호 유출이라는 참사를 일으키던 전산 석기시대를 종식시키고, 네트워크 전 구간을 강력한 암호화 채널로 차단하는 구세주로 탄생했다.(...)

2. 패스워드는 버려라: 공개키-개인키 쌍방 인증의 예술

2.1. 비밀번호 없이 로그인하는 안전한 비법

SSH의 진정한 위력은 키 기반 인증(Key-based Authentication)에서 나온다. 매번 길고 외우기 힘든 패스외드를 치거나, 패스워드가 유출될까 봐 전전긍긍할 필요가 없다. 대신 내 컴퓨터에서 공개키(Public Key)개인키(Private Key) 한 쌍을 제너레이트한 뒤 작동시킨다.

  1. 공개키의 서버 등록: 자물쇠에 해당하는 공개키(id_rsa.pub)는 원격 서버의 특정 대역(~/.ssh/authorized_keys)에 고이 보관해 둔다.
  2. 개인키의 철저한 은폐: 열쇠에 해당하는 개인키(id_rsa)는 내 컴퓨터에 금이야 옥이야 숨겨둔다.
  3. 인증 마법: SSH 접속을 시도하면, 서버는 공개키로 암호화한 수수께끼(Challenge)를 내 컴퓨터로 보낸다. 내 컴퓨터가 오직 개인키로만 이 수수께끼를 해독해 정답을 제출하면, 비밀번호 한 글자 타이핑하지 않고도 통과된다.(...)

이 구조는 이론적으로 패스워드 무차별 대입(Brute Force) 공격을 완벽히 차단하며, GitHub 같은 원격 소스 코드 저장소에 git push를 보낼 때 나를 안전하게 인증하는 핵심 기제로도 사용된다.1

3. 22번 포트의 고독한 수호자: OpenSSH와 보안 가이드

3.1. 해커들의 영원한 놀이터를 사수하라

기본적으로 SSH는 22번 포트를 사용한다. 이 22번 포트는 인터넷에 연결된 모든 서버들의 공공재(?)와 같아서, 서버를 켜자마자 전 세계 해킹 봇들이 대포동 미사일 쏘듯 무차별 로그인을 시도한다. 이를 방어하기 위해 실무자들은 눈물겨운 보안 설정을 적용한다.

  • 포트 변경: 기본 22번 포트를 22229022 같은 엉뚱한 임의 포트로 숨겨두어 해킹 봇들의 단순 자동 스캔을 피한다.
  • 패스워드 로그인 원천 금지: PasswordAuthentication no 설정을 통해 오직 물리적인 SSH 키가 있는 사람만 통과하도록 자물쇠를 걸어 잠근다.2
  • 루트 로그인 금지: 서버의 모든 권한을 가진 root 계정으로의 직접 SSH 진입을 차단(PermitRootLogin no)하여 해커가 문지기 계정부터 뚫어야 하도록 설계한다.

3.2. 인류 클라우드의 숨은 거인: OpenSSH

우리가 리눅스 쉘에서 무심코 치는 ssh 명령어는 대부분 OpenBSD 재단이 관리하는 OpenSSH 프로젝트의 결과물이다. 100% 오픈소스로 깨끗하게 관리되며, 상용화를 시도하던 원조 SSH 라이선스 장사를 비웃듯 전 세계 리눅스 배포판의 기본 SSH 데몬으로 자리를 굳혔다. 이들이 없었다면 우리는 매년 서버 대수당 수십 달러의 원격 라이선스 비용을 바쳐가며 퍼블릭 클라우드를 운영하고 있었을지도 모른다.

4. 관련 밈 및 드립

4.1. Permission 0600 (chmod 600 id_rsa)

새로운 리눅스 인스턴스를 받고 SSH 키를 사용하려 할 때, 초보 개발자들이 100% 겪게 되는 입문 의식.

개인키 파일(id_rsa)을 처음 생성하거나 복사해서 가져오면, OS의 파일 권한이 대개 느슨하게 잡혀 있다. 이 상태에서 신나게 ssh를 치면, SSH 클라이언트는 "WARNING: UNPROTECTED PRIVATE KEY FILE!"이라며 시뻘건 경고문을 뿜고 장렬히 뻗어버린다. 개인키 파일은 남이 절대로 읽지 못하도록 나 자신에게만 읽기 권한을 주는 600 권한으로 강제해야 하기 때문이다. 개발자들에게 chmod 600 명령어는 마치 로그인하기 전에 신발을 벗고 들어가는 절차와 같은 경건한 의식으로 통한다.(...)

5. 여담

  • 타투 이뢰넨의 탄생 비화: 1995년 핀란드 헬싱키 공과대학의 연구원이었던 타투 이뢰넨은, 대학 네트워크에서 스니핑 공격으로 수천 개의 사용자 비밀번호가 유출되자 빡쳐서 암호화 원격 접속 프로토콜을 독자 개발하여 릴리스했다. 이것이 SSH의 시초다.
  • SSH 터널링의 마법: 단순히 원격 쉘 제어를 넘어, 내 로컬의 포트와 원격 서버의 포트를 SSH 커넥션 내부로 꽁꽁 숨겨 통과시키는 SSH 터널링(Port Forwarding) 기술이 존재한다. 방화벽에 막힌 사설 데이터베이스나 사내 인트라넷을 안전하게 우회 접속할 때 최고 존엄으로 대접받는다.
  • 에이전트 포워딩(Agent Forwarding): 내 로컬에 있는 SSH 키를 원격 서버에 직접 복사하지 않고도, 원격 서버가 다른 제3의 서버(예: GitHub)와 통신할 때 내 로컬의 키를 대신 활용하게 해주는 ssh -A 옵션이 존재한다. 배포용 서버 안에서 안전하게 깃을 당겨올 때의 최고 꿀팁이다.(...)

6. 관련 문서

각주

  1. GitHub에 코드를 push할 때 매번 아이디와 비밀번호를 치기 번거롭고 보안에도 취약하므로, 많은 숙련된 개발자들은 SSH 키를 등록하여 엔터 한 번으로 깔끔하게 push 작업을 완료한다.

  2. 이 설정을 켜기 전에 원격 서버에 내 공개키를 똑바로 심었는지 백만 번 확인해야 한다. 확인 안 하고 재부팅하는 순간, 나조차도 내 서버에 다시는 들어갈 수 없는 영구 잠금 상태가 되어 서버를 통째로 포맷해야 하는 피눈물 나는 경험을 하게 된다.