chmod 권한 계산기
권한을 체크해 chmod 8진수·심볼릭·명령어 생성
체크박스를 누르거나 8진수·심볼릭 값을 입력하면 나머지가 자동으로 맞춰집니다.
| — | 읽기 (r) | 쓰기 (w) | 실행 (x) |
|---|---|---|---|
| 소유자 (u) | |||
| 그룹 (g) | |||
| 기타 (o) |
권한 요약
umask 계산
새 파일은 666, 새 디렉터리는 777에서 umask 비트를 뺀 권한으로 만들어집니다.
처리 중…
0.0
멈춘 것이 아닙니다. 계산이 끝나면 결과가 표시됩니다.
chmod 권한 계산기 소개
이 도구는 유닉스 파일 권한을 세 가지 표기로 오가며 보여 줍니다. 755 같은 8진수, ls -l에 찍히는 rwxr-xr-x 같은 기호, 그리고 체크박스로 켜고 끄는 개별 비트입니다. 네 자리 8진수(4755, 1777)를 넣으면 맨 앞 자리를 setuid·setgid·sticky 특수 비트로 읽고, ls -l 결과를 파일 종류 문자까지 통째로(-rwsr-xr-x) 붙여 넣어도 됩니다.
권한 숫자는 외우는 것보다 계산 원리를 알아 두는 편이 빠릅니다. 아래에서는 8진수가 만들어지는 방식, 특수 비트가 기호에서 s·t·S·T로 바뀌는 규칙, 777이 왜 문제인지, 새 파일의 기본 권한을 정하는 umask를 다룹니다.
8진수 한 자리 = 비트 세 개
읽기 r=4, 쓰기 w=2, 실행 x=1을 더한 값이 한 자리입니다. 7=rwx, 6=rw-, 5=r-x, 4=r--. 세 자리는 앞에서부터 소유자, 그룹, 그 외 사용자입니다. 그래서 755는 「소유자는 모두, 나머지는 읽기와 실행」, 640은 「소유자 읽기·쓰기, 그룹 읽기, 그 외 없음」입니다.
8진수를 쓰는 이유는 비트 세 개가 정확히 8진수 한 자리에 들어가기 때문입니다. 10진수로 착각하면 안 됩니다. chmod 755는 이진수로 111 101 101이지 10진수 755가 아닙니다. 스크립트 언어에서 권한을 숫자로 넘길 때 0o755(파이썬)나 0755(C, 펄)처럼 8진수 표기를 빠뜨리면 전혀 다른 권한이 들어갑니다. 10진수 755는 8진수로 1363이라 sticky 비트가 켜진 이상한 권한이 됩니다.
디렉터리에서는 r·w·x의 뜻이 다르다
디렉터리의 r은 안에 든 이름 목록을 읽는 권한, w는 그 안에 파일을 만들고 지우고 이름을 바꾸는 권한, x는 그 디렉터리를 경로로 통과하는 권한입니다. x 없이 r만 있으면 ls로 이름은 보이지만 파일을 열 수 없고, x만 있으면 이름을 정확히 알 때만 열 수 있습니다.
파일을 지울 수 있는지는 파일 자신의 권한이 아니라 그 파일이 든 디렉터리의 w로 정해집니다. 읽기 전용(444) 파일이라도 디렉터리에 쓰기 권한이 있으면 삭제할 수 있다는 뜻입니다. 이것을 막는 장치가 뒤에 나오는 sticky 비트입니다.
특수 비트: setuid 4, setgid 2, sticky 1
네 자리 권한의 맨 앞 자리는 특수 비트입니다. 기호 표기에서는 따로 칸이 없고 해당 대상의 실행 자리를 바꿔 씁니다. 실행 비트가 함께 켜져 있으면 소문자(s, t), 꺼져 있으면 대문자(S, T)입니다. 대문자는 대개 설정 실수의 신호입니다. 예를 들어 4644는 rwSr--r--인데, 실행할 수 없는 파일에 setuid를 걸어 봐야 아무 효과가 없습니다.
- setuid(4000): 실행 파일을 실행한 사람이 아니라 파일 소유자의 권한으로 돌게 합니다. 일반 사용자가 /etc/shadow를 고쳐야 하는 passwd 명령이 root 소유 setuid(-rwsr-xr-x)인 이유입니다. 리눅스는 셸 스크립트 같은 인터프리터 스크립트의 setuid는 무시합니다.
- setgid(2000): 파일에서는 그룹 권한으로 실행하게 하고, 디렉터리에서는 그 안에 새로 만든 파일이 디렉터리의 그룹을 물려받게 합니다. 여러 사람이 쓰는 공유 폴더에 2775나 2770을 주는 이유입니다.
- sticky(1000): 디렉터리에 걸면, 쓰기 권한이 있어도 파일 소유자(또는 디렉터리 소유자, root)만 그 파일을 지우거나 이름을 바꿀 수 있습니다. 누구나 쓰는 /tmp가 1777(drwxrwxrwt)인 이유입니다.
777을 주면 무엇이 열리나
「권한 오류가 나서 777로 바꿨더니 된다」는 흔한 해결책이지만, 실제로는 그 서버의 모든 계정과 모든 프로세스에 쓰기를 허용한 것입니다. 웹 서버 업로드 폴더가 777이면 같은 서버의 다른 사이트나 취약한 플러그인이 그 폴더에 실행 가능한 스크립트를 떨굴 수 있고, 설정 파일이 666이나 777이면 비밀번호가 든 파일을 누구나 고칠 수 있습니다.
권한 오류의 원인은 대부분 「그 외」 권한이 부족해서가 아니라 소유자나 그룹이 맞지 않아서입니다. 웹 서버 프로세스(www-data, nginx 등)가 써야 하는 폴더라면 chown으로 그룹을 맞추고 775(또는 setgid를 더한 2775)를 주는 것이 보통의 답입니다. SSH는 아예 권한이 느슨하면 동작을 거부합니다. 개인 키 파일이 600보다 넓으면 ssh가 키 사용을 거절하는 것이 대표적입니다.
umask: 새 파일의 권한은 빼기가 아니라 가리기
새로 만든 파일의 권한은 프로그램이 요청한 값(보통 파일 666, 디렉터리 777)에서 umask에 켜진 비트를 끈 결과입니다. umask 022면 파일 644, 디렉터리 755가 됩니다. 계산은 빼기처럼 보이지만 실제로는 비트 마스크(요청값 AND NOT umask)라서, 빼기로 계산하면 틀리는 경우가 있습니다. umask 033으로 파일을 만들면 666−033=633이 아니라 644입니다. 원래 꺼져 있던 실행 비트는 더 끌 것이 없기 때문입니다.
도구 아래쪽의 「umask 계산」 칸에 umask(예: 022, 0027)를 넣으면 새 파일(666 기준)과 새 디렉터리(777 기준)의 권한을 8진수와 rwx로 바로 보여 줍니다. 또 umask는 새로 만들 때만 작용하므로, 이미 있는 파일의 권한은 chmod로 따로 바꿔야 합니다.
예시
일반적인 실행 파일
- 입력
755- 결과
rwxr-xr-x / 0755
7=4+2+1, 5=4+1. 소유자만 수정하고 모두가 실행할 수 있는 스크립트나 공개 디렉터리의 기본값입니다.
passwd 명령
- 입력
-rwsr-xr-x- 결과
4755
소유자 실행 자리의 s는 setuid+실행입니다. 파일 종류 문자(-)는 무시하고 읽습니다.
/tmp 디렉터리
- 입력
1777- 결과
rwxrwxrwt
모두 쓸 수 있지만 t(sticky) 덕분에 남의 파일은 지울 수 없습니다.
대문자 S가 뜨는 경우
- 입력
4644- 결과
rwSr--r--
실행 비트 없이 setuid만 켜졌습니다. 효과가 없는 설정이므로 보통은 실수입니다.
umask 계산
- 입력
요청 666, umask 027- 결과
640 (rw-r-----)
그룹의 w(2), 그 외의 rwx(7)를 끕니다. 디렉터리(777)라면 750이 됩니다.
사용 방법
- 8진수(755, 4755)나 기호(rwxr-xr-x, ls -l 한 줄의 앞부분)를 입력합니다.
- 체크박스로 개별 비트를 켜고 끄면 두 표기가 함께 바뀝니다.
- 만들어진 chmod 명령을 복사해 씁니다.
자주 묻는 질문
chmod 777을 하면 안 되는 이유는?
그 파일이나 폴더를 서버의 모든 계정과 프로세스가 수정할 수 있게 됩니다. 대부분은 소유자·그룹을 맞추고 755나 775로 해결됩니다.
ls -l에 대문자 S나 T가 보여요.
setuid·setgid 또는 sticky는 켜져 있는데 그 자리의 실행 비트가 꺼진 상태입니다. 파일의 S는 대개 효과가 없는 설정입니다.
SSH 키 파일은 몇으로 해야 하나요?
개인 키는 600(rw-------)이 일반적입니다. 권한이 더 넓으면 ssh가 키를 쓰지 않습니다.
644와 0644는 다른가요?
같습니다. 앞의 0은 특수 비트가 없다는 뜻이며, 이 도구도 세 자리와 네 자리를 모두 받습니다.
umask 022인데 새 파일에 실행 권한이 없어요.
대부분의 프로그램은 일반 파일을 666으로 요청하므로 umask를 거치면 644가 됩니다. 실행 권한은 chmod +x로 따로 줘야 합니다.
출처
- POSIX chmod utility (The Open Group)
- POSIX umask utility (The Open Group)
- inode(7) – Linux manual page (file type and mode)
기준일: