서버에 원격으로 접속하거나 GitHub, GitLab 등과 안전하게 데이터를 주고받을 때 우리는 SSH(Secure Shell) 프로토콜을 사용합니다.
이번 글에서는 SSH 통신의 핵심인 Private Key(개인키)와 Public Key(공개키)의 원리, 서버의 신뢰성을 검증하는 known_hosts의 역할, 그리고 이를 직접 생성하고 등록/활용하는 방법을 단계별로 다뤄보겠습니다.
1. SSH Key와 known_hosts를 사용하는 이유
SSH는 암호화 기술을 사용해 클라이언트(내 컴퓨터)와 서버 간의 통신을 보호합니다.
🔑 Private Key & Public Key (비대칭키 쌍)
SSH 인증은 비대칭 암호화 방식인 키 쌍(Key Pair)을 기반으로 동작합니다.
- Private Key (개인키, id_ed25519 또는 id_rsa):
- 내 컴퓨터에만 비밀로 보관해야 하는 키입니다. 절대 외부에 노출되어서는 안 됩니다.
- Public Key (공개키, id_ed25519.pub 또는 id_rsa.pub):
- 접속하려는 원격 서버나 GitHub 등에 등록해두는 공개 가능한 키입니다.
- 사용 이유: 비밀번호(Password) 인증 방식은 브루트 포스(비밀번호 대입) 공격에 취약하지만, SSH 키 인증 방식은 비밀번호 없이 훨씬 강력한 보안으로 원격 접속 및 자동화(CI/CD)를 가능하게 해줍니다.
🛡️ known_hosts
- known_hosts의 역할:
- 클라이언트가 접속하려는 원격 서버가 진짜 그 서버가 맞는지 검증(Server Authentication)하기 위해 내 컴퓨터(~/.ssh/known_hosts)에 기록해 두는 서버 지문(Fingerprint) 목록입니다.
- 사용 이유:
- 클라이언트가 서버로 접속할 때 중간에서 통신을 가로채는 Man-in-the-Middle(중간자) 공격을 방지합니다.
- 만약 접속하려는 서버의 지문이 known_hosts에 기록된 것과 다르면 SSH는 위험 경고(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)를 띄우고 접속을 차단합니다.
2. SSH Key Pair 생성 방법
로컬 컴퓨터의 터미널(macOS/Linux) 또는 Git Bash(Windows)를 열고 아래 명령어를 입력합니다.
ssh-keygen -t ed25519 -C "your_email@example.com"
- Enter file in which to save the key: 키 저장 위치를 묻습니다. 기본값(~/.ssh/id_ed25519)을 사용하려면 Enter를 누릅니다.
- Enter passphrase: 키 자체를 암호화할 추가 비밀번호를 설정할 수 있습니다. CI/CD 자동화 목적이라면 비워두고(Enter), 개인 개발용이라면 설정하는 것이 좋습니다.
~/.ssh 디렉토리로 이동해 생성된 파일들을 확인합니다.
ls -l ~/.ssh
- id_ed25519: Private Key (절대 유출 금지)
- id_ed25519.pub: Public Key (서버/GitHub 등에 등록할 키)
3. SSH Key 등록 및 접속 방법
1) 원격 Linux 서버에 Public Key 등록하기
생성한 Public Key(id_ed25519.pub) 내용을 원격 서버의 ~/.ssh/authorized_keys 파일에 추가해야 합니다.
- 방법 A: ssh-copy-id 명령 사용 (권장)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_server_ip - 방법 B: 직접 수동 등록
- 내 컴퓨터에서 Public Key 내용 복사: cat ~/.ssh/id_ed25519.pub
- 원격 서버 접속 후 ~/.ssh/authorized_keys 파일 맨 끝에 붙여넣기
등록이 완료되면 이후 비밀번호 입력 없이 SSH 접속이 완료됩니다:
ssh user@remote_server_ip
2) GitHub / GitLab에 Public Key 등록하기
- 내 컴퓨터에서 Public Key 복사:
cat ~/.ssh/id_ed25519.pub - GitHub 접속 > Settings > SSH and GPG keys > New SSH key 클릭.
- 복사한 Key 내용을 붙여넣고 저장하면 SSH를 통한 Git push/pull이 가능해집니다.
4. known_hosts 발급(지문 수집) 및 활용법
원격 서버에 처음 SSH 접속을 시도하면 다음과 같은 메시지가 나타납니다:
The authenticity of host '192.168.0.100 (192.168.0.100)' can't be established.
ED25519 key fingerprint is SHA256:abc123xyz...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
여기서 yes를 입력하면 해당 서버의 Host Key가 내 컴퓨터의 ~/.ssh/known_hosts 파일에 자동 추가됩니다.
CI/CD 환경에서의 known_hosts 수집 (ssh-keyscan)
GitHub Actions, GitLab CI 등 대화형 인터페이스(yes 입력)가 불가능한 자동화 환경에서는 접속 대상 서버의 지문을 미리 수집하여 known_hosts에 등록해 두어야 인터랙션 오류를 방지할 수 있습니다.
이때 ssh-keyscan 명령을 활용합니다.
# 특정 서버의 SSH 지문을 추출하여 known_hosts에 추가
ssh-keyscan -H [서버 IP 또는 도메인] >> ~/.ssh/known_hosts
GitHub Actions 예시 설정
- name: Setup SSH & known_hosts
run: |
mkdir -p ~/.ssh
# Private Key 등록
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
# known_hosts 자동 등록
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
💡 보안 및 유지보수 팁
- 권한(Permission) 설정 필수:
- ~/.ssh 디렉토리: chmod 700 ~/.ssh
- Private Key (id_ed25519): chmod 600 ~/.ssh/id_ed25519
- authorized_keys: chmod 600 ~/.ssh/authorized_keys
- SSH 관련 파일 및 디렉토리는 권한 설정이 올바르지 않으면 접속을 거부합니다.
- 서버 교체/재설치 시 known_hosts 오류 발생 조치:
ssh-keygen -R [서버 IP 또는 도메인] - 서버를 재설치하거나 IP가 변경되어 지문 오류가 발생하면 아래 명령어로 기존 지문을 삭제 후 재접속합니다.
마무리
- Private Key: 내 컴퓨터/클라이언트 전용 인증서 (절대 공개 금지)
- Public Key: 서버/GitHub에 등록하는 열쇠 구멍
- known_hosts: 내가 접속하는 서버가 가짜가 아닌지 검증하는 신뢰 서버 지문 목록
이 세 가지 개념과 권한 관리 규칙을 이해하면, 원격 서버 관리부터 CI/CD 자동화 배포까지 안전하고 효율적인 DevOps 환경을 구축할 수 있습니다!
