기타 Lobsters · 2일 전

리눅스 필수 명령어 sudo, 파이썬으로 직접 만들어보며 알아보는 원리

핵심 요약
  • 리눅스에서 관리자 권한을 빌려 실행하는 핵심 명령어 sudo의 작동 원리를 파이썬 코드로 직접 구현해 검증했습니다.
  • sudo가 특수한 커널 전용 시스템 콜이 아니라 파일 권한 시스템의 특정 비트(setuid)와 UID 체계를 활용한다는 점을 짚었습니다.
  • Real UID, Effective UID, Saved set-user-ID의 차이와 `execvp`, `setuid` 계열 함수의 권한 관리 동작 과정을 분석했습니다.
요약 리눅스나 유닉스 환경에서 시스템 관리자 권한으로 명령어를 실행할 때 필수적으로 사용하는 명령어 'sudo'의 작동 원리를 파이썬 코드로 직접 구현해보며 파헤친 기술 글입니다. 흔히 sudo가 커널 깊숙한 곳에 특별히 구현된 시스템 콜을 사용할 것이라 생각하기 쉽지만, 사실은 파일 권한에 포함된 특정 설정 덕분에 구현될 수 있습니다. 작성자는 먼저 현재 프로세스를 실행 중인 사용자의 UID와 이름을 출력하는 간단한 테스트 스크립트(`say_hello.py`)를 준비한 뒤, 새로운 프로세스를 생성하지 않고 현재 프로세스를 대체해 실행하는 `os.execvp` 함수를 이용해 기본 실행 래퍼(`mysudo.py`)를 제작했습니다. 핵심 질문은 '일반 사용자가 어떻게 루트(root, UID 0) 권한을 획득하는가'입니다. 유닉스 시스템에는 실제 사용자 ID(real UID), 파일 접근 권한을 결정하는 유효 사용자 ID(effective UID), 그리고 저장된 세트 사용자 ID(saved set-user-ID)라는 세 가지 중요한 UID가 존재합니다. 루트 권한으로 실행 중인 프로세스는 `setuid`나 `seteuid`를 통해 다른 사용자로 권한을 낮췄다가 다시 루트로 복귀하는 작업이 가능하지만, 일반 사용자가 시작한 프로세스는 임의로 UID를 0으로 올릴 권한이 없어 단순 호출 시 PermissionError가 발생합니다. 글은 일반 사용자가 실행한 프로그램이 루트 권한을 얻는 비밀이 결국 파일 권한의 세트유저아이디(setuid) 비트와 유닉스의 세 가지 UID 관리 구조에 있음을 설명하며, 복잡한 커널 전용 기능 없이도 OS 권한 체계의 원리만으로 sudo의 핵심 권한 상승 기능이 동작함을 보여줍니다.
Sponsored · 광고