Contents

리눅스 퍼미션 관리

   Mar 22, 2023     12 min read

퍼미션 종류

1. 상대 모드 (심볼릭 모드)

사용자 종류기능
uuser 퍼미션 수정
ggroup 퍼미션 수정
o타인의 퍼미션 수정
a모든 퍼미션 수정



퍼미션기능
r읽기 퍼미션
w쓰기 퍼미션
x실행 퍼미션



연산자기능
+퍼미션 추가
-퍼미션 삭제
=퍼미션을 일치시킴



# chmod ug+rwx 1
# chmod ug-rwx 1
# chmod ug=rwx 1
# chmod ugo+rwx 1
# chmod a-rwx 1
# chmod u-x,g-xw,o-rx 1



2. 절대 모드 (수치 모드)

사진첨부

# chmod 700 1
# chmod 070 1
# chmod 007 1
# chmod 777 1



소유권 변경 명령어

  • 파일의 소유자나 소유그룹을 변경한다.

  • chown [옵션] 소유자:소유그룹 파일명
  • chown [옵션] 소유자:소유그룹 파일명

  • -R (경로와 그 하위 파일들을 모두 변경한다.)

# touch 1
# chown user1:user1 1
# ls –al

# chown root 1
# ls –al

# chown :root 1 = chgrp root 1
# ll



umask

1. 특징

  • 허가권 지정 명령어로 일반 파일인 경우 666 , 디렉토리인 경우 777 에서 umask 값을 뺀 값을 기본 허가권으로 조정한다.
  • umask(027) 변경해도 로그아웃 하면 umask(022)로 변경된다. ( /etc/profile 값을 수정하면 변경된 값을 계속 유지 할수 있다. )
  • 시스템전체 설정 ( /etc/profile ) 또는 개인적으로 설정 ( .profile.bashrc.cshrc ) 한 경우 로그인과 동시에 적용 되어 진다.
  • 유닉스는 파일 생성시 실행 권한(‘x’)을 갖지 못하지만, 디렉토리 생성시는 실행권한을 갖는다.
  • 퍼미션 상속 과 cp, mv 퍼미션 의미없음.( umask 퍼미션이 적용됨 )

2. 기본 퍼미션 설정하기

Umask디렉토리 허가권(777)파일 허가권 (666)
002775664
007770660
020757646
070707606
022755644



# umask

# touch file1
# mkdir dir1

# ll

# umask 070
# umask

# touch file2
# mkdir dir2

# ll



퍼미션 (Permission)

  • 파일 종류 확인 : ls -F ( 실행파일 * , 디렉토리 /, 링크파일 @ ) 파일 퍼미션 확인 : ll ( ls -l )
  • 소유자 변경 ( chown ) , 그룹 변경( chgrp ), 퍼미션변경( chmod ) 하위 디렉토리 및 파일 모두 변경할 때 사용 ( -R 옵션 ).

기본 퍼미션

  • r( 4)=read / w( 2 )=write / x( 1)=execute

사진첨부

  • ls -l /dev | more
    Block Device ( 저장장치 : 하드디스크, 플로피디스크, CD-ROM )
    Character Device ( 입출력장치 : 마우스, 키보드, 프린터 )

사진첨부

  • 이진파일과 일반파일 실행퍼미션만 주고 실행해보기
  • 슈퍼유저인 root사용자는 실행권한 만 빼고 퍼미션과 소유권을 초월한다.

Ex. 퍼미션

사진첨부

방법

# mkdir /dir1
# touch /dir1/1.txt

# chmod 555 /dir1
# chmod 457 /dir1/1.txt

# useradd user1
# useradd user2
# useradd user3

# useradd sales
# useramod -G sales user2
# cat /etc/group | grpe sales

# chown user1:sales /dir1/1.txt



결과

  • user1
# su - user1
$ cd /dir1

cat < 1.txt   // 읽기
cat > 1.txt   // 쓰기
./1.txt       // 실행


