Что это за программа? Основная ее задача - убить все текущие процессы и запустить другие, соответствующие новому режиму выполнения. Например, вы работали на 3 уровне (полный многопользовательский режим) и хотите перейти на 1 (однопользовательский). Как это происходит? Все программы многопользовательского режима завершаются, а потом активизируются только те процессы, которые соответствуют однопользовательскому режиму, и ничего лишнего в памяти не должно быть. Именно это и делает программа /etc/rc.d/rc.
Перейдите в папку /etc/rc.d/ и посмотрите на ее содержимое. Помимо программы, здесь есть каталоги с именами rcX.d, где X - это число от 0 до 6, соответствующее уровню выполнения. В каждой папке есть файлы, имена которых начинаются с буквы "K" или "S". При выходе с уровня выполняются все файлы первого типа, они уничтожают все запущенные на нем процессы. А при входе на уровень выполняются файлы на букву "S", которые активизируют все необходимые процессы данного уровня.
Таким образом, система может обезопасить себя тем, что на одном уровне будут работать только те программы, которые должны быть в однопользовательском режиме, и многопользовательское вторжение становится невозможным при правильном конфигурировании скриптов, запускающих и останавливающих процессы. Конечно же, вручную править скрипты не приходится, и система следит за файлами без нас, но знать о такой особенности загрузки вы должны. Например, вы хотите, чтобы какой-то демон не запускался при старте системы на третьем уровне. Для этого можно просто удалить соответствующий файл из каталога /etc/rc.d/rc3.d, или сделать так, чтобы его имя не начиналось с букв "S" или "K".
В каталоге /etc/rc.d/init.d находятся скрипты, которые запускают, останавливают или перезапускают сервисы в системе. Именно эти файлы используются при переходе с одного уровня на другой.
Очень интересной является строка:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
Она выполняется на любом уровне, потому что второй аргумент отсутствует. Третий параметр равен ctrlaltdel. Это значит, что по нажатию клавиш <Ctrl>+<Alt>+<Del> будет выполнена указанная команда. В большинстве ОС такая комбинация используется для перезагрузки системы. Какая директива выполнится в Linux? Это /sbin/shutdown -t3 -r now. Мы уже знаем, что команда shutdown с ключом -r - это перезагрузка. Параметр -tX задает время задержки, где X - количество секунд до рестарта.
Получается, что по нажатию клавиш <Ctr>+<Alt>+<Del> запустится директива, требующая через три секунды перезагрузить систему.
Теперь посмотрим на строку, которая будет выполнена при сбое питания:
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
Строка выполняется на любом уровне. Здесь снова участвует команда shutdown, но теперь с другими ключами:
□ -f - отменяет проверку диска fsck;
□ -h - указывает на необходимость выключения питания;
□ +2 - задает время в минутах до перезагрузки;
□ далее идет в кавычках сообщение, которое появится на каждой консоли. В графическом режиме все пользователи увидят окно с предупреждением такого же содержания.
Обратите внимание, что время до перезагрузки 2 минуты. Это очень мало, т.к. простые источники бесперебойного питания могут продлить работу компьютера до 20 минут. А если учесть, что серверы чаще всего стоят без монитора или, в крайнем случае, с выключенным дисплеем, то жизнь сервера может быть продлена до 40 минут. Значение в две минуты явно занижено, и я рекомендую проверить документацию на ваш источник бесперебойного питания и увеличить тайм-аут, чтобы сервер не ушел в перезагрузку раньше времени.
Теперь посмотрим, что происходит при восстановлении питания:
pr:12345:powerokwait:/sbin/shutdown -с "Power Restored; Shutdown Cancelled"
Команда выполняется на уровнях с 1 по 5 и отменяет перезагрузку. На 0 и 6 уровнях, когда уже начался процесс выключения системы или рестарт, аннулировать что-либо уже поздно.
Отмена происходит вызовом команды shutdown с ключом -с, после чего идет текст сообщения о том, что питание восстановилось, и можно работать.
Теперь посмотрим на следующие строки:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
Здесь на шести терминалах (ttyX, где X - это номер терминала или виртуальной консоли) выдается сообщение на вход в систему. Это не есть хорошо, потому что хакер может воспользоваться любой консолью для проникновения в систему (в качестве администратора). Чтобы этого не произошло, можно запретить вход со всех терминалов, кроме одного. Для этого нужно заменить флаг respawn на off.
Вообще-то можно это и не делать. Есть способ лучше - конфигурирование настроек tty, которые находятся в файле /etc/securetty. Пример такого файла вы можете увидеть в листинге 3.3.
Листинг 3.3. Файл /etc/securetty
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
Этот файл определяет консоли и терминалы, с которых можно подключаться с правами root. Первые одиннадцать строк определяют 11 виртуальных консолей, остальные - назначают окна терминалов. Чтобы разрешить вход с одного терминала, оставьте только строку tty1, а все остальные удалите. Таким образом, терминалы будут доступны для работы, но только с первого можно подключиться с правами root.
Для переключения между виртуальными консолями нужно нажать клавишу <Alt> и любую клавишу от <F1> до <F6>.
Самая последняя строка выполняется только на 5 уровне:
x:5:respawn:/etc/X11/prefdm -nodaemon
Эта строка запускает команду /etc/X11/prefdm, которая переводит работу в графический режим и отображает соответствующее окно входа в систему, которое мы рассматривали в разд. 2.7. Если вы используете текстовый режим, то для запуска графической оболочки можно использовать описанную ранее команду.
Если нужно, чтобы программа инициализации просмотрела конфигурационный файл inittab без смены уровня, то можно вручную принудить init запуститься. Для этого выполните команду:
/etc/init q
Для перехода на другой уровень необходимо выполнить команду:
telinit X
где X - новый уровень, на котором должна работать ОС. Эта команда удобна, если вы грузитесь на пятом уровне. В этом случае легко перейти в текстовый режим на уровень 3. Если завершать графический режим штатными средствами оболочки, то ОС не будет выходить в текстовый режим, а останется графическое приглашение на ввод пароля.
А теперь небольшой фокус. Что будет, если воспользоваться командой telinit 6? Конечно же, начнется перезагрузка системы (в соответствии с назначением 6 уровня). А при выполнении команды telinit 0 (переход на нулевой уровень) произойдет выключение системы, как при выполнении команды shutdown -h now.
И все же я не советую употреблять переходы на 0 и 6 уровни, а использовать законный выход, т.е. команду shutdown.
3.2.4. Интересные настройки загрузки
Рассмотрим парочку файлов, которые хоть и незначительно, но влияют на загрузку.
Прежде чем появится приглашение ввести пароль, на экране отображается текстовая информация, пояснение. Чаще всего, здесь разработчик пишет имя дистрибутива и его версию. Эта информация хранится в файле /etc/issue, и вы легко можете его изменить в любом текстовом редакторе, в том числе и во встроенном в Midnight Commander.
После входа в систему тоже может выводиться текстовое сообщение, но по умолчанию в большинстве дистрибутивов оно отсутствует. Текст этого сообщения находится в файле /etc/motd, он может содержать новости для пользователей системы или каким-либо образом информировать об изменениях. Например, каждого первого числа месяца напоминать о необходимости сменить пароль.
3.3. Регистрация в системе
Теперь познакомимся с процессом регистрации пользователя в системе. Это поможет вам лучше понять систему безопасности, которая используется в ОС Linux при авторизации.
Мы уже знаем из разд. 3.2, что программа init загружает виртуальные консоли getty. Каждая из них для работы требует авторизации и запрашивает имя пользователя. Для этого на экран выводится окно приглашения. Введенное имя пользователя передается программе login, а она в свою очередь запрашивает пароль.
Программа login сравнивает имя пользователя со списком имен в файле /etc/password, а пароль - с соответствующей записью в файле /etc/shadow. Все пароли в файле хранятся только в зашифрованном виде. Для сопоставления введенный пароль тоже шифруется, и результат сравнивается со значением в файле /etc/shadow для указанного имени пользователя.
Почему так сложно происходит проверка? Просто все пароли в файле /etc/shadow зашифрованы необратимым алгоритмом (чаще всего используется алгоритм MD5). Это значит, что математическими методами из результата кодирования нельзя получить исходный пароль, поэтому возможен только подбор. Для этого существует несколько очень простых программ. Чем проще пароль и меньше его длина, тем быстрее программа найдет нужный вариант. Если пароль сложен и его длина более 8 символов, а лучше - свыше 16, то подбор может отнять слишком много времени.
Если идентификация пользователя состоялась, то программа login выполнит все автоматически загружаемые сценарии и запустит оболочку (командную строку), через которую и будет происходить работа с системой. Если проверка прошла неудачно, то система вернет управление консоли getty, которая снова запросит ввод имени пользователя.
Таким образом, пока мы не пройдем авторизацию через программу login, запустить командную оболочку (Shell) невозможно, нам останется доступной лишь консоль getty, которая умеет только запрашивать имя пользователя и передавать его программе login.
Теперь обсудим некоторые проблемы, которые могут возникнуть при входе в систему, и посмотрим, как они решаются.
3.3.1. Теневые пароли
В старых версиях Linux список пользователей и пароли хранились в файле /etc/password. Это не очень хорошо, потому что данный файл должен быть доступен для чтения всем пользователям, т.к. имена пользователей требуются очень многими безобидными программами. Например, при выполнении команды ls (просмотр файлов текущего каталога) нужно получить доступ к списку пользователей для получения имен владельцев файлов. Поскольку файл легко прочитать любому пользователю, то и зашифрованные варианты паролей тоже доступны, а значит, любой хакер сможет запустить подбор паролей и ждать заветного часа X, когда будет найдена нужная комбинация.
Чтобы защитить пароли, во всех современных версиях Linux их прячут в файл /etc/shadow, который доступен для чтения только администратору root. Файл /etc/password остался открытым для всех, но теперь в нем уже нет пароля. Давайте посмотрим, как выглядит файл /etc/password. Для примера я взял только верхние три строки из своего файла:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
Каждая строка содержит информацию о пользователе - семь аргументов, разделенных между собой двоеточием. Давайте разберем каждый из них:
□ имя пользователя - login, который вы вводите;
□ пароль - если вывод затенен, то вместо пароля будет стоять символ x;
□ UID - уникальный идентификатор пользователя;
□ GID - уникальный идентификатор группы;
□ информация о пользователе - здесь может быть полное имя, адрес и т.д.;
□ домашняя директория - каталог, принадлежащий пользователю, с которым он начинает работать при входе в систему;
□ интерпретатор команд - оболочка, которая будет выполнять команды пользователя. Если интерпретатора команд не должно быть, то указывается файл /sbin/nologin.
Теперь посмотрим на строку для пользователя root. Первый параметр - это имя, и, конечно же, тут написано root. Пароля в файле нет, т.к. вместо него мы видим символ x (или !!), а он находится в соответствующей записи файла /etc/shadow.
Следующие два параметра - уникальный идентификатор пользователя (UID) и уникальный идентификатор группы (GID). В файле не может быть двух записей с одним и тем же UID. По GID система находит группу, в которую входит пользователь и, соответственно, определяет права, которые даны этой группе, а значит, и пользователю.
Информация о пользователе может быть любой, и на работу системы она не влияет. Это просто пояснение, которое администратор использует по своему усмотрению.
Далее идет домашняя директория. Это каталог, который открывается пользователю при входе в систему.
Последний параметр - это командный интерпретатор, который будет обрабатывать пользовательские запросы. Наиболее распространенным является интерпретатор /bin/bash. Если команды пользователя не должны выполняться, то в качестве этого параметра устанавливается /sbin/nologin. Именно это значение введено для записей bin, daemon и многих других, потому что под ними нельзя входить в систему и они предназначены только для внутреннего обеспечения безопасности определенных программ.
Теперь посмотрим на файл /etc/shadow, а точнее, возьмем только первые три строки. Для примера этого будет достаточно:
root:$1$1emP$XMJ3/GrkltC4c4h/:12726:0:99999:7:::
bin:*:12726:0:99999:7:::
daemon:*:12726:0:99999:7:::
Здесь также несколько параметров, разделенных двоеточием. Нас будут интересовать первые два: login и пароль. По имени пользователя происходит связь записи из файла /etc/shadow с файлом /etc/password. А вот во втором параметре уже находится настоящая зашифрованная версия пароля. Но если вместо него стоят звездочки, то это запрет на использование записи. Например, для пользователей bin и daemon установлены именно звездочки, а значит, под этими учетными записями нельзя входить на компьютер.
3.3.2. Забытый пароль
Что делать, если вы забыли пароль, или хакер проник в систему и изменил его? Действительно, ситуация не из приятных, но все решаемо. Если у вашей учетной записи есть доступ к файлу /etc/shadow, то можно заняться его редактированием, а если нет, то посмотрим, как получить доступ с загрузочной дискеты.
Загрузившись с дискеты, вы должны войти в систему как root и подключить тот жесткий диск (или раздел диска), на котором находится папка /etc. Для этого нужно выполнить команду:
/sbin/mount -w hda1 /mnt/restore
Теперь директория /mnt/restore (желательно, чтобы она существовала до выполнения команды) указывает на главный раздел вашего жесткого диска, а файл паролей находится в каталоге /mnt/restore/etc/shadow. Откройте этот файл в любом редакторе и удалите пароль администратора root (просто сотрите весь текст между первым и вторым знаком двоеточия). В моем случае получилось:
root::12726:0:99999:7:::
Теперь обычным способом загружайте систему и в качестве имени пользователя вводите имя root. У вас даже не спросят пароль, потому что он пустой. Не забудьте поменять пароль, иначе это будет опасно для жизни. Это как электрику работать под высоким напряжением без средств защиты ☺.
Для смены пароля вы должны набрать команду passwd root, в ответ запустится программа, которая попросит вас дважды ввести код. Такой подход исключает случайную опечатку при наборе и может с определенной долей вероятности гарантировать, что сохранен верный пароль.
3.3.3. Модули аутентификации
Аутентификация на основе двух файлов /etc/passwd и /etc/shadow немного устарела и предоставляет нам слишком скудные возможности. Разработчики ядра ОС Linux стараются исправить ситуацию с помощью добавления новых алгоритмов шифрования, но все эти попытки чисто косметические, а нам необходимо кардинальное изменение.
Абсолютно новое решение для реализации аутентификации предложила компания Sun - Pluggable Authentication Modules (РАМ, подключаемые модули аутентификации).
Преимущество модульной аутентификации заключается в том, что не требуется перекомпиляция программы для их использования. Существуют модули для основных методов аутентификации, таких как Kerberos, SecureID, LDAP и др.
Конфигурационные файлы для каждого сервиса, который может использовать РАМ, находятся в директории /etc/pam.d. В большинстве случаев вам не придется создавать эти файлы вручную, потому что они устанавливаются во время инсталляции программы из RPM-пакета. Но вы должны знать их структуру, чтобы можно было изменить какие-то параметры в случае необходимости.
Каждая строка в конфигурационном файле состоит из четырех полей, разделенных пробелами:
□ тип модуля - может принимать одно из следующих значений: