Red Hat Enterprise Linux 에서 파일 액세스 제어

Red Hat Enterprise LinuxBeginner
지금 연습하기

소개

이 실습에서는 RHEL 관리자에게 필수적인 기술인 Linux 파일 시스템 권한 관리에 대한 포괄적인 이해를 얻게 됩니다. ls -l을 사용하여 파일 권한을 해석하고, chmod 명령어를 사용하여 기호 모드와 8 진수 모드로 권한을 수정하며, chown 명령어를 사용하여 파일 소유권을 변경하는 방법을 배우게 됩니다. 또한, SUID, SGID, Sticky Bit 와 같은 특수 권한을 탐색하고 적용하며, umask를 사용하여 기본 권한을 효과적으로 구성하는 방법을 학습합니다. 이 실습을 통해 Linux 환경에서 파일 및 디렉토리에 대한 액세스를 보안하고 제어하는 데 필요한 지식을 습득하게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 82%입니다.학습자들로부터 99%의 긍정적인 리뷰율을 받았습니다.

ls -l 명령어로 Linux 파일 시스템 권한 해석

이 단계에서는 ls -l 명령어를 사용하여 Linux 파일 시스템 권한을 해석하는 방법을 배웁니다. Linux 환경에서 파일 및 디렉토리에 대한 액세스를 관리하려면 파일 권한을 이해하는 것이 중요합니다.

Linux 의 모든 파일과 디렉토리는 읽기, 쓰기 또는 실행 권한을 결정하는 권한이 연관되어 있습니다. 이러한 권한은 세 가지 범주로 나뉩니다.

  • 소유자 (User): 파일 소유자의 권한.
  • 그룹 (Group): 파일의 그룹 구성원인 사용자의 권한.
  • 기타 (Others): 시스템의 다른 모든 사용자의 권한.

각 범주는 세 가지 유형의 권한을 가질 수 있습니다.

  • 읽기 (r): 파일 내용을 보고 또는 디렉토리 내용을 나열할 수 있습니다.
  • 쓰기 (w): 파일 내용을 수정하거나 디렉토리 내에서 파일을 생성/삭제할 수 있습니다.
  • 실행 (x): 실행 파일을 실행하거나 디렉토리에 들어갈 수 있습니다.

먼저 ~/project 디렉토리 내에 새 디렉토리와 파일을 만들어 기본 권한을 관찰해 보겠습니다.

먼저 my_files라는 디렉토리를 만듭니다.

mkdir ~/project/my_files

다음으로 my_files 디렉토리 내에 document.txt라는 빈 파일을 만듭니다.

touch ~/project/my_files/document.txt

이제 ls -l 명령어를 사용하여 document.txt 파일의 자세한 권한을 확인합니다. ls -l 명령어는 파일 권한, 소유자, 그룹, 크기 및 수정 날짜를 포함한 자세한 목록 형식을 제공합니다.

ls -l ~/project/my_files/document.txt

다음과 유사한 출력이 표시됩니다.

-rw-rw-r-- 1 labex labex 0 Jun  6 17:36 /home/labex/project/my_files/document.txt

출력의 첫 부분인 -rw-rw-r--를 자세히 살펴보겠습니다.

  • 첫 번째 문자 (-) 는 파일 유형을 나타냅니다.
    • -는 일반 파일을 의미합니다.
    • d는 디렉토리를 의미합니다.
    • l은 심볼릭 링크를 의미합니다.
  • 다음 9 개 문자는 세 개의 세 개씩 나뉩니다.
    • rw-: 소유자(labex) 의 권한. r(읽기), w(쓰기), -(실행 없음).
    • rw-: 그룹(labex) 의 권한. r(읽기), w(쓰기), -(실행 없음).
    • r--: 기타 사용자의 권한. r(읽기), -(쓰기 없음), -(실행 없음).

즉, labex 사용자 (소유자) 와 labex 그룹의 사용자는 document.txt를 읽고 쓸 수 있지만, 다른 모든 사용자는 읽기 전용입니다.

이제 my_files 디렉토리 자체의 권한을 살펴보겠습니다. ls -l을 디렉토리에 사용하면 디렉토리의 내용을 나열합니다. 디렉토리 자체의 권한을 보려면 ls -l과 함께 -d 옵션을 사용해야 합니다.

ls -ld ~/project/my_files

다음과 유사한 출력이 표시됩니다.

drwxrwxr-x 2 labex labex 4096 Jun  6 17:36 /home/labex/project/my_files

권한 drwxrwxr-x를 해석해 보겠습니다.

  • 첫 번째 문자 (d) 는 디렉토리를 나타냅니다.
  • rwx: 소유자(labex) 의 권한. r(읽기), w(쓰기), x(실행).
  • rwx: 그룹(labex) 의 권한. r(읽기), w(쓰기), x(실행).
  • r-x: 기타 사용자의 권한. r(읽기), -(쓰기 없음), x(실행).

디렉토리의 경우:

  • r(읽기) 는 디렉토리 내용을 나열할 수 있습니다.
  • w(쓰기) 는 디렉토리 내에서 파일을 생성, 삭제 또는 이름 변경할 수 있습니다.
  • x(실행) 는 디렉토리에 들어가 ( cd 사용) 파일 및 하위 디렉토리에 액세스할 수 있습니다.

즉, labex 사용자와 labex 그룹의 사용자는 my_files 디렉토리에 있는 파일을 나열하고 생성/삭제하고 들어갈 수 있습니다. 다른 사용자는 디렉토리를 나열하고 들어갈 수 있지만 디렉토리 내에서 파일을 생성하거나 삭제할 수 없습니다.

chmod (기호 모드) 명령어로 파일 권한 변경

이 단계에서는 chmod 명령어를 사용하여 기호 모드로 파일 권한을 변경하는 방법을 배웁니다. 기호 모드는 문자와 기호를 사용하여 권한 변경 사항을 나타내므로 특정 권한을 추가, 제거 또는 설정하기에 직관적입니다.

기호 모드의 chmod 명령어는 다음 구문을 따릅니다. chmod WHO OPERATION PERMISSIONS FILE

  • WHO: 권한 변경이 적용되는 대상을 지정합니다.
    • u: 사용자 (소유자)
    • g: 그룹
    • o: 기타
    • a: 모두 (사용자, 그룹, 기타)
  • OPERATION: 권한을 수정하는 방법을 지정합니다.
    • +: 권한 추가
    • -: 권한 제거
    • =: 기존 권한을 덮어쓰면서 명시된 대로 권한 설정
  • PERMISSIONS: 권한 유형을 지정합니다.
    • r: 읽기
    • w: 쓰기
    • x: 실행

이전 단계에서 만든 ~/project/my_files/document.txt 파일과 ~/project/my_files 디렉토리를 사용하여 계속 작업합니다.

먼저 document.txt 파일의 그룹 및 기타 사용자에 대한 쓰기 권한을 제거해 보겠습니다. 현재 권한은 -rw-rw-r--입니다.

chmod go-w ~/project/my_files/document.txt

ls -l을 사용하여 변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력은 다음과 같아야 합니다.

-rw-r--r-- 1 labex labex 0 Jun  6 17:36 /home/labex/project/my_files/document.txt

그룹 및 기타 사용자에 대한 쓰기 권한 (w) 이 제거되었음을 확인할 수 있습니다.

다음으로 소유자 (u) 에 대한 document.txt의 실행 권한 (x) 을 추가해 보겠습니다. 이는 스크립트를 실행 가능하게 하기 위해 종종 수행됩니다.

chmod u+x ~/project/my_files/document.txt

변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력은 다음과 같아야 합니다.

-rwxr--r-- 1 labex labex 0 Jun  6 17:36 /home/labex/project/my_files/document.txt

소유자에게 실행 권한 (x) 이 부여되었습니다.

이제 ~/project/my_files 디렉토리로 연습해 보겠습니다. 현재 권한은 drwxrwxr-x입니다. 디렉토리의 기타 (o) 사용자에 대한 쓰기 권한을 제거해 보겠습니다.

chmod o-w ~/project/my_files

변경 사항을 확인합니다.

ls -ld ~/project/my_files

출력은 다음과 같아야 합니다.

drwxr-xr-x 2 labex labex 4096 Jun  6 17:36 /home/labex/project/my_files

