And Brain said,

리눅스 파일 및 디렉토리 권한 완벽 가이드 본문

IT/Linux

리눅스 파일 및 디렉토리 권한 완벽 가이드

The Man 2025. 2. 6. 16:34
반응형

 

리눅스에서 파일과 디렉터리의 권한을 이해하는 것은 보안 및 시스템 관리를 위해 매우 중요합니다. 여기서는 **파일 권한, chmod, chown, umask, mask, 특수 권한(SUID, SGID, Sticky Bit)**까지 알아보도록 하겠습니다.


리눅스 파일 권한 개념

리눅스에서는 파일 및 디렉터리에 대한 접근 권한을 제어할 수 있으며, 권한은 **소유자(Owner), 그룹(Group), 기타(Others)**로 구분됩니다.

권한 종류

각 사용자(소유자, 그룹, 기타)에게 부여할 수 있는 권한은 다음과 같습니다:

 

권한 기호 8진수 설명
읽기 r 4 파일 내용을 읽을 수 있음 (cat, less 가능)
쓰기 w 2 파일을 수정할 수 있음 (echo "text" > file 가능)
실행 x 1 파일을 실행할 수 있음 (./script.sh 실행 가능)

 

파일 권한 구조 (ls -l 예제)

ls -l /etc/passwd

 

출력 예시:

-rw-r--r-- 1 root root 1234 Feb 6 12:00 /etc/passwd

 

해석

  1. -rw-r--r--
    • rw- → 소유자(root)는 읽기(r) + 쓰기(w) 가능
    • r-- → 그룹(root)은 읽기(r)만 가능
    • r-- → 기타 사용자는 읽기(r)만 가능
  2. 1 → 링크 개수
  3. root root → 소유자와 그룹
  4. 1234 → 파일 크기
  5. Feb 6 12:00 → 최근 수정 날짜
  6. /etc/passwd → 파일 이름

chmod – 파일 권한 변경

기호 방식 (ugoa 사용)

chmod u+x script.sh  # 소유자(Owner)에게 실행 권한 추가
chmod g-w file.txt   # 그룹에서 쓰기 권한 제거
chmod o-r file.txt   # 기타 사용자에서 읽기 권한 제거
chmod u+rwx,g+rw,o-rwx file.txt  # 소유자: `rwx`, 그룹: `rw`, 기타 사용자: 없음

8진수 방식 (chmod 755 등)

리눅스에서는 권한을 **8진수(Octal)**로 표현할 수도 있습니다.

chmod 755 script.sh

 

소유자(Owner) 그룹(Group) 기타(Others)
rwx (읽기, 쓰기, 실행) r-x (읽기, 실행) r-x (읽기, 실행)

 

주요 권한 예시

chmod 777 file    # 모든 사용자에게 모든 권한 부여 (보안 취약)
chmod 644 file    # 소유자는 읽기/쓰기, 그룹과 기타 사용자는 읽기만 가능
chmod 600 file    # 소유자만 읽기/쓰기 가능, 나머지는 접근 불가
chmod 400 file    # 소유자만 읽기 가능, 나머지는 접근 불가

 

주요 옵션

옵션 설명
-R 디렉터리와 하위 파일/디렉터리에 대해 재귀적으로 권한 변경
-v 변경된 권한을 상세하게 출력 (verbose)
-c 변경이 발생한 경우에만 출력
-f 에러 메시지를 출력하지 않음 (quiet mode)
--reference=<file> 지정한 파일의 권한을 다른 파일에 적용
--preserve-root 루트 디렉터리(/)에 대해 재귀적 변경을 방지
--recursive -R과 동일 (디렉터리와 하위 항목 포함)
--silent -f와 동일 (출력 억제)
--verbose -v와 동일 (변경된 권한 출력)

 


chown – 파일 소유자 변경

chown user1 file.txt  # 파일의 소유자를 user1로 변경
chown user1:group1 file.txt  # 파일 소유자를 user1, 그룹을 group1로 변경
chown :group2 file.txt  # 그룹만 변경

 

ex)

ls -l file.txt
-rw-r--r-- 1 root root 1234 Feb 6 12:00 file.txt

chown user1 file.txt
ls -l file.txt
-rw-r--r-- 1 user1 root 1234 Feb 6 12:00 file.txt

 

주요 옵션

옵션 설명
-R 디렉터리 및 하위 파일/디렉터리의 소유권을 재귀적으로 변경
-v 변경된 내용 출력 (verbose)
-c 변경된 경우에만 출력
-f 오류 메시지를 출력하지 않음
--dereference 심볼릭 링크를 따라가서 실제 파일의 소유권을 변경
--no-dereference 심볼릭 링크 자체의 소유권을 변경
--reference=<file> 지정한 파일의 소유자와 그룹을 다른 파일에 적용
--from=<old-owner> 기존 소유자가 특정 사용자일 경우에만 변경
--preserve-root /(루트 디렉터리) 보호 (재귀 변경 방지)
--recursive -R과 동일 (디렉터리 포함)

 

umask – 기본 파일 권한 설정 

파일을 새로 생성할 때 적용되는 기본 권한을 설정하는 값이 umask입니다. 이는 파일이나 디렉터리가 생성될 때 자동으로 부여되는 권한을 제한하는 역할을 합니다.

기본적으로 파일과 디렉터리는 어떤 권한을 가질까?

