권한 관리
* 소유권 & 허가권
- 시스템에 존재하는 모든 파일은 권한이 부여되어있다.
- 파일을 소유한 권한을 소유권 ( 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