[Linux] 리눅스에서 권한(스페셜 퍼미션)

728x90

sticky bit

쓰기 권한만 있는 aaa 파일의 경우 vi 에디터로 aaa 를 열면 원래의 aaa 데이터를 읽어오지 못하고 그냥 오버라이팅만 가능하게 된다.

그래서 vi 에디터를 사용하기 위해서는 내용을 확인하기 위한 r 권한과 쓰기를 위한 w 권한 둘 다 있어야 된다.

dir 의 읽기는 디렉토리의 데이터 블록 안에 존재하는 file 이나 directory 의 inode 를 읽고 그 메타 데이터를 바탕으로 하드 디스크에서 데이터를 읽는 것이다.

 

chmod 로 하위 디렉토리 전부 변경하기 위해서는 -R 옵션을 붙이면 된다.

 

chmod a-r kbs 를 세팅하고 user 사용자가 ls -l kbs 디렉토리를 읽으려고 하면 권한이 없어서 읽지 못한다.

chmod o+r kbs 로 해주면 user 사용자가 디렉토리를 읽을 수 있다.

chmod 777 /tmp/kbs 같은 경우는 모든 사용자들이 해당 디렉토리에 파일을 생성하고 삭제하고 복사하고 이동하고 수정하고 읽기 위해 사용되는 디렉토리이다.

 

만약 root 사용자가 cp /etc/passwd /tmp/kbs/aaa 복사를 했으면 해당 파일은 root 사용자가 만든 파일이다.

그래서 다른 사용자들은 읽기만 가능하다.

그런데 다른 사용자들이 aaa 파일을 삭제하거나 수정하거나 쓸 수 있다.

그 이유는 /tmp/kbs 의 권한이 777 이어서 디렉토리의 쓰기 권한이 모든 유저 와 그룹 과 other 에게 주어졌다.

이것이 쓰기 권한이 위험성이다. 파일의 삭제 유무는 파일을 감싸안고 있는 디렉토리의 권한이다. 그래서 디렉토리의 쓰기 권한은 불필요하게 주어지면 위험할 수 있다.

 

현재 /tmp 의 권한은 777이다.

/tmp 는 각 프로그램들이 실행되면서 발생하는 임시 파일들이 생성되는 곳이다. 현재 권한이 777 이기 때문에 각각의 많은 사용자가 /tmp 에 파일을 생성하고 삭제할 수 있다. 다른 사용자가 다른 응용 프로그램에 임시 파일을 삭제할 수 있는 상황이다.

/tmp 의 필요성? 응용 프로그램을 동작하게 되면 반복적으로 읽어와야 하는 데이터들, 프로그램이 실행되면 필요한 파일 같은 것들이 저장되는 곳이다.

예를 들어, 실제로 그렇다는 것은 아니고,... 스타크래프트에서 그 마린, 그 객체를 식별하는 정보는 계속해서 유지된다.

그 때 나오는 임시 파일들은 /tmp 에서 가져온다.

옛날에 인터넷 속도가 느리고 컴퓨터 성능이 좋지 않았던 경우 스트리밍을 할 때 TCP 로 패킷을 쌓아서 동영상을 보고 또 쌓아서 동영상을 실행하고 하는 방식.. ⇒ 동영상이 실행됐다가 끊기고 다시 실행되고 반복.. 즉, 버퍼링, 일정 공간에 쌓고 처리하고, 쌓고 처리하고,, 이런 쌓는 공간을 /tmp 에 쌓는다.

 

그래서 /tmp 는 쓰레기통이 아니다!!! 하는 역할이 굉장히 많다!!! /tmp 내부의 파일들을 보통 응용 프로그램이 살아있는 동안만 살아있다.

그래서 리눅스는 stickybit 를 사용한다.

 

tmp 디렉토리의 경우 목적상 other 영역에 write 권한이 있다.

문제는 other 영역의 write 는 생성 뿐 아니라 삭제 복사 이동에도 영향을 준다.

결국 tmp 디렉토리는 자신의 소유가 아닌 파일도 영향을 줄 수 있게 세팅이 되어 있기 때문에 보호가 필요하다.

왜냐하면 자칫 잘못하면 프로그램의 무결성에 손상을 주고 나아가 프로그램의 동작을 손상시키게 된다. → 좀비 프로세스가 발생하는 이유....

 

sticky 비트가 필요한 이유? /tmp 는 누구나 사용할 수 있기 때문에 누구나 삭제할 수 있다. 문제는 자기 소유가 아닌 파일들도 삭제가 된다.(파일의 권한은 상위 디렉토리 권한에 덮어씌어진다.) 그래서 sticky 비트가 필요하다.

그래서 만든 스페셜 퍼미션이 stickybit 이다.

 

stickybit 는 자신의 소유가 아닌 파일을 삭제, 이동, 덮어쓰기 등을 할 때 자신의 소유가 아닌 파일일 경우 실행하지 못하게 하는 보호 기능을 부여한다.

즉, 디렉토리의 권한이 777이고 해당 디렉토리 내부에 root 사용자가 만든 파일이 있으면 원래라면 root 사용자만 쓰기 권한이 있어 수정 삭제를 할 수 있지만 777 권한을 갖는 디렉토리 내부에 있기 때문에 모든 사용자들이 수정 삭제를 할 수 있다. 이것을 막아주는 것이 sticky 비트이다.

 

