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

이를 퍼미션이라고 한다.

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

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

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

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



퍼미션의 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

  |  |  

  |  group

  |

  user (owner)


리눅스의 권한

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


r(Read)    : 읽기 권한

w(Writ e)   : 쓰기 권한 

x(eXecute) : 실행 권한 


디렉토리 : 파일명 + inode번호


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


 

파일 

디렉터리 (x 권한을 같이 사용) 

파일의 내용을 볼 수 있는 권한 

디렉터리에서 파일의 목록을 볼 수 있는 권한 

파일의 내용을 수정할 수 있는 권한 

디렉터리에서 파일을 생성/삭제할 수 있는 권한 

파일을 실행할 수 있는 권한 

디렉터리에 접근할 수 있는 권한 

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

실행중에 그룹의 권한으로 실행 

파일의 생성시 그룹의 권한으로 생성 

자기가 만든 파일을 자기만이 삭제 












실행파일의 종류 

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

- 쉘스크립트 파일 (일반 텍스트 문서)     (root : x 권한만 있어도 된다. 일반유저 : rx 모두 있어야 한다.)

          


파일 생성시 기본 권한

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

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

- bash 안에 포함되어 있다. 


권한 변경 명령어 

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

- 디렉토리 위치 : /bin

- 패키지 : coreutils 


권한 변경 방법 

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

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



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

- 허용문자 : augorwxst,=-+

ex)

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


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

-rwx------   chmod u+rwx a.txt

-rw-------   chmod u+rw a.txt 

-rw-r--r--   chmod a+r,u+w a.txt


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

- 허용숫자 : 0 ~ 7


  421 421

  rwx rwx

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)

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


-rwxr-xr-x   chmod 755 a.txt

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

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

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



많이 사용되는 권한들 (실행파일 / 디렉토리에 해당)

-rwxr-xr-x   

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

-rwxr-x---

-rwx------

-rwx--x---


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

-rw-r--r-- 644   

-rw-rw---- 660

-rw-r----- 640

-rw------- 600


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





실습1>


- 읽기권한 연습 ( 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 # useradd linux


- 읽기권한 연습 ( read 권한을 제거하면 일반유저가 읽을 수가 없다. )

su linux

$ id

uid=503(linux) gid=503(linux) groups=503(linux)

$ cd /tmp

/tmp $ cat a.txt 

Hello World

/tmp $ su

passwd:

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

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

/tmp # su linux

/tmp $ cat a.txt 

cat: a.txt: Permission denied


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

/tmp $ su

/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 # su linux

/tmp $ cat a.txt   <-- other 에 읽기권한이 있으므로 볼 수 있다. 

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

/tmp # ls -l a.txt 

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

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

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

/tmp # su linux

/tmp $ cat a.txt 

Hello World

Have a nice day

/tmp $ echo "I have a smartphone" >> a.txt 

/tmp $ cat a.txt 

Hello World

Have a nice day

I have a smartphone


LAB> /dev/sda 장치 읽기권한 연습 


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

brw-r----- root disk /dev/sda  <-- linux 가 읽을 수 없다.

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

brw-r--r-- root disk /dev/sda  <-- linux 가 읽을 수 있다.

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

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


# 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


# chmod 644 /dev/sda

su linux

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




그룹 권한 실습

# chmod -c o+r /dev/sda

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

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

[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

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