067. 계정 · 인증 보안 — authorized_keys 변조·추가 탐지

changseop lee·3일 전

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

선행 학습

1. 개념

SSH 키 기반 지속성은 "공격자 키를 서버에 심어 비밀번호 없이 다시 들어오게" 만드는 것입니다. 심는 위치가 여러 곳이라, 한 곳만 보면 놓칩니다.

키가 숨을 수 있는 곳
 ① ~/.ssh/authorized_keys            : 가장 흔한 위치
 ② sshd_config AuthorizedKeysFile    : 경로 자체를 바꿔 다른 파일 사용
 ③ AuthorizedKeysCommand             : 외부 스크립트가 키를 "생성"해 반환
 ④ 다른 계정의 authorized_keys        : 눈에 덜 띄는 계정(서비스·휴면)
 ⑤ root의 authorized_keys            : root 직접 접근(PermitRootLogin 설정과 함께)

이 편은 공격 방법이 아니라, 각 위치를 점검·탐지하고 키 추가를 로그인과 연결하는 데 집중합니다.

2. 왜 중요한가

  • 비밀번호를 바꾸거나 계정을 잠가도, 심어진 키가 남아 있으면 공격자는 계속 들어올 수 있습니다. 사고 대응 시 키 전수 점검이 필수인 이유입니다.
  • AuthorizedKeysCommand는 정상 기능(중앙 키 관리)이지만, 악용되면 파일에 흔적을 남기지 않고 키를 공급할 수 있습니다.
  • 서비스·휴면 계정의 키는 평소 아무도 보지 않아 지속성에 선호됩니다.

3. 핵심 명령어 / 설정

점검 대상명령
모든 계정 키 파일sudo find /home /root -name authorized_keys -printf '%TY-%Tm-%Td %p\n'
키 파일 경로 설정sudo sshd -T | grep -iE 'authorizedkeysfile|authorizedkeyscommand'
비표준 경로 키AuthorizedKeysFile이 표준(.ssh/authorized_keys)이 아닌지
외부 키 명령AuthorizedKeysCommand 스크립트 존재·내용
키 사용 추적grep 'Accepted publickey' /var/log/secure (지문과 대조)

4. 실습 (실습 예시)

# 1) 전 계정 키 파일과 최근 변경
sudo find /home /root -path '*/.ssh/authorized_keys' -printf '%TY-%Tm-%Td %TH:%TM %u %p (keys=%s bytes)\n' 2>/dev/null

# 2) sshd 키 경로·외부 명령 설정
sudo sshd -T | grep -iE 'authorizedkeysfile|authorizedkeyscommand|authorizedkeyscommanduser'

# 3) 외부 키 명령이 있으면 스크립트 출처 확인
CMD=$(sudo sshd -T | awk '/authorizedkeyscommand /{print $2}')
[ -n "$CMD" ] && sudo ls -l "$CMD" && rpm -qf "$CMD" 2>/dev/null

# 4) 키 기준선과 비교 (016편 지문 목록)
for u in $(sudo awk -F: '$3>=1000||$1=="root"{print $1}' /etc/passwd); do
  h=$(getent passwd $u|cut -d: -f6); f="$h/.ssh/authorized_keys"
  [ -f "$f" ] && sudo ssh-keygen -lf "$f" 2>/dev/null | sed "s/^/[$u] /"
done | sort > /root/baseline/authkeys-$(date +%F).txt
diff /root/baseline/authkeys-base.txt /root/baseline/authkeys-$(date +%F).txt

5. 정상 상태

2026-09-20 10:00 admin1 /home/admin1/.ssh/authorized_keys (keys=98 bytes)
2026-09-18 14:30 backup /home/backup/.ssh/authorized_keys (keys=102 bytes)
$ sudo sshd -T | grep -i authorizedkeyscommand
authorizedkeyscommand none
$ diff authkeys-base.txt authkeys-now.txt
$

키 파일 변경이 오래전(배포 시점)이고, AuthorizedKeysCommand none, 지문 기준선과 차이가 없는 상태가 정상입니다.

6. 이상 상태

