
보안 교재로 공부하던 중, 파일시스템을 nosuid 옵션으로 마운트하면 보안이 좋아진다는 말을 믿고 멍청하게 루트 파일시스템에 nosuid를 걸어버렸습니다.
결과적으로... SSH root 로그인을 막아둔 시스템에서, 일반 사용자로 로그인했는데, su, sudo, poweroff, init ,shutdown이 전부 먹히지 않는 대환장 사태가 벌어졌습니다.
가령 systemctl poweroff로 종료를 시도하면 아래 경고가 튀어나오며 거부해버립니다.
Failed to set wall message, ignoring: Unit dbus-org.freedesktop.login1.service failed to load properly, please adjust/correct and reload service manager: File exists
Call to PowerOff failed: Unit dbus-org.freedesktop.login1.service failed to load properly, please adjust/correct and reload service manager: File exists
Failed to start poweroff.target: Interactive authentication required. See system logs and 'systemctl status poweroff.target' for details.
이 로그를 보면...
일단 dbus-org.freedesktop.login1.service 인터페이스는 보통 systemd-logind.service 유닛에 연결되어 있고, 사용자 로그인 관련 작업을 처리합니다.
그런데 이 유닛이 정상적으로 작동하지 않습니다.
그래서 poweroff.target을 직접 시작하려고 했지만 권한 인증을 요구합니다.
그런데 루트 파일시스템의 nosuid 때문에 sudo가 권한 상승을 못 하니 막혀버린 상태입니다.
원인은 단순합니다.
ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 335168 Apr 11 21:21 /usr/bin/sudo
sudo 바이너리를 보면, 소유자는 root, 권한은 보면 -rwsr-xr-x, 즉 Set-UID가 걸려있습니다.
이 설정은 다른 사용자가 sudo를 실행했을 때, 해당 프로세스를 sudo의 소유자인 root 권한으로 상승시켜 실행하게 합니다.
그런데 파일시스템에 nosuid를 설정하면 Set-UID와 Set-GID가 모두 무력화됩니다.
그래서 sudo로 뭔가 실행해도 애초에 권한 상승 단계에서 막혀버리는 것이죠.
일반 PC라면 그냥 root로 로그인해서 /etc/fstab을 수정하면 되겠지만...
제 경우는 모니터 없이 이더넷 어댑터만 연결되어 있는 헤드리스 장비였고, SSH root 로그인까지 막혀 있었습니다.
다행히도 저는 Magic SysRq로 정상 종료할 수 있었습니다.
Magic SysRq는 시스템 상태와 무관하게 커널에 바로 저수준 명령을 내릴 수 있는 키 조합입니다.
프리징 상태나, 파일시스템 손상을 피하면서 리부트할 때 사용된다고 합니다.
cat /proc/sys/kernel/sysrq
우선 /proc/sys/kernel/sysrq 파일을 확인해 Magic SysRq가 활성화되어있는지 확인해봅니다.
0은 비활성화, 1은 모든 기능 활성화, 그 외 값은 비트마스크입니다.
제 경우는 502가 나왔는데, 대충 계산해보면...
256 + 128 + 64 +32 + 16 + 4 + 2 = 502
즉 프로세스 디버깅 덤프(8)를 제외한 나머지 기능은 사용할 수 있는 상태입니다.
Alt + SysRq (Print Screen) 를 동시에 누릅니다.
그리도 동시에 누른 상태에서 r e i s u o 를 약 2초 간격으로 입력합니다.
각 키의 의미는 다음과 같습니다.
- r : 키보드 원시 모드를 종료하고 XLATE(?)로 전환합니다. 키보드 제어권을 회수한다고 보면 될 듯 합니다.
- e : init을 제외한 모든 프로세스에 SIGTERM 시그널을 보내 정상 종료시킵니다.
- i : SIGKILL을 보내 나머지 프로세스를 모두 강제 종료합니다.
- s : 마운트된 모든 파일시스템을 동기화합니다.
- u : 모든 파일시스템을 읽기 전용으로 리마운트합니다.
- o : 시스템을 종료합니다.
r e i s u b 를 사용하는 경우도 봤는데... b는 리부트하는 경우에 사용된다고 합니다.
저는 이 방법으로 시스템을 정상적으로 종료하고, 디스크만 다른 시스템에 마운트해서 정상적으로 fstab 수정까지 마칠 수 있었습니다.
하지만 SysRq라는 방식 자체는 잘 알아두면 다른 위급 상황에서도 요긴하게 사용할 수 있을듯 합니다.
그리고... nosuid는 함부로 쓰면 안된다는 교훈도 얻었구요