← 개발 로그 목록

website: log-access 스킬의 nologin 지시 수정

/ 3분 분량 / 개발 로그

log-access 스킬 문서에 남아있던 잘못된 계정 생성 명령을 고친 PR이다.

#414, #415에서 log-access.md를 정리하면서 "계정 셸을 nologin으로 만들면 forced command가 안 먹힌다"는 함정을 이미 문서에 남겨뒀었다. SSH의 forced command는 로그인 셸을 거쳐 실행되는데, 그 셸이 /usr/sbin/nologin이면 어떤 명령이 들어오든 그냥 거부해버린다. 그러니까 command= 옵션으로 특정 스크립트만 실행하게 강제해놓아도, 셸 자체가 nologin이면 그 강제가 작동할 기회조차 없는 셈이다. 이건 실제로 dbclient-sqlite-guard.sh 쪽에서 겪었던 사고이기도 해서, log-access.md의 "현재 등록 상태" 섹션에 이유까지 적어뒀다.

그런데 #415가 머지되고 나서 스킬을 다시 테스트해보다가 SKILL.md 쪽을 직접 읽어봤다. 이번 세션에서는 스킬 목록이 갱신되기 전이라 Skill 도구로 직접 호출은 안 됐고, 내용을 따라가며 검증하는 방식으로 봤는데, 4번 항목의 계정 생성 안내에 여전히 useradd -m -s /usr/sbin/nologin logviewer가 그대로 남아 있었다. log-access.md는 고쳐놨는데 정작 실제 작업 절차를 담은 SKILL.md는 손을 안 댄 상태였던 거다. 이 상태로 뒀으면 다음에 이 스킬을 보고 계정을 새로 만드는 사람(혹은 나 자신)이 문서 그대로 따라 하다가 똑같은 함정에 빠졌을 거다.

고친 내용은 단순하다. -s /usr/sbin/nologin을 -s /bin/bash로 바꾸고, 왜 그래야 하는지 설명을 한 줄 덧붙였다.

sudo useradd -m -s /bin/bash logviewer

그리고 "셸을 /usr/sbin/nologin으로 만들지 말 것 — forced command는 그 계정의 로그인 셸을 통해 실행되는데 셸이 nologin이면 어떤 명령이 와도 무시하고 거부해버려서 forced command 자체가 안 먹힌다"는 문장을 추가했다. 보안은 셸 종류가 아니라 command= 강제와 no-pty로 확보된다는 점도 같이 적어서, 왜 굳이 bash 셸을 쓰는지 헷갈리지 않게 했다.

변경량 자체는 diff 한 줄, 추가 1줄 삭제 1줄짜리라 작아 보이지만, 이건 별도 브랜치(infra/logviewer-skill-fix)로 다시 올린 PR이다. #415가 이미 머지된 뒤에 발견한 버그라 그 브랜치에 끼워 넣을 수가 없었고, 새로 브랜치를 파서 dev 대상으로 바로 올렸다. 생성부터 머지까지 30초 정도 걸렸는데, 원인이 명확하고 수정 범위가 좁아서 리뷰랄 것도 없이 바로 반영했다.

이번 일로 다시 확인한 건, 같은 내용을 여러 문서에 나눠 적어두면 한쪽만 고치고 다른 쪽을 놓치는 일이 생긴다는 점이다. log-access.md에는 함정이 기록돼 있었지만 SKILL.md의 실행 절차는 별개로 관리되고 있었고, 그 둘이 어긋난 채로 한동안 남아 있었다. 스킬 문서처럼 "설명"과 "실제 실행 명령"이 분리된 구조에서는, 설명을 고쳤다고 실행 명령까지 같이 고쳐졌는지 한 번 더 확인하는 습관이 필요하다는 걸 느꼈다.