실습2> 스크립트와 바이너리 파일의 실행권한 테스트

1. 스크립트 파일 (rx 가 있을 경우)

2. 스크립트 파일 (x 만 있을 경우)

3. 바이너리 파일 (rx 가  있을 경우)

4. 바이너리 파일 (x 만 있을 경우)


1. 스크립트 파일 (rx 가 있을 경우)

/tmp # cat >> a.sh

#!/bin/sh


i=123

echo $i

/tmp # ls -l a.sh

-rw-r--r-- 1 root root 25 Feb 17 22:47 a.sh

/tmp # chmod a+x a.sh

/tmp # ./a.sh 

123


/tmp $ ./a.sh         <-- a.sh 가 실행된 이유는 rx 권한이 있기 때문에 실행이 되었다.

123


2. 스크립트 파일 (x 만 있을 경우)

/tmp # chmod o-r a.sh -c                   <-- 일반유저의 읽기권한을 제거한다.

mode of `a.sh' changed to 0751 (rwxr-x--x)

/tmp $ ./a.sh        <-- 일반유저는 실행이 안된다. (왜 ?  읽기 권한이 없으므로 ...)

/bin/sh: ./a.sh: Permission denied  


/tmp # chmod ug-r a.sh -c     <-- 관리자의 읽기 권한을 제거해보자.

mode of `a.sh' changed to 0311 (-wx--x--x)

/tmp # ./a.sh   <-- 관리자는 실행이 된다. (왜 ? 관리자는 읽기/쓰기의 제약이 없다.)

123


3. 바이너리 파일 (rx 가  있을 경우)

/tmp # cat >> hello.c

#include <stdio.h>


int main()

{

  puts("Hello C");

  return 0;

}

/tmp # gcc -o hello hello.c 

/tmp # ls -l hello

-rwxr-xr-x 1 root root 4937 Feb 17 23:06 hello

/tmp # ./hello           <-- x 권한이 있으므로 실행이 된다.

Hello C


/tmp $ ./hello           <-- x 권한이 있으므로 실행이 된다.

Hello C


/tmp $ cp hello hello2   <-- r 권한이 있으므로 복사할 수 있다.

/tmp $ ls -l hello2

-rwxr-xr-x 1 linux linux 4937 Feb 17 23:23 hello2

/tmp $ ./hello2

Hello C


4. 바이너리 파일 (x 만 있을 경우)

/tmp # chmod o-r hello   <-- Other 부분의 r 권한을 제거한다.

/tmp # ls -l hello

-rwxr-x--x 1 root root 4937 Feb 17 23:06 hello


/tmp $ ./hello   <-- x 권한이 있으므로 실행이 된다. (바이너리 파일은 r 권한이 없어도 실행이 된다.)

Hello C

/tmp $ cp hello hello3   <-- Other 부분의 r 권한이 없으므로 복사가 안된다.

cp: cannot open `hello' for reading: Permission denied


실습3> 쓰기권한 테스트 (장치파일)


/tmp # tty

/dev/pts/0

/tmp # ls -l /dev/pts/0

crw--w---- 1 root tty 136, 0 Feb 18 00:43 /dev/pts/0


# mesg y

$ wall hello   <-- 일반유저가 root 사용자에게 메세지를 보낸다.


# mesg n       <-- (mesg n) == (chmod g-w /dev/pts/0)

# ls -l /dev/pts/0

crw------- 1 root tty 136, 0 Feb 18 00:43 /dev/pts/0

$ wall hello    <-- 일반 유저가 root 에게 메세지를 보낼 수 없다.


Broadcast message from linux (pts/1) (Tue Feb 18 00:43:24 2014):


hello


# mesg y

# chmod g-s /usr/bin/wall   <-- 일반 유저가 wall 로 메세지를 보낼 수 없다.

$ wall hello                <-- tty 권한이 없으므로 root에게 메세지를 보낼 수 없다.


# chmod o+w /dev/pts/0 

# ls -l /dev/pts/0

crw--w--w- 1 root tty 136, 0 Feb 18 00:48 /dev/pts/0


실습4> 디렉토리 권한


# cd /tmp

/tmp # umask

0022

/tmp # mkdir TEST

/tmp # ls -ld TEST

drwxr-xr-x 2 root root 4096 Feb 18 00:55 TEST

/tmp $ cd TEST              <-- x 권한이 있으므로 TEST 디렉토리에 들어갈 수 있다.

/tmp/TEST $ pwd

/tmp/TEST

/tmp/TEST $ cd ..



/tmp # touch TEST/a.txt TEST/b.txt

/tmp # ls -l TEST

total 8

-rw-r--r-- 1 root root 0 Feb 18 00:59 a.txt

-rw-r--r-- 1 root root 0 Feb 18 00:59 b.txt

/tmp # chmod o-x TEST

/tmp # ls -ld TEST

drwxr-xr-- 2 root root 4096 Feb 18 00:55 TEST

/tmp $ cd TEST              <-- x 권한이 있으므로 TEST 디렉토리에 들어갈 수 없다.

-bash: cd: TEST: Permission denied

tmp $ ls TEST -l

total 0

?--------- ? ? ? ?            ? a.txt

?--------- ? ? ? ?            ? b.txt


/tmp # chmod o=x TEST

/tmp # ls -ld TEST

drwxr-x--x 2 root root 4096 Feb 18 00:59 TEST

/tmp $ cd TEST               <-- 디렉토리에 들어갈 수 있으나 파일 목록은 볼 수 없다.

/tmp/TEST $ ls

ls: .: Permission denied


/tmp # chmod o=rwx TEST

/tmp # ls -ld TEST

drwxr-xrwx 2 root root 4096 Feb 18 00:59 TEST

/tmp/TEST $ vi a.txt       <-- a.txt 파일을 수정할 수 있다.

/tmp/TEST $ ll

total 12

-rw-r--r-- 1 linux linux 8 Feb 18 01:05 a.txt

-rw-r--r-- 1 root  root  0 Feb 18 00:59 b.txt

/tmp/TEST $ rm -f b.txt    <-- other 에 w 권한이 있으므로 b.txt 파일을 삭제할 수 있다.

/tmp/TEST $ ls -l

total 16

-rw-r--r-- 1 linux linux 8 Feb 18 01:05 a.txt

-rw-r--r-- 1 linux linux 8 Feb 18 01:06 c.txt




실습> chmod 를 이용한 파일의 권한변경 


# ls -l /etc/passwd

-rw-r--r-- 1 root root 1826 Nov 18 15:07 /etc/passwd

 ~~~

  u ~~~

  |  g ~~~  ---------

  |  |  o   rwxrwxrwx     + - =  ,

  |  |  |     s  s  t

  +--+--+     S  S  T

     a 



# cp /bin/mv .

# ls -l mv

-rwxr-xr-x 1 root root 78252 Nov 18 16:12 mv

# chmod -c u-r mv

mode of `mv' changed to 0355 (-wxr-xr-x)

# chmod -c o-r mv

mode of `mv' changed to 0351 (-wxr-x--x)

# chmod a-x mv -c

mode of `mv' changed to 0240 (-w-r-----)





rwxrwxrwt    <-- 웹서버 (nobody,apache,daemon)



- 확장된 권한

     sst  <-- 

     ugo

     rwx

0 -> 000

1 -> 001

2 -> 010

3 -> 011

4 -> 100

5 -> 101

6 -> 110

7 -> 111


0 -> 000111

1 -> 001111  <-- t

2 -> 010111  <-- s   set-gid

3 -> 011111  <-- st  set-gid (셋그룹아이디, 셋지아이디)

4 -> 100111  <-- s   set-uid (셋유저아이디, 셋유아이디)

5 -> 101111  <-- st  set-uid

6 -> 110111  <-- ss  set-uid,set-gid

7 -> 111111  <-- sst set-uid,set-gid


# ls -l /bin/cat

-rwxr-xr-x 1 root root 20776 Mar 21  2012 /bin/cat

# ls -l /etc/shadow

-r-------- 1 root root 1222 Nov 18 13:18 /etc/shadow

# su - user1

$ cat /etc/shadow

cat: /etc/shadow: Permission denied

$ exit


# chmod u+s /bin/cat

# ls -l /bin/cat

-rwsr-xr-x 1 root root 20776 Mar 21  2012 /bin/cat

# su - user1

$ cat /etc/shadow   <-- 내용이 출력이 된다. (root 권한이므로 ...)

  :

  :


Sticky-bit 가 있는 디렉토리에 대해서

----------------------------------------------------------

보안상 Sticky-bit 가 있는 디렉토리는 파티션을 분리하고 

실행권한을 막아야한다.

Sticky-bit가 있는 directory  : drwxrwxrwt  root root

user1 : user1.txt

user2 : user2.txt


user1 : rm -f user2.txt  X

user2 : rm -f user1.txt  X


Sticky-bit가 없는  directory : drwxrwxrwx  root root

user1 : user1.txt

user2 : user2.txt


user1 : rm -f user2.txt  O

user2 : rm -f user1.txt  O

----------------------------------------------------------


실습> 시스템에서 Set-UID / Set-GID 파일을 몽땅 검색해보자.


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

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



o 퍼미션 변경 연습 

# rsync -av /bin/cut .

# ls -l cut

   chmod   ln chown  chgrp vi, echo  vi, echo, touch  mv

 ~~~~~~~~~  ~ ~~~~   ~~~~  ~~~~~    ~~~~~~~~~~~~     ~~~