o-w가 출력을 변경하지 않은 이유는 무엇일까요? 이는 o(기타) 사용자가 이미 쓰기 권한이 없었기 때문입니다. r-x는 기타 사용자에 대한 읽기 및 실행 권한이 있지만 쓰기 권한은 없습니다. 이는 chmod가 현재 상태와 다른 경우에만 변경 사항을 적용한다는 것을 보여줍니다.

이제 정확하게 권한을 설정해 보겠습니다. document.txt의 권한을 모두 (소유자, 그룹, 기타) 에 대해 rw-r--r--로 설정합니다. 즉, 소유자는 읽기/쓰기, 그룹은 읽기, 기타는 읽기 권한을 갖습니다.

chmod a=rw,g=r,o=r ~/project/my_files/document.txt

변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력은 다음과 같아야 합니다.

-rw-r--r-- 1 labex labex 0 Jun  6 17:36 /home/labex/project/my_files/document.txt

이 명령 a=rw,g=r,o=r은 약간 중복됩니다. a=rw는 모두에 rw를 적용하고, g=r은 그룹을 r로 설정 ( a=rw에서 w를 덮어씀), o=r은 기타를 r로 설정 ( a=rw에서 w를 덮어씀) 합니다. rw-r--r--를 달성하는 더 간단한 방법은 chmod u=rw,go=r입니다. 시도해 보겠습니다.

chmod u=rw,go=r ~/project/my_files/document.txt

변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력은 여전히 다음과 같아야 합니다.

-rw-r--r-- 1 labex labex 0 Jun  6 17:36 /home/labex/project/my_files/document.txt

마지막으로 document.txt를 모든 사용자에 대해 실행 가능하게 해 보겠습니다.

chmod a+x ~/project/my_files/document.txt

변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력은 다음과 같아야 합니다.

-rwxr-xr-x 1 labex labex 0 Jun  6 17:36 /home/labex/project/my_files/document.txt

chmod (8 진수 모드) 명령어로 파일 권한 변경

이 단계에서는 chmod 명령어를 사용하여 8 진수 (숫자) 모드로 파일 권한을 변경하는 방법을 배웁니다. 8 진수 모드는 각 권한 (읽기, 쓰기, 실행) 에 숫자 값을 할당하여 권한을 간결하게 나타내는 방법입니다.

권한에 대한 숫자 값은 다음과 같습니다.

  • 읽기 (r): 4
  • 쓰기 (w): 2
  • 실행 (x): 1
  • 권한 없음 (-): 0

일련의 권한 (소유자, 그룹 또는 기타) 에 대한 8 진수 값을 결정하려면 부여된 권한의 값을 합산합니다.

예를 들어:

  • rwx (읽기, 쓰기, 실행) = 4 + 2 + 1 = 7
  • rw- (읽기, 쓰기, 실행 없음) = 4 + 2 + 0 = 6
  • r-x (읽기, 쓰기 없음, 실행) = 4 + 0 + 1 = 5
  • r-- (읽기, 쓰기 없음, 실행 없음) = 4 + 0 + 0 = 4
  • --- (권한 없음) = 0 + 0 + 0 = 0

8 진수 모드의 chmod 명령어는 세 자리 숫자를 사용하며, 각 자리는 각각 소유자, 그룹 및 기타 사용자의 권한을 나타냅니다. 구문은 다음과 같습니다. chmod OGO FILE

  • O: 소유자 권한에 대한 8 진수 값
  • G: 그룹 권한에 대한 8 진수 값
  • O: 기타 사용자 권한에 대한 8 진수 값

~/project/my_files/document.txt~/project/my_files를 사용하여 계속 작업합니다.

먼저 document.txt의 권한을 rw-r--r--로 설정해 보겠습니다.

  • 소유자: rw- = 6
  • 그룹: r-- = 4
  • 기타: r-- = 4

따라서 8 진수 값은 644입니다.

chmod 644 ~/project/my_files/document.txt

변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력은 다음과 같아야 합니다.

-rw-r--r-- 1 labex labex 0 Jun  6 00:48 /home/labex/project/my_files/document.txt

다음으로 document.txt를 소유자만 실행 가능하게 하고, 소유자는 읽기/쓰기, 그룹 및 기타는 읽기 전용으로 유지해 보겠습니다. 즉, 소유자는 rwx(7), 그룹은 r--(4), 기타는 r--(4) 입니다. 8 진수 값은 744입니다.

chmod 744 ~/project/my_files/document.txt

변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력은 다음과 같아야 합니다.

-rwxr--r-- 1 labex labex 0 Jun  6 00:48 /home/labex/project/my_files/document.txt

이제 ~/project/my_files 디렉토리의 권한을 변경해 보겠습니다. 현재 권한은 drwxr-xr-x입니다. 권한을 rwxr-x---로 설정해 보겠습니다.

  • 소유자: rwx = 7
  • 그룹: r-x = 5
  • 기타: --- = 0

따라서 8 진수 값은 750입니다.

chmod 750 ~/project/my_files

변경 사항을 확인합니다.

ls -ld ~/project/my_files

출력은 다음과 같아야 합니다.

drwxr-x--- 2 labex labex 26 Jun  6 00:48 /home/labex/project/my_files

이는 소유자 (labex) 는 모든 권한 (읽기, 쓰기, 실행) 을 가지고, 그룹 (labex) 은 디렉토리를 읽고 실행 (들어가기) 할 수 있으며, 기타 사용자는 전혀 권한이 없음을 의미합니다.

마지막으로 실행 권한 설정을 직접 보여주기 위해 새 실행 스크립트 파일을 만들겠습니다.

echo '#!/bin/bash' > ~/project/my_script.sh
echo 'echo "Hello from my script!"' >> ~/project/my_script.sh

기본적으로 새 파일은 실행 가능하지 않습니다. 권한을 확인해 보겠습니다.

ls -l ~/project/my_script.sh

-rw-r--r--와 같은 권한이 표시될 가능성이 높습니다. 소유자와 그룹에 대해서만 실행 가능하게 하려면 rwxrwx---를 원합니다.

  • 소유자: rwx = 7
  • 그룹: rwx = 7
  • 기타: --- = 0

따라서 8 진수 값은 770입니다.

chmod 770 ~/project/my_script.sh

변경 사항을 확인합니다.

ls -l ~/project/my_script.sh

출력은 다음과 같아야 합니다.

-rwxrwx--- 1 labex labex 41 Jun  6 00:52 /home/labex/project/my_script.sh

이제 스크립트를 실행할 수 있습니다.

~/project/my_script.sh

출력은 다음과 같아야 합니다.

Hello from my script!

chown 명령어로 파일 소유자 변경

이 단계에서는 chown 명령어를 사용하여 파일 및 디렉토리의 소유자와 그룹을 변경하는 방법을 배웁니다. 이 작업은 매우 중요한 관리 작업이며, 파일 소유자를 변경할 수 있는 유일한 사용자는 root 사용자입니다. labex 사용자는 sudo 권한을 가지고 있어 이러한 작업을 수행할 수 있습니다.

chown의 기본 구문은 다음과 같습니다. chown [OPTIONS] NEW_OWNER[:NEW_GROUP] FILE(s)

소유권 변경을 보여주기 위해 사용할 수 있는 새 사용자와 그룹을 만들어 보겠습니다. 이 환경은 컨테이너 기반이므로, 데모를 위해 간단한 사용자와 그룹을 만들겠습니다.

먼저 devs라는 새 그룹을 만듭니다.

sudo groupadd devs

다음으로 developer라는 새 사용자를 만들고 devs 그룹에 추가합니다. 이 데모를 위해 홈 디렉토리나 로그인 쉘이 없는 시스템 사용자를 만들겠습니다.

sudo useradd -r -g devs -s /sbin/nologin developer

이제 ~/project/my_files/document.txt의 소유자를 labex에서 developer로 변경해 보겠습니다.

sudo chown developer ~/project/my_files/document.txt

ls -l을 사용하여 변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력에는 이제 소유자로 developer가 표시되어야 합니다.

-rwxr--r-- 1 developer labex 0 Jun  6 00:48 /home/labex/project/my_files/document.txt

그룹 소유권 (labex) 은 변경되지 않았음을 주목하십시오.

owner:group 구문을 사용하여 소유자와 그룹을 동시에 변경할 수도 있습니다. document.txt의 소유자를 다시 labex로, 그룹을 devs로 변경해 보겠습니다.

