리눅스(Linux) 서버를 운영할 때 원격에서 안전하게 접속하기 위해 가장 많이 사용하는 프로토콜이 바로 SSH(Secure Shell)입니다. 일반적으로 처음 서버를 구축하면 아이디와 비밀번호를 입력해 접속하는 방식을 사용합니다. 하지만 비밀번호 기반의 인증 방식은 해커들이 무차별적으로 비밀번호를 대입하는 ‘무차별 대입 공격(Brute Force Attack)’에 매우 취약합니다.
보안을 한 단계 더 끌어올리기 위한 가장 확실한 방법은 바로 ‘SSH 키 기반 인증(Key-based Authentication)’을 도입하는 것입니다. SSH 키 인증은 사람이 기억하는 비밀번호 대신, 복잡한 암호 알고리즘으로 생성된 두 개의 키를 사용하여 인증합니다. 본 가이드에서는 SSH 키의 작동 원리부터 발급, 서버 등록, 그리고 보안을 위한 최종 설정까지 복사해서 바로 쓸 수 있도록 상세히 정리합니다.
1. SSH 키 기반 인증의 원리 이해하기
SSH 키 인증 방식을 이해하기 위해서는 ‘비대칭 암호화’라는 개념을 알아야 합니다. 키를 생성하면 쌍(Pair)을 이루는 두 개의 키가 만들어집니다.
- 공개키 (Public Key): 누구나 볼 수 있어도 안전한 키입니다. 이 키는 원격 리눅스 서버에 업로드하여 저장해 둡니다. 자물쇠에 비유할 수 있습니다.
- 비밀키 (Private Key): 절대로 외부에 노출되어서는 안 되는 개인 키입니다. 내 로컬 컴퓨터(노트북 등)에 안전하게 보관합니다. 자물쇠를 열 수 있는 유일한 열쇠에 비유할 수 있습니다.
내가 서버에 접속을 시도하면, 서버는 가지고 있는 공개키(자물쇠)를 이용해 내 컴퓨터에 인증을 요구하고, 내 컴퓨터는 매칭되는 비밀키(열쇠)로 이를 증명하여 패스워드 입력 없이 안전하게 로그인하게 됩니다. 비밀키가 없으면 그 어떤 누구도 서버에 접속할 수 없으므로 보안성이 비약적으로 향상됩니다.
2. 로컬 컴퓨터에서 SSH 키 쌍 생성하기
가장 먼저 내가 사용하는 PC(로컬 환경)에서 서버에 등록할 키 쌍을 생성해야 합니다. 윈도우 10/11의 명령 프롬프트(CMD), 파워셸(PowerShell), 또는 맥 OS(Mac)의 터미널을 열고 아래 명령어를 입력합니다.
Bash
ssh-keygen -t rsa -b 4096
-t rsa: 암호화 알고리즘의 종류로 가장 대중적이고 안정적인 RSA 방식을 지정합니다.-b 4096: 키의 길이(비트 수)를 설정합니다. 기본값인 2048보다 훨씬 정교하고 강력한 4096비트 보안을 적용합니다.
생성 과정에서의 선택 항목 가이드
명령어를 입력하면 터미널 창에 몇 가지 질문이 나타납니다.
- Enter file in which to save the key: 키를 저장할 경로를 묻습니다. 기본값으로 설정된 경로에 저장하는 것이 가장 편리하므로, 그대로 엔터(Enter)를 누릅니다. 일반적으로 사용자의 홈 디렉터리 내
.ssh폴더에 저장됩니다. - Enter passphrase: 비밀키 자체를 한 번 더 암호화할 비밀번호를 설정할지 묻습니다. 키를 분실했을 때를 대비한 2차 보안 장치입니다. 추가 보안을 원하면 입력하고, 패스워드 없이 자동 로그인을 원한다면 그냥 엔터(Enter)를 두 번 눌러 생략합니다.
키 생성이 완료되면 화면에 사각형의 랜덤 아트 문양이 나타나며, 지정된 폴더에 id_rsa(비밀키)와 id_rsa.pub(공개키) 두 개의 파일이 생성됩니다.
3. 원격 리눅스 서버에 공개키 등록하기
이제 생성된 두 개의 키 중 끝에 .pub가 붙은 공개키(id_rsa.pub) 내용을 원격 서버에 심어주어야 합니다. 서버의 특정 계정 홈 디렉터리에 있는 .ssh/authorized_keys 파일에 이 내용을 추가해야 합니다.
가장 간단한 자동 등록 방법 (맥/리눅스 유저)
로컬 PC가 맥 OS이거나 리눅스 환경이라면 ssh-copy-id 명령어를 통해 단 한 줄로 공개키를 서버에 보관할 수 있습니다. 서버의 IP 주소가 1.2.3.4이고 사용자 계정이 ubuntu라면 다음과 같이 입력합니다.
Bash
ssh-copy-id ubuntu@1.2.3.4
서버의 기존 계정 비밀번호를 한 번 입력해 주면, 자동으로 공개키 내용이 서버로 전송되어 등록됩니다.
수동으로 등록하는 방법 (윈도우 유저 등)
자동 명령어를 쓸 수 없다면 직접 공개키 내용을 복사해서 서버 파일에 붙여넣어야 합니다.
우선 로컬 PC에서 공개키 파일의 내용을 확인합니다. (윈도우 CMD 기준 명령어)
DOS
type %USERPROFILE%\.ssh\id_rsa.pub
화면에 출력되는 ssh-rsa AAAAB3NzaC...로 시작하는 긴 텍스트 문자열을 모두 드래그하여 복사합니다.
그 후, 기존 방식(비밀번호)으로 원격 서버에 접속한 뒤 아래 명령어를 순서대로 실행합니다.
Bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
열린 텍스트 편집기 창에 방금 복사한 공개키 문자열을 그대로 붙여넣고 저장(Ctrl+O, Enter, Ctrl+X)합니다. 마지막으로 보안을 위해 해당 파일의 권한을 소유자만 읽고 쓸 수 있도록 엄격하게 제한합니다.
Bash
chmod 600 ~/.ssh/authorized_keys
4. SSH 키로 원격 서버 접속 테스트하기
모든 등록이 끝났다면 비밀번호 없이 키 인증만으로 접속이 잘 되는지 확인해야 합니다. 로컬 컴퓨터의 터미널을 새로 열고 아래와 같이 접속을 시도합니다.
Bash
ssh ubuntu@1.2.3.4
만약 기본 경로가 아닌 다른 폴더에 키를 저장했거나 특정 키를 지정해야 한다면 -i 옵션을 사용해 비밀키 경로를 직접 입력해 줍니다.
Bash
ssh -i ~/.ssh/id_rsa ubuntu@1.2.3.4
정상적으로 설정되었다면 기존처럼 서버의 비밀번호를 묻지 않고 곧바로 리눅스 프롬프트 창으로 접속되는 것을 확인할 수 있습니다.
5. 보안 완성을 위한 필수 후속 설정 (패스워드 로그인 차단)
SSH 키 접속이 성공한 것을 반드시 확인한 후, 이제 기존의 취약한 비밀번호 로그인 방식을 완전히 폐쇄해야 비로소 해킹 공격으로부터 안전해집니다. 원격 서버의 SSH 설정 파일을 수정합니다.
Bash
sudo nano /etc/ssh/sshd_config
파일 내부에서 아래의 항목들을 찾아 주석(#)을 제거하고 값을 모두 no로 변경해 줍니다. 이렇게 하면 키가 없는 사용자는 비밀번호를 아무리 때려 맞춰도 접속 자체가 불가능해집니다.
Plaintext
PasswordAuthentication no
ChallengeResponseAuthentication no
설정을 저장한 뒤, SSH 서비스를 재시작하여 변경 사항을 적용합니다.
Bash
sudo systemctl restart ssh
최종 경고: 현재 연결되어 있는 서버 터미널 창을 절대로 닫지 마세요! 그 상태에서 로컬 컴퓨터의 새로운 터미널 창을 하나 더 열어 SSH 키로 접속이 완벽하게 되는지 최종 검증해야 합니다. 만약 설정에 실수가 있다면 기존 세션이 켜져 있을 때 바로잡아야 서버가 고립되는 대참사를 막을 수 있습니다.
결론: 단단한 서버 보안의 첫걸음
SSH 키 발급과 등록은 처음에는 다소 번거롭게 느껴질 수 있지만, 리눅스 서버 인프라를 외부 위협으로부터 보호하기 위한 가장 기본적이고 강력한 방어선입니다. 비밀번호 방식의 편리함 뒤에 숨은 해킹 위험을 제거하고, 오늘 가이드해 드린 단계별 절차를 통해 여러분의 소중한 인프라 자산을 안전하게 락(Lock)을 걸어 운영해 보시기 바랍니다.