-rwxr-xr-x  1 root   root  31880    Jul 22  2011     cut

 ~~~

  u ~~~

     g ~~~

        o


o chmod 에서 8진수 모드와 권한의 관계


8진수에서 가질 수 있는 값 : 0 ~ 7




# chmod u-wx,g-rw,o-r cut -c

rwxrwxrwx  -> r----x-wx  변경   chmod 413 

~~~           ~~~

 7  7  7      4  ~~~

                  1 ~~~

                     3


-wx-wx-wx -> --x------

1. chmod a=,u+x 

2. chmod go=,u-w 

3. chmod og=,u-w 

4. chmod go-wx,u-w

...


5. chmod 100


Symbolic mode 에서 가질 수 있는 문자들 : ugoa=+-,rwxst


---------  -> rwxr-x--x   chmod  751

chmod 000 

---------  -> --x--x---   chmod  110


LAB> 실행 디렉토리의 권한들을 살펴보세요!!! 

/bin , /usr/bin, /sbin, /usr/sbin


설치시 : 755 -> 보안상 권한을 변경하는 것이 좋다.


# ls -l /usr/sbin | more   <-- more 를 이용해서 살펴보기

# ls -l /sbin | less       <-- less 를 이용해서 살펴보기



확장된 권한들  (Set-UID (4), Set-GID (2), StickyBit (1) )

Set-UID : rwsr-xr-x

          ~~~

          root 

             ~~~

             root

                                linux 실행

Set-GID : 

---------  -> rwsr-xr-x   4755 -> rws--s--t  7711 -> rws-----x 4701

~~~

 u ~~~

    g ~~~

       o


# ls -ld /tmp

# ls -l /usr/bin/passwd

# ls -l /usr/bin/wall

# ls -l /bin/ping

# ls -ld /dev/shm


o Set-UID 이해하기

Set-UID 권한을 가지고 있는 파일을 일반유저가 실행하면 자신의(일반유저) 

권한으로 프로그램을 실행하는 것이 아니고 소유자의 권한으로 프로그램을 

실행하게 된다.

# ls -l /etc/shadow

-r-------- 1 root root 1218 May 30 10:32 /etc/shadow

# ls -l /usr/bin/passwd  <-- 일반유저가 실행하면 관리자권한이 되는 것이다.

-rwsr-xr-x 1 root root 20300 Aug 11  2010 /usr/bin/passwd

# useradd linux

# echo "1234" | passwd --stdin linux

Changing password for user linux.

passwd: all authentication tokens updated successfully.

# grep linux /etc/shadow

linux:$1$3/Z1I5Jz$irsRWkoqK2pSqRY9cmHjQ1:15490:0:99999:7:::

# su - linux

$ passwd

Changing password for user linux.

Changing password for linux

(current) UNIX password:

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

$ exit

# grep linux /etc/shadow <-- shadow 파일을 변경할 수 있는 것은 root 만이 가능

linux:$1$IT9znGxh$fgvJlTJbKONZCd6/lc1yZ0:15490:0:99999:7:::  <-- 변경되었음.



파일 / 디렉토리 

# ls -ld /tmp

#

#

drwxrwxrwx  -> a.txt(A) b.txt(B)  a.txt,b.txt 삭제(c) 삭제 O


drwxrwxrwt  -> a.txt(A) b.txt(B)  a.txt,b.txt 삭제(c) 삭제 X

         ~ -> x + t




   

# cd ; ls -ld

drwxr-x----   .... root

# ls -l /home

drwx-------   ... a

drwx-------   ... b

drwx-------   ... c

drwx-------   ... d


리눅스에서 실행할 수 있는 파일 

1. 컴파일해서 나온 바이너리 파일 (/bin/ls, mv ...)

2. 텍스트 형태의 쉘스크립트파일  (/etc/init.d/crond)


o 디렉토리의 x 권한 테스트


# mkdir -m 700 /tmp/TESTDIR

# ls -ld /tmp/TESTDIR

drwx------ 2 root root 4096 May 30 13:30 /tmp/TESTDIR


$ cd /tmp/TESTDIR    <-- x 권한이 없기 때문에 

-bash: cd: TESTDIR: Permission denied


o 실행파일 x 권한 테스트 

# ls -l /bin/cat

-rwxr-xr-x 1 root root 20776 Jul 22  2011 /bin/cat

# ls -ln /bin/cat

-rwxr-xr-x 1 0 0 20776 Jul 22  2011 /bin/cat


$ cat /etc/profile

# /etc/profile

# System wide environment and startup programs, for login setup

# Functions and aliases go in /etc/bashrc

...


# chmod -c o= /bin/cat

