#############################################

## 주제 : 퍼미션(Permission)               ##

##                                         ##

## Written by K.S.W      2015071601        ##

## boaniyagi@naver.com                     ##

## date : 2015.7.16                        ##

#############################################


여러사람이 사용하는 멀티유저 운영체제인 리눅스보안상의 이유로 각 파일마다 접근권한이 설정되어 있다.

이를 퍼미션이라고 한다.

예를들어 다른 사람이 자신의 파일을 읽을 수 있도록 허용할 수도 있고 거부할 수도 있다.

또한 자신의 파일에 다른 내용을 기록하게 허용할 수도 있고 거부할 수도 있다.

이들 권한들을 이용하여 각 파일과 디렉토리들을 다른 사람들과 공유하거나 아니면 개인적인 목적으로 사용할 수 있다. 

리눅스에서 사용자는 기본적으로 최소 하나의 그룹에 포함되어 있고 하나 이상의 그룹에 속할 수도 있다.

         

권한을 연습할 수 있는 사이트

http://permissions-calculator.org


파일(디렉토리) 생성시 디폴트로 설정되는 권한

 - 파일 권한은 umask 에 기본 설정된 값에 따라서 권한이 만들어진다.

 - 명령어 : umask (내부명령어)

 - default umask setting : /etc/bashrc


퍼미션 변경 명령어 

 - 명령어 : chmod (외부명령어)

 - 디렉토리 위치 : /bin

 - 패키지 : coreutils 


퍼미션 변경 방법 

 - 문자를 이용해서 변경한다.

 - 숫자를 이용해서 변경한다.

 - symbolic mode(심볼릭 모드)를 이용해서 변경(문자를 이용) 한다.

 - octal mode(8진수 모드)를 이용해서 변경(숫자를 이용) 한다.



퍼미션의 3가지 구분

 1. 소유자 (owner, user)

 2. 그룹 (group)

 3. 다른사용자 (other)


리눅스의 퍼미션

 - 퍼미션은 크게 아래처럼 읽기권한, 쓰기권한, 실행권한, 특수권한으로 되어있다. 


3개씩 끊어서 읽는다. 

각 문자들은 rwx 의 순서로 온다. (e.g. wxr(x), rxw(x), xrw(x), only rwx(o))

특수 권한은 x 자리에만 올 수 있다.


     s    s    t <-- 특수 권한

  rwx rwx rwx <-- 일반 권한

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

  ~~~   ~~~

  |  ~~~ |

  |  |  other

  |  |  

  |  group

  |

  user (owner)



r(Read)    : 읽기 권한

w(Write)   : 쓰기 권한 

x(eXecute) : 실행 권한 

s(Set-uid) user  부분 : 특수 권한 (셋유저아이디 or 셋유아이디)

s(Set-gid) group 부분 : 특수 권한 (셋그룹아이디 or 셋지아이디)

t(stickybiT) other 부분 : 특수 권한 (스티키비트)


+---+-----------+-----------+-----------+

|   |  Set-UID  |  Set-GID  |Sticky-Bit |

+   +---+---+---+---+---+---+---+---+---+

|   |     s     |     s     |     t     |  <-- 특수 권한

+   +---+---+---+---+---+---+---+---+---+

|   | r | w | s | r | w | s | r | w | t |

+   +---+---+---+---+---+---+---+---+---+

|   |    user   |   group   |   other   |

+---+---+---+---+---+---+---+---+---+---+

| - | r | w | x | r | w | x | r | w | x |  <-- 일반 권한

+---+---+---+---+---+---+---+---+---+---+




octal mode를 이용한 일반 권한의 퍼미션 값

+---+---+---+---+

|   | 4 | 2 | 1 |

+---+---+---+---+

| - | r | w | x |

+---+---+---+---+

| 0 | 0 | 0 | 0 |

+---+---+---+---+

| 1 | 0 | 0 | 1 |

+---+---+---+---+

| 2 | 0 | 1 | 0 |

+---+---+---+---+

| 3 | 0 | 1 | 1 |

+---+---+---+---+

| 4 | 1 | 0 | 0 |

+---+---+---+---+

| 5 | 1 | 0 | 1 |

+---+---+---+---+

| 6 | 1 | 1 | 0 |

+---+---+---+---+

| 7 | 1 | 1 | 1 |

+---+---+---+---+


octal mode를 이용한 특수 권한의 퍼미션 값

    |- 특수권한-|- user    -|- group   -|- other   -|

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   | s | s | t | r | w | x | r | w | x | r | w | x |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- rwxrwxrwx

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | x | r | w | x |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- t   sticky-bit 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | x | r | w | t |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 2 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- s   set-gid 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | s | r | w | x |  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 3 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- st  set-gid + sticky-bit  

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | x | r | w | s | r | w | t | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 4 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- s   set-uid   

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | x | r | w | x | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 5 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- st  set-uid + sticky-bit

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | x | r | w | t | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 6 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- ss  set-uid + set-gid

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | s | r | w | x | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

| 7 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <-- sst set-uid + set-gid + sticky-bit

+---+---+---+---+---+---+---+---+---+---+---+---+---+

|   |   |   |   | r | w | s | r | w | s | r | w | t | 

+---+---+---+---+---+---+---+---+---+---+---+---+---+

 


파일과 디렉토리에 대한 퍼미션의 의미

- 디렉토리가 가지고 있는 내용 : 파일명, 해당 파일에 대한 아이노드번호

--------------------------------------------+------------------------------------------------

                   파일                           |          디렉토리 (x 권한을 같이 사용)

--------------------------------------------+------------------------------------------------

r  파일의 내용을 볼 수 있는 권한          |  디렉토리의 파일 목록을 볼 수 있는 권한

--------------------------------------------+------------------------------------------------

w  파일의 내용을 수정할 수 있는 권한   |  디렉토리에서 파일을 생성/삭제할 수 있는 권한

--------------------------------------------+------------------------------------------------

x  파일을 실행할 수 있는 권한             |  디렉토리에 접근할 수 있는 권한  

                                                    |  (cd 로 이동, cat /etc/passwd )

--------------------------------------------+------------------------------------------------

setUID  실행중에 소유자의 권한으로 실행  |                   x 

--------------------------------------------+------------------------------------------------

setGID  실행중에 그룹의 권한으로 실행 |   파일을 생성시 그룹의 권한으로 생성

--------------------------------------------+------------------------------------------------

sticky-bit               x                       |   모두 생성하지만 지울땐 소유자가 만든 파일만 삭제 

                                                    |   (공용 디렉토리에서 사용한다)

--------------------------------------------+------------------------------------------------


x 권한이 있는 파일의 종류로는 실행파일,디렉토리 두 가지 파일이다.


실행파일의 두 가지 종류

- 바이너리 파일(컴파일과정을 거친 파일)  

일반적으로 바이너리 파일은 root or  일반유저는 x 권한만 있으면 실행된다. 

- 쉘스크립트 파일 (일반 텍스트 문서지만 실행 형식을 갖춘 파일)     

root : x 권한만 있어도 된다. 일반유저 : rx 모두 있어야 한다.

 


