Linux 사용자 그룹 및 파일 권한

LinuxBeginner
지금 연습하기

소개

Linux 는 다중 사용자 운영 체제입니다. 모든 프로세스와 파일에는 사용자가 연결되어 있으며, 각 사용자에게는 기본 그룹과 선택적인 보조 그룹이 있습니다. 사용자 식별 정보, 소유권, 권한 비트가 함께 작동하여 리소스를 읽거나 변경하거나 실행하거나 접근할 수 있는 사용자를 결정합니다.

이 실습에서는 전용 연습 계정을 사용해 소규모 팀 환경을 구성합니다. 사용자를 만들고, 그룹 멤버십을 관리하고, 파일을 보호하고, 계정 잠금 상태를 확인하고, umask로 기본 권한을 제어하고, sticky bit 및 setgid 디렉터리를 구성합니다. 모든 작업은 실습 환경 안에서 수행되며 기본 labex 로그인 경로는 변경하지 않습니다.

사용자 식별 정보 확인 및 연습 사용자 만들기

이 단계에서는 현재 사용자의 식별 정보를 확인하고 권한 실습용 별도 계정을 만듭니다. Linux 는 사용자 이름과 숫자 사용자 ID(UID) 로 사용자를 나타냅니다. 또한 기본 그룹 ID(GID) 와 모든 보조 그룹도 기록합니다.

먼저 현재 셸의 사용자 식별 정보를 확인합니다.

whoami

출력은 labex여야 합니다. 이제 이 계정에 연결된 UID, 기본 그룹, 보조 그룹을 표시합니다.

id

정확한 숫자 ID 는 다를 수 있지만, 출력에는 uid, gid, groups라는 레이블이 표시됩니다.

계정을 만들면 시스템 파일이 변경되므로 관리자 권한이 필요합니다. sudo는“superuser do”를 뜻하며, 현재 계정에 권한이 있는지 확인한 후 다음 명령을 높은 권한으로 실행합니다. 관리자 권한이 필요한 명령에만 사용하고, Enter 키를 누르기 전에 명령 전체를 확인합니다.

다음 useradd 명령은 세 가지 옵션을 사용합니다.

  • -m은 홈 디렉터리를 만듭니다.
  • -U는 사용자 이름과 같은 이름의 기본 그룹을 만듭니다.
  • -s /bin/bash는 해당 계정의 로그인 셸로 Bash 를 지정합니다.

jack이라는 연습 사용자를 만듭니다.

sudo useradd -m -U -s /bin/bash jack

새 계정과 홈 디렉터리를 확인합니다.

id jack
ls -ld /home/jack

id 출력에는 jack이 사용자와 기본 그룹으로 모두 표시되어야 합니다. 디렉터리 목록에는 /home/jack이 존재하며 소유자가 jack:jack으로 표시되어야 합니다.

보조 그룹 관리

이 단계에서는 팀 그룹을 만들고 사용자를 보조 그룹에 추가합니다. 사용자의 기본 그룹은 일반적으로 새로 만든 파일의 그룹 소유자가 됩니다. 보조 그룹은 추가 공유 리소스에 접근할 수 있도록 합니다.

developers라는 그룹을 만듭니다.

sudo groupadd developers

usermod -aG 옵션은“보조 그룹에 추가”한다는 의미입니다. -a는 중요합니다. 이 옵션 없이 -G를 사용하면 기존 보조 그룹 멤버십이 바뀔 수 있습니다. jackdeveloperssudo 그룹에 모두 추가합니다.

sudo usermod -aG developers,sudo jack

labexdevelopers의 멤버로 등록합니다. 현재 셸에는 새 그룹 식별 정보가 즉시 적용되지 않으므로 마지막 단계에서 안전하게 갱신합니다.

sudo usermod -aG developers labex

두 계정을 확인합니다.

groups jack
groups labex

첫 번째 출력에는 jack, developers, sudo가 포함되어야 합니다. 두 번째 출력에는 developers가 포함되어야 합니다. sudo 멤버십이 있으면 인증된 계정이 높은 권한을 요청할 수 있으므로 신뢰할 수 있는 관리자에게만 부여해야 합니다.

파일 소유권 및 권한 제어

이 단계에서는 특정 사용자, 그룹, 권한 모드를 사용해 팀 보고서 파일을 보호합니다. 긴 형식의 목록은 먼저 파일 형식을 표시한 다음 소유자, 그룹, 기타 사용자의 권한을 각각 세 글자씩 표시합니다.

프로젝트 디렉터리에 빈 보고서 파일을 만듭니다.

touch /home/labex/project/secure-report.txt

user:group 형식의 chown을 사용해 사용자와 그룹 소유자를 모두 변경합니다.

sudo chown jack:developers /home/labex/project/secure-report.txt

권한 모드를 640으로 설정합니다.

sudo chmod 640 /home/labex/project/secure-report.txt

