Step 23. 권한 1 — rwx, 파일에 새겨진 규칙

Step 23. 권한 1 — rwx, 파일에 새겨진 규칙

Level 0 — 컴퓨터 조작과 구조의 이해 | 난이도 ★★☆☆☆ | 예상 소요 시간 3시간

전제: Step 18~22의 리눅스 기본 명령과 에디터 사용법을 알아야 합니다. 우분투 가상머신(또는 WSL)이 필요합니다.

  • 준비물: 우분투 터미널.
  • 주의: 오늘 실습은 안전합니다. 내 홈 폴더 안에서 연습용 파일·폴더를 만들고 권한을 바꾸는 것이 전부입니다.
  • 안내: 시스템 파일의 권한을 읽는 조회 명령은 실측했고, 권한을 바꾸는 chmod 실험의 출력은 "출력 예시"로 표기했습니다.

집에 현관문이 있듯이, 리눅스의 모든 파일과 폴더에는 "문"이 달려 있습니다. 그리고 각 문에는 "누가 열 수 있는가"가 적혀 있습니다. 이것이 리눅스의 권한(permission) 시스템입니다. ls -l을 칠 때마다 봤던 -rwxr-xr-- 같은 수수께끼 문자열 — 오늘 그것을 읽게 됩니다.

보안 공부에서 권한은 거의 모든 것의 기초입니다. "이 파일을 왜 못 읽지?"라는 질문은 권한 문제이고, 해커가 시스템을 장악한 뒤 하는 일의 상당수는 "더 높은 권한 얻기"입니다. 오늘 우리는 그 규칙의 문자열을 읽는 법부터 배웁니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • ls -l 출력 맨 앞의 -rwxr-xr-- 같은 문자열을 등급별로 해석한다
  • 소유자(owner)·그룹(group)·기타(others) 세 등급과 r·w·x 세 동작을 설명한다
  • 권한 문자열과 8진수 표기(644, 755 등)를 양방향으로 변환한다
  • chmod 숫자 표기와 문자 표기로 파일 권한을 바꾼다
  • 파일의 x(실행)와 폴더의 x(출입)가 다름을 실험으로 확인한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 우분투 터미널(배시 셸), 인터넷 불필요
오늘의 명령어 ls -l(권한 보기), chmod(권한 바꾸기), umask(기본 권한 확인), touch·mkdir(실험 대상 만들기)
필요한 개념 소유자·그룹·기타 3등급, r·w·x 3동작, 8진수 권한 표기, umask

2-1. 세 종류의 사용자

권한은 "누구에게"를 세 등급으로 나눕니다.

  • 소유자(user, u): 파일의 주인. 보통 파일을 만든 사람입니다.
  • 그룹(group, g): 파일에 지정된 사용자 그룹. 예를 들어 "개발팀" 그룹 전체에 읽기를 허용하는 식입니다.
  • 기타(others, o): 소유자도 아니고 그룹 멤버도 아닌 나머지 전부. 사실상 "아무나"입니다.

2-2. 세 종류의 행위

"무엇을 할 수 있는가"는 세 가지 동작으로 나뉩니다.

  • r (read, 읽기): 내용을 볼 수 있다. 파일이면 cat으로 읽기, 폴더면 ls로 목록 보기.
  • w (write, 쓰기): 내용을 바꾸거나 지울 수 있다.
  • x (execute, 실행): 파일이면 프로그램으로 실행할 수 있다. 폴더면 그 안으로 "들어갈 수 있다(cd)"는 뜻 — 초보가 가장 많이 헷갈려하는 지점입니다.

2-3. 그룹은 왜 있는가

"소유자"와 "기타"만 있으면 될 텐데 왜 굳이 "그룹"이 있을까요? 회사 서버를 상상해 보세요. 개발팀 5명이 공유하는 프로젝트 폴더가 있습니다. "모두에게 열기(others에 권한)"로 두면 다른 부서 사람도 들여다봅니다. 반대로 소유자 한 명만 권한을 가지면 협업이 안 됩니다.

이때 "개발팀 그룹"을 만들고 폴더의 그룹을 개발팀으로 지정하면, 팀원에게만 권한을 주면서 나머지는 막을 수 있습니다. 그룹은 "특정 집단에게만 권한을 묶어 주는" 장치입니다. 한 사용자는 여러 그룹에 속할 수 있고, groups 명령으로 내가 속한 그룹을 볼 수 있습니다. 지금은 "중간 등급은 팀 단위 권한 관리용"이라는 존재 이유만 기억하세요.

