LINUX(Server)

권한 관리

천천히, 한 걸음씩 2024. 4. 17. 00:10

권한 관리

* 소유권 & 허가권
- 시스템에 존재하는 모든 파일은 권한이 부여되어있다.
- 파일을 소유한 권한을 소유권 ( Ownership ) 이라고 한다.
- 접근을 제한 할 수 있는 권한을 ( Permission )이라고 한다.

* 소유권 ( Ownership )
- 소유권 확인 명령어
#ls -l ( 이미지 참고 )

* 소유권 변경 - chown( Change OWNership )
① 소유자만 변경
#chown [계정] [file or Dir]

② 소유자와 그룹을 변경1
#chown [계정]:[그룹] [file or Dir]

③ 소유자와 그룹을 변경2
#chown [계정].[그룹] [file or Dir]

④ 그룹만 변경1
#chown :[그룹] [file or Dir]

⑤ 그룹만 변경2
#chown .[그룹] [file or Dir]

⑥ 그룹만 변경3
#chgrp [그룹] [file or Dir]


! 실습 
@root
#useradd JISOO
#groupadd BLACKPINK
#cd ~

#touch testFile //테스트 파일 생성
#ll // root root

#chown JISOO testFile
#ll // JISOO root

#chown root:BLACKPINK testFile
#ll // root BLACPINK

#chown JISOO.root testFile
#ll // JISOO root

#chown :BLACKPINK testFile
#ll // JISOO BLACKPINK

#chown .root testFile
#ll // JISOO root

#chgrp BLACKPINK testFile
#ll // JISOO BLACKPINK

 

허가권 ( Permission )

- 허가권 필드 확인 명령어


  #ls -l ( 이미지 참조 )


- 허가권 필드는 3개의 필드로 구성되어 있다.

소유자(User) ,  그룹(Group) , 기타 사용자(Ohter)
 u              g            o


rwx의 의미

r ( Read ) : 읽기 권한 
w ( Write ) : 쓰기 권한
x ( eXcute ) : 실행 권한
- ( bar )  : 해당사항 없음

Ex)
-rw-r--r--

rw- : 소유자는 읽고 쓸 수 있는 권한이 있다.
r-- : 소유한 그룹에는 읽을 수 있는 권한이 있다.
r-- : 나머지 사용자는 읽을 수 있는 권한이 있다.


* 허가권 변경 - chmod

- 해당 명령어에는 2가지 모드가 존재한다.

① 기호모드 ② 숫자모드


① 기호모드
r : 읽기 권한    + : 권한 추가    u : User s : SetUID,SetGID
w : 쓰기 권한    - : 권한 회수    g : Group t : sTicky bit
x : 실행 권한    = : 권한 유지    o : Other
  a : All


! 실 습

#mkdir /Practice ; cd /Practice
#touch file
#ll  // -rw-r--r--

#chmod u+x file  // 소유자 실행권한 추가
#ll  // -rwxr--r--

#chmod g+x file  // 소유그룹 실행권한 추가
#ll  // -rwxr-xr--

#chmod o+x file      // 기타사용자 실행권한 추가
#ll  // -rwxr-xr-x

#chmod go+w file  // 소유그룹,기타사용자 쓰기권한 추가
#ll  // -rwxrwxrwx

#chmod a-x file      // 모든사용자 실행권한 회수
#ll  // -rw-rw-rw-

#chmod u-r,g-w,o+x file  // 소유자 읽기권한 회수 , 소유그룹 쓰기권한 회수 , 기타사용자 실행권한 추가
( 사용자별로 권한설정이 다를경우 , 를 구분자로 사용한다. )
#ll   // --w-r--rwx


#chmod u=rwx,g=rw,o=rw file //소유자권한 읽기,쓰기,실행
  소유그룹권한 읽기,쓰기
  기타사용자권한 읽기,쓰기 지정
#ll // -rwxrw-rw-



② 숫자 모드
- 각각의 허가권 필드를 8진수로(0~7)로 표기하는 방법

@2진수 -> 8진수 진법 변환

2진수      8진수
000           0
001    1   
010    2
011     3
100   4
101       5
110   6
111   7


사용자(u) 그룹(g) 기타사용자(o)

기호  rwx  rwx rwx
2진수    111  111 111
8진수   7               7              7


