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만. /tmp는 drwxrwxrwt — 모두에게 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. 미션과 연습문제
미션 — 나만의 금고 만들기
vault폴더를 만들고 그 안에pw.txt를 만드세요 (내용은 아무거나)- 폴더는 700, 파일은 600으로 설정하세요
ls -ld vault와ls -l vault/pw.txt두 명령으로 최종 상태를 확인하세요- 검증 실험:
chmod 000 pw.txt뒤cat pw.txt와nano pw.txt가 둘 다 거부되는지 확인하고, 600으로 복구하세요 - 계산 검증:
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 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.