2-4. 권한 문자열 해부하기

ls -l 출력 맨 앞에는 항상 10글자가 있습니다:

-rwxr-xr--
  • 첫 글자: 파일 종류. -는 일반 파일, d는 폴더(directory)
  • 다음 3글자: 소유자의 권한. rwx = 읽기·쓰기·실행 모두 가능
  • 다음 3글자: 그룹의 권한. r-x = 읽기·실행만 가능, 쓰기 불가(-는 "없음" 표시)
  • 마지막 3글자: 기타의 권한. r-- = 읽기만 가능

즉 이 문자열은 "주인은 다 해도 되고, 그룹은 읽고 실행만, 나머지는 읽기만"이라는 규칙입니다.

2-5. 숫자로 쓰는 권한 — 8진수

권한을 바꿀 때는 문자열 대신 숫자를 쓰는 경우가 많습니다. 규칙은 간단합니다:

  • r = 4, w = 2, x = 1
  • 한 등급의 권한은 이 셋의 합. 예: rwx = 4+2+1 = 7, r-x = 4+0+1 = 5, r-- = 4 = 4

세 등급을 붙여 쓰면 754 같은 세 자리 숫자가 됩니다. rwxr-xr--은 7·5·4, 즉 754입니다. 자주 보는 조합:

숫자 문자열 의미
644 rw-r–r– 일반 파일 기본값. 주인만 수정, 모두 읽기
755 rwxr-xr-x 실행 파일·폴더 기본값. 모두 읽고 실행, 주인만 수정
600 rw——- 비밀 파일. 주인만 읽고 쓰기
700 rwx—— 비밀 폴더. 주인만 출입

4, 2, 1이 하필 그 숫자인 이유는 2진수의 자릿수(100, 010, 001)이기 때문입니다. 컴퓨터는 권한을 9개의 스위치(3등급 × 3동작)로 저장하고, 우리는 그걸 8진수 세 자리로 읽는 것뿐입니다.


3. 따라 하기

3-1. 실제 시스템의 권한 문자열 읽기

연습 파일을 만들기 전에, 지금 눈앞의 우분투에서 진짜 권한들을 읽어 봅시다. 조회는 시스템을 전혀 바꾸지 않습니다:

ls -l /etc/passwd /bin/ls
-rwxr-xr-x 1 root root   142312 Jun 23  2025 /bin/ls
-rw-r--r-- 1 root root     1490 Sep  8 21:12 /etc/passwd

(2026-09-09 우분투 24.04 실측. 크기·날짜는 환경마다 다릅니다.)

출력 읽는 법: /bin/ls(방금 우리가 쓴 ls 명령의 실체)는 -rwxr-xr-x, 즉 755입니다 — "주인(root)은 수정 가능, 모두 읽고 실행 가능". 여러분이 ls를 실행할 수 있는 이유가 바로 저 x 세 개입니다. /etc/passwd는 644 — "모두 읽기 가능, 수정은 root만". 사용자 명단이라 모두 읽을 수 있어야 하기 때문입니다.

폴더의 권한도 봅시다. -d 옵션은 "폴더 내용 말고 폴더 자체를 보여 줘"입니다:

ls -ld /home /etc /tmp
drwxr-xr-x 100 root root 4096 Sep  9 11:28 /etc
drwxr-xr-x   2 root root 4096 Apr 22  2024 /home
drwxrwxrwt   9 root root 4096 Sep  9 11:28 /tmp

(2026-09-09 실측.)

읽는 법: 맨 앞이 전부 d — 폴더입니다. /etc/home은 755 — 모두 들어갈(x) 수 있지만 쓰기는 root만. /tmpdrwxrwxrwt — 모두에게 rwx가 열린 임시 광장이고, 마지막의 t는 "남의 파일은 못 지운다"는 특수 장치(sticky bit)입니다. 지금은 "특수한 한 글자가 더 있다" 정도만 보고 넘어가세요.

3-2. 기본 권한은 어디서 오는가 — umask

새 파일에 644, 새 폴더에 755가 자동으로 붙는 이유를 확인해 봅시다:

umask
0022

(2026-09-09 실측.)

읽는 법: umask는 "기본 최대 권한에서 깎아 낼 수치"입니다. 파일의 최대는 666(실행 권한은 기본으로 주지 않음), 폴더의 최대는 777인데, 여기서 022를 깎으면 — 파일 644, 폴더 755. 3-1절에서 본 기본값들의 출처입니다. 권한은 "아무것도 없는 상태에서 추가"가 아니라 "기본값이 있고 조정"하는 개념입니다.

3-3. 내 파일의 권한 보기와 바꾸기

이제 직접 만든 파일로 실험합니다:

cd ~
touch report.txt
ls -l report.txt
-rw-rw-r-- 1 lee lee 0  9월 9일 10:23 report.txt

(출력 예시 — touch는 파일을 만드는 명령이라 본 챕터 실측 환경에서는 실행하지 않았습니다. 권한 부분은 환경의 umask에 따라 644 또는 664로 나옵니다.)

읽는 법: -rw-rw-r--를 해석해 봅시다. - 일반 파일, rw- 소유자는 읽기·쓰기, rw- 그룹도 읽기·쓰기, r-- 기타는 읽기만. 그 뒤의 lee lee는 소유자 이름과 그룹 이름입니다.

chmod 첫 실험:

echo "아주 중요한 비밀" > secret.txt
chmod 600 secret.txt
ls -l secret.txt
-rw------- 1 lee lee 18  9월 9일 10:25 secret.txt

(출력 예시.)

읽는 법: chmod는 "change mode(권한 바꾸기)"의 약자입니다. 권한이 rw-------로 바뀌었습니다 — 소유자만 읽기·쓰기, 그룹·기타는 전부 불가. 6 = r+w(4+2), 0 = 아무 권한 없음, 0 = 아무 권한 없음. 숫자와 문자열이 정확히 일치함을 눈으로 확인하세요.

예측해 보기: chmod 000 secret.txt를 실행하면 파일 주인인 내가 cat secret.txt를 읽을 수 있을까요? (정답: 주인도 못 읽습니다. cat: secret.txt: Permission denied가 뜹니다. 확인했으면 chmod 600 secret.txt로 복구하세요. 단, root는 이 규칙의 예외입니다 — 그 이야기는 Step 24에서.)

3-4. 실행 권한(x) 체험하기

Step 22에서 배운 nano로 스크립트를 하나 만듭니다:

nano run.sh

nano 안에서 다음 두 줄을 쓰고 저장(Ctrl+O, Enter) 후 종료(Ctrl+X)합니다:

#!/bin/bash
echo "스크립트가 실행됐습니다!"

이제 권한을 보고 실행해 봅니다:

ls -l run.sh
./run.sh
-rw-rw-r-- 1 lee lee 45  9월 9일 10:30 run.sh
bash: ./run.sh: Permission denied

(출력 예시.)

읽는 법: "허가 거부". 이 파일에는 x 권한이 없으므로 실행할 수 없습니다. 여기서 ./는 "현재 폴더의"라는 뜻 — 리눅스는 현재 폴더를 실행 경로에서 찾지 않으므로 꼭 붙여야 합니다.

x를 주고 다시 실행합니다:

chmod +x run.sh
ls -l run.sh
./run.sh
-rwxrwxr-x 1 lee lee 45  9월 9일 10:30 run.sh
스크립트가 실행됐습니다!

(출력 예시.)

읽는 법: +x는 "모든 등급에 x를 추가"하라는 뜻입니다. 권한이 rwxrwxr-x로 바뀌었고 실행됐습니다.

: 리눅스에서 파일이 "프로그램인가"는 확장자가 아니라 x 권한이 결정합니다. .sh라는 이름은 사람을 위한 표시일 뿐, 시스템은 x 비트만 봅니다. 윈도우의 .exe 사고방식과 다른 중요한 차이입니다.

3-5. 폴더의 x는 "출입권"

mkdir secret_room
echo "방 안의 보물" > secret_room/treasure.txt
chmod 644 secret_room
ls secret_room
ls: cannot open directory 'secret_room': Permission denied

(출력 예시.)

읽는 법: r은 줬지만 x를 뺏었더니 목록조차 볼 수 없습니다. 폴더에서 x가 빠지면 ls가 실패합니다.

chmod 755 secret_room
ls secret_room
cat secret_room/treasure.txt
treasure.txt
방 안의 보물

(출력 예시.)

: 폴더에서 x는 "실행"이 아니라 "들어갈 수 있음"입니다. 방문 앞에서 목록을 읽는 것(r)과 방에 들어가는 것(x)이 분리되어 있다고 생각하면 이해가 쉽습니다. 그래서 폴더에는 보통 r과 x를 세트로 줍니다 — 폴더 기본값이 755인 이유입니다.

3-6. 문자 표기로 더하기·빼기

숫자(8진수) 외에도 문자로 권한을 주고 뺄 수 있습니다. 등급 기호 u(소유자)·g(그룹)·o(기타)·a(전부)와 연산 기호 +(추가)·-(제거)·=(정확히 이것으로)를 조합합니다:

