...
파일 및 디렉터리 권한
리눅스는 여러사용자가 들어와 사용하는 멀티유저 시스템이다. 따라서 여러 사용자가 들어와 사용하다보면, 서버에 올려진 비밀자료 열람과 그것을 변조,수정,삭제를 할 우려가 높아지게 된다.
이 문제를 극복하기위해 리눅스 OS에는 특별한 기능이 있는데 바로 퍼미션(권한)이라는 기능이다.
윈도우 OS에도 퍼미션기능이 있긴하지만, 여러사용자들이 들어오는 서버용이 아니기에 리눅스처럼 활성화 되어 있지않는다.
이 기능으로 사용자들은 자신한테 읽기 퍼미션이 부여된 파일만 읽을 수 있고, 쓰기 퍼미션이 부여된 파일만 쓰기와 수정이 가능하고, 실행 퍼미션이 부여된 파일만 실행이 가능하게 된다. 그리고 열람 권한 뿐만 아니라 파일 소유자 개념도 지원해준다.
소유권 & 허가권 확인 방법
파일 권한 정보 (소유권/허가권) 확인
$ ls -l
$ ls -n # 소유권을 UID/GID 로
파일 유형 종류
문자값 | 디렉토리 및 파일의 종류 |
d | 디렉토리 |
b | 불록 디바이스 파일 (하드 드라이브나 CD-ROM 같이 블록 단위의 데이터를 처리하는 디바이스) |
c | 문자 디바이스 파일(터미널과 모뎀같이 바이트의 열로 데이터를 처리하는 디바이스) |
l | 심볼릭 링크 파일 |
p | 명명된 파이프(Named Pipe) |
s | 유닉스 도메인(Socket) |
- | 일반(정규) 파일 |
허가권(permission)
각 파일에 접근해서 읽거나 쓰거나 실행할 권리를 사용자 / 그룹 / 다른사용자 로 나눠서 관리한다.
- user: 파일을 만든(생성) 소유주
- group: 파일을 만든 소유주가 속한 그룹의 사용자
- other: 기타 사용자
문자값 | 파일 | 디렉토리 |
r(4) | 파일에 대한 읽기 권한. 열기, 읽기 허용 | 디렉토리 내의 파일을 나열할 수 있게 허용 |
w(2) | 파일에 대한 쓰기 권한. 쓰기, 잘라내기 허용 이름 변경이나 파일 삭제 허용하지 않음. 파일 삭제나 파일 이름 변경은 디렉토리 속성에 의해 결정됨 |
디렉토리 내의 파일들을 생성, 삭제, 이름변경이 가능하도록 허용 |
x(1) | 파일에 대한 실행 권한 파일이 프로그램으로 처리되고 파일이 실행되도록 허용 스크립트 언어에서 작성된 프로그램 파일들은 읽기 가능으로 설정 되어 있어야만 실행 가능함 |
디렉토리 내에서 탐색을 위해 이동 할 수 있도록 허용 (디렉토리에 들어 올 수 있도록 허용) |
- | r, w, x에 대한 권한이 없음을 표시 (문자 자리를 -로 대체) |
참고 : 디렉토리는 실행권한 x를 꼭 가지고 있어야 해당 디렉토리로 이동 할 수 있다.
첫번째 rwx 의 의미는 파일소유자에게 읽기, 쓰기, 실행 권한이 모두 있다는 뜻이며
두번째 r-x 의 의미는 파일소유그룹에게 읽기, 실행 권한이 있다는 뜻이며
마지막 r-- 는 파일 소유자와 소유그룹 외에는 읽기 권한만 있다는 뜻이다.
소유권(ownership)
각 파일이나 디렉터리를 소유할 사용자나 그룹을 지정.
소유권(ownership) & 허가권(permission) 변경 방법
허가권 변경 $ chmod [퍼미션 숫자]
모드 | 설명 |
8진수 숫자 | 읽기 4 쓰기 2 실행 1 권한을 주지않으려면 0 (읽기 및 쓰기 4+2=6) 3번째 자리는 다른 사용자 허가권 2번째 자리는 그룹 허가권 1번째 자리는 사용자 허가권 (755라면 사용자 허가권은 읽기, 쓰기, 실행 권한을 모두 갖고 그룹과 다른사용자 허가권은 읽기,실행 권한을 가짐.) |
8진수 | 2진수 | 권한 | 의미 |
0 | 000 | --- | 아무 권한 없음 |
1 | 001 | --x | 실행 권한만 있음 |
2 | 010 | -w- | 쓰기 권한만 있음 |
3 | 011 | -wx | 쓰기,실행 권한 있음 |
4 | 100 | r-- | 읽기 권한만 있음 |
5 | 101 | r-x | 쓰기,실행 권한 있음 |
6 | 110 | rw- | 읽기,쓰기 권한 있음 |
7 | 111 | rwx | 모든 권한 있음 |
예를 들어 '777'의 경우
이진수로 111111111이고 rwxrwxrwx라는 의미를 가지므로
파일 소유자, 소유 그룹, 일반 사용자에게 읽기, 쓰기, 실행의 모든 권한을 주는 설정이다.
# 사용자는 읽기,쓰기(4+2) 권한 부여하고,
# 그룹과 다른사용자는 읽기(4) 권한만 부여
$ chmod 644 myfile.txt
# 권한 전부 주기
$ chmod 777 test.txt
허가권 변경 $ chmod [기호 문자]
모드 | 설명 |
기호 | 읽기 r 쓰기 w 실행 x 권한 추가 + 권한 삭제 - 권한 지정 = 사용자 허가권 u 그룹 허가권 g 다른사용자 허가권 o 모두 a |
# 파일에 대하여 사용자(u)에 읽기 및 쓰기(rw)권한으로 초기화(=)
$ chmod u=rw myfile.txt
# 파일에 모두(a)에게 읽기,쓰기(rw) 권한으로 초기화(=)
$ chmod a=rw file.txt
# test.txt 의 소유자(u)에게 읽기(r) , 쓰기(w) 권한을 추가 부여(+)
$ chmod u+rw test.txt
# test.txt 의 소유그룹(g)에게 쓰기(w) 권한을 제거(-)
$ chmod g-w test.txt
# 그외 계정에게 모든 권한을 제거(-)
# rwx의 순서는 변경하여도 무방하다. o-rwx = o-wxr
$ chmod o-wxr test.txt
허가권 변경 $ chmod 옵션
-R, --recursive | 특정 디렉터리 내의 파일과 디렉터리에 대해 재귀적으로 허가권 변경 |
-C, --changes | 변경된 파일이나 디렉터리에 대한 자세한 정보를 출력 |
-f , --silent, --quite | 대부분의 에러메시지 출력을 제한 |
--reference | 모드 대신 파일에 지정한 모드를 사용 |
# 디렉터리 이하의 모든 파일과 디렉터리에 대해 (-R)
# 사용자는 읽기, 쓰기, 실행(4+2+1) 권한을 부여하고 ,
# 그룹과 다른 사용자는 읽기 및 실행(4+1) 권한 부여
$ chmod -R 755 myfiles
디렉토리의 허가권이 파일보다 우선되는 것은 알고 넘어가자
즉, 어떤 계정이 파일에 허가권이 있지만 그 파일을 담고 있는 디렉토리에 허가권이 없다면 사용불가 한 셈이다.
또한 임의 파일에 실행권한 x 를 부여 하였어도 실제로 실행가능 한 형태가 아니라면 오류가 발생 하다.
x 권한이 있는 파일을 실행하려면 ./ 을 앞에 붙인다. (예로 ./exefile 라고 입력)
사용자 및 그룹 소유권 변경 $ chown
파일이나 디렉터리의 사용자 및 그룹의 소유권을 변경.
소유권 변경은 오직 루트 사용자만 가능하다.
$ chown [options] owner:[group] files
옵션은 허가권 옵션과 같다.
# test.txt 파일을 소유자를 root로
$ chown root test.txt
# 사용자는 myuser 그룹은 mygroup으로 파일 소유자 변경
$ sudo chown myuser:mygroup myfile.txt
# myfiles 디렉터리 이하 모든 파일 및 디렉터리에 대하여 사용자는 myuser, 그룹은 mygroup으로 소유자 변경
$ sudo chown -R myuser:mygroup myfiles
그룹 소유권만 변경 $ chgrp
파일이나 디렉터리의 그룹 소유권만 변경.
# 본인이 소유한파일에 대해 자신의 그룹내 소유권 변경
$ chgrp [options] group file
# test.txt 파일의 소유그룹을 hansgroup로
$ chgrp hansgroup test.txt
# 디렉터리 이하 모든 파일과 디렉터리에 대해 그룹을 colors로 변경
$ chgrp -R colors color_files
기본 허가권 변경 $ umask
리눅스는 시스템상 파일이나 디렉터리를 생성할 때 자동으로 기본허가권이 부여된다.
리눅스 기본허가권은
- 파일의 경우 666
- 디렉터리의 경우 777
이 기본허가권을 사용자 지정하기 위해 사용하는 명령어이다.
계산방법은 다음과 같다.
파일이나 디렉터리 생성시 기본값에서 umask에 설정된 마스크값을 뺀 결과값을 허가권으로 지정한다
ex) umask가 022라면
파일생성시 644(666 - 022), 디렉터리의 경우 755(777 - 022)가 됨.
umask [option][mask]
# 옵션 -S : umask 값을 숫자대신 문자로 표기
# 현재 umask 값 확인
$ umask
0002
# 문자로 현재 umask값 확인
$ umask -S
u=rwx,g=rwx,o=rx
# umask 설정시 문자 사용하여 설정가능
$ umask u=rwx,g=rwx,o=rx
리눅스 파일 특수 권한
위에서 학습한 바와같이, 보통 리눅스의 권한을 3종류라고 인식하고 있는 경우도 많지만, 실제로 리눅스의 권한은 4종류로 이루어져 있다.
실제로 권한을 조회하다 보면 rwx가 아닌 rwt 같은 특이한 권한이 보이기도 하고, chmod 명령어로 숫자로 세팅할때 몇몇 권한 세팅 예제에서 2750, 1777 등 4자리로 표현되는 권한을 보기도 한다. 이들이 모두 특수권한이 적용된 경우이다.
특수 권한이란 예외적인 상황에 대처할 수 있는 권한이며, 기존의 권한 3+3 분류로 해결할수 없는 특수한 상황이 필요한 경우가 있기 때문에 추가된 기능이다.
실제로 많은 보안 공격이 이 특수권한을 활용하여 발생하므로 상식적인 차원에서 알아두어야 한다. 하지만 이 특수권한은 왠만하면 최소한으로 사용해야 하며, 사용에 주의를 요한다.
위 그림을 보면 소유자의 권한 부분 문자가 조금 다르게 표시되어 있는걸 볼 수 있다.
소유자의 권한 부분에서 저 문자 s가 의미하는 것이 바로 특수한 권한을 의미하는 것이다. 이 특정 문자가 User, Group, Other 중 어디에 위치하냐에 따라 그 용도가 달라진다.
SetUID
- 사용자의 권한이 있어야만 실행을 할 수 있는 파일의 경우, 그 권한을 일시적으로 일반사용자들에게 파일 실행권한을 부여하기 위해 사용한다.
- 파일에 Set-UID 비트가 설정되면 다른 사용자가 파일을 실행했을때 해당 사용자의 권한이 아닌 파일의 소유자 권한으로 실행.
- Set-UID 비트를 설정하기 위해 소유자 허가권에 s를 추가하거나 문자 또는 숫자방식으로 설정.
- 숫자 방식으로 설정할 때 가장 앞에 4를 붙여줌.
$ chmod 4750 test.txt # (rws r-x ---)
$ chmod u+s hello.sh
$ chmod u=srwx,g=r,o=r hello.sh
$ chmod 4744 hello.sh
SetGID
- 그룹의 권한이 있어야만 실행을 할 수 있는 파일의 경우,
- 그 권한을 일시적으로 일반 사용자들에게도 부여하여 파일을 실행 할 수 있게 한다.
- 파일에 설정하면 사용자그룹이 아닌 해당 파일그룹으로 실행
- 디렉터리에 지정하면 하나의 디렉터리를 두고 여러 사용자가 공동작업하기 편함.
- 그룹허가권g에 s를 추가하거나, 숫자방식으로 할경우 앞에 2 붙여줌.
$ chmod 2750 test.txt # (rwx r-s ---)
$ chmod g+s hello.sh
$ chmod u=rwx,g=sr,o=r hello.sh
$ chmod 2744 hello.sh
Sticky-Bit (디렉토리에만 설정 가능)
- sticky-bit가 설정된 디렉토리에 파일을 생성하면 해당 파일은 생성한 사람의 소유가 되며, 오직 소유자와 root에게만 해당 파일에 대한 삭제 및 변경의 권한이 있다.
- 공유디렉토리로 사용하고자 할 때 쓰인다.
- 스티키비트 추가하기위해 문자방식인경우 t를 사용하고 숫자방식인경우 1 사용.
$ chmod o+t dir1
$ chmod 1777 dir1 # (drwxrwxrwt) <- 공유폴더 (/tmp와 동일)
# 해당폴더안에 파일이 퍼미션이 777이더라도, 디렉토리 퍼미션이 1777 아래 있으면 파일의 소유자 및 root 만 삭제할 수 있다.
# 참고자료
https://wogh8732.tistory.com/74
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=geonil87&logNo=221022779618
https://brunch.co.kr/@jehovah/12
http://cocotp10.blogspot.com/2018/01/linux-centos7.html
https://dejavuhyo.github.io/posts/linux-permission/
https://it-serial.tistory.com/26
https://blog.csdn.net/qq_19446965/article/details/120109894
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.