Брандмауэры и специальное программное обеспечение 8 Часть 4
Вид материала | Реферат |
СодержаниеСценарии rс, часть вторая |
- Муниципальное общеобразовательное учреждение средняя общеобразовательная школа №12, 174.77kb.
- Управление экономикой и создание экономических информационных систем Изучив данную, 148.93kb.
- Программное обеспечение ЭВМ, 209.59kb.
- Программное обеспечение вычислительной системы, 824.71kb.
- Учебная программа (Syllabus) Дисциплина: Интерфейсы компьютерных систем (iks 3304), 321.31kb.
- Реферат по Информационной безопасности Тема: «Антивирусы», 711.1kb.
- Пк программный комплекс; по программное обеспечение; ппо прикладное программное обеспечение, 208.41kb.
- Лекция 4 Обеспечивающие подсистемы асу. Математическое, программное, лингвистическое,, 59.3kb.
- Математическое и программное обеспечение систем оперативной оценки характеристик сложных, 247.51kb.
- Учебная программа (Syllabus) Дисциплина «Инструментальные средства разработки программ», 374.12kb.
Сценарии rс, часть вторая
Теперь, когда вы получили общее представление об инициализации системы, от ядра и до программы init, я расскажу вам о некоторых деталях этого процесса подробнее. В данном разделе главы я более подробно расскажу о механизме запуска-останова демонов при смене уровней выполнения. Поскольку программа init запускается ядром, она обладает привилегиями суперпользователя. Таким образом, всякий процесс, запущенный из строк 36-42 листинга 7.1, будет запущен на уровне привилегий суперпользователя, если, конечно, он явно не был запущен от имени другого (непривилегированного) пользователя. Если злоумышленнику удастся вставить туда команду запуска программы, сохраняющей коды клавиш, нажимаемых в ответ на приглашение входа в систему, и время от времени отсылающей этот файл по электронной почте на указанный им адрес, то вскоре в распоряжении злоумышленника окажутся имена и пароли всех активных пользователей системы. Если пользователь сможет в одном из каталогов /etc/rc.d/rc[l-5].d/ создать ссылку на какой-нибудь посторонний файл, то во время инициализации системы этот файл может быть запущен на выполнение от имени суперпользователя.
ВНИМАНИЕ
Все файлы, расположенные в каталоге /etc/red/ и его подкаталогах и запускаемые в процессе инициализации системы, выполняются от имени суперпользователя (в дистрибутиве Debian это замечание относится к подкаталогам rc.boot/, rc[0-6].d/ и init.d/, расположенным непосредственно в каталоге /etc). Если это ссылка, то независимо от того, ведет ли она за пределы /etc/rc.d/ или нет, файл, на который она указывает, все равно выполняется от имени суперпользователя. Любые изменения в существующих сценариях или добавления новых могут вступить в силу при следующей перезагрузке или смене уровня выполнения. Вывод очевиден: правом на запись в файлы и каталоги, используемые при инициализации системы, должен обладать только суперпользователь и никто другой.
Далее идет очень короткий обзор некоторых ключевых сценариев, включая один сценарий запуска-останова демона. Обучение чтению сценариев не входит в задачи данного текста, поэтому при возникновении трудностей следует обратиться к книге, посвященной разработке сценариев командной оболочки. Первым будет рассмотрен сценарий /etc/rc.d/rc (см. листинг 7.35). Номера строк в самом сценарии отсутствуют, они добавлены мною для удобства дальнейшего изложения.
Листинг 7.3. Сценарий re (номера строк добавлены искусственно) 1 #\/bin/bash 2#
- # гс This file is responsible for starting/stopping
- # services when the run!eve! changes.
5#
- # Temporary feature:
- # If the action for a particular feature in the new run-level
- # is the same as the action in the previous run-level, this
- # script will neither start nor start that feature, since that
- # would have no effect except to thrash the system for no reason.
- # Once all scripts are converted to use start-stop-daemon
- # to _start_ their daemons (most of them only use it to kill
- # them), this feature can be removed.
- #
- # $Id: rc.v 1.7 1999/07/14 21:36:04 ray Exp $
161
- # Author: Miquel van Smoorenburg,
- # Hacked to bits by Bruce Perens
- # Modified for COL by Raymund Will
- #
21
- # Hacked to bits by Bruce Perens
- export RC_DEBUG=false
- export RC_VERBOSE=true
- LOG=/dev/tty12
25
- true() { return 0; }
- false() { return 1; }
- Echo() {
- local a=$l; shift
- local o=$l; shift
- local i
32
- echo -n "$a" >> $LOG
- for i in "$@"; do
35 echo -n " '$i'" >> $LOG
36 done
37 echo "$o" >> $LOG
38 }
39
- # check for new-style boot-logger
- export SVIBooter=/sbin/booter
- [ -x $SVIBooter ] | SVIBooter=false
43
44 if $SVIBooter test; then
- export SVIuseBooter=true
- CMDS="add start"
47
- # redirect STDOUT and STDERR
- exec - >> $LOG 2>&1
50
- #DEBUGGING
- Booter() {
- local c=$l; shift
- local s
- local i
56
57 case "$c" in
58 add)
59 s="$l"; shift
- eval "$s" $c
- ;;
62 start)
- s="$l": shift
- eval "$s" $c "$@"
65 case $? in
- 0) $SVIBooter ok;;
- 1) $SVIBooter fail;;
- 2) $SVIBooter skip;;
- *) $SVIBooter "N/A" ;;
- esac
- ;;
72 stop)
- s="$l"; shift
- Echo "# Booter " "." "$s" $c "$@"
75 eval "$s" $c "$@"
76 ;;
77 *)
78 $SVIBooter $c "$@"
79 ;;
80 esac
- }
- [ -z "$PREVLEVEL" ] && {PREVLEVEL=N
83 else
- SVIuseBooter=false
- CMDS="start"
86
- # Set onlcr to avoid staircase effect.
- stty onlcr 0>&1
89
90 Booter() {
- local c="$1"; shift
- [ "$c" != "start" -a "$c" != "stop" ] && return 0
- local s="$l"; shift
- Echo "# eval " "." "$s" $c "$@"
- eval "$s" $c "$@"
96 }
97 fi
98
99 # Now find out what the current and what the previous run!eve! are.
100
- runlevel=$RUNLEVEL
- # Get first argument. Set new run!eve! to this argument.
- [ -n "$1" ] && runlevel=$l
104
105 previous=$PREVLEVEL 106
- Echo "runlevel=$runlevel previous=$previous" "."
- export runlevel previous
109
- RCD=/etc/rc.d
- # Is there an re directory for this new runlevel?
112 if [ -d "$RCD/rc$runlevel.d" ]; then
113 avoid="" # A list of start scripts I don't have to run.
114
- # First, run the KILL scripts.
- if [ "$previous" != N ]; then
117 for i in $RCD/rc$rumevel.d/K[0-9][0-9]*; do
- # Check if the script is there.
- [ -f "$i" ] || continue
120
121 suffix=${i#$RCD/rc$runlevel .d/K[0-9][0-9]}
122
- # Generate the name of the start script corresponding
- # to this stop script, the start script in the previous
- # level, and the stop script in the previous level.
- # Check these files, and see if the previous level's
- # files are links to the ones for this level.
- # If they are, this level treats this feature the same
- # as the previous level, and I don't have to run these
- # files.
- stopIt=true
- start=$RCD/rc$runlevel.d/S[0-9][0-9]$suffix
- previous_start=$RCD/rc$previous.d/S[0-9][0-9]$suffix
- previous_stop=$RCD/rc$previous.d/K[0-9][0-9]$suffix
135
136 if [ -f $previous_stop ] && [ $i -ef $previous_stop ]; then
- stopIt=false
- if [ -f $start ] || [ -f $previous_start ]: then
139 if [ -f $start ] &&
- [ -f $previous_start ] &&
- [ $start -ef $previous_start ]; then
142 stopIt=true
143 else
144 avoid=$avoid" "$start
145 fi
146 fi
147 fi
148
- # Kill it.
- $stopIt && Booter stop $i
151 done
152 fi
153
- Booter list "RUNLEVEL Run-level change..."
- Booter add_menu "BLANK4"
- Booter add_menu "T4 Entering run-level $runlevel:"
- for cmd in $CMDS; do
158
- # Now run the START scripts for this runlevel.
- for i in $RCD/rc$runlevel.d/S*; do
- # Check if the script is there.
- [ -f "$i" ] || continue
163
- startIt=true
- case " $avoid " in
166 *\ $i\ *) startIt=false;:
- esac
- if $startIt; then
- suffix=${i#$RCD/rc$runlevel.d/S[0-9][0-9]}
- previous_start=$RCD/rc$previous.d/S[0-9][0-9]$suffix
- stop=$RCD/rc$runlevel .d/K[0-9][0-9]$suffix
172 if [ -f $previous_start ] &&
- [ $i -ef $previous_start ] &&
- [ ! -f $stop ]; then
175 startlt-false
176 fi
177 fi
178
179 $startlt && Booter $cmd $i
180 done
181
182 if [ "$cmd" != "add" ]; then
183 Booter complete RUNLEVEL
184 else
- Booter end
- Booter activate RUNLEVEL
187 fi
188 done
189 fi
190
191 [ $SVIuseBooter = false ] && exit 0
192
193
194 if [ $runlevel != 5 ]: then
- sleep 1
- /usr/bin/chvt 1
197 else
- /sbin/booter list "FINAL"
- /sbin/booter add_menu "BLANK5"
- /sbin/booter add "KDE Starting KDE"
- /sbin/booter end
- /sbin/booter activate "FINAL"
- /sbin/booter item "KDE"
- sleep 1
- ( trap "" SIGHUP
- sleep 10
- echo -e "\n\nPlease switch to a different virtual console for login!\n\n"
208 ) > /dev/tty7 &
209 fi
210
- Booter quit
- # eof /etc/rc.d/rc
Строки, начинающиеся с символа #, считаются комментариями (за исключением самой первой строки, в которой указывается программа, используемая для выполнения команд сценария) и при выполнении сценария игнорируются. В строках 2-117 происходит инициализация переменных, определяются текущий и предыдущий уровни выполнения, а также сравниваются сценарии запуска-останова из соответствующих этим уровням подкаталогов каталога /etc/rc.d.
В строках начиная с 119 и до конца файла сначала выполняются сценарии останова демонов, ненужных на новом уровне выполнения. После этого осуществляется выполнение сценариев запуска демонов, которые должны выполняться на новом уровне, но сейчас не выполняются.
Следующим сценарием, который мы рассмотрим, будет типичный сценарий запуска-останова демона. Множество подобных сценариев расположено в каталоге /etc/re.d/init.d. Большинство таких сценариев очень похожи на сценарий из листинга 7.46.
Листинг 7.4. Сценарий старта-останова демона named
- #!/bin/sh
- #
- # named This shell script takes care of starting and stopping
- # named (BIND DNS server).
5#
6
- NAHE=named
- DAEMON=/usr/sbin/$NAME
9
10 # Source function library.
11 . /etc/rc.d/init.d/functions
12
- # Source networking configuration.
- . /etc/sysconfig/network
15
- # Check that networking is up.
- [ ${NETWORKING} = "no" ] && exit 0
18
- [ -r /etc/sysconfig/daemons/$SUBSYS ] || ONBOOT=Yes
- [ ! -r /etc/sysconfig/daemons/$SUBSYS ] || . /etc/sysconfig/daemons/$SUBSYS
- [ "$ONBOOT" = "no" -a "$PROBABLY" = "booting" ] && exit 0
22
23 [ -x $DAEMON ] || exit 0
24
25
- # See how we were called.
- case "$1" in
28 start)
29 [ -e /var/lock/subsys/$SUBSYS ] && exit 1
30
31 [ -f /etc/named.conf ] |] exit 0
32
- # Start daemons.
- echo -n "Starting BIND DNS server: "
- start-stop-daemon -S -n $NAME -x $DAEMON -- $OPTIONS
- echo "."
- touch /var/lock/subsys/$SUBSYS
- ;;
39
40 stop)
41 [ -e /var/lock/subsys/$SUBSYS ] || exit 0
42
- # Stop daemons.
- echo -n "Stopping BIND DNS server: "
- start-stop-daemon -K -p /var/run/$NAME.pid -n $NAME
- echo "."
- rm -f /var/lock/subsys/$SUBSYS
- ;;
49
50 restart)
51 [ -e /var/lock/subsys/$SUBSYS ] || exit 0
52
- echo -n "Re-starting BIND DNS server: "
- start-stop-daemon -K -s 1 -p /var/run/$NAME.pid -n $NAHE
- echo "."
- ;;
57
58 *)
- echo "Usage: named {start|stop|restart}"
- exit 1
61 esac
62
63 exit 0
Как и ранее, строки, начинающиеся с символа #, адресуются читающему сценарий пользователю и при выполнении игнорируются.
В строках 7 и 8 инициализируются некоторые переменные, а строки 11 и 14 включают в исходный текст сценария некоторые глобальные переменные из конфигурационного каталога системы (такой каталог присутствует далеко не во всех комплектах Linux). Строка 17 проверяет, запущена ли сетевая подсистема, и если нет и в случае, если сеть не работает, прекращает выполнение сценария (бессмысленно запускать DNS-сервер в отсутствие сети). Строка 23 позволяет убедиться в том, что файл демона существует и является исполняемым.
После этого выполняется обработка аргумента, переданного в сценарий. Если использован аргумент start, выполняются строки 29-38. Если использован аргумент stop и демон запущен (это проверяется в строке 41), то выполняются строки 44-48. Если аргументом является restart и демон запущен (это проверяется в строке 51), то выполняются строки 53-56, посылающие ему сигнал SIGHUP (1). Этот сигнал предписывает демону заново прочесть свой конфигурационный файл и продолжить работу.
Наконец, если аргумент не был распознан или попросту отсутствует, выдается подсказка по использованию сценария.
Примерно так же работают и все остальные сценарии старта-останова в стиле System V. Детали зависят от дистрибутива, но общий подход везде один и тот же. Инициализация в стиле BSD происходит несколько по-другому: вместо многих небольших сценариев в этой системе используется несколько больших и отсутствует механизм start/stop/restart.