chmod 644 report.txt
chmod g+w report.txt
chmod o-r report.txt
ls -l report.txt
-rw-rw---- 1 lee lee 0  9월 9일 10:41 report.txt

(출력 예시.)

읽는 법: g+w는 "그룹에 쓰기 추가"(644 → 664), o-r은 "기타에서 읽기 제거"(664 → 660). 최종 rw-rw----입니다.

: 숫자 표기는 "최종 상태를 통째로 지정"하고, 문자 표기는 "현재 상태에서 더하고 빼기"입니다. 파일 여러 개의 특정 등급만 살짝 조정할 때는 문자 표기가 편합니다. 둘 다 읽을 수 있어야 남의 문서를 이해할 수 있습니다.


4. 미션과 연습문제

미션 — 나만의 금고 만들기

  1. vault 폴더를 만들고 그 안에 pw.txt를 만드세요 (내용은 아무거나)
  2. 폴더는 700, 파일은 600으로 설정하세요
  3. ls -ld vaultls -l vault/pw.txt 두 명령으로 최종 상태를 확인하세요
  4. 검증 실험: chmod 000 pw.txtcat pw.txtnano pw.txt가 둘 다 거부되는지 확인하고, 600으로 복구하세요
  5. 계산 검증: practice.txt를 만들어 chmod 640을 준 뒤, ls -l 출력이 여러분이 손으로 계산한 문자열과 같은지 대조하세요

답은 여기 쓰지 않습니다 — 5절에서 검증합니다.

연습문제

문제 1. 다음 권한 문자열을 8진수로 변환해 보세요: rwxr-x---, rw-------, r-xr-xr-x

문제 2. 숫자 640과 711을 권한 문자열로 풀어 보세요. 711의 마지막 --x는 폴더에서 무슨 뜻일까요?

문제 3. chmod 777 파일이 무엇을 여는 것이며, 보안 공부를 하는 사람이 왜 쓰지 말아야 하는지 설명해 보세요.

문제 4. chmod +x를 줬는데도 ./run.sh가 "Permission denied"로 거부될 때 확인해야 할 것을 두 가지 이상 말해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

mkdir vault
echo "금고 비밀번호는 0426" > vault/pw.txt
chmod 700 vault
chmod 600 vault/pw.txt
ls -ld vault
ls -l vault/pw.txt
drwx------ 2 lee lee 4096  9월 9일 11:00 vault
-rw------- 1 lee lee   21  9월 9일 11:00 vault/pw.txt

(출력 예시.)

검증하는 법: ① 폴더가 drwx------(700), 파일이 -rw-------(600)이면 설정 완료. ② chmod 000 실험에서 cat: vault/pw.txt: Permission denied가 뜨고 nano에서도 열리지 않으면 "권한이 곧 벽"임을 확인한 것 — 반드시 600으로 복구하세요. ③ chmod 640 practice.txt의 결과는 -rw-r-----이어야 합니다.

연습문제 해답

문제 1 해답. rwxr-x--- = 750, rw------- = 600, r-xr-xr-x = 555입니다. 각 등급을 r=4, w=2, x=1의 합으로 바꾸면 됩니다.

문제 2 해답. 640 = rw-r-----, 711 = rwx--x--x입니다. 마지막 --x는 "나머지 사람도 (폴더라면) 들어갈 수만 있음"이라는 특이하지만 실재하는 권한입니다 — 목록(r)은 못 보지만 안으로는 들어갈 수 있는 상태입니다.

문제 3 해답. 777은 모든 사람에게 읽기·쓰기·실행을 여는 것으로, 문제를 "해결"하는 게 아니라 문을 부수는 격입니다. 서버의 다른 사용자(또는 침입한 공격자)가 그 파일을 마음대로 읽고 바꿀 수 있게 됩니다. 필요한 최소 권한이 무엇인지 생각하는 습관이 보안 사고방식의 시작입니다.

