그 외에 아래와 같은 세 가지 퍼미션이 더 있다.
1. s(set UID) (4nnn n은 8진수) : --s-------
소유자 권한에 s 가 있으면 setUID 퍼미션이다.(실행하는 동안 소유자 권한을 갖는다)
2. s(set GID) (2nnn): ------s--- :
그룹 권한에 s 가 있으면 setGID 퍼미션이다.(실행하는 동안 그룹권한을 갖는다)
3. t(sticky bit) (1nnn): --------t :
3자권한에 t 가 있으면 sticky bit 퍼미션이다.(파일을 만들 수 있다. 그러나 파일소유자만 파일을 삭제할 수 있다)
sticky bit 퍼미션
[root@river var]# mkdir share
[root@river var]# ls -ld share
drwxr-xr-x 2 root root 4096 5월 6 20:22 share
[root@river var]# ls -ld share
drwxrwxrwx 2 root root 4096 5월 6 20:22 share
[lee@river lee]$ id
uid=500(lee) gid=500(lee) groups=500(lee),1(bin)
[lee@river lee]$ ls -l /var/share/a.txt
-rw------- 1 root root 5 5월 6 20:27 /var/share/a.txt
[lee@river lee]$ rm -f /var/share/a.txt
[lee@river lee]$ ls -l /var/share/a.txt
ls: /var/share/a.txt: 그런 파일이나 디렉토리가 없음
share 디렉토리에 모든 사용자가 자신의 파일을 저장하고 사용하게 하려면 777 퍼미션을 줘야 한다.
그러나 퍼미션이 777 이면 디렉토리내의 파일명을 생성, 수정 그리고 삭제할 수 있는 권한을 갖게 되므로
문제가 된다. (자신이 만든 파일 퍼미션을 어떤 식으로 하더라고 다른 사람이 삭제할 수 있게 된다)
이럴 때 사용되는 퍼미션이 sticky bit 퍼미션이다.
sticky bit 퍼미션이 설정되어 있으면 소유자 외에는 파일을 삭제할 수 없게 되므로 자신의 파일을
다른 사용자로부터 보호할 수 있다.
[root@river var]# chmod 1777 share
[root@river var]# ls -ld share
drwxrwxrwt 2 root root 4096 5월 6 20:22 share
[root@river var]# su - lee
[lee@river lee]$ whoami
lee
[lee@river lee]$ ls -ld /var/share
dwxrwxrwt 2 root root 4096 5월 6 20:30 /var/share
[lee@river lee]$ ls -l /var/share/a.txt
-rw------- 1 root root 5 5월 6 20:30 /var/share/a.txt
[lee@river lee]$ rm -f /var/share/a.txt
rm: cannot remove `/var/share/a.txt': 명령이 허용되지 않음[lee@river lee]$
* 아래의 두 개의 퍼미션은 Process 에 대한 이해가 필요하다.
setUID 퍼미션
보안과 관련되어 있는 퍼미션으로 이 퍼미션을 잘못관리하면 보안상 문제가 발생할 수 있다.
소유자 권한으로 파일을 실행할 수 있다.
[lee@river lee]$ id
uid=500(lee) gid=500(lee) groups=500(lee),1(bin)
[lee@river lee]$
[lee@river lee]$find /root -name .bashrc
find: /root: 허가 거부됨
프로세스의 권한은 사용자 권한을 그대로 따른다 root 사용자는 /root 디렉토리에 읽고,쓰고,실행할 수 있는
권한을 가지고 있다. 그러면 root 가 실행한 프로세스도 마찬가지다.
그리고 lee 사용자는 /root 디렉토리에 대해 아무런 권한도 없으므로 lee 사용자가 실행한 find 프로세스도
마찬가지이다.
예를 들면
[lee@river lee]$ sleep 30 &
[2] 31083
[lee@river lee]$ ps -ef | grep sleep
lee 31083 0.0 0.1 4692 528 pts/1 S 21:03 0:00 sleep 30
lee 31086 0.0 0.1 4668 652 pts/1 S 21:03 0:00 grep sleep
[lee@river lee]$sleep 프로세스의 소유자는 프로세스를 실행한 lee가 된다.그러나 sleep 프로세스에
set uid 퍼미션이 설정되어 있다면
ls -l /bin/sleep
-rwsr-xr-x 1 root root 12444 2월 19 2003 /bin/sleep
[lee@river lee]$ sleep 30 &
[1] 31133
[lee@river lee]$ ps -ef | grep sleep
root 31133 0.0 0.1 4692 528 pts/1 S 21:06 0:00 [sleep]
[lee@river lee]$프로세스 소유자가 lee가 아니라 root 인 것을 알 수 있다.
이제 find 명령어에 setuid 퍼미션을 설정하고 다시 테스트해보자
[root@river root]# whereis find
find: /usr/bin/find /usr/share/man/man1/find.1.gz
[root@river root]# chmod 4755 /usr/bin/find
[root@river root]# ls -l /usr/bin/find
-rwsr-xr-x 1 root root 51028 1월 25 2003 /usr/bin/find
[root@river root]#
find 명령어에 setuid 퍼미션이 설정되었으며 소유자는 현재 root로 되어 있다.
[root@river root]# su - lee
[lee@river lee]$ find /root -name .bashrc
/root/.bashrc
[lee@river lee]$
find 프로세스가 root 권한으로 실행되므로 처음과 달리 lee 사용자가 /root 아래에 있는
.bashrc 파일을 검색할 수 있게 되었다.
setUID 퍼미션이 필요한 이유는?
예를들면
모든 사용자의 비밀번호는 /etc/shadow 라는 파일에 저장되어 있다.
사용자가 자신의 패스워드를 변경한다면 그 변경된 패스워드는 shadow 파일에 기록이 되어져야만 한다.
그렇다고 shadow 파일을 수정할 수 있는 권한을 준다면 당연히 보안상 문제가 발생한다.
setuid 퍼미션은 그럴 때 필요한 것이다. 사용자가 root 권한이 필요한 파일에 엑세스 해야 하는경우
setuid 퍼미션이 필요하다.
setGID 퍼미션
setGID 퍼미션의 개념은 setUID 퍼미션의 개념과 다르지 않다.
파일의 소유 그룹권한으로 실행할 수 있는 권한이다.
*.참고사항.
아래는 bash 메뉴얼 페이지의 일부내용이다.
--------------------------------------------------------------------------------------------
setuid 퍼미션을 테스트할때 알아두면 도움이 된다.
-p Turn on privileged mode. In this mode, the $ENV and
$BASH_ENV files are not processed, shell functions are
not inherited from the environment, and the SHELLOPTS
variable, if it appears in the environment, is ignored.
If the shell is started with the effective user (group)
id not equal to the real user (group) id, and the -p
option is not supplied, these actions are taken and the
effective user id is set to the real user id. If the -p
option is supplied at startup, the effective user id is
not reset. Turning this option off causes the effective
user and group ids to be set to the real user and group
ids.
set [-o 옵션] [인수...]
-p : privileged 모드를 켠다. 이모드에서는 $ENV 파일을 처리하지 않으며
셀함수를 환경으로부터 상속하지 않는다. 유효사용자(그룹) id와 실제 사용자(그룹) id 가 일치하지
않으면 시동할 때 자동으로 작동한다. 이옵션을 끄면 유효사용자, 그룹 id를 실제 사용자, 그룹id로
설정한다.
--------------------------------------------------------------------------------------------
*.디폴트 퍼미션
파일이나 디렉토리 생성시 설정되어 있는 권한.
디폴트 퍼미션은 umask 값으로 결정된다.
아래계산방법으로 결정된다(공식임)
파일인경우 디렉토리인경우
666 777
bit& umask값의 1의보수 bit& umask값의 1의보수
--------------------- ---------------------
디폴트 퍼미션 디폴트 퍼미션
bit& 연산은 이진연산이므로 8진수를 이진수로
바꿔서 계산해야 한다.
*. umask 값이 022(또는 0022) 일때의 디폴트 퍼미션?
666(8진수) --- 이진수 변환 --> 110 110 110(2진수)
022(8진수) --- 이진수 변환 --> 000 010 010(2진수)
000 010 010 -- 1의보수로 변환 --> 111 101 101(1의보수)
*. 1의 보수는 0은 1로 1은 0으로 서로 반대로 바꾸면 된다.
==> 110 110 110
bit&111 101 101
-------------
110 100 100 ==> 644
*. bit& 연산은 피연산자가 둘다 1일때 결과값이 1이되는 연산자.
ex)
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
*. 디렉토리도 같은 방법으로 계산하면 umask값이 022 일때
디렉토리 퍼미션은 755 가 됨.
exm)
rw- r-- --- file : 666 di :777
- x (027) x (027)
rwx r-x --- 640 750
umask 값은 얻을때는 디렉토리에서 빼서 해줘야 값이 정확하다
하지마 야매다. --;
집에서 풀기
*. 특수 퍼미션 예제
useradd 명령은 super user(root) 만 사용할 수 있는 명령어 입니다.
관리자가 sysadmin 그룹에 속해 있는 사람한테 일부 시스템을
관리할 수 있는 권한을 부여하고자 합니다.
sysadmin 에 소속된 계정한테 useradd 명령어를 사용하도록 하기위한
퍼미션 설정을 하시오.
a. sysadmin 그룹을 생성
b. 테스트하기위한 계정생성 ( ex. useradd -g sysadmin sysuser1,
useradd -g sysadmin sysuser2)
그런다음 sysadmin 그룹에 속해 있는 계정들이 계정을 생성할 수 있도록
useradd 명령어의 퍼미션 설정을 하고 테스트 하시오. (setuid 퍼미션이 필요함) (특수퍼미션을 사용해서 풀기)
*. 보안상 /etc/passwd, /etc/shadow, /etc/group 파일 퍼미션은 변경하면
안됩니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cron - 주기적으로 실행될 작업 예약
at - 한번만 실행될 작업 예약
cron 서비스 데몬은 crond.
at 서비스 데몬은 atd.
crontab 형식 및 옵션
#crontab --help
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
crontab 설정은 아래와 같다.
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
#--- 여기까지는 cron 작업을 위한 환경변수
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
#-- 여기는 주기적인 실행을 위한 설정 및 실행할 디렉토리.
형식:
분 시 일 월 요일 권한 실행명령 실행파일및 디렉토리
분: 0 ~ 59
시: 0 ~ 23
일: 1 ~ 31
월: 1 ~ 12
요일 : 0 ~ 6
예를 들면 아래내용은
22 4 * * 0 root run-parts /etc/cron.weekly
일요일 오전 4시 22분이 되면 root 권한으로 /etc/cron.weekly 에 있는 파일을 실행한다는 의미.
cron 사용 권한 설정
/etc/cron.allow 파일이 있는경우 cron.allow 에 기록이 된 사용자만 cron 을 사용할 수 있다.
/etc/cron.allow 이 없고 /etc/cron.deny 파일만 있는경우 /etc/cron.deny 에 기록이 안된 사용자만 cron을 사용할 수 있다.
두 파일이 모두 없으면 root 를 제외하고 아무도 cron을 사용할 수 없다.
at
- 주기적으로 반복 실행할 수 없고 예약된 시간에 한번만 실행한다.
주요옵션
at -l ; 예약된 작업 보기
atq ; 예약된 작업보기
atrm ; 예약된 작업삭제하기
작업예약하기 형식
at 예약날짜 및 시간
ex) at 03pm
at 07am
at -t 0809201830 => 2008년 9월 20일 18시 38분 , -t 날짜 및 시간을 표기하기 위한 옵션
at now + 1 hour
at now + 10 min
at now + 2 days
at now + 1 hour -f /usr/sbin/poweroff => 1 시간뒤에 시스템을 끈다.(-f 는 실행파일명을 적기 위한 옵션)
ex 2)
[root@/]# at -t 09201830
at> httpd start
at> <EOT>
job 19 at 2008-09-20 18:30
at 사용권한 (man at 중에서...)
If the file /etc/at.allow exists, only usernames mentioned in it are allowed to use at.
If /etc/at.allow does not exist, /etc/at.deny is checked, every username not mentioned in it is then allowed to use at.
If neither exists, only the superuser is allowed use of at.
An empty /etc/at.deny means that every user is allowed use these commands, this is the default configuration.
exm)
[user1 /home/user1]$at now +3min (엔터 치는 순간 부터 3분후에 실행한다.)
at> touch /tmp/at.txt
at> touch /tmp/at2.txt
at> <EOT>
job 1 at 2014-06-19 21:48
[user1 /home/user1]$
[user1 /home/user1]$atq
2 2014-06-19 21:52 a user1 (user1 권한으로 21:52분에 실행한다.)
[user1 /home/user1]$
[user1 /home/user1]$at -t 12251000 (12월25일 10시에 동작)
at> mail tst@navaer.com < /home/user1/mail.txt
at> <EOT>
job 7 at 2014-12-25 10:00
[user1 /home/user1]$
[root@centos test]# PS1="[\u \$PWD]#"
[root /tmp/test]#at 01pm Dec 25
at> touch /tmp/at99
at> <EOT>
job 8 at 2014-12-25 13:00
You have new mail in /var/spool/mail/root
[root /tmp/test]#
[root /tmp/test]#atq
7 2014-12-25 10:00 a user1
6 2016-06-19 21:54 a user1
5 2014-07-03 21:54 a user1
8 2014-12-25 13:00 a root
[root /tmp/test]#
[root /var/spool/at]#ls (아래 파일이 스캐줄이 저장된 파일이다 재부팅해도 유효)
a00005016527c6 a000070168fd5c a000090164ded4
a000060174e8e6 a000080168fe10 spool
[root /var/spool/at]#
[root /var/spool/at]#ls
a00005016527c6 a000070168fd5c a000090164ded4
a000060174e8e6 a000080168fe10 spool
[root /var/spool/at]#atrm 7
[root /var/spool/at]#at -l
6 2016-06-19 21:54 a user1
5 2014-07-03 21:54 a user1
9 2014-06-20 22:40 a root
8 2014-12-25 13:00 a root
[root /var/spool/at]#atrm 6
[root /var/spool/at]#at -l
5 2014-07-03 21:54 a user1
9 2014-06-20 22:40 a root
8 2014-12-25 13:00 a root
[root /var/spool/at]#
[root /root]$ date
2014. 06. 20. (금) 19:42:54 KST
[root /root]$ at 22:40
at> init 0
at>
[1]+ Stopped at 22:40
[root /root]$ at 22:40
at> ini 0
at> <EOT>
job 2 at 2014-06-20 22:40
[root /root]$ atq
2 2014-06-20 22:40 a root
1 2014-06-20 22:40 a root
[root /root]$ at 22:30 jun 23
at> init 0
at> <EOT>
job 3 at 2014-06-23 22:30
[root /root]$ at 22:30 jun 24
at> init 0
at> <EOT>
job 4 at 2014-06-24 22:30
[root /root]$
[root /root]$
'Linux' 카테고리의 다른 글
13일 차 리눅스 파일시스템 및 마운트 (0) | 2014.06.23 |
---|---|
12일차 cron 명령어. (0) | 2014.06.20 |
10일차 Process 관리 (0) | 2014.06.18 |
9일차 파일 권한(Permission) (0) | 2014.06.17 |
8일차 Shadow , Group 설정, 문제풀이 (0) | 2014.06.16 |