숫자 표기에서 읽기는 4, 쓰기는 2, 실행은 1입니다. 따라서 다음과 같습니다.

  • 소유자 6은 읽기와 쓰기를 의미합니다 (4 + 2).
  • 그룹 4는 읽기만 허용합니다.
  • 기타 사용자 0은 접근할 수 없음을 의미합니다.

결과를 확인합니다.

ls -l /home/labex/project/secure-report.txt
stat -c 'owner=%U group=%G mode=%a' /home/labex/project/secure-report.txt

stat의 안정적인 출력 필드에는 owner=jack group=developers mode=640이 표시되어야 합니다.

계정 잠금 상태 확인 및 변경

이 단계에서는 전용 계정을 일시적으로 잠그고 잠금 해제하는 방법을 실습합니다. Linux 는 /etc/shadow에 비밀번호 해시와 계정 상태를 저장합니다. 비밀번호 필드 맨 앞의 !는 비밀번호 인증이 잠겨 있음을 나타냅니다.

설정 과정에서 contractor라는 연습 계정이 만들어졌습니다. 해시 자체가 출력되지 않도록 비밀번호 필드의 첫 번째 문자만 표시합니다. 파이프라인을 왼쪽에서 오른쪽으로 읽어 보겠습니다. getent shadow contractor는 계정의 shadow 레코드를 가져오고, 첫 번째 cut:를 구분자로 사용해 두 번째 필드를 선택하며, 두 번째 cut은 해당 필드의 첫 번째 문자를 가져옵니다.

sudo getent shadow contractor | cut -d: -f2 | cut -c1

처음 문자는 일반적으로 $여야 하며, 이는 최신 비밀번호 해시 형식의 시작 부분입니다. usermod -L로 계정을 잠급니다.

sudo usermod -L contractor

첫 번째 문자를 다시 확인합니다.

sudo getent shadow contractor | cut -d: -f2 | cut -c1

이번에는 !이 표시되어야 합니다. usermod -U로 계정 잠금을 해제하고 !이 사라졌는지 확인합니다.

sudo usermod -U contractor
sudo getent shadow contractor | cut -d: -f2 | cut -c1

이 시나리오에서는 이제 contractor 가 팀을 떠났습니다. 파일은 보존한 채 계정을 마지막으로 한 번 잠급니다.

sudo usermod -L contractor

비밀번호 인증을 잠가도 계정이 삭제되거나 홈 디렉터리가 제거되지는 않으며, 이미 실행 중인 세션이 반드시 종료되는 것도 아닙니다. 이는 사용자 삭제와는 다른 작업이며, 검토를 위해 파일을 보존해야 할 때 유용합니다.

Umask 로 기본 권한 제어

이 단계에서는 셸이 새 파일과 디렉터리를 만들 때 제거할 권한 비트를 umask로 제어합니다. 프로그램은 일반 파일에 보통 최대 모드 666, 디렉터리에 777로 시작합니다. 마스크 027은 그룹의 쓰기 권한과 기타 사용자의 모든 권한을 제거합니다.

실험용 작업 공간을 만듭니다.

mkdir -p /home/labex/project/umask-demo

나중에 복원할 수 있도록 현재 마스크를 저장합니다. $(command) 구문을 **명령 치환 (command substitution)**이라고 합니다. 셸은 괄호 안의 명령을 실행하고 전체 표현식을 그 출력으로 바꿉니다. 대입문은 그 결과를 original_umask에 저장합니다. 다른 셸 대입문과 마찬가지로 = 양옆에는 공백을 넣지 않습니다.

original_umask=$(umask)

마스크 027을 적용한 다음 파일과 디렉터리를 만듭니다.

umask 027
touch /home/labex/project/umask-demo/private-note.txt
mkdir /home/labex/project/umask-demo/private-dir

생성된 숫자 모드를 확인합니다.

stat -c '%a %n' /home/labex/project/umask-demo/private-note.txt /home/labex/project/umask-demo/private-dir

파일 모드는 640, 디렉터리 모드는 750이어야 합니다. 파일에는 실행 권한이 자동으로 부여되지 않습니다. 셸의 원래 마스크를 복원합니다.

umask "$original_umask"

umask를 변경하면 이후에 생성되는 객체에 영향을 주지만, 이미 존재하는 객체의 권한을 다시 설정하지는 않습니다.

Sticky Bit 로 공유 디렉터리 보호

이 단계에서는 누구나 파일을 만들 수 있지만 다른 사용자가 소유한 파일은 삭제할 수 없는 공개 드롭 박스를 구성합니다. 일반 모드 777은 모든 사용자에게 디렉터리에 대한 전체 접근 권한을 부여합니다. 여기에 sticky bit 를 추가하면 디렉터리 안에서 파일을 삭제하는 규칙이 달라집니다.

공유 디렉터리를 만들고 모드를 1777로 설정합니다. 맨 앞의 1이 sticky bit 를 활성화합니다.