sudo chown labex:devs ~/project/my_files/document.txt

변경 사항을 확인합니다.

ls -l ~/project/my_files/document.txt

출력에는 이제 소유자로 labex, 그룹으로 devs가 표시되어야 합니다.

-rwxr--r-- 1 labex devs 0 Jun  6 00:48 /home/labex/project/my_files/document.txt

chown 명령어는 전체 디렉토리 트리의 소유권을 변경할 수 있는 -R (재귀적) 옵션도 지원합니다. ~/project/my_files 디렉토리와 그 내용물의 소유자를 developer로, 그룹을 devs로 변경해 보겠습니다.

sudo chown -R developer:devs ~/project/my_files

디렉토리의 변경 사항을 확인합니다.

ls -ld ~/project/my_files

출력은 새 소유권을 반영해야 합니다.

drwxr-x--- 2 developer devs 26 Jun  6 00:48 /home/labex/project/my_files

디렉토리 소유권을 developer:devs로 변경한 후 labex 사용자는 더 이상 디렉토리 내의 파일을 액세스할 수 없습니다. 디렉토리 권한이 drwxr-x--- (소유자와 그룹은 액세스 권한이 있지만 기타 사용자는 없음) 이고 labex는 소유자 (developer) 도 아니고 그룹 (devs) 의 구성원도 아니기 때문입니다. 이제 파일을 나열하려고 하면:

ls -l ~/project/my_files/document.txt

"권한 거부" 오류가 발생합니다. 이는 소유권과 권한이 액세스 제어를 함께 작동하는 방식을 보여줍니다.

chown :NEW_GROUP FILE(s)를 사용하여 그룹 소유권만 변경할 수도 있습니다. 이는 chgrp 명령어와 동일합니다. ~/project/my_script.sh의 그룹을 devs로 변경해 보겠습니다.

sudo chown :devs ~/project/my_script.sh

변경 사항을 확인합니다.

ls -l ~/project/my_script.sh

출력에는 devs가 그룹 소유자로 표시되고 labex는 파일 소유자로 유지되어야 합니다.

-rwxrwx--- 1 labex devs 41 Jun  6 00:52 /home/labex/project/my_script.sh

마지막으로 labex:labex로 소유권을 다시 변경하고 developer 사용자와 devs 그룹을 제거하여 정리합니다.

sudo chown -R labex:labex ~/project/my_files
sudo userdel developer
sudo groupdel devs

특수 권한 (SUID, SGID, Sticky Bit) 이해 및 적용

이 단계에서는 Linux 의 특수 권한인 SUID (Set User ID), SGID (Set Group ID), 그리고 Sticky Bit 에 대해 알아보겠습니다. 이러한 권한은 파일 실행 및 디렉토리 동작에 대한 향상된 제어를 제공합니다.

특수 권한은 옥탈 권한 모드에서 추가 숫자로 표현되며, 표준 세 자리 숫자 (소유자, 그룹, 기타) 앞에 위치합니다.

  • SUID (Set User ID):
    • 옥탈 값 (Octal value): 4
    • 파일에 미치는 영향: SUID 가 설정된 실행 파일을 실행하면, 이를 실행한 사용자가 아닌 파일의 소유자 권한으로 실행됩니다. 이는 passwd 명령 (/etc/shadow 파일에 쓰기 권한이 필요한데, 이 파일은 root가 소유) 과 같이 특정 작업을 수행하기 위해 높은 권한이 필요한 프로그램에 일반적으로 사용됩니다.
    • ls -l 출력에서: 소유자의 x (실행) 권한 대신 s가 나타납니다. 소유자에게 실행 권한이 없는 경우 대문자 S가 나타납니다.
  • SGID (Set Group ID):
    • 옥탈 값 (Octal value): 2
    • 파일에 미치는 영향: SUID 와 유사하지만, 실행 파일이 파일의 그룹 소유자 권한으로 실행됩니다.
    • 디렉토리에 미치는 영향: SGID 가 활성화된 디렉토리 내에서 생성된 파일 및 하위 디렉토리는 해당 디렉토리의 그룹 소유권을 상속받으며, 이를 생성한 사용자의 기본 그룹이 아닌 해당 디렉토리의 그룹 소유권을 상속받습니다. 이는 모든 파일이 특정 그룹에 속해야 하는 공유 디렉토리에 매우 유용합니다.
    • ls -l 출력에서: 그룹의 x (실행) 권한 대신 s가 나타납니다. 그룹에 실행 권한이 없는 경우 대문자 S가 나타납니다.
  • Sticky Bit:
    • 옥탈 값 (Octal value): 1
    • 파일에 미치는 영향: 영향 없음.
    • 디렉토리에 미치는 영향: 사용자는 디렉토리에 파일을 생성할 수 있지만, 자신이 소유한 파일만 삭제하거나 이름을 변경할 수 있습니다. 이는 사용자가 공유 디렉토리 (예: /tmp) 에서 다른 사용자의 파일을 삭제하거나 이동하는 것을 방지합니다.
    • ls -l 출력에서: 기타 사용자의 x (실행) 권한 대신 t가 나타납니다. 기타 사용자에게 실행 권한이 없는 경우 대문자 T가 나타납니다.

