본문 바로가기

Operating System/Linux

[Ubuntu] 리눅스 권한

728x90
파일 및 디렉터리 권한
  • 리눅스는 여러 사용자가 들어와 사용하는 멀티유저 시스템이기 때문에 여러 사용자가 들어와 사용하다 보면, 서버에 올려진 비밀자료 열람과 변조,수정,삭제를 할 우려가 생김
  • 이 문제를 극복하기 위해 리눅스 OS에는 특별한 기능이 있는데 바로 퍼미션(권한)이라는 기능
  • 윈도우 OS에도 퍼미션기능이 있긴 하지만 여러 사용자들이 들어오는 서버용이 아니기에 리눅스처럼 활성화되어 있지 않음
  • 이 기능으로 사용자들은 자신한테 읽기 퍼미션이 부여된 파일만 읽을 수(Read) 있고, 쓰기 퍼미션이 부여된 파일만 쓰기와 수정(Write)이 가능하고, 실행 퍼미션이 부여된 파일실행(Execute)이 가능하며, 열람 권한뿐만 아니라 파일 소유자 개념도 지원
  • 즉, 소유자(owner), 그룹(group), 기타(others) 사용자에 대해 읽기(read), 쓰기(write), 실행(execute) 권한을 설정하는 방식으로 관리

소유권 & 허가권 확인 방법

 

파일 권한 정보 (소유권/허가권) 확인
ls -l
ls -n # 소유권을 UID/GID 로


파일 유형 종류
문자값 디렉토리 밎 파일의 종류
- 일반(정규) 파일
d 디렉토리
l 심볼릭 링크 파일
p 명명된 파이프
s 유닉스 도메인
c 문자 디바이스 파일(터미널과 모뎀같이 바이트의 열로 데이터를 처리하는 디바이스)
b 블록 디바이스 파일 (하드 드라이브나 CD-ROM 같이 블록 단위의 데이터를 처리하는 디바이스)


허가권(Permission)
  • 파일에 접근해서 읽거나 쓰거나 실행할 권리사용자 / 그룹 / 다른 사용자로 나눠서 관리
    • user : 파일을 만든(생성) 소유주
    • group : 파일을 만든 소유주가 속한 그룹의 사용자
    • other : 기타 사용자

  • User 권한(rwx) : 파일 소유자에게 읽기, 쓰기, 실행 권한을 모두 가짐
  • Group 권한 (r-x) : 파일 소유 그룹에게 읽기, 실행 권한을 가짐
  • Other 권한(r--) : 그 외에는 읽기 권한만 가짐
문자값 파일 디렉토리
r(4) 파일에 대한 읽기 권한
→ 열기, 읽기 허용
디렉토리 내의 파일을 나열할 수 있게 허용
w(2) 파일에 대한 쓰기 권한
→ 쓰기, 잘라내기 허용

단, 이름 변경이나 파일 삭제 허용하지 않음
파일 삭제나 파일 이름 변경은 디렉토리 속성에 의해 결정
디렉토리 내의 파일들을 생성, 삭제, 이름변경이 가능하도록 허용
x(1) 파일에 대한 실행 권한
→ 파일이 프로그램으로 처리되고 파일이 실행되도록 허용

스크립트 언어에서 작성된 프로그램 파일들은 읽기 가능으로 설정 되어 있어야만 실행 가능
디렉토리 내에서 탐색을 위해 이동 할 수 있도록 허용
→ 디렉토리에 들어 올 수 있도록 허용
-  r, w, x에 대한 권한이 없음을 표시 (문자 자리를 -로 대체)
  • 디렉토리실행 권한(x)를 가져야만 해당 디렉토리로 이동 가능
  • 즉, 'cd 디렉토리명'을 하기 위해선 해당 디렉토리에 실행 권한이 반드시 있어야 한다는 의미


소유권(ownership)
  • 각 파일이나 디렉토리를 소유할 사용자 또는 그룹을 지정


소유권(Ownership) & 허가권(Permission) 변경 방법
허가권 변경 ( chmod [퍼미션 숫자] )

모드 설명
8진수 숫자 읽기 = 4
쓰기 = 2
실행 = 1
권한을 주지않으려면 0
Ex) 읽기 및 쓰기 : 4+2=6

1번째 자리는 사용자 허가권
2번째 자리는 그룹 허가권

3번째 자리는 다른 사용자 허가권

Ex) 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 모든 권한
# 사용자는 읽기,쓰기(4+2) 권한 부여하고, 
# 그룹과 다른사용자는 읽기(4) 권한만 부여
chmod 644 sample.txt