$ diff authkeys-base.txt authkeys-now.txt
> [apache] 256 SHA256:YXR0YWNrZXJLZXlJbldlYkFjY3Q= (ED25519)
> [backup] 2048 SHA256:c2Vjb25kQXR0YWNrZXJLZXk= (RSA)
$ sudo sshd -T | grep authorizedkeysfile
authorizedkeysfile .ssh/authorized_keys /etc/ssh/keys/%u
  • apache(서비스 계정)·backup(휴면)에 새 키 추가 → 눈에 덜 띄는 계정 선택
  • AuthorizedKeysFile에 추가 경로 /etc/ssh/keys/%u → 홈이 아닌 곳에도 키를 둘 수 있게 변경
  • 홈만 점검했다면 /etc/ssh/keys/ 경로를 놓쳤을 것 → 설정에서 실제 경로를 먼저 확인해야 하는 이유

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

키 추가와 사용을 연결한 예시입니다(가상의 예시 로그).

type=PATH msg=audit(1759342100.010:4401): item=1 name="/home/apache/.ssh/authorized_keys" nametype=CREATE key="ssh_keys"
Oct  2 03:08:40 rocky9-web01 sshd[12601]: Accepted publickey for apache from 192.168.56.77 port 50320 ssh2: ED25519 SHA256:YXR0YWNrZXJLZXlJbldlYkFjY3Q=
Oct  2 03:08:40 rocky9-web01 sshd[12601]: pam_unix(sshd:session): session opened for user apache(uid=48)
관찰해석
apache의 .ssh 생성서비스 계정에 키 디렉터리 생성(비정상)
Accepted publickey for apache서비스 계정 키 로그인 성공
로그 지문 = 추가된 키 지문심은 키가 실제로 사용됨 → 침해 확정

키 추가(파일 이벤트)와 키 사용(로그인 로그)을 지문으로 연결하면 "준비"와 "실행"을 모두 증명할 수 있습니다.

8. SOC 관제 포인트

  • 키 점검은 홈 + sshd_config의 실제 경로(AuthorizedKeysFile/Command) 를 모두 봅니다.
  • 서비스·휴면 계정의 .ssh 생성·키 추가는 최상위 우선순위입니다.
  • 키 추가 지문을 Accepted publickey 로그와 대조해 사용 여부를 확인합니다.

9. 탐지 규칙

<group name="local,syssec_b,ssh,persistence,">
  <rule id="101150" level="13">
    <if_sid>550,554</if_sid>
    <field name="file" type="pcre2">/(apache|nginx|www-data|mysql|postgres|backup)/\.ssh/authorized_keys$</field>
    <description>서비스/백업 계정 authorized_keys 생성·변경: SSH 지속성 의심</description>
  </rule>
  <rule id="101151" level="12">
    <if_sid>550</if_sid>
    <field name="file" type="pcre2">^/etc/ssh/sshd_config</field>
    <match>AuthorizedKeysCommand</match>
    <description>AuthorizedKeysCommand 설정 변경(외부 키 공급 경로)</description>
  </rule>
</group>

016편의 키 지문 기준선과 함께 운영해, 파일 변경 + 새 지문 로그인을 묶어 확인합니다.

10. 대응 방법

  1. 초기 확인 — 추가된 키의 위치(홈/추가 경로)·대상 계정·지문·추가 시각을 확인합니다.
  2. 범위 확인 — 그 지문으로 로그인한 이력과, 같은 키가 다른 계정·서버에 있는지 확인합니다.
  3. 증거 확보 — 키 파일 사본(지문), sshd 설정, 로그인 로그를 보존합니다.
  4. 차단/조치 — 비인가 키 전수 제거, 영향 계정 키 재발급, AuthorizedKeysFile/Command 복원을 진행합니다.
  5. 재발 방지 — 키 점검 범위(홈+설정 경로)와 서비스 계정 키 룰을 운영합니다.

11. 핵심 정리

은닉 위치점검 방법
홈 authorized_keysfind /home /root, 지문 기준선 diff
AuthorizedKeysFile 추가 경로sshd -T로 실제 경로 확인
AuthorizedKeysCommand외부 스크립트 출처·내용 확인
서비스·휴면 계정.ssh 생성 자체가 신호
면접 포인트"비밀번호를 바꿔도 심어진 키가 남으면 다시 들어온다"

12. 다음 편 예고

다음 편 068. 계정 · 인증 보안 — SSH 키 지문으로 접속 키 추적하기 에서는 로그에 남는 SSH 키 지문으로 접속 키를 추적하는 방법을 다룹니다.


이전 편: 066. 계정 · 인증 보안 — SSH 공개키 인증 구조와 authorized_keys 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글