Linux File Permissions Handbook (파일 권한 정리 핸드북)

1. Linux 권한의 3요소

Linux의 권한은 간단하지만 강력한 원칙을 따른다.

모든 파일과 디렉터리에는 세 가지 사용자 그룹에 대해 세가지 유형의 접근 권한이 있다.

  • Linux는 “최소 권한 원칙(Principle of Least Privilege)“을 따른다.
    사용자와 프로세스에게 작업 수행에 필요한 최소한의 권한만 부여하는 것이 보안의 기본이다.

1.1 권한 유형

• 읽기 (r)  –  파일 내용 보기 또는 디렉터리 목록 조회
• 쓰기 (w)  –  파일 내용 수정 또는 디렉터리 내 파일 생성·삭제
• 실행 (x)  –  파일을 프로그램으로 실행하거나 디렉터리에 진입

1.2 사용자 그룹

• 소유자 (u, user)   –  파일을 소유한 사용자
• 그룹 (g, group)    –  해당 파일의 그룹에 속한 사용자들
• 기타 (o, others)   –  시스템의 모든 다른 사용자

2. 권한 문자열 읽기

2.1 문자열 구조 분석

맨 앞의 문자는 파일의 유형을 나타내고, 이후 9개의 문자가 3개씩 나뉘어 소유자·그룹·기타의 권한을 나타낸다.

-a : 숨김 파일 포함 (.으로 시작하는 파일)
-l : 상세 정보(long format) 출력
-h : human readable (KB, MB, GB)

[lycos7560@DMT-RL01 ~]$ ls -alh
total 24K
drwx------. 3 lycos7560 lycos7560  132 Mar 16 05:38 .
drwxr-xr-x. 4 root      root        39 Mar 16 04:59 ..
-rw-------. 1 lycos7560 lycos7560 3.3K Mar 17 05:21 .bash_history
-rw-r--r--. 1 lycos7560 lycos7560   18 Oct 29  2024 .bash_logout
-rw-r--r--. 1 lycos7560 lycos7560  144 Oct 29  2024 .bash_profile
-rw-r--r--. 1 lycos7560 lycos7560  522 Oct 29  2024 .bashrc
drwx------. 3 lycos7560 lycos7560   20 Mar 12 07:19 .config
-rw-------. 1 lycos7560 lycos7560   38 Mar 11 04:36 .lesshst
-rw-r-x---. 1 root      root        12 Mar 16 05:38 myfile.txt


# 현재 사용자 및 그룹 확인
id
[lycos7560@DMT-RL01 ~]$ id
uid=1000(lycos7560) gid=1000(lycos7560) groups=1000(lycos7560),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

# 특정 사용자가 속한 그룹 확인
groups lycos7560
[lycos7560@DMT-RL01 ~]$ groups lycos7560
lycos7560 : lycos7560 wheel (wheel은 내가 넣음)
-  rwx  r-x  r--
│   │    │    │
│   │    │    └── 기타(Others): 읽기 전용
│   │    └─────── 그룹(Group): 읽기 및 실행
│   └──────────── 소유자(Owner): 읽기, 쓰기, 실행
└──────────────── 파일 유형 (- = 파일, d = 디렉터리)

2.2 파일 유형 기호

기호의미
일반 파일
d디렉터리(Directory)
l심볼릭 링크(Symbolic Link)
c문자 장치 파일(Character Device)
b블록 장치 파일(Block Device)
s소켓(Socket)
p파이프(Named Pipe) – FIFO(First In, First Out)

🔁 p – FIFO (이름 있는 파이프, Named Pipe)

  • 용도관계 없는 프로세스 간에 데이터를 한 방향으로 주고받는 통로
  • 주요 사용 상황:
    • 서로 다른 셸/터미널에서 실행 중인 프로세스가 통신할 때
    • 일회성 작업 자동화: 한 프로그램이 데이터를 만들어 FIFO에 쓰고, 다른 프로그램이 그 데이터를 읽어서 처리
    • 로그 전달: 한 프로세스의 출력을 FIFO에 쓰고, 다른 프로세스가 실시간으로 읽어 로그 서버로 전송
    • 데이터베이스 덤프/복원 파이프라인에서 중간 임시 저장소로 활용