# 권한 전부 주기
chmod 777 sample.txt


허가권 변경 ( chmod [기호 문자] )
누구에게 권한 부여 어떤 권한
u  :사용자
g : 그룹
o : 기타
a : 전부
+ : 권한 추가
- : 권한 삭제
= : 권한 설정
r : 읽기
w : 쓰기
x : 실행
# 사용자(u)에 읽기 및 쓰기(rw)권한으로 초기화(=)
$ chmod u=rw owner-user-setting

# 모두(a)에게 읽기,쓰기(rw) 권한으로 초기화(=)
$ chmod a=rw owner-all-setting

# 소유자(u)에게 읽기(r) , 쓰기(w) 권한을 추가 부여(+)
$ chmod u+rw permission-add

# 소유그룹(g)에게 쓰기(w) 권한을 제거(-)
$ chmod g-w permission-remove

# 그외 계정에게 모든 권한을 제거(-)
# rwx 순서 무관 → o-rwx = o-wxr
$ chmod o-wxr other-no-permission


chmod 옵션
옵션 설명
-R, --recursive 특정 디렉토리 내 파일과 디렉토리에 대해 재귀적으로 허가권 변경
-C, --changes 변경된 파일이나 디렉터리에 대한 자세한 정보 출력
-f, --silent, --quite 대부분의 에러 메세지 출력을 제한
--reference 모드 대신 파일에 지정한 모드를 사용
# 디렉터리 이하의 모든 파일과 디렉터리에 대해 (-R)
# 사용자 : 읽기, 쓰기, 실행(4+2+1) 권한 부여
# 그룹과 다른 사용자 : 읽기 및 실행(4+1) 권한 부여
$ chmod -R 755 mydir

  • 위의 사진에서는 디렉토리 및 그 하위의 모든 파일들의 권한재귀적으로 바뀌는 것을 확인하기 위한 테스트인데 안에 있는 파일들의 권한을 미리 000으로 변경해 두었었음
  • 그 이유는 'chmod -R 000 mydir'을 입력하게 되면 허가 거부가 발생하였음
  • 이는 위에서 설명한 대로 디렉토리 권한의 문제인데, 위에서 디렉토리 안으로 이동(cd 디렉토리명)하기 위해서실행 권한(x)이 반드시 있어야 한다고 설명하였음
  • 하지만 디렉토리의 권한이 000으로 바뀌면서 실행 권한(x)이 사라지게 되었고, 재귀적으로 디렉토리 권한을 000으로 변경 → 디렉토리 안으로 이동하여 안의 파일 및 디렉토리들 권한을 000으로 변경의 순서로 이어져야 하는데 디렉토리가 실행 권한이 없어 해당 디렉토리 안으로 이동하지 못했기 때문에 하위 파일들의 권한을 변경하는 것이 거부되었다고 유추할 수 있음

  • 정리
    • chmod의 -R 옵션재귀적으로 권한을 변경하는데 다음의 순서로 변경이 됨
      1. 해당 디렉토리의 권한 먼저 변경
      2. 해당 디렉토리 내로 이동하여 하위 파일, 디렉토리의 권한을 변경
    • 하지만, 권한을 변경하려는 최상위 디렉토리의 실행 권한이 없으면 최상위 디렉토리 안으로 접근할 수 없기 때문허가 거부
- 디렉토리의 허가권은 파일보다 우선 시
- 즉, 어떤 계정이 파일에 허가권이 있지만 그 파일을 담고 있는 디렉토리에 허가권이 없다면 사용 불가
- 또한, 임의 파일에 실행 권한(x)을 부여했을지라도 실행 가능한 형태가 아니면 오류 발생
- x 권한이 있는 파일을 실행하기 위해서는 ' ./ '을 앞에 붙임
Ex) ./exefile

사용자 및 그룹 소유권 변경 ( chown )
  • 파일이나 디렉토리의 사용자 및 그룹 소유권 변경
  • 소유권 변경오직 루트 사용자만 가능
  • 옵션은 허가권과 동일
chown [옵션] 소유자:[그룹] [파일or그룹명]

mydir 디렉토리의 소유자를 root로
chown root mydir

# 사용자와 그룹을 ubuntu로 변경
sudo chown ubuntu:ubuntu mydir

# mydir 디렉터리 이하 모든 파일 및 디렉터리에 대하여 사용자와 그룹을 root로 소유자 변경
sudo chown -R root:root mydir


그룹 소유권만 변경 ( chgrp )
  • 파일이나 디렉토리의 그룹 소유권만 변경
  • 자신이 속한 그룹 내에서만 변경 가능
  • 자신이 속하지 않은 그룹으로 변경하려면 root 계정 또는 sudo 명령어 사용
  • 옵션은 허가권과 동일
# 본인이 소유한파일에 대해 자신의 그룹내 소유권 변경
chgrp [옵션] [그룹명] [파일명or디렉토리명]


기본 허가권 변경 $ umask
  • 리눅스는 시스템상 파일이나 디렉터리를 생성할 때 자동으로 기본 허가권 부여
    • 파일 : 666(rw- rw- rw-)
    • 디렉토리 : 777(rwx rwx rwx)
  • 계산 방법
    • 파일이나 디렉터리 생성 시 기본값에서 umask에 설정된 마스크값을 뺀 결괏값(기본값 - umask값)을 허가권으로 지정
      • Ex) umask : 022
      • 파일 생성 시 : 666 - 022 = 644 (rw- r-- r--)
      • 디렉토리 생성 시 : 777 - 022 = 755 (rwx r-x r-x)
umask [옵션][mask] 

# 현재 umask 값 확인
umask

# 옵션 -S : umask 값을 숫자대신 문자로 표기
umask -S

# umask 설정시 문자 사용하여 설정가능
umask u=rwx,g=rwx,o=rx

 

  • 디렉토리(777) - umask(002) = 775 = rwx rwx r-x
  • 파일(666) - umask(002) = 664 = rw- rw- r--

  • 디렉토리(777) - umask(022) = 755 = rwx r-x r-x
  • 파일(666) - umask(022) = 644 = rw- r-- r--
umask -S 옵션
- 디렉토리를 기준으로 디렉토리를 생성했을 때 부여받는 권한을 보여주는 것임
- 즉, 디렉토리의 '기본 권한 - umask'를 한 결괏값을 문자로 보여준 것
- 파일의 기본 권한은 666 - umask값으로 직접 계산을 해야 함


리눅스 파일 특수 권한
  • 보통 리눅스의 권한을 3종류라고 인식하고 있는 경우도 많지만 실제로 리눅스의 권한은 4종류
  • 실제로 권한을 조회하다 보면 rwx가 아닌 rwt 같은 특이한 권한이 보이기도 하고, chmod 명령어로 숫자로 세팅할 때 몇몇 권한 세팅 예제에서 2750, 1777 등 4자리로 표현되는 권한을 보기도 하는 데 이들이 모두 특수권한이 적용된 경우
  • 특수 권한이란 예외적인 상황에 대처할 수 있는 권한이며 기존의 권한 3+3 분류로 해결할 수 없는 특수한 상황이 필요한 경우가 있기 때문에 추가된 기능
  • 실제로 많은 보안 공격이 이 특수권한을 활용하여 발생하므로 상식적인 차원에서 알아두어야 하지만 이 특수권한은 웬만하면 최소한으로 사용해야 하며 사용에 주의를 요함
  • 이 특정 문자가 User, Group, Other 중 어디에 위치하냐에 따라 그 용도가 달라짐
  • 특수 권한 숫자
    • SetUID : 4
    • SetGID : 2
    • Sticky : 1


SetUID
  • 사용자의 권한이 있어야만 실행을 할 수 있는 파일의 경우 그 권한을 일시적으로 일반 사용자들에게 파일 실행 권한을 부여하기 위해 사용
  • 파일에 Set-UID 비트가 설정되면 다른 사용자가 파일을 실행했을 때 해당 사용자의 권한이 아닌 파일의 소유자 권한으로 실행
  • Set-UID 비트를 설정하기 위해 소유자 허가권에 s를 추가하거나 문자 또는 숫자방식으로 설정
  • 숫자 방식으로 설정할 때 가장 앞에 4를 붙여줌
사용 예제
# 숫자 방식 : 4를 앞에 붙임
chmod 4750 suid-test1 # (rws r-x ---)

# 문자 방식 : 소유자의 권한에 s를 추가하여 설정
chmod u+s suid-test2

chmod u=srwx,g=r,o=r suid-test3

chmod 4744 suid-test4

  • 대문자 S :Set-UID 비트가 설정되어 있지만 실행 권한(x)이 없을 때 표시
  • 즉, 파일에 Set-UID 비트는 설정되어 있지만 해당 파일이 실행 가능한 상태는 아니라는 의미
  • 보통 Set-UID 비트가 설정된 파일은 실행 권한이 있어야 비로소 Set-UID 기능이 활성화되지만, 실행 권한이 없다면 대문자 S로 표시
    • 소문자 s : 실행 권한이 있는 경우 →  Set-UID 비트가 설정되어 있으며 실행할 수 있는 상태
    • 대문자 S : 실행 권한이 없는 경우 → Set-UID 비트는 설정되어 있지만 실행할 수 없는 상태

 

주의 사항

 

  • 보안 위험
    • Set-UID 비트사용자의 권한을 일시적으로 파일의 소유자 권한으로 변경하기 때문에 잘못 설정되면 보안 취약점이 될 수 있음
    • Ex) 악의적인 사용자가 Set-UID 비트가 설정된 파일을 악용하여 시스템 권한을 획득 가능
  • Set-UID 설정이 필요한 경우
    • 주로 특정 관리 작업을 수행하는 실행 파일들에 한정
    • Ex) /bin/passwd와 같은 파일은 일반 사용자가 비밀번호를 변경할 때 Set-UID 비트가 필요

 

SetGID
  • 그룹의 권한이 있어야만 실행을 할 수 있는 파일의 경우 그 권한을 일시적으로 일반 사용자들에게도 부여하여 파일을 실행할 수 있게 함
  • 파일에 설정하면 사용자 그룹이 아닌 해당 파일 그룹으로 실행
  • 디렉터리에 지정하면 하나의 디렉터리를 두고 여러 사용자가 공동 작업하기 편함
  • 그룹허가권(g)에 s를 추가하거나, 숫자방식으로 할 경우 앞에 2 붙여줌

 

SUID vs SGID 비교
  • SUID (Set-User ID) : 파일을 실행할 때 파일의 소유자 권한으로 실행
  • SGID (Set-Group ID) : 파일을 실행할 때 파일의 그룹 소유자 권한으로 실행 또는 디렉토리 내에서 새 파일이 그 디렉토리의 그룹으로 생성

 

사용 예제
# 숫자 방식 : 4를 앞에 붙임
chmod 2750 sgid-test1 # (rwx r-s ---)

# 문자 방식 : 소유자의 권한에 s를 추가하여 설정
chmod g+s sgid-test2

chmod u=rwx,g=sr,o=r sgid-test3

chmod 2744 sgid-test4

 


Sticky-Bit (디렉토리에만 설정 가능)
  • Sticky-Bit가 설정된 디렉토리에 파일을 생성하면 해당 파일은 생성한 사람의 소유가 되며 오직 소유자와 root에게만 해당 파일에 대한 삭제 및 변경의 권한을 가짐
    • 즉, 다른 사용자는 자기 자신이 생성한 파일을 삭제할 수 없고, root만이 모든 파일을 삭제하거나 수정 가능
  • 주로 공유 디렉토리에서 사용
    • tmp 디렉토리와 같이 여러 사용자가 파일을 생성하고 접근할 수 있는 디렉토리에서 사용
    • 공유 디렉토리에서 다른 사용자가 다른 사용자의 파일을 실수로 삭제하는 것을 방지하는 데 유용
  • Sticky-Bit를 추가하기 위해 문자 방식인 경우 t를 사용 / 숫자 방식인 경우 앞에 1을 붙여줌
사용 예제
chmod o+t sticky-test1 

chmod 1777 sticky-test2 # (drwxrwxrwt) <- 공유폴더 (/tmp와 동일)
# 해당폴더안에 파일이 퍼미션이 777이더라도, 디렉토리 퍼미션이 1777 아래 있으면 파일의 소유자 및 root 만 삭제 가능

 


참고 자료

https://inpa.tistory.com/entry/LINUX-%F0%9F%93%9A-%ED%8C%8C%EC%9D%BC-%EA%B6%8C%ED%95%9C-%EC%86%8C%EC%9C%A0%EA%B6%8C%ED%97%88%EA%B0%80%EA%B6%8C-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC#%EB%A6%AC%EB%88%85%EC%8A%A4_%ED%8C%8C%EC%9D%BC_%ED%8A%B9%EC%88%98_%EA%B6%8C%ED%95%9C

 

🐧 리눅스 파일 & 디렉토리 권한 (소유권 / 허가권 / 특수권한)

파일 및 디렉터리 권한 리눅스는 여러사용자가 들어와 사용하는 멀티유저 시스템이다. 따라서 여러 사용자가 들어와 사용하다보면, 서버에 올려진 비밀자료 열람과 그것을 변조,수정,삭제를 할

inpa.tistory.com

 

728x90