개발블로그

Linux 사용자와 권한 구조 - User, Group, UID/GID와 Permission 본문

STUDY/Server

Linux 사용자와 권한 구조 - User, Group, UID/GID와 Permission

devmel 2026. 8. 29. 19:21
Contents 접기
 

Linux에서 권한이 필요한 이유

 

리눅스는 하나의 System에서 여러 User와 여러 Process가 동시에 동작할 수 있는 Multi-user 운영체제

 

이때 모든 User와 Process가 System의 모든 File과 Directory에 자유롭게 접근할 수 있으면 문제가 발생함

  • 일반 User가 System 설정 File을 수정
  • Web Server Process가 접근할 필요가 없는 File까지 읽거나 변경
  • 다른 User가 만든 File을 임의로 삭제 
  • Application Process가 다른 Service의 Data에 접근 

이러한 문제를 막기 위해 Linux에서는 작업을 수행하는 주체를 식별하로, 각 주체가 Resource에 대해 수행할 수 있는 작업을 제한

 

[구조]

누가 접근하는가?
        ↓
User / Group으로 주체 구분
        ↓
UID / GID로 System 내부에서 식별
        ↓
어떤 Resource에 접근하는가?
        ↓
File / Directory의 소유 관계 확인
        ↓
어떤 작업을 하려는가?
        ↓
Permission 확인
        ↓
접근 허용 / 거부

 

 


 

User와 Group

 

권한을 적용하기 위해 누가 작업을 수행하는지 구분하기 위함

 

용어

User

리눅스에서 작업을 수행하는 주체를 구분하기 위한 계정

=> 각 User은 서로 독립된 계정으로 구분되며, 자신에게 허용된 범위 안에서 File이나 Directory, Process등의 Resource에 접근

 

- 사람이 직접 로그인해서 사용하는 계정뿐만 아니라 특정 Service나 Process를 실행하기 위한 계정도 User로 관리할 수 있음

  ex) root, www-data, mysql...

 

[ 유형 ]

유형 대표 예 UID 주요 용도
관리자 User root 0 System 전체 관리
ex) System 설정 변경, User 관리, 소유권 변경
System / Service User www-data, mysql 등 일반 User보다 낮은 영역을 주로 사용 Service / Daemon 실행
=> 특정 Service나 Process를 제한된 계정으로 실행하기 위해 사용
일반 User soyeon, developer 등 1000 이상을 사용하는 경우가 많음 사람이 로그인하여 작업

 

Group

여러 User에거 동일한 권한을 부여해야 하는 경우 User마다 개별적으로 관리하면 번거로울 수 있음. 

이때 여러 User을 하나의 단위로 묶어 관리하기 위해 Group을 사용

 

User-Group의 관계 

- 하나의 User는 Group과 연결되어 사용됨 

- 하나의 User가 여러 Group에 동시에 속할 수 있음 

User

├─ Primary Group = User가 기본적으로 속하는 Group (File을 생성할 때 Group Ownership 결정 등에 사용 됨)

└─ Supplementary Groups = Primary Group 외에 추가로 속해 있는 Group

 

 


 

UID와 GID

 

개념

리눅스 내부에서는 이름 자체를 식별 기준으로 사용하는 것이 아니라 숫자 값으로 User와 Group을 구분 

구분 의미
UID User를 식별하는 숫자 ID 1000
GID Group을 식별하는 숫자 ID 1000

 

 

어떻게 부여되는가?

UID/GID를 직접 지정하지 않으면 계정 관리 도구가 설정된 UID/GID 범위에서 사용할 수 있는 값을 선택하여 할당

 

일반 User에 사용할 범위는 보통 /etc/login.defs의 다음 설정을 기준으로 함

=> UID_MIN ~ UID_MAX, GID_MIN~GID_MAX

 

많은 Linux Distribution에서는 일반 User와 Group의 시작값을 1000으로 설정하는 경우가 흔함. 

ex) 일반 User가 순서대로 생성되면 다음처럼 UID 할당

첫 번째 일반 User  → UID 1000
두 번째 일반 User  → UID 1001
세 번째 일반 User  → UID 1002

 

관련 명령어

## 직접 지정
sudo useradd -u [UID NUMBER] [NAME]
sudo groupadd -g [UID NUMBER] [NAME]

## 현재 User의 UID/GID 확인

# 현재 로그인한 User의 이름
whoami

# 현재 User의 UID, GID 및 소속 Group 확인 
id 
# 결과 : uid=1000(soyeon) gid=1000(soyeon) groups=1000(soyeon),27(sudo),999(docker)
# uid => User의 UID, gid => Primary Group의 GID, groups = User가 속해 있는 Groups들

# group 목록 확인
groups

 


 

User와 Group 정보 저장 (계정정보) 

 

Linux에서는 User와 Group정보를 여러 파일에 나누어 관리함

 

파일 역할
/etc/passwd User의 기본 계정 정보 저장
/etc/group Group 정보와 Group Member 저장
/etc/shadow Password Hash와 Password 정책 정보 저장

 

/etc/passwd

User의 기본 정보를 저장 

사용자명:x:UID:GID:설명:홈디렉토리:로그인쉘

 

필드 의미
User Name 계정 이름
x 실제 Password Hash는 /etc/shadow에 별도로 저장됨 
UID User ID
GID Primary Group의 GID
Home Directory User의 기본 작업 Directory
Login Shell 로그인 시 사용할 Shell

 

ex) user1:x:1000:1000::/home/user1:/bin/bash

 

[확인 명령어] 

# 등록된 User 확인
cat /etc/passwd

# 특정 User 확인
grep '^user1:' /etc/passwd

 

/etc/group

Group 정보와 해당 Group에 추가로 속한 User 목록을 저장 

그룹명:x:GID:멤버목록

 

필드 의미
Group Name Group 이름
GID Group ID
Member 해당 Group에 추가로 속한 User 목록

 

ex) developers:x:1001:user1,user2

 

[확인 명령어]

# Group 정보 확인
cat /etc/group

# 특정 Group 확인
grep '^developers:' /etc/group

 

 

/etc/shadow

User의 Password와 관련된 민감 정보를 저장

 

[주요정보]

  • Password Hash
  • Password 마지막 변경 시점
  • 최소 사용 기간
  • 최대 사용 기간
  • 만료 경고 기간
  • 계정 만료 관련 정보 

[특징]

- 일반 User의 접근은 제한되며, 관리자 권한으로 확인 가능 

 

[확인 명령어]

sudo cat /etc/shadow

 

 


 

User와 Group 생성 및 관리

 

구분 명령어 명령어 자체의 의미 옵션 옵션 의미 예시
User 생성 adduser 새로운 User를 생성. 배포판에 따라 Password, Home Directory 등의 설정을 대화형으로 진행하는 편의 명령어로 제공됨 - 기본 User 생성 sudo adduser user1
User 생성 useradd 새로운 User 계정을 생성하는 기본 계정 관리 명령어 - 기본 설정에 따라 User 생성 sudo useradd user1
      -m Home Directory 생성 sudo useradd -m user1
      -u UID UID 직접 지정 sudo useradd -u 1500 user1
      -g GROUP Primary Group 지정 sudo useradd -g developers user1
      -G GROUPS Supplementary Group 지정 sudo useradd -G docker,sudo user1
      -d PATH Home Directory 경로 지정 sudo useradd -d /home/user1 user1
      -s SHELL Login Shell 지정 sudo useradd -s /bin/bash user1
      -r System User 생성 sudo useradd -r appuser
Password passwd User의 Password를 설정하거나 변경 - Password 설정 또는 변경 sudo passwd user1
      -l Password 잠금 sudo passwd -l user1
      -u Password 잠금 해제 sudo passwd -u user1
