|
|
adduser는 시스템 계정을 추가하는 root 권한 명령입니다.
웹호스팅에서 사용자가 웹페이지(폼)로 계정 신청 → CGI 스크립트 실행 → 시스템 계정 생성.
그런데 CGI 스크립트는 일반적으로 웹 서버 권한(www-data, apache, nobody)으로 실행됩니다.
일반 권한으로는 adduser를 직접 실행할 수 없습니다.
2. root 권한 명령을 웹에서 실행하는 방법 (1) SUID(Super User ID) 방식
특정 실행 파일에 SUID 비트(chmod u+s /path/to/program)를 설정하면 **해당 파일이 실행될 때 소유자 권한(root)**으로 실행됩니다.
예: /usr/sbin/adduser가 root 소유 & SUID 설정 → CGI에서 호출 가능.
문제점: 보안상 위험이 매우 높음. 웹에서 입력값 검증 안 하면 바로 루트 권한 탈취 가능.
(2) sudo를 통한 제한 실행
/etc/sudoers에 CGI 스크립트에서 특정 명령만 root로 실행 가능하도록 허용.
www-data ALL=(ALL) NOPASSWD: /usr/sbin/adduser
CGI에서:
sudo /usr/sbin/adduser newuser
이렇게 하면 www-data 권한에서 CGI가 실행되더라도 특정 명령만 root로 실행 가능.
실제 상용 호스팅에서 가장 많이 쓰이는 방식입니다.
(3) 중간 데몬/백그라운드 서비스 방식
웹에서 계정 신청 → 일반 권한 CGI가 DB나 큐에 신청 기록 저장.
**root 권한을 가진 백그라운드 서비스(데몬)**가 주기적으로 확인 후 adduser 실행.
이 방식은 보안과 안정성이 가장 높습니다. 직접 웹에서 root 명령을 안 실행하므로 취약점이 적음.
3. CGI와 연동되는 구조
사용자가 웹 폼 제출 → CGI 스크립트 실행
CGI 스크립트:
입력값 검증
계정 신청 정보를 DB/파일/큐에 기록
필요시 sudo adduser ... 호출
시스템에서 실제 adduser 수행 → 홈 디렉토리, 쉘, 초기 권한 생성
웹에 계정 생성 완료 상태 표시
중요: 직접 CGI에서 root 권한을 가지게 하는 방식은 거의 쓰지 않고, 보통은 sudo 제한 또는 데몬 방식을 씁니다.
원하면 제가 간단한 CGI + sudo + adduser 예제 코드 구조도 만들어서 보여드릴 수 있어요.
혹시 그걸 원하시나요?
비슷해 보이지만 **웹호스팅에서 계정 생성에 쓰는 방식은 대부분 setuid와 “비슷한 개념이지만 직접적 setuid 사용은 거의 하지 않는다”**고 이해하면 정확합니다.
아래에 setuid 방식과 실제 웹호스팅에서 쓰는 방식의 차이를 비교해 드릴게요.
✔ 1. setuid 방식이란?
실행 파일에 SUID 비트(chmod u+s)를 주면
→ 실행하는 사용자가 누구든, 파일 소유자의 권한(root) 으로 실행됩니다.
예: /usr/sbin/passwd는 일반 사용자가 실행해도 root 권한으로 작동함.
보안 위험이 크기 때문에 setuid 프로그램은 매우 제한됨.
✔ 2. “웹에서 adduser를 실행하는 방식” = setuid 방식과 원리는 유사하지만 실제로는 잘 안 씀
CGI에서 root 권한 명령을 실행해야 하므로
→ 이론적으로 adduser를 SUID로 만들면 CGI에서도 root로 실행됨.
하지만 실제로는 절대 이렇게 하지 않습니다.
왜냐하면:
CGI 입력값이 조금만 잘못 검증되면 바로 root 탈취(100% 해킹)
adduser, useradd는 setuid 사용을 전제로 만든 프로그램이 아님
리눅스 배포판에서도 보안 문제 때문에 금지하는 방식
그래서 setuid 방식은 개념은 같지만, 실제로는 사용하지 않는 매우 위험한 방식이라고 보시면 됩니다.
✔ 3. 그럼 실제로 웹호스팅은 어떻게 root 명령을 실행하나? (1) sudoers를 이용한 제한된 root 실행 (가장 많이 사용)
예:
www-data ALL=(root) NOPASSWD: /usr/sbin/adduser
CGI에서:
sudo /usr/sbin/adduser 계정명
➡ setuid처럼 root로 실행되지만
sudoers에 지정된 명령만 root 실행 가능하도록 제한되어 훨씬 안전함.
(2) root 데몬/백엔드 서비스 방식 (대형 서비스)
CGI는 사용자 입력을 DB 또는 파일에 저장
root 권한 데몬이 주기적으로 or 이벤트 기반으로 생성 처리
➡ 웹에서 바로 root 명령을 실행하지 않기 때문에 보안이 훨씬 뛰어남.
✔ 결론 ❗ 질문: “setuid와 똑같은 방식인가?”
→ 원리는 비슷하지만 실제 웹호스팅에서는 setuid 방식은 거의 사용하지 않으며, sudoers 또는 root 데몬 방식이 사용된다.
이유:
setuid는 지나치게 위험하고 해킹에 취약
sudoers 및 백엔드 데몬 방식이 안전
원하시면
CGI와 sudo를 이용한 실제 계정 생성 흐름
또는 간단한 예제 코드
도 만들어드릴까요?