Linux глазами хакера

Флёнов Михаил Евгеньевич

Глава 3

Добро пожаловать в Linux

 

 

В этой главе мы начнем знакомиться с самим Linux. Надеюсь, что вы уже установили систему, потому что все, что мы будем рассматривать, правильнее всего тут же проверять на практике. Только так материал будет лучше откладываться в памяти и усваиваться.

Нам предстоит поближе познакомиться с файловой системой, основными конфигурационными файлами и командами, которые пригодятся в каждодневной работе. ОС Linux может работать в двух режимах — графическом и текстовом. Многие авторы почему-то ограничиваются рассмотрением только текстового режима в консоли. Это пугает тех пользователей, которые привыкли к Windows и интуитивно понятному интерфейсу. Мы будем разбирать одновременно оба режима. И все же, консоли будет уделяться достаточно много внимания, потому что зачастую с ее помощью можно быстрее, нежели через графические утилиты, решить какие-либо проблемы. Я постараюсь показать вам преимущество консоли перед курсором мыши. Дело в том, что серверы на предприятиях должны стоять в отдельной комнате и, возможно, даже без монитора. Управление происходит через удаленную консоль, и визуальные возможности Linux не используются. Тогда зачем загружать тяжелые графические библиотеки, файлы и другие ресурсы? Это же пустое расходование памяти!!! Не лучше ли ее освободить для более полезных вещей.

Графический режим необходим для работы с пользовательскими утилитами. Он также может быть полезен на первоначальном этапе настройки сервера. А если учесть, что не все компьютеры на базе Linux являются серверами, и домашние станции тоже могут работать на этой ОС, то удобный графический интерфейс необходим.

Как видите, возможность работать в двух режимах — это преимущество Linux, а не недостаток. Если бы в Windows можно было выгрузить из памяти графическую оболочку и оставить только командную строку, то вы смогли бы сэкономить драгоценную память и повысить надежность этой ОС. Когда не работают графические библиотеки, то и проблемы с ними отсутствуют. Сколько раз мы видели синие экраны с ошибками в драйвере видеокарты? В консоли Linux этого произойти не может.

Если вы настраиваете домашний компьютер (или маленькую сеть), то графическую оболочку можно оставить. Но если это промышленный сервер, требующий максимальной доступности, то я рекомендую оставить компьютер в текстовом режиме, чтобы обезопаситься от лишних сбоев и повысить производительность.

 

3.1. Файловая система

 

Прежде чем перейти к настройкам системы, нам нужно познакомиться поближе с файловой системой Linux. О структуре мы уже немного поговорили в разд. 2.3, когда разбивали жесткий диск. В табл. 2.1 были перечислены разделы, которые можно создать в Linux, а это не что иное, как основные папки.

Теперь, наверное, нужно было бы перечислить команды, с помощью которых можно управлять директориями и файлами, а также просматривать и редактировать их. Но мы сделаем это чуть позже, а сейчас я хочу показать одну лишь программу Midnight Commander (МС). Это лучшее средство для решения всех описанных выше задач. Программа присутствует в большинстве дистрибутивов, в том числе и в Red Hat. Для ее запуска наберите в командной строке mc и нажмите клавишу . Постепенно мы будем знакомиться с этой утилитой, и вы полюбите ее за удобство и мощь, а сейчас рассмотрим только основные возможности.

На рис. 3.1 изображено окно терминала, в котором запущена программа МС. Окно состоит из двух независимых панелей, в каждой из которых вы можете видеть файлы и папки текущей директории (имена папок начинаются с символа слэш). Для перемещения между панелями используется клавиша .

Рис. 3.1. Окно терминала с запущенной программой Midnight Commander

С правой стороны показана корневая папка. Это самый верхний уровень вашей файловой системы. Посмотрите на список папок в этой панели. Большинство названий нам знакомо по табл. 2.1. Каждая из этих папок может находиться в собственном разделе жесткого диска, если при установке вы его создали. Но даже в этом случае в файловой системе вы будете видеть все как одно целое.

В разд. 2.3.3 мы говорили про корневой каталог, который в Linux обозначается как знак "/". Именно он является вершиной пирамиды в иерархии всех каталогов. Например, папки пользователя находятся в каталоге /home. Тогда /home/flenov будет определять путь к подкаталогу пользователя flenov. Чтобы попасть в эту директорию, нужно навести на нее курсор и нажать .

В списке папок и файлов самой первой всегда стоит папка с именем /... Реально такого каталога не существует. Это указатель на родительскую директорию, с помощью которой вы можете попасть на уровень выше. Например, вы находитесь в подкаталоге /home/flenov. Если войти в папку /.., то вы поднимитесь на предыдущий уровень и окажетесь в директории /home.

Внизу окна МС (см. рис. 3.1) можно увидеть строку-приглашение для ввода команд. Эта та же строка, что мы видели в терминале, и позволяет выполнять те же директивы. Еще ниже расположена строка меню с подсказками о назначении клавиш :

□ 1 (Помощь) — вызов файла помощи по программе;

□ 2 (Меню) — вызов меню основных команд МС;

□ 3 (Просмотр) — просмотр выделенного файла;

□ 4 (Правка) — редактирование выделенного файла во встроенном текстовом редакторе;

□ 5 (Копия) — копирование выделенного файла или папки. Если выделить файл и нажать клавишу , то появится окно подтверждения копирования. По умолчанию операция выполняется в текущую директорию противоположной панели программы МС;

□ 6 (Перемес) — переместить выделенные файлы или папки. По умолчанию файл будет перенесен в директорию, являющуюся текущей для противоположной панели программы МС;

□ 7 (НвКтлог) — создать новый каталог в текущем;

□ 8 (Удалить) — удалить выделенные файлы и папки;

□ 9 (МенюМС) — вызвать меню программы МС, которое находится вверху окна;

□ 10 (Выход) — выход из программы.

Файлы и папки, имена которых начинаются с точки, являются конфигурационными. Будьте осторожны при их перемещении и редактировании. Эти файлы нуждаются в максимальной защите, но об этом мы поговорим позже в разных разделах книги.

 

3.1.1. Основные команды

Давайте рассмотрим основные команды файловой системы, которые мы будем использовать в книге, и заодно подробнее познакомимся с файловой системой Linux.

pwd

Эта команда выводит на экран полный путь к текущему каталогу. С ее помощью вы можете в любой момент узнать, где находитесь.

ls

Команда ls выводит список файлов и подкаталогов указанной директории. Если имя каталога (файла) отсутствует в параметрах команды, то отображается содержимое текущего каталога. По умолчанию все настроечные файлы (имена начинаются с точки) являются скрытыми. Чтобы их вывести, нужно указать ключ -а:

ls -а

Если мы хотим увидеть не только имена (сжатый формат), но и полную информацию о каталоге, нужно добавить ключ -l. В результате мы должны выполнить команду:

ls -al

Но такая команда отобразит файлы текущей директории, и не факт, что мы сейчас находимся, например, в каталоге /etc, который надо просмотреть. Чтобы увидеть именно его, после ключей (можно и до них) нужно указать требуемую папку:

ls -al /etc

Примечание

Более подробную информацию о команде ls можно получить из справочной системы. Для этого выполните команду man ls .

Рассмотрим результат вывода команды ls -al:

drwx------ 3 Flenov FlenovG 4096 Nov 26 16:10 .

drwxr-xr-x 5 root   root    4096 Nov 26 16:21 ..

-rw-r--r-- 1 Flenov FlenovG   24 Nov 26 16:10 .bash_logout

-rw-r--r-- 1 Flenov FlenovG  191 Nov 26 16:10 .bash_profile

-rw-r--r-- 1 Flenov FlenovG  124 Nov 26 16:10 .bashrc

-rw-r--r-- 1 Flenov FlenovG 2247 Nov 26 16:10 .emacs

-rw-r--r-- 1 Flenov FlenovG  118 Nov 26 16:10 .gtkrc

drwxr-xr-x 4 Flenov FlenovG 4096 Nov 26 16:10 .kde

По умолчанию список файлов выводится в несколько колонок. Разберем их на примере первой строки:

□ drwx------ права доступа. Их мы подробно рассмотрим в гл. 4. Сейчас вам только нужно знать, что если первая буква "d", то это директория;

□ цифра 3 — указывает количество жестких ссылок;

□ Flenov — имя пользователя, являющегося владельцем файла;

□ FlenovG — группа, которой принадлежит файл;

□ 4096 — размер файла. Для директории это значение отсутствует, т.к. не устанавливается ее размер;

□ дата и время последних изменений файла;

□ имя файла.

cat

Команда позволяет вывести на экран содержимое указанного в качестве аргумента файла. Например, вы хотите просмотреть текстовый файл need.txt. Для этого нужно выполнить команду:

cat need.txt

Но это справедливо, если файл находится в текущей директории. А если нет? В этом случае можно указать полный путь:

cat /home/root/need.txt

tac

Эта команда обратная для cat (даже название команды — это слово cat наоборот), т.е. выводит на экран файл в обратном порядке, начиная с последней строки до первой.

cd

Эта команда позволяет сменить текущий каталог. Для этого необходимо в качестве параметра задать нужную папку:

cd /home/flenov

Если вы находитесь в каталоге /home и хотите внутри него перейти в подкаталог flenov, то достаточно набрать только имя папки flenov:

cd flenov

Если нужно переместиться на уровень выше, например, из подкаталога /home/flenov в каталог /home, нужно выполнить команду:

cd ..

Как мы знаем, папка с именем из двух точек указывает на родительский каталог. Если перейти на нее, то мы попадем на предыдущий уровень.

cp

Команда копирования файла. С ее помощью можно выполнять несколько различных действий:

1. Копирования содержимого файла в другой документ той же папки:

cp /home/root/need.txt /home/root/need22.txt

Здесь содержимое файла /home/root/need.txt (источник) будет скопировано в файл /home/root/need22.txt (назначение).

2. Копирования файла в другой каталог:

cp /home/root/need.txt /home/flenov/need.txt

или

cp /home/root/need.txt /home/flenov/need22.txt

Обратите внимание, что в этом случае в папке назначения файл может быть как с новым, так и со старым именем.

3. Копирование несколько файлов в новый каталог. Для этого нужно перечислить все файлы в источнике и последним параметром указать папку назначения:

cp /home/root/need.txt /home/root./need22.txt /home/new/

В этом примере файлы /home/root/need.txt и /home/root/need22.txt будут скопированы в директорию /home/new. Можно копировать файлы и из разных каталогов в один:

cp /home/root/need.txt /home/flenov/need22.txt /home/new/

В этом примере файлы /home/root/need.txt и /home/flenov/need22.txt будут скопированы в директорию /home/new.

4. Копирование группы (всех) файлов каталога.

А что если надо скопировать все файлы, начинающиеся на букву "n" из одной директории в другую? Неужели придется их все перечислять? Нет, достаточно указать маску n*, где звездочка заменяет любые символы, начиная со второго:

cp /home/root/n* /home/new/

Если нужно скопировать все файлы, имена которых начинаются символами "ra" и заканчиваются буквой "t", то маска будет выглядеть как ra*t.

mkdir

Создание новой директории. Например, если вы хотите создать подкаталог newdir в текущей директории, то нужно выполнить команду:

mkdir newdir

rm

Команда позволяет удалить файл или директорию (должна быть пустая):

rm /home/flenov/need22.txt

В качестве имен файлов можно использовать и маски, как в команде cp. Для удаления директории может понадобиться указание следующих ключей:

□ -d — удалить директорию;

□ -r — рекурсивно удалять содержимое директорий;

□ -f — не запрашивать подтверждение удаляемых файлов. Будьте внимательны при использовании этого параметра, потому что файлы будут удаляться без каких-либо дополнительных вопросов. Вы должны быть уверены, что команда написана правильно.

Пример удаления директории:

rm -rf /home/flenov/dir

df

Эта команда позволяет определить свободное место на жестком диске или разделе. Если устройство не указано, то на экран выводится информация о смонтированных файловых системах.

Пример результата выполнения команды:

Filesystem 1k-blocks   Used Available Use% Mounted on

/dev/hda2  16002200 2275552  12913760  15% /

none         127940       0    127940   0% /dev/shm

Результирующая таблица состоит из следующих колонок:

□ Filesystem — диск, файловая система которого смонтирована;

□ 1k-blocks — количество логических блоков;

□ Used — количество использованных блоков;

□ Available — количество доступных блоков;

□ Use% — процент использованного дискового пространства;

□ Mounted on — монтировка файловой системы.

mount

Команда предназначена для монтирования файловых систем. Она достаточно сложна, и ее используют системные администраторы.

Если вы работали с ОС Windows, то скорей всего привыкли к тому, что дискеты, CD-диски и другие съемные носители становятся доступными сразу же, как только вы поместили их в устройство чтения. В Linux это не так, и многие не могут сжиться с этой особенностью. К таким пользователям отношусь и я, т.к. до сих пор не могу привыкнуть, что нужно выполнять дополнительные команды, хотя и прекрасно понимаю, что они необходимы.

Итак, чтобы CD-ROM стал доступным, надо выполнить команду mount, указав в качестве параметра устройство /dev/cdrom:

mount /dev/cdrom

После этого содержимое CD можно посмотреть в директории /mnt/cdrom. Получается, что файлы и директории диска как бы сливаются с файловой системой.

Почему именно в директорию /mnt/cdrom подсоединяется CD-ROM? Секрет заключается в том, что для подключения CD-ROM нужно намного больше данных, чем дает одна команда mount dev/cdrom. Эти сведения хранятся в двух файлах, уже имеющихся в ОС и описывающих основные устройства и параметры по умолчанию — файлы fstab и mtab. Давайте по очереди разберем эти файлы.

Для начала взглянем на fstab:

# /etc/fstab: static file system information.

#

#                

/dev/hda2       /             ext3    defaults,errors=remount-ro 0 1

/dev/hda1       none          swap    sw                         0 0

proc            /proc         proc    defaults                   0 0

none            /dev/shm      tmpfs   defaults                   0 0

none            /dev/pts/     devpts  gid=5,mode=620             0 0

/dev/cdrom      /mnt/cdrom    iso9660 noauto,owner,kudzu,ro      0 0

/dev/fd0        /mnt/floppy   auto    noauto,owner,kudzu         0 0

Файл содержит строки для основных дисков. Каждая запись состоит из 6 колонок. Обратите внимание на первую строку. Здесь описывается подключение диска hda2. В моей файловой системе это основной диск, поэтому второй параметр — "/". Это значит, что диск будет монтирован как корневой. Третья колонка описывает файловую систему, в данном случае это Ext2. Параметр rw указывает на то, что устройство доступно для чтения и записи.

Предпоследняя строка в файле описывает устройство CD-ROM. Посмотрите внимательно на второй параметр /mnt/cdrom. Вот откуда берется путь к содержимому CD-диска. Четвертая колонка содержит опции монтирования, в которых можно описать параметры безопасности. В данном случае для CD-ROM здесь указано несколько опций: noauto, owner, kudzu, ro. Очень важным здесь является параметр ro, который говорит о возможности только чтения CD-ROM. Вполне логично установить этот параметр для всех приводов и устройств, с помощью которых хакер сможет снять информацию с сервера.

Файл mtab имеет примерно такое же содержимое:

#                     

/dev/hda2       /                        ext3    rw,errors=remount-ro 0 0

proc            /proc                    proc    rw                   0 0

none            /dev/shm                 tmpfs   rw                   0 0

none            /dev/pts                 devpts  rw,gid=5,mode=620    0 0

none            /proc/sys/fs/binfmt_misc binfmt  misc rw              0 0

/dev/cdrom      /mnt/cdrom               iso9660 ro,nosuid,nodev      0 0

Если вы создали какие-то разделы на отдельных дисках, то сможете настраивать и их. Я вам рекомендовал выделить таким образом раздел /home с пользовательскими директориями. Если вы так и сделали, то в файле может быть еще одна строка примерно следующего вида:

/dev/hda3 /home ext3 rw,errors=remount-ro 0 0

Посмотрим на четвертый параметр. В нем содержатся опции монтирования, которыми можно управлять для повышения безопасности системы. Они перечислены через запятую. В нашем примере это rw, errors=remount-ro. В качестве опций монтирования дополнительно можно использовать:

□ noexec — запрет выполнения файлов. Если вы уверены, что в разделе не должно быть исполняемых файлов, то можно использовать эту опцию. Например, в некоторых системах директория /home должна хранить только документы. Чтобы хакер не смог записать в этот раздел свои программы, с помощью которых будет происходить взлом, добавьте этот параметр. Точнее сказать, программы поместить можно будет, а запустить — нет;

□ nosuid — запрещает использование программ с битами SUID и SGID. В разделе /home их быть не должно, поэтому можно явно запретить применение привилегированных программ. О SUID- и SGID-программах мы поговорим в разд. 4.5;

□ nodev — запрещает использование файлов устройств;

□ nosymfollow — запрещает использование мягких ссылок.

Опции nodev и nosymfollow не сильно влияют на безопасность, но могут пригодиться.

Использование параметра noexec — бесполезное занятие и абсолютно не защищает систему от профессионального хакера, потому что опытный взломщик сможет запустить программу, если для выполнения разрешен хотя бы один раздел. А таковым всегда является раздел с директорией /bin и другие каталоги, которые содержат необходимые для работы программы.

Допустим, что ваш сайт разрабатывается с использованием языка Perl. Если его интерпретатор доступен для выполнения, то взломщик сможет запускать сценарии программ Perl в любом разделе, в том числе и с установленным параметром noexec. Если для запуска сценария использовать командную строку, то вы получите сообщение о нарушении прав доступа. Но программа выполнится, если написать следующую команду:

perl file.pl

Несмотря на то, что file.pl находится в разделе, в котором запрещены исполняемые файлы, ошибки не будет, потому что запускается разрешенная программа perl, которая в свою очередь читает файл (дозволенная операция) и выполняет его в своем адресном пространстве.

Вспомните описание файла mtab, где для CD-ROM стоит запрет на использование SUID- и SGlD-программ. То же самое необходимо сделать, как минимум, с разделами /home и /tmp. Тогда пользователи не смогут создавать в своих директориях привилегированные программы, что позволит предотвратить большое количество возможных атак.

Итак, давайте попробуем смонтировать CD-ROM в другую директорию. Для этого сначала создадим ее:

mkdir /mnt/cd

Теперь выполним команду

mount /dev/cdrom /mnt/cd

Если на вашем компьютере установлено две ОС — Windows и Linux, то диск, скорее всего, содержит файловую систему FAT32 или NTFS. Следующие команды позволяют подключить FAT32 к Linux:

mkdir /mnt/vfat

mount -t vfat /dev/hda3 /mnt/vfat

Первая команда создает директорию /mnt/vfat, куда будет подключаться диск с FAT32.

Во второй команде происходит монтирование диска /dev/hda5. Будем считать, что как раз он и принадлежит Windows. Ключ -t позволяет указать тип подключаемой файловой системы. Это обязательно. Для CD-ROM мы этого не делали только потому, что вся необходимая информация есть в файле /etc/fstab. Файловая система указана в параметре vfat. Это имя для FAT32, которое используется в Linux.

Более подробно о работе команды можно узнать на страницах документации (man mount).

umount

Когда вы подключили к файловой системе CD-ROM, то это устройство блокируется, и диск нельзя вытащить, пока он не будет размонтирован. Для этого используется команда umount.

Например, следующая команда позволяет размонтировать CD-ROM:

umount /dev/cdrom

fdformat

Перед использованием дискет их нужно отформатировать. В ОС Linux для этого используется команда fdformat.

tar

По ходу изложения данной книги мы иногда будем устанавливать различные программы, часть из них поставляется в виде архивов tar.gz. Чаще всего это программы, хранимые в исходных кодах. Для разархивирования такого файла нужно выполнить команду:

tar xzvf имяфайла.tar.gz

Как правило, после выполнения команды в текущей директории будет создан каталог с таким же именем, как у архива (только без расширения). В нем вы сможете найти все распакованные файлы.

К работе с архивами мы вернемся в гл. 13, когда будем рассматривать резервирование данных. Сейчас же нам достаточно уметь распаковывать пакеты, чтобы устанавливать дополнительные программы и утилиты сторонних разработчиков.

rpm

В настоящее время большинство программ поставляются уже не в исходных кодах, а в виде RPM-пакетов. Их установка намного проще, т.к. программы в них уже скомпилированы. Если вы используете МС, то выберите RPM-пакет и нажмите клавишу . Таким образом вы войдете в него как в директорию и увидите содержимое.

Каждый пакет обязательно содержит исполняемый файл install. Запустите его для установки программы.

Если вы не используете МС, то для установки нового пакета можно выполнить команду:

rpm -i пакет

Для обновления уже установленного пакета можно выполнить команду с параметром -U:

rpm -U пакет

Для того чтобы видеть ход инсталляции, можно указать еще и ключ -v. Таким образом, команда установки будет выглядеть следующим образом:

rpm -iv пакет

which

Иногда необходимо знать каталог, в котором расположена программа. Для этого используется команда which с именем программы в качестве параметра, которая проверит основные каталоги, содержащие исполняемые файлы. Например, чтобы определить, где находится программа просмотра содержимого каталогов ls, выполните следующую команду:

which ls

В результате вы увидите путь /bin/ls. Если ваша ОС поддерживает псевдонимы (alias) команд, то можно будет увидеть и его. Таким образом, после выполнения команды на экране выведется:

alias ls='ls -color=tty' /bin/ls

 

3.1.2. Безопасность файлов

В гл. 4 мы будем подробно говорить о правах доступа. Это основа обеспечения безопасности, но и только, и надеяться на это нельзя. Необходимы дополнительные инструменты сохранения целостности системы, или, по крайней мере, вы должны следить за изменениями основных объектов ОС — файлами. В них хранится информация, а именно она необходима взломщикам. Хакеры стремятся прочитать, изменить или даже уничтожить информацию, поэтому вы должны уметь ее контролировать.

Дата изменения

Самый простейший способ контроля — наблюдение за датой редактирования. Допустим, что взломщик проник в вашу систему в 10:30. Чтобы узнать, что было изменено злоумышленником, можно запустить поиск всех файлов, у которых дата корректировки больше этого времени. Вроде легко, но не очень эффективно, потому что дату можно изменить с помощью команды touch. В общем виде команда выглядит следующим образом:

touch параметры ММДДччммГГ файл

Прописными буквами показаны параметры даты, а строчными — время. Формат немного непривычный, но запомнить можно. Год указывать необязательно, в этом случае будет использоваться текущий.

Рассмотрим пример. Допустим, что вы хотите установить на файл /etc/passwd дату изменения 21 января 11:40. Для этого выполняем следующую команду:

touch 01211140 /etc/passwd

Теперь воспользуйтесь командой ls -l /etc/passwd, чтобы убедиться, что дата и время изменения установлены верно.

С помощью команды touch можно и создавать файлы, сразу же указывая необходимую дату.

Несмотря на то, что дата корректировки легко изменяется, хакер может забыть или просто не успеть сделать это, а, возможно, ему просто не хватит прав.

Итак, найти все файлы, дата изменения которых больше 21 января 11:40 2005 года, можно следующим образом:

touch 0121114005 /tmp/tempfile

find /etc \(-newer /tmp/tempfile \) -ls

find /etc \(-cnewer /tmp/tempfile \) -ls

find /etc \(-anewer /tmp/tempfile \) -ls

В первой строке мы создаем файл во временной директории /tmp с необходимой датой изменения, по которой и будет происходить сравнение.

Следующие три строки производят поиск файлов. Каждая из них имеет следующую структуру:

find директория \( -сравнение файл \) -ls

Рассмотрим по частям эту строку:

□ find — программа поиска файлов;

□ директория — каталог, в котором нужно искать. В нашем случае я указал системный /etc, в котором хранятся все настроечные файлы;

□ параметр (-сравнение файл \) — состоит из файла для сопоставления и критерия поиска файлов, который может принимать различные значения:

 • -newer — дата изменения больше, чем у заданного файла в параметре файл;

 • -cnewer — состояние изменено позже, чем у сопоставляемого файла в параметре файл;

 • -anewer — дата последнего доступа превосходит, аналогичный параметр сравниваемого файла;

□ параметр -ls — отображает на экране список файлов (как при выполнении команды ls).

Контрольные суммы

На даты изменения можно надеяться, но необходимо дополнительное средство проверки. Наилучшим методом является подсчет контрольной суммы. Допустим, что вы хотите отслеживать изменения в директории /etc. Для этого выполните следующую команду:

md5sum /etc/*

Таким образом, подсчитывается контрольная сумма указанных в качестве параметра файлов. На экране вы получите результат выполнения команды примерно такого вида:

783fd8fc5250c439914e88d490090ae1 /etc/DIR_COLORS

e2eb98e82a51806fe310bffdd23ca851 /etc/Muttrc

e1043de2310c8dd266eb0ce007ac9088 /etc/a2ps-site.cfg

4543eebd0f473107e6e99ca3fc7b8d47 /etc/a2ps.cfg

c09badb77749eecbeafd8cb21c562bd6 /etc/adjtime

70aba16e0d529c3db01a20207fd66b1f /etc/aliases

c3e3a40097daed5c27144f53f37de38e /etc./aliases.db

3e5bb9f9e8616bd8a5a4d7247f4d858e /etc/anacrontab

fe4aad090adcd03bf686103687d69f64 /etc/aspldr.conf

...

Результат отображается в две колонки: первая содержит контрольную сумму, а вторая — имя файла. Контрольные суммы подсчитываются только для файлов. Для каталогов будет выведено сообщение об ошибке.

В данном случае указаны все файлы каталог а /etc/*. Результат расчета выводится на экран. Но запоминать эти данные неудобно, поэтому логично будет записать их в файл, чтобы потом использовать его содержимое для анализа изменений. Следующая команда сохраняет результат в файле /home/flenov/md:

md5sum /etc/* >> /home/flenov/md

Чтобы сравнить текущее состояние файлов директории /etc с содержимым файла /home/flenov/md, необходимо выполнить команду:

md5sum -с /home/flenov/md

На экране появится список всех файлов, и напротив каждого должна быть надпись "Success" (Успех). Это означает, что изменений не было. Давайте модифицируем какой-нибудь файл, выполнив, например, следующую команду:

groupadd test

Пока не будем вдаваться в подробности команды, сейчас достаточно знать, что она изменяет файл /etc/group. Снова выполняем команду проверки контрольных сумм файлов:

md5sum -с /home/flenov/md

Теперь напротив файла /etc/group будет сообщение об ошибке, т.е. контрольная сумма изменилась. Таким образом, даже если дата корректировки файла осталась прежней, по контрольной сумме легко определить наличие вмешательства.

Что контролировать

Некоторые администраторы следят только за файлами настройки. Это большая ошибка, потому что атакой хакеров может быть не только конфигурация, но и исполняемые файлы. То, что Linux является продуктом с открытым кодом, имеет свои преимущества и недостатки.

Порок в том, что профессиональные хакеры знают программирование. Им не составляет труда взять исходный код какой-либо утилиты и изменить его на свое усмотрение, добавив необходимые функции. Таким образом, очень часто в системе открыты потайные двери.

Вы должны контролировать изменения как конфигурационных файлов, так и всех системных программ и библиотек. Я рекомендую следить за каталогами /etc, /bin, /sbin и /lib.

Замечания по работе с файлами

ОС Linux достаточно демократично относится к именам создаваемых файлов, позволяя использовать абсолютно любые символы, кроме знака "/", который является разделителем каталогов, и "0", который определяет конец имени файла. Все остальное можно применять.

Самое неприятное — это возможность использовать невидимые символы, т.к. хакер может создать программу, у которой в имени только нечитаемые знаки, и пользователь не видит такого файла. Таким образом, взломщики скрывают в ОС свои творения.

Рассмотрим пример с использованием перевода строки. Допустим, что хакер назвал свой файл hacker\nhosts.allow. В данном случае под "\n" подразумевается перевод каретки, а значит, имя состоит из двух строк:

hacker

hosts.allow

Не все программы могут обработать такое имя правильно. Если ваш файловый менеджер работает неверно, то он отобразит только вторую строку — hosts.allow, и администратор не заподозрит ничего страшного в таком имени.

Еще один способ спрятать файл — в качестве имени указать точку и пробел ". " или две точки и пробел ".. ". Файл с именем в виде точки всегда указывает на текущую директорию. Администратор, выполнив команду ls, может не заметить, что существуют два файла с одинаковыми именами, а пробела все равно не видно.

Пробелы можно вставлять в любые имена файлов, например, перед именем (" hosts.allow") или наоборот, добавить в конец, и невнимательный администратор ничего не заметит. Чтобы увидеть конечный пробел, можно при выводе добавлять к каждому имени символ "/". Для этого при вызове команды ls используйте ключ -F.

Еще один вариант спрятать файл — заменять одни символы на другие, схожие по начертанию. Например, посмотрим на имя файла hosts.a11ow. Ничего не замечаете подозрительного? При беглом взгляде обнаружить что-либо невозможно, но если приглядеться повнимательнее, то вы увидите, что вместо букв l (L) стоит цифра 1 (единица).

Хакеры могут использовать этот прием. Еще можно подменять букву "b" на "d". И здесь трудно что-нибудь заподозрить, потому что если человек каждый день видит одно и то же, то, чаще всего, воспринимает желаемый текст за действительный.

Внимание — главное оружие администраторов. Вы должны проявлять интерес к любой мелочи, и нельзя позволить обмануть наше зрение.

 

3.1.3. Ссылки

В вашей системе могут появиться документы для совместного использования. Рассмотрим эту ситуацию на примере. Допустим, что файл отчетности /home/report должен быть доступен нескольким пользователям. Было бы логично, если копия этого файла находилась бы в домашних директориях этих пользователей. Но создавать несколько копий неудобно, потому что затруднится синхронизация. Да и сложно собрать в одно целое модификации из нескольких файлов, особенно если корректировался один и тот же кусок. Кто будет оценивать, чьи изменения необходимо вносить в общий файл?

Проблема решается с помощью ссылок, которые бывают жесткими (Hard link) и символьными (Symbolic link). Для постижения самой сути ссылок необходимо понимать, что такое файл и какое место ему отводится операционной системой. При создании файла на диске выделяется пространство для хранения данных. Его имя — это всего лишь ссылка из директории на участок диска, где физически находится файл. Получается, что можно создать несколько ссылок на одни и те же данные, и ОС Linux позволяет делать это.

Когда мы выполняем команду ls -l, то на экране появляется подробная информация о файлах в текущей директории. Напомню ее вид:

-rw-r--r-- 1 Flenov FlenovG 118 Nov 26 16:10 1.txt

Если к директиве добавить ключ i (выполнить команду ls -il), то к выводимой информации добавится еще и дескриптор файла:

913021 -rw-r--r-- 1 Flenov FlenovG 118 Nov 26 16:10 l.txt

Первое число и есть дескриптор, по которому определяется физическое расположение файла.

Жесткая ссылка указывает непосредственно на данные и имеет такой же дескриптор. Таким образом, файл физически не удаляется из системы, пока не будут уничтожены все жесткие ссылки. По сути, каждое имя файла уже является жесткой ссылкой на данные.

Для создания таких ссылок используется команда ln, которая имеет следующий вид:

ln имя_файла имя_ссылки

В ответ на это программа создаст жесткую ссылку с именем имя_ссылки, которая будет указывать на те же данные, что и файл имя_файла.

Чтобы на практике проверять все, что будет рассматриваться дальше, создайте в своей системе файл 1.txt. Для этого можно выполнить команду:

cat > 1.txt

Нажмите клавишу и введите несколько строк текста и нажмите клавиши +. Теперь у вас есть необходимый файл для тестирования.

Создадим для файла 1.txt жесткую ссылку. Для этого выполните следующую команду:

ln 1.txt link.txt

С помощью команды cat link.txt выведите на экран содержимое файла link.txt и убедитесь, что оно идентично строкам в 1.txt. Теперь выполните команду ls -il, чтобы просмотреть содержимое каталога. В списке файлов должны быть две строки:

913021 -rw-r--r-- 2 root root 0 Feb 22 12:19 1.txt

913021 -rw-r--r-- 2 root root 0 Feb 22 12:19 link.txt

Обратите внимание, что первая колонка, в которой находится дескриптор для обоих файлов, содержит одинаковые значения. В третьей колонке стоит число 2, что говорит о наличии двух ссылок на данные.

Теперь попробуем изменить содержимое любого из этих файлов. Для этого выполним следующие команды:

ls > link.txt

cat 1.txt

В первой строке мы сохраняем в файле link.txt результат работы команды ls (список содержимого директории), а вторая — отображает документ 1.txt. Убедитесь, что содержимое обоих файлов изменилось и имеет одинаковые данные.

Давайте попробуем удалить файл 1.txt и посмотреть на каталог и содержимое файла link.txt. Для этого выполните следующие команды:

rm 1.txt

ls -il

cat link.txt

Файл 1.txt будет удачно удален. А вот содержимое жесткой ссылки link.txt никуда не денется. То есть данные на диске не были уничтожены, а исчезло только имя 1.txt. Обратите внимание, что у файла link.txt в третьей колонке уменьшилось значение счетчика ссылок до единицы.

Символьная ссылка указывает не на данные, а на имя файла. Это дает некоторые преимущества, но одновременно возникает большое количество проблем. Для создания символьной ссылки нужно использовать команду ln с ключом -s. Например:

ln -s link.txt symbol.txt

Посмотрим на результат с помощью команды ls -il:

913021 -rw-r--r-- 1 root root 519 Feb 22 12:19 link.txt

913193 lrwxrwxrwx 1 root root   8 Feb 22 12:40 symbol.txt -> link.txt

Теперь дескрипторы файлов разные, но для link.txt первый символ следующей колонки равен букве "l". Как раз она и указывает на то, что мы имеем дело с символьной ссылкой. Третий параметр равен единице, а последний — после знака "->" содержит имя файла, на который указывает ссылка.

Попробуем удалить основной файл и после этого просмотреть содержимое ссылки symbol.txt:

rm link.txt

ls -il

cat symbol.txt

В первой строке мы удаляем файл link.txt. Вторая команда отображает список директорий. Убедитесь, что файла link.txt нет. Если вы используете Red Hat- дистрибутив, то команда ls, скорей всего, имеет псевдоним, который, позволяет в зависимости от типа файла отображать его различными цветами. Если нет, то замените вторую команду на ls --color=tty -il.

Строка, содержащая информацию о ссылке symbol.txt, должна быть красного цвета, а текст — мигающий белый. Это говорит о том, что ссылка "битая", т.е. указывает на несуществующий файл. Команда cat symbol.txt пытается отобразить содержимое ссылки. Так как файла нет, мы увидим сообщение об ошибке.

Самое интересное, что если попытаться записать какие-либо данные в файл symbol.txt, то файл link.txt будет автоматически создан. Это огромный недостаток, поэтому вы должны следить за символьными ссылками перед удалением файлов.

Второй недостаток символьных ссылок кроется в правах доступа, но мы их будем рассматривать в гл. 4.

Еще один минус таится в блокировках. Если открыть на редактирование файл, для которого создана символьная или жесткая ссылка, то он блокируется. Представим себе, что существует ссылка на файл /etc/passwd или /etc/shadow. При блокировке одного из них вход в систему станет невозможным.

Чтобы взломщик не смог воспользоваться блокировками, его права на запись в системные каталоги должны быть ограничены. А пользователю в большинстве случаев надо давать разрешение писать только в свою домашнюю директорию и каталог /tmp. Иногда при разделении файлов может потребоваться работа с чужими каталогами, но все равно доступ ограничивается каталогом /home, где расположены пользовательские директории.

Глядя на все недостатки ссылок, возникает вопрос — а нужно ли действительно использовать их? Я рекомендую это делать только в крайнем случае, когда все остальные способы решения проблемы еще хуже. Но если нет другого выхода, то делайте это аккуратно.

 

3.2. Загрузка системы

 

Некоторые администраторы не обращают внимания на то, как стартует система. Для них главное — только работа ОС. Да, прямой зависимости нет. Но во время загрузки ОС запускается множество программ, которые отнимают память, уменьшая тем самым производительность системы.

Помимо этого, быстрая загрузка позволяет оперативно восстановить работу компьютера после сбоя. Все машины когда-либо приходится перезагружать, чтобы возобновить полноценное функционирование. Это происходит из-за ошибок в программном обеспечении, перебоев с электропитанием и др. Чем скорее вы сможете это сделать, тем меньше будет простой.

Во время загрузки должны производиться все необходимые настройки, чтобы сразу после старта не приходилось что-то конфигурировать вручную. Это может отнять слишком много времени, к тому же выполнять одни и те же действия каждый раз — очень скучно и неинтересно.

 

3.2.1. Автозагрузка

Для начала вернемся к утилите setup. Запустите ее в окне терминала, и перед вами откроется окно, как на рис. 2.12. Зайдите в раздел System Services. Здесь перечислены все установленные сервисы, а напротив тех, что запускаются автоматически, в квадратных скобках будет стоять звездочка. Если вы устанавливали какой-либо демон, который вам необходим в работе, но использовать его будете изредка, то нет смысла запускать его автоматически и открывать ворота для хакера. Лучше убрать для него флаг автозапуска и стартовать только при необходимости, а сразу после работы останавливать сервис.

Например, я иногда отлаживаю на своем сервере Web-сценарии, требующие MySQL. Держать базу данных постоянно загруженной — расточительство памяти и лишняя дверь в систему. Поэтому я запускаю MySQL вручную по мере необходимости, и по окончании отладки прекращаю его работу.

Настоятельно рекомендую поступить так же и убрать все лишнее с глаз долой. Для этого стрелками выделите нужный демон и снимите галочку нажатием клавиши пробел. После того как вы настроили автозапуск, переключитесь клавишей на пункт OK, чтобы сохранить изменения. Конечно, уже запущенные демоны не выгрузятся из памяти, но при следующем старте загружаться не будут. Перезагрузите компьютер и убедитесь в том, что система работает верно, и запускаются только необходимые демоны.

Если вы работаете в KDE или GNOME, то можно воспользоваться графической утилитой для настройки автоматически запускаемых демонов. Для этого на рабочем столе щелкните по значку Control Panel (Панель управления) и перед вами откроется окно, содержащее ссылки на основные программы конфигурирования системы. Нас будет интересовать ярлык Службы.

Эту же утилиту можно запустить и другим способом. Выберите главное меню ОС, а в нем пункт Система и, наконец, Службы (рис. 3.2). В дальнейшем, для обозначения программ, которые нужно запустить из главного меню, я буду просто писать:

Основное меню ОС/Система/Службы.

Рис. 3.2. Запуск утилиты Службы

Главное окно графической утилиты Службы представлено на рис. 3.3. В центре формы вы можете увидеть список, состоящий из двух колонок. В первом столбце располагаются флажки, а во втором — названия демонов. Если напротив сервиса стоит галочка, то служба запускается автоматически. Щелчком по флажку вы можете устанавливать и снимать галочку.

Рис. 3.3. Главное окно утилиты Службы

Выделив какую-либо службу, вы можете ее запустить, остановить или перезапустить с помощью соответствующих кнопок на панели окна или через меню Действия. Любые изменения состояния автозагрузки необходимо сохранить. Для этого нажмите кнопку Сохранить на панели или выберите меню Файл/Сохранить изменения.

Внимание!

Никогда не запускайте службы, которыми вы не пользуетесь. В автозапуске должны находиться только те программы, которые необходимы вам или пользователям сервера регулярно. Если какой-либо демон используется редко, то не следует его устанавливать в автозапуск. Такие сервисы надо запускать только по мере надобности и останавливать сразу после применения. Ненужные службы лучше удалить совсем, чтобы не было соблазна использовать.

 

3.2.2. LILO

Как мы уже знаем, программа LILO позволяет загружать Linux и другие ОС, установленные на вашем компьютере. Все настройки загрузки хранятся в файле /etc/lilo.conf. Программа LILO начинает работать после того, как компьютер протестировал систему, и до старта ОС. В старых версиях это выглядело, как простое текстовое приглашение:

LILO

или

LILO boot:

В ответ на это вы можете нажать клавишу , чтобы загрузить ОС по умолчанию или клавишами <↑> и <↓> выбрать ту ОС, которая нужна в данный момент. В современных версиях загрузчик имеет более приятный графический вид.

Пример конфигурационного файла можно увидеть в листинге 3.1.

Листинг 3.1. Конфигурационный файл lilo.conf

disk=/dev/hda

bios=128

boot=/dev/hda

prompt

timeout=300

lba32

default=linux-2.4.18

image=/boot/vmlinuz-2.4.18-5asp

initrd=/boot/initrd.2.4.18-5asp.img

label=linux-2.4.18

root=/dev/hda2

read-only

Каждая строка устанавливает какой-либо параметр загрузки. Таких опций много, и подробно с ними вы можете познакомиться в документации, поставляемой с ОС, а мы рассмотрим только основные. Большинству параметров присваивают значения. Это выглядит так:

Параметр=3начение

Слева от знака равенства находится имя параметра, а справа — значение, которое надо установить.

Рассмотрим возможные параметры файла lilo.conf:

□ boot=/dev/hda — задает устройство, с которого происходит загрузка;

□ map=/boot/имя файла — карта загрузки. Если этот параметр опущен, то по умолчанию будет использоваться файл /boot/map;

□ timeout=300 — время ожидания в миллисекундах. Если за этот промежуток времени ничего не выбрано, то будет загружена ОС по умолчанию;

□ lba32 — позволяет использовать возможности lba32 (32-разрядная адресация блоков диска). Присутствие этого параметра может вызвать проблемы со старыми жесткими дисками без поддержки LBA (Logical Block Addressing, логическая адресация блоков);

□ default=linux-2.4.18 — определяет, что будет загружаться по умолчанию. В данном случае выбран образ linux-2.4.18;

□ image=/boot/vmlinuz-2.4.18-5asp — указывает на ядро Linux. Чаще всего эта строка выглядит как /boot/vmlinuz;

□ label=linux-2.4.18 — метка или текст, который будет появляться в окне загрузчика;

□ root=/dev/hda2 — диск, на котором расположена корневая файловая система;

□ read-only.

На данный момент этой информации нам хватит. Большинство из нерассмотренных опций уже устарели и могут понадобиться только при использовании очень старых компьютеров (такие мало у кого сохранились). По своему опыту могу сказать, что перечисленных параметров будет достаточно. При компиляции ядра мы отредактируем lilo.conf и дадим возможность загрузки по выбору.

Для корректировки файла достаточно открыть его в любом текстовом редакторе. Тут серьезных изменений не бывает, поэтому я использую редактор, встроенный в программу МС. Для этого запустите Midnight Commander. Скорей всего, текущим каталогом будет ваша папка, например /home/root. Нужно перейти в корневой каталог. Выберите самую первую папку /.. и нажмите клавишу . Теперь вы окажетесь в папке /home. Повторите эту операцию и переместитесь в корневой каталог.

Теперь находим папку /etc и нажимаем клавишу , чтобы войти в нее. Здесь ищем lilo.conf, выделяем его и нажимаем клавишу . Перед вами откроется простой текстовый редактор. Поменяйте нужные параметры. Нажмите клавишу для выхода. Если данные были изменены, то программа выдаст запрос на сохранение. Соглашайтесь, если нужно принять исправления.

Если вы никогда не редактировали файлы, то попробуйте сделать это сейчас. Для примера можно изменить время ожидания выбора пользователем способа загрузки Linux: с жесткого диска или дискеты. Конечно же, с винчестера я загружаюсь намного чаще, включаю компьютер и ухожу готовить кофе. В дальнейшем мы не будем останавливаться на этом процессе так подробно.

В конфигурационных файлах Linux есть понятие комментария. Это текст, который программа просто игнорирует, и вы можете писать в нем любые пояснения или временно отключать какие-то параметры. Комментарий начинается с символа "#". Всем, что находится после этого символа, программа пренебрегает. Например:

# Это комментарий

boot=/dev/hda

timeout=300 # Это комментарий, показывает время загрузки

# lba32

default=linux-2.4.18 # Это комментарий, ОС по умолчанию

В этом примере первая строка начинается с символа "#", и она вся будет проигнорирована. В третьей строке комментарий стоит после указания параметра. Это значит, что сам параметр будет прочитан, а текст пояснения после него будет пропущен.

В четвертой строке перед lba32 стоит знак "#", значит этот параметр будет проигнорирован и воспринят как комментарий.

Пояснения очень удобны для того, чтобы временно отключать какие-либо опции. Вы можете просто удалить параметр и забыть, как он был написан, но если вы превратили его в комментарий, то для возврата достаточно убрать знак "#", и параметр заработает.

С помощью утилиты LILO можно защитить ваш компьютер от несанкционированной загрузки ОС. Это необходимо, потому что при старте системы можно выполнить команду уже на этапе загрузки. Если злоумышленник получил доступ к вашему компьютеру, то легко может войти в однопользовательском режиме с последующим взломом пароля root или реализовать команду.

Если при загрузке LILO отображается в виде простого текстового приглашения (характерно для дистрибутивов Red Hat), то необходимо ввести имя загружаемой системы (linux), потом ключевое слово init= и команду:

Linux Boot: linux init=команда

Чтобы хакер не смог запустить систему, необходимо защитить LILO с помощью пароля. Для этого в конфигурационном файле после ключевого слова image добавьте строку:

password=пароль

Вот пример задания пароля qwerty на загрузку:

image=/boot/vmlinuz-2.4.18-5asp

password=qwerty

initrd=/boot/initrd.2.4.18-5asp.img

label=linux-2.4.18

root=/dev/hda2

read-only

Если на вашем компьютере установлены разные варианты системы, то необходимо для каждого из них указывать пароль. В следующем примере LILO позволяет загружать два ядра, и для обоих вводится свой пароль:

image=/boot/vmlinuz-2.4.18-5asp

password=qwerty

initrd=/boot/initrd.2.4.18-5asp.img

label=linux-2.4.18

root=/dev/hda2

read-only

image=/boot/vmlinuz-2.6.2

password=123456

initrd=/boot/initrd.2.6.2.img

label=linux-2.6.2

root=/dev/hda2

read-only

О конфигурировании LILO с двумя ядрами мы поговорим в разд. 3.8.4.

Если добавить параметр password до описания image, то указанный пароль будет действовать для всех ОС и ядер, загружаемых с помощью LILO.

Но пароль запрещает только основную загрузку, а возможность выполнения команд при старте системы сохраняется. Чтобы сделать и это невозможным, добавьте в конфигурационный файл lilo.conf после объявления пароля строку С ключевым словом restricted:

image=/boot/vmlinuz-2.4.18-5asp

password=qwerty

restricted

initrd=/boot/initrd.2.4.18-5asp.img

label=linux-2.4.18

root=/dev/hda2

read-only

Чтобы внесенные в файл изменения вступили в силу, необходимо запустить в командной строке директиву lilo. Таким образом, новые параметры будут записаны в загрузочную область и начнут действовать при следующем старте системы.

 

3.2.3. init

С помощью LILO запускается программа загрузки ОС, которая настраивает все необходимое оборудование, загружает драйверы и монтирует жесткие диски. По окончании этого процесса с винчестера запускается программа init, которая завершает загрузку.

У программы init, как и у большинства других утилит Linux, есть свой конфигурационный файл, в котором можно производить определенные настройки (листинг 3.2). Этот файл называется inittab и расположен в папке /etc (полный путь /etc/inittab).

Листинг 3.2. Файл настройки программы inittab

#

# inittab This file describes how the INIT process

#         should set up

#         the system in a certain run-level.

#

# Author: Miquel van Smoorenburg,

#        

#         Modified for RHS Linux by Marc Ewing and

#         Donnie Barnes

#

# Default runlevel. The runlevels used by RHS are:

#  0 - halt (Do NOT set initdefault to this)

#  1 - Single user mode

#  2 - Multiuser, without NFS (The same as 3, if you do not

#      have networking)

#  3 - Full multiuser mode

#  4 - unused

#  5 - X11

#  6 - reboot (Do NOT set initdefault to this)

# id:5:initdefault:

# System initialization.

si::sysinit:/etc/rc.d/rc.sysinit

# What to do in single-user mode.

~~:S:wait:/sbin/sulogin

10:0:wait:/etc/rc.d/rc 0

11:1:rwait:/etc/rc.d/rc 1

12:2:wait:/etc/rc.d/rc 2

13:3:wait:/etc/rc.d/rc 3

14:4:wait:/etc/rc.d/rc 4

15:5:wait:/etc/rc.d/rc 5

16:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.

ud::once:/sbin/update

# Trap CTRL-ALT-DELETE

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed,

#  assume we have a few minutes

# of power left. Schedule a shutdown for 2 minutes from now.

# This does, of course, assume you have powerd installed

# and your

# UPS connected and working correctly.

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in,

# cancel it.

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels

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

# Run xdm in runlevel 5

# xdm is now a separate service

x:5:respawn:/etc/X11/prefdm -nodaemon

Файл начинается с комментария, в котором дана информация о модуле и авторе, затем — описание различных уровней, которые поддерживаются системой. В некоторых дистрибутивах их может быть от двух, a Red Hat Linux-подобные системы поддерживают целых семь. Рассмотрим каждый уровень:

□ 0 — остановка ОС;

□ 1 — текстовый однопользовательский режим, используется редко и только администраторами для выполнения критически важных изменений;

□ 2 — текстовый многопользовательский, локальный режим (нет поддержки сети);

□ 3 — текстовый многопользовательский, сетевой режим;

□ 4 — не используется, но в дальнейшем может быть задействован;

□ 5 — графический режим;

□ 6 — перезагрузка системы.

Пока что мы рассмотрели семь уровней. Есть еще уровень S, что соответствует однопользовательскому режиму, он применяется в файлах сценариев, но иногда присутствует и в inittab.

Теперь познакомимся со структурой файла. Каждая строка в нем (не считая комментариев и пустых строк) выглядит следующим образом:

идентификатор:уровни:флаги:действие

Строка состоит на четырех аргументов, отделенных между собой двоеточием. Давайте рассмотрим каждый параметр в отдельности:

□ идентификатор — уникальный номер строки, который имеет произвольное значение. Единственное ограничение — в файле не должно быть двух строк с одинаковыми идентификаторами;

□ уровни — режимы, в которых будет выполняться команда. Например, если ей надлежит работать на втором и третьем уровнях, то здесь должно стоять число 23. Это просто цифры 2 и 3, которые не разделяются пробелами или какими-либо другими знаками. Если команду нужно выполнять на любом уровне, то этот параметр должен быть пустым;

□ флаги — задает поведение команды, может принимать одно из следующих значений:

 • boot — выполняется только один раз при загрузке ОС. В этом случае параметр уровни просто игнорируется;

 • bootwait — равносильно указанию параметров boot и wait одновременно, т.е. выполнение должно быть во время загрузки ОС, и при этом нужно дождаться завершения операции;

 • ctrlaltdel — нажата комбинация клавиш ++. Случайных или незапланированных перезагрузок быть не должно. Наличие трех клавиш — это недостаток, потому что любой хакер может подойти и нажать их ради шутки или в корыстных целях. Я рекомендую отключить эту возможность, установив в начале строки знак комментария "#";

 • initdefault — строка с этим параметром читается только при первом обращении к init и определяет уровень загрузки. Если в этой строке будет стоять число 5, то ОС будет сразу в графический режим. Если вам нужно загрузить ОС в текстовый, многопользовательский режим с поддержкой сети, то измените значение параметра на цифру 3 (см. описание уровней загрузки). Можно указать несколько чисел (я не рекомендую этого делать), в этом случае будет выбрано максимальное;

 • off — отключить выполнение команды, что равноценно превращению строки в комментарий или даже удалению. Но если этот процесс уже работает, то ему передается сигнал, требующий завершения программы;

 • once — выполнять команду только один раз;

 • powerfail — отключение электроэнергии. Ошибку можно увидеть только при наличии источника бесперебойного питания, подключенного к компьютеру через специальный интерфейс (чаще всего через СОМ-порт);

 • powerokwait — подача электроэнергии возобновилась;

 • powerwait — система перешла в режим ожидания восстановления питания. Предполагается, что к компьютеру подключен источник бесперебойного питания, который сообщил об ошибке (отсутствии питания);

 • respawn — если во время выполнения произойдет ошибка, то повторить команду. Это бывает необходимо для критически важных программ, которые должны быть всегда в запущенном состоянии;

 • sysinit — такие команды выполняются перед тем, как появится консоль (приглашение ввести пароль). При этом ОС дожидается окончания выполнения команды;

 • wait — ожидать завершения процесса, а значит, программа init не будет выполнять других действий, пока не закончится выполнение команды, указанной в этой строке. Например, если нужно проверить состояние диска, то необходимо заморозить дальнейшую загрузку до окончания проверки;

□ Действие — команда, которая должна быть выполнена.

Теперь рассмотрим некоторые строки из листинга 3.2, чтобы понять их смысл и научиться управлять ими для повышения эффективности системы.

Самая первая строка после комментариев в нашем файле выглядит так:

id:5:initdefault:

Мы уже знаем, что параметр initdefault определяет, как будет загружаться система. В данном случае файл init будет выполняться с 5 уровнем, т.е. в графическом режиме.

Следующим интересным моментом являются строки:

10:0:wait:/etc/rc.d/rc 0

11:1:wait:/etc/rc.d/rc 1

12:2:wait:/etc/rc.d/rc 2

13:3:wait:/etc/rc.d/rc 3

14:4:wait:/etc/rc.d/rc 4

15:5:wait:/etc/rc.d/rc 5

16:6:wait:/etc/rc.d/rc 6

Как видите, здесь для каждого уровня своя строка, и при этом запускается один и тот же файл /etc/rc.d/rc, но после имени через пробел стоит число, соответствующее текущему уровню. Это параметр, который увидит программа /etc/rc.d/rc.

Что это за программа? Основная ее задача — убить все текущие процессы и запустить другие, соответствующие новому режиму выполнения. Например, вы работали на 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. Это значит, что по нажатию клавиш ++ будет выполнена указанная команда. В большинстве ОС такая комбинация используется для перезагрузки системы. Какая директива выполнится в Linux? Это /sbin/shutdown -t3 -r now. Мы уже знаем, что команда shutdown с ключом -r — это перезагрузка. Параметр -tX задает время задержки, где X — количество секунд до рестарта.

Получается, что по нажатию клавиш ++ запустится директива, требующая через три секунды перезагрузить систему.

Теперь посмотрим на строку, которая будет выполнена при сбое питания:

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.

Для переключения между виртуальными консолями нужно нажать клавишу и любую клавишу от до .

Самая последняя строка выполняется только на 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-пакета. Но вы должны знать их структуру, чтобы можно было изменить какие-то параметры в случае необходимости.

Каждая строка в конфигурационном файле состоит из четырех полей, разделенных пробелами:

□ тип модуля — может принимать одно из следующих значений:

 • auth — аутентификация и проверка привилегий пользователей;

 • account — распределение ресурсов системы между пользователями;

 • session — поддержка сессии и регистрации действий пользователей;

 • password — проверка пароля;

□ флаг — определяет параметры модуля. Здесь можно использовать три значения:

 • required — обязательный;

 • optional — необязательный;

 • sufficient — достаточный;

□ полный путь к файлу модуля;

□ аргументы модуля.

Рассмотрим пример конфигурационного файла для FTP-сервиса, который находится в файле /etc/pam.d/ftp.

#%PAM-1.0

auth    required /lib/security/pam_listfile.so item=user sense=deny

 file=/etc/ftpusers onerr=succeed

auth    required /lib/security/pam_stack.so    service=system-auth

auth    required /lib/security/pam_shells.so

account required /lib/security/pam_stack.so    service=system-auth

session required /lib/security/pam_stack.so    service=system-auth

Это и все, что вам необходимо знать. Остальное берет на себя программа сервиса без нашего вмешательства.

 

3.4. Процессы

 

Для того чтобы эффективно управлять своим компьютером, вы должны досконально изучить свой сервер и работающие на нем процессы. Взломав ваш сервер, злоумышленник постарается запустить на нем какую-либо программу, которая незаметно будет выдавать хакеру права root в системе. Таких программ в сети великое множество, и к ним относятся различные троянские программы.

Процесс — это программа или ее потомок. При запуске программы создается новый процесс, в котором и работает код. Каждая программа должна функционировать с определенными правами. Сервисы, которые активизируются при старте системы, обладают правами root или nobody (без прав). Программы, которые выполняются из командной строки, наделены правами запустившего пользователя, если не указан SUID- или SGID-бит, при котором программа имеет права владельца.

Существует два основных типа процессов — фоновый (background) и центральный (foreground). Центральный процесс для определенного терминала может быть только один. Например, запустив по команде ls программу man для просмотра помощи, вы не сможете выполнять другие команды, пока не выйдете из программы man.

У тех, кто знаком с программой Midnight Commander, может возникнуть вопрос — а как же тогда работает МС и одновременно в нем можно выполнять команды? Ответ прост, процессы могут порождать другие процессы. То же происходит и в МС, но если его закрыть, то закроются и все порожденные процессы.

 

3.4.1. Смена режима

Фоновыми процессами являются все сервисы. Они выполняют свои действия параллельно с вашей работой. Но вы в фоновом режиме можете запустить любую программу. Для этого достаточно после указания команды через пробел поставить знак "&". Например, выполните сейчас следующую команду:

man ls &

В ответ на это вы не увидите файл помощи, а на экране появится только строка:

[1] 2802

После этого терминал снова готов работать, потому что центральный процесс запустил команду man ls в фоновом режиме, и свободен для выполнения новых директив.

А что же мы увидели в ответ на выполнение команды? В квадратных скобках показан порядковый номер фонового процесса, который мы запустили. Это число будет последовательно увеличиваться. В данном случае это первая команда, поэтому в квадратных скобках стоит единица. Это число формируется для каждого пользователя. Если войти в систему через второй терминал и запустить фоновый процесс, то вы увидите примерно следующее:

[1] 2805

В квадратных скобках опять число 1, а вот следующее значение отличается от выведенного на первом терминале и будет всегда другим. Это PID (Process ID, идентификатор процесса) созданного процесса, является уникальным для всех пользователей. Это значит, что если вы запустили процесс с номером 2802, то другой пользователь никогда не увидит этого идентификатора. Его PID будет другим.

Запомните идентификаторы, которые вы увидели, впоследствии они пригодятся.

Чтобы узнать, какие процессы у вас запущены, выполните команду jobs. В ответ на это вы получите:

[1] + Stopped man ls

В данном случае мы видим, что процесс с номером [1] загружен в память, и состояние команды man ls — Stopped (остановлен).

Какой смысл в том, что мы отправили просмотр файла помощи в фоновый режим? Я не зря выбрал эту команду, потому что в этом есть резон. Вы в любой момент можете сделать фоновый режим основным. Для этого необходимо ввести команду fg %1, где число 1 указывает номер вашего процесса, который вы видели в квадратных скобках. Попробуйте сейчас выполнить эту директиву, и перед вами откроется запущенная программа man, отображающая файл помощи по использованию команды ls.

Раз процесс можно сделать центральным, значит можно поступить и наоборот. Чтобы вернуть процесс в фоновый режим, нажмите клавиши +. Перед вами снова появится командная строка. Выполните команду jobs, чтобы убедиться, что команда man ls все еще работает.

Если в программе есть возможность выполнять системные команды, то вместо сочетания клавиш + можно выполнить команду bg %1. Число 1 — это снова номер процесса.

 

3.4.2. Остановка процессов

Чтобы прекратить работающий процесс, необходимо сделать его центральным и остановить штатными средствами. Чаще всего, на экране есть подсказка, которая поможет выйти из программы. Если она отсутствует, то следует обратиться к документации или просмотреть файл помощи к программе через вызов man имяпрограммы.

Процессы, работающие только в фоне, не могут быть выведены на передний план. Для того чтобы их остановить, есть специализированные команды, которые чаще всего имеют вид:

имясервиса stop

Иногда процессы зависают. Да, такие ситуации бывают и в ОС Linux. Центральный процесс может быть снят с помощью комбинации клавиш + или +. Но этот метод срабатывает не во всех случаях и не для всех программ. Если не удается завершить процесс по- хорошему, то можно поступить иначе. Для этого существует команда kill. Чтобы отключить процесс по личному идентификатору (тот, что мы видели в квадратных скобках), используйте команду:

kill %n

Параметр n нужно заменить на номер процесса. Например, чтобы завершить работу фоновой программы man, нужно выполнить:

kill %1

Затем сразу же запустите команду jobs. Вы должны увидеть на экране сообщение типа:

[1] + Terminated man ls

После повторного вызова команды jobs программы man больше не будет.

Если вы хотите завершить работу процесса, который запущен не вами, но вы знаете его PID, то нужно выполнить команду:

kill n

Знак процента в этом случае не нужен. Тогда команда kill ищет процесс, у которого PID равен указанному числу n и посылает сигнал для завершения.

 

3.4.3. Просмотр процессов

С помощью команды jobs вы можете увидеть только запущенные вами процессы. Чтобы полюбопытствовать, чем занимаются остальные пользователи в системе, нужно выполнить команду ps. Если запустить ее без параметров, то результат на экране будет примерно следующий:

PID TTY TIME CMD

1652 tty1 00:00:00 bash

1741 tty1 00:00:00 ps

Перед нами четыре колонки, которые показывают идентификатор процесса, терминал, на котором запущена программа, время работы и выполняемая команда.

Это далеко не полный список. Чтобы увидеть все процессы, следует выполнить команду ps с ключом -a. Но и это еще не весь перечень, потому что отобразятся только программы своего терминала. Если требуется полный список процессов, запущенных со всех терминалов, то нужно добавить ключ -х. Помимо этого, вы можете пожелать увидеть имя пользователя, под которым работает процесс, для этого добавьте ключ -u. В итоге, исчерпывающую информацию можно получить, выполнив команду:

ps -axu

Результат работы будет таков:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root   1 0.0  0.1 1376 452 ?   S    14:25 0:05 init

root   2 0.0  0.0    0   0 ?   SW   14:25 0:00 [keventd]

root   3 0.0  0.0    0   0 ?   SW   14:25 0:00 [kapmd]

root   5 0.0  0.0    0   0 ?   SW   14:25 0:00 [kswapd]

root   6 0.0  0.0    0   0 ?   SW   14:25 0:00 [bdflush]

root   7 0.0  0.0    0   0 ?   SW   14:25 0:00 [kupdated]

root 530 0.0  0.1 1372 436 ?   S    14:25 0:00 klogd -x

rpc  550 0.0  0.2 1516 540 ?   S    14:25 0:00 portmap

Колонка STAT показывает состояние процесса. Здесь можно встретить следующие коды:

□ S (Sleeping) — спящий, это нормальное состояние для сервисов, которые просыпаются только на редкие запросы клиентов;

□ R (Runnable) — исполняемый в данный момент;

□ T (Traced or Stopped) — в состоянии отладки или остановлен;

□ Z (Zombied) — зависший. Такие можно смело убивать;

□ W — не имеет резидентных страниц;

□ < — обладает высоким приоритетом;

□ N — имеет низкий приоритет.

Это основные состояния, которые вы можете увидеть у процессов в своей системе.

Если в колонке стоит вопросительный знак, то это означает, что процесс запущен еще на этапе загрузки системы и не принадлежит какому-либо терминалу.

Это всего лишь небольшой фрагмент файла. В реально работающей системе процессов очень много, и даже при минимальном количестве запущенных сервисов может не хватить одного экрана для отображения всех. Я люблю сохранять результат работы в текстовый файл, а потом спокойно изучать его в любом редакторе. Для этого я выполняю команду:

ps -axu >> ps.txt

Чтобы увидеть, чем в данный момент занимаются другие пользователи, можно выполнить команду w. В результате вы получите на экране приблизительно такую картину:

10:59am up 37 min, 2 users, load average: 0.00, 0.00, 0.00

USER   TTY FROM LOGIN@  IDLE  JCPU  PCPU  WHAT

root   tty1 -   10:24am 0.00s 0.82s 0.05s w

flenov tty2 -   10:39am 8:13  0.85s 0.03s grotty

Из данного примера понятно, что в системе находятся два пользователя. На первом терминале работает пользователь root, а на втором — flenov. Очень удобно определять по списку, когда пользователь вошел в систему (колонка LOGIN@) и что делает в данный момент (колонка WHAT).

Посмотрите на столбцы JCPU и PCPU, по ним можно оценить загрузку системы. Если ваш компьютер начал работать слишком медленно, то можно увидеть, какой процесс отнимает много процессорного времени.

Команда ps выводит статическую информацию. Для наблюдения за нагрузкой системы удобнее использовать программу top. Она отображает список процессов, отсортированный по убыванию в зависимости от нагрузки (рис. 3.4). Таким образом, вы можете увидеть, какой сервис или программа отнимает драгоценные ресурсы и не дает нормально работать с компьютером.

Рис. 3.4. Результат работы программы top

Если мой компьютер начинает "тормозить", или работа замедляется через определенные промежутки времени, то я запускаю top в отдельном терминале и по мере необходимости переключаюсь на него, чтобы увидеть нагрузку процессов.

Вверху окна выводится количество пользователей, общая загрузка системы и статистика процессов: общее количество, спящие, выполняемые, зависшие и остановленные.

Помимо этого, можно увидеть краткий отчет по использованию памяти: количество занятой и свободной оперативной памяти и размер раздела подкачки. В моем случае в компьютере установлено 256 Мбайт памяти, и из них свободно только 7 Мбайт, а раздел подкачки пока не используется. Такое малое количество свободной памяти говорит о том, что не помешало бы ее нарастить. Чем меньше компьютер использует swap-файл, тем лучше он работает. Конечно, пока что этот файл практически не используется, но если перейти в графический режим и запустить пару мощных приложений, то и Swap-раздела не хватит.

Программа top будет выводить информацию о загрузке процессора с определенным интервалом времени. Для выхода из программы нажмите комбинацию клавиш +.

 

3.5. Планирование задач

 

Очень часто возникает необходимость выполнить какую-либо операцию в определенное время. Раньше я надеялся на свою память и вручную выполнял команды. Но когда несколько раз произошла осечка — просто был слишком занят, чтобы обратить внимание на часы и выполнить нужные действия, — я переложил задачу по слежению за временем на компьютер. И действительно, зачем держать в голове то, что компьютер сделает лучше и точно в указанный срок?

А что если необходимо выполнять какие-то простые, но трудоемкие задачи после рабочего дня? Неужели придется оставаться на службе на всю ночь? Конечно же, нет. Компьютер может сам все сделать без вмешательства человека, главное правильно ему рассказать, что и когда надо выполнить.

 

3.5.1. Формирование задания

Самый простой, надежный и любимый хакерами способ решить проблему запуска в определенное время — это команда at. В простейшем случае формат ее вызова следующий:

at hh:mm dd.mm.yy

При отсутствии даты используется ближайшая возможная. Например, если время больше текущего, то будет установлена текущая дата, если меньше, — то следующий день, потому что сегодня эта команда уже выполниться не сможет.

Рассмотрим использование команды at на реальном примере, с которым вы можете столкнуться в жизни. Допустим, что в начале рабочего дня мы завели нового пользователя. Мы также знаем, что этот сотрудник будет работать до 12 часов. Если после этого времени забыть удалить учетную запись, то пользователь останется в системе, а это большая дыра в безопасности.

Для начала необходимо выполнить команду at, указав время 12:30. Я беру запас 20 минут на случай, если пользователь задержится в системе. Для этого выполните команду:

at 12:50

В ответ на это появится приглашение для ввода команд:

at>

Введите необходимые инструкции. Например, для удаления пользователя необходимо выполнить команду userdel и стереть соответствующий каталог:

userdel tempuser

rm -fr /home/tempuser

Подробней об управлении пользователями мы узнаем в гл. 4, а сейчас нужно довериться мне и просто использовать эти команды. Конечно же, в вашей системе сейчас нет пользователя tempuser, и команда не отработает, но нас интересует сам факт ее запуска в указанное время.

Наберите эти команды, в конце каждой из них нажимая клавишу . Для завершения ввода используйте комбинацию клавиш +. В ответ на это вы должны увидеть текстовое сообщение, содержащее дату и время, в которое будет выполнена команда, и идентификатор задания. Сообщение будет выглядеть примерно следующим образом:

Job 1 at 2005-03-03 12:30

С помощью команды atq можно увидеть список заданий, поставленных в очередь. Например, результат может быть следующим:

1 2005-01-28 12:40 a root

2 2005-01-28 01:00 a root

3 2005-01-30 12:55 a root

В первой колонке стоит номер задания, им можно управлять. После этого выводится дата выполнения команды, и в последней колонке — имя пользователя, который создал задачу.

Теперь допустим, что необходимо выполнять в определенное время (после окончания рабочего дня) резервное копирование. А что если в какой-либо день сотрудники задержались на работе, и им необходимо выполнить операции, которые сильно загружают систему. В этом случае резервное копирование будет мешать их работе, и логичнее отложить запуск задания.

Для решения этой проблемы создавайте задачу командой batch. Если в момент выполнения задания сервер будет загружен, то работа будет начата, когда нагрузка на сервер будет минимальной, по умолчанию менее 0,8%.

 

3.5.2. Планировщик задач

Команда at достаточно проста и удобна, но ее задания выполняются однократно, а многие задачи администратора (то же резервное копирование) требуют многократного запуска. Допустим, что вы запланировали резервное копирование ежедневно в 10 часов вечера. Каждый день набирать команду at не очень интересно, это надоест через неделю работы и захочется как-то оптимизировать задачу. Создавать файл сценария тоже не слишком удобно, потому что необходимо не забывать его выполнять.

Проблема решается через использование программы cron. Для этого у вас должен быть установлен демон crond, а лучше, если вы включите его в автозагрузку.

Для работы с демоном crond используется программа crontab. Чтобы добавить новую запись в расписание, необходимо выполнить ее без параметров. В ответ на это появится пустая строка, в которой можно задавать шаблон даты и необходимую команду. В общем виде это выглядит как:

минуты часы день месяц деньнедели команда

День недели указывается числом от 0 до 7. На воскресенье указывают 0 и 7. Это сделано именно так, потому что в различных странах по-разному определяется начало недели — где-то с понедельника, а иногда с воскресенья. В первом случае удобно выставлять значения от 1 до 7, в другом — от 0 до 6.

Если какой-либо параметр не имеет значения, то вместо него необходимо поставить звездочку.

Теперь рассмотрим несколько примеров.

00 5 * * * /home/flenov/backup1_script

Здесь заполнены только часы и минуты. Так как остальные параметры не указаны, то команда будет выполняться ежедневно в 5, вне зависимости от дня недели, числа или месяца.

00 20 * * 1 /home/flenov/backup2_script

Эта команда выполняет тот же файл сценария каждый понедельник (день недели равен 1) в 20:00.

00 * * * * /home/flenov/backup3_script

Такая команда будет выполняться каждый час ровно в 00 минут.

Внимание!

Если вы запустили программу crontab и, не введя команд, нажмете клавиши <Ctrl>+<D>, то все предыдущие задания сотрутся. Будьте внимательны, для выхода из программы без сохранения используйте только клавиши <Ctrl>+<C>.

Помимо этого, у сервиса cron есть несколько дополнительных директорий, упрощающих создание расписаний. Вот распределение выполняемых сценариев по каталогам:

□ /etc/cron.hourly — ежечасно;

□ /etc/cron.daily — ежедневно;

□ /etc/cron.weekly — еженедельно;

□ /etc/cron.monthly — ежемесячно.

Вроде все просто, но если сценарий выполняется еженедельно, то в какое время и в какой день недели? Все станет ясно, если посмотреть на конфигурационный для сервиса cron файл /etc/crontab. В нем есть следующие строки:

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

В начале строки указывается время выполнения. Вы можете изменить его так, что сценарии из директории /etc/cron.monthly начнут выполняться ежечасно. Так что, названия чисто символические и только по умолчанию. Они легко меняются.

Обратите также внимание, что в этих директориях уже есть сценарии, и все ненужные можно убрать, чтобы излишне не нагружать систему, или запланировать их выполнение на другое время.

Чтобы просмотреть список существующих заданий, выполните команду crontab с параметром -1. Для редактирования уже созданных записей выполните команду crontab с параметром -е. В ответ на это запустится текстовый редактор, в котором можно корректировать записи. Кстати, если вы не работали с этим редактором, то могут возникнуть проблемы, потому что он достаточно специфичный. Тогда нажмите клавишу и воспользуйтесь справкой. Команды тоже вводятся необычно. По выходу из этого редактора изменения вступают в силу мгновенно, а чтобы закончить работу без сохранения изменений, наберите ":q!" и нажмите клавишу .

В принципе, все задания cron хранятся в текстовом виде. Для каждого пользователя формируется свой crontab-файл в директории /var/spool/cron/файл. Имя созданного файла совпадает с именем пользователя.

Вот пример содержимого crontab-файла:

#DO NOT EDIT THIS FILE - edit the master and reinstall.

#(- installed on Thu Jan 27 13:55:49 2005)

#(Cron version--$Id:crontab.c,v2.13 1994/01/17 03:20:37 vixie Exp $)

10 * * * * ls

Вы можете редактировать его напрямую, без использования команды crontab -е.

 

3.5.3. Безопасность работ

Напоследок хочется добавить во все преимущества команды at ложку дегтя. Злоумышленники очень любят использовать эту инструкцию в своих целях. Например, хакер может завести учетную запись с максимальными правами. Затем настроить команду at так, чтобы после выхода она удаляла запись и чистила следы его пребывания в системе.

В каталоге /etc есть два файла, которые вы должны настроить:

□ at.allow — по умолчанию этого файла может и не быть. Если он существует, то только те пользователи, которые в нем прописаны, могут выполнять команду at;

□ at.deny — в этом файле перечисляются пользователи, которым явно запрещен доступ к команде at.

Подобные файлы есть и для сервиса cron:

□ cron.allow — здесь описываются пользователи, которые могут работать с заданиями в cron;

□ cron.deny — в этом файле указываются пользователи, которым недоступен сервис cron.

Я не раз говорил и буду повторять, что все настройки должны идти от запрещения. Сначала необходимо все закрыть, а потом позволить только то и лишь тем пользователям, которым посчитаете нужным. Именно поэтому не стоит пытаться внести всех пользователей в список at.deny. Намного корректнее создать файл at.allow и для начала прописать там только свою учетную запись (будет лучше, если это не root-пользователь). Если вслед за этим вы услышите жалобы пользователей о нехватке команды at, то сначала убедитесь, что им действительно она нужна, и только после этого прописывайте их учетные записи в файл at.allow.

Ни один лишний пользователь не должен работать с командой at. Иногда лучше забыть выполнить команду, чем потерять контроль над системой.

Если вы не запускаете планировщики at и cron, то я рекомендую убрать сервис crond из автозапуска, а лучше даже удалить. Вы не сможете контролировать то, чем не пользуетесь.

В директории /etc есть файл crontab, в котором находятся все настройки сервиса cron. Я рекомендую внести в начало этого файла следующую директиву:

CRONLOG=YES

Это позволит записывать в журнал команды, которые выполнялись в cron. Журнал сервиса находится в файле /var/cron/log.

 

3.6. Настройка сети

 

После установки ОС Linux легко определяет сетевые карты. В этом у меня еще не было проблем. Но для работы в сети этого недостаточно. Во время инсталляции вы уже могли указать основные параметры подключения, но иногда появляется необходимость изменить настройки, и не будете же вы переустанавливать систему, когда нужно выполнить всего пару команд.

Для передачи данных по сети необходимо установить и настроить протокол — правила, по которым два удаленных устройства будут обмениваться информацией. Правила описывают, нужно ли устанавливать соединение, как происходит проверка целостности переданных данных, требуется ли подтверждение доставки и т.д. Все это реализовано в протоколе, а ваша задача его правильно настроить.

 

3.6.1. Адресация в Linux

Основным для Linux является ставший стандартом для Интернета протокол TCP/IP (Transmission Control Protocol/Internet Protocol, протокол управления передачей/протокол Интернета), который уже установлен, и достаточно его только настроить. Если вы еще не встречались с этим протоколом, то советую прочитать соответствующую книгу по этой теме. Мы не сможем здесь затронуть все нюансы TCP/IP, а остановимся только на базовых понятиях.

Для того чтобы сеть работала, нам необходимо, как минимум, настроить следующие параметры:

1. Указать адрес. Каждое устройство в сети должно иметь свой адрес. Без этого связь невозможна. Представьте себе, если бы дома не имели своего адреса, как бы тогда почтальоны доставляли письма? Имена компьютеров для этого не годятся, и об этом мы поговорим в гл. 11.

Вся адресация в сети происходит по IP-адресу, который состоит из четырех октетов десятичных чисел (для самой распространенной сейчас 4 версии IP-протокола), разделенных точками. Каждое число не может быть более 255. Если вы подключены к Интернету, то для такого интерфейса может быть установлен адрес, который выдал вам провайдер.

Для подключения по локальной сети адреса задаются самостоятельно. Я рекомендую для примера ограничиться адресами вида 192.168.1.x, где x — это число от 1 до 254 (значения 0 и 255 имеют специальное назначение). Каждому компьютеру должен быть присвоен свой адрес, отличающийся последней цифрой. Третий октет может быть любым, но обязательно одинаковым для всех компьютеров вашей сети. Я у себя использую число 77, т.е. адреса машин имеют вид 192.168.77.x.

2. Установить маску подсети. В сочетании с IP-адресом используется номер, называемый маской подсети, позволяющий разбить сеть на более мелкие сегменты (узлы). Из чего состоит ваш домашний адрес? Это город, улица и дом. Сеть имеет только две характеристики — номер сети и номер компьютера внутри нее. Маска определяет, какая часть в IP-адресе относится к сети, а что характеризует компьютер.

Чтобы понять назначение маски, необходимо каждое число перевести в двоичную систему. Для примера рассмотрим маску 255.255.255.0, она в бинарном виде выглядит так:

11111111.11111111.11111111.00000000

Теперь переведем в двоичную систему IP-адрес 192.168.001.001:

11000000.10101000.00000001.00000001

Нужно сопоставить IP-адрес и маску. Там, где стоят единицы — это адрес сети, а нули выделяют адрес компьютера в сети. В маске единицы обязательно должны идти слева, а нули — справа. Нельзя чередовать единицы с нулями. Следующая маска является корректной:

11111111.11111111.00000000.00000000

А вот такая будет ошибочной:

11111111.11111111.00000000.11111111

Справа от нулей не может быть единиц.

Получается, что первые три октета в IP-адресе при маске 255.255.255.0 — это адрес сети, а последний — номер компьютера в этой сети, а т.к. под него в данном случае отведено одно число, максимальное значение которого 255, то нетрудно догадаться, какое количество компьютеров может быть в вашей сети.

Рассмотрим еще пример:

192.168.001.001 — IP-адрес

255.255.000.000 — маска подсети

В данном случае первые два октета — это номер сети, а оставшиеся два — номер компьютера в сети. Число, которое можно задать двумя группами, гораздо больше, чем 255, а значит, и сеть будет масштабнее.

Теперь можно сделать одно заключение. Компьютеры, имеющие один адрес сети (совпадают три первые числа), могут общаться между собой. Машины в разных сетях не видят друг друга. Чтобы они смогли взаимодействовать, необходимо специальное устройство (маршрутизатор), которое объединяет разнородные сети и может передавать пакеты между ними.

 

3.6.2. Информация о сетевых подключениях

Для получения информации о текущей настройке сетевых карт и протокола TCP/IP необходимо выполнить команду ifconfig. Пример ответа можно увидеть в листинге 3.4.

Листинг 3.4. Информация о конфигурации и состоянии сети

eth0 Link encap:Ethernet HWaddr 00:03:FF:06:A4:6C

     inet addr:192.168.77.1 Bcast:192.168.77.255

     Mask:255.255.255.0

     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

     RX packets:108 errors:0 dropped:0 overruns:0 frame:0

     TX packets:104 errors:0 dropped:0 overruns:0 carrier:0

     collisions:0 txqueuelen:100

     RX bytes:7687 (7.5 Kb) TX bytes:14932 (14.5 Kb)

     Interrupt:11 Base address:0x2000

lo   Link encap:Local Loopback

     inet addr:127.0.0.1 Mask:255.0.0.0

     UP LOOPBACK RUNNING MTU:16436 Metric:1

     RX packets:122 errors:0 dropped:0 overruns:0 frame:0

     TX packets:122 errors:0 dropped:0 overruns:0 carrier:0

     collisions:0 txqueuelen:0

     RX bytes:9268 (9.0 Kb) TX bytes:9268 (9.0 Kb)

Как видите, в листинге 3.4 показано два интерфейса: eth0 и lo. Первый из них — это реальная сетевая карта, имя которой в общем виде имеет вид ethX, где X — число, означающее номер устройства связи в системе. Нумерация начинается с нуля. Если у вас в компьютере две сетевые карты, то их имена будут eth0 и eth1.

Второй интерфейс всегда имеет имя lo (loopback), IP-адрес 127.0.0.1 и маску 255.0.0.0. Этот интерфейс существует в любой системе с сетевой картой и имеет именно этот IP. В принципе, этот адрес ни на что не указывает и не входит ни в какую сеть. Его используют для тестирования и отладки сетевых приложений. Данный интерфейс часто называют петлей, потому что он замыкает на себя. Все пакеты, которые отправляются на этот адрес, посылаются вашему компьютеру.

Помимо сведений о конфигурации сетевых интерфейсов, команда выдает еще много полезной информации, например, количество отправленных и полученных пакетов (параметры RX и TX).

Есть еще один интересный адрес, который можно увидеть у сетевой карты eth0, — параметр Hwaddr (Hardware Address, аппаратный адрес). Его еще часто называют MAC-адресом (Media Access Control, управление доступом к среде). Это 48-разрядный серийный номер сетевого адаптера, присваиваемый производителем. Он уникален, потому что у каждого изготовителя свой диапазон адресов. Так как интерфейс lo создан программно (реально не существует), у него не может быть аппаратного адреса.

 

3.6.3. Изменение параметров сетевого подключения

С помощью ifconfig можно не только просматривать параметры сетевых подключений, но и изменять их. Для этого нужно указать два параметра:

□ сетевой интерфейс, параметры которого нужно изменить;

□ параметры.

Общий вид команды выглядит так:

ifconfig ethX параметры

Рассмотрим значения, которые вы можете использовать:

□ down — остановить интерфейс. Например, для завершения работы сетевой карты eth0 выполните команду: ifconfig eth0 down. Если после этого исполнить директиву ifconfig без параметров, то в результирующем списке сетевого интерфейса eth0 не будет видно;

□ up — включить интерфейс, если он был остановлен. Например, если вы хотите восстановить работу сетевой карты eth0, выполните команду: ifconfig eth0 up;

□ IP-адрес — если вы хотите изменить IP-адрес, то укажите его повое значение в качестве параметра. Например, если нужно поменять текущий адрес на 192.168.77.3, то выполните команду ifconfig eth0 192.168.77.3. Одной командой можно изменить и маску сети. Для этого выполняем директиву ifconfig eth0 192.168.77.3 netmask 255.255.0.0. Здесь, после ключевого слова netmask, показана новая маска сети.

Если в момент изменения адреса сетевой интерфейс отключен, то его можно сразу же запустить командой ifconfig eth0 192.168.77.3 netmask 255.255.0.0 up.

Это основные возможности директивы ifconfig, с которыми вам придется сталкиваться в реальной жизни. Более подробную информацию можно получить, если выполнить команду man ifconfig.

 

3.6.4. Базовые настройки сети

С помощью команды hostname можно просмотреть имя компьютера (хоста). Выполните эту команду и перед вами появиться имя, которое вы задали во время установки. Чтобы изменить его, нужно указать новое имя в качестве параметра. Например, следующая команда устанавливает хост "server":

hostname server

Основные настройки сети находятся в файле /etc/sysconfig/network. Давайте посмотрим на его содержимое:

cat /etc/sysconfig/network

В результате на экране появится примерно следующая информация:

NETWORKING=yes

FORWARD_IPv4=true

HOSTNAME=FlenovM

Нет смысла изменять какие-либо из этих параметров вручную, когда есть специализированные утилиты. Этот файл я показал вам только для примера.

 

3.7. Подключение к сети Интернет

К первоначальным настройкам системы я отношу и подключение к Интернету. Если лет 10 назад это было диковинкой и дорогим удовольствием, то сейчас Интернет стал неотъемлемой частью любого компьютера. Трудно себе представить жизнь без общения и обмена информацией.

Всемирная сеть является громадным хранилищем всевозможных данных. Здесь вы сможете найти различное программное обеспечение или документацию. Впоследствии я дам ссылки в Интернете на программы, которые смогут облегчить жизнь, и их необходимо будет скачать (см. приложение 2). Без доступа в сеть это невозможно.

Я не стану описывать все возможные настройки соединений, потому что конкретные нюансы вы сможете узнать у вашего провайдера. Нас будет интересовать соединение через простой модем.

Если вы установили графическую оболочку, то в ней соединение с Интернетом создать легко. Да и работать с Web-страницами в графическом режиме (в браузерах типа Mozilla) намного проще, удобнее и приятнее. Именно для этого вы обязательно должны настроить графическую оболочку, но пользоваться ею необходимо в крайнем случае и только на рабочей станции, но не на действующем сервере.

На данный момент самой простой и удобной программой для создания интернет-соединения является Kppp. Для ее запуска вызовите главное меню Linux и выберите пункт Интернет/Kppp. Должно открыться окно, как показано на рис. 3.5.

Рис. 3.5. Главное окно программы Kppp

Для начала щелкните кнопку Настройка для указания параметров нового соединения. На это действие перед нами открывается диалоговое окно с вариантами настройки: использование мастера или ручной режим. В мастере есть список крупных провайдеров разных стран, и достаточно только выбрать нужную стоку и указать пару дополнительных значений. Если ваш провайдер услуг Интернета отсутствует, то придется делать настройку самостоятельно.

В ручном режиме появляется окно, в котором чаще всего достаточно указать только номер телефона для дозвонки. Остальные параметры в большинстве случаев используют значения по умолчанию.

Настроив соединение, достаточно только ввести имя пользователя и пароль, которые вам дал поставщик услуг, и нажать кнопку Подключиться. Если все указано верно, то через несколько секунд (минут) вы окажетесь во всемирной сети.

 

3.8. Обновление ядра

 

Обновление программ позволяет получать новые возможности и исправлять ошибки, сделанные программистами в предыдущих версиях. Основа Linux — это ядро, и оно обновляется очень часто за счет динамичного развития этой ОС. Не пугайтесь ошибок, они есть всегда и везде, и мы еще поговорим об этом (см. разд. 14.1). Вы должны уметь устанавливать новое ядро в свою систему.

Большинство программ в настоящее время реализованы в виде пакетов RPM, которые очень легко инсталлировать. То же самое относится и к ядру ОС. Но на практике самые свежие версии ядра поставляются в исходных кодах. В этом случае процесс установки усложняется, но зато появляется возможность настроить систему на максимальную производительность. Вы можете включить в ядро только то, что необходимо, и оптимизировать под конкретное железо.

Производители дистрибутивов включают в поставку универсальное ядро, которое сможет одинаково хорошо работать на различных платформах. При этом во всех дистрибутивах, которые я видел, включена поддержка модулей. Это очень удобно, но не всегда хорошо.

Еще несколько лет назад взломщики очень часто использовали подмену системных файлов, чтобы встроить в них сплоиты (программа, позволяющая использовать уязвимость) или потайные двери (backdoor). Для борьбы с такой подделкой было разработано множество утилит, которые запрещают изменение системных файлов и следят за их контрольной суммой. В случае каких- либо трансформаций подается сигнал тревоги.

Хакеры, недолго думая, перешли на использование модулей к ОС Linux. Их проследить сложнее, а результат от использования тот же, да и задачи они решают любые. Запретив использование модулей, мы закрываем эту дыру в безопасности, но вы должны учитывать, что могут возникнуть проблемы в работе ОС. Некоторые производители железа или системных утилит любят использовать модули. Это и понятно, ведь их установка проще и позволяет получить необходимые возможности без перекомпиляции ядра. Но мы же знаем, что безопасность и удобство — несовместимые понятия.

 

3.8.1. Подготовка к компиляции

Прежде чем выполнять какие-то действия по обновлению ядра, нужно подготовиться к самому худшему, а именно — к краху системы. Да, неправильные действия в самом деле могут нарушить работу или сделать невозможной загрузку системы. Ядро — это основа, и если что-то указать неправильно, то оно может работать некорректно.

Если на вашем сервере уже есть какие-либо данные, то следует сделать их резервную копию. Помимо этого, приготовьте загрузочную дискету, которая может пригодиться в непредвиденной ситуации (например, в случае нарушения загрузочной записи).

Для создания загрузочной дискеты необходимо выполнить следующую команду:

/sbin/mkbootdisk ver

В данном случае ver — это номер версии ядра, установленного в вашей системе. Если вы не знаете текущую версию вашего ядра, выполните команду:

uname -r

На моем тестовом сервере на данный момент установлено ядро 2.4.18-5asp. Чтобы создать загрузочную дискету для него, выполняем:

/sbin/mkbootdisk 2.4.18-5asp

Если неверно указать версию, то дискета не будет создана, потому что программа ищет необходимые для загрузочной дискеты файлы в директории /lib/modules/ver, где ver — это номер версии. В моем случае это директория /lib/modules/2.4.18-5asp.

 

3.8.2. Обновление ядра из RPM-пакета

Самый простой способ установить новое ядро — использование RPM-пакета. Установка такая же, как и любой другой программы. Для обновления ядра можно выполнить команду:

rpm -Uvh ИмяПакета

Если вы хотите установить новое ядро, то ключ U необходимо заменить на ключ i. ОС Linux удобна тем, что можно одновременно установить несколько ядер. Правда, загрузить можно только одно из них.

Из RPM-пакета устанавливаются только все необходимые файлы, модули и загрузчик, но чтобы можно было загрузиться с новым ядром, необходимо еще прописать ядро в загрузчик LILO.

Установка из RPM-пакета дает нам доступ к новым функциям и исправляет старые ошибки. Возможности ядра остаются теми же, что заложил разработчик. Максимальных преимуществ от обновления можно добиться только при компиляции ядра.

 

3.8.3. Компиляция ядра

При установке из RPM-пакета мы получаем модульное ядро, в котором драйверы устройств могут быть как скомпилированы в одно целое с ядром, так и загружаться отдельно. Такое ядро медленнее в работе, но позволяет обновлять драйверы простой заменой модулей.

При компиляции можно выбрать и монолитное ядро. В этом случае в него будут встроены все необходимые драйверы, что повысит производительность, но это сделает невозможным обновление без перекомпиляции всего ядра.

Я рекомендую вам разобраться с компиляцией, потому что все свежие ядра выходят в исходных кодах, а издание RPM-пакетов иногда запаздывает на неделю и более. Все это время ваша система будет уязвимой.

Как правило, ядро поставляется в виде tar-архива. Сначала его надо разархивировать:

tar xzvf linux-2.6.10-rc2.tar.gz

Имя архива в вашем случае может отличаться. Я беру самое новое на момент написания книги ядро, которое специально скачивал с сайта www.redhat.com.

Архив распаковывается в директорию linux-2.6.10-rc2 (имя архива без расширения tar.gz). Необходимо перейти в этот каталог, чтобы выполнять дальнейшие действия по компиляции из этой директории.

Для начала нужно сконфигурировать ядро, т.е. указать, что мы хотим получить в результате. Для этого можно использовать одну из четырех утилит:

1. oldconfig — сценарий, который устанавливает значения по умолчанию без нашего ведома. Для вызова используйте команду make oldconfig.

2. config — сценарий, который в командном интерпретаторе задает вам вопросы о параметрах будущего ядра и в зависимости от ваших ответов формируется конфигурационный файл для компиляции. Для вызова используйте команду make config.

3. menuconfig — текстовая утилита (рис. 3.6). Наиболее удобный вариант конфигурирования из консоли. Для вызова используйте команду make menuconfig.

Рис. 3.6. Текстовая утилита конфигурирования ядра menuconfig

4. qconf (xconfig) — графическая утилита (рис. 3.7). Наиболее удобный вариант конфигурирования ядра из графической оболочки Linux. Для вызова используйте команду make xconfig.

Рис. 3.7. Графическая утилита конфигурирования ядра qconf

Во время конфигурации с помощью любой из вышеперечисленных утилит вы должны указать, нужна ли поддержка загружаемых модулей.

Если вы хотите иметь два разных ядра одной и той же версии, например, с поддержкой модулей и без нее, то необходимо открыть файл Makefile и в параметре EXTRAVERSION указать различные значения:

□ EXTRAVERSION=-rc2-module — при компиляции ядра с модулями;

□ EXTRAVERSION=-rc2-nomodule — при компиляции ядра без модулей.

Лучше всего указывать в этом параметре, чем именно будет отличаться ядро. Например, помимо -rc2-module можно вставить дополнительное пояснение, но оно должно быть максимально коротким.

Теперь выполняем команды подготовки к компиляции:

make dep

make clean

Следующая команда отнимет достаточно много времени, потому что она будет компилировать непосредственно ядро. Можно отправляться готовить кофе и пить его медленно и печально. Если у вас слабый процессор и памяти менее 256 Мбайт, то процедура будет долгой.

Итак, для компиляции ядра выполним команду:

make bzImage

Во время компиляции вы увидите список собираемых в ядро модулей. Их очень много, поэтому процесс продолжительный.

Если вы выбрали компиляцию ядра с использованием загружаемых модулей, то следующие две команды должны выполнить эту операцию:

make modules

make modules_install

Если вы запретили использование модулей, то эти команды можно пропустить, потому что от них толку мало, а выполняются они долго.

Все модули располагаются в директории /lib/modules/. С помощью первой команды мы скомпилировали модули нового ядра, а вторая скопирует их в каталог /lib/modules/. Здесь вы найдете директории модулей для каждой из версий ядер, установленных в системе.

Теперь инсталлируем скомпилированное ядро. Для этого выполняем следующую команду:

make install

Эта команда скопирует все необходимые файлы для загрузки на свои места. Загляните в директорию /boot. Здесь можно найти несколько файлов, в том числе и загрузчик для новой версии ядра. Их легко можно определить по номеру. Например, я компилировал ядро 2.6.10, и у меня появились файлы vmlinuz-2.6.10 и initrd-2.6.10.img.

 

3.8.4. Настройка загрузчика

Теперь посмотрим, как можно настроить загрузку нового ядра, оставив при этом возможность пользоваться старыми версиями. Для этого нужно отредактировать файл /etc/lilo.conf, добавив в конец файла следующие строки:

image=/boot/vmlinuz-2.6.10

label=Linux Kernel 2.6.10

initrd=initrd-2.6.10.img

read-only

root=/dev/hda0

В первой строке находится путь к ядру. Вы должны указать правильный путь, а точнее, имя файла, которое будет отличаться номером версии. Параметром label задается заголовок нового ядра, который вы будете видеть при загрузке системы. Параметр initrd определяет загрузчик. Последняя строка указывает корневой диск. Введите такое же значение, как и у старого ядра. В вашем загрузчике уже должна быть подобная строка, и она одинакова для обеих систем.

После изменения конфигурационного файла /etc/lilo.conf необходимо прописать изменения в загрузочную область. Для этого выполните команду lilo.

Перезагрузите систему, и теперь при старте компьютера вы сможете выбирать, какое ядро загружать. При этом будут использоваться одни и те же конфигурационные файлы, что очень удобно. Если новое ядро окажется неработоспособным, достаточно перезагрузить компьютер со старым ядром и продолжить работу до выхода обновлений.

 

3.8.5. Работа с модулями

Преимущество модульной сборки ядра заключается в том, что вы можете изначально включить только самые необходимые функции и тем самым уменьшить потенциальные уязвимости, которыми может воспользоваться хакер. Но при этом мы должны иметь возможность управлять модулями (так же, как и сервисами).

Система должна загружаться только с теми модулями, которые применяются. Все остальные должны подгружаться по мере необходимости и отключаться, когда не используются.

lsmod

С помощью команды lsmod можно увидеть список загруженных модулей. Результат выполнения инструкции имеет примерно следующий вид:

Module      Size Used by Not tainted

binfmt_misc 7428 1

autofs     11812 0 (autoclean) (unused)

tulip      42240 1

ipchains   42216 6

ide-cd     30240 0 (autoclean)

cdrom      32000 0 (autoclean) [ide-cd]

ext3       62284 1

jbd        39804 1 [ext3]

modinfo

Очень трудно разобраться, какие модули нужны в системе, а какие нет, А ведь необходимо загружать только то, что действительно используется, иначе увеличивается время старта системы, понапрасну расходуются ресурсы компьютера и т.д. Так как же в этом разобраться? Необходимо знать каждый модуль в лицо и понимать, для чего он нужен.

Получить информацию о модуле помогает команда modinfo. В качестве параметра нужно передать имя интересующего модуля, и на экране будет выведена информация о нем. Например, следующая команда запрашивает у системы информацию о модуле ext3:

modinfo ext3

В ответ на это мы увидим примерно следующее:

filename: /lib/modules/2.4.18-5asp/kernel/fs/ext3/ext3.о

description: "Second Extended Filesystem with journaling extensions"

author: "Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger,

Theodore Ts'o and others"

license: "GPL"

parm: do_sync_supers int, description "Write superblocks

synchronously"

Таким образом, нам становятся известными имя и расположения файла, описание, автор, лицензия и т.д. Количество информации сильно зависит от модуля, и если честно, в некоторых случаях она настолько скудная, что предназначение модуля остается непонятным.

modprobe

Эта команда, в основном, используется системой для загрузки установленных модулей, но можно это делать и самостоятельно. В качестве единственного параметра нужно передать команде имя модуля, который нужно загрузить.

Например, следующая команда загружает модуль iptable_nat (о нем мы будем говорить в разд. 4.12):

modprobe iptable_nat

rmmod

Эта команда выгружает модуль, имя которого указано в качестве параметра. Если вы воспользовались модулем для выполнения определенных действий, то не забудьте по окончании работы его выгрузить. Иначе как раз он и может стать причиной взлома.