본문 바로가기

개발 & IT/개발 라이프 & 팁

SSH 키 인증으로 비밀번호 없이 안전하게 서버 접속하기

들어가며

서버 간 자동화 작업을 하다 보면 가장 먼저 마주치는 문제가 있습니다.

"스크립트에 비밀번호를 넣어야 하나?"

# 이렇게 하면 안전할까요? ❌
sshpass -p "password123" ssh user@server "command"

답은 **"절대 아니요"**입니다.

SSH 키 기반 인증을 사용하면 비밀번호 노출 없이 안전하게 자동화할 수 있습니다. 설정도 단 1분이면 충분합니다.

SSH 키 인증이란?

비밀번호 방식 (기존)

클라이언트: "접속하고 싶어요. 비밀번호는 1234입니다"
서버: "비밀번호 확인했습니다. 들어오세요"

문제점:

  • 비밀번호가 네트워크로 전송됨
  • 스크립트에 평문으로 저장해야 함
  • 비밀번호 유출 위험
  • 무차별 대입 공격(brute force)에 취약

SSH 키 방식 (권장)

클라이언트: "접속하고 싶어요. 제 공개키로 암호화된 챌린지를 보내주세요"
서버: "챌린지를 암호화해서 보냅니다"
클라이언트: "제 개인키로 복호화했습니다. 결과는 이것입니다"
서버: "확인. 당신이 진짜 소유자네요. 들어오세요"

장점:

  • ✅ 비밀번호가 네트워크로 전송되지 않음
  • ✅ 개인키는 서버에 저장되지 않음 (클라이언트에만)
  • ✅ 스크립트에 비밀번호 불필요
  • ✅ 자동화에 최적
  • ✅ 무차별 대입 공격 불가능

SSH 키의 구조

SSH 키는 한 쌍으로 생성됩니다:

개인키 (Private Key)

  • 파일명: id_rsa 또는 id_ed25519
  • 위치: 클라이언트 PC의 ~/.ssh/
  • 절대 공유하면 안 됨!
  • 집 열쇠와 같음

공개키 (Public Key)

  • 파일명: id_rsa.pub 또는 id_ed25519.pub
  • 위치: 서버의 ~/.ssh/authorized_keys
  • 공유해도 괜찮음
  • 자물쇠와 같음

비유:

공개키 (자물쇠) → 여러 서버에 설치
개인키 (열쇠)   → 내 PC에만 보관

실전: SSH 키 인증 설정하기

1단계: SSH 키 생성

로컬 PC 또는 클라이언트 서버에서:

# RSA 방식 (전통적, 호환성 좋음)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

# 또는 Ed25519 방식 (최신, 더 빠르고 안전)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""

옵션 설명:

  • -t rsa 또는 -t ed25519: 암호화 알고리즘 선택
  • -b 4096: RSA 키 길이 (4096비트 권장)
  • -f ~/.ssh/id_rsa: 저장 위치
  • -N "": 패스프레이즈 없음 (자동화용)

실행 결과:

Generating public/private rsa key pair.
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:abcd1234efgh5678ijkl9012mnop3456qrst7890uvwx user@hostname

생성된 파일:

ls -l ~/.ssh/
-rw------- 1 user user 3243 Oct 23 10:00 id_rsa      # 개인키
-rw-r--r-- 1 user user  743 Oct 23 10:00 id_rsa.pub  # 공개키

2단계: 공개키를 서버에 복사

방법 A: ssh-copy-id 사용 (가장 간단) ⭐

ssh-copy-id user@server-ip

이때 딱 한 번만 비밀번호를 입력합니다:

/usr/bin/ssh-copy-id: INFO: attempting to log in...
user@server-ip's password: ← 여기서 비밀번호 입력 (마지막)

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@server-ip'"
and check to make sure that only the key(s) you wanted were added.

방법 B: 수동 복사

# 공개키 내용 확인
cat ~/.ssh/id_rsa.pub

# 서버에 수동으로 추가
ssh user@server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 위 명령 실행 후 Ctrl+D로 입력 종료