문제 4 해답.ls -l로 정말 x가 붙었는지 확인 ② ./를 붙여 현재 폴더의 파일임을 명시했는지 확인 ③ 파일 소유자가 다른 사용자는 아닌지 확인 ④ 스크립트 첫 줄(#!/bin/bash)이 빠지지 않았는지 확인 — 리눅스는 현재 폴더를 실행 경로에서 찾지 않으므로 ./가 특히 자주 빠집니다.

완료 기준 체크리스트

  • [ ] -rwxr-xr-- 같은 문자열을 보고 누가 뭘 해도 되는지 말할 수 있다
  • [ ] ls -l 출력에서 소유자·그룹 이름 위치를 안다
  • [ ] r=4, w=2, x=1로 권한을 8진수로 양방향 변환할 수 있다
  • [ ] chmod 숫자 표기(600, 755 등)와 문자 표기(g+w, o-r)를 둘 다 쓸 수 있다
  • [ ] 파일의 x와 폴더의 x의 차이를 설명할 수 있다
  • [ ] umask가 "기본값에서 깎는 수치"임을 안다
  • [ ] 미션: 금고 만들기와 000 실험·복구를 완수했다

6. 흔한 실수와 해결

벽 1. "chmod 777을 하라는 글을 봤는데요?"

증상: 인터넷 답변에서 "권한 문제면 777 하세요"라는 조언을 자주 봅니다.
원인: 777은 모든 사람에게 읽기·쓰기·실행을 여는 것으로, 문제를 "해결"하는 게 아니라 문을 부수는 격입니다.
해결: 보안 공부를 하는 여러분은 777을 쓰지 마세요. "필요한 최소 권한이 무엇인가"를 먼저 묻는 것 — 이 습관이 Step 24의 최소 권한 원칙으로 이어집니다.

벽 2. "x를 줬는데도 실행이 안 돼요."

증상: chmod +x를 했는데 ./run.sh가 여전히 거부됩니다.
원인: 다른 폴더의 파일을 실행하려 했거나, 소유자가 다른 사용자이거나, 첫 줄(#!/bin/bash)이 빠졌거나.
해결: ls -l로 정말 x가 붙었는지 먼저 확인하고, ./를 붙였는지 확인하세요. 리눅스는 현재 폴더를 실행 경로에서 찾지 않습니다.

벽 3. "폴더에 r을 줬는데 왜 ls가 안 되죠?"

증상: 권한에 r이 있는데도 ls 폴더명이 거부됩니다.
원인: 폴더 목록을 실질적으로 보려면 r과 x가 함께 필요합니다. r만 있으면 이름은 알 수 있어도 들어가지 못하는 어정쩡한 상태가 됩니다.
해결: 폴더에는 r과 x를 세트로 주세요. 그래서 폴더 기본 권한이 755입니다.

벽 4. "숫자 계산이 자꾸 헷갈려요."

증상: 4, 2, 1 중 뭐가 읽기였는지 섞입니다.
원인: 암기 순서 문제입니다.
해결: "rwx" 순서 그대로 "4, 2, 1"로 세트로 외우세요. 읽기가 제일 중요하니 제일 큰 수 4, 그다음 쓰기 2, 실행 1입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
권한(permission) 모든 파일·폴더에 새겨진 "누가 뭘 해도 되는가"
3등급 소유자(u) · 그룹(g) · 기타(o)
3동작 r(읽기) · w(쓰기) · x(파일은 실행, 폴더는 출입)
8진수 표기 r=4, w=2, x=1의 합 세 자리 (예: 755)
umask 새 파일·폴더의 기본 권한을 정하는 "깎는 수치"

오늘의 명령어

명령 하는 일
ls -l / ls -ld 폴더 권한 문자열 보기 / 폴더 자체의 권한 보기
chmod 600 파일 권한을 숫자로 통째 지정
chmod g+w 파일 문자 표기로 더하기·빼기
umask 기본 권한 수치 확인

명령어보다 중요한 감각

권한은 처음엔 귀찮은 잠금장치처럼 느껴지지만, 사실은 리눅스가 여러분을 지켜 주는 안전벨트입니다. "Permission denied"가 뜰 때마다 화를 내기보다 "아, 지금 규칙이 작동하고 있구나"라고 읽는 눈을 가지세요. 그 눈이 나중에 남의 서버 설정을 감사할 때 그대로 쓰입니다.

실전 사례 하나를 기억해 두세요. 웹서버 프로그램은 보통 www-data라는 힘없는 전용 계정으로 실행됩니다 — 웹서버는 인터넷 전체에 노출된 문지방이라, 공격자가 취약점을 뚫는 순간 그 권한을 그대로 얻기 때문입니다. 권한 설정 실수는 실제 사고의 단골 원인이고, 클라우드 저장소가 "모두에게 읽기"로 열려 털리는 사고는 매년 반복됩니다. 오늘 배운 10글자 문자열을 읽는 눈이 그 사고를 막는 첫걸음입니다. 권한 문자열은 보안 설정의 알파벳입니다.


전부 체크되면 Step 23 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.