o 파일의 권한을 변경하는 방법


심볼릭 모드를 이용해서 변경하는 방법의 예

- 문자를 이용해서 퍼미션을 변경한다.

- 허용문자 : augorwxst,=-+


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

ex) chmod 를 이용한 권한 연습

!!! -c 옵션 : 파일의 권한이 변경되면 권한을 출력한다.

!!! -v 옵션 : 파일의 권한이 변경되지 않아도  권한을 출력한다.


# touch a.txt ; chmod -v a-rwx a.txt

# ls -l a.txt

---------- 1 root root 0 Oct 31 17:28 a.txt


# chmod -c u+rwx,go+rx a.txt  -rwxr-xr-x

# chmod -c u+w,a+rx a.txt     -rwxr-xr-x

# chmod -c a+rwx,go-w a.txt   -rwxr-xr-x

# chmod -c a=rwx,og-w a.txt   -rwxr-xr-x

-rwxr-xr-x   


# chmod -c go= a.txt    -rwx------

# chmod -c go-rx a.txt  -rwx------

# chmod go-r,go-x a.txt

# chmod g-r,o-r,g-x,o-x a.txt

-rwx------   


# chmod -c u-x a.txt

-rw-------   


# chmod -c go+r a.txt

-rw-r--r--   


# mkdir testdir ; ls -ld testdir

drwxr-xr-x 2 root root 4096 Apr 17 17:56 testdir


# chmod -c a= testdir 

mode of `testdir' changed to 0000 (---------)


# chmod -c u+rw,go+x testdir 

drw---x--x 2 root root 4096 Apr 17 17:56 testdir


# chmod -c u=x,go-x testdir 

d--x------ 2 root root 4096 Apr 17 17:56 testdir


d--------- 2 root root 4096 Apr 17 17:56 testdir



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


8진수(octal) 모드를 이용해서 변경하는 방법의 예

- 숫자를 이용해서 퍼미션을 변경한다.

- 허용숫자 : 0 ~ 7

  421 421

0 --- 000 

1 --x 001

2 -w- 010

3 -wx 011

4 r-- 100

5 r-x 101

6 rw- 110

7 rwx 111


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

ex)

chmod 000 a.txt

---------- 1 root root 0 Oct 31 17:28 a.txt


-rwxr-xr-x   chmod -c 755 a.txt

-rwx------   chmod -c 700 a.txt

-rw-------   chmod -c 600 a.txt 

-rw-r--r--   chmod -c 644 a.txt

---x--x--x   chmod -c 111 a.txt


--wx-wx---   chmod -c 330 a.txt

--wx-w---x   chmod -c 321 a.txt

---------x   chmod -c 001 a.txt

-r-xr-x--x   chmod -c 551 a.txt

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


8진수(octal) 모드를 이용해서 변경하는 방법의 예2

- 숫자를 이용해서 퍼미션을 변경한다.

- 허용숫자 : 0 ~ 7

  421     <-- 특수권한

  421 421

0 --- 000 

1 --x 001    

2 -w- 010

3 -wx 011

4 r-- 100

5 r-x 101

6 rw- 110

7 rwx 111



- 특수권한이 들어간 예

- 의미가 없는 권한들..

-rwsrwsrwt   chmod -c 7777 a.txt

-rwxrwsrwT   chmod -c 3776 a.txt

-r-Sr-s--t   chmod -c 7451 a.txt

---s-wS--T   chmod -c 7120 a.txt

-r-Sr-s--t   chmod -c 7451 a.txt

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



많이 사용되는 실행파일 권한들

- 특수권한이 없는 경우

-rwxr-xr-x   

-rwxr-x--x   <-- 보안상 r 권한은 제거

-rwxr-x---

-rwx------

-rwx--x---


- 특수권한이 있는 경우

find / \( -perm -4000 -o -perm -2000 \) -ls 2> /dev/null


많이 사용되는 디렉토리 권한들

drwxr-xr-x   

drwxr-x--x   <-- 보안상 r 권한은 제거

drwxr-x---

drwx--x--x

drwx--x---

drwx------


많이 사용되는 파일들의 권한들 

 - 실행파일과 디렉토리가 아닌 모든 파일들에 해당

 -rw-r--r--   

 -rw-r-----

 -rw-------


*** 공통점 : 소유자는 user 부분의 권한을 모두 가진다는 것이다. ***


===========================================================================================================

LAB> Linux Box 에 기본적으로 설정된 퍼미션을 알아보자


-- LAB 순서 --

 1. /etc/shadow 파일 내용 보기

  - 관리자로 보기

  - 일반유저로 보기

 2. /root 디렉토리로 이동하기

  - 관리자로 이동

  - 일반유저로 이동


-- LAB 순서 --

 1. /etc/shadow 파일 내용 보기

  - /etc/shadow 파일 내용을 관리자(root) 와 일반유저(linux)가 명령어 cat head tail 로 살펴보자.


  - 사용자를 확인한다.

  - uid (UID, 유저아이디) : 시스템에서 OS가 사용자에게 부여한 번호 

# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t:s0-s0:c0.c1023


- 권한을 확인한다.

# 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

# ls -l /usr/bin/head 

-rwxr-xr-x 1 root root 31788 Jul 22  2011 /usr/bin/head

# ls -l /usr/bin/tail

-rwxr-xr-x 1 root root 42956 Jul 22  2011 /usr/bin/tail


- 파일의 내용을 확인한다.

# cat /etc/shadow

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

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

daemon:*:15955:0:99999:7:::

  :

  :


# head -2 /etc/shadow

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

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

# tail -2 /etc/shadow

test3:!!:16268:0:99999:7:::

linux:!!:16263:0:99999:7:::


- 일반유저 linux 에서 파일의 내용을 확인한다.

# useradd linux

# su - linux


- 사용자를 확인한다.

$ id

uid=503(linux) gid=503(linux) groups=503(linux) context=root:system_r:unconfined_t:s0-s0:c0.c1023

$ cat /etc/shadow

cat: /etc/shadow: Permission denied

$ head /etc/shadow

head: cannot open `/etc/shadow' for reading: Permission denied

$ tail /etc/shadow

tail: cannot open `/etc/shadow' for reading: Permission denied

$ more  /etc/shadow

/etc/shadow: Permission denied

$ exit


2. /root 디렉토리로 이동하기

- /root 디렉토리로 관리자(root) 와 일반유저(linux)가 명령어 cd 로 이동해보자.


- 권한을 확인한다.

# ls -ld /root

drwxr-x--- 8 root root 4096 Jul 13 03:07 /root


# ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 23 16:47 /tmp


- 디렉토리로 이동한다.

# cd /tmp     <-- 이동 O

# cd /root    <-- 이동 O

# su - linux


- 사용자를 확인한다.

$ id

uid=503(linux) gid=503(linux) groups=503(linux) context=root:system_r:unconfined_t:s0-s0:c0.c1023


- 디렉토리로 이동한다.

$ ls -ld /root

drwxr-x--- 8 root root 4096 Jul 13 02:56 /root


- 일반유저의 권한이 x(이동) 권한이 있으므로 /tmp 디렉토리에 들어갈 수 있다.

$ cd /tmp   

$ pwd


- 일반유저의 권한이 x(이동) 권한이 없으므로 /root 디렉토리에 들어갈 수 없다.

$ cd /root

-bash: cd: /root: Permission denied



- 일반 유저는 /etc/shadow(-r-------- 1 root root) 파일을 볼 수 없다.

$ cat /etc/shadow

cat: /etc/shadow: Permission denied


$ ls -ld /

drwxr-xr-x 23 root root 4096 Oct 20 10:16 /

$ ls -ld /bin

drwxr-xr-x 2 root root 4096 Oct 17 12:17 /bin

$ ls -l /bin/cat

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

$ ls -ld /etc

drwxr-xr-x 82 root root 4096 Oct 23 14:37 /etc

$ ls -l /etc/shadow

-r-------- 1 root root 970 Oct 20 11:39 /etc/shadow

$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1595 Oct 20 11:39 /etc/passwd

$ cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

  :

  :

$ cat /etc/shadow

cat: /etc/shadow: Permission denied


$ exit


- /bin 디렉토리의 권한을 변경해보고 cat /etc/shadow 파일을 실행해보자.

- drwxr-xr-x -> drwxr-x---

# chmod o= /bin or chmod 750 /bin

drwxr-x--- 2 root root 4096 Apr 17 16:05 /bin


# su - linux

su: /bin/bash: Permission denied


# chmod 755 /bin or chmod o+rx or chmod o=rx

drwxr-xr-x 2 root root 4096 Apr 17 16:05 /bin


- /bin/cat 파일의 other 부분의 실행부분의 권한을 빼면 

# chmod 750 /bin/cat or chmod o= /bin/cat or chmod o-rx /bin/cat

-rwxr-x--- 1 root root 23260 Mar 21  2012 /bin/cat

# su - linux


- cat 명령어의 실행권한이 없으므로 Permission denied 가 된다.

$ cat /etc/passwd 

-bash: /bin/cat: Permission denied


$ cat /etc/shadow

-bash: /bin/cat: Permission denied




- /usr/local/bin 디렉토리는 일반유저가 들어갈 수 있는 권한이 있다.

$ cd /usr/local/bin

$ pwd

/usr/local/bin


$ ls -ld /usr

drwxr-xr-x 15 root root 4096 Oct 17 10:51 /usr

         ~

$ ls -ld /usr/local

drwxr-xr-x 11 root root 4096 Oct 17 10:50 /usr/local

         ~

$ ls -ld /usr/local/bin

drwxr-xr-x 2 root root 4096 May 11  2011 /usr/local/bin

         ~



- /var/spool/cron 디렉토리는 일반유저가 들어갈 수 있는 권한이 없다.

$ cd /var/spool/cron

-bash: cd: /var/spool/cron/: Permission denied


$ ls -ld /var

drwxr-xr-x 22 root root 4096 Oct 17 11:37 /var

         ~

$ ls -ld /var/spool/

drwxr-xr-x 10 root root 4096 Oct 17 10:52 /var/spool

         ~

$ ls -ld /var/spool/cron

drwx------ 2 root root 4096 Feb 23  2012 /var/spool/cron

         ~


- /tmp 디렉토리의 파일 목록을 확인할 수 있다.

$ ls /tmp

lost+found  mc-root  TEST


$ ls -l /bin/ls

-rwxr-xr-x 1 root root 95116 Jul 22  2011 /bin/ls

         ~

$ ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 23 19:11 /tmp

         ~


$ df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda1              2847720    258048   2442680  10% /

/dev/sda3               388693     10307    358305   3% /home

/dev/sda6               956980    136728    770856  16% /var

/dev/sda7               482214     10552    446763   3% /tmp

/dev/sda5              1898468   1274028    526448  71% /usr

/dev/sda2               101105     11596     84288  13% /boot

tmpfs                   127492         0    127492   0% /dev/shm


$ ls -l /bin/df

-rwxr-xr-x 1 root root 44744 Jul 22  2011 /bin/df



- 디렉토리의 r 권한 테스트

# ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 23 19:11 /tmp

       ~

$ ls /tmp

lost+found  mc-root  TEST


# chmod o-r /tmp 

# ls -ld /tmp

drwxrwx-wt 7 root root 1024 Oct 23 19:11 /tmp

       ~

$ ls /tmp

ls: /tmp: Permission denied


- 쓰기 권한 연습


$ cd

$ pwd

/home/linux

$ ls -ld 

drwx------ 3 linux linux 1024 Oct 23 19:31 .

  ~

$ touch a.txt

$ ls -l a.txt 

-rw-rw-r-- 1 linux linux 0 Oct 23 19:31 a.txt

$ echo 1234 > a.txt

$ ls -l a.txt 

-rw-rw-r-- 1 linux linux 5 Oct 23 19:31 a.txt

$ cat a.txt 

1234


- /etc/passwd 파일을 수정할 수 없다.

$ echo 1234 >> /etc/passwd

-bash: /etc/passwd: Permission denied

$ ls -ld /etc

drwxr-xr-x 82 root root 4096 Oct 23 19:11 /etc

        ~

$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1595 Oct 20 11:39 /etc/passwd

        ~




===========================================================================================================



===========================================================================================================

LAB> 웹서버 문서의 권한을 테스트해보자.


o 웹서버의 기본 문서를 읽기권한이 있으므로 클라이언트에서 볼 수 있다.

- yum 을 이용해서 httpd (웹서버 패키지)를 설치한다.

# yum -y install httpd


- 웹서버를 실행한다.

# /etc/init.d/httpd start


- httpd 프로세스의 사용자를 확인한다.

# ps aux | grep httpd

root     14556  0.0  1.1  10116  2936 ?        Ss   20:31   0:00 /usr/sbin/httpd -k start

apache   14557  0.0  0.8  10116  2060 ?        S    20:31   0:00 /usr/sbin/httpd -k start

apache   14558  0.0  0.8  10116  2060 ?        S    20:31   0:00 /usr/sbin/httpd -k start

  :

  :



- 웹서버의 기본 디렉토리로 이동한다.

# cd /var/www/html


- default 권한을 살펴본다.

# umask

0022


- 웹문서를 생성한다.

# vi index.html

-- index.html --

Welcome to My Web Server!!!

-- index.html --


# ls -l index.html

-rw-r--r-- 1 root root 28 Apr 17 20:28 index.html

      ~~


# ifconfig eth1

eth1      Link encap:Ethernet  HWaddr 08:00:27:AD:8E:F4  

          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0


- 방화벽룰을 해제한다.

# iptables -F


브라우저로 접속 : httpd://192.168.56.101


- 일반 유저가 파일의 내용을 수정!!!

# su - linux

$ id

uid=500(linux) gid=500(linux) groups=500(linux)

$ cd /var/www/html


$ ls -nd

drwxr-xr-x 2 0 0 4096 Apr 17 20:28 .

             ~ ~

$ ls -ld 

drwxr-xr-x 2 root root 4096 Oct 23 19:46 .

        ~ <-- root 사용자 아닌 모든 유저는 파일을 생성할 수 없다.

$ ls -l

total 8

-rw-r--r-- 1 root root 19 Oct 23 19:46 index.html

        ~ <-- root 사용자 아닌 모든 유저는 파일을 수정할 수 없다.


$ cat index.html     <-- 파일의 내용을 읽을 수 있다.

Hello My Server!!!

$ vi index.html      <-- 파일의 내용을 수정할 수 없다.

         

$ touch index2.html  <-- 파일을 생성할 수 없다.

touch: cannot touch `index2.html': Permission denied

$ exit


# cd /var/www/html

# ls -l index.html 

-rw-r--r-- 1 root root 19 Oct 23 19:46 index.html

# chmod o+w index.html 

# ls -l

total 8

-rw-r--rw- 1 root root 19 Oct 23 19:46 index.html

        ~

# su - linux

$ cd /var/www/html

$ vi index.html       <-- 파일의 내용을 수정할 수 있다.


- 디렉토리가 쓰기 권한이 있고 파일이 쓰기 권한이 없을 때도 변경할 수 있는가 ?

# chmod o+w .

# ls -ld 

drwxr-xrwx 2 root root 4096 Oct 23 19:46 .


# chmod 644 index.html 

# ls -l

total 8

-rw-r--r-- 1 root root 22 Oct 23 19:56 index.html


- 저장시 :w 하면 저장이 안되고 :w! 해야 저장할 수 있다. 

  파일이 w 권한이 없어도 저장되는 이유는 디렉토리의 권한이 파일보다 

  우선순위를 먼저 가지기 때문이다.

$ vi index.html

-- index.html --

Hello My Server!!! ^^*;;

-- index.html --


$ ls -l index.html 

-rw-r--r-- 1 linux linux 25 Oct 23 20:10 index.html


브라우저로 접속시 수정된 내용을 출력된다.

httpd://192.168.56.101


Hello My Server!!! ^^*;;

===========================================================================================================


===========================================================================================================

LAB> chmod 를 이용한 파일의 권한을 변경해보자.


-- LAB 순서 --

1. symbolic mode 로 퍼미션 변경

2. octal mode 로 퍼미션 변경

-- LAB 순서 --


1. symbolic mode 로 퍼미션 변경

- /bin/mv 명령어를 자신의 디렉토리에 복사한 후 symbolic mode 로 퍼미션을 변경해보자.

# 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-----)



2. octal mode 로 퍼미션 변경

- 복사된 /bin/mv 명령어의 퍼미션을 octal mode 로 변경해보자.

# cp /bin/mv .

# chmod -c 000 mv 

mode of `mv' changed to 0000 (---------)

# chmod -c 700 mv

mode of `mv' changed to 0700 (rwx------)

# chmod -c 711 mv

mode of `mv' changed to 0711 (rwx--x--x)

# chmod -v 711 mv

mode of `mv' retained as 0711 (rwx--x--x)

~ # chmod -c 711 mv

# chmod -c 710 mv

mode of `mv' changed to 0710 (rwx--x---)

# chmod 1777 mv

# chmod -v 1777 mv

mode of `mv' retained as 1777 (rwxrwxrwt)

# chmod -c 2755 mv

mode of `mv' changed to 2755 (rwxr-sr-x)

~ # chmod -c 4755 mv

mode of `mv' changed to 4755 (rwsr-xr-x)


===========================================================================================================


==================================================================

LAB> /tmp 디렉토리 테스트 

!!! 시스템에 sticky bit 권한이 있는 경우의 디렉토리는 취약하다.  !!!

!!! sticky bit 권한이 있어도 이것을 보안상 조절하는 방법이 존재한다 !!!



디렉토리에 sticky bit 권한이 없을 경우(rwxrwxrwx)

# mkdir -m 777 /home/tmp

# ls -ld /home/tmp

drwxrwxrwx 2  root  root   ...


- linux 사용자가 /home/tmp 디렉토리에 쓰기 권한이 있으므로 cp 와 touch

  명령어로 파일을 생성할 수 있다.

# su - linux

$ ls -ld /home/tmp


$ cp /bin/mv /home/tmp     <-- O

$ touch /home/tmp/a.txt    <-- O

$ exit


- windows 사용자가 /home/tmp 디렉토리에 쓰기 권한이 있으므로 

  linux 사용자가 생성한 파일 mv, a.txt 파일을 삭제할 수 있다.

# useradd windows

# su - windows

$ rm -fv /home/tmp/mv

$ rm -fv /home/tmp/a.txt



디렉토리에 sticky bit 권한이 있을 경우(rwxrwxrwt)


# chmod o+t /home/tmp

# ls -ld /home/tmp

# su - linux

$ cp /etc/passwd /home/tmp/a.txt

$ ls -l /home/tmp/a.txt

$ exit


- sticky bit 가 /home/tmp 디렉토리에 걸려있으므로 linux 가 생성한 파일을 

  windows 사용자가 삭제할 수 없다.

# su - windows

$ rm -fv /home/tmp/a.txt   <-- X



- 시스템에 기본적으로 설정되어 있는 공유디렉토리인 /tmp 디렉토리에서 

  작업을 해보자.

# ls -ld /tmp

drwxrwxrwt 7 root root 1024 Oct 24 02:55 /tmp


# useradd user1

# su - user1

$ cd /tmp

$ touch user1.txt

$ ls -l user1.txt 

-rw-rw-r-- 1 user1 user1 0 Oct 24 02:54 user1.txt

$ exit


# su - linux

$ cd /tmp

$ touch linux.txt

$ ls -l linux.txt 

-rw-rw-r-- 1 linux linux 0 Oct 24 02:54 linux.txt

$ exit


# su - user1

$ rm -f linux.txt 

rm: cannot remove `linux.txt': Operation not permitted

$ exit


# su - linux

$ rm -f user1.txt 

rm: cannot remove `user1.txt': Operation not permitted

$ exit


# su - user1

$ rm -fv user1.txt 

