리눅스 시스템을 사용하다 보면 한 번쯤은 'Permission denied'라는 메시지를 보게된다. 파일을 열려고 하거나, 스크립트를 실행하려고 하거나, 특정 디렉토리에 파일을 저장하려고 할 때... 원인은 바로 파악될 수 밖에 없는 파일 또는 디렉토리 권한 문제!
서버에서 권한은 시스템의 보안과 안정성을 유지하는 아주 기본적인 요소이다. 누가 어떤 파일이나 디렉토리에 접근해서 무엇(읽기, 쓰기, 실행)을 할 수 있는지 정의해두는 것. 최근 서버 버전업을 하면서 자주 권한을 변경하게되어 관련해서 정리하게 되었다.
파일/디렉토리 권한의 기본 구조 (소유자, 그룹, 기타)
리눅스에서 각 파일 및 디렉토리는 세 가지 **주체(Subject)**에 대한 권한 설정을 가진다.
- 소유자 (Owner / User - u): 해당 파일 또는 디렉토리를 처음 생성한 사용자 (또는 소유자가 변경된 사용자).
- 그룹 (Group - g): 해당 파일 또는 디렉토리가 속한 그룹의 멤버. 여러 사용자를 하나의 그룹으로 묶어 권한을 관리할 때 유용하게 쓰인다.
- 기타 사용자 (Others - o): 해당 파일의 소유자도 아니고, 해당 파일이 속한 그룹의 멤버도 아닌 나머지 모든 사용자.
- (참고) 모든 사용자 (All - a) : ugo 전체, 모든 사용자. 기본값
그리고 각 주체에 대해 다음과 같은 세 가지 **권한(Permission)**을 설정할 수 있다. 대부분 서버를 잠깐 만지는 정도라면 이 권한 설정이 대부분 일 것으로 생각된다.
- 읽기 (Read - r): 파일 내용을 읽거나, 디렉토리 내 파일 목록을 볼 수 있는 권한.
- 쓰기 (Write - w): 파일 내용을 변경하거나 삭제하고, 디렉토리에 파일을 생성/삭제할 수 있는 권한.
- 실행 (Execute - x): 파일(스크립트나 프로그램)을 실행하거나, 디렉토리로 이동하여 접근할 수 있는 권한.
ls -l 명령어로 권한 확인하기
터미널에서 ls -l 명령어를 입력하면 현재 디렉토리의 파일 및 디렉토리 목록과 함께 상세 정보가 표시된다. 여기서 가장 첫 번째 열에 나타나는 10개의 문자가 바로 해당 파일/디렉토리의 권한 정보이다.
-rw-r--r-- 1 user1 groupA 1024 4월 24 10:00 my_file.txt
drwxr-xr-x 2 user1 groupA 4096 4월 24 10:05 my_directory
[파일 타입][소유자 권한][그룹 권한][기타 사용자 권한]
- 첫 번째 문자: 파일 타입. -는 일반 파일, d는 디렉토리, l은 심볼릭 링크 등을 의미.
- 두 번째부터 네 번째 문자: 소유자(user)에 대한 rwx 권한을 순서대로 표시. 권한이 있으면 해당 문자가 표시되고, 없으면 -로 표시된다. (예: rw-는 소유자는 읽기/쓰기 권한이 있지만 실행 권한은 없다는 뜻.)
- 다섯 번째부터 일곱 번째 문자: 그룹(group)에 대한 rwx 권한을 순서대로 표시. (예: r--는 그룹 멤버는 읽기 권한만 있다는 뜻.)
- 여덟 번째부터 열 번째 문자: 기타 사용자(others)에 대한 rwx 권한을 순서대로 표시. (예: r--는 기타 사용자는 읽기 권한만 있다는 뜻.)
위 예시에서 my_file.txt의 권한 -rw-r--r--는 다음과 같이 해석한다.
- -: 일반 파일
- rw-: 소유자(user1)는 읽기, 쓰기 권한 있음 (실행 권한 없음)
- r--: 그룹(groupA)은 읽기 권한만 있음
- r--: 기타 사용자(others)는 읽기 권한만 있음
my_directory의 권한 drwxr-xr-x는 다음과 같이 해석한다.
- d: 디렉토리
- rwx: 소유자(user1)는 읽기, 쓰기, 실행(디렉토리 접근) 권한 있음
- r-x: 그룹(groupA)은 읽기, 실행 권한만 있음 (쓰기 권한 없음 - 디렉토리 내 파일 생성/삭제 불가)
- r-x: 기타 사용자(others)는 읽기, 실행 권한만 있음
rwx 권한의 의미 (파일 vs 디렉토리)
[중요!] 여기서 많이 헷갈리는 부분은 x (실행) 권한과 w (쓰기) 권한이 파일과 디렉토리에서 다르게 해석된다는 점이다.
권한 | 파일에서의 의미 | 디렉토리에서의 의미 |
r | 파일 내용 읽기 | 디렉토리 내 파일 및 하위 디렉토리 목록 확인 |
w | 파일 내용 변경, 파일 삭제 | 디렉토리 내 파일/하위 디렉토리 생성 및 삭제 |
x | 실행 가능한 파일일 경우 실행 | 해당 디렉토리로 이동 가능, 디렉토리 내 파일 접근 가능 |
특히 디렉토리에서 r 권한만 있으면 그 안에 어떤 파일/디렉토리가 있는지 목록만 볼 수 있고, x 권한이 있어야만 그 디렉토리 안으로 이동하거나 안에 있는 파일에 접근할 수 있다. w 권한은 그 디렉토리 안의 내용을 변경(파일 생성/삭제)할 수 있게 해준다.
chmod 명령어로 권한 변경하기
chmod 명령어는 파일 또는 디렉토리의 권한을 변경할 때 사용한다. 권한을 변경하는 방법은 크게 심볼릭 모드와 8진수(숫자) 모드 두 가지가 있다. 둘 다 같은 결과를 얻을 수 있지만, 상황/개인에 따라 더 편리한 모드를 선택하여 사용하면 된다.
* 특정 권한 조합을 한 번에 설정할 때는 8진수 모드가 간편하고, 기존 권한에 특정 권한만 추가/제거할 때는 심볼릭 모드가 편리.
심볼릭 모드 (Symbolic Mode)
권한 대상을 지정하는 문자(u, g, o, a)와 권한을 추가(+), 제거(-), 설정(=)하는 연산자를 조합하여 사용한다.
chmod [대상][연산자][권한] 파일/디렉토리
- 대상: u (user), g (group), o (others), a (all - ugo 전체, 기본값)
- 연산자: + (권한 추가), - (권한 제거), = (해당 권한으로 설정하고 나머지는 모두 제거)
- 권한: r (읽기), w (쓰기), x (실행)
예시
# chmod u+x script.sh 파일의 소유자에게 실행 권한을 추가.
-rw-r--r-- 1 user1 groupA 500 4월 24 10:10 script.sh
$ chmod u+x script.sh
-rwx-r--r-- 1 user1 groupA 500 4월 24 10:10 script.sh
# chmod go-w my_file.txt 파일의 그룹과 기타 사용자에게서 쓰기 권한을 제거.
-rw-rw-r-- 1 user1 groupA 1024 4월 24 10:00 my_file.txt
$ chmod go-w my_file.txt
-rw-r--r-- 1 user1 groupA 1024 4월 24 10:00 my_file.txt
# chmod a=rw file.txt: file.txt
# 파일의 소유자, 그룹, 기타 사용자 모두에게 읽기, 쓰기 권한으로 설정하고
# 다른 권한(실행)은 모두 제거. (chmod =rw file.txt와 같이 'a'를 생략하고 사용하기도 한다.)
-rwxr-xr-x 1 user1 groupA 200 4월 24 10:15 file.txt
$ chmod a=rw file.txt
-rw-rw-rw- 1 user1 groupA 200 4월 24 10:15 file.txt
8진수 모드 (Octal Mode)
각 권한(r, w, x)에 숫자를 부여하고, 소유자/그룹/기타 사용자의 권한을 각각 3자리 숫자로 표현하는 방식.
- r (읽기) = 4
- w (쓰기) = 2
- x (실행) = 1
- 권한 없음 = 0
각 주체(소유자, 그룹, 기타)의 권한 숫자를 더해서 해당 주체의 권한 코드를 만들어서 사용한다.
권한 | 8진수 | 설명 |
--- | 0 | 권한 없음 |
--x | 1 | 실행 권한만 |
-w- | 2 | 쓰기 권한만 |
-wx | 3 | 쓰기, 실행 권한 |
r-- | 4 | 읽기 권한만 |
r-x | 5 | 읽기, 실행 권한 |
rw- | 6 | 읽기, 쓰기 권한 |
rwx | 7 |
읽기, 쓰기, 실행 권한
|
chmod [세 자리 숫자] 파일/디렉토리
# chmod 755 script.sh: 소유자는 rwx(7), 그룹은 r-x(5), 기타 사용자는 r-x(5)으로 설정.
# 스크립트 파일에 가장 흔하게 부여하는 권한.
-rw-r--r-- 1 user1 groupA 500 4월 24 10:10 script.sh
$ chmod 755 script.sh
-rwxr-xr-x 1 user1 groupA 500 4월 24 10:10 script.sh
# chmod 644 my_file.txt: 소유자는 rw-(6), 그룹은 r--(4), 기타 사용자는 r--(4) 권한으로 설정.
# 일반적인 데이터 파일에 가장 흔하게 부여하는 권한.
-rw-rw-r-- 1 user1 groupA 1024 4월 24 10:00 my_file.txt
$ chmod 644 my_file.txt
-rw-r--r-- 1 user1 groupA 1024 4월 24 10:00 my_file.txt
# chmod 700 confidential_directory: 소유자는 rwx(7), 그룹과 기타 사용자는 아무 권한 없음(0)으로 설정.
# 소유자 외에는 접근을 완전히 차단하는 경우에 사용.
-R 옵션: 하위 파일/디렉토리까지 한 번에 변경
디렉토리의 권한을 변경할 때, 그 안에 있는 모든 하위 파일과 디렉토리의 권한까지 동일하게 변경하고 싶다면 chmod 명령어에 -R 옵션을 추가.
chmod -R 755 my_directory
chown과 chgrp 명령어로 소유자/그룹 변경하기
chown 명령어는 파일 또는 디렉토리의 소유자를 변경할 때 사용.
chgrp 명령어는 그룹을 변경할 때 사용.
일반적으로 소유자만 변경할 때는 chown을, 그룹만 변경할 때는 chgrp를 사용하는 것으로 보이지만, chown 명령어로 소유자와 그룹을 동시에 변경할 수도 있다.
* chmod와 마찬가지로 chown, chgrp 명령어에도 -R 옵션을 붙이면 하위 파일/디렉토리까지 재귀적으로 소유자/그룹을 변경할 수 있다.
chown [새 소유자] 파일/디렉토리
chown [새 소유자]:[새 그룹] 파일/디렉토리 # 소유자와 그룹 동시에 변경
chgrp [새 그룹] 파일/디렉토리
# chown user2 my_file.txt: my_file.txt 파일의 소유자를 user2로 변경
-rw-r--r-- 1 user1 groupA 1024 4월 24 10:00 my_file.txt
$ chown user2 my_file.txt
-rw-r--r-- 1 user2 groupA 1024 4월 24 10:00 my_file.txt
# chown user3:groupB my_directory
# my_directory 디렉토리의 소유자를 user3으로, 그룹을 groupB로 동시에 변경
drwxr-xr-x 2 user1 groupA 4096 4월 24 10:05 my_directory
$ chown user3:groupB my_directory
drwxr-xr-x 2 user3 groupB 4096 4월 24 10:05 my_directory
# chgrp groupC file.txt: file.txt 파일의 그룹을 groupC로 변경
'리눅스' 카테고리의 다른 글
[LINUX] 로그 검색하기, 단어 검색 (0) | 2024.06.19 |
---|---|
[LINUX] 심볼릭 링크 생성, 삭제, 수정 (1) | 2023.10.11 |