시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 16/50편 (전체 066/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
공개키 인증은 비밀번호 대신 키 쌍으로 로그인합니다. 서버는 사용자의 ~/.ssh/authorized_keys에 등록된 공개키로 클라이언트의 개인키 소유를 검증합니다.
클라이언트(개인키) ── 서명 ──→ 서버
서버: ~/.ssh/authorized_keys 의 공개키로 서명 검증 → 성공 시 로그인
authorized_keys 한 줄 구조
[옵션] 키타입 공개키본문 [주석]
command="/usr/bin/backup" ,from="192.168.56.0/24",no-pty ssh-ed25519 AAAA... backup@ops
│ │ │ │
접속 제한 옵션 키 타입 공개키 주석(출처 식별)
옵션으로 그 키로 할 수 있는 일을 제한할 수 있습니다(특정 명령만, 특정 IP에서만 등).
command/from 제한이 없으면, 그 키 유출 시 전체 셸 접근으로 이어집니다.| 항목 | 기대값 | 확인 |
|---|---|---|
~/.ssh 권한 | 700, 소유자=본인 | stat -c '%a %U' ~/.ssh |
authorized_keys 권한 | 600, 소유자=본인 | stat -c '%a %U' ~/.ssh/authorized_keys |
| 키 등록 위치 | sshd_config AuthorizedKeysFile | sudo sshd -T | grep authorizedkeysfile |
| 키 지문 | 등록 키 목록 | ssh-keygen -lf ~/.ssh/authorized_keys |
| 제한 옵션 | 서비스 키는 command/from | 파일 내용 검토 |
# 1) 모든 사용자의 authorized_keys 위치·권한·키 수 (root 권한)
sudo awk -F: '$3>=1000 || $1=="root"{print $1, $6}' /etc/passwd | while read u h; do
f="$h/.ssh/authorized_keys"
[ -f "$f" ] && echo "$u $(stat -c '%a %U' "$f") keys=$(grep -c '^ssh-\|^ecdsa-\|^sk-' "$f")"
done
# 2) 등록된 키의 지문 목록 (기준선용)
for u in admin1 devops backup; do
h=$(getent passwd $u | cut -d: -f6)
echo "== $u"; sudo ssh-keygen -lf "$h/.ssh/authorized_keys" 2>/dev/null
done
# 3) sshd가 참조하는 키 파일 경로
sudo sshd -T | grep -iE 'authorizedkeysfile|authorizedkeyscommand'
admin1 600 admin1 keys=1
backup 600 backup keys=1
== admin1
256 SHA256:Qm9vZ2xlU2VjK2FkbWluMQ== admin1@mgmt (ED25519)
== backup
256 SHA256:YmFja3VwS2V5Rm9yT3Bz backup@ops (ED25519)
$ sudo sshd -T | grep authorizedkeysfile
authorizedkeysfile .ssh/authorized_keys
계정마다 등록 키가 기준선과 일치(지문·주석), 권한이 600, 파일 경로가 표준인 상태가 정상입니다.
devops 600 devops keys=2
== devops
256 SHA256:ZGV2b3BzT3JpZ2luYWxLZXk= devops@mgmt (ED25519)
256 SHA256:dW5rbm93bktleUZyb21BdHRhY2tlcg== (RSA)
$ sudo sshd -T | grep authorizedkeyscommand
authorizedkeyscommand /usr/local/bin/.keyfetch
devops에 기준선에 없는 키 1개 추가(주석 없음) → 비인가 키 등록 의심AuthorizedKeysCommand가 설정됨 → sshd가 외부 스크립트로 키를 가져오게 하는 우회 경로(017편에서 상세)키 등록 흔적입니다(가상의 예시 로그).
type=PATH msg=audit(1759341800.010:4301): item=1 name="/home/devops/.ssh/authorized_keys" nametype=NORMAL key="ssh_keys"
type=SYSCALL msg=audit(1759341800.010:4301): syscall=257 success=yes auid=1002 uid=1002 comm="tee" exe="/usr/bin/tee" key="ssh_keys"
Oct 2 03:05:11 rocky9-web01 sshd[12501]: Accepted publickey for devops from 192.168.56.77 port 50310 ssh2: RSA SHA256:dW5rbm93bktleUZyb21BdHRhY2tlcg==
| 관찰 | 해석 |
|---|---|
authorized_keys 수정(ssh_keys 키) | 키 추가·변경 |
이후 Accepted publickey ... SHA256:... | 추가된 키 지문으로 로그인 → 키 사용 확인 |
| 로그의 키 지문 = 파일의 새 키 지문 | 018편의 지문 추적으로 "어떤 키로 들어왔나" 확정 |
.ssh 디렉터리와 authorized_keys를 FIM(ssh_keys 키)으로 감시합니다.command/from 제한 적용 여부를 점검합니다.<group name="local,syssec_b,ssh,">
<rule id="101140" level="12">
<if_sid>550,554</if_sid>
<field name="file" type="pcre2">/\.ssh/authorized_keys$</field>
<description>authorized_keys 변경: SSH 키 추가/수정</description>
</rule>
</group>
FIM이 사용자 홈의 .ssh를 감시하려면 /home/*/.ssh, /root/.ssh를 syscheck에 추가합니다. 정상적인 키 배포(구성 관리)가 있다면 배포 계정·시각을 예외로 둡니다(048편).
| 구분 | 핵심 내용 |
|---|---|
| 인증 | 개인키 서명 ↔ authorized_keys 공개키 검증 |
| 파일 구조 | [옵션] 키타입 공개키 [주석] |
| 제한 옵션 | command=, from=, no-pty로 키 권한 축소 |
| 권한 | .ssh 700 / authorized_keys 600, 소유자=본인 |
| 면접 포인트 | "지문 목록을 기준선으로 — 추가된 키는 비밀번호 없는 영구 접근" |
다음 편 067. 계정 · 인증 보안 — authorized_keys 변조·추가 탐지 에서는 그 키 파일을 노리는 authorized_keys 변조·추가 탐지를 깊게 다룹니다.
이전 편: 065. 계정 · 인증 보안 — faillock 로그 분석과 잠금 이벤트 대응
📚 시리즈 전체 보기: 시스템 보안 · 취약점