removed `user1.txt'

$ ls -l user1.txt

ls: user1.txt: No such file or directory

$ exit


# su - linux

$ rm -f linux.txt 

$ ls -l linux.txt

ls: linux.txt: No such file or directory


==================================================================



==================================================================

LAB> Set-UID 테스트


- cat /etc/passwd 명령어를 사용하기 위해서는 아래와 같은 단계를 거친다.

- 1. /bin 디렉토리에 들어갈 수 있어야 한다.

- 2. cat 프로그램을 실행할 수 있어야 한다.

- 3. /etc 디렉토리에 들어갈 수 있어야 한다.

- 4. /etc/shadow 파일에 읽을 수 있어야 한다.

# ls -ld /bin

drwxr-xr-x 2 root root 4096 Oct 17 12:17 /bin

# ls -l /bin/cat

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

# ls -ld /etc

drwxr-xr-x 82 root root 4096 Oct 24 02:40 etc

# ls -l /etc/shadow

-r-------- 1 root root 1030 Oct 24 02:40 /etc/shadow


- setuid 가 없을 경우

- linux 사용자의 권한으로 cat을 실행한다.

# su - linux

$ cat /etc/shadow

cat: /etc/shadow: Permission denied

$ exit


- setuid 가 있을 경우

- linux 사용자가 실행하지만 소유자(root) 권한으로 cat을 실행한다.

# chmod u+s /bin/cat -c

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

# ls -l /bin/cat

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


$ cat /etc/shadow

  :

  :

==================================================================


==================================================================

모든 프로세스는 실행한 사용자의 권한으로 실행된다.

하지만 가끔씩 이를 바꿔줘야할 필요가 있을때 setuid 를 사용한다.

==================================================================

==================================================================

LAB> Set-UID 테스트

!!! /usr/bin/passwd 파일이 setuid 권한이 있어서 일반유저가

!!! 저장할 수 없는 파일인 /etc/shadow 파일에 자신의 비밀번호를 

!!! 저장할 수 있는 것이다.


# grep --color linux /etc/shadow

linux:!!:16542:0:99999:7:::

# passwd linux

Changing password for user linux.

New UNIX password: 

BAD PASSWORD: it is too short

Retype new UNIX password: 

passwd: all authentication tokens updated successfully.

# grep --color linux /etc/shadow

linux:$1$YEoy.4YY$MBqjkVZtQ6seSbXQWBjTR.:16542:0:99999:7:::

# ls -l /etc/shadow

-r-------- 1 root root 1018 Apr 17 22:50 /etc/shadow


# ls -l `which passwd`

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

# 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


- 일반 사용자가 /usr/bin/passwd 에 설정된 setuid 에 의해서 

- /etc/shadow 파일에 자신의 비번을 저장할 수 있다.

# grep --color linux /etc/shadow

linux:$1$SZhz3G7M$sqOSClylxrybmeMW.TOq21:16542:0:99999:7:::


==================================================================

==================================================================

LAB> Set-UID 테스트


# vi fileread.c

-- fileread.c --

/*

 * filename : fileread.c

 */

#include <stdio.h>  // printf, fprintf, fgets, fopen, fclose

#include <stdlib.h> // exit


int main()

{

  FILE *fp;

  char buf[1024];


  // a.txt 파일을 읽기 권한으로 연다.

  fp = fopen("a.txt", "r");

  if(fp == NULL)  // 열지 못했으면 에러를 출력하고 프로그램을 종료한다.

  {

    fprintf(stderr, "can't open file\n");  // 에러를 화면에 출력한다.

    exit(1);  // 프로그램을 종료한다.

  }


  fgets(buf, 1024, fp); // 1024 만큼 파일을 읽어서 buf에 저장하라

  printf("%s", buf);    // 저장된 내용을 화면에 출력해라

  fclose(fp);

  return 0;

}

-- fileread.c --


# gcc -o /tmp/fileread fileread.c 

# cd /tmp

# cp /etc/passwd a.txt

# ./fileread

root:x:0:0:root:/root:/bin/bash

# su linux

$ ./fileread

root:x:0:0:root:/root:/bin/bash

$ exit

# cp -a /etc/shadow a.txt

# ls -l a.txt 

-r-------- 1 root root 1018 Apr 17 22:53 a.txt

# su linux

$ ./fileread 

can't open file

$ exit

# chmod u+s fileread

# ls -l fileread 

-rwsr-xr-x 1 root root 5630 Apr 17 23:29 fileread

   ~

# su linux

$ ./fileread 

root:$1$P25UygmC$vImxWX08gOtNQovPf4tnR.:16512:0:99999:7:::

==================================================================

==================================================================

LAB> SetGID 테스트 (파일)


- 일반 파일

# umask

0022

# echo 1234 > /tmp/readme.txt 

# chmod o= /tmp/readme.txt 

# ls -l /tmp/readme.txt 

-rw-r----- 1 root root 5 Oct 24 03:35 /tmp/readme.txt

# chmod 755 /bin/cat

# ls -l /bin/cat

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


- /bin/cat 은 일반유저가 실행할 때 자신의 권한으로 실행하므로 

  /tmp/readme.txt 파일은 볼 수가 없다.

$ cat /tmp/readme.txt 

cat: /tmp/readme.txt: Permission denied


- /bin/cat 파일을 SetGID 권한을 부여한다.

# chmod g+s /bin/cat

# ls -l /bin/cat

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


- 일반유저가 /bin/cat 을 실행할 때 SetGID 권한이 설정되어 있으므로 

  /tmp/readme.txt 파일을 볼 수 있다.

$ cat /tmp/readme.txt 

1234

==================================================================

==================================================================

LAB> SetUID, SetGID 테스트


# vi fileread.c 

-- fileread.c --

/*

 * filename : fileread.c

 */

#include <stdio.h>  // printf, fprintf, fgets, fopen, fclose

#include <stdlib.h> // exit


int main(int argc, char *argv[])

{

  FILE *fp;

  char buf[1024];


  // 인자가 없다면 에러를 출력하고 프로그램을 종료한다.

  if(argc != 2)

  {

    fprintf(stderr, "Usage : %s filename \n", argv[0]);

    exit(1);

  }


  // a.txt 파일을 읽기 권한으로 연다.

  fp = fopen(argv[1], "r");

  if(fp == NULL)  // 열지 못했으면 에러를 출력하고 프로그램을 종료한다.

  {

    fprintf(stderr, "can't open file\n");  // 에러를 화면에 출력한다.

    exit(1);  // 프로그램을 종료한다.

  }


  fgets(buf, 1024, fp); // 1024 만큼 파일을 읽어서 buf에 저장하라

  printf("%s", buf);    // 저장된 내용을 화면에 출력해라

  fclose(fp);

  return 0;

}

-- fileread.c --


# gcc -o /tmp/fileread fileread.c 

# cd /tmp

# ls -l fileread 

-rwxr-xr-x 1 root root 5813 Apr 18 00:00 fileread

# su linux

$ ./fileread 

Usage : ./fileread filename 

$ ./fileread /etc/shadow

can't open file

$ ls -l /etc/shadow

-r-------- 1 root root 1018 Apr 17 22:53 /etc/shadow

$ ./fileread /etc/passwd

root:x:0:0:root:/root:/bin/bash

$ ./fileread /etc/fstab 

/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1

$ ls -l /etc/fstab 

-rw-r--r-- 1 root root 534 Mar 18 18:28 /etc/fstab

$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1657 Apr 17 20:20 /etc/passwd

$ exit

exit


# chmod g+s fileread -c


# ls -l /etc/fstab 

-rw-r--r-- 1 root root 534 Mar 18 18:28 /etc/fstab

# chmod o-r /etc/fstab -c

mode of `/etc/fstab' changed to 0640 (rw-r-----)


# chmod 755 /bin/cat

# ls -l /bin/cat

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

# su linux

$ cat /etc/fstab 

cat: /etc/fstab: Permission denied


$ ls -l fileread 

-rwxr-sr-x 1 root root 5813 Apr 18 00:00 fileread


$ ./fileread /etc/fstab 

/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1

==================================================================


==================================================================

LAB> uid, gid, euid, egid 값 확인하기


참고 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/getuid