User 수정 usermod 기존 User의 계정 정보를 변경 - 옵션과 함께 사용 -
      -aG GROUP 기존 Supplementary Group을 유지하면서 Group 추가 sudo usermod -aG docker user1
      -G GROUPS Supplementary Group 목록 지정 sudo usermod -G docker,sudo user1
      -g GROUP Primary Group 변경 sudo usermod -g developers user1
      -u UID UID 변경 sudo usermod -u 1500 user1
      -l NAME User Name 변경 sudo usermod -l newuser user1
      -d PATH Home Directory 경로 변경 sudo usermod -d /home/newuser user1
      -m -d와 함께 사용하여 기존 Home Directory 내용을 이동 sudo usermod -d /home/newuser -m user1
      -s SHELL Login Shell 변경 sudo usermod -s /bin/bash user1
      -L Password 잠금 sudo usermod -L user1
      -U Password 잠금 해제 sudo usermod -U user1
User 삭제 userdel User 계정을 삭제 - User만 삭제 sudo userdel user1
      -r Home Directory와 Mail Spool까지 함께 제거 sudo userdel -r user1
Group 생성 groupadd 새로운 Group을 생성 - 자동으로 GID를 할당하여 Group 생성 sudo groupadd developers
      -g GID GID 직접 지정 sudo groupadd -g 1500 developers
      -r System Group 생성 sudo groupadd -r appgroup
Group 수정 groupmod 기존 Group의 정보 변경 - 옵션과 함께 사용 -
      -n NAME Group Name 변경 sudo groupmod -n newgroup oldgroup
      -g GID GID 변경 sudo groupmod -g 1500 developers
Group 삭제 groupdel 기존 Group을 삭제 - Group 삭제 sudo groupdel developers

 


 

User 생성시 일어나는 변화

 

User 생성
   ↓
UID / GID 결정
   ↓
계정 정보 등록
   ↓
Primary Group 결정
   ↓
Home Directory 생성
   ↓
기본 환경 설정 File 복사

 

과정 설명
UID / GID 결정 User을 생성하면 해당 User을 식별하기 위한 UID가 할당됨. 
Primary Group을 새로 생성하는 방식이라면 Group에도 GID가 할당된다. 
계정 정보 등록 생성된 User의 기본 계정 정보가 System의 계정 정보에 등록됨
Password를 설정하면, Password 관련 정보 역시 별도로 관리되
Primary Group 결정 User에게는 하나의 Primary Group이 지정됨. 
환경과 생성 방법에 따라
=> 기존 Group을 Primary Group으로 지정 or User Name과 같은 Group을 새로 생성
 Home Directory 생성 Home Directory를 생성하도록 설정하면 User 전용 Directory가 만들어짐. 

ex) sudo useradd -m user1
=> -m은 Home Directory를 생성하도록 지정함. 
Home Directory는 해당 User의 개인 File과 설정 File등을 저장하는 기본 공간으로 사용됨.
기본 환경 설정 File 복사 Home Directory를 새로 생성할 때 /etc/ske1의 기본 File들이 복사될 수 있음
=> 이를 통해 새 User가 로그인했을 때 사용할 기본 Shell 환경을 구성할 수 있다. 

- 기본 Template 확인방법 : ls -la /etc/skel

 

 


 

Process와 User의 관계

Process와 User의 관계

Linux에서는 Process도 특정 User의 권한으로 실행됨. 

=> Process가 File이나 Directory에 접근할 때는 해당 Process가 어떤 UID/GID를 가지고 실행되고 있는지가 중요

 

 

ex) 사용자가 Terminal에서 다음 명령을 실행

cat test.txt

 

겉으로 보면 User가 test.txt를 읽는 것 처럼 보이지만, 실제 동작은 다음과 같음

User
 ↓
cat Process 실행
 ↓
Process가 User의 UID/GID를 가지고 실행
 ↓
Process가 test.txt에 접근
 ↓
Linux가 UID/GID와 File Permission 비교
 ↓
읽기 허용 / 거부

 

Process는 실행한 User과 항상 같은가?

항상 그런 것은 아님. 

일반적으로 Process는 자신을 실행한 User의 권한으로 시작하지만, Service의 설정이나 실행 방식에 따라 다른 User로 전환될 수 있다. 