이러한 특수 권한을 시연해 보겠습니다.

SUID 예시

제한된 파일을 읽으려는 간단한 C 프로그램을 만들겠습니다.

먼저, root만 읽을 수 있는 파일을 생성합니다.

sudo touch ~/project/secret_data.txt
sudo chmod 600 ~/project/secret_data.txt
sudo chown root:root ~/project/secret_data.txt

권한을 확인합니다.

ls -l ~/project/secret_data.txt

출력:

-rw------- 1 root root 0 Jun  6 17:36 /home/labex/project/secret_data.txt

이제 이 파일을 읽으려고 시도하는 C 프로그램 read_secret.c를 만듭니다.

nano ~/project/read_secret.c

다음 코드를 read_secret.c에 붙여넣습니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    FILE *fp;
    char buffer[256];

    printf("Attempting to read /home/labex/project/secret_data.txt...\n");

    fp = fopen("/home/labex/project/secret_data.txt", "r");
    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }

    fclose(fp);
    printf("Successfully read file.\n");
    return 0;
}

저장하고 nano를 종료합니다 (Ctrl+S, Ctrl+X).

프로그램을 컴파일합니다.

gcc ~/project/read_secret.c -o ~/project/read_secret

이제 labex로 실행해 봅니다.

~/project/read_secret

"Error opening file: Permission denied" 메시지가 표시되어야 합니다. labexsecret_data.txt에 대한 읽기 권한이 없기 때문입니다.

이제 read_secret의 소유자를 root로 설정하고 SUID 비트를 설정해 보겠습니다.

sudo chown root:root ~/project/read_secret
sudo chmod u+s ~/project/read_secret

권한을 확인합니다.

ls -l ~/project/read_secret

출력:

-rwsr-xr-x 1 root root 17704 Jun  6 01:02 /home/labex/project/read_secret

소유자 권한 집합에서 s를 확인합니다. 이제 labex로 프로그램을 다시 실행합니다.

~/project/read_secret

이번에는 파일을 성공적으로 읽어야 합니다 (비어 있으므로 내용이 출력되지 않지만 "Successfully read file." 메시지는 성공을 나타냅니다). SUID 비트가 프로그램을 root의 권한으로 실행했기 때문입니다.

SGID 예시 (디렉토리에서)

공유 디렉토리와 새 그룹을 만들어 보겠습니다.

sudo groupadd shared_group
sudo mkdir ~/project/shared_dir
sudo chown labex:shared_group ~/project/shared_dir
sudo chmod 770 ~/project/shared_dir

이제 shared_dir에 SGID 비트를 설정합니다.

sudo chmod g+s ~/project/shared_dir

권한을 확인합니다.

ls -ld ~/project/shared_dir

출력:

drwxrws--- 2 labex shared_group 6 Jun  6 01:02 /home/labex/project/shared_dir

그룹 권한 집합에서 s를 확인합니다.

이제 shared_dir 내에 파일을 생성합니다.

touch ~/project/shared_dir/new_file.txt

new_file.txt의 소유권을 확인합니다.

ls -l ~/project/shared_dir/new_file.txt

출력:

-rw-r--r-- 1 labex shared_group 0 Jun  6 01:02 /home/labex/project/shared_dir/new_file.txt