uid  : 사용자에게 부여한 번호  getuid()

gid  : 그룹에게 부여한 번호    getgid()

euid : 유효사용자 번호         geteuid()

egid : 유효그룹 번호           getegid()


getuid()는 현재 프로세스의 실제 유저 아이디를 얻어온다. 

geteuid()는 현재 프로세스의 유효 유저 아이디(effective user ID)를 얻어온다. 



# cd /tmp

# vi uidtest.c

-- uidtest.c --

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>


int main()

{

  printf("UID  : %d \n", getuid());

  printf("GID  : %d \n", getgid());

  printf("EUID : %d \n", geteuid());

  printf("EGID : %d \n", getegid());


  return 0;

}

-- uidtest.c --


# gcc -o uidtest uidtest.c 

# ls -l uidtest

-rwxr-xr-x 1 root root 5407 Apr 18 00:35 uidtest

~~~~~~~~~~~

# su linux


- setuid 가 없을 경우 

$ id

uid=500(linux) gid=500(linux) groups=500(linux)

$ ./uidtest 

UID  : 500 

GID  : 500 

EUID : 500 

EGID : 500


- setuid 가 있을 경우


# chmod u+s uidtest 

# ls -l uidtest

-rwsr-xr-x 1 root root 5407 Apr 18 00:35 uidtest

$ ls -n uidtest

-rwsr-xr-x 1 0 0 5407 Apr 18 00:35 uidtest

            ~~ 

# su linux


$ ./uidtest 

UID  : 500 

GID  : 500 

EUID : 0       <-- setuid 가 걸린 UID 가 표시가 된다.

EGID : 500 

$ exit


# chmod g+s uidtest

# ls -l uidtest

-rwsr-sr-x 1 root root 5407 Apr 18 00:35 uidtest

   ~  ~

   |  |

   |  +-- EGID

   +-- EUID

# su linux

$ ./uidtest 

UID  : 500 

GID  : 500 

EUID : 0 

EGID : 0 


# chgrp users uidtest

# chmod ug+s uidtest

# ls -n uidtest

-rwsr-sr-x 1 0 100 5407 Apr 18 00:35 uidtest

# ls -l uidtest

-rwsr-sr-x 1 root users 5407 Apr 18 00:35 uidtest

# su linux

$ ./uidtest 

UID  : 500 

GID  : 500 

EUID : 0 

EGID : 100 


- 예제

# rm -f a.txt

# echo 1234 > a.txt

# chmod 640 a.txt

# chgrp users a.txt

# ls -l a.txt 

-rw-r----- 1 root users 5 Apr 18 00:47 a.txt

# ls -l fileread 

-rwxr-sr-x 1 root root 5813 Apr 18 00:00 fileread

# chgrp users fileread 

# ls -l fileread 

-rwxr-xr-x 1 root users 5813 Apr 18 00:00 fileread

# chmod g+s fileread 

# ls -l fileread 

-rwxr-sr-x 1 root users 5813 Apr 18 00:00 fileread

# su linux

$ ./fileread a.txt 

1234

$ exit

exit

# chmod g-s fileread 

# ls -l fileread 

-rwxr-xr-x 1 root users 5813 Apr 18 00:00 fileread

# su linux

$ ./fileread a.txt 

can't open file


- 예제2


사용자 : linux   uid : 500

그룹   : boan    gid : 7000


=========================

실행시 fileread 의 권한 : uid : 500, gid : 7000, euid : 500, egid : 7000

fileread  권한 : rwxr-xr-x  root(0) root(0)

a.txt     권한 : -rw-r-----  root(0) project(5000)

$ fileread a.txt    <-- 권한이 없으므로 a.txt 에 접근할 수 없다.


# groupadd -g 5000 project

# groupadd -g 7000 boan

# chmod 640 a.txt

# chgrp project a.txt

# ls -l a.txt 

-rw-r----- 1 root project 5 Apr 18 00:47 a.txt

# chown 0.0 fileread 

# chmod 755 fileread 

# ls -l fileread 

-rwxr-xr-x 1 root root 5813 Apr 18 00:00 fileread

# su linux

$ ./fileread a.txt

can't open file

=========================

          

=========================

실행시 fileread 의 권한 : uid : 500, gid : 7000, euid : 0, egid : 7000

fileread  <-- rwsr-xr-x  root(0) root(0)

a.txt  : -rw-r-----  root(0) project(5000)

$ fileread a.txt    <-- euid 권한이 0 이므로 a.txt 에 접근할 수 있다.


# chmod u+s fileread 

# ls -l fileread 

-rwsr-xr-x 1 root root 5813 Apr 18 00:00 fileread

# su linux

$ ./fileread a.txt 

1234

$ ls -l a.txt 

-rw-r----- 1 root project 5 Apr 18 00:47 a.txt

=========================


=========================

실행시 fileread 의 권한 : uid : 500, gid : 7000, euid : 500, egid : 5000

fileread  <-- rwxr-sr-x  root(0) project(5000)

a.txt  : -rw-r-----  root(0) project(5000)

$ fileread a.txt    <-- O


# chgrp project fileread 

# chmod 2755 fileread 

# ls -l fileread 

-rwxr-sr-x 1 root project 5813 Apr 18 00:00 fileread

# su linux

$ ./fileread a.txt 

1234

=========================



==================================================================


==================================================================

LAB> uid,gid,euid,egid 를 출력하면서 a.txt 파일을 보자.


!!! a.txt 파일에 접근하기 위해서는 파일의 권한이 일치해야 한다. !!!


# vi fileread.c

-- fileread.c --

/*

 * filename : fileread.c

 */

#include <stdio.h>  // printf, fprintf, fgets, fopen, fclose

#include <stdlib.h> // exit

#include <sys/types.h>

#include <unistd.h>


int main(int argc, char *argv[])

{

  FILE *fp;

  char buf[1024];


  printf("UID  : %d \n", getuid());

  printf("GID  : %d \n", getgid());

  printf("EUID : %d \n", geteuid());

  printf("EGID : %d \n", getegid());



  // 인자가 없다면 에러를 출력하고 프로그램을 종료한다.

  if(argc != 2)

  {

    fprintf(stderr, "Usage : %s filename \n", argv[0]);

    exit(1);

  }


  // a.txt 파일을 읽기 권한으로 연다.

  fp = fopen(argv[1], "r");

  if(fp == NULL)  // 열지 못했으면 에러를 출력하고 프로그램을 종료한다.

  {

    fprintf(stderr, "can't open file\n");  // 에러를 화면에 출력한다.

    exit(1);  // 프로그램을 종료한다.

  }


  fgets(buf, 1024, fp); // 1024 만큼 파일을 읽어서 buf에 저장하라

  printf("%s", buf);    // 저장된 내용을 화면에 출력해라

  fclose(fp);

  return 0;

}

-- fileread.c --


# gcc -o /tmp/fileread fileread.c 

# cd /tmp/


$ ls -l a.txt 

-rw-r----- 1 root project 5 Apr 18 00:47 a.txt

$ ls -n a.txt 

-rw-r----- 1 0 5000 5 Apr 18 00:47 a.txt


