| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 데코레이터패턴
- PHP
- 어댑터패턴
- MCP
- 객체지향
- SQL
- 인덱스
- LLM
- docker network
- MySQL
- 라라벨
- mcp client
- ai agent
- mcp server
- Laravel
- OOP
- ai 에이전트
- dhgrp
- 디자인패턴
- Tool Calling
- 매직메서드
- Agent Loop
- PHP객체지향
- linux 권한
- docker
- SQL문법
- 객체복제
- SQL기초
- 소프트웨어설계
- 데이터베이스
- Today
- Total
개발블로그
Linux 사용자와 권한 구조 - User, Group, UID/GID와 Permission 본문
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]'STUDY > Server' 카테고리의 다른 글
| Linux 사용자와 권한 구조 - User, Group, UID/GID와 Permission (0) | 2026.08.29 |
|---|