labex의 기본 그룹이 labex임에도 불구하고, new_file.txt는 SGID 비트로 인해 shared_dir에서 shared_group 그룹 소유권을 상속받았습니다.

Sticky Bit 예시

/tmp 디렉토리는 Sticky Bit 가 설정된 디렉토리의 전형적인 예입니다. 유사한 디렉토리를 만들어 보겠습니다.

sudo mkdir ~/project/public_upload
sudo chmod 1777 ~/project/public_upload

17771은 Sticky Bit 의 옥탈 값입니다. 777은 소유자, 그룹 및 기타 사용자에게 전체 권한을 부여합니다.

권한을 확인합니다.

ls -ld ~/project/public_upload

출력:

drwxrwxrwt 2 root root 6 Jun  6 01:02 /home/labex/project/public_upload

기타 사용자의 권한 집합에서 t를 확인합니다.

이제 다른 사용자가 이 디렉토리에 파일을 생성하는 것을 시뮬레이션해 보겠습니다. labex 사용자만 있으므로, labex로 파일을 생성한 다음 소유권을 root로 변경한 후 삭제하려고 시도합니다 (다른 사용자를 시뮬레이션).

labex로 파일을 생성합니다.

touch ~/project/public_upload/labex_file.txt

소유권을 root로 변경합니다.

sudo chown root:root ~/project/public_upload/labex_file.txt

이제 labexlabex_file.txt를 삭제하려고 시도합니다.

rm ~/project/public_upload/labex_file.txt

쓰기 보호된 파일을 제거할지 묻는 메시지가 표시되고, y로 확인하면 "Operation not permitted" 오류가 발생합니다. Sticky Bit 는 labexpublic_upload 디렉토리에 대한 쓰기 권한이 있더라도 사용자가 소유하지 않은 파일을 삭제하는 것을 방지하기 때문입니다. root 또는 labex_file.txt의 소유자 (이 경우 root) 만 삭제할 수 있습니다.

정리하려면 sudo를 사용하여 labex_file.txt를 제거해야 합니다.

sudo rm ~/project/public_upload/labex_file.txt

정리

생성된 파일과 디렉토리, 그리고 사용자/그룹을 제거합니다.

sudo rm -f ~/project/secret_data.txt ~/project/read_secret.c ~/project/read_secret
sudo rm -rf ~/project/shared_dir ~/project/public_upload
sudo groupdel shared_group

umask 명령어로 기본 권한 설정

이 마지막 단계에서는 새로 생성된 파일과 디렉토리에 할당되는 기본 권한을 제어하는 umask에 대해 배우게 됩니다. umask (사용자 파일 생성 모드 마스크) 는 가능한 최대 권한에서 권한을 제거하는 비트마스크입니다.

새 파일의 최대 권한은 666 (rw-rw-rw-) 이며, 이는 모든 사용자에 대한 읽기 및 쓰기를 의미합니다. 보안상의 이유로 새 파일은 기본적으로 실행 권한을 갖지 않습니다.
새 디렉토리의 최대 권한은 777 (rwxrwxrwx) 이며, 이는 모든 사용자에 대한 읽기, 쓰기 및 실행을 의미합니다.

umask 값은 이러한 최대 권한에서 빼서 실제 기본 권한을 결정합니다.

현재 umask 값을 보려면 단순히 umask를 입력하십시오.

umask

0002 또는 0022를 보게 될 것입니다. 이 환경에서는 labex 사용자에 대해 0022입니다.

umask0022인 것은 다음을 의미합니다.

  • 첫 번째 0은 특수 권한 (SUID, SGID, Sticky Bit) 에 대한 것으로, 기본적으로 umask의 영향을 받지 않습니다.
  • 두 번째 0은 소유자로부터 권한이 제거되지 않음을 의미합니다.
  • 세 번째 2는 그룹에서 쓰기 권한 (값 2) 이 제거됨을 의미합니다.
  • 네 번째 2는 다른 사용자로부터 쓰기 권한 (값 2) 이 제거됨을 의미합니다.

