실습2> 스크립트와 바이너리 파일의 실행권한 테스트
1. 스크립트 파일 (rx 가 있을 경우)
2. 스크립트 파일 (x 만 있을 경우)
3. 바이너리 파일 (rx 가 있을 경우)
4. 바이너리 파일 (x 만 있을 경우)
1. 스크립트 파일 (rx 가 있을 경우)
/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
/tmp $ ./a.sh <-- a.sh 가 실행된 이유는 rx 권한이 있기 때문에 실행이 되었다.
123
2. 스크립트 파일 (x 만 있을 경우)
/tmp # chmod o-r a.sh -c <-- 일반유저의 읽기권한을 제거한다.
mode of `a.sh' changed to 0751 (rwxr-x--x)
/tmp $ ./a.sh <-- 일반유저는 실행이 안된다. (왜 ? 읽기 권한이 없으므로 ...)
/bin/sh: ./a.sh: Permission denied
/tmp # chmod ug-r a.sh -c <-- 관리자의 읽기 권한을 제거해보자.
mode of `a.sh' changed to 0311 (-wx--x--x)
/tmp # ./a.sh <-- 관리자는 실행이 된다. (왜 ? 관리자는 읽기/쓰기의 제약이 없다.)
123
3. 바이너리 파일 (rx 가 있을 경우)
/tmp # cat >> hello.c
#include <stdio.h>
int main()
{
puts("Hello C");
return 0;
}
/tmp # gcc -o hello hello.c
/tmp # ls -l hello
-rwxr-xr-x 1 root root 4937 Feb 17 23:06 hello
/tmp # ./hello <-- x 권한이 있으므로 실행이 된다.
Hello C
/tmp $ ./hello <-- x 권한이 있으므로 실행이 된다.
Hello C
/tmp $ cp hello hello2 <-- r 권한이 있으므로 복사할 수 있다.
/tmp $ ls -l hello2
-rwxr-xr-x 1 linux linux 4937 Feb 17 23:23 hello2
/tmp $ ./hello2
Hello C
4. 바이너리 파일 (x 만 있을 경우)
/tmp # chmod o-r hello <-- Other 부분의 r 권한을 제거한다.
/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
실습3> 쓰기권한 테스트 (장치파일)
/tmp # 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
실습4> 디렉토리 권한
# 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
실습> chmod 를 이용한 파일의 권한변경
# ls -l /etc/passwd
-rw-r--r-- 1 root root 1826 Nov 18 15:07 /etc/passwd
~~~
u ~~~
| g ~~~ ---------
| | o rwxrwxrwx + - = ,
| | | s s t
+--+--+ S S T
a
# 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-----)
#
rwxrwxrwt <-- 웹서버 (nobody,apache,daemon)
- 확장된 권한
sst <--
ugo
rwx
0 -> 000
1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111
0 -> 000111
1 -> 001111 <-- t
2 -> 010111 <-- s set-gid
3 -> 011111 <-- st set-gid (셋그룹아이디, 셋지아이디)
4 -> 100111 <-- s set-uid (셋유저아이디, 셋유아이디)
5 -> 101111 <-- st set-uid
6 -> 110111 <-- ss set-uid,set-gid
7 -> 111111 <-- sst set-uid,set-gid
# 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
# su - user1
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
$ exit
# chmod u+s /bin/cat
# ls -l /bin/cat
-rwsr-xr-x 1 root root 20776 Mar 21 2012 /bin/cat
# su - user1
$ cat /etc/shadow <-- 내용이 출력이 된다. (root 권한이므로 ...)
:
:
Sticky-bit 가 있는 디렉토리에 대해서
----------------------------------------------------------
보안상 Sticky-bit 가 있는 디렉토리는 파티션을 분리하고
실행권한을 막아야한다.
Sticky-bit가 있는 directory : drwxrwxrwt root root
user1 : user1.txt
user2 : user2.txt
user1 : rm -f user2.txt X
user2 : rm -f user1.txt X
Sticky-bit가 없는 directory : drwxrwxrwx root root
user1 : user1.txt
user2 : user2.txt
user1 : rm -f user2.txt O
user2 : rm -f user1.txt O
----------------------------------------------------------
실습> 시스템에서 Set-UID / Set-GID 파일을 몽땅 검색해보자.
# find / -perm -4000 -ls -perm -2000
# find / \( -perm -4000 -o -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 <-- 파일을 볼 수 있다.
실습> /etc/shadow 파일을 set-uid 를 설정해서 내용을 보자.
# ls -l /etc/shadow
-r-------- 1 root root 1127 Mar 31 15:41 /etc/shadow
# ls -l /bin/cat
-rwxr-xr-x 1 root root 23260 Jul 22 2011 /bin/cat
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
# chmod u+s /bin/cat -c
mode of `/bin/cat' changed to 4755 (rwsr-xr-x)
$ cat /etc/shadow
root:$1$gmWxQmiB$CvtOiLu.oflCfdDQQLXdA1:15955:0:99999:7:::
bin:*:15955:0:99999:7:::
daemon:*:15955:0:99999:7
:
:
LAB> umask 연습
[root@localhost ~]# umask
0333
[root@localhost ~]# touch 123.txt
[root@localhost ~]# ls -l 123.txt
-r--r--r-- 1 root root 0 Mar 31 17:48 123.txt
[root@localhost ~]# umask 222
[root@localhost ~]# touch 1234.txt
[root@localhost ~]# ls -l 1234.txt
-r--r--r-- 1 root root 0 Mar 31 17:48 1234.txt
[root@localhost ~]# umask 022
[root@localhost ~]# touch bbb.txt
[root@localhost ~]# ls -l bbb.txt
-rw-r--r-- 1 root root 0 Mar 31 17:49 bbb.txt