mode of `/bin/cat' changed to 0750 (rwxr-x---)

# ls -l /etc/profile

-rw-r--r-- 1 root root 1344 Feb 23 05:31 /etc/profile


$ cat /etc/profile   <-- cat x 권한이 없으므로 파일의 내용을 볼 수 없다.

-bash: /bin/cat: Permission denied



o 읽기권한(r) 테스트  


1. 일반 파일 테스트 

# chmod o+rx /bin/cat

# ls -l /etc/shadow

-r--------


o cat 은 실행권한이 있지만 /etc/shadow 파일에 읽기권한이 

없으므로 파일의 내용을 볼 수 없다.

$ cat /etc/shadow   

  ~~ ~~~~~~~

   1        2

1번의 권한을 살펴보고 권한이 있으면 2번의 권한을 살펴본다.


2. 디렉토리 테스트

$ cd /bin

$ ls      <-- /bin 디렉토리에 파일 목록이 출력.


# ls -ld /bin  <-- drwxr-xr-x -> drwxr-x--x (r권한 제거)

# chmod o-r /bin


$ cd /bin

$ ls      <-- r 권한을 제거했으므로 /bin 디렉토리에 파일 목록이 출력이 안됨.



o 쓰기권한(w) 테스트

1. 일반 파일을 테스트 


$ ls -l /etc/shadow  <-- Other 부분의 쓰기권한을 살펴볼 것

$ echo "1234" >> /etc/shadow  <-- 쓰기권한이 없으므로 안된다.


2. 디렉토리 테스트

$ ls -ld /home  <-- Other 부분의 쓰기권한을 살펴볼 것

drwxr-xr-x

 ~~~~

root.root

    

$ mkdir /home/Test <-- 쓰기권한이 없으므로 안된다.

$ cd  <-- 자신의 홈디렉토리로 이동 

$ mkdir Test  <-- 쓰기 권한이 있으므로 만들어진다.

drwx------

 ~~~

 자신의 권한

$ pwd

$ ls -ld 

$ ls -ld /etc  <-- Other 부분의 Write 권한을 확인 

drwxr-xr-x

 ~~~~~~

root.root 

$ rm -f /etc/passwd <-- 삭제가 안됨.


일반 유저가 저장(삭제)할 수 있는 디렉토리는 

리눅스가 설치되면 기본적으로 아래 디렉토리이다.

1. 자신의 디렉토리 

2. /tmp 디렉토리

3. /dev/shm  --> 보안상 Other 권한의 쓰기를 제거

4. /var/tmp  --> 보안상 Other 권한의 쓰기를 제거


o 제일 많이 사용하는 권한 

1. 파일 

-rw-r--r--

-rw-------

-rw-r----- 

-rw----r-- 

-r--------    :w <-- x    :w! <-- O


2. 디렉토리 

drwxr-xr-x    # ls -l /

drwx------    # ls -l /home   , # ls -ld /root

drwx-----x    drwxr-xr-x 차이점?

drwx--x---

drwx--x--x


# ls -ld /etc

# chmod o-r /etc

# ls -ld /etc


$ cd /etc

$ ls   <-- 읽기 권한이 없다.

$ ls -l passwd  <-- 파일의 속성을 확인할 수 있다.

$ cat passwd <-- 파일을 볼 수 있다.



실습> /etc/shadow 파일을 set-uid 를 설정해서 내용을 보자.


# ls -l /etc/shadow

-r-------- 1 root root 1127 Mar 31 15:41 /etc/shadow

# ls -l /bin/cat

-rwxr-xr-x 1 root root 23260 Jul 22  2011 /bin/cat


$ cat /etc/shadow

cat: /etc/shadow: Permission denied



# chmod u+s /bin/cat -c

mode of `/bin/cat' changed to 4755 (rwsr-xr-x)

$ cat /etc/shadow

root:$1$gmWxQmiB$CvtOiLu.oflCfdDQQLXdA1:15955:0:99999:7:::

bin:*:15955:0:99999:7:::

daemon:*:15955:0:99999:7

  : 

  :



LAB> umask 연습

[root@localhost ~]# umask

0333

[root@localhost ~]# touch 123.txt

[root@localhost ~]# ls -l 123.txt 

-r--r--r-- 1 root root 0 Mar 31 17:48 123.txt

[root@localhost ~]# umask 222

[root@localhost ~]# touch 1234.txt

[root@localhost ~]# ls -l 1234.txt

-r--r--r-- 1 root root 0 Mar 31 17:48 1234.txt

[root@localhost ~]# umask 022

[root@localhost ~]# touch bbb.txt

[root@localhost ~]# ls -l bbb.txt 

-rw-r--r-- 1 root root 0 Mar 31 17:49 bbb.txt