특징:

  • 파일 시스템에 경로가 존재하므로, 완전히 독립적인 프로세스들도 해당 파일 이름만 알면 연결 가능
  • 일반 파이프(|)는 부모-자식 관계에서만 쓸 수 있지만, FIFO는 아무 프로세스나 붙을 수 있음
  • 한쪽이 쓰기 전용, 다른 쪽이 읽기 전용으로 열어야 작동 (양쪽이 모두 열려야 데이터가 흐름)
  • 동시에 여러 프로세스가 읽거나 쓸 수 있음

실전 예:

bash

# 터미널 1: FIFO 생성 및 읽기
mkfifo /tmp/mypipe
cat /tmp/mypipe

# 터미널 2: 데이터 쓰기
echo "Hello from another process" > /tmp/mypipe

→ 터미널 1에 “Hello from another process”가 출력됩니다.

🔗 l – 심볼릭 링크(Symbolic Link)

  • 용도: 다른 파일이나 디렉터리를 가리키는 바로가기
  • 주요 사용 상황:
    • 라이브러리 이름 관리: libxyz.so -> libxyz.so.1.2.3처럼 버전별 링크
    • 경로 단순화: 긴 경로 대신 짧은 이름으로 접근 (ln -s /long/path/to/app app)
    • 설정 파일 관리: 여러 프로그램이 같은 설정을 공유할 때
    • 시스템 부팅 시 실행 순서 관리 (/etc/rc.d/rc3.d/Ssshd -> ../init.d/sshd)

:

bash

ls -l /usr/bin/python
lrwxrwxrwx. 1 root root 16 Jul 21 10:00 /usr/bin/python -> /usr/bin/python3

l로 시작하고, -> 뒤에 원본이 표시됩니다.


🔡 c – 문자 장치 파일(Character Device)

  • 용도: 데이터를 문자(byte) 단위로 순차적으로 읽고 쓰는 장치
  • 주요 사용 상황:
    • 터미널, 키보드, 마우스 같은 입력 장치
    • 직렬 포트, 사운드 카드 같은 스트리밍 장치
    • /dev/null/dev/zero/dev/random 같은 가상 장치
    • 모뎀, 프린터(예전 방식) 등 한 글자씩 전송하는 장치

특징: 버퍼링 없이 직접 바로 읽고 씁니다.
보통 위치/dev/ 아래에 존재 (/dev/tty/dev/input/mice)

bash

ls -l /dev/tty
crw-rw-rw-. 1 root tty 5, 0 Jul 21 12:34 /dev/tty

c로 시작, 파일 크기 대신 주번호, 부번호가 표시됩니다.


🧱 b – 블록 장치 파일(Block Device)

  • 용도: 데이터를 블록(일정 크기 덩어리) 단위로 읽고 쓰는 장치
  • 주요 사용 상황:
    • 하드디스크, SSD, USB 메모리, CD-ROM 등 저장 장치
    • 파일 시스템을 마운트할 수 있는 거의 유일한 유형
    • 데이터베이스가 직접 블록 장치를 제어할 때도 사용

특징: 커널이 내부적으로 버퍼/캐시를 사용해 효율적으로 읽고 씁니다.
보통 위치/dev/sda/dev/nvme0n1/dev/loop0

bash

ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 Jul 21 12:34 /dev/sda

b로 시작하며, c와 마찬가지로 주/부번호를 가집니다.


🧩 s – 소켓(Socket)

  • 용도: 프로세스 간 통신(IPC)을 위한 파일 시스템상의 엔드포인트
  • 주요 사용 상황:
    • 데이터베이스 서버: MySQL(/var/lib/mysql/mysql.sock), PostgreSQL 등이 로컬 접속용으로 사용
    • 도커/var/run/docker.sock으로 데몬과 통신
    • 시스템 서비스: systemd의 저널 소켓(/run/systemd/journal/socket), D-Bus 등
    • 웹 서버가 백엔드 앱 서버와 통신할 때 (PHP-FPM, uWSGI 소켓)

특징: 네트워크 소켓과 달리 IP 주소 없이 파일 경로만으로 연결하며, 오버헤드가 적고 빠릅니다.
보통 위치/var/run//tmp//run/ 디렉터리

bash

ls -l /run/docker.sock
srw-rw----. 1 root docker 0 Jul 20 15:22 /run/docker.sock

