여러사람이 사용하는 멀티유저 운영체제인 리눅스는 보안상의 이유로 각 파일마다 접근권한이 설정되어 있다.
이를 퍼미션이라고 한다.
예를들어 다른 사람이 자신의 파일을 읽을 수 있도록 허용할 수도 있고 거부할 수도 있다.
또한 자신의 파일에 다른 내용을 기록하게 허용할 수도 있고 거부할 수도 있다.
이들 권한들을 이용하여 각 파일과 디렉토리들을 다른 사람들과 공유하거나 아니면 개인적인 목적으로 사용할 수 있다.
리눅스에서 사용자는 기본적으로 최소 하나의 그룹에 포함되어 있고 하나 이상의 그룹에 속할 수도 있다.
퍼미션의 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 권한을 같이 사용) |
r | 파일의 내용을 볼 수 있는 권한 |
디렉터리에서 파일의 목록을 볼 수 있는 권한 |
w | 파일의 내용을 수정할 수 있는 권한 |
디렉터리에서 파일을 생성/삭제할 수 있는 권한 |
x | 파일을 실행할 수 있는 권한 |
디렉터리에 접근할 수 있는 권한 |
s | 실행중에 소유자의 권한으로 실행 |
X |
s | 실행중에 그룹의 권한으로 실행 |
파일의 생성시 그룹의 권한으로 생성 |
t | 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]$