리눅스 파일 권한: chmod, chown, sudo 예제로 이해하기
리눅스 파일 권한은 소유자, 그룹, 기타 사용자를 위한 세 가지 rwx 묶음으로 정해집니다. chmod로 기호 방식(chmod u+x) 또는 숫자 방식(chmod 755, r=4, w=2, x=1)으로 바꾸고, chown으로 소유자를 바꾸며, 관리자 작업은 sudo로 수행합니다. Permission denied 오류는 대부분 사용자에게 파일이나 경로상의 디렉터리 권한이 없다는 뜻입니다.
리눅스 파일 권한은 «누가 파일에 대해 무엇을 할 수 있는가»를 정합니다. 모든 파일에는 소유자, 그룹, 그리고 세 벌의 권한이 있습니다. 소유자를 위한 것, 그룹을 위한 것, 그 밖의 모든 사용자를 위한 것입니다. 권한은 chmod로, 소유자는 chown으로 바꾸며, 관리자 작업은 sudo로 수행합니다. 이 글에서는 권한을 읽는 법, 바꾸는 법, Permission denied 오류를 해결하는 법을 다룹니다.
파일 권한 확인하기
권한은 ls -l 출력에서 볼 수 있습니다:
$ ls -l
-rw-r--r-- 1 alice developers 1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers 356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers 4096 Oct 10 13:50 secrets
처음 열 글자는 다음과 같이 읽습니다:
- 첫 글자 — 종류:
-일반 파일,d디렉터리,l심볼릭 링크. - 2–4번째 글자 — 소유자(user)의 권한.
- 5–7번째 글자 — 그룹(group)의 권한.
- 8–10번째 글자 — 그 밖의 사용자(others)의 권한.
그 뒤에는 하드 링크 수, 소유자(alice), 그룹(developers), 크기, 날짜, 이름이 나옵니다. 파일 하나만 보고 싶을 때는 stat이 편리합니다:
$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh
r, w, x의 의미
같은 권한이라도 파일과 디렉터리에서 뜻이 다릅니다. 혼란의 가장 큰 원인이 바로 이것입니다.
| ead> | ||
|---|---|---|
| 권한 | 파일에서 | 디렉터리에서 |
r (read) | 내용 읽기 | 파일 목록 보기 (ls) |
w (write) | 내용 수정 | 안에서 파일 만들기, 삭제, 이름 바꾸기 |
x (execute) | 프로그램으로 실행 | 디렉터리에 들어가기(cd)와 경로로 파일 접근 |
주의할 점: 파일에 쓰기 권한이 없는 사용자라도, 디렉터리에 w와 x가 있으면 그 파일을 삭제할 수 있습니다. 반대로 디렉터리에 x가 없으면, 파일 자체에 읽기 권한이 있어도 안의 파일을 열 수 없습니다.
시스템은 순서대로 확인합니다. 소유자라면 소유자 권한이 적용되고, 소유자가 아니지만 파일의 그룹에 속해 있으면 그룹 권한이 적용되며, 그 밖에는 기타 사용자 권한이 적용됩니다. root는 읽기와 쓰기 권한 검사를 건너뜁니다.
숫자 표기: 755, 644, 600
각 권한에는 값이 있습니다: r = 4, w = 2, x = 1. 세 묶음 각각의 합이 0부터 7 사이의 숫자가 됩니다.
| ead> | ||
|---|---|---|
| 숫자 | 권한 | 계산 |
| 7 | rwx | 4+2+1 |
| 6 | rw- | 4+2 |
| 5 | r-x | 4+1 |
| 4 | r-- | 4 |
| 0 | --- | 0 |
외워 두면 좋은 대표적인 조합은 다음과 같습니다:
| ead> | ||
|---|---|---|
| 모드 | 형태 | 사용 예 |
644 | rw-r--r-- | 일반 파일, 설정 파일, HTML |
755 | rwxr-xr-x | 디렉터리, 스크립트, 프로그램 |
600 | rw------- | 개인 SSH 키, 비밀번호가 든 파일 |
700 | rwx------ | ~/.ssh 디렉터리, 개인 디렉터리 |
640 | rw-r----- | 서비스 그룹이 읽는 설정 파일 |
777 | rwxrwxrwx | 모두에게 모든 권한 — 거의 필요 없음 |
chmod 명령: 권한 바꾸기
숫자 모드
숫자 표기는 권한 전체를 한 번에 정합니다:
chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519
기호 모드
기호 표기는 다른 권한을 건드리지 않고 필요한 것만 바꿉니다. 대상: u 소유자, g 그룹, o 기타, a 전체. 동작: + 추가, - 제거, = 정확히 설정.
chmod +x deploy.sh # 실행 허용
chmod u+x,g-w file # 소유자에게 실행 권한, 그룹의 쓰기 권한 제거
chmod o-rwx secrets/ # 기타 사용자에게 아무 권한도 주지 않음
chmod g=rx app/ # 그룹에 정확히 읽기와 진입 권한
재귀 적용: 파일과 디렉터리를 다르게
-R 옵션은 권한을 트리 전체에 적용합니다. 하지만 chmod -R 755는 모든 파일을 실행 가능하게 만들어 보통 원하는 결과가 아닙니다. 대신 find로 디렉터리와 파일을 나누어 적용하는 것이 낫습니다:
find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +
짧은 방법도 있습니다. 대문자 X는 이미 실행 권한이 있는 디렉터리와 파일에만 실행 권한을 더합니다.
chmod -R u=rwX,go=rX /srv/site
chown 명령: 소유자와 그룹 바꾸기
파일의 소유자는 root만 바꿀 수 있으므로 chown은 거의 항상 sudo와 함께 사용합니다.
sudo chown alice report.txt # 소유자
sudo chown alice:developers report.txt # 소유자와 그룹
sudo chown :www-data index.html # 그룹만
sudo chown -R www-data:www-data /var/www/site
그룹만 바꾸려면 별도의 명령 chgrp가 있습니다: sudo chgrp developers report.txt. 내가 속한 그룹은 id나 groups로 확인합니다.
$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)
사용자를 그룹에 추가하려면 sudo usermod -aG developers bob을 사용합니다. -a 옵션은 필수입니다. 이 옵션이 없으면 사용자가 다른 추가 그룹에서 모두 빠집니다. 새 그룹은 다시 로그인한 뒤에 적용됩니다.
sudo: 관리자 권한으로 실행하기
sudo는 명령 하나를 root(또는 다른 사용자) 권한으로 실행하며, root의 비밀번호가 아니라 자신의 비밀번호를 묻습니다. 모든 호출은 로그에 남아 누가 무엇을 했는지 기록됩니다.
sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql # postgres 사용자로
sudo -i # 대화형 root 셸
sudo -l # 내가 실행할 수 있는 명령 확인
누가 무엇을 할 수 있는지는 /etc/sudoers와 /etc/sudoers.d/ 디렉터리의 파일에 적혀 있습니다. 이 파일들은 반드시 sudo visudo로 편집하세요. 저장 전에 문법을 검사하므로, 실수로 sudo 자체를 잃지 않습니다. Ubuntu에서는 sudo 그룹에 속하면 관리자 권한을 얻고, RHEL 계열에서는 wheel 그룹에 속하면 됩니다.
# /etc/sudoers.d/deploy — deploy 사용자에게 nginx 재시작만 허용
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
sudo echo > file이 동작하지 않는 이유
자주 걸리는 함정입니다:
$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied
>> 리디렉션은 sudo가 아니라 셸이 처리하므로, 파일은 root 권한 없이 열립니다. 올바른 방법은 tee를 쓰는 것입니다:
echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts
Permission denied: 원인과 해결
Permission denied는 커널이 프로세스의 작업을 거부했다는 뜻입니다. 조사 순서는 언제나 같습니다: 나는 누구인가(id), 소유자와 권한은 무엇인가(ls -l), 경로의 각 디렉터리 권한은 무엇인가(namei -l).
$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root root /
drwxr-xr-x root root srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env
여기서 app 디렉터리는 다른 사용자에게 닫혀 있습니다. deploy 그룹에 속하지 않은 사용자는 파일 자체의 권한이 무엇이든 그 앞에서 막힙니다.
스크립트가 실행되지 않음
$ ./deploy.sh
bash: ./deploy.sh: Permission denied
파일에 실행 권한이 없습니다. 해결 방법은 chmod +x deploy.sh를 실행하거나, 인터프리터로 실행하는 bash deploy.sh입니다. 파티션이 noexec 옵션으로 마운트되어 있다면(예: /tmp에서 흔함) 파일을 직접 실행할 수 없고, 두 번째 방법만 가능합니다.
시스템 디렉터리에 쓸 수 없음
/etc, /usr, /var/www의 파일은 root나 시스템 사용자의 소유입니다. 일회성 수정에는 sudo를 사용하고, 지속적인 작업에는 모두에게 권한을 주기보다 그룹에 권한을 주세요.
웹 서버가 403을 반환함
Nginx나 Apache는 Debian과 Ubuntu에서 www-data 사용자로 동작합니다. 이 사용자에게 파일 읽기 권한과 경로상 모든 디렉터리의 x 권한이 필요합니다. 해결: sudo chown -R www-data:www-data /var/www/site, 또는 디렉터리 755, 파일 644.
SSH가 키를 받아들이지 않음
SSH는 권한이 너무 열린 키를 사용하지 않습니다. 개인 키는 600, ~/.ssh 디렉터리는 700, 서버의 authorized_keys 파일은 600이어야 합니다.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
Docker에 접근할 수 없음
permission denied while trying to connect to the Docker daemon socket 메시지는 docker 그룹에 속하지 않았다는 뜻입니다. sudo usermod -aG docker $USER를 실행한 뒤 다시 로그인하세요. 이 그룹에 속하면 사실상 root와 같은 권한을 갖게 된다는 점도 기억하세요.
chmod 777이 나쁜 생각인 이유
«그냥 chmod 777 하세요»라는 조언은 오류를 없애지만, 파일을 시스템의 모든 사용자와 모든 프로세스가 쓸 수 있게 만듭니다. 웹 애플리케이션이 해킹당하면 공격자가 이런 파일을 바꿀 수 있습니다. 올바른 방법은 어떤 사용자에게 접근이 필요한지 알아내고, 권한을 정확히 그 사용자에게 주는 것입니다. 소유자나 그룹을 통해서요.
umask: 기본 권한
새 파일은 umask 마스크를 반영해 만들어집니다. 일반적인 값 022에서는 파일이 644, 디렉터리가 755 권한으로 생성됩니다.
$ umask
0022
마무리
리눅스 파일 권한은 소유자, 그룹, 기타 사용자를 위한 세 묶음의 rwx입니다. chmod는 숫자(755, 644, 600) 또는 기호 방식으로 권한을 바꾸고, chown은 소유자를 바꾸며, sudo는 명령 하나를 root로 실행하게 해 줍니다. Permission denied가 나오면 사용자, 파일 권한, 경로상의 모든 디렉터리를 확인하고, 777로 문제를 덮지 마세요. 사용자, 그룹, 권한, sudo는 강의에서 실습과 함께 자세히 다룹니다.
자주 묻는 질문
chmod 755는 무슨 뜻인가요?
소유자는 읽기, 쓰기, 실행(7)이 가능하고, 그룹과 기타 사용자는 읽기와 실행(5)이 가능합니다. 디렉터리와 스크립트에 쓰는 표준 조합입니다.
chmod와 chown은 어떻게 다른가요?
chmod는 권한(무엇을 할 수 있는지)을 바꾸고, chown은 소유자와 그룹(권한이 누구의 것인지)을 바꿉니다.
사용자에게 sudo 권한을 어떻게 주나요?
Ubuntu와 Debian에서는 <code>sudo usermod -aG sudo 이름</code>으로 sudo 그룹에 추가하고, RHEL 계열에서는 wheel 그룹에 추가합니다. 변경 사항은 다시 로그인한 뒤 적용됩니다.
4755 권한과 SUID 비트는 무엇인가요?
맨 앞의 4는 SUID를 켭니다. 프로그램이 실행한 사람의 권한이 아니라 파일 소유자의 권한으로 동작합니다. 예를 들어 passwd가 이런 방식입니다. <code>ls</code> 출력에서 소유자의 x 자리에 s가 보입니다.
root는 권한이 000인 파일을 왜 읽을 수 있나요?
커널은 root에 대해 일반적인 읽기와 쓰기 권한 검사를 하지 않습니다. 이를 제한하려면 SELinux, AppArmor, <code>chattr +i</code> 같은 다른 장치를 써야 합니다.