#############################################
## 주제 : 퍼미션(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
*** 리눅스에서 프로그래밍시에 칼라를 볼 수 있도록 세팅하는 방법 ***
'OS > [Linux] CentOS' 카테고리의 다른 글
[CentOS] 7-2. 리눅스 퍼미션 (0) | 2016.07.10 |
---|---|
[CentOS] 중간 정리 (0) | 2016.07.06 |
[CentOS] 6. 파일 권한 테스트 (0) | 2016.07.02 |
[CentOS] 5. 다양한 복사 방법 & 하드링크심볼릭링크 (0) | 2016.07.02 |
[CentOS] 4. 파일관련 명령어 (0) | 2016.07.02 |