umask0022일 때 기본 권한을 계산해 보겠습니다.

  • 파일의 경우 (최대 666):

    • 소유자: 6 - 0 = 6 (rw-)
    • 그룹: 6 - 2 = 4 (r--)
    • 기타: 6 - 2 = 4 (r--)
    • 결과 파일 권한: 644 (rw-r--r--)
  • 디렉토리의 경우 (최대 777):

    • 소유자: 7 - 0 = 7 (rwx)
    • 그룹: 7 - 2 = 5 (r-x)
    • 기타: 7 - 2 = 5 (r-x)
    • 결과 디렉토리 권한: 755 (rwxr-xr-x)

이것을 테스트해 보겠습니다. 새 파일과 디렉토리를 만듭니다.

touch ~/project/new_file_umask.txt
mkdir ~/project/new_dir_umask

권한을 확인합니다.

ls -l ~/project/new_file_umask.txt
ls -ld ~/project/new_dir_umask

파일에 대해 -rw-r--r--와 같은 권한과 디렉토리에 대해 drwxr-xr-x와 같은 권한을 볼 수 있으며, 이는 0022 umask의 효과를 확인합니다.

이제 umask0077로 변경해 보겠습니다. 이 umask는 그룹 및 기타 사용자의 모든 권한을 제거합니다.

umask 0077

umask가 변경되었는지 확인합니다.

umask

출력:

0077

이제 umask0077일 때 기본 권한을 계산해 보겠습니다.

  • 파일의 경우 (최대 666):

    • 소유자: 6 - 0 = 6 (rw-)
    • 그룹: 6 - 7 = -1 (실질적으로 0, ---)
    • 기타: 6 - 7 = -1 (실질적으로 0, ---)
    • 결과 파일 권한: 600 (rw-------)
  • 디렉토리의 경우 (최대 777):

    • 소유자: 7 - 0 = 7 (rwx)
    • 그룹: 7 - 7 = 0 (---)
    • 기타: 7 - 7 = 0 (---)
    • 결과 디렉토리 권한: 700 (rwx------)

이 새로운 umask를 테스트해 보겠습니다. 다른 새 파일과 디렉토리를 만듭니다.

touch ~/project/restricted_file.txt
mkdir ~/project/restricted_dir

권한을 확인합니다.

ls -l ~/project/restricted_file.txt
ls -ld ~/project/restricted_dir

이제 파일에 대해 -rw-------와 같은 권한과 디렉토리에 대해 drwx------와 같은 권한을 볼 수 있습니다.

umask 설정은 일반적으로 사용자가 로그인할 때 자동으로 적용되도록 셸 초기화 파일 (예: ~/.bashrc 또는 /etc/profile) 에 구성됩니다. 이 랩에서는 umask 변경이 임시적이며 현재 터미널 세션에만 적용됩니다.

labex 사용자에 대한 umask를 기본값으로 되돌리려면 단순히 0022로 다시 설정하면 됩니다.

umask 0022

마지막으로, 이 단계에서 생성된 파일과 디렉토리를 정리합니다.

rm ~/project/new_file_umask.txt ~/project/restricted_file.txt
rmdir ~/project/new_dir_umask ~/project/restricted_dir

요약

이 실습에서는 Linux 파일 시스템 권한 관리의 기본적인 측면을 탐구했습니다. ls -l 명령어를 사용하여 파일 및 디렉토리 권한을 해석하고, 사용자, 그룹 및 기타 카테고리의 중요성과 읽기, 쓰기 및 실행 권한을 이해하는 것으로 시작했습니다. 이 기본적인 지식은 그런 다음 기호 및 8 진수 모드에서 chmod를 사용하여 권한을 수정하는 데 적용되어 액세스 권한을 설정하는 유연성을 제공했습니다.

또한, 관리 권한을 할당하는 데 필수적인 chown 명령어를 사용하여 파일 소유권을 변경하는 방법을 배웠습니다. 이 실습에서는 실행 및 파일 생성 동작에 대한 고급 제어 기능을 제공하는 특수 권한 (SUID, SGID 및 Sticky Bit) 의 이해와 적용에 대해서도 다루었습니다. 마지막으로, 시스템 전체에 걸쳐 일관된 권한 설정을 보장하기 위해 umask를 사용하여 새로 생성된 파일 및 디렉토리에 대한 기본 권한을 구성하는 방법을 탐구했습니다.