시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 17/50편 (전체 067/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
SSH 키 기반 지속성은 "공격자 키를 서버에 심어 비밀번호 없이 다시 들어오게" 만드는 것입니다. 심는 위치가 여러 곳이라, 한 곳만 보면 놓칩니다.
키가 숨을 수 있는 곳
① ~/.ssh/authorized_keys : 가장 흔한 위치
② sshd_config AuthorizedKeysFile : 경로 자체를 바꿔 다른 파일 사용
③ AuthorizedKeysCommand : 외부 스크립트가 키를 "생성"해 반환
④ 다른 계정의 authorized_keys : 눈에 덜 띄는 계정(서비스·휴면)
⑤ root의 authorized_keys : root 직접 접근(PermitRootLogin 설정과 함께)
이 편은 공격 방법이 아니라, 각 위치를 점검·탐지하고 키 추가를 로그인과 연결하는 데 집중합니다.
AuthorizedKeysCommand는 정상 기능(중앙 키 관리)이지만, 악용되면 파일에 흔적을 남기지 않고 키를 공급할 수 있습니다.| 점검 대상 | 명령 |
|---|---|
| 모든 계정 키 파일 | 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 (지문과 대조) |
# 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
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, 지문 기준선과 차이가 없는 상태가 정상입니다.
$ 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/ 경로를 놓쳤을 것 → 설정에서 실제 경로를 먼저 확인해야 하는 이유키 추가와 사용을 연결한 예시입니다(가상의 예시 로그).
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 | 서비스 계정 키 로그인 성공 |
| 로그 지문 = 추가된 키 지문 | 심은 키가 실제로 사용됨 → 침해 확정 |
키 추가(파일 이벤트)와 키 사용(로그인 로그)을 지문으로 연결하면 "준비"와 "실행"을 모두 증명할 수 있습니다.
.ssh 생성·키 추가는 최상위 우선순위입니다.Accepted publickey 로그와 대조해 사용 여부를 확인합니다.<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편의 키 지문 기준선과 함께 운영해, 파일 변경 + 새 지문 로그인을 묶어 확인합니다.
| 은닉 위치 | 점검 방법 |
|---|---|
| 홈 authorized_keys | find /home /root, 지문 기준선 diff |
| AuthorizedKeysFile 추가 경로 | sshd -T로 실제 경로 확인 |
| AuthorizedKeysCommand | 외부 스크립트 출처·내용 확인 |
| 서비스·휴면 계정 | .ssh 생성 자체가 신호 |
| 면접 포인트 | "비밀번호를 바꿔도 심어진 키가 남으면 다시 들어온다" |
다음 편 068. 계정 · 인증 보안 — SSH 키 지문으로 접속 키 추적하기 에서는 로그에 남는 SSH 키 지문으로 접속 키를 추적하는 방법을 다룹니다.
이전 편: 066. 계정 · 인증 보안 — SSH 공개키 인증 구조와 authorized_keys 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점