권한은 문 앞의 열쇠와 이름표입니다
Linux에서 파일은 단순한 데이터 덩어리가 아닙니다. 각 파일과 디렉터리에는 "누가 주인인지", "어떤 그룹에 속하는지", "누가 읽고 쓰고 실행할 수 있는지"가 붙어 있습니다. 문에 이름표와 열쇠가 달려 있다고 생각하면 이해하기 쉽습니다.
먼저 실습 공간으로 이동합니다.
cd ~/linux-practice
mkdir -p permission-lab
cd permission-lab
pwd파일 하나를 만들고 자세히 확인합니다.
touch note.txt
ls -l note.txt출력은 보통 다음과 비슷합니다.
-rw-r--r-- 1 user user 0 May 23 10:00 note.txt왼쪽의 -rw-r--r--가 권한입니다. 이 문자열은 네 부분으로 나누어 읽습니다.
- rw- r-- r--
종류 소유자 그룹 기타 사용자첫 글자는 파일 종류를 뜻합니다. -는 일반 파일, d는 디렉터리입니다. 그 뒤는 세 글자씩 끊어서 읽습니다.
r: read, 읽기w: write, 쓰기x: execute, 실행-: 해당 권한 없음
rw-r--r--는 "소유자는 읽고 쓸 수 있고, 같은 그룹과 그 밖의 사용자는 읽기만 가능하다"는 뜻입니다.
AI 생성 이미지
파일의 rwx와 디렉터리의 rwx는 다르게 동작합니다
파일에서 r, w, x는 비교적 직관적입니다.
파일의
r: 파일 내용을 읽을 수 있습니다.파일의
w: 파일 내용을 수정하거나 비울 수 있습니다.파일의
x: 파일을 프로그램이나 스크립트처럼 실행할 수 있습니다.
여기서 한 가지를 꼭 구분해야 합니다. 파일을 수정하는 권한과 파일을 삭제하거나 이름을 바꾸는 권한은 같은 문제가 아닙니다. Linux에서 파일 삭제와 이름 변경은 보통 그 파일이 들어 있는 부모 디렉터리의 쓰기 권한과 실행 권한에 영향을 받습니다. 그래서 파일 자체가 읽기 전용처럼 보여도, 부모 디렉터리에 충분한 권한이 있으면 파일 이름을 바꾸거나 삭제할 수 있는 상황이 생깁니다.
예를 들어 간단한 스크립트를 만들어 보겠습니다.
cat > hello.sh <<'EOF'
echo "hello"
EOF
ls -l hello.sh
./hello.sh실행 권한이 없으면 다음과 비슷한 오류가 납니다.
bash: ./hello.sh: Permission denied파일은 존재하지만 실행 열쇠가 없는 상태입니다. 실행 권한을 추가하면 실행할 수 있습니다.
chmod u+x hello.sh
ls -l hello.sh
./hello.sh디렉터리의 권한은 조금 다르게 이해해야 합니다. 디렉터리는 "파일을 담는 방"에 가깝습니다.
디렉터리의
r: 안에 어떤 이름들이 있는지 목록을 볼 수 있습니다.디렉터리의
w: 안에서 파일을 만들거나 지우거나 이름을 바꿀 수 있습니다.디렉터리의
x: 그 디렉터리 안으로 들어가거나, 경로를 통과할 수 있습니다.
특히 디렉터리에서 x는 중요합니다. 목록을 보는 권한이 있어도 x가 없으면 그 안의 파일에 접근하기 어렵습니다. 반대로 목록을 볼 수 없어도 파일 이름을 정확히 알고 있고 x가 있으면 접근 가능한 경우가 있습니다.
다음 실습으로 차이를 확인합니다.
mkdir room
echo "secret" > room/secret.txt
ls -ld room
ls -l room디렉터리 자체의 권한을 볼 때는 ls -ld를 사용합니다. ls -l room은 디렉터리 안의 목록을 보여 주고, ls -ld room은 room이라는 디렉터리 자체를 보여 줍니다.
chmod: 권한을 바꾸는 명령
chmod는 change mode의 줄임말입니다. 파일이나 디렉터리의 권한 모드를 바꿉니다. 권한을 바꾸는 방법은 크게 두 가지입니다.
첫째, 기호 방식입니다. "누구에게 어떤 권한을 더하거나 뺄지"를 글자로 씁니다.
chmod u+x hello.sh # 소유자에게 실행 권한 추가
chmod g-w note.txt # 그룹에서 쓰기 권한 제거
chmod o-r note.txt # 기타 사용자에서 읽기 권한 제거
chmod a+r note.txt # 모두에게 읽기 권한 추가여기서 대상은 다음과 같습니다.
u: user, 소유자g: group, 그룹o: others, 기타 사용자a: all, 모두
연산자는 다음처럼 읽습니다.
+: 권한 추가-: 권한 제거=: 권한을 지정한 값으로 맞춤
예를 들어 다음 명령은 소유자에게만 읽기와 쓰기를 허용하고, 그룹과 기타 사용자 권한은 모두 없앱니다.
chmod u=rw,g=,o= note.txt
ls -l note.txt둘째, 숫자 방식입니다. 숫자 방식은 권한을 점수처럼 더합니다.
r = 4
w = 2
x = 1따라서 rwx는 4+2+1=7, rw-는 4+2=6, r--는 4입니다. 세 자리 숫자는 순서대로 소유자, 그룹, 기타 사용자를 뜻합니다.
chmod 644 note.txt
ls -l note.txt644는 다음과 같습니다.
6 4 4
rw- r-- r--
소유자 그룹 기타 사용자스크립트나 일반 프로그램 파일은 보통 755를 자주 씁니다.
chmod 755 hello.sh
ls -l hello.sh755는 소유자는 읽기·쓰기·실행이 가능하고, 그룹과 기타 사용자는 읽기·실행만 가능하다는 뜻입니다.
디렉터리는 보통 755 또는 700을 많이 씁니다.
mkdir private
chmod 700 private
ls -ld private700은 소유자만 들어가고 읽고 수정할 수 있는 개인 방입니다.
초보자가 자주 쓰는 위험한 명령이 있습니다.
chmod 777 somefile777은 모두에게 읽기, 쓰기, 실행을 전부 허용합니다. 잠깐 문제를 피하려고 열쇠를 모두에게 나눠 주는 것과 같습니다. 공유 임시 디렉터리처럼 특별한 경우가 아니라면 원인을 먼저 확인해야 합니다. "권한 오류가 났다"는 이유만으로 777을 주는 습관은 피하세요.
chown과 chgrp: 소유자와 그룹 바꾸기
권한만으로는 충분하지 않을 때가 있습니다. 파일의 주인이 잘못되어 있으면 권한이 맞아 보여도 작업이 막힙니다.
파일의 소유자와 그룹은 ls -l에서 권한 뒤에 나옵니다.
ls -l note.txt예시 출력입니다.
-rw-r--r-- 1 user user 12 May 23 10:05 note.txt첫 번째 user는 소유자, 두 번째 user는 그룹입니다.
소유자를 바꾸려면 chown을 사용합니다. 소유자 변경은 시스템에 큰 영향을 줄 수 있으므로 보통 sudo가 필요합니다.
sudo chown 사용자명 note.txt소유자와 그룹을 한 번에 바꿀 수도 있습니다.
sudo chown 사용자명:그룹명 note.txt그룹만 바꿀 때는 chgrp를 씁니다.
sudo chgrp 그룹명 note.txt디렉터리와 그 안의 모든 파일에 한꺼번에 적용하려면 -R 옵션을 사용합니다.
sudo chown -R 사용자명:그룹명 some-directory-R은 recursive, 즉 하위 항목까지 모두 적용한다는 뜻입니다. 편리하지만 위험합니다. 실행 전에는 반드시 대상 위치를 확인합니다.
pwd
ls -ld some-directory
find some-directory -maxdepth 2 -print특히 /, /etc, /usr, /var 같은 시스템 디렉터리에 실수로 chown -R을 적용하면 서비스가 망가질 수 있습니다. 복구가 쉽지 않습니다.
sudo는 관리자 열쇠를 잠깐 빌리는 방식입니다
Linux에는 강력한 관리자 사용자인 root가 있습니다. root는 거의 모든 파일을 읽고 바꾸고 삭제할 수 있습니다. 그래서 편하지만 위험합니다.
sudo는 일반 사용자가 필요한 명령 하나만 관리자 권한으로 실행하게 해 줍니다.
sudo 명령어예를 들어 사용자 추가, 시스템 설정 변경, 패키지 설치 같은 작업은 관리자 권한이 필요합니다.
sudo useradd -m -s /bin/bash traineesudo를 쓰면 보통 현재 사용자의 비밀번호를 묻습니다. 이 기록은 시스템 로그에 남을 수 있어, 누가 어떤 관리자 명령을 실행했는지 추적하기 좋습니다. 실무에서는 이 점이 중요합니다. 여러 사람이 모두 root로 로그인하면 문제가 생겼을 때 누가 어떤 작업을 했는지 알기 어렵습니다.
가능하면 다음 방식은 피하는 편이 좋습니다.
sudo -i이 명령은 root 셸로 들어갑니다. 프롬프트가 #로 바뀌면 매우 조심해야 합니다. 이후 입력하는 명령은 계속 관리자 권한으로 실행됩니다. 짧은 작업은 sudo 명령어 형태로 한 줄씩 실행하는 편이 안전합니다.
관리자 권한 명령을 실행하기 전에는 세 가지를 확인하세요.
whoami
pwd
ls -ld 대상경로내가 누구인지, 어디에 있는지, 무엇을 바꾸려는지 확인한 뒤 실행합니다.
사용자와 그룹 확인하기
현재 사용자가 누구인지 확인합니다.
whoami
id
groupsid는 사용자 ID, 기본 그룹 ID, 보조 그룹 목록을 보여 줍니다.
uid=1000(user) gid=1000(user) groups=1000(user),27(sudo)여기서 sudo 그룹에 속한 사용자는 Ubuntu 계열에서 관리자 명령을 실행할 수 있는 경우가 많습니다. Fedora나 RHEL 계열에서는 보통 wheel 그룹이 비슷한 역할을 합니다.
# Ubuntu/Debian 계열에서 관리자 권한 그룹 확인 예
getent group sudo
# Fedora/RHEL 계열에서 관리자 권한 그룹 확인 예
getent group wheelgetent는 시스템의 사용자, 그룹 같은 계정 데이터베이스를 조회하는 명령입니다. 직접 /etc/passwd, /etc/group 파일을 열어 볼 수도 있지만, 조회에는 getent가 더 안전하고 일관적입니다.
useradd, passwd, usermod로 사용자 관리하기
이제 실습용 사용자를 만듭니다. 사용자 생성은 시스템 변경 작업입니다. 개인 실습 환경에서만 따라 하세요.
Ubuntu 계열에는 adduser라는 대화형 도구도 있지만, 여기서는 여러 배포판에서 공통으로 쓰이는 useradd를 기준으로 봅니다.
sudo useradd -m -s /bin/bash trainee옵션의 의미는 다음과 같습니다.
-m: 홈 디렉터리를 만듭니다. 보통/home/trainee가 생성됩니다.-s /bin/bash: 로그인 셸을 Bash로 지정합니다.
사용자가 만들어졌는지 확인합니다.
id trainee
getent passwd trainee
ls -ld /home/trainee비밀번호를 설정합니다.
sudo passwd trainee그룹을 하나 만들고 사용자를 추가해 보겠습니다.
sudo groupadd project
sudo usermod -aG project trainee여기서 -aG는 중요합니다.
-G project: 보조 그룹 목록을project로 지정합니다.-a: 기존 보조 그룹을 유지한 채 추가합니다.
즉 -a 없이 usermod -G를 쓰면 기존 보조 그룹이 빠질 수 있습니다. 관리자 권한 그룹에서 빠지면 sudo를 못 쓰는 상황도 생깁니다. 보조 그룹을 추가할 때는 보통 -aG를 함께 씁니다.
확인합니다.
id trainee
groups trainee
getent group project이미 로그인 중인 사용자의 그룹 변경은 새 로그인 세션부터 적용되는 경우가 많습니다. 현재 터미널에서 바로 반영되지 않는다면 로그아웃 후 다시 로그인하거나, 필요한 경우 newgrp 그룹명을 사용할 수 있습니다.
그룹 권한으로 협업 디렉터리 만들기
그룹은 여러 사용자에게 같은 열쇠를 나눠 주는 방법입니다. 예를 들어 project 그룹 사람들만 함께 쓰는 디렉터리를 만들 수 있습니다.
sudo mkdir -p /tmp/project-share
sudo chgrp project /tmp/project-share
sudo chmod 770 /tmp/project-share
ls -ld /tmp/project-share770은 소유자와 그룹은 모든 권한을 갖고, 기타 사용자는 아무 권한도 없다는 뜻입니다.
drwxrwx--- 2 root project 4096 May 23 10:20 /tmp/project-share이제 project 그룹에 속한 사용자는 이 디렉터리에 들어가고 파일을 만들 수 있습니다. 기타 사용자는 접근할 수 없습니다.
다만 실제 공동 작업 디렉터리는 새 파일의 그룹이 계속 project로 유지되도록 추가 설정이 필요할 수 있습니다. 대표적으로 디렉터리에 setgid 비트를 설정하는 방법이 있습니다.
sudo chmod 2770 /tmp/project-share
ls -ld /tmp/project-share출력의 그룹 실행 권한 자리에 s가 보이면, 그 디렉터리 안에서 새로 만들어지는 항목이 디렉터리의 그룹을 물려받기 쉬워집니다. 이 장에서는 기본 권한 모델을 먼저 익히는 것이 목표이므로, 지금은 "협업 디렉터리에는 그룹 권한과 기본 생성 권한을 함께 생각해야 한다"는 점만 기억하면 충분합니다.
umask: 새 파일과 디렉터리의 기본 권한
chmod가 이미 있는 파일의 권한을 바꾸는 도구라면, umask는 새로 만들어지는 파일과 디렉터리의 기본 권한에 영향을 줍니다.
현재 umask를 확인합니다.
umask보통 다음처럼 나옵니다.
0022새 파일과 디렉터리를 만들어 확인해 봅니다.
mkdir umask-test
cd umask-test
touch a.txt
mkdir a-dir
ls -l
ls -ld a-dir일반적으로 새 파일은 실행 권한 없이 만들어집니다. 기본 출발점은 파일 666, 디렉터리 777이라고 생각하면 됩니다. 여기에서 umask 값만큼 권한이 빠집니다.
umask 022라면 다음과 같이 계산됩니다.
파일: 666 - 022 = 644 → rw-r--r--
디렉터리: 777 - 022 = 755 → rwxr-xr-x실제로는 단순한 뺄셈보다 "해당 권한 비트를 가린다"는 표현이 정확합니다. 예를 들어 실행 권한처럼 원래 출발 권한에 없는 비트는 단순 뺄셈처럼 생기지 않을 수 있습니다. 초보 단계에서는 "umask에 적힌 권한은 새 파일과 디렉터리에서 기본적으로 막힌다"라고 이해하면 충분합니다.
잠시 umask를 바꿔 보겠습니다. 이 변경은 현재 셸 세션에만 적용됩니다.
umask 077
touch private.txt
mkdir private-dir
ls -l private.txt
ls -ld private-dir077은 그룹과 기타 사용자 권한을 막습니다. 그래서 새 파일은 보통 600, 새 디렉터리는 700이 됩니다. 개인 비밀 파일을 많이 다루는 환경에서는 더 엄격한 umask가 유용합니다.
실습이 끝나면 일반적인 값으로 되돌립니다.
umask 022현재 셸에서만 바꾼 umask는 터미널을 새로 열면 원래 설정으로 돌아갈 수 있습니다. 영구 변경은 셸 설정 파일에 넣어야 하지만, 그 내용은 셸 환경 설정 장에서 다룹니다.
문제 해결 시나리오: Permission denied 읽기
상황을 하나 보겠습니다.
./deploy.sh다음 오류가 나옵니다.
bash: ./deploy.sh: Permission denied바로 sudo를 붙이지 말고 먼저 확인합니다.
ls -l deploy.sh출력이 다음과 같다면 실행 권한이 없습니다.
-rw-r--r-- 1 user user 120 May 23 10:30 deploy.sh스크립트 내용을 먼저 읽습니다. 실행할 파일이 무엇을 하는지 모른 채 실행 권한을 주면 안 됩니다.
less deploy.sh문제가 없으면 소유자에게 실행 권한만 추가합니다.
chmod u+x deploy.sh
./deploy.sh다른 상황도 있습니다.
cat /var/log/some.log권한 오류가 난다면 파일 권한을 확인합니다.
ls -l /var/log/some.log
id로그 파일은 일반 사용자에게 막혀 있는 것이 정상일 수 있습니다. 이때 파일 권한을 억지로 chmod 777로 바꾸면 안 됩니다. 필요한 경우 관리자 권한으로 읽습니다.
sudo less /var/log/some.log권한 문제를 해결할 때의 순서는 이렇습니다.
pwd로 현재 위치를 확인합니다.ls -l또는ls -ld로 대상의 권한, 소유자, 그룹을 확인합니다.id,groups로 내 사용자와 그룹을 확인합니다.필요한 최소 권한만
chmod,chown,chgrp,usermod로 조정합니다.시스템 파일은 권한을 넓히기보다
sudo로 필요한 작업만 수행합니다.
짧은 실습 과제
다음 과제를 순서대로 수행해 보세요.
cd ~/linux-practice/permission-lab
mkdir access-practice
cd access-practice
echo "memo" > memo.txt
ls -l memo.txtmemo.txt를 소유자만 읽고 쓸 수 있게 바꿉니다.
chmod 600 memo.txt
ls -l memo.txtmemo.txt를 모두가 읽을 수 있지만 소유자만 쓸 수 있게 바꿉니다.
chmod 644 memo.txt
ls -l memo.txtrun.sh를 만들고 소유자에게 실행 권한을 줍니다.
cat > run.sh <<'EOF'
echo "run"
EOF
chmod u+x run.sh
ls -l run.sh
./run.sh현재 umask를 확인하고,
umask 077상태에서 새 파일과 디렉터리를 만든 뒤 권한을 비교합니다.
umask
umask 077
touch only-me.txt
mkdir only-me-dir
ls -l only-me.txt
ls -ld only-me-dir
umask 022권한은 "왜 안 되는지"를 설명해 주는 동시에 "왜 열리면 안 되는지"도 알려 줍니다. 명령이 실패했을 때는 오류만 보지 말고, 사용자·그룹·권한을 함께 읽어야 합니다. 이 습관이 Linux 보안의 출발점입니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.