! 연 습
-rwxr-x--x -> rwx r-x --x -> 111 101 001 -> 7 5 1 -> 751
-r------wx -> r-- --- -wx -> 100 000 011 -> 4 0 3 -> 403
--wx-w-rwx -> -wx -w- rwx -> 101 010 111 -> 3 2 7 -> 327
-r--r--r-- -> r-- r-- r-- -> 100 100 100 -> 4 4 4 -> 444
---------- -> --- --- --- -> 000 000 000 -> 0 0 0 -> 000
-rw-rw-rw- -> rw- rw- rw- -> 110 110 110 -> 6 6 6 -> 666
-r-xr-xr-x -> r-x r-x r-x -> 101 101 101 -> 5 5 5 -> 555
-rwx------ -> rwx --- --- -> 111 000 000 -> 7 0 0 -> 700
-rwxr----- -> rwx r-- --- -> 111 100 000 -> 7 4 0 -> 740



! 실 습
@root

#useradd testuser1 // 실습을 위한 testuser1계정 생성
#passwd testuser1
111
111

#useradd testuser2 // 실습을 위한 testuser2계정 생성
#passwd testuser2
111
111

#useradd testuser3 // 실습을 위한 testuser3계정 생성
#passwd testuser3
111
111

#groupadd testgroup //testgroup 생성
#usermod -g testgroup testuser2 //testuser2를 testgroup에 추가
#groups testuser1 testuser2 testuser3  //그룹 확인


#mkdir /Practice //테스트 디렉터리 생성
#chmod 777 /Practice //모든유저에게 모든권한 추가
#cd /Practice
#mkdir testDir //테스트디렉터리 생성
#chown testuser1:testgroup testDir   //소유자와 소유그룹변경
#ll 

drwxr-xr-x. 2 testuser1 testgroup 4096 2018-05-15 04:23 testDir

@root,testuser1,testuser2,testuser3
#cd /Practice //실습 디렉터리로 이동
#pwd
/Practice

=>
   root    소유자   소유그룹   기타사용자
r(ls)     O  O         O            O
w(touch)    O        O         X            X
x(cd)       O        O         O            O


@root
#chmod 444 /Practice/testDir

@root,testuser1,testuser2,testuser3

=>
    root 소유자   소유그룹   기타사용자
r(ls)      O   O         O            O
w(touch)     O        X         X            X
x(cd)        O        X         X            X


@root
#chmod 300 /Practice/testDir

@root,testuser1,testuser2,testuser3

=>
    root 소유자   소유그룹   기타사용자
r(ls)      O   X         X            X
w(touch)     O        O         X            X
x(cd)        O        O         X            X


@root
#chmod 571 /Practice/testDir

@root,testuser1,testuser2,testuser3

=>
    root 소유자   소유그룹   기타사용자
r(ls)      O   O         O            X
w(touch)     O        X         O            X
x(cd)        O        O         O            O

+@ 직접 문제를 내시고 실습해보세요.


! 실 습 ( 파일 권한 )
@root
(
#useradd testuser1
#passwd testuser1
111
111

#useradd testuser2
#passwd testuser2
111
111

#useradd testuser3
#passwd testuser3
111
111

#groupadd testgroup //그룹생성
#usermod -g testgroup testuser2 //testgroup에 testuser2 등록

)

(#mkdir /Practice) // 없을시 생성
#cd /Practice

#touch file // 실습파일 생성
#chown testuser1:testgroup file // 소유주 testuser1
   소유그룹 testgroup2로 변환

#chmod 111 file

@root,testuser1,testuser2,testuser3로그인
#cd /Practice //실습 디렉터리로 이동
#pwd // /Practice확인후 진행


@root
#cat file  // O
#vi file // O
#./file // O

@testuser1(소유주 u )
#cat file  // X
#vi file // X
#./file // X ( 파일을 실행할 경우 읽기권한이 필요 )

@testuser2(소유그룹 g )
#cat file  // X
#vi file // X
#./file // X ( 파일을 실행할 경우 읽기권한이 필요 )

@testuser3(기타 사용자 o )
#cat file  // X
#vi file // X
#./file // X ( 파일을 실행할 경우 읽기권한이 필요 )

 


#chmod 222 file

@root
#cat file  // O
#vi file // O
#./file // X

@testuser1(소유주 u )
#cat file  // X
#vi file // X  ( 편집을 할 경우 읽기 권한이 있어야 한다. )
#./file // X

@testuser2(소유그룹 g )
#cat file  // X
#vi file // X  ( 편집을 할 경우 읽기 권한이 있어야 한다. )
#./file // X

@testuser3(기타 사용자 o )
#cat file  // X
#vi file // X  ( 편집을 할 경우 읽기 권한이 있어야 한다. )
#./file // X



#chmod 546 file

@root
#cat file  // O
#vi file // O
#./file // O

@testuser1(소유주 u )
#cat file  // O
#vi file // X
#./file // O

@testuser2(소유그룹 g )
#cat file  // O
#vi file // X
#./file // X

@testuser3(기타 사용자 o )
#cat file  // O
#vi file // O
#./file // X

+@ 직접 문제를 내보시고 실습해보세요.
#chmod 761 file
#chmod 723 file
#chmod 542 file


* UMASK
- 파일/디렉터리를 생성할때 가지게 되는 기본 허가권을
  결정하는일에 기준이 되는 값
  
- 디렉터리 기본허가권 777
- 파일 기본 허가권 666

- UMASK를 이용하여 파일의 기본 허가권 계산


Ex)
①파일의 기본 허가권 : 666 
기본 UMASK     : 022

