[OS-009][중급] SSH 키로 안전하게 원격 접속하기
페이지 정보

본문
[이번 수업]
SSH(Secure Shell)는 신뢰하기 어려운 네트워크를 지나 다른 컴퓨터에 안전하게 접속하는 규약입니다. 로컬에서 키 쌍과 지문을 만들며 서버 확인과 사용자 인증의 차이를 배웁니다.
[선수지식]
OS-003의 파일 권한과 OS-005의 사용자·sudo 개념을 알면 좋습니다. 터미널에서 명령 한 줄을 실행할 수 있으면 실습할 수 있습니다.
[학습목표]
1. 호스트 키와 사용자 키의 역할을 구분합니다.
2. 암호문구로 보호된 Ed25519 키를 로컬에서 생성합니다.
3. 서버 지문 확인, 개인 키 보관과 폐기 수칙을 설명합니다.
[핵심개념]
SSH 연결에는 두 종류의 신원 확인이 있습니다. 서버는 호스트 키로 자신이 접속하려던 서버임을 증명합니다. 클라이언트가 보여 주는 지문을 관리자가 별도 채널로 알려 준 값과 비교한 뒤 승인하며, 승인한 키는 known_hosts에 기록됩니다.
사용자는 사용자 키로 자신을 증명할 수 있습니다. 공개 키는 서버의 authorized_keys에 두어도 되지만 개인 키는 내 장치 밖으로 보내지 않습니다. 클라이언트가 개인 키로 서명하면 서버가 등록된 공개 키로 검증하므로 개인 키 자체는 전송되지 않습니다.
사람·장치·용도별로 키를 나누고 개인 키에는 고유하고 긴 암호문구를 설정합니다. ssh-agent는 잠금 해제한 키를 메모리에서 사용하도록 돕습니다. 장치를 잃거나 담당자가 바뀌면 authorized_keys에서 해당 공개 키를 제거하고 교체합니다.
[따라하기]
네트워크에 접속하지 않고 현재 폴더에 일회용 키 두 개를 만듭니다. macOS와 Linux 터미널에서 실행합니다.
```sh
mkdir -p os009-ssh-demo
ssh-keygen -t ed25519 -a 100 -C local-training -f ./os009-ssh-demo/id_ed25519
ssh-keygen -lf ./os009-ssh-demo/id_ed25519.pub
ls -la ./os009-ssh-demo
```
암호문구를 두 번 묻습니다. 글자가 보이지 않아도 입력되고 있으니 이 실습만의 긴 문구를 사용합니다. 지문은 `256 SHA256:... local-training (ED25519)` 형태입니다. `.pub` 파일은 공개 키이고 확장자가 없는 파일은 개인 키입니다. macOS·Linux에서는 필요할 때 `chmod 600 ./os009-ssh-demo/id_ed25519`로 개인 키를 소유자만 읽고 쓰게 합니다.
Windows 10·11의 PowerShell에서는 OpenSSH 클라이언트가 설치된 상태에서 실행합니다.
```powershell
New-Item -ItemType Directory -Force .\os009-ssh-demo
ssh-keygen -t ed25519 -a 100 -C local-training -f .\os009-ssh-demo\id_ed25519
ssh-keygen -lf .\os009-ssh-demo\id_ed25519.pub
Get-ChildItem .\os009-ssh-demo
```
확인 후 테스트 키만 지웁니다. macOS·Linux는 `rm ./os009-ssh-demo/id_ed25519 ./os009-ssh-demo/id_ed25519.pub && rmdir ./os009-ssh-demo`, PowerShell은 `Remove-Item .\os009-ssh-demo\id_ed25519, .\os009-ssh-demo\id_ed25519.pub; Remove-Item .\os009-ssh-demo`입니다.
[흔한 실수]
공개 키와 개인 키를 반대로 전달하거나 개인 키를 함께 쓰면 추적과 폐기가 어려워집니다. 처음 보는 호스트 지문을 확인 없이 승인하지 않습니다. 호스트 키 변경은 정상 교체일 수도, 중간자 공격 신호일 수도 있으므로 known_hosts부터 지우지 말고 관리자에게 새 지문을 확인합니다. 키 접속을 시험하기 전에 비밀번호 로그인을 끄면 서버에서 잠길 수 있습니다.
[보안 주의]
개인 키와 암호문구를 메일, 메신저, 저장소, 명령 기록에 남기지 않습니다. `StrictHostKeyChecking=no`로 검사를 끄지 말고 지문은 다른 신뢰 채널에서 확인합니다. Ed25519는 현대 OpenSSH의 실용적인 기본 선택이지만 대상 시스템과 조직 정책의 호환성을 먼저 확인합니다. 연습은 본인 소유의 로컬 장치나 허가된 격리 환경에서만 진행합니다.
[직접 해볼 과제]
테스트 키를 하나 더 만들어 두 공개 키의 SHA256 지문을 비교하세요. 각 파일을 공개 가능, 비밀 유지로 분류하고 분실 시 서버에서 제거할 공개 키 한 줄을 식별한 뒤 테스트 파일을 삭제합니다.
[확인문제]
1. 호스트 키와 사용자 키는 각각 누구의 신원을 확인하나요?
2. 서버에 등록해도 되는 파일과 절대 전달하면 안 되는 파일은 무엇인가요?
3. 호스트 키 변경 경고가 나오면 known_hosts를 바로 지우면 안 되는 이유는 무엇인가요?
[다음 학습]
OS-010에서는 systemd와 launchd로 프로그램을 부팅 시 안전하게 시작하고 상태를 확인하는 방법을 배웁니다.
[공식 참고 자료]
- SSH 프로토콜 구조 RFC 4251: https://www.rfc-editor.org/rfc/rfc4251.html
- SSH 사용자 인증 RFC 4252: https://www.rfc-editor.org/rfc/rfc4252.html
- SSH Ed25519 키 RFC 8709: https://www.rfc-editor.org/rfc/rfc8709.html
- OpenBSD ssh 매뉴얼: https://man.openbsd.org/ssh
- OpenBSD ssh-keygen 매뉴얼: https://man.openbsd.org/ssh-keygen
- Microsoft OpenSSH 키 관리: https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
SSH(Secure Shell)는 신뢰하기 어려운 네트워크를 지나 다른 컴퓨터에 안전하게 접속하는 규약입니다. 로컬에서 키 쌍과 지문을 만들며 서버 확인과 사용자 인증의 차이를 배웁니다.
[선수지식]
OS-003의 파일 권한과 OS-005의 사용자·sudo 개념을 알면 좋습니다. 터미널에서 명령 한 줄을 실행할 수 있으면 실습할 수 있습니다.
[학습목표]
1. 호스트 키와 사용자 키의 역할을 구분합니다.
2. 암호문구로 보호된 Ed25519 키를 로컬에서 생성합니다.
3. 서버 지문 확인, 개인 키 보관과 폐기 수칙을 설명합니다.
[핵심개념]
SSH 연결에는 두 종류의 신원 확인이 있습니다. 서버는 호스트 키로 자신이 접속하려던 서버임을 증명합니다. 클라이언트가 보여 주는 지문을 관리자가 별도 채널로 알려 준 값과 비교한 뒤 승인하며, 승인한 키는 known_hosts에 기록됩니다.
사용자는 사용자 키로 자신을 증명할 수 있습니다. 공개 키는 서버의 authorized_keys에 두어도 되지만 개인 키는 내 장치 밖으로 보내지 않습니다. 클라이언트가 개인 키로 서명하면 서버가 등록된 공개 키로 검증하므로 개인 키 자체는 전송되지 않습니다.
사람·장치·용도별로 키를 나누고 개인 키에는 고유하고 긴 암호문구를 설정합니다. ssh-agent는 잠금 해제한 키를 메모리에서 사용하도록 돕습니다. 장치를 잃거나 담당자가 바뀌면 authorized_keys에서 해당 공개 키를 제거하고 교체합니다.
[따라하기]
네트워크에 접속하지 않고 현재 폴더에 일회용 키 두 개를 만듭니다. macOS와 Linux 터미널에서 실행합니다.
```sh
mkdir -p os009-ssh-demo
ssh-keygen -t ed25519 -a 100 -C local-training -f ./os009-ssh-demo/id_ed25519
ssh-keygen -lf ./os009-ssh-demo/id_ed25519.pub
ls -la ./os009-ssh-demo
```
암호문구를 두 번 묻습니다. 글자가 보이지 않아도 입력되고 있으니 이 실습만의 긴 문구를 사용합니다. 지문은 `256 SHA256:... local-training (ED25519)` 형태입니다. `.pub` 파일은 공개 키이고 확장자가 없는 파일은 개인 키입니다. macOS·Linux에서는 필요할 때 `chmod 600 ./os009-ssh-demo/id_ed25519`로 개인 키를 소유자만 읽고 쓰게 합니다.
Windows 10·11의 PowerShell에서는 OpenSSH 클라이언트가 설치된 상태에서 실행합니다.
```powershell
New-Item -ItemType Directory -Force .\os009-ssh-demo
ssh-keygen -t ed25519 -a 100 -C local-training -f .\os009-ssh-demo\id_ed25519
ssh-keygen -lf .\os009-ssh-demo\id_ed25519.pub
Get-ChildItem .\os009-ssh-demo
```
확인 후 테스트 키만 지웁니다. macOS·Linux는 `rm ./os009-ssh-demo/id_ed25519 ./os009-ssh-demo/id_ed25519.pub && rmdir ./os009-ssh-demo`, PowerShell은 `Remove-Item .\os009-ssh-demo\id_ed25519, .\os009-ssh-demo\id_ed25519.pub; Remove-Item .\os009-ssh-demo`입니다.
[흔한 실수]
공개 키와 개인 키를 반대로 전달하거나 개인 키를 함께 쓰면 추적과 폐기가 어려워집니다. 처음 보는 호스트 지문을 확인 없이 승인하지 않습니다. 호스트 키 변경은 정상 교체일 수도, 중간자 공격 신호일 수도 있으므로 known_hosts부터 지우지 말고 관리자에게 새 지문을 확인합니다. 키 접속을 시험하기 전에 비밀번호 로그인을 끄면 서버에서 잠길 수 있습니다.
[보안 주의]
개인 키와 암호문구를 메일, 메신저, 저장소, 명령 기록에 남기지 않습니다. `StrictHostKeyChecking=no`로 검사를 끄지 말고 지문은 다른 신뢰 채널에서 확인합니다. Ed25519는 현대 OpenSSH의 실용적인 기본 선택이지만 대상 시스템과 조직 정책의 호환성을 먼저 확인합니다. 연습은 본인 소유의 로컬 장치나 허가된 격리 환경에서만 진행합니다.
[직접 해볼 과제]
테스트 키를 하나 더 만들어 두 공개 키의 SHA256 지문을 비교하세요. 각 파일을 공개 가능, 비밀 유지로 분류하고 분실 시 서버에서 제거할 공개 키 한 줄을 식별한 뒤 테스트 파일을 삭제합니다.
[확인문제]
1. 호스트 키와 사용자 키는 각각 누구의 신원을 확인하나요?
2. 서버에 등록해도 되는 파일과 절대 전달하면 안 되는 파일은 무엇인가요?
3. 호스트 키 변경 경고가 나오면 known_hosts를 바로 지우면 안 되는 이유는 무엇인가요?
[다음 학습]
OS-010에서는 systemd와 launchd로 프로그램을 부팅 시 안전하게 시작하고 상태를 확인하는 방법을 배웁니다.
[공식 참고 자료]
- SSH 프로토콜 구조 RFC 4251: https://www.rfc-editor.org/rfc/rfc4251.html
- SSH 사용자 인증 RFC 4252: https://www.rfc-editor.org/rfc/rfc4252.html
- SSH Ed25519 키 RFC 8709: https://www.rfc-editor.org/rfc/rfc8709.html
- OpenBSD ssh 매뉴얼: https://man.openbsd.org/ssh
- OpenBSD ssh-keygen 매뉴얼: https://man.openbsd.org/ssh-keygen
- Microsoft OpenSSH 키 관리: https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
- 이전글[NET-009][중급] 방화벽 규칙과 네트워크 분리 이해하기 26.09.04
- 다음글[DB-009][중급] 메모리에서 빠르게 데이터 다루기 26.09.04
댓글목록
등록된 댓글이 없습니다.
