Linux 계정의 홈 디렉토리에 들어가서 ls -l 명령어를 쳐보면 다음과 같이 뜰 것이다.
이때 나오는 정보의 구성에 대해서는 디렉토리 권한 관련 포스트 에서 이미 언급하였지만, 다시 정리해보자면, 파일의 종류(-, d, l), 파일의 접근 권한(rwx --- r-x), 하드 링크, 소유자(root, user1), 소유그룹, 파일의 크기, MAC Time, 파일명으로 이뤄져 있다. 이번 포스트에서는 이중 파일의 접근 권한(Permission)과 소유권, 소유 그룹에 대해 설명할 것이다.
1. 소유권(File Ownership)? 권한(Permission)?
1) 파일/디렉토리의 권한을 변경할 수 있는 권리, 소유권
먼저 소유권(File Ownership)이란 해당 파일 또는 디렉토리의 권한을 누가 변경 가능한가를 의미하며, 일반적으로는 파일을 최초 생성한 사용자가 소유자가 되고, 사용자가 기본으로 속해있는 그룹이 소유 그룹이 된다. 어떠한 파일의 소유권을 가진 계정은 파일에 대한 권한(허가권)을 변경할 수 있게 된다. 여기서 말하는 권한(허가권, Permission)은 소유권을 가진 사용자, 소유 그룹, 외의 사용자(other)가 파일에 대해 갖는 읽기(r), 쓰기(w), 실행(x) 권한을 의미한다(디렉토리에 대한 권한은 조금 상이하다. 추후 권한에 대해 소개할 때 다시 설명하겠다).
2) 소유권 관리 명령어
chown
- Change Owner: 소유권 변경 명령어
- <주의> 소유권 변경은 관리자(root) 계정만 가능하다(권한 변경은 소유자와 관리자만 가능).
- 일반 계정에서 소유권을 변경하기 위해서는 su(계정 변경), sudo(관리자의 권한 임시 사용) 명령어를 통해서 변경이 가능하다
chown [소유권을 변경할 사용자명] [디렉토리명/파일명]
chgrp
- Change OwnerGroup: 소유그룹을 변경하는 명령어
chgrp [소유권을 변경할 그룹명] [디렉토리명/파일명]
3) 파일/디렉토리를 이용할 수 있는 권리, 권한(Permission)
다음으로 권한(Permission)은 파일/디렉토리를 사용자 또는 그룹이 어느 정도까지 이용 가능한지 제한하는 것이다. 권한은 왜 필요한 것일까? 파일을 수정할 때, Operation not permitted와 같은 오류 메세지가 매번 뜨는 것을 보면 귀찮기도 하다. 하지만 아무나 파일/디렉토리에 접근하여 무분별하게 수정, 삭제할 수 있다면 데이터의 무결성이 손상되고, 중요한 파일이 변경될 경우 부팅 또는 서비스가 불가한 경우가 발생할 수 있다. 이런 상황을 방지하기 위해 실무에서는 일반적으로 모든 행위가 제재없이 가능한 관리자(root) 계정을 사용하는 것이 아닌, 일반 사용자 계정에서 필요에 따라 최소한의 권한만을 부여하여 사용하게끔 한다. 각설하고 본론으로 돌아와, 일반 권한으로는 그림과 같이 r(read), w(write), x(execute)가 있다. 파일에 대한 권한과 디렉토리에 대한 권한은 기능이 상이한데 정리하면 다음과 같다.
Permission
|
의미
|
파일
|
디렉토리
|
r
|
Read 권한
|
파일 내용 읽기
(cat, more)
|
디렉토리 목록 보기(ls)
|
w
|
Write 권한
|
파일 내용 쓰기/수정
|
디렉토리 안에 새로운 파일 생성/삭제하기(touch, rm …)
디렉토리 안에 새로운 디렉토리 생성/삭제하기(mkdir/rmdir)
|
x
|
eXecute 권한
|
파일 실행
|
디렉토리 안으로 들어가기(cd)
|
-
|
권한없음
|
|
|
권한 부분을 보면 맨 앞의 파일의 종류 부분을 제외하고 총 9칸으로 구성되어 있는데, 아래와 같이 3칸씩 소유자의 권한, 소유 그룹의 권한, 이외 사용자의 권한으로 구분된다.
소유자(Owner)의 권한
|
소유 그룹(Owner Group)의 권한
|
이외의 사용자(Other)의 권한
|
rwx
|
r-x
|
r--
|
4) 권한 관리 명령어
chmod
- Change File Mode: 파일/디렉토리 권한 변경
- 파일/디렉토리의 권한 변경은 해당 파일의 소유권을 가진 사용자와 관리자(root)만 가능
- 권한을 설정하는 방법(mode)
- 상대 모드: 파일에 현재 설정되어 있는 권한을 기준으로 권한을 추가하거나 제거하는 방식
- 절대 모드: 현재 설정되어 있는 권한과 상관없이 설정하고 싶은 권한으로 덮어쓰는 방식
- 상대모드
|
소유권
|
u
|
Owner(user, 소유자)
|
g
|
Owner Group(group, 소유그룹)
|
o
|
Other (나머지 계정)
|
a
|
All (모든 사용자)
|
|
연산자
|
+
|
권한 추가
|
-
|
권한 제거
|
=
|
권한 강제 지정(절대모드와 동일)
|
chmod u+x testfile --> testfile에 대해서 소유자에 x권한을 추가한다.
|
chmod g-w testfile --> testfile에 대해서 소유그룹에서 w권한을 제거한다.
|
chmod o-r testfile --> testfile에 대해서 기타사용자(Other)에서 r권한을 제거한다.
|
chmod a+x testfile --> testfile에 대해서 모든사용자에 x권한을 추가한다.
|
- 절대 모드
소유자 | r | 400 |
w | 200 | |
x | 100 | |
소유 그룹 | r | 40 |
w | 20 | |
x | 10 | |
기타 사용자 | r | 4 |
w | 2 | |
x | 1 |
rwxrwxrwx --> 700(400+200+100) + 70(40+20+10) + 7(4+2+1) = 777
chmod 777 testfile --> rwxrwxrwx testfile
|
rw-rw-r-- --> 600(400+200+000) + 60(40+20+00) +4(4+0+0) = 664
chmod 664 testfile --> rw-r--r-- testfile
|
rwxr-xr-- --> 700(400+200+100) + 50(40+00+10) + 4(4+0+0) = 754
chmod 754 testfile --> rw-r--r-- testfile
|
* umask
: 새로 생성하는 파일/디렉토리에 적용되는 기본 권한을 설정하는 명령어
- umask => 현재 umask 값을 확인
- umask [변경할 umask 값] => umask 기본값 변경
- 파일의 기본 권한과 디렉토리의 기본 권한을 변경하는 방법이 상이함 => 파일과 디렉토리의 기본 권한이 다르기 때문
- 파일의 기본 권한값 = 666 (rw-rw-rw-)
- 디렉토리의 기본 권한값 = 777 (rwxrwxrwx)
- 권한 결정 식: 기본 권한값 - umask값 = 적용되는 권한
- 파일 기본 권한 변경 예시
- umask 006 --> 006 ( ------rw-)
- 파일에 적용되는 기본 퍼미션 666 (rw-rw-rw-)
- 666 - 006 = 660
- --> 파일을 생성하면 적용되는 퍼미션은 660 (rw-rw----)
- 디렉토리 기본 권한 변경 예시
- umask 007 --> 007 ( ------rwx)
- 디렉토리에 적용되는 기본 퍼미션 777 (rwxrwxrwx)
- 777 - 007 = 770 (rwxrwxrwx & ------rwx ==> rwxrwx--- )
- --> 디렉토리를 생성하면 적용되는 퍼미션은 770 (rwxrwx---)
2. 특수 권한 - setuid, setgid, stickybit
1) setuid
일반적으로 프로세스는 현재 로그인된 사용자의 권한으로 실행된다. 문제는 계정의 비밀번호가 들어있는 /etc/shadow의 경우 권한 설정이 다음과 같이 되어있어 root 권한 없이는 변경이 불가능하다는 것이다.
이렇게 되면 비밀번호를 변경하는 passwd 실행파일(명령)을 실행한 사용자의 권한으로는 비밀번호를 변경할 수 없게 된다(즉, 내 비밀번호를 내가 변경할 수 없게 되는 것이다). 이러한 상황을 방지하기 위해 passwd 명령어에는 setuid라는 특수 권한이 설정되어 있다.
setuid는 현재 로그인된 사용자의 권한이 아닌, 실행파일(명령)의 소유자의 권한으로 작동하게 하는 특수 권한이다(passwd의 소유자는 root이므로 root의 권한으로 실행). 따라서 setuid가 부여된 passwd 명령어를 이용해 일반 사용자도 본인의 비밀번호를 변경할 수 있는 것이다. 그렇다면 passwd에서 setuid를 한번 빼보면 어떻게 될까? 다음을 참고하자.
절대 모드와 상대 모드를 이용한 setuid 설정법
- setuid 를 해제하려면 u-s를 사용하면 된다.(상대모드)
예: rwsr-xr-x --> chmod u-s /bin/passwd --> rwxr-xr-x
- setuid 를 설정하려면 u+s를 사용하면 된다. (상대모드)
예: rwxr-xr-x --> chmod u+s /bin/passwd --> rwsr-xr-x
- setuid 를 해제하려면 0000을 사용하면 된다.(절대모드)
예)
rwxr-xr-x --> r(400)+w(200)+s(x(100)+S(0000))+r(40)+x(10)+r(4)+x(1)
--> chmod 0755 /bin/passwd
- setuid 를 설정하려면 4000을 사용하면 된다.(절대모드)
예)
rwsr-xr-x --> r(400)+w(200)+s(x(100)+S(4000))+r(40)+x(10)+r(4)+x(1)
--> chmod 4755 /bin/passwd
*위험하기 때문에 보안 진단 시 항상 setuid는 검사 1순위이다
- setuid가 설정된 실행파일 검색하기
- find / -perm /4000 => setuid 권한이 포함된 파일/디렉토리를 찾아라
- find / -perm 4000 => setuid만 권한이 부여되어 있는 것을 찾아라
2) setgid
파일을 실행한 사용자계정의 권한으로 실행되는것이 아니라 소유그룹의 권한으로 실행된다. setuid와 거의 흡사한 원리로 작동되지만 파일의 소유자가 아니라 소유그룹의 권한으로 실행된다는 차이점이 있다.
절대 모드와 상대 모드를 이용한 setuid 설정법
- chmod g+s [파일명] => setgid 설정(상대)
- chmod g-s [파일명] => setgid 해제(상대)
- chmod 2000 [파일명] => setgid 설정(절대)
3) stickybit(t)
/tmp와 같은 공용 디렉토리에 내가 파일을 만들었는데, 다른 사용자가 내가 만든 파일의 이름을 임의로 변경하거나 삭제해버리면 많은 불편함을 겪게 될 것이다. 이러한 상황을 방지하기 위한 특수 권한이 stickybit이다. stickybit는 파일이 아닌 디렉토리에 설정하는 권한으로 stickybit가 설정된 디렉토리의 파일/하위 디렉토리에 대해서 소유자가 아니면 w권한(디렉토리 내 파일 생성/삭제 권한)이 있어도 삭제가 불가능하다.
절대 모드와 상대 모드를 이용한 stickybit 설정법
- chmod o+t [파일명] => stickybit 설정(상대)
- chmod o-t [파일명] => stickybit 해제(상대)
- chmod 1000 [파일명] => stickybit 설정(절대)
힘들지만 오늘도 해낸 나를 위한 한 마디,
"실패를 사랑할 수 있어야, 다가오는 성공을 더 감사하게 여길 수 있다"
"목표를 향해 가는 길에 겪게 되는 모든 과정과 요소들이 내게 어떻게든 양분이 될 것이라는 확신 하나만큼은 가지고 가자"
'System > Linux' 카테고리의 다른 글
[Linux] DHCP (0) | 2024.09.21 |
---|---|
[Linux] 도대체 프로세스가 뭐야?(프로세스 관리 명령어) (0) | 2024.09.19 |
[Linux] Linux 서버를 통해 PC방에서 Tetris 대결을 할 수 있게 하자! (2) | 2024.09.14 |
[Linux] 하드 링크 & 심볼릭 링크 / 파일 관리 명령어 (0) | 2024.09.12 |
[Linux] Rocky Linux에 Apache Web Service Demon 패키지 설치하기 (0) | 2024.09.12 |