# ls -l fileread 

-rwxr-xr-x 1 root root 6287 Apr 18 02:11 fileread

# su linux

$ ./fileread a.txt

UID  : 500 

GID  : 500 

EUID : 500 

EGID : 500 

can't open file

$ exit


# chmod u+s fileread 

# ls -l fileread 

-rwsr-xr-x 1 root root 6287 Apr 18 02:11 fileread

# su linux

$ ./fileread a.txt

UID  : 500 

GID  : 500 

EUID : 0 

EGID : 500 

1234

$ exit



# chgrp project fileread 

# chmod g+s fileread 

# ls -l fileread 

-rwxr-sr-x 1 root project 6287 Apr 18 02:11 fileread

# su linux

$ ./fileread a.txt

UID  : 500 

GID  : 500 

EUID : 500 

EGID : 5000 

1234

==================================================================


==================================================================

LAB> SetGID 테스트 (디렉토리)


- 디렉토리에 SetGID 가 없을 경우 

- 소유자가 속해있는 그룹으로 파일이 생성된다.

# mkdir -m 777 /tmp/test

# ls -ld /tmp/test

drwxrwxrwx 2 root root 1024 Oct 24 03:42 /tmp/test


# useradd user1

$ su - user1


- other 에 x 권한이 있으므로 디렉토리를 이동할 수 있다.

$ cd /tmp/test


- other 에 w 권한이 있으므로 디렉토리에 파일을 생성할 수 있다.

$ touch a.txt

$ ls -l a.txt 

-rw-rw-r-- 1 user1 user1 0 Oct 24 03:43 a.txt

                   ~~~~~

$ exit


- 디렉토리에 SetGID 가 있을 경우 

- 디렉토리에 설정된 그룹으로 파일이 생성된다.

# chmod g+s /tmp/test

# ls -ld /tmp/test

drwxrwsrwx 2 root root 1024 Oct 24 03:43 /tmp/test

     ~~

# su - user1

$ cd /tmp/test

$ touch b.txt

$ ls -l b.txt 

-rw-rw-r-- 1 user1 root 0 Oct 24 03:44 b.txt

                   ~~~~

==================================================================


===========================================================================================================

LAB> 권한 테스트하기


http://permissions-calculator.org


421421421

---------  0000 

r--rws--t  3471

--s--s--x  6111


rwxrwxrwt  1777

rwSr-x--T  5650

-wS-w----  4220

--S-----x  4001

--srw-rwx  4167

r-S-wS-w-  6422

rw---s--t  3611

rw---S--T  3600

rw------T  1600

r----x--t  1411

===========================================================================================================


===========================================================================================================

LAB> LINUX BOX 에서 특수 권한이 있는 모든 파일을 검색하기


find 명령어의 -perm 옵션으로 검색할 수 있다.


 2>/dev/null : 에러는 화면에 출력하지 말라는 의미이다.


- Set-UID 가 들어있는 파일들을 모두 검색하되 에러는 화면에 출력하지 않는다.

# find / -perm -4000 2>/dev/null -ls


- Set-GID 가 들어있는 파일들을 모두 검색하되 에러는 화면에 출력하지 않는다.

# find / -perm -2000 2>/dev/null -ls


- Set-UID 와 Set-GID 권한이 있는 파일들을 모두 검색하되 에러는 화면에 출력하지 않는다.

# find / \( -perm -4000 -o -perm -2000 \) 2>/dev/null -ls


===========================================================================================================


======================================================================

LAB> SetUID 를 이용한 백도어


구글에서 검색 : 

참고 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/%BE%C8%C0%FC%C7%D1_%C7%C1%B7%CE%B1%D7%B7%A1%B9%D6



!!! SetUID 가 걸린 파일은 잠재적인 보안문제를 야기할 수 있으므로 

!!! 리눅스 설치 후 불필요한 setuid 파일들은 모두 제거해야 한다.



# cd /tmp

# vi backdoor.c

-- backdoor.c --

# cat backdoor.c

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>


int main()

{

  setuid(0);  

  execl("/bin/bash", "bash", NULL);

  return 0;

}

-- backdoor.c --


# gcc -o backdoor backdoor.c 

# chmod u+s backdoor

# su linux

$ id

uid=500(linux) gid=500(linux) groups=500(linux) 

$ ./backdoor 

# id

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



======================================================================

======================================================================

LAB> 자주 쓰는 프로그램들의 SetUID 권한 확인하기


# ls -l /bin/su

# ls -l /bin/ping

# ls -l /bin/mount

-rwsr-xr-x 1 root root 59540 Nov  8  2012 /bin/mount

# ls -l /usr/bin/passwd 

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

# ls -l /usr/bin/crontab 

-rwsr-sr-x 1 root root 309932 Feb 23  2012 /usr/bin/crontab


======================================================================



===========================================================================================================

LAB> 읽기 권한 디렉토리 실습하기


- 디렉토리에 읽기권한이 있을 때

$ ls -ld /bin

drwxr-xr-x 2 root root 4096 Oct 17 12:17 /bin

       ~~~

$ ls -l /bin

  :

  :


- 디렉토리에 읽기권한이 없을 때

$ ls -ld /root

drwxr-x--- 11 root root 4096 Oct 23 23:21 /root

       ~~~

$ ls /root

ls: /root: Permission denied

===========================================================================================================


===========================================================================================================

LAB> 읽기, 쓰기 권한 연습하기


- 읽기권한 연습 ( read 권한을 제거 )

# cd /tmp


/tmp # echo "Hello World" > a.txt

/tmp # ls -l a.txt 

-rw-r--r-- 1 root root 12 Feb 17 22:05 a.txt

/tmp # cat a.txt 

Hello World


/tmp # echo "Hello World" > b.txt

/tmp # ls -l b.txt 

-rw-r--r-- 1 root root 12 Feb 17 22:05 b.txt

/tmp # cat b.txt 

Hello World


/tmp # chmod -c o-r a.txt

mode of `a.txt' changed to 0640 (rw-r-----)

/tmp # chmod -c o-r a.txt


- 읽기권한 연습 ( read 권한을 제거한 a.txt 파일은 일반유저가 읽을 수 없다. )

/tmp # useradd linux

/tmp # su - linux

~ $ cd /tmp 

/tmp $ cat b.txt 

Hello World

/tmp $ cat a.txt 

cat: a.txt: Permission denied


- 쓰기권한 연습 ( 일반유저가 write 권한이 없을때 )

/tmp # echo "Have a nice day" >> a.txt   <-- a.txt 에 내용을 추가한다.

/tmp # cat a.txt 

Hello World

Have a nice day

/tmp # chmod -c o+r a.txt

mode of `a.txt' changed to 0644 (rw-r--r--)


/tmp $ cat a.txt 

Hello World

Have a nice day


/tmp $ echo "^^*" >> a.txt       <-- a.txt 에 내용을 추가했지만 권한이 없어서 추가가 안된다.

-bash: a.txt: Permission denied

/tmp $ cat a.txt                 <-- a.txt를 확인하면 추가가 안된 것을 알 수 있다.

Hello World

Have a nice day