② 8진수 -> 2진수 변경
파일의 기본 허가권  : 110 110 110 
기본 UMASK         : 000 010 010
UMASK의 보수     : 111 101 101  ( 보수 : 1->0전환
   0->1전환 )

③ 파일의 허가권과 UMASK의 보수로 AND 연산
파일의 기본 허가권 : 110 110 110 
UMASK의 보수   : 111 101 101
               --------------   
    110 100 100  ( AND연산 : 연산대상이 모두 1일경우
    rw- r-- r--     결과적으로 1을 반환 
     6   4   4   연산대상이 모두 1이 아니면
    결과적으로 0을 반환 )
  
Ex) 
① 디렉터리의 기본 허가권 : 777
기본 UMASK      : 022

② 8진수 -> 2진수 변경
디렉터리의 기본 허가권   : 111 111 111 
기본 UMASK          : 000 010 010
UMASK의 보수     : 111 101 101  

③ 디렉터리의 허가권과 UMASK의 보수로 AND 연산
디렉터리의 기본 허가권 : 111 111 111 
UMASK의 보수      : 111 101 101
   --------------   
   111 101 101
   rwx r-x r-x
7   5   5


* UMASK값 변경

① 일시적 변경
#umask [필터값] : 필터로 사용될 기준값 설정

! 실 습
#cd 
#mkdir ./umaskEx
#cd ./umaskEx

#umask  // 0022
#mkdir dir1 // rwx r-x r-x (755)
#touch file1 // rw- r-- r-- (644)
#ll

#umask 000 // 000으로 일시적 변경
#mkdir dir2 // rwx rwx rwx (777)
#touch file2 // rw- rw- rw- (666)
#ll


#umask 027 // 027으로 일시적 변경
#mkdir file3 // rwx rw- --- (750)
#touch dir3 // rw- r-- --- (640)
#ll

- 재접속시도 -

#umask // 0022로 초기화
 

② 영구적 변경
/etc/profile에서 umask값을 변경 ( 재로그인후부터 적용 )

! 실 습
#umask // 0022 확인
#cd /Practice
#touch testfile1 // rwxr-xr-x
#mkdir testfile1 // rw-r--r--


#vi /etc/profile // umask값 적용 파일
----------------------
64번행의 umask값을 수정 
umask 0044

:wq
-----------------------

#umask // 재접속을 하지 않았기 때문에
변경된 설정이 적용 X

재접속

#umask // 0044로 변경 확인

#cd /Practice
#touch testfile2 // rwx-wx-wx
#mkdir testdir2 // rw--w--w-
#ll


* 특수 권한 - Setuid

- 실행파일에 적용되는 권한
- SetUID가 설정된 파일을 실행하게 되면 파일을 실행한 사용자가 아닌
  해당 파일을 소유한 소유자의 권한으로 실행하게 된다.

- 기호모드 u+s , 숫자모드 4000으로 Setuid를 설정한다.
- Setuid를 적절하게 사용하면 시스템관리에 많은 도움이 되지만
  악용이 될경우 root의 권한으로 프로그램이 실행되기 때문에 매우 위험하다.

- SetUID파일이 갑자기 생성이 된다면 , 악성프로그램 감염여부를 확인해야 된다.


! 실 습
#mkdir -p /Practice/setuid
#cd /Practice/setuid
#touch setuid{1..3}
#ls
setuid1 setuid2 setuid3

#chmod 4775 setuid1
#chmod 4655 setuid2
#chmod 400 setuid3
#ll

-rwsr-xr-x ~ setuid1
// 기존의 허가권필드에 실행권한(x)이 있으면 소문자 s

-rwSr-xr-x ~ setuid2
// 기존의 허가권필드에 실행권한(x)이 없으면 대문자 S

-r-------- ~ setuid3

@testuser1
#cd /Practice/setuid
#cat setuid3 // 허가 거부

@root
#chmod u+s /bin/cat // cat명령어에 setuid권한 부여
#ll /bin/cat // -rwsr-xr-x (s확인)