ex) root로 Service 시작 → 초기 작업 수행 → www-data 등 제한된 User로 전환 → 실제 Worker Process 실행 

 

단순히 누가 Command를 실행했는가 보다는, 

실제로 동작 중인 Resource가 어떤 User로 실행되고 있는지를 확인하는 것이 중요

 

왜 Service마다 별도 User을 사용하는가?

Service를 모두 root 권한으로 실행하면 해당 Process가 System의 많은 Resource에 접근할 수 있게 된다

반대로 Service별로 별도 User를 사용하면 접근 범위를 제한할 수 있다. 

=> Process는 자신에게 필요한 Resource에만 접근하도록 권한을 구성할 수 있음

 

Process의 User 확인

ps aux

USER       PID   COMMAND
www-data   1201  nginx
mysql      1350  mysqld
redis      1420  redis-server

 

 

 


 

File / Directory의 소유권

 

Linux의 File과 Directory에는 소유 User와 소유 Group 정보가 존재. 

이 정보는 Permission을 적용할 대상을 구분할 때 사용됨

 

소유권 구성

구분 의미
Owner 해당 File / Directory의 소유 User
Group Owner 해당 File / Directory가 속한 Group

 

ex)

ls -l

 

-rw-r--r-- 1 user1 developers 1024 app.php
             │       │
           Owner    Group

 

Owner = user1

Group = developers

 

파일 생성 시 소유권 결정

File을 생성한 Process의 User가 해당 File의 Owner가 됨

 

Group 소유권 결정

Process의 Group 정보와 부모 Directory의 설정을 기준으로 결정 

다만 부모 Directory에 SGID와 같은 설정이 적용되어 있으면 부모 Directory의 Group을 상속할 수도 있음. 

 

소유권과 Permission

File의  Permission은 다음 세 대상을 기준으로 나눔

=> Owner, Group, Others

 

ex) 

-rwxr-xr-- 1 user1 developers app.sh

 

Owner = user1
Group = developers

 

Permission은 다음처럼 적용

rwx → Owner에게 적용
r-x  → Group에 적용
r--   → 그 외 User에게 적용

 

 

소유권 확인 

기본 확인

ls -l [FILE_OR_DIRECTORY]

 

 

출력형식]

[TYPE+PERMISSION] [LINK] [OWNER] [GROUP] [SIZE] [DATE] [NAME]
                                                            │       │
                                                      Owner    Group

 

주요옵션]

옵션 의미
-l 상세 정보 출력
-d Directory 내부가 아니라 Directory 자체의 정보 출력
-n User / Group Name 대신 UID / GID 숫자로 출력

 

Directory 자체 정보 확인

ls -ld [DIRECTORY]

 

출력 형식]

drwxr-xr-x [LINK] [OWNER] [GROUP] [SIZE] [DATE] [DIRECTORY_NAME]

 

UID/GID 숫자로 확인

ls -ln [PATH]

 

출력 형식]

-rw-r--r-- [LINK] [UID] [GID] [SIZE] [DATE] [NAME]
                    │     │
                   UID   GID

 

 

소유권 변경 

CHOWN

Owner를 변경하는 명령어

# 기본형식
chown [OPTION] [OWNER][:GROUP] [TARGET]

# Owner만 변경
sudo chown [OWNER] [TARGET]

# Owner과 Group을 함께 변경
sudo chown [OWNER]:[GROUP] [TARGET]

# Group만 변경
sudo chown :[GROUP] [TARGET]

# Directory 하위 항목까지 재귀적으로 변경
sudo chown -R [OWNER]:[GROUP] [DIRECTORY]

 

주요 옵션]

옵션 의미
-R Directory 하위 File / Directory까지 재귀적으로 변경
-v 변경 처리 내용을 출력
-c 실제로 변경된 항목만 출력

 

chgrp

Group만 변경하는 명령어

chgrp [OPTION] [GROUP] [TARGET]

 

주요옵션]