# 또는 한 줄로
cat ~/.ssh/id_rsa.pub | ssh user@server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

3단계: 비밀번호 없이 접속 테스트

# 비밀번호 입력 없이 바로 접속됨!
ssh user@server-ip

비밀번호를 묻지 않고 바로 접속되면 성공입니다! 🎉

테스트 명령:

# 원격 명령 실행
ssh user@server-ip "hostname"
ssh user@server-ip "uptime"
ssh user@server-ip "df -h"

# 파일 전송 (비밀번호 없이)
scp local-file.txt user@server-ip:/path/
rsync -av folder/ user@server-ip:/path/

보안 설정

필수: 권한 설정

클라이언트 측 (키를 만든 곳):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa       # 개인키
chmod 644 ~/.ssh/id_rsa.pub   # 공개키

서버 측 (접속 받는 곳):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

왜 중요한가?

  • 600: 본인만 읽기/쓰기 가능
  • 700: 본인만 접근 가능
  • 다른 사용자가 개인키를 읽을 수 없게 보호

선택: 비밀번호 로그인 비활성화

SSH 키만 허용하고 비밀번호 로그인을 완전히 막으려면:

서버에서:

sudo nano /etc/ssh/sshd_config
# 비밀번호 인증 비활성화
PasswordAuthentication no

# 키 인증만 허용
PubkeyAuthentication yes
# SSH 서비스 재시작
sudo systemctl restart sshd

⚠️ 주의: 반드시 SSH 키가 정상 작동하는지 확인한 후 설정하세요!

실무 활용 예시

1. 서버 간 파일 동기화

# rsync로 자동 백업 (비밀번호 불필요)
rsync -avz /source/path/ user@backup-server:/backup/path/

2. 원격 명령 실행

# 여러 서버에 동시에 명령 실행
for server in server1 server2 server3; do
  ssh user@$server "systemctl status nginx"
done

3. Git 저장소 접근

# GitHub, GitLab 등에 SSH 키 등록 후
git clone git@github.com:username/repo.git
git push origin main  # 비밀번호 입력 없음

4. 자동화 스크립트

#!/bin/bash
# 매일 자동으로 실행되는 스크립트

# 원격 서버 데이터 가져오기
ssh user@server "tar czf /tmp/data.tar.gz /var/data"
scp user@server:/tmp/data.tar.gz ./

# 원격 서버 청소
ssh user@server "rm /tmp/data.tar.gz"

cron 등록:

0 2 * * * /path/to/script.sh

고급 활용

1. 여러 서버에 동일한 키 사용

하나의 SSH 키로 여러 서버에 접속 가능합니다.

# 각 서버에 공개키 복사
ssh-copy-id user@server1
ssh-copy-id user@server2
ssh-copy-id user@server3

# 이제 모든 서버에 비밀번호 없이 접속
ssh user@server1
ssh user@server2
ssh user@server3

2. 용도별 키 분리

보안을 더 강화하려면 용도별로 키를 분리:

# 업무용 키
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_work -N ""

# 개인 프로젝트용 키
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_personal -N ""

# 특정 키로 접속
ssh -i ~/.ssh/id_ed25519_work user@work-server
ssh -i ~/.ssh/id_ed25519_personal user@personal-server

3. SSH Config 파일 활용

~/.ssh/config 파일로 편리하게 관리:

nano ~/.ssh/config
# 업무 서버
Host work-server
    HostName 192.168.1.10
    User admin
    IdentityFile ~/.ssh/id_ed25519_work
    Port 22

# 백업 서버
Host backup
    HostName backup.example.com
    User backup-user
    IdentityFile ~/.ssh/id_ed25519_personal
    Port 2222

# GitHub
Host github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github

이제 간단하게:

ssh work-server
ssh backup
git push origin main

SSH 키 vs 비밀번호 비교

항목 비밀번호 방식 SSH 키 방식

