066. 계정 · 인증 보안 — SSH 공개키 인증 구조와 authorized_keys 점검

changseop lee·5일 전

시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 16/50편 (전체 066/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

공개키 인증은 비밀번호 대신 키 쌍으로 로그인합니다. 서버는 사용자의 ~/.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에서만 등).

2. 왜 중요한가

  • authorized_keys에 공격자의 키가 추가되면 비밀번호 없이 영구 접근이 가능합니다. 대표적인 SSH 지속성 수단입니다(017편에서 탐지).
  • 파일·디렉터리 권한이 느슨하면 sshd가 키를 무시하거나(너무 열림), 다른 사용자가 키를 추가할 수 있습니다.
  • 서비스·백업 계정의 키에 command/from 제한이 없으면, 그 키 유출 시 전체 셸 접근으로 이어집니다.

3. 핵심 명령어 / 설정

항목기대값확인
~/.ssh 권한700, 소유자=본인stat -c '%a %U' ~/.ssh
authorized_keys 권한600, 소유자=본인stat -c '%a %U' ~/.ssh/authorized_keys
키 등록 위치sshd_config AuthorizedKeysFilesudo sshd -T | grep authorizedkeysfile
키 지문등록 키 목록ssh-keygen -lf ~/.ssh/authorized_keys
제한 옵션서비스 키는 command/from파일 내용 검토

4. 실습 (실습 예시)

# 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'

5. 정상 상태

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, 파일 경로가 표준인 상태가 정상입니다.

6. 이상 상태

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편에서 상세)

7. 로그 분석 (분석 방법)

키 등록 흔적입니다(가상의 예시 로그).

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편의 지문 추적으로 "어떤 키로 들어왔나" 확정

8. SOC 관제 포인트

  • 계정별 authorized_keys의 키 지문 목록을 기준선으로 두고, 추가·삭제를 비교합니다.
  • .ssh 디렉터리와 authorized_keys를 FIM(ssh_keys 키)으로 감시합니다.
  • 서비스·백업 계정 키는 command/from 제한 적용 여부를 점검합니다.

9. 탐지 규칙

<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편).

10. 대응 방법

  1. 초기 확인 — 추가된 키의 지문·주석·옵션과 변경 시각·소유 계정을 확인합니다.
  2. 범위 확인 — 그 키 지문으로 로그인한 이력(018·019편)과 다른 계정·서버의 동일 키를 확인합니다.
  3. 증거 확보 — authorized_keys 사본(지문 기록), FIM diff, 로그인 로그를 보존합니다.
  4. 차단/조치 — 비인가 키 제거, 해당 계정 키 전체 교체, AuthorizedKeysCommand 우회 제거를 진행합니다.
  5. 재발 방지 — 키 지문 기준선과 authorized_keys FIM 룰을 운영합니다.

11. 핵심 정리

구분핵심 내용
인증개인키 서명 ↔ authorized_keys 공개키 검증
파일 구조[옵션] 키타입 공개키 [주석]
제한 옵션command=, from=, no-pty로 키 권한 축소
권한.ssh 700 / authorized_keys 600, 소유자=본인
면접 포인트"지문 목록을 기준선으로 — 추가된 키는 비밀번호 없는 영구 접근"

12. 다음 편 예고

다음 편 067. 계정 · 인증 보안 — authorized_keys 변조·추가 탐지 에서는 그 키 파일을 노리는 authorized_keys 변조·추가 탐지를 깊게 다룹니다.


이전 편: 065. 계정 · 인증 보안 — faillock 로그 분석과 잠금 이벤트 대응
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글