들어가며
서버 간 자동화 작업을 하다 보면 가장 먼저 마주치는 문제가 있습니다.
"스크립트에 비밀번호를 넣어야 하나?"
# 이렇게 하면 안전할까요? ❌
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
보안 모범 사례
✅ 해야 할 것
- 개인키는 절대 공유하지 마세요
- 개인키는 본인만 알아야 함
- Git에 커밋 금지
- 다른 서버로 복사 금지
- 권한을 올바르게 설정하세요
- chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/authorized_keys
- 용도별로 키를 분리하세요
- 업무용 / 개인용 분리
- 중요 서버는 전용 키 사용
- 패스프레이즈를 고려하세요
- 자동화가 필요 없으면 패스프레이즈 추가
- ssh-agent로 패스프레이즈 자동 입력
- 오래된 키는 삭제하세요
- # 서버에서 사용 안 하는 키 제거 nano ~/.ssh/authorized_keys
❌ 하지 말아야 할 것
- 개인키를 Git에 커밋
- # .gitignore에 추가 echo "id_rsa" >> .gitignore echo "id_ed25519" >> .gitignore
- 개인키를 이메일로 전송
- 공개키와 개인키 혼동
- id_rsa.pub (공개키) → 서버에 복사 OK
- id_rsa (개인키) → 절대 복사/공유 금지
- 비밀번호와 함께 사용
- SSH 키를 사용하면 비밀번호 불필요
- sshpass는 사용하지 마세요
RSA vs Ed25519 키 비교
항목 RSA Ed25519
| 키 길이 | 2048-4096비트 | 256비트 |
| 속도 | 느림 | 빠름 |
| 보안성 | 높음 | 더 높음 |
| 호환성 | 모든 시스템 | 최신 시스템 (OpenSSH 6.5+) |
| 권장 | 호환성 필요 시 | 최신 시스템에서 권장 |
권장 사항:
- 최신 시스템: Ed25519 사용
- 구형 시스템: RSA 4096비트 사용
SSH 키 인증은:
- ✅ 안전함: 비밀번호 노출 없음, 무차별 공격 불가능
- ✅ 편리함: 한 번 설정으로 영구 사용
- ✅ 표준: 업계 표준 인증 방식
- ✅ 자동화 최적: cron, 스크립트 등에 완벽
- ✅ 무료: 추가 비용 없음
비밀번호를 스크립트에 넣는 방식(sshpass)은 절대 사용하지 마세요. SSH 키 인증이 모든 면에서 우수합니다.
단 1분의 설정으로 영구적으로 안전한 서버 접속 환경을 구축할 수 있습니다! 🔒
참고 자료:
'개발 & IT > 개발 라이프 & 팁' 카테고리의 다른 글
| 🔐 GitHub SSH 인증 설정하기 - 비밀번호 없이 Git 사용하는 방법 (1) | 2025.09.28 |
|---|---|
| Git에서 'Permission denied' 오류 해결 방법 (0) | 2025.02.19 |
| 윈도우에서 하위 폴더 파일 일괄 이름 변경하는 방법 (3) | 2025.01.29 |
| 생성형 AI 챗GPT 활용법: 코드 작성 및 디버깅 (5) | 2024.10.07 |
| 생성형 AI의 종류: 다양한 기술의 진화 (16) | 2024.10.07 |