@testuser1
#cat setuid3 // /bin/cat의 소유주인 root의
   권한으로 실행되기때문에 가능


@root
#chmod u-s /bin/cat // cat명령어에 setuid권한 회수
#ll /bin/cat // -rwxr-xr-x

@testuser1
#cat setuid3 // 권한이 회수되었기 떄문에 허가 거부


* 특수 권한 - Setgid
- 디렉터리를 소유한 그룹의 권한으로 실행하며 대부분 디렉터리에 설정한다.
- 기호모드 g+s , 숫자모드 2000과 같은 방법으로 설정한다.
- 그룹간에 파일을 공유하는 디렉터리에 설정하면
  그룹에 속한 사용자들이 모두 동일한 권한으로 
  사용할 수 있는 이점이 있다.

- Setgid가 설정된 디렉터리에서는 해당 디렉터리의
  그룹 소유권에 설정된 GID로 파일 및 디렉터리가 생성된다.


! 실 습
@root
#mkdir /Practice/setgid
#chown :testgroup /Practice/setgid
#chmod 777 /Practice/setgid
#cd /Practice/setgid
#touch before_root_file{1..3}
#ll

before_root_file1  // root root
before_root_file2  // root root
before_root_file3  // root root

@testuser1
$cd /Practice/setgid
$touch before_user_file{1..3} 

before_user_file1 // testuser1 testuser1
before_user_file2   // testuser1 testuser1
before_user_file3   // testuser1 testuser1

@root
#chmod g+s /Practice/setgid    //SetGID설정

//해당 디렉터리에는 setgid를 소유한 그룹의 권한으로
  파일 및 디렉터리가 생성된다.

#touch after_root_file{1..3}
#ll

after_root_file1  // root testgroup ( setgid의 소유그룹 )
after_root_file1 // root testgroup
after_root_file1 // root testgroup

@testuser1
$touch after_user_file{1..3}
$ll

after_user_file1  // testuser1 testgroup ( setgid의 소유그룹 )
after_user_file1 // testuser1 testgroup
after_user_file1 // testuser1 testgroup


* 특수 권한 - Sticky bit

- 모든 사용자가 공유하는 디렉터리에 설정한다.
  (rwx rwx rwx)

- sticky설정이 되어있는 디렉터리에서는
  해당파일을 소유한 계정만이 파일을 삭제할 수 있다.

- 기호모드 o+t , 숫자모드 1000으로 설정한다.


! 실습 
@root
#mkdir /Practice/sticky{1,2}
#touch /Practice/sticky{1,2}/file


#chmod 777 /Practice/sticky1  // 모든 권한 부여
#chmod 1777 /Practice/sticky2  // 모든 권한 부여 + 
  Sticky특수권한 설정

#ll /Practice

drwxrwxrwx ~~ sticky1
drwxrwxrwt ~~ sticky2 // (t권한 확인)


#chmod 777 /Practice/sticky1/file  //실습을 위해서 777로 권한 부여
#chmod 777 /Practice/sticky2/file   //실습을 위해서 777로 권한 부여

@testuser1
$cd /Practice/sticky1 //일반 디렉터리(777권한)

$cat file // 읽기 권한 o
$./file // 실행 권한 o
$vi file // 쓰기 권한 o
$rm file // 쓰기 권한 o

$cd /Practice/sticky2 //sticky권한이 추가된 
  디렉터리(777권한)

$cat file // 읽기 권한 o
$./file // 실행 권한 o
$vi file // 쓰기 권한 o
$rm file // 쓰기 권한 x


* 속성 ( attribution )
- 허가권 / 소유권과 다른 개념으로 파일을 관리 할 수 있다.
- 속성 확인 명령어 - lsattr
- 속성 변경 명령어 - chattr ( + , - )
- 속성의 종류

① i ( immutable )
특정 파일에 i 속성이 설정되어 있는 경우
파일의 내용을 수정 , 변경 ,삭제 등
모든 사항을 변경할 수 없다. ( 불변 )

ex) 삭제가되면 안되는 파일 , 부팅관련 파일 , 중요한 파일


② a ( append only )
i 속성과 동일하게 기본값은 불변이다.
기존 파일의 내용은 유지하고 , 
새로운 내용을 추가하는 형태는 가능하다.

Ex) 로그파일

+@ 그 외 속성은 거의 사용하지 않는다.


! 실 습
#mkdir -p /Practice/attr_test
#cd /Practice/attr_test

#echo "attrTest" > file1 //test용도 파일 생성
#lsattr file1 // 파일의 속성 확인
#vi file1
--------------
자유자재로 편집