옵션 의미
-R Directory 하위 File / Directory까지 재귀적으로 Group 변경
-v 처리 내용을 출력
-c 실제로 변경된 항목만 출력

 


 

Permission

 

File과 Directory에는 Owner / Group / Others 각각에 대해 어떤 작업을 허용할지 나타내는 Permission이 설정됨 

 

Permission 대상

구분 의미
User (u) Owner에게 적용되는 Permission
Group (g) Group에 적용되는 Permission
Others (o) Owner와 Group에 해당하지 않는 나머지 User에게 적용되는 Permission

 

-rwxr-xr--
 │  │  │
 │  │  └─ Others
 │  └──── Group
 └─────── User(Owner)

 

Permission 종류

Permission 기호 숫자 값 File에서의 의미 Directory에서의 의미
Read r 4 File 내용 읽기 Directory의 Entry 목록 조회
Write w 2 File 내용 수정 Entry 생성, 삭제, 이름 변경
Execute x 1 실행 가능한 File 실행 Directory 내부 경로 접근

 

Permission 표기 구조

10자리 형식으로 표현

- | rwx | r-x | r--
│    │     │     │
│    │     │     └─ Others Permission
│    │     └─────── Group Permission
│    └───────────── Owner Permission
└────────────────── File Type

 

위치 의미
1번째 File Type

대표적 타입]
- :일반 File
d : directory 
l : symbolic link 
2~4번째 Owner Permission
5~7번째 Group Permission
8~10번째 Others Permission

 

숫자 표기

숫자로도 표기 가능

rwx
4 + 2 + 1
= 7

r-x
4 + 0 + 1
= 5

r--
4 + 0 + 0
= 4

 

ex) -rwxr-xr-- = 754

7 → Owner  = rwx
5 → Group  = r-x
4 → Others = r--

 

Permission 변경

chmod [OPTION] [MODE] [TARGET]

 

방식 

방식 설명
Numeric Mode r, w, x의 숫자 값을 합산해 Permission을 지정함

ex) chmode 755 [TARGET] 
Owner  → 7 → rwx
Group  → 5 → r-x
Others → 5 → r-x
Symbolic Mode  기존 Permission 전체를 수자로 다시 지정하지 않고 특정 대상의 특정 Permission만 추가/제거/지정 가능 

대상]
u - Owner
g - Group
o - Others
a - All

연산자]
+ - Permission 추가
- - Permission 제거
= - Permission을 지정된 값으로 설정 


ex) Group에 Write Permission 추가  : chmod g+w [TARGET] 
ex) Others의 모든 기본 Permission 제거 : chmod o-rwx [TARGET]
ex) Owner에는 Read/Write만 지정 : chmod u=rw [TARGET] 

 

주요옵션]

옵션 의미
-R Directory 하위 File / Directory까지 재귀적으로 Permission 변경
-v 처리되는 항목의 내용을 출력
-c 실제로 Permission이 변경된 항목만 출력

 

 


 

Permission 판단 과정

 

Process가 Resource 접근 시도
        ↓
Process의 UID / GID 확인
        ↓
Resource의 Owner UID / Group GID와 비교
        ↓
Owner / Group / Others 중 하나 선택
        ↓
해당 영역의 Permission 확인
        ↓
허용 / 거부

 

1. Owner인가?
   ↓ Yes
   Owner Permission 사용



2. Owner가 아니라면 Group에 해당하는가?
   ↓ Yes
   Group Permission 사용

3. 둘 다 아니면
   Others Permission 사용

 

ex) -rw-r----- 

Owner  → rw-
Group  → r--
Others → ---

대상 적용 Permission Read Write
Owner rw- 가능 가능
Group r-- 가능 불가능
Others --- 불가능 불가능

 

 


 

root, sudo, su

 

일반 User는 System 전체를 자유롭게 변경할 수 없도록 권한이 제한되어 있음

반면 Linux에는 System 관리 작업을 수행할 수 있는 root User가 존재함

 

root

Linux의 관리자 User이며 UID 0을 가짐

  • User / Group 생성 및 삭제
  • System 설정 변경
  • File 소유권 변경
  • Service 관리
  • System Directory 수정

 