s로 시작하며, 파일 크기는 보통 0으로 표시됩니다.


요약 비교

유형기호한 줄 설명실제 예
심볼릭 링크l다른 파일을 가리키는 포인터python -> python3
문자 장치c글자 단위로 읽는 장치 (터미널 등)/dev/tty/dev/null
블록 장치b블록 단위로 읽는 저장 장치/dev/sda/dev/nvme0n1
소켓s로컬 프로세스 간 데이터 교환 통로/run/docker.sock, MySQL 소켓
FIFO(파이프)p관계 없는 프로세스 간 단방향 데이터 통로/tmp/mypipe

3. 자주 사용하는 권한 패턴 명령어

3.1 파일 권한

숫자기호설명주요 용도
644rw-r–r–소유자: 읽기/쓰기, 나머지: 읽기 전용일반 텍스트, 설정 파일
755rwxr-xr-x소유자: 모든 권한, 나머지: 읽기+실행스크립트, 실행 파일
600rw——-소유자만 읽기/쓰기 가능SSH 키, 비밀번호 파일
400r——–소유자만 읽기 가능 (쓰기 불가)백업 파일, 중요 설정
777rwxrwxrwx모든 사용자가 모든 권한매우 위험! (보안의 문제 사용을 지양)

3.2 디렉터리 권한

숫자기호설명주의사항
755rwxr-xr-x표준 디렉터리 권한일반적으로 가장 많이 사용
700rwx——소유자만 접근 가능한 비공개 디렉터리개인 데이터 폴더에 적합
775rwxrwxr-x소유자와 그룹 모두 쓰기 가능팀 협업 폴더에 사용
644rw-r–r–❌ 사용 불가실행(x) 권한 없이 디렉터리 진입 불가

⚠  디렉터리와 실행 권한

디렉터리에서 실행(x) 권한은 “진입 권한”을 의미한다.

 읽기(r)만 있고 실행(x)이 없으면 디렉터리 안에 파일이 있다는 사실은 알아도 접근할 수 없다.

반드시 실행 권한을 포함해야 합니다.


4. chmod로 권한 변경하기

4.1 기호 방식

기호 방식은 매우 직관적이며 현재 권한을 유지한 채 특정 권한만 추가하거나 제거할 때 유용하다.

기호의미
u소유자(user)
g그룹(group)
o기타(others)
a모두(all) = u+g+o
+권한 추가
권한 제거
=권한 설정(기존 권한 덮어쓰기)
# 소유자에게 실행 권한 부여
chmod u+x myfile

# 그룹의 쓰기 권한 제거
chmod g-w myfile

# 기타 사용자에게 읽기 권한 부여
chmod o+r myfile

# 모든 사용자에게 실행 권한 부여
chmod a+x myfile

# 그룹 권한을 읽기+실행으로 정확히 설정 (= 사용)
chmod g=rx myfile

# 여러 권한을 동시에 변경 (콤마로 구분)
chmod u+x,g-w,o+r myfile

4.2 숫자 방식

숫자 방식은 빠르고 정확하다.

각 자리는 소유자·그룹·기타의 권한을 나타내며 r=4, w=2, x=1을 더해 계산한다.

권한이진수10진수
0000
–x0011
-w-0102
-wx0113
r–1004
r-x1015
rw-1106
rwx1117
예: 755 = 소유자(7=rwx) + 그룹(5=r-x) + 기타(5=r-x)

chmod 755 myfile       # rwxr-xr-x
chmod 644 myfile       # rw-r--r--
chmod 600 myfile       # rw-------
chmod 400 myfile       # r--------
chmod 700 mydir        # rwx------

4.3 재귀적 권한 변경 (-R 옵션)

디렉터리와 그 안의 모든 파일/하위 디렉터리에 권한을 일괄 적용할 때 사용한다.

# 웹 서버 디렉터리 전체 권한 설정
sudo chmod -R 755 /var/www/html/

# 특정 패턴의 파일만 선택적으로 변경
find /var/www/html -type f -exec chmod 644 {} \;
find /var/www/html -type d -exec chmod 755 {} \;

# 파일과 디렉터리 권한 분리 팁
chmod -R 755를 사용하면 파일도 755(실행 가능)가 되어 보안상 좋지 않다.
find 명령으로 파일(644)과 디렉터리(755)를 따로 설정하는 것을 권장.

