SSH 접속과 키 인증
SSH 키 쌍을 만들어 공개키를 배포하는 무암호 접속, 원격 명령 실행과 파일 전송, 여러 서버, 양방향 설정, 권한 문제와 서버별 점검 스크립트
#핵심 요약
SSH 키 인증은 비밀번호를 없애는 것이 아니라, 접속하는 쪽이 가진 개인키와 상대가 등록한 공개키 쌍으로 인증을 대신하는 것임
키는 접속하는 쪽에서 ssh-keygen으로 만들고, 공개키를 ssh-copy-id로 상대의 ~/.ssh/authorized_keys에 등록함
등록은 한 방향씩이라 RAC, Data Guard처럼 서로 오가는 구성은 반대 방향도 따로 설정함
무암호가 안 되면 키를 다시 만들기 전에 ~/.ssh(700), authorized_keys(600) 권한부터 봄
#개념과 동작 원리
| 구성 요소 | 역할 |
|---|---|
~/.ssh/id_rsa |
개인키, 권한 600, 절대 밖으로 내보내지 않음 |
~/.ssh/id_rsa.pub |
공개키, 상대 서버에 나눠 줌 |
~/.ssh/authorized_keys |
접속을 허용할 공개키 목록, 줄마다 하나 |
ssh-keygen -t rsa |
키 쌍 생성 |
ssh-copy-id 계정@서버 |
공개키를 상대 authorized_keys에 추가 |
ssh 계정@서버 "명령" |
들어가지 않고 원격에서 명령 하나 실행 |
-o BatchMode=yes |
비밀번호를 물어야 하면 기다리지 않고 바로 실패 |
-o ConnectTimeout=3 |
연결 대기 시간 제한 |
서버가 여러 대가 되면 매번 비밀번호를 치는 것보다 백업 스크립트, 배치가 다른 서버에 자동으로 접속할 수 없는 것이 더 큰 문제임
그렇다고 스크립트에 비밀번호를 적는 것은 가장 나쁜 방법이라 키 인증을 씀
#필수 명령어 또는 SQL
#키 만들기와 배포
ssh oracle@<REMOTE_HOST>
ssh-keygen -t rsa
ls -l ~/.ssh
ssh-copy-id oracle@<REMOTE_HOST>
ssh oracle@<REMOTE_HOST>
hostname결과 해석:
설정 전에는 접속할 때마다 oracle@<REMOTE_HOST>'s password:를 물음
ssh-keygen의 질문은 Enter로 기본값을 쓰며, passphrase를 비우면 키 암호도 묻지 않는 완전한 무암호 접속이 됨
자동화 목적이면 비우는 경우가 많지만, 그만큼 개인키 파일 자체를 잘 지켜야 함
실습 기록: id_rsa는 -rw-------(600), id_rsa.pub은 -rw-r--r--
개인키 권한이 이보다 느슨하면 SSH가 키 사용을 거부함
ssh-copy-id에서 입력하는 비밀번호가 마지막 한 번이며, 이후 ssh는 바로 상대 프롬프트로 들어감
처음 접속하는 서버는 호스트 키 지문을 확인하라고 묻고, yes를 답하면 ~/.ssh/known_hosts에 저장됨
#원격 명령과 파일 전송
ssh oracle@<REMOTE_HOST> "hostname; uptime"
ssh oracle@<REMOTE_HOST> "ps -ef | grep pmon | grep -v grep"
ssh oracle@<REMOTE_HOST> "nproc"exp scott/<PASSWORD> file=<TABLE>.dmp tables=<TABLE>
scp <TABLE>.dmp oracle@<REMOTE_HOST>:/home/oracle/
ssh oracle@<REMOTE_HOST> "ls -l /home/oracle/<TABLE>.dmp"결과 해석:
들어가지 않고 상대의 명령 결과만 받아 오므로 여러 서버의 프로세스, 디스크 상태를 반복문 하나로 점검할 수 있음
실습 기록: 짝꿍 서버의 CPU 코어 수를 nproc으로 받아 4
무암호가 설정되면 scp도 비밀번호 없이 전송되며, 실습은 한 테이블을 exp로 내보내 짝꿍 서버에 보내고 받은 파일을 imp로 넣어 봄
전송 뒤에는 상대 서버에서 ls로 도착을 확인하는 습관을 둠
#수동 등록, 여러 서버, 양방향
cat ~/.ssh/id_rsa.pub | ssh oracle@<REMOTE_HOST> "cat >> ~/.ssh/authorized_keys"
ssh oracle@<REMOTE_HOST> "cat ~/.ssh/authorized_keys"
ssh oracle@<REMOTE_HOST> "wc -l ~/.ssh/authorized_keys"
for h in <HOST2> <HOST3> <HOST4>; do ssh-copy-id oracle@$h; done
for h in <HOST2> <HOST3> <HOST4>; do ssh oracle@$h hostname; donessh-keygen -t rsa
ssh-copy-id oracle@<HOST1>
ssh oracle@<HOST1> hostname결과 해석:
공개키 내용을 상대 authorized_keys 끝에 이어 붙이는 한 줄이 ssh-copy-id가 하는 일과 같음ssh-copy-id가 없는 환경이나 무암호 접속이 안 될 때 이 파일을 직접 확인함
authorized_keys의 줄 끝 oracle@<HOST1>이 <HOST1>에서 만든 공개키이며, 특정 서버의 접속을 막으려면 그 줄을 지움
반복문으로 관리 서버 한 대에서 여러 서버에 키를 배포하고 hostname으로 확인함
<HOST1>→<HOST2>만 설정하면 반대 방향은 여전히 비밀번호를 물음
한쪽만 되고 반대쪽이 안 되면 안 되는 방향의 키 배포가 빠진 것임
#무암호가 안 될 때와 점검 스크립트
ls -ld ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
ls -ld ~/.ssh#!/bin/bash
echo "== 무암호 접속 점검 $(date '+%F %T') =="
for h in <HOST2> <HOST3>; do
if ssh -o BatchMode=yes -o ConnectTimeout=3 oracle@$h hostname >/dev/null 2>&1; then
echo "$h : OK"
else
echo "$h : FAIL (키 배포/권한 확인 필요)"
fi
done결과 해석:
~/.ssh가 drwxrwxr-x처럼 그룹, 기타에 열려 있으면 SSH가 키를 믿지 않고 비밀번호를 물음
디렉터리 700, authorized_keys 600으로 맞추면 됨
BatchMode=yes는 비밀번호를 물어야 하는 서버를 멈추지 않고 FAIL로 처리하므로, 여러 서버 중 키 배포나 권한 수정이 필요한 곳을 한눈에 찾음
#Windows에서 접속하는 도구
실습 PC에서는 PuTTY와 MobaXterm으로 서버에 SSH 접속했으며, 서버 IP와 포트 22로 세션을 만듦
Windows 10 이상에는 OpenSSH 클라이언트가 있어 PowerShell에서 ssh, scp를 바로 쓸 수 있음
#사용 조건과 주의사항
개인키가 유출되면 그 키가 등록된 모든 서버에 비밀번호 없이 들어갈 수 있으므로, 개인키는 복사하거나 메일로 보내지 않고 사용하지 않는 공개키는 authorized_keys에서 지움
passphrase 없는 키는 자동화용 계정에만 쓰고, 사람이 쓰는 키에는 passphrase와 ssh-agent를 검토함
키 알고리즘(RSA 길이, ed25519 등)과 서버의 SSH 정책은 조직 보안 기준을 따름