본문 바로가기
TYLER SONGBlog
← Blog index
CS학습4 min read

chmod: 파일 권한 비트를 바꿔 접근을 제어하는 명령

chmod는 리눅스·유닉스 계열 시스템에서 파일과 디렉터리의 권한 비트(permission bits)를 변경하는 명령이다. 소유자(user), 그룹(group), 기타 사용자(other) 각각에 읽기(r), 쓰기(w), 실행(x) 권한을 지정하며, 숫자(8진수) 방식과 기호(symbolic) 방식을 지원한다. 배포 스크립트 실행 권한 부여, SSH 키 보호

By 송민성

1. 개념

chmod(change mode)는 파일 또는 디렉터리의 모드(mode), 즉 접근 권한을 바꾸는 명령이다. 리눅스는 모든 파일에 대해 세 부류의 사용자에게 세 가지 권한을 따로 지정한다.

구분의미
소유자(user, u)파일을 가진 사용자
그룹(group, g)파일이 속한 그룹의 구성원
기타(other, o)위 둘에 해당하지 않는 모든 사용자
권한기호숫자파일에서의 의미디렉터리에서의 의미
읽기(read)r4내용 읽기목록 조회(ls)
쓰기(write)w2내용 수정항목 생성·삭제·이름 변경 (x와 함께 필요)
실행(execute)x1프로그램으로 실행진입(cd) 및 내부 항목 접근

ls -l로 확인하면 -rwxr-xr--처럼 10글자가 보인다. 첫 글자는 파일 종류(- 일반 파일, d 디렉터리)이고, 나머지 9글자가 소유자·그룹·기타의 rwx 세 묶음이다.

2. 왜 사용하는가

  • 다중 사용자 환경에서 누가 무엇을 할 수 있는지 제한하기 위해서다.
  • 스크립트를 실행 가능하게 만들려면 실행 권한이 필요하다.
  • 비밀 키나 설정 파일을 다른 사용자가 읽지 못하게 막아 최소 권한 원칙(principle of least privilege)을 지킬 수 있다.

3. 동작 원리

권한은 파일의 inode에 저장된 모드 값에 들어 있다. 커널은 프로세스가 파일에 접근할 때 프로세스의 유효 사용자 ID(effective UID)와 그룹 ID를 파일의 소유자·그룹과 비교해 적용할 묶음을 하나만 고른다.

  1. 프로세스의 UID가 파일 소유자와 같으면 소유자 권한만 적용한다.
  2. 아니고 그룹이 일치하면 그룹 권한만 적용한다.
  3. 둘 다 아니면 기타 권한을 적용한다.

따라서 소유자 권한이 ---이면 소유자는 그룹 권한이 열려 있어도 접근하지 못한다. 다만 root(UID 0)는 일반적으로 이 검사를 대부분 우회한다.

숫자(8진수) 방식은 각 묶음을 r=4, w=2, x=1의 합으로 계산한다.

  • rwx = 4+2+1 = 7
  • r-x = 4+0+1 = 5
  • r-- = 4

그래서 rwxr-xr--는 754다.

기호 방식은 대상 연산자 권한 형태다. 대상은 u, g, o, a(전체), 연산자는 +(추가), -(제거), =(정확히 지정)이다.

4. 코드 예제

shell
# 실습용 디렉터리와 파일 준비 mkdir -p /tmp/chmod-demo && cd /tmp/chmod-demo echo '#!/bin/sh' > run.sh echo 'echo "hello"' >> run.sh # 현재 권한 확인 (보통 -rw-r--r--) ls -l run.sh # 실행 권한이 없으므로 직접 실행하면 실패한다 ./run.sh # Permission denied # 기호 방식: 소유자에게 실행 권한 추가 chmod u+x run.sh ls -l run.sh ./run.sh # hello # 숫자 방식: 소유자 rwx, 그룹 r-x, 기타 r-- chmod 754 run.sh ls -l run.sh # -rwxr-xr-- # 기타 사용자의 모든 권한 제거 chmod o-rwx run.sh ls -l run.sh # -rwxr-x--- # 모든 대상에게 정확히 읽기만 허용 chmod a=r run.sh ls -l run.sh # -r--r--r-- # 디렉터리 재귀 변경: 대문자 X는 디렉터리 또는 이미 실행 가능한 파일에만 x를 부여 mkdir -p site/css && touch site/index.html site/css/app.css chmod -R u=rwX,go=rX site ls -lR site

5. 시간 복잡도 또는 성능 특성

단일 파일에 대한 chmod는 inode의 모드 값을 갱신하는 작업이라 파일 내용의 크기와 무관하다. 반면 -R 옵션은 하위 항목을 모두 순회하며 각각 변경하므로 처리 시간이 대상 파일·디렉터리 개수에 비례한다.

6. 실무 사용 사례

  • 배포·빌드 스크립트에 실행 권한 부여: chmod +x deploy.sh
  • SSH 개인 키 보호: chmod 600 ~/.ssh/id_ed25519 (OpenSSH는 권한이 너무 열려 있으면 키 사용을 거부한다)
  • ~/.ssh 디렉터리: chmod 700 ~/.ssh
  • 웹 서버 정적 파일: 디렉터리 755, 파일 644가 흔한 기준이다.
  • 환경 변수 파일(.env) 보호: chmod 600 .env
  • Git은 파일의 실행 비트를 추적하므로 git update-index --chmod=+x script.sh로 저장소에 기록할 수 있다.

7. 주의할 점

  • chmod 777은 모두에게 쓰기·실행을 허용하므로 권한 오류의 임시방편으로 쓰지 않는다. 원인(소유자, 그룹, 경로 상위 디렉터리 권한)을 먼저 확인한다.
  • chmod -R 644 dir처럼 디렉터리에 x 없이 적용하면 디렉터리에 진입하지 못하게 된다. 파일과 디렉터리를 find로 구분하거나 X를 사용한다.

``shell find site -type d -exec chmod 755 {} + find site -type f -exec chmod 644 {} + ``

  • 파일 자체의 권한이 열려 있어도 상위 디렉터리에 x가 없으면 그 파일에 접근할 수 없다.
  • chmod는 파일 소유자 또는 root만 실행할 수 있다.
  • 심볼릭 링크 자체가 아니라 링크가 가리키는 대상의 권한이 바뀐다.
  • 루트 디렉터리(/) 같은 시스템 경로에 -R을 쓰면 시스템이 망가질 수 있으므로 경로를 반드시 확인한다.
  • setuid, setgid, sticky bit 같은 특수 권한은 chmod 4755처럼 네 자리 숫자 또는 u+s로 설정하는데, 보안에 영향이 크므로 필요한 경우에만 쓴다.

8. 핵심 정리

  • chmod는 소유자·그룹·기타에 대한 읽기(r=4)·쓰기(w=2)·실행(x=1) 권한을 변경한다.
  • 숫자 방식(754)과 기호 방식(u+x, go-w, a=r)을 모두 읽고 쓸 수 있어야 한다.
  • 커널은 소유자 → 그룹 → 기타 순으로 하나의 묶음만 골라 적용한다.
  • 디렉터리의 x는 "진입 가능"을 뜻하며, 재귀 변경 시 파일과 디렉터리를 구분해야 한다.
  • 최소 권한 원칙에 따라 필요한 권한만 부여하고, 777은 피한다.