[Cron] Unix, Linux
주기적인 프로그램 수행 : cron 시설 [ 04/05/27 03:18 ] | |
cron은 주기적으로 프로그램을 수행할 수 있게 해주는 유닉스 시설이다.
crontab 파일
보통 : /var/spool/cron/crontabs / FreeBSD : /var/cron/tabs, /etc/crontab
리눅스 : /var/spool/cron(레드햇) / /var/spool/cron/tabs(수세)
/etc/crontab(레드햇,수세) |
crontab 형식
보통 : 시스템 V (사용자 필드가 없음)
BSD : /etc/crontab(사용자 이름이 6번째 필드여야 함) |
cron.allow, cron.deny 파일
보통 : /var/adm/cron / FreeBSD : /var/cron
리눅스 : /etc(레드햇) , /var/spool/cron(수세)
솔라리스 : /etc/cron.d |
관련기능
보통 : 없음 / FreeBSD : periodic 유틸리티
리눅스 : /etc/cron.*(houry, daily, weekly, monthly)
레드햇 : anacron 유틸리티 |
cron 로그 파일
보통 : /var/adm/cron/log / FreeBSD : /var/log/cron
리눅스 : /var/log/cron / 솔라리스 : /var/cron/log |
crond의 pid 가 기록되어 있는 파일
보통 : 없음 / FreeBSD : /var/run/cron.pid
리눅스 : /var/run/crond.pid(레드햇), /var/run/cron.pid(수세) |
cron을 시작하는 부팅 스크립트
FreeBSD : /etc/rc / HP-UX : /sbin/init.d/cron
리눅스 : /etc/init.d/cron / 솔라리스 :/etc/init.d/cron |
부팅 스크립트 설정 파일 cron 관련 엔트리
FreeBSD : /etc/rc.conf / cron_enable="YES",cron_flags="args-to-cron"
HP-UX : /etc/rc.config.d/cron (CRON=1) / 리눅스 : 사용하지 않음
솔라리스 : /etc/default/cron (CRONLOG=yes) |
crontab 파일
무엇을 실행하고 언제 실행할지 여부를 결정하는 파일, cron 스케줄.
*시스템 V 방식 에서 사용자는 기본적으로 crontab 엔트리는 사용자마다 /var/spool/cron/crontabs/사용자명 디렉토리에 저장된다.
예) /var/spool/cron/crontabs/root
* BSD 방식은 전통적으로 /etc/crontab 파일 하나만 사용한다.
*FreeBSD,리눅스 시스템은 파일도 사용하고 디렉토리도 사용한다.
crontab 파일은 직접적인 편집보다 crontab 명령어를 이용하여 생성 수정한다. |
crontab 파일의 엔트리
|-----------------------------------------------|
| 필드 | 표기되는 대상 | 사용가능한 값 |
|-----------------------------------------------|
| 필드1 | 분 | 0 - 59, * |
| 필드2 | 시간 | 0 - 23, * |
| 필드3 | 일 | 1 - 31, * |
| 필드4 | 월 | 1 - 12, * |
| 필드5 | 요일 | 0 - 6 (0=sunday), * |
| 필드6 | 명령(행의 끝까지) | |
|-----------------------------------------------|
minutes hours day-of-month weekday command
1.각필드는 공백으로 구분하고 요일후에는 모든것을 명령어로 취급하므로 공백이 포함될수 있다.
2.필드에는 단일 숫자, 숫자-숫자(범위) , 쉼표로 분리한 단일숫자 또는 범위 목록, 애스터리크 사용가능
3. 첫문자가 # 일경우 주석처리
4. 명령어에 퍼센트기호(%)가 있으면 기호 이후에 나타나는 텍스트를 표준 입력으로 사용한다. 이후에 나타나는 퍼센트 기호는 텍스트를 여러행으로 분리하는 데 사용한다.
예) 30 11 31 12 * /usr/bin/wall%Hppy New Year!%Let's make it treat!
5. 요일과 날짜는 OR 처리된다고 생각할수 있다.
예) * * 1 1 1 /usr/local/bin/test55 (1월1일 과 매 월요일에 실행된다)
<참고> BSD 시스템에서는 여섯 번째 필드는 명령어를 실행할 사용자 계정이고 요일도 달라서 월요일이 1이고 일요일이 7이다
예) 0 3 * * 6-7 root /var/adm/weekend.sh
|
FreeBSD, 리눅스 crontab 엔트리 형식 향상점
1. 월과 요일은 처음 세글자로 줄여 지정가능 (예, mon, jan, feb....)
2. 일요일을 0과 7모두 사용 가능
3. 범위 목록을 동시에 사용가는 (예, 2,4,6-7) -> HP-UX에서도 가능함
4. /n 을 통해 주기를 지정할수 있다.
(예) 시를 8-18/2 -> 8시부터18시까지 2시간마다
분을 */5 5분마다
5. crontab 파일에서 본 셸 형식으로 환경 변수 정의 가능
(예) MAILTO=kenauros
6. FreeBSD 시스템에서는 스케쥴 필드 대신 특수 문자열을 사용할수 있다
@reboot
@yearly 1월1일 자정
@monthly 매달 1일 자정
@weekly 매주 일요일 자정
@daily 자정
@hourly 매시간 0분
|
crontab 엔트리 추가 하기
$crontab mycron
/var/spool/cron/crontabs/유저명 에 mycron 파일 생성
$crontab -l
crontab 엔트리 보기
$crontab -r
crontab 엔트리 제거
$crontab -e
직접 crontab 파일을 변경
#crontab -e adm
루트가 adm 의 crontab 엔트리 변경
FreeBSD,리눅스 에서는 -u 를 통해 사용자를 지정가능
#crontab -e -u adm
|
cron 보안 문제
cron.allow 파일이 존재할경우 사용자 이름이 있어야만 crontab을 실행할수 있다
cron.allow 파일은 없지만 cron.deny가 있으면 cron.deny 에 없는 사람만 crontab
명령어를 사용할수 있다. cron.deny가 빈파일이면 아누나 cron 기능을 사용할수 있다.
두 파일 모두 없으면 루트만 하용할수 있다.(리눅스 , FreeBSD 에서는 두파일 모두 없으면
아무나 사용할수 있다.)
|
[Cron] Solaris, HP, AIX
[Solaris]
솔라리스에서는 crondtab -e하면 않되네요..
어떻게 해야 편집되요?
EDITOR=vi
export EDITOR
[HP]
$ crontab -e
crontab: you are not authorized to use cron. Sorry.
$ crontab -l
crontab: you are not authorized to use cron. Sorry.
#vi /var/adm/cron/cron.allow
# ps -ef | grep cron
root 1132 1 0 Mar 31 ? 0:00 /usr/sbin/cron
root 10570 10174 0 09:50:09 pts/tc 0:00 grep cron
#cd /sbin/init.d
# ./cron stop
cron stopped
# ps -ef | grep cron
root 10579 10174 0 09:50:33 pts/tc 0:00 grep cron
# ./cron start
cron started
#
[AIX]
# more /etc/inittab
cron:23456789:respawn:/usr/sbin/cron
...
http://unix.co.kr/data/irix/?p=11
inittab: script for the init process |
- 형식: id:level:action:process
- 기능:
- id : 유일한 두개 또는 하나의 문자.
- level: (0~6, s, S)
- level이 빈란이면 action은 모든 level들에대하여 가능.
- action : 어떤 행동을 취해야 하 는지를 알고있는 스크립를 실행.
- action의 종류는
- sysinit int가 시스템 콘솔을 다루기를 시도하기전에 수행해야할 활동을 해라.
- respawn 프로세스를 시작하고, 이것이 죽으면 자동으로 재 시작해라.
- wait 프로세스를 시작하고, 이 실행 상태를 위한 다음 에트리로 가기 전에 , 끝날때까지 기다려라.
- boot 단지 부팅시에만 에트리를 시작한다.
- powerfail init가 power fail 신호를 받았을때 실행 해라.
- bootwait 이것은 시스템이 부팅된후 single-user에서 multi-user 상태로 갈때 실행된다.
- off 이것은 무시해라.
- initdefault 디폴트 실행 단계를 지정해라. 일반적으로 2혹은 3으로 정해라.
- once 이미 실행하고 있지않으면 프로세스를 시작한다.
- bcheckrc root file system을 준비한다.
- brc /etc/fstab을 체크해서 모든 파일 시스템을 마운트 시켜라.
- rc0 shutdown level script
- rc2 multiuser level script
- uadmin 시스템 종료를 초기화하는 명령어.
- process :This is a sh command to be executed.
- 예;
- is:2:initdefault:
fs::sysinit:/etc/bcheckrc </dev/console >/dev/console 2>&1
mt::sysinit:/etc/brc </dev/console >/dev/console 2>&1
link::wait:/etc/lnsyscon > /dev/console 2>&1 < /dev/null
s0:06s:wait:/etc/rc0 >/dev/console 2>&1 </dev/console
s1:1:wait:/etc/shutdown -y -iS -g0 >/dev/console 2>&1 </dev/console
s2:23:wait:/etc/rc2 >/dev/console 2>&1 </dev/console
s3:3:wait:/etc/rc3 >/dev/console 2>&1 </dev/console
s4:06:wait:/etc/umountfs > /dev/console 2>&1
of:0:wait:/etc/uadmin 2 0 >/dev/console 2>&1 </dev/console
RB:6:wait:/etc/init.d/announce restart
rb:6:wait:/etc/uadmin 2 1 >/dev/console 2>&1 </dev/console
#
# on-board ports or on Challenge/Onyx MP machines, first IO4 board ports
t1:23:respawn:/sbin/getty ttyd1 co_9600 # alt console
t2:23:off:/sbin/getty -N ttyd2 co_9600 # port 2
t3:23:off:/sbin/getty -N ttyd3 co_9600 # port 3
t4:23:off:/sbin/getty -N ttyd4 co_9600 # port 4
- option:
SEE ALSO
getty(1M), init(1M), sh(1), who(1), exec(2), open(2), signal(2).
|
변경 ..
cron:23456789:wait:/usr/sbin/cron
재부팅 후..
#ps -ef | grep cron
#kill -9 ??
#/usr/sbin/cron start &
stopsrc [-h host] [-f | -c] -s subsystem_name
startsrc [-h host] [-e environment] [-a argument] -s subsystem_name
#stopsrc -s sendmail
|
[Cron][Log] SecureOS & Cron_Shellscript
SecureOS & Shellscript
#vi shellscript.pl
#/bin/bash
chmod 777 /root/testdir/testfile
cat /root/testdir/testfile
#./shellscript.pl
번호 서버 시간 접속IP목적IP 사용자 프로세스 대상 접근형태 대응방법 롤 인증서비스 터미널 시스템콜
1 WOW7.3 08-11 01:18 192.168.22.1 (102 : root : 0) chmod (3610,47421) /root/testdir ACTL : W DENY Test_shellscript chmod
2 WOW7.3 08-11 01:18 192.168.22.1 (102 : root : 0) cat (3611,47459) /root/testdir ACTL : R DENY Test_shellscript pts/1 open
----------------------------------------------------------------------------------------
SecureOS & Cron
crontab -e 명령어를 통해서 예약작업을 설정하면..
/var/spool/cron/사용자명 파일로 저장됩니다.
$ crontab -l
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * cat /root/testdir/procfile
# crontab -l
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * cat /root/testdir/testfile
번호 서버 시간 접속IP목적IP 사용자 프로세스 대상 접근형태 대응방법 롤 인증서비스 터미널 시스템콜
1 WOW7.3 08-11 01:41 0.0.0.0 (-1 : a : 102) cat (1382,47459) /root/testdir ACTL : R ACPT Test_shellscript notty open
2 WOW7.3 08-11 01:41 0.0.0.0 (-1 : root : 0) cat (1381,47459) /root/testdir ACTL : R ACPT Test_shellscript notty open
----------------------------------------------------------------------------------------
SecureOS & Cron+Shellscript
# crontab -l
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * /root/HZ_Test/shellscript.pl
번호 서버 시간 접속IP목적IP 사용자 프로세스 대상 접근형태 대응방법 롤 인증서비스 터미널 시스템콜
1 WOW7.3 08-11 01:53 0.0.0.0 (-1 : root : 0) chmod (1309,47421) /root/testdir ACTL : W ACPT Test_shellscript notty chmod
2 WOW7.3 08-11 01:53 0.0.0.0 (-1 : root : 0) cat (1310,47459) /root/testdir ACTL : R ACPT Test_shellscript notty open
목적 :
Cron을 사용하면서 luid=-1값을 가지고 cp, sh 등의 프로세스를 가지고 /var/adm에 접근하는 문제를 해결하도록 모색해 본다.
테스트 환경 :
Linux, Solaris, HP, AIX에 대해 테스트 하였습니다.
테스트 내용 :
시스템이 부팅된 후 Cron을 설정하면 다음과 같이 luid=-1 이 나옵니다.
17 03-22 09:35 155 0.0.0.0 (-1 : root : 0) abc.sh (8606,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255
18 03-22 09:35 155 0.0.0.0 (-1 : jhlee : 100) user.sh (8612,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255
root의 사용자로 로긴한 후 root 사용자가 Cron을 재시작하면 다음과 같이 luid=0 이 나옵니다.
19 03-22 09:38 155 0.0.0.0 (0 : root : 0) abc.sh (8652,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255
20 03-22 09:38 155 0.0.0.0 (0 : jhlee : 100) user.sh (8657,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255
(단 AIX만이 프로세스 명이 abc.sh이라고 나오지 않고 sh로 나왔습니다.)
결론 :
Cron을 사용하게 되면서 /var/adm 의 디렉토리에 cp, sh .. 등의 프로세스를 설정해 주어야 했는데..
Cron을 root가 재시작하고 정책에 관리자로서 root를 포함하여 위의 문제를 우회할 수 있을것 같습니다.