権限・ユーザ・グループを扱う
한국어 원문으로 표시합니다.
목표
사용자와 그룹을 만들고, 공유 디렉터리에 필요한 특수 비트를 걸고, 권한이 기대대로인지 스스로 점검하는 스크립트까지 만듭니다.
왜 중요한가
권한 사고의 대부분은 "파일 권한"만 보고 "디렉터리 권한"을 잊어서 생깁니다. 파일을 지우는 데 필요한 것은 그 파일에 대한 쓰기 권한이 아니라 그 파일이 들어 있는 디렉터리에 대한 쓰기 권한입니다. 그래서 읽기 전용 파일도 남이 지울 수 있고, 유닉스는 그 구멍을 막으려고 sticky 비트를 따로 뒀습니다. 같은 이유로 여러 사람이 쓰는 디렉터리에는 setgid 가 필요합니다 - 안 걸면 각자 자기 기본 그룹으로 파일을 만들어 서로 못 읽는 상황이 반복됩니다.
단계
/root/secret.txt를 만들고 권한을600으로 맞추세요.student1사용자를 만드세요.devs그룹을 만들고student1을 그 그룹에 넣으세요(기존 그룹은 유지)./root/shared/report.txt를 만들고 소유자:그룹을student1:devs로 바꾸세요./root/shared디렉터리의 그룹을devs로 하고 권한을2770으로 맞추세요./root/shared/incoming디렉터리를 만들고 권한을1777로 맞추세요./root/shared/run.sh를 만들고 권한을750으로 맞추세요./root/shared/checkmode.sh <파일경로> <기대권한>을 만드세요. 실행 권한이 있어야 하고, 권한이 일치하면 종료 코드 0, 다르면 0이 아닌 코드로 끝나면서 현재 권한을 출력해야 합니다. 파일이 없을 때도 0이 아닌 코드여야 합니다.
참고
stat -c %a 파일은 8진수 권한만 출력합니다. 특수 비트가 있으면 네 자리로 나옵니다.id -nG student1로 사용자가 속한 그룹 목록을 볼 수 있습니다.- 흔한 실수 1: 3번에서
usermod -G devs student1처럼-a를 빼면 기존 보조 그룹이 전부 사라집니다. - 흔한 실수 2: 5번에서
chmod 770만 하면 앞자리 setgid 가 빠집니다. 네 자리로 지정하세요.
비밀 파일 권한 잠그기
/root/secret.txt 를 만들고 권한을 600 으로 맞추세요.
8진수 세 자리는 소유자/그룹/기타 순서입니다. 소유자만 읽고 쓸 수 있게 하려면?
사용자 만들기
student1 사용자를 만드세요.
useradd 로 만듭니다. id 명령으로 확인할 수 있습니다.
그룹 만들고 사용자 넣기
devs 그룹을 만들고 student1 을 그 그룹에 넣으세요(기존 그룹은 유지).
groupadd 로 그룹을 만들고, usermod 로 보조 그룹에 추가합니다. -a 를 빼면 기존 그룹이 날아갑니다.
소유자와 그룹 바꾸기
/root/shared/report.txt 를 만들고 소유자:그룹을 student1:devs 로 바꾸세요.
chown 은 소유자:그룹 형식을 한 번에 받습니다. 파일이 먼저 있어야 합니다.
공유 디렉터리에 setgid 걸기
/root/shared 디렉터리의 그룹을 devs 로 하고 권한을 2770 으로 맞추세요.
8진수 네 자리에서 맨 앞자리가 특수 비트입니다. 그룹 상속을 담당하는 값을 찾으세요.
업로드 디렉터리에 sticky 걸기
/root/shared/incoming 디렉터리를 만들고 권한을 1777 로 맞추세요.
/tmp 의 권한을 ls -ld 로 확인해 보세요. 같은 형태로 만들면 됩니다.
실행 스크립트 권한 정리
/root/shared/run.sh 를 만들고 권한을 750 으로 맞추세요.
소유자는 읽기·쓰기·실행, 그룹은 읽기·실행, 기타는 아무것도 없는 조합입니다.
권한 점검 스크립트 만들기
/root/shared/checkmode.sh <파일경로> <기대권한> 을 만드세요. 실행 권한이 있어야 하고, 권한이 일치하면 종료 코드 0, 다르면 0이 아닌 코드로 끝나면서 현재 권한을 출력해야 합니다. 파일이 없을 때도 0이 아닌 코드여야 합니다.
stat -c %a 로 현재 권한을 읽고 기대값과 비교하세요. 결과는 종료 코드로 알리고, 불일치일 때는 현재 권한도 함께 출력합니다.