보안성 ⚠️ 낮음 (평문 저장, 네트워크 전송) ✅ 높음 (암호화된 챌린지)
무차별 공격 ⚠️ 취약 ✅ 불가능
자동화 ⚠️ sshpass 필요, 비안전 ✅ 기본 지원, 안전
관리 ⚠️ 비밀번호 변경 시 모든 스크립트 수정 ✅ 키만 관리
편의성 ⚠️ 매번 입력 ✅ 한 번 설정으로 영구 사용
표준 ⚠️ 비표준 ✅ 업계 표준

트러블슈팅

문제 1: "Permission denied (publickey)"

원인: 공개키가 제대로 복사되지 않음 또는 권한 문제

해결:

# 공개키 다시 복사
ssh-copy-id -f user@server-ip

# 서버 측 권한 확인
ssh user@server-ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

문제 2: 여전히 비밀번호를 물음

원인 1: authorized_keys가 제대로 설정되지 않음

# 서버에서 확인
cat ~/.ssh/authorized_keys
# 공개키 내용이 있는지 확인

원인 2: SELinux 또는 권한 문제

# 서버에서
restorecon -R -v ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

문제 3: "Host key verification failed"

원인: known_hosts에 서버 정보 없음

해결:

# 한 번 수동 접속 (yes 입력)
ssh user@server-ip

# 또는 자동 수락
ssh -o StrictHostKeyChecking=no user@server-ip

# known_hosts 초기화가 필요하면
ssh-keygen -R server-ip

문제 4: "Too many authentication failures"

원인: ~/.ssh/에 키가 너무 많음

해결:

# 특정 키만 사용
ssh -i ~/.ssh/id_rsa user@server-ip

# 또는 config 파일에서 IdentitiesOnly 사용
Host myserver
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_rsa

보안 모범 사례

✅ 해야 할 것

  1. 개인키는 절대 공유하지 마세요
    • 개인키는 본인만 알아야 함
    • Git에 커밋 금지
    • 다른 서버로 복사 금지
  2. 권한을 올바르게 설정하세요
  3. chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/authorized_keys
  4. 용도별로 키를 분리하세요
    • 업무용 / 개인용 분리
    • 중요 서버는 전용 키 사용
  5. 패스프레이즈를 고려하세요
    • 자동화가 필요 없으면 패스프레이즈 추가
    • ssh-agent로 패스프레이즈 자동 입력
  6. 오래된 키는 삭제하세요
  7. # 서버에서 사용 안 하는 키 제거 nano ~/.ssh/authorized_keys

❌ 하지 말아야 할 것

  1. 개인키를 Git에 커밋
  2. # .gitignore에 추가 echo "id_rsa" >> .gitignore echo "id_ed25519" >> .gitignore
  3. 개인키를 이메일로 전송
  4. 공개키와 개인키 혼동
    • id_rsa.pub (공개키) → 서버에 복사 OK
    • id_rsa (개인키) → 절대 복사/공유 금지
  5. 비밀번호와 함께 사용
    • SSH 키를 사용하면 비밀번호 불필요
    • sshpass는 사용하지 마세요

RSA vs Ed25519 키 비교

항목 RSA Ed25519

키 길이 2048-4096비트 256비트
속도 느림 빠름
보안성 높음 더 높음
호환성 모든 시스템 최신 시스템 (OpenSSH 6.5+)
권장 호환성 필요 시 최신 시스템에서 권장

권장 사항:

  • 최신 시스템: Ed25519 사용
  • 구형 시스템: RSA 4096비트 사용

SSH 키 인증은:

  • 안전함: 비밀번호 노출 없음, 무차별 공격 불가능
  • 편리함: 한 번 설정으로 영구 사용
  • 표준: 업계 표준 인증 방식
  • 자동화 최적: cron, 스크립트 등에 완벽
  • 무료: 추가 비용 없음

비밀번호를 스크립트에 넣는 방식(sshpass)은 절대 사용하지 마세요. SSH 키 인증이 모든 면에서 우수합니다.

단 1분의 설정으로 영구적으로 안전한 서버 접속 환경을 구축할 수 있습니다! 🔒


참고 자료:

반응형