mkdir /tmp/shared-dropbox
chmod 1777 /tmp/shared-dropbox

sudo -u를 사용해 각 연습 계정으로 파일을 하나씩 만듭니다.

sudo -u jack touch /tmp/shared-dropbox/jack-note.txt
sudo -u contractor touch /tmp/shared-dropbox/contractor-note.txt

이제 jack으로 contractor 의 파일을 삭제해 봅니다.

sudo -u jack rm /tmp/shared-dropbox/contractor-note.txt

이 실패는 의도된 결과입니다. Operation not permitted가 표시되고 contractor 의 파일이 남아 있어야 합니다. 디렉터리를 확인합니다.

ls -ld /tmp/shared-dropbox

권한의 마지막 문자는 소문자 t여야 하며, 예를 들면 drwxrwxrwt와 같습니다. 소문자 t는 sticky bit 와 기타 사용자의 실행 권한이 모두 설정되었음을 의미합니다. 대문자 T는 sticky bit 는 설정되었지만 해당 실행 권한은 없음을 의미합니다.

Setgid 팀 디렉터리 구성

이 단계에서는 비공개 협업 디렉터리를 준비합니다. 디렉터리에 setgid 를 설정하면 새로 생성되는 하위 객체가 생성자의 기본 그룹이 아니라 해당 디렉터리의 그룹을 상속합니다. 이를 통해 팀 파일이 하나의 공유 그룹에 계속 연결됩니다.

디렉터리를 만듭니다.

mkdir /home/labex/project/team-share

jack을 사용자 소유자로, developers를 그룹 소유자로 설정합니다.

sudo chown jack:developers /home/labex/project/team-share

모드를 2770으로 설정합니다. 맨 앞의 2가 setgid 를 활성화하고, 770은 소유자와 그룹에 전체 접근 권한을 부여하며 기타 사용자의 접근은 차단합니다.

sudo chmod 2770 /home/labex/project/team-share

결과를 확인합니다.

ls -ld /home/labex/project/team-share
stat -c 'owner=%U group=%G mode=%a' /home/labex/project/team-share

긴 형식의 목록에는 그룹 실행 권한 위치에 s가 표시되어야 하며, 예를 들면 drwxrws---와 같습니다. 소문자 s는 setgid 와 그룹 실행 권한이 모두 활성화되었음을 의미합니다. 대문자 S는 setgid 는 설정되었지만 그룹 실행 권한은 없음을 의미합니다.

소유자 실행 권한 위치의 s로 표시되는 setuid 는 신중하게 제어되는 시스템 실행 파일에서 흔히 볼 수 있는 또 다른 특수 비트입니다. 권한을 읽을 때 이를 알아볼 수 있어야 하지만, 임의의 프로그램에 setuid 를 추가하지는 마세요.

그룹 멤버십 갱신 및 상속 확인

이 단계에서는 자식 셸에서 developers 멤버십을 활성화하고 setgid 가 새 파일의 그룹을 제어하는지 확인합니다. 사용자를 /etc/group에 추가해도 이미 실행 중인 셸의 보조 그룹 정보가 다시 작성되지는 않습니다.

developers를 활성 그룹으로 사용하는 자식 셸을 시작합니다.

newgrp developers

프롬프트가 새로 표시될 수 있습니다. 여전히 labex 사용자이지만, 자식 셸의 유효 그룹은 이제 developers입니다. 두 식별 정보를 확인합니다.

id

setgid 디렉터리에 파일을 만듭니다.

touch /home/labex/project/team-share/labex-note.txt

새 파일을 확인합니다.

stat -c 'owner=%U group=%G mode=%a' /home/labex/project/team-share/labex-note.txt

소유자는 labex, 그룹은 developers여야 합니다. setgid 는 그룹 소유자를 상속하지만, 파일의 읽기 및 쓰기 비트는 파일을 만드는 프로세스와 해당 프로세스의 umask에 따라 달라집니다.

자식 셸을 종료하고 원래 터미널 세션으로 돌아갑니다.

exit

자식 셸이 닫힌 뒤에도 파일은 그대로 남아 있습니다.

요약

Linux 시스템에서 사용하는 핵심 사용자 식별 및 접근 모델을 실습했습니다. 사용자를 만들고 팀 그룹을 구성했으며, 보조 그룹 멤버십을 관리하고, 소유권을 지정하고, 숫자 권한 모드를 실제 접근 규칙으로 해석했습니다. 또한 비밀번호 해시를 노출하지 않고 계정 잠금 상태를 확인했습니다.

이후 일반 권한을 넘어 umask로 기본 권한을 제어하고, sticky bit 로 공개 디렉터리의 파일을 보호하고, setgid 로 비공개 협업 디렉터리에서 팀 그룹 소유권을 유지했습니다. 마지막으로 newgrp를 사용해 그룹 멤버십을 갱신하고 실제 파일에서 상속된 그룹을 확인했습니다.