리눅스에서는 새로운 파일과 디렉터리를 생성할 때 기본적으로 다음과 같은 권한이 주어집니다:

  • 파일: 666 (rw-rw-rw-) → 기본적으로 모든 사용자에게 읽기와 쓰기 권한이 있음
  • 디렉터리: 777 (rwxrwxrwx) → 기본적으로 모든 사용자에게 읽기, 쓰기, 실행 권한이 있음

하지만 이렇게 하면 보안에 취약하기 때문에, 시스템에서는 umask 값을 이용해 기본 권한에서 특정 권한을 제한합니다.


umask 값이 적용되는 방식

umask는 기본 권한에서 해당 값을 빼는 방식으로 동작합니다. 즉, umask 값이 클수록 더 많은 권한이 제거됩니다.

예제 1: umask 값이 0022일 때

umask 0022
  • 파일 생성 시: 기본 666 → 666 - 022 = 644 (rw-r--r--)
  • 디렉터리 생성 시: 기본 777 → 777 - 022 = 755 (rwxr-xr-x)

예제 2: umask 값이 0077일 때

umask 0077
  • 파일 생성 시: 기본 666 → 666 - 077 = 600 (rw-------) (소유자만 접근 가능)
  • 디렉터리 생성 시: 기본 777 → 777 - 077 = 700 (rwx------) (소유자만 접근 가능)

이처럼 umask 값이 크면 클수록, 파일과 디렉터리에 대한 접근 제한이 강화됩니다.


현재 umask 값 확인 및 변경 방법

현재 umask 값 확인

umask

 

ex)

 

0022

 

대부분의 리눅스 시스템은 여러분들이 직접 건드리지 않았다면 umask 값이 기본적으로 0022로 설정되어있으실겁니다.

 

일시적으로 umask 값 변경

터미널에서 다음 명령어를 입력하면 현재 세션에서만 적용됩니다.

umask 0027  # 파일 640, 디렉터리 750으로 제한

하지만 터미널을 종료하면 기본 설정으로 돌아갑니다.

 

영구적으로 umask 값 변경

사용자 단위에서 영구적으로 적용하려면 ~/.bashrc 또는 ~/.profile 파일에 추가합니다.

echo 'umask 0027' >> ~/.bashrc
source ~/.bashrc

시스템 전체에 적용하려면 /etc/profile 또는 /etc/bash.bashrc에 추가해야 합니다.

echo 'umask 0027' >> /etc/profile
source /etc/profile

주의: 시스템 전체 설정을 변경하는것은 조심스럽게 진행하시기 바랍니다.


umask 값별 권한 예시

0000 666 (rw-rw-rw-) 777 (rwxrwxrwx) 모든 사용자에게 모든 권한 (보안 취약)
0022 644 (rw-r--r--) 755 (rwxr-xr-x) 일반적인 기본값 (보안 적절)
0077 600 (rw-------) 700 (rwx------) 소유자만 접근 가능 (보안 강화)
0027 640 (rw-r-----) 750 (rwxr-x---) 그룹만 읽기 가능, 기타 사용자는 접근 불가

특정 디렉터리에만 다른 umask 값 적용하기

umask는 기본적으로 사용자 전체에 적용되지만, 특정 디렉터리에서만 다르게 설정하는 방법도 있습니다.

특정 디렉터리에서 자동으로 umask 변경

다음과 같이 .bashrc 파일을 수정하면 특정 디렉터리에 들어갔을 때만 umask가 바뀌도록 할 수 있습니다.

echo 'if [[ $PWD == "/home/user/secure_dir" ]]; then umask 0077; else umask 0022; fi' >> ~/.bashrc
source ~/.bashrc

이제 /home/user/secure_dir 안에서는 umask 0077이 적용되고, 다른 디렉터리에서는 기존 값(0022)이 유지됩니다.

ACL을 이용해 강제 적용

만약 특정 디렉터리 내부에서 생성되는 모든 파일에 대해 강제적으로 특정 권한을 적용하고 싶다면 ACL을 사용할 수 있습니다.

setfacl -d -m u::rwX,g::rX,o::--- /home/user/secure_dir

이렇게 하면 secure_dir 안에서 생성된 모든 파일이 자동으로 640, 디렉터리는 750 권한을 가지게 됩니다.


사실 umask를 몰라도 보안은 유지됩니다.

많은 사람들이 umask를 직접 설정하지 않고도 보안을 유지할 수 있었던 이유는 대부분의 리눅스 배포판이 기본적으로 umask 0022를 설정해 두었기 때문입니다. 하지만 보안이 중요한 환경에서는 umask 값을 조정해 더 강화된 설정을 적용하는 것이 좋습니다.


특수 권한(SUID, SGID, Sticky Bit)

리눅스에서는 추가적인 보안 제어를 위한 특수 권한이 있습니다.

 

특수 권한 8진수 설명
SUID (Set User ID) 4xxx 실행 시 파일의 소유자 권한으로 동작 (예: passwd 명령)
SGID (Set Group ID) 2xxx 실행 시 파일의 그룹 권한 유지 (예: 공유 디렉터리)
Sticky Bit 1xxx 디렉터리 내에서 소유자만 파일 삭제 가능 (/tmp 보안)

 

ex)

chmod 4755 /usr/bin/passwd  # SUID 설정 (4xxx)
chmod 2755 /shared_dir       # SGID 설정 (2xxx)
chmod 1777 /tmp             # Sticky Bit 설정 (1xxx)

 

반응형
Comments