// SECURITY · SSH · RSA Public Key Auth
패스워드 방식 버리고 Public Key 방식으로 — 더 안전하고 더 편하다
왜 바꿨냐면
Xshell로 서버 접속할 때마다 패스워드를 치면서 생각했다.
"이거 매번 입력해야 해? 그리고 진짜 안전한 거 맞아?"
패스워드 방식은 브루트포스 공격에 취약하다. 반면 Public Key 방식은 수학적으로 연결된 키 쌍을 쓰기 때문에 개인키 없이는 접속 자체가 불가능하다. 찾아보니 설정도 어렵지 않았다. 그래서 바꿨다.
기존 패스워드 방식 SSH 연결은 아래 글 참고:
🔗 CentOS7 xshell 연결(#ssh)하기
어떤 구성이냐면
SETUP
Windows → ssh-keygen → id_rsa + id_rsa.pub 생성
id_rsa.pub → scp → CentOS7 ~/.ssh/authorized_keys 등록
Xshell → Public Key 방식으로 전환 → 패스워드 없이 접속
이게 전부다. 추가로 구성한 것들:
✓
RSA 키 쌍 생성 (ssh-keygen)
Windows CMD에서 개인키 + 공개키 한 번에 생성
✓
공개키 서버 등록 (scp)
id_rsa.pub → 서버 ~/.ssh/authorized_keys로 전송
✓
패스워드 인증 비활성화
sshd_config → PasswordAuthentication no → 브루트포스 차단
✓
Xshell Public Key 전환
세션 속성에서 인증 방식 변경 + 개인키 파일 등록
기술 스택
AUTH METHOD
RSA Public Key
4096bit / 2048bit
KEY FILES
id_rsa / id_rsa.pub
C:\Users\USER\.ssh\
구조
Windows C:\Users\USER\.ssh\
├── id_rsa ← 개인키 — 절대 외부 공유 금지
└── id_rsa.pub ← 공개키 — 서버에 등록하는 파일
CentOS7 /root/.ssh/
└── authorized_keys ← id_rsa.pub 내용이 여기 등록됨
개인키는 Windows에만, 공개키는 서버에만. 접속 시 서버가 공개키로 암호화한 챌린지를 보내면 클라이언트가 개인키로 복호화해 응답한다. 개인키 없이는 접속 자체가 불가능하다.
.ssh 디렉터리 만드는 방법
CentOS7 서버에서 먼저 ~/.ssh 디렉터리를 만든다. 공개키가 들어갈 자리다.
[root@cent-1 ~]# mkdir -p ~/.ssh
[root@cent-1 ~]# chmod 700 ~/.ssh
[root@cent-1 ~]# ls -la ~/ | grep .ssh
drwx------. 2 root root 6 Dec 31 00:00 .ssh
⚠️
삽질 포인트
~/.ssh는 반드시 chmod 700, 나중에 만들어질 authorized_keys는 chmod 600이어야 한다. 권한이 틀리면 sshd가 파일 자체를 무시해서 인증이 안 된다.
sshd_config 설정하는 방법
SSH 서버 설정 파일에서 패스워드 인증을 끄고 Public Key 인증만 허용한다.
/etc/ssh/sshd_config — 65번 줄
// 변경 전
PasswordAuthentication yes
// 변경 후
PasswordAuthentication no
// 함께 확인할 항목들
PubkeyAuthentication yes ← 기본값 yes 확인
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin yes ← 운영환경에선 no 권장
⚠️
삽질 포인트
키 등록 전에 PasswordAuthentication no를 먼저 적용하면 기존 세션이 끊겨서 서버에 못 들어가는 사태가 생긴다. 반드시 키 등록을 먼저 완료한 뒤 재시작할 것.
RSA 키 쌍 생성하는 방법 (Windows)
제일 간단한 부분. Windows CMD에서 ssh-keygen 한 번이면 된다.
C:\Users\USER> mkdir .ssh
C:\Users\USER> cd .ssh
C:\Users\USER\.ssh> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key: [Enter — 기본값]
Enter passphrase: [Enter — 스킵 또는 암호 입력]
Enter same passphrase again: [Enter]
Your identification has been saved in id_rsa
Your public key has been saved in id_rsa.pub
💡
Passphrase 설정에 대해
Passphrase는 개인키 파일 자체를 암호화하는 추가 보안이다. 설정하면 접속 시마다 암호 입력이 필요하지만, 개인키 파일이 도난당해도 안전하다. 편의상 Enter로 스킵하는 경우 개인키 파일 관리에 각별히 주의할 것.
공개키 서버로 전송하는 방법 (scp)
제일 재밌었던 부분. 키가 있는 디렉터리에서 scp로 서버에 바로 밀어넣는다. 이게 마지막으로 패스워드를 입력하는 순간이다.
Windows CMD — .ssh 폴더에서 실행
C:\Users\USER\.ssh> scp -P 22 id_rsa.pub root@10.0.0.1:/root/.ssh/authorized_keys
root@10.0.0.1's password: [현재 패스워드 입력 — 마지막으로 입력하는 패스워드]
id_rsa.pub 100% 575 286.4KB/s 00:00 ✓
⚠️
삽질 포인트
경로는 /root.ssh 가 아니라 /root/.ssh (슬래시+점 포함). 그리고 파일명은 반드시 authorized_keys 로 지정해야 한다. 다른 이름으로 전송하면 SSH가 인식 못 한다.
전송 후 CentOS7에서 권한 설정하고 sshd 재시작한다.
[root@cent-1 ~]# chmod 600 ~/.ssh/authorized_keys
[root@cent-1 ~]# ls -la ~/.ssh/
-rw-------. 1 root root 575 Dec 31 00:00 authorized_keys
[root@cent-1 ~]# systemctl restart sshd
[root@cent-1 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Active: active (running) ✓
authorized_keys 생성 + chmod 600 확인
Xshell Public Key 설정하는 방법
Xshell 세션 속성에서 인증 방식을 바꾸고 개인키를 등록한다.
Xshell 설정 경로
01│세션 속성 열기 → 연결 → 사용자 인증
02│방식(Method): Password → Public Key 로 변경
03│사용자 키: 찾아보기 → 사용자 키 가져오기 클릭
04│id_rsa (개인키, 확장자 없는 파일) 선택
05│Passphrase 설정했다면 암호란에 입력
Xshell Public Key 체크 및 설정
접속 확인
설정 완료 후 연결하면 패스워드 입력 없이 바로 들어가진다.
✓
접속 성공!
이제 패스워드 없이 Public Key 인증으로 CentOS7에 안전하게 접속할 수 있다. PasswordAuthentication no 설정으로 브루트포스 공격 위협도 차단됐다.
전체 흐름 요약
01│CentOS7 mkdir ~/.ssh && chmod 700 ~/.ssh
02│CentOS7 sshd_config PasswordAuthentication no
03│Windows ssh-keygen → id_rsa + id_rsa.pub 생성
04│Windows scp id_rsa.pub → 서버:/root/.ssh/authorized_keys
05│CentOS7 chmod 600 ~/.ssh/authorized_keys
06│CentOS7 systemctl restart sshd
07│Xshell Public Key 방식 변경 + id_rsa 가져오기
08│접속 → 패스워드 없이 연결 성공 ✓
간단한데 이거 안 하면 매번 패스워드 치는 것보다 더 큰 문제가 생길 수도 있다. 서버 운영한다면 기본으로 깔고 가야 한다.
// 교훈
패스워드보다 Public Key가
더 안전하고 더 편하다.
Tags:
#RSA
#Xshell
#CentOS7
#publickey
#ssh-keygen
#sshd_config
#authorized_keys