sudo

허용된 User가 특정 Command를 다른 User의 권한으로 실행하도록 하는 명령어 

필요한 Command에만 높은 권한을 적용할 수 있음.

sudo [OPTION] [COMMAND]

 

옵션 의미
-u [USER] 지정한 User의 권한으로 Command 실행
-i 대상 User의 Login Shell 환경으로 실행
-s Shell 실행
-l 현재 User에게 허용된 sudo 권한 확인

 

sudo 권한 관리

모든 User가 sudo를 사용할 수 있는 것은 아님

어떤 User가 어떤 Command를 어떤 권한으로 실행할 수 있는지는 sudo 설정을 통해 관리됨 

 

대표적인 설정은 다음과 관련됨

/etc/sudoers

/etc/sudoers.d/

 

설정 직접 수정]

sudo visudo

 

su

현재 Shell에서 다른 User로 전환할 때 사용

su [USER]

# root로 전환
su -

# 특정 User로 전환
su - [USER]

 

 


 

umask

 

개념

새로 생성되는 File과 Directory에서 제외할 Permission을 지정하는 값

=> 즉, 최종 Permission을 직접 지정하는 값이 아니라, 기본 Permission에서 어떤 권한을 제거할지를 정함. 

 

일반적인 기준값]

대상 기본 Permission 기준
File 666
Directory 777

 

기본 Permission 계산

ex)

umask

 

결과]

0022

 

계산방법]

File : 666 - 022 = 644 = rw-r--r--

Directory : 777 - 022 = 755 = rwxr-xr-x

 

명령어

## 현재 적용 중인 umask 확인
umask 
# 출력형식 : [MASK]

## Permission 형태로 확인
umask -S
# 출력형식 : u=[PERMISSION],g=[PERMISSION],o=[PERMISSION]\

## umask 값 변경
umask [MASK]

# ex) umask 0022 => File : 666-022=644, Directory : 777-022=755

 

 


 

특수 Permission

 

특정 상황에서 사용 

 

SUID(Set User ID)

실행 File을 실행한 User가 아니라 해당 File의 Owner 권한으로 실행되도록 하는 Permission 

주로 실행 File에 적용함 

 

[표기]

표기]

Owner의 Execute 위치에 s가 표시됨

-rwsr-xr-x

 

숫자 표기]

앞에 4를 추가함

4755

 

[설정]

chmod u+s [TARGET]

chmod 4[PERMISSION] [TARGET]

 

 

SGID(Set Group ID)

적용 대상에 따라 의미가 다름

실행 File => 해당 파일의 Group 권한으로 Process가 실행될 수 있음

Directory => 새로 생성되는 File이나 Directory가 부모 Directory의 Group을 상속하도록 하는 데 사용

 

[사용]

여러 User가 하나의 Group으로 같은 Directory를 공동 작업할 때 유용 

 

[표기]

Group의 Execute 위치에 s가 표시됨 

drwxrwsr-x
      │
      └─ SGID

 

숫자표기]

앞에 2를 추가

2775

 

 

[설정]

chmod g+s [TARGET]
chmod 2[PERMISSION] [TARGET]

 

 

 

Sticky Bit

주로 여러 User가 Write 가능한 공유 Directory에서 File삭제를 제한하기 위해 사용 

=> 일반적으로 Directory에 Write Permission이 있으면 Directory 내부 Entry를 삭제할 수 있음. 
Stick Bit를 설정하면 공유 Directory 안에서도 일반적으로 File Owner, Directory Owner 또는 관리자 권한을 가진 User만 해당 File을 삭제하거나 이름을 변경할 수 있도록 제한

 

ex) /tmp와 같은 공유 Directory 

 

[표기]

Others의 Execute 위치에 t 표시

drwxrwxrwt
                 │
                └─ Sticky Bit

 

숫자 표기]

앞에 1을 추가

1777

 

[설정]

chmod +t [DIRECTORY]
chmod 1[PERMISSION] [DIRECTORY]