chmod o+t /tmp/kbs ⇒ sticky 비트 추가

chmod 1777 /tmp/kbs ⇒ sticky 비트 추가

이렇게 sticky 비트가 추가되면 더 이상 수정 삭제가 되지 않는다.

아래 처럼 테스트 해보자..

[설정]
[root@localhost tmp]# ls -ld kbs
drwxrwxrwx. 3 root root 17 2월 17 04:47 kbs
[root@localhost tmp]# cp /etc/passwd /tmp/kbs/aaa

 

[확인]
[user@localhost kbs]$ ls
aaa mbc
[user@localhost kbs]$ rm -f aaa
[user@localhost kbs]$ ls
mbc

 

[설정]
[root@localhost tmp]# cp /etc/passwd /tmp/kbs/aaa
[root@localhost tmp]# chmod o+t /tmp/kbs
[root@localhost tmp]# chmod 1777 /tmp/kbs
[root@localhost tmp]# ls -ld /tmp/kbs
drwxrwxrwt. 3 root root 17 2월 17 05:25 /tmp/kbs

 

[확인]
[user@localhost kbs]$ ls -ld /tmp/kbs
drwxrwxrwt. 3 root root 28 2월 17 05:26 /tmp/kbs
[user@localhost kbs]$ ls
aaa mbc
[user@localhost kbs]$ rm -f aaa
rm: cannot remove 'aaa': 명령을 허용하지 않음

 

파일의 실행 시 스페셜 퍼미션을 최우선적으로 확인한다.

 

setuid 4000 u+s u-s → 내(other 영역)가 파일 실행 시 파일 소유자의 권한을 갖는다.

setgid 2000 g+s g-s → 내(other 영역)가 파일 실행 시 파일 그룹 권한을 갖는다.

sticky bit 1000 o+t o-s → 내(other 영역)가 다른 소유자의 파일 수정 삭제 등을 할 수 없다.

 

setuid 는 other 영역에 실행 권한이 필요해서 4001 이 동작을 실행하기 위한 최소한의 필요 조건이다. 4001 파일 실행 시 EUID 가 파일 소유자의 권한으로 변경된다!

setgid 는 other 영역에 실행 권한이 필요해서 2001 이 동작을 실행하기 위한 최소한의 필요 조건이다. 2001 파일 실행 시 EUID 가 그룹 소유자의 권한으로 변경된다!

sticky bit 는 other 영역에 실행 권한이 필요해서 1001 이 동작을 실행하기 위한 최소한의 필요 조건이다. ⇒ 파일 보호 목적!!!

setuid, setgid 는 많으면 보안 상 굉장히 위험하다!!

setuid, setgid 를 갖는 파일들을 찾는 것이 중요하다!

 

스페셜 퍼미션 찾기는 아래와 같다.

find / -type f -user root -perm -4000 -o -perm -2000 -ls 2> /dev/null

umask

umask 는 사용자가 파일과 디렉토리 생성 시 선언되는 default 권한에 영향을 준다. 즉, 시스템 상에서 사용자가 생성하는 파일과 디렉토리의 기본 권한을 변경해주기 위해 사용한다.

 

find /etc -type f -exec grep -li umask {} ; 2> /dev/null

grep -li umask /etc/* 2> /dev/null

grep -li umask /etc///* 2> /dev/null

 

~rc 라는 이름이 붙어 있으면 Run Controll 이다. 환경 변수들을 설정하는 환경 파일이다.

혹은 .conf 라는 이름이 붙으면 똑같이 환경 파일이다.

 

파일의 default full 권한 은 666 이다.

디렉토리의 deafault full 권한은 777 이다.

파일은 기본 존재 이유가 데이터를 저장하고 읽기 위해서 존재한다. ⇒ 읽고 저장하는 권한은 rw-rw-rw- 이고 넘버릭으로 치면 666이다.

디렉토리가 666 이면 실행 권한이 없는 것이고 이는 cd 디렉토리에 cd 명령을 사용할 수 있는 권한이 없다는 것이고 결국 디렉토리가 가진 기본적인 이동을 할 수 없게 된다.

파일이나 디렉토리를 생성하면 [파일 또는 디렉토리 기본 권한 xor umask] 로 권한이 변경된다.

 

umask 를 통해서 default 생성되는 파일은 절대로 실행권한을 받을 수 없다. 보안 상 안좋기 때문에 원천적으로 막은 것!

666

0022

0644

umask 는 언제 적용될까? umask 가 선언되는 위치를 이해할 필요가 있다. 프로파일(환경설정 파일) 에 선언된다. 보통 프로파일은 로그인 시 적용된다.

/etc/ ← 시스템 환경 설정 디렉토리 (시스템 전체에 영향을 주는 설정을 세팅한다.)

사용자의 홈디렉토리에도 사용자용 환경설정 파일이 존재한다. → $HOME/.bash_profile (사용자에게 영향을 주는 설정을 세팅) 사용자 프로파일이라고 함.

사용자 프로파일이 우선순위가 높다.

umask 사용자 프로파일에 설정 후 로그아웃 한 다음 umask 확인하면 설정 값으로 바뀐 것을 확인할 수 있다.

 

 

 

728x90