:wq! // 편집 가능
--------------
#echo "AddData" >> file1 // 추가 가능
#rm -f file1 // 삭제 가능


#echo "attrTest" > file1 // test용도 파일 생성
#lsattr file1 // 파일의 속성 확인
#chattr +i file1 // 불변속성 적용
#lsattr file1 // 속성적용 확인(i)


#vi file1
--------------
자유자재로 편집

:wq! // 편집 불가능
--------------
#echo "AddData" >> file1 // 추가 불가능
#rm -f file1 // 삭제 불가능


#chattr -i file1 // 불변속성 제거
#lsattr // 속성제거 확인

#vi file1
--------------
자유자재로 편집

:wq! // 편집 가능
--------------
#echo "AddData" >> file1 // 추가 가능
#rm -f file1 // 삭제 가능


#echo "attrTest" > file1 // test용도 파일 생성
#lsattr file1 // 파일의 속성 확인
#chattr +a file1 // 추가속성 적용
#lsattr file1 // 속성적용 확인(a)


#vi file1
--------------
자유자재로 편집

:wq! // 편집 불가능
--------------
#echo "AddData" >> file1 // 추가 가능
#rm -f file1 // 삭제 불가능


#chattr -a file1 // 추가속성 제거
#lsattr // 속성제거 확인

#vi file1
--------------
자유자재로 편집

:wq! // 편집 가능
--------------
#echo "AddData" >> file1 // 추가 가능
#rm -f file1 // 삭제 가능


+@ 파일 유형

- 허가권 필드의 맨앞에 한개의 문자로 파일의 종류를 명시한다.
- 파일의 종류는 크게 일반 파일과 특수파일로 구분 할 수 있다.

① 일반 파일 : 텍스트 , 실행 , 데이터 파일 등
② 특수 파일 : 블록 , 캐릭터 , 링크 파일 등


Ex)
#ll /etc

- : 일반 파일을 의미
d : 디렉터리를 의미
l : 심볼릭링크 파일을 의미

#ll /dev/sda

b : 블록구조의 특수파일

#ll /dev/console

c : 입출력에 사용되는 특수파일



* 링크

① 심볼릭 링크
- windows의 바로가기 아이콘과 비슷
- 주로 사용자가 많이 사용하는 링크
- 원본을 제거하면 사용을 할 수가 없다.
  (원본자체를 가리키는 포인터 역할을 하기 때문)
- 새로운 inode를 생성

[ 사용방법 ]
#ln -s 실행파일 링크파일


② 하드 링크
- 원본과 동일한 inode를 사용
- 복사와의 차이점은 디스크공간을 차지하지 않는 것
- 원본을 제거해도 사용할 수 있다.

[ 사용방법 ]
#ln 실행파일 링크파일


! 실습
#mkdir -p /Practice/link
#cd /Practice/link
#echo "date" > tester // 테스트파일 생성 (date명령어)
#chmod 777 tester


#cp ./tester ./cp1 // 복사본 1 생성
#cp ./tester ./cp2 // 복사본 2 생성
#cp ./tester ./cp3 // 복사본 3 생성
#ls -il // 원본파일과 복사본이
모두 inode가 다르다.

#ln ./tester /hardlink1 // 하드링크 1 생성
#ln ./tester /hardlink2 // 하드링크 2 생성
#ln ./tester /hardlink3 // 하드링크 3 생성
#ls -il // 원본파일과 링크파일이
모두 같은 inode를 가진다.
  (파일별로 디스크의 용량 사용x)

#ln -s ./tester /softlink1 // 소프트링크 1 생성
#ln -s ./tester /softlink2 // 소프트링크 2 생성
#ln -s ./tester /softlink3 // 소프트링크 3 생성
#ls -il // 본파일과 링크파일이
모두 inode가 다르다.


#./tester // O
#./cp1 // O
#./cp2 // O
#./cp3 // O

#./hardlink1 // O
#./hardlink2 // O
#./hardlink3 // O

#./softlink1 // O
#./softlink2 // O
#./softlink3 // O


#rm -f tester // 원본 파일 제거

#./tester // O
#./cp1 // O
#./cp2 // O
#./cp3 // O

#./hardlink1 // O
#./hardlink2 // O
#./hardlink3 // O

#./softlink1 // X
#./softlink2 // X
#./softlink3 // X

'LINUX(Server)' 카테고리의 다른 글

파일시스템 관리  (4) 2024.04.19
프로세스 관리  (2) 2024.04.18
계정관리  (0) 2024.04.16
부팅 프로세스  (0) 2024.04.15
환경 변수  (0) 2024.04.14