- 쓰기권한 연습 ( 일반유저가 write 권한이 있을때 )

/tmp # ls -l b.txt 

-rw-r--r-- 1 root root 28 Feb 17 22:29 a.txt

/tmp # chmod -c o+w b.txt

mode of `b.txt' changed to 0646 (rw-r--rw-)


/tmp $ cat b.txt 

Hello World


/tmp $ echo "I have a smartphone" >> b.txt   <-- b.txt 에 문자열이 추가되었다.

/tmp $ cat b.txt 

Hello World

I have a smartphone

===========================================================================================================


===========================================================================================================

LAB> /dev/sda 장치 파일의 읽기권한을 이용한 파티션 정보 출력하기


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

brw-r----- root disk /dev/sda  <-- 일반유저가 읽을 수 없다.

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

brw-r--r-- root disk /dev/sda  <-- 일반유저가 읽을 수 있다.

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

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


# ls -l /dev/sda

brw-r----- 1 root disk 8, 0 Nov 20 19:30 /dev/sda

# fdisk -l /dev/sda


Disk /dev/sda: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1         913     7333641   83  Linux

/dev/sda2             914        1044     1052257+  82  Linux swap / Solaris


# su - linux  <-- Other 부분에 읽기 권한이 없으므로 볼 수 없다.

$ /sbin/fdisk -l /dev/sda

Cannot open /dev/sda

$ exit


# chmod -c o+r /dev/sda

mode of `/dev/sda' changed to 0644 (rw-r--r--)


$ /sbin/fdisk -l /dev/sda  <-- Other 에 읽기 권한이 있으므로 볼 수 있다.


Disk /dev/sda: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1         913     7333641   83  Linux

/dev/sda2             914        1044     1052257+  82  Linux swap / Solaris

===========================================================================================================


===========================================================================================================

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


-- LAB 순서 --

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

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

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

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

5. 바이너리 파일 (x 를 제거할 경우)

-- LAB 순서 --


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

- 관리자가 a.sh 파일을 생성하고 관리자와 일반유저가 실행해보자.

# cd /tmp

# vi a.sh

-- a.sh --

#!/bin/sh


# i 변수에 123을 대입해라

i=123  


# i 변수의 값을 화면에 출력해라

echo $i

-- a.sh --


# ls -l a.sh

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


# chmod a+x a.sh

# ./a.sh 

123


- 일반유저가 a.sh 파일을 실행한다.

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

123


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

- 관리자가 a.sh 파일의 일반유저 부분의 읽기권한을 제거하고 일반유저가 실행해보자.

# chmod -c o-r a.sh 

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


- 일반유저는 읽기 권한이 없으므로 실행파일을 실행할 수 없다.

$ ./a.sh        

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


- 관리자는 파일의 읽기 권한을 제거하지만 실행이 된다. 

(왜 ? 관리자는 읽기/쓰기의 제약을 받지 않는다.)

# chmod -c ug-r a.sh 

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

/tmp # ./a.sh   

123


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

- 관리자가 바이너리 파일을 만들고 일반유저가 파일을 실행하고 복사해보자.

# vi hello.c

-- hello.c --

#include <stdio.h>


int main()

{

  puts("Hello C");

  return 0;

}

-- hello.c --

# gcc -o hello hello.c  <-- hello.c 를 hello 로 컴파일해서 실행파일을 생성한다.

# ls -l hello

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

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

Hello C


$ ./hello           <-- 일반유저 또한 x 권한이 있으므로 hello 파일이 실행된다.

Hello C


- r 권한이 있으므로 복사할 수 있다. 

( 파일을 복사한다는 것은 읽기 권한이 있어야 한다. )

$ cp hello hello2   

$ ls -l hello2

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

$ ./hello2

Hello C


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

- 관리자가 Other 부분의 r 권한을 제거하고 일반유저가 파일을 실행하고 복사해보자.

# chmod o-r hello   

# ls -l hello

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


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

$ ./hello   

Hello C


- Other 부분의 r 권한이 없으므로 복사가 안된다.

$ cp hello hello3   

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


5. 바이너리 파일 (x 를 제거할 경우)

- 관리자가 x 권한을 모두 제거하고 실행해 보면 아무도 이 파일을 실행할 수 없다.

# chmod a-x he/tmp # ls -l hello

-rw-r----- 1 root root 4937 Feb 17 23:06 hellollo   


# ./hello

- bash: ./hello: Permission denied


$ ./hello

- bash: ./hello: Permission denied

===========================================================================================================


===========================================================================================================

LAB> 쓰기권한 테스트 (장치파일)


메세지를 받는 사용자 : 관리자 root

메세지를 보내는 사용자 : 일반유저 linux

# 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

===========================================================================================================


===========================================================================================================

LAB> 디렉토리 권한 테스트


# cd

# pwd

/root

# ls -ld

drwxr-x--- 11 root root 4096 Oct 24 02:00 .

# chmod o+r .

# ls -ld

drwxr-xr-- 11 root root 4096 Oct 24 02:00 .


- 일반유저가 /root 디렉토리에 x 권한이 없으므로 접근할 수 없다.

- 따라서 디렉토리에 x 권한이 없고 r 권한이 있는 것은 잘못된 것이다.

- 그 예를 아래쪽에서 보여주는 것이다.

$ pwd

/home/user1

$ cd /root

-bash: cd: /root: Permission denied

$ ls -l /root

total 0

?--------- ? ? ? ?            ? a

?--------- ? ? ? ?            ? A

?--------- ? ? ? ?            ? a.c

  :

  :


===========================================================================================================


===========================================================================================================

LAB> 디렉토리 권한 테스트


~ # 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

===========================================================================================================

===========================================================================================================

LAB> 터미널에 쓰기 연습


- linux 사용자

# echo 1234 | passwd --stdin linux

Changing password for user linux.

passwd: all authentication tokens updated successfully.

# ssh linux@localhost

linux@localhost's password: 

Last login: Sat Apr 18 04:14:11 2015 from 127.0.0.1

$ tty

/dev/pts/3

$ ls -l /dev/pts/3 

crw--w---- 1 linux tty 136, 3 Apr 18 04:15 /dev/pts/3

$ ls -l `tty`

crw--w---- 1 linux tty 136, 3 Apr 18 04:16 /dev/pts/3

$ chmod o+w /dev/pts/3

$ ls -l `tty`

crw--w--w- 1 linux tty 136, 3 Apr 18 04:17 /dev/pts/3

$ 1234


- windows 사용자

# useradd windows

# su - windows

$ echo 1234 > /dev/pts/3

-bash: /dev/pts/3: Permission denied


$ echo 1234 > /dev/pts/3

===========================================================================================================



*** 리눅스에서 프로그래밍시에 칼라를 볼 수 있도록 세팅하는 방법 ***

# alias vi=vim

# echo "alias vi=vim" >> ~/.bashrc 

# cat .vimrc 

set nu

set ai

set ci

set bg=dark

set ts=2

set sw=2

*** 리눅스에서 프로그래밍시에 칼라를 볼 수 있도록 세팅하는 방법 ***



+ Recent posts