5. chown 으로 소유권 변경하기

chown 명령으로 파일의 디렉터리의 소유자와 그룹을 변경할 수 있다.

일반적으로 관리자 권한(sudo)이 필요하다.

5.1 소유자 변경

# 소유자를 alice로 변경
sudo chown alice myfile

# 소유자를 alice, 그룹을 staff로 동시 변경
sudo chown alice:staff myfile

# 그룹만 developers로 변경 (콜론 앞 생략)
sudo chown :developers myfile

5.2 재귀적 소유권 변경

# 디렉터리 전체 소유자와 그룹 변경
sudo chown -R alice:staff /home/alice/projects/

# 소유자만 재귀적으로 변경
sudo chown -R www-data /var/www/html/

5.3 chgrp 명령 (그룹 전용 변경)

그룹만 변경하고 싶을 때는 chgrp 명령을 사용할 수도 있다.

sudo chgrp developers myfile
sudo chgrp -R developers /srv/project/

6. 특수 권한 (고급)

일반 rwx 외에 시스템 관리에 중요한 역할을 하는 SetUID, SetGID, Sticky Bit 세 가지 특수 권한이 있다.

권한 유형명령어 예시설명
SetUID (4xxx)chmod 4755 file실행 시 소유자 권한으로 동작 (예: /usr/bin/passwd)
SetGID (2xxx)chmod 2755 dir파일을 소유자 그룹으로 생성, 공유 폴더에 유용
Sticky Bit (1xxx)chmod 1777 /tmp파일 소유자만 삭제 가능 (/tmp 디렉터리에 사용)
# SetUID 설정 (소유자 권한으로 실행)
chmod 4755 myprogram    # 또는: chmod u+s myprogram

# SetGID 설정 (그룹 권한 상속)
chmod 2755 shared_dir   # 또는: chmod g+s shared_dir

# Sticky Bit 설정 (소유자만 삭제 가능)
chmod 1777 /tmp         # 또는: chmod +t /tmp

# ls -l에서 특수 권한 확인
# -rwsr-xr-x  → SetUID (소유자 x 자리에 s)
# -rwxr-sr-x  → SetGID (그룹 x 자리에 s)
# drwxrwxrwt  → Sticky Bit (기타 x 자리에 t)

- SetUID 보안 주의
SetUID가 설정된 프로그램은 실행 시 소유자(보통 root로 설정) 권한으로 동작한다.
불필요한 파일에 SetUID를 설정하면 심각한 보안 취약점이 될 수 있다.
반드시 필요한 경우에만 사용.

7. umask – 기본 권한 마스크

새 파일이나 디렉터리를 생성할 때 자동으로 적용되는 기본 권한을 제어한다.

7.1 umask 동작 원리

  • 파일 최대 권한: 666 (rw-rw-rw-) 실행 권한은 기본적으로 부여되지 않음
  • 디렉터리 최대 권한: 777(rwxrwxrwx)
  • 실제 권한 = 최대 권한 – umask 값
# 현재 umask 확인
umask
[lycos7560@DMT-RL01 ~]$ umask
0022

# umask 022 적용 시 (가장 일반적)
# 파일:     666 - 022 = 644 (rw-r--r--)
# 디렉터리: 777 - 022 = 755 (rwxr-xr-x)

# umask 변경 (현재 세션에만 적용)
umask 027

# 영구 적용: ~/.bashrc 또는 /etc/profile에 추가
echo "umask 027" >> ~/.bashrc

8. 실무 팁 & 자주 하는 실수

상황원인해결 방법
스크립트 실행 안 됨실행(x) 권한 없음chmod +x script.sh
디렉터리 진입 불가실행(x) 권한 없음chmod 755 dirname
파일 수정 안 됨쓰기(w) 권한 없음chmod u+w filename
sudo 없이 chown 불가일반 사용자 제한sudo chown 사용
777 설정 후 보안 문제과도한 권한 부여chmod 755 또는 644로 변경

보안 체크리스트

① 민감한 파일(SSH 키, 설정 파일)은 600 또는 400 사용  

② 웹 서버 파일은 644, 디렉터리는 755  

③ 777은 절대 사용하지 않기  

④ SetUID 파일 주기적 점검: find / -perm -4000 -ls 2>/dev/null

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