우분투 · 리눅스 입문 — 18편 (중급)

SSH 키 설정 우분투 — 비번 없이 안전하게

원격 서버에 접속할 때마다 비밀번호 치기 — 번거롭고, 사실 안전하지도 않습니다. 키쌍 한 번 만들면 비번 없이, 그리고 더 안전하게.

2026년 5월 13일 · 약 8분 · 26편 입문 시리즈 18편

터미널에 ssh-keygen·ssh-copy-id 명령으로 SSH 키를 설정하는 화면 — SSH 키 설정을 상징하는 일러스트

17편에서 ufw로 "22번 포트(SSH)를 연다"고 했죠. SSH는 다른 컴퓨터에 안전하게 원격 접속하는 도구입니다 — 클라우드 서버, 집의 다른 PC, 라즈베리파이… 명령줄로 들어가는 거의 모든 게 SSH예요. 그런데 접속할 때마다 비밀번호를 치는 건 (a) 귀찮고 (b) 무차별 대입 공격에 약합니다(인터넷에 노출된 서버는 1초에도 수십 번 "비번 맞히기" 시도를 받아요).

해답이 SSH 키입니다 — 키쌍(공개키 + 개인키)을 한 번 만들어두고, 공개키를 서버에 등록해두면, 그 다음부터는 비번 없이·자동으로·훨씬 안전하게 들어갑니다. 이번 편은 그 키를 만들고(ssh-keygen), 서버에 심고(ssh-copy-id), 편하게 쓰는 법(~/.ssh/config)까지. 26편 입문 시리즈 18편, "중급" 묶음. ⚠️ 핵심 규칙 하나만 미리 — 개인키(id_ed25519, 확장자 없는 것)는 절대, 어디에도 공유하지 마세요. 서버에 올리는 건 항상 .pub(공개키)뿐입니다.

준비물 — 우분투 + 터미널. 접속할 "원격 서버"가 있으면 좋지만(클라우드 인스턴스·다른 PC·VM), 없어도 키 만들기와 권한 설정은 따라 할 수 있습니다. 9편(권한·chmod)·17편(ufw·22번 포트)을 봤다면 이어집니다.

왜 키가 비번보다 나은가

비밀번호 인증과 키 인증의 차이:

비밀번호 인증 / 키 인증
작동비번: 매번 비밀번호를 타이핑해 보냄. 키: 서버가 "이 공개키 가진 사람이 맞는지" 수학적으로 확인 — 비밀은 네트워크로 안 보냄.
공격에비번: 무차별 대입(흔한 비번·사전 단어)에 약함. 인터넷 서버는 끊임없이 시도받음. 키: 사실상 추측 불가(천문학적 경우의 수).
편의비번: 매번 입력. 키: 한 번 설정하면 자동(개인키에 패스프레이즈를 걸어두면 그것만 가끔 — ssh-agent가 기억).

"키쌍"의 개념: 개인키(private key)는 내 컴퓨터에만 두는 비밀(~/.ssh/id_ed25519) — 자물쇠를 여는 진짜 열쇠. 공개키(public key)는 누구한테 줘도 되는 짝(~/.ssh/id_ed25519.pub) — 자물쇠 자체. 서버에 "이 자물쇠(공개키)를 달아둬"라고 등록해두면, 내 열쇠(개인키)로만 열립니다. 그래서 공개키는 서버·깃허브 등에 마음껏 등록, 개인키는 절대 밖으로 안 나감 — 이 비대칭이 핵심이에요.

키 만들기 — ssh-keygen과 권한

$ ssh-keygen -t ed25519 -C "내메모@내노트북" ← -t ed25519: 요즘 권장 키 종류(짧고 안전). -C: 키에 붙일 메모(어느 기기 키인지 알아보게) Enter file (default ~/.ssh/id_ed25519): ← 그냥 Enter (기본 위치) Enter passphrase: ← 개인키에 거는 추가 암호. 강력 권장 — 개인키가 유출돼도 한 겹 더. (빈 칸도 가능하지만 비추천) → ~/.ssh/id_ed25519 (개인키, 절대 공유 X) 와 ~/.ssh/id_ed25519.pub (공개키, 서버에 등록할 것) 두 파일 생성 $ ls -l ~/.ssh/ -rw------- ... id_ed25519 ← 권한 600(소유자만 읽기/쓰기). ssh-keygen 이 알아서 설정함 -rw-r--r-- ... id_ed25519.pub ← 공개키는 644 OK $ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAA... 내메모@내노트북 ← 이 한 줄이 공개키. 깃허브/서버에 붙여넣을 때 이걸 통째로 $ chmod 700 ~/.ssh ; chmod 600 ~/.ssh/id_ed25519 ← 권한이 너무 열려 있으면 ssh 가 "보안상 거부"함. ~/.ssh 는 700, 개인키는 600 — 9편의 chmod
⚠️ 개인키는 단 하나의 규칙: ~/.ssh/id_ed25519(확장자 없는 것)는 이메일에 첨부하지도, 깃에 커밋하지도, 채팅에 붙여넣지도, USB로 옮기지도 마세요(다른 기기에서 쓰려면 그 기기에서 새 키를 만드는 게 정석). 유출되면 그 키로 등록된 모든 서버가 뚫립니다 — 그래서 패스프레이즈를 거는 거고요(한 겹 더). 그리고 권한이 너무 느슨하면 ssh 가 작동을 거부합니다("UNPROTECTED PRIVATE KEY FILE" 에러): ~/.ssh700, 개인키는 600. chmod 777 ~/.ssh 같은 건 절대 금지(15편의 그 함정 — 너무 열어도 거부).

서버에 등록·접속 — ssh-copy-id와 ssh

만든 공개키를 서버의 ~/.ssh/authorized_keys에 추가하면 — 그 서버는 "이 사람 맞다" 합니다. 한 줄로:

$ ssh-copy-id user@서버주소 ← 내 공개키를 서버의 ~/.ssh/authorized_keys 에 추가 (이때 한 번은 비번 입력 — 마지막 비번 사용) $ ssh user@서버주소 ← 이제 비번 없이 접속! (개인키 패스프레이즈를 걸었으면 그것만 한 번 물어봄 — 세션 동안 ssh-agent 가 기억) $ ssh user@서버주소 'uptime' ← 접속 안 하고 명령 하나만 원격 실행 (스크립트에 유용) $ ssh-add ~/.ssh/id_ed25519 ← ssh-agent 에 키를 등록 (한 세션 동안 패스프레이즈를 다시 안 묻게). 보통 데스크탑은 자동 # ssh-copy-id 가 없는 환경이면 수동: cat ~/.ssh/id_ed25519.pub | ssh user@서버 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'

참고로 깃허브/깃랩에 푸시할 때 쓰는 SSH 키도 똑같습니다 — 그쪽 설정의 "SSH keys"에 id_ed25519.pub 내용을 붙여넣으면, 그 다음부터 비번 없이 push/pull. 한 개인키로 여러 서버·서비스에 쓸 수 있어요(공개키만 각각 등록).

편하게 쓰기 — ~/.ssh/config, 그리고 서버 굳히기

접속할 서버가 늘면 ssh [email protected] -p 22 -i ~/.ssh/...를 매번 치기 귀찮죠. ~/.ssh/config에 별칭을 정해두면:

$ nano ~/.ssh/config Host myserver ← 별칭. 이제 'ssh myserver' 만 치면 됨 HostName 13.124.10.20 ← 실제 주소 User ubuntu ← 접속 사용자 Port 22 ← 포트 (다르면 여기서) IdentityFile ~/.ssh/id_ed25519 ← 쓸 개인키 ← 저장 후: chmod 600 ~/.ssh/config (이것도 권한 챙겨야 함) $ ssh myserver ← 위 설정으로 바로 접속. scp myserver:파일 ~/ 같은 데도 별칭 그대로 쓰임
⚠️ "비번 로그인 끄기"는 신중히: 서버 보안을 더 굳히려면 /etc/ssh/sshd_config에서 PasswordAuthentication no(키로만 접속 허용)·PermitRootLogin no로 바꾸고 sudo systemctl restart ssh(19편). 하지만 — 키 접속이 확실히 되는 걸 먼저 확인하고, 그 설정 파일은 8편처럼 백업(sudo cp ... .bak)한 다음에 하세요. 키가 제대로 안 됐는데 비번 로그인을 꺼버리면 — 그 서버에 영영 못 들어갑니다(콘솔 접속이 가능한 클라우드면 복구되지만, 아니면 큰일). 그리고 17편 ufw의 limit 22/tcp도 같이 걸어두면 무차별 대입을 더 막아줍니다.
오늘의 정리: 키쌍 = 개인키(~/.ssh/id_ed25519, 절대 공유 X, 권한 600)+ 공개키(.pub, 서버에 등록 OK). 만들기: ssh-keygen -t ed25519 -C "메모"(패스프레이즈 걸기). 권한: ~/.ssh=700, 개인키=600(안 그럼 ssh 거부). 등록: ssh-copy-id user@서버ssh user@서버(비번 없이). 편하게: ~/.ssh/configHost 별칭 / HostName / User / Port / IdentityFile. 굳히기(신중히, 키 확인+백업 후): sshd_configPasswordAuthentication no·PermitRootLogin no + ufw limit 22.

시리즈 흐름

  1. 1~15편 입문·기초·중급 ✔   16편 네트워크 ✔   17편 ufw 방화벽 ✔
  2. 18편 — SSH 키 설정 (이 글) ✔
  3. 19편 — systemd 서비스 만들기 (프로그램을 부팅 시 자동 시작·재시작 — systemctl·journalctl)
  4. 20편~ — cron / 셸 스크립트 / 셸 스크립트 베스트 프랙티스 …

오늘 할 일: ssh-keygen -t ed25519 -C "내노트북"으로 키를 하나 만들고(패스프레이즈 걸기), ls -l ~/.ssh/로 권한(개인키 600) 확인하고, cat ~/.ssh/id_ed25519.pub으로 공개키가 어떻게 생겼는지 보세요. 접속할 서버가 있으면 ssh-copy-id까지, 없으면 깃허브 SSH 키에 등록해보는 것도 좋습니다(git push가 비번 안 묻게 됨). 19편에서 만나요. (SSH 전체는 man ssh·man ssh_config, 또는 우분투 OpenSSH 문서.)

우분투·리눅스 입문 시리즈

이제 비번 없이·안전하게 원격 접속합니다. 19편 "systemd 서비스 만들기"로 이어집니다.

다음 편은 JUNAI 블로그에서 이어 보세요.

© 2026 JUNAI · 우분투·리눅스 입문 시리즈 18편 · 본 글은 2026년 5월 13일 기준으로 작성되었습니다.

© 2026 주나이테크(주) @JUNAITECH