사진첨부
user1은 읽기만 가능하고 쓰기, 실행은 거부된다.

  • user2
# su - user2
$ cd /dir1

cat < 1.txt   // 읽기
cat > 1.txt   // 쓰기
./1.txt       // 실행


사진첨부
user2는 읽기, 실행만 되고 쓰기는 안 된다.

  • user3
# su - user3
$ cd /dir1

cat < 1.txt   // 읽기
cat > 1.txt   // 쓰기
./1.txt       // 실행


사진첨부
user3은 읽기, 쓰기, 실행 모두 다 된다.

참고

  • ls -ld /dir1
  • ls -ld /dir1/1.txt

setuid 와 setguid

  • ‘SetID/SetGID’는 파일에 대한 소유권을 다른 사용자에게 할당하여, 소유권이 없는 사용자도 파일에 대한 소유권을 갖게할 수 있는 기능을 수행한다. 일반적으로 소유자가 root 인 실행 파일에 적용한다.

사진첨부

# chmod 4755 my.exe 
# chmod 2755 my.exe 
# chmod 1755 my.exe
# chmod u+s my.exe 
# chmod g+s my.exe



  • 결과 확인 : ll

Ex. 쉘이 실행되는 동안 관리자 권한으로 모든 작업 가능하게 하기

# cp /bin/ksh /home/user1
# chmod 4755 /home/user1/ksh
# ll /home/user1/ksh

# su - user1
$ id

$ ./ksh
# id



Sticky bit

# useradd user1
# useradd user2

# mkdir /work
# chmod 1777 /work



# su - user1

$ cd /work
$ touch 1
$ chmod 777 1

$ mkdir dir1
$ chmod 777 dir1



# su - user2

$ cd /work

$ rm -rf 1 --- 삭제에러 ( others에 모든 권한이 있어도 삭제되지 않는다. )
$ vi 1 --- 편집성공
$ cat 1 --- 읽기성공

$ rm -rf dir1 --- 삭제에러 ( others에 모든 권한이 있어도 삭제되지 않는다. )



  • 파일에 쓰기 권한이 없어도 디렉토리 쓰기 권한이 있는 경우, 디렉토리 권한에 의해서 파일을 삭제할 수 있다.
  • 만약, 특정 디렉토리를 공유 목적으로 사용할 경우, 사용자들에 의해서 파일이 생성될 수있으나, 디렉토리 파일을 삭제할 수 없도록 제한하려면 ‘Sticky’ 권한을 설정해야 한다.
  • 예를 들어, 디렉토리 쓰기(touch, cp, vi 편집기) 권한이 있어도 파일 삭제(rm, mv, vi 편집기 수정 작업) 권한을 제외할 경우 사용한다.
  • 단, 파일에 대한 소유권을 갖고 있는 소유자, 그룹, Root 는 이 기능에서 제외된다.

ACL (Access Control List)

  • 사용자 하나와 그룹 하나에게만 권한을 줄 수 있는 파일 퍼미션을 확장하여, 여러 명의 사용자와 그룹에게 접근 권한을 줄 수 있는 것이 ACL(Access Control List) 임

  • getfacl : 파일의 ACL 상태를 확인한다.
  • setfacl : 파일에 ACL을 설정하거나 삭제할 수 있다.

  • # setfacl [option] [u/g/o:사용자/그룹:상대모드/절대모드] [File/Directory]
  • -m : Modify의 약자로 권한을 지정하거나 수정할 때 사용
  • -x : 사용자를 제거할 때 사용
  • -R : 디렉토리의 경우 하위 디렉토리와 파일까지 권한을 변경
  • -b : 권한 및 mask 등 지정한 권한을 전부 제거
  • -d : 자신의 디렉토리 내에서 생성되는 폴더 / 파일에 자동으로 ACL 퍼미션을 상속

# setfacl -m u:user1:rw-, g:sales:r-x, o:rwx 1

# setfacl -m u:일반사용자:rw- 파일명
# setfacl -m g:그룹사용자:rw- 파일명
# setffacl -m o:rwx 파일명



  • 규칙
    1. 퍼미션을 문자로 줄 경우 rw- 처럼 세 자리를 전부 다 사용해야 한다. rw 라고만 하면 명령어 에러가 난다.
    2. ACL 퍼미션을 설정한 경우만 MASK 가 생성되어짐
    3. 소유자 와 그룹소유자 퍼미션을 변경하면 자동으로 가장 큰 퍼미션으로 MASK 퍼미션이 변경되어짐
    4. MASK 퍼미션을 직접 설정한 경우, ACL 퍼미션은 MASK 퍼미션을 넘지 못함

Ex. ACL

  1. 일반 파일은 아래의 첫 번째 결과처럼 user나 group 부분에 아무런 사용자명이나 그룹명이 등록되어 있지 않다.

# mkdir /dir1
# cd /dir1
# touch 1.txt
# getfacl 1.txt

↓ 이렇게 뜸.
# file: 1.txt
# owner: root
# group: root
user::rw-
group::r--
otehr::r--



  1. 소유자가 root인 파일을 일반 사용자가 수정할 수 있도록 ACL을 적용

# useradd user1
# setfacl -m u:user1:rwx 1.txt
# getfacl 1.txt

↓ 이렇게 뜸.
# file: 1.txt
# owner: root
# group: root
user::rw-
user:user1:rwx
group::r--
mask::rwx
otehr::r--


mask::rwx가 생성되었다.

# setfacl -m m:r-- 1.txt
# getfacl 1.txt

↓ 이렇게 뜸.
# file: 1.txt
# owner: root
# group: root
user::rw-
user:user1:rwx      #effective:r--
group::r--
mask::r--
otehr::r--


effective:r--, mask::r--가 생성되었다.

# su - user1
$ ls -l 1
-rw-r—r--+ 1 root root 0 Dec 4 10:10 1

# setfacl -x user:user1 /dir1/1
: 사용자를 제거할 때 사용
# getfacl /dir1/1

# setfacl -b /dir1/1
권한 및 mask 등 지정한 권한을 전부 제거
# getfacl /dir1/1

# setfacl -m d:u:user1:rwx /dir1
: /test 폴더에 user1 유저에게 rwx권한을 주며, /test 폴더 아래 생성되는 파일/폴더에 동일한 퍼미션값을 상속함
# getfacl /dir1

# touch /dir1/2
# getfacl /dir1/2

# mkdir /dir1/dir2
# getfacl /dir1/dir2



참고

# setfacl -m u:500:rwx /test


  • /test 폴더에 500 UID의 유저에게 rwx권한을 준다.

# setfacl -m u:user1:rwx /test


  • /test 폴더에 user1 유저에게 rwx권한을 준다.

# setfacl -R -m user:user1:rwx /test


  • 디렉토리의 경우 하위 디렉토리와 파일까지 권한을 변겅

Ex. ACL 퍼미션

사진첨부

방법

# useradd user1 (~ 7)
# groupadd sales 
# groupadd humans
# gpasswd -a user2 sales
# gpasswd -a user7 humans

# mkdir /dir1
# chmod 575 /dir1
# chown user1:sales /dir1

# setfacl -m d:u:user3:r-x,d:u:user4:rwx /dir1
# setfacl -m u:user3:r-x,u:user4:rwx /dir1
# getfacl /dir1

# cd /dir1
# touch a
# getfacl a

# setfacl -b a
# getfacl a

# chmod 555 a
# chown user6:humans a

# touch b
# getfacl b



결과

# su - user1

$ ls /dir1
$ touch /dir1/c
$ cd /dir1

$ cat < a
$ cat > a
$ ./a



  • user1

사진첨부

폴더 : 읽기(O), 쓰기(X), 실행(O)
파일 : 읽기(O), 쓰기(X), 실행(O)

  • user2

사진첨부

폴더 : 읽기(O), 쓰기(O), 실행(O)
파일 : 읽기(O), 쓰기(X), 실행(O)

  • user3

사진첨부

폴더 : 읽기(O), 쓰기(X), 실행(O)
파일 : 읽기(O), 쓰기(X), 실행(O)

  • user4

사진첨부

폴더 : 읽기(O), 쓰기(O), 실행(O)
파일 : 읽기(O), 쓰기(X), 실행(O)

  • user5

사진첨부

폴더 : 읽기(O), 쓰기(X), 실행(O)
파일 : 읽기(O), 쓰기(X), 실행(O)

  • user6

사진첨부

폴더 : 읽기(O), 쓰기(X), 실행(O)
파일 : 읽기(O), 쓰기(X), 실행(O)

  • user7

사진첨부

폴더 : 읽기(O), 쓰기(X), 실행(O)
파일 : 읽기(O), 쓰기(X), 실행(O)

참고

  • ACL 백업
# getfacl -R --skip-base / > backup.acl



  • ACL 복구
# setfacl --restore=backup.acl



  • ACL 제거
# setfacl -b dir1



sudo (Super User Do)

  • 인증받은 사용자가 특정 명령을 root 권한으로 실행하는 명령어 이다.
  • su 명령을 이용하여 root 계정으로 들어가면 모든 권한을 가지게 되어 보안상 매우 위험하다. 그래서 특정 작업만 수행할 수 있는 권한을 주는 것이 가능한데, sudo 명령으로 이와같은 제한적인 권한 부여가 가능하다.

/etc/sudoers


sudo 명령을 내릴 수 있는 사용자와 명령을 정의한 파일

visudo


/etc/sudoers 파일을 수정하는 명령어

참고

# vi /etc/sudoers


vi 편집기로는 수정할 수 없다. (read-only 파일) ` : wq -> wq! `

# visudo

user1 ALL=/usr/sbin/useradd, /usr/bin/passwd
%sales ALL=/usr/sbin/useradd, /usr/bin/passwd

# useradd user1
# passwd user1

# su - user1

$ whoami
$ useradd user2
에러

$ /usr/sbin/useradd user3
에러

$ sudo /usr/sbin/useradd user4
성공

$ sudo /usr/bin/passwd user4
성공

$ sudo /usr/bin/userdel -r user4
에러



파일 속성 설정으로 파일 변형 막기

  • chattr : 파일 속성 변경 명령어
  • lsattr : 파일 속성 출력 명령어

# which lsattr
# which chattr

# rpm -qf /usr/bin/chattr (chattr 패키지 확인)



  • + 연산자는 속성을 추가한다.
  • - 연산자는 속성을 제거한다.
  • = 연산자는 주어진 속성만 유지한다.

Ex. 연습 01

  • i 옵션 주면 읽기만 가능하다.
# touch bbb.lst
# ls -l bbb.lst

# chmod 777 bbb.lst
# ls -l bbb.lst
-rwxrwxrwx 1 root root 0 Oct 8 16:43 bbb.lst

# chattr +i bbb.lst
# lsattr bbb.lst
----i-------- bbb.lst

# rm -rf bbb.lst ( 에러 )

# chattr -i bbb.lst
# lsattr bbb.lst
------------- bbb.lst

# rm -rf bbb.lst ( 성공 )



Ex. 연습 02

  • a 옵션만 주면 읽기와 추가만 가능하다.

# touch bbb.lst
# ls -l bbb.lst

# chmod 777 bbb.lst
# ls -l bbb.lst
-rwxrwxrwx 1 root root 0 Oct 8 16:43 bbb.lst

# chattr +a bbb.lst
# lsattr bbb.lst
----a-------- bbb.lst

# cat < bbb.lst ( 성공 )
# cat >> bbb.lst ( 성공 )
# rm -rf bbb.lst ( 에러 )

# chattr -a bbb.lst
# lsattr bbb.lst
------------- bbb.lst

# rm -rf bbb.lst ( 성공 )