Михаил Фленов СанктПетербург бхвпетербург 2010 удк 681 06 ббк 32. 973. 26018. 2 Ф69
Скачать 3.69 Mb.
|
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. У вас даже не спросят пароль, потому что он пустой. Не забудьте поменять пароль, иначе это будет опасно для жизни. Это как электрику работать под высоким напряжением без средств защиты :). Добро пожаловать в Linux 81 Для смены пароля вы должны набрать команду passwd root , в ответ запус- тится программа, которая попросит вас дважды ввести код. Такой подход исключает случайную опечатку при наборе и может с большой долей вероят- ности гарантировать, что сохранен верный пароль. Ведь если вы случайно наберете не тот символ и не заметите этого, то не сможете воспроизвести па- роль . При двойном вводе дважды допустить одну и ту же ошибку проблема- тично , хотя и возможно. 3.3.3. Модули аутентификации Аутентификация на основе двух файлов /etc/passwd и /etc/shadow немного устарела и предоставляет нам слишком скудные возможности. Разработчики ядра ОС Linux стараются исправить ситуацию с помощью добавления новых алгоритмов шифрования, но все эти попытки чисто косметические, а нам не- обходимо кардинальное изменение. Абсолютно новое решение для реализации аутентификации предложила компания Sun — PAM (Pluggable Authentication Modules, подключаемые мо- дули аутентификации). Преимущество модульной аутентификации заключается в том, что для их использования не требуется перекомпиляция программы. Существуют моду- ли для основных методов аутентификации, таких как Kerberos, SecureID, LDAP и др. Конфигурационные файлы для каждого сервиса, который может использо- вать PAM, находятся в директории /etc/pam.d. В большинстве случаев вам не придется создавать эти файлы вручную, потому что они устанавливаются во время инсталляции программы из RPM-пакета. Но вы должны знать их структуру , чтобы можно было изменить какие-то параметры в случае необ- ходимости Каждая строка в конфигурационном файле состоит из четырех полей, разде- ленных пробелами: тип модуля, который может принимать одно из следующих значений: • auth — модуль будет использоваться для аутентификации и проверки привилегий пользователей; • account — модуль распределения ресурсов системы между пользова- телями ; • session — модуль поддержки сессии и регистрации действий пользо- вателей ; • password — модуль проверки пароля; Глава 3 82 флаг , определяющий параметры модуля. Здесь можно использовать четы- ре значения: • required — модуль обязателен; • optional — необязательный; • sufficient — достаточный; • requisite — модуль обязателен, а в случае ошибки управление пере- дается приложениию; полный путь к файлу модуля; аргументы модуля. Рассмотрим пример конфигурационного файла для 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-бит, при котором программа имеет права владельца. Добро пожаловать в Linux 83 Процессы могут работать в двух режимах — фоновом (background) и цен- тральном (foreground). Центральный режим для каждого терминала имеет только один процесс. Например, запустив по команде man ls программу для просмотра помощи, вы не сможете выполнять другие команды, пока не вый- дете из программы man . Если ни один центральный процесс в терминале не запущен , то им является интерпретатор команд. У тех, кто знаком с программой Midnight Commander, может возникнуть во- прос , а как же тогда работает mc и одновременно в нем можно выполнять команды ? Ответ прост: процессы могут порождать другие процессы. Это происходит и в mc, но если его закрыть, то закроются и все порожденные процессы 3.4.1. Смена режима Фоновыми процессами являются все сервисы. Они выполняют свои действия параллельно с вашей работой. Но и вы можете запустить любую программу в фоновом режиме. Для этого достаточно после указания команды через про- бел поставить знак &. Например, выполните сейчас следующую команду: man ls & В ответ на это вы не увидите файла помощи, а на экране появится только строка : [1] 2802 После этого терминал снова готов работать, потому что центральный процесс запустил команду man ls в фоновом режиме, и свободен для выполнения но- вых директив. А что же мы увидели в ответ на выполнение команды? В квадратных скобках показан порядковый номер фонового процесса, который мы запустили. Это число будет последовательно увеличиваться. В данном случае это первая команда , поэтому в квадратных скобках стоит единица. Это число формиру- ется для каждого пользователя. Если войти в систему через второй терминал и запустить фоновый процесс, то вы увидите примерно следующее: [1] 2805 В квадратных скобках опять число 1, а вот следующее значение отличается от выведенного на первом терминале. Это PID (Process ID, идентификатор процесса ) созданного процесса, который является уникальным для всех поль- зователей . Это значит, что если вы запустили процесс с номером 2802, то другой пользователь никогда не сможет запустить процесс с таким же иден- тификатором , по крайней мере до рестарта системы. Его PID будет другим. Запомните идентификаторы, которые вы увидели, впоследствии они при- годятся Глава 3 84 Чтобы узнать, какие процессы у вас запущены, выполните команду jobs В ответ на это вы получите: [1] + Stopped man ls В данном случае мы видим, что процесс с номером [1] загружен в память, и состояние команды man ls — Stopped (остановлен). Какой смысл в том, что мы отправили просмотр файла помощи в фоновый режим ? Я не зря выбрал эту команду, потому что в этом есть резон. Вы в лю- бой момент можете сделать фоновый режим основным. Для этого необходи- мо ввести команду fg %1 , где число 1 указывает номер вашего процесса, ко- торый вы видели в квадратных скобках. Попробуйте сейчас выполнить эту команду , и перед вами откроется запущенная программа man, отображающая файл помощи по использованию команды ls Раз процесс можно сделать центральным, значит можно поступить и наоборот. Чтобы вернуть процесс в фоновый режим, нажмите клавиши , чтобы убедиться , что команда man ls все еще работает. Если в программе есть возможность выполнять системные команды, то вме- сто сочетания клавиш Число 1 — это снова номер процесса. 3.4.2. Остановка процессов Чтобы прекратить работающий процесс, необходимо сделать его централь- ным и остановить штатными средствами. Чаще всего на экране есть под- сказка , которая поможет выйти из программы. Если она отсутствует, то следует обратиться к документации или просмотреть файл помощи, вызвав man имяпрограммы Сервисы могут работать только в фоне и не могут быть выведены на перед- ний план. Для того чтобы их остановить, есть специализированные команды, которые чаще всего имеют вид: имясервиса stop Иногда процессы зависают. Да, такие ситуации бывают и в ОС Linux. Цен- тральный процесс может быть снят с помощью комбинации клавиш , то можно поступить иначе. Для этого существует команда kill Чтобы отключить процесс по личному идентификатору (тому, что мы видели в квадратных скобках), используйте команду: kill %n Добро пожаловать в Linux 85 Параметр 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 . Но и это еще не весь перечень, потому что отобразятся только программы своего терминала. Если требуется полный список процессов, запущенных со всех терминалов, то нужно добавить ключ -x . Помимо этого, вы можете пожелать увидеть имя пользователя, под которым работает процесс, для этого добавьте ключ -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] Глава 3 86 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 — имеет низкий приоритет. Это основные состояния, которые вы можете увидеть у процессов в своей системе Если в колонке TTY стоит вопросительный знак, то это означает, что процесс запущен еще на этапе загрузки системы и не принадлежит какому-либо тер- миналу Это всего лишь небольшой фрагмент файла. В реально работающей системе процессов очень много, и даже при минимальном количестве запущенных сервисов может не хватить одного экрана для отображения их всех. Я люблю сохранять результат работы в текстовый файл, а потом спокойно изучать его в любом редакторе. Для этого я выполняю команду: 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 ). Добро пожаловать в Linux 87 Посмотрите на столбцы JCPU и PCPU , по ним можно оценить загрузку систе- мы . Если ваш компьютер начал работать слишком медленно, то можно уви- деть , какой процесс отнимает много процессорного времени. Команда ps выводит статическую информацию. Для наблюдения за нагруз- кой системы удобнее использовать команду top . Она отображает список про- цессов , отсортированный по убыванию в зависимости от нагрузки (рис. 3.4). Таким образом, вы можете увидеть, какой сервис или программа отнимает драгоценные ресурсы и не дает нормально работать с компьютером. Рис . 3.4. Результат работы команды top Если мой компьютер начинает "тормозить", или работа замедляется через определенные промежутки времени, то я запускаю top в отдельном термина- ле , и по мере необходимости переключаюсь на него, чтобы увидеть нагрузку процессов Вверху выводится количество пользователей, общая загрузка системы и ста- тистика процессов: общее количество, спящие, выполняемые, зависшие и остановленные. Помимо этого, можно увидеть краткий отчет по использованию памяти: ко- личество занятой и свободной оперативной памяти и размер раздела подкач- ки . В моем случае в компьютере установлено 256 Мбайт памяти, и из них свободно только 7 Мбайт, а раздел подкачки пока не используется. Такое ма- лое количество свободной памяти говорит о том, что не помешало бы ее Глава 3 88 нарастить . Чем меньше компьютер использует swap-раздел, тем быстрее он работает . Конечно, пока что этот раздел практически не используется, но ес- ли перейти в графический режим и запустить пару мощных приложений, то и swap-раздела не хватит. Программа top будет обновлять информацию о загрузке процессора с опре- деленным интервалом времени. Для выхода из программы нажмите 3.5. Планирование задач Очень часто возникает необходимость выполнить какую-либо операцию в определенное время. Раньше я надеялся на свою память и вручную выполнял команды . Но когда несколько раз произошла осечка — просто был слишком занят , чтобы обратить внимание на часы и выполнить нужные действия, — я переложил задачу по слежению за временем на компьютер. И действитель- но , зачем держать в голове то, что компьютер сделает лучше и точно в ука- занное время? А что если необходимо выполнять какие-то простые, но трудоемкие задачи после трудового дня? Неужели придется оставаться на работе на всю ночь? Конечно же, нет. Компьютер может сам все сделать без вмешательства чело- века , главное правильно ему рассказать, что и когда надо выполнить. 3.5.1. Формирование задания Самый простой, надежный и любимый хакерами способ решить проблему запуска в определенное время — это команда at . В простейшем случае фор- мат ее вызова следующий: at hh:mm dd.mm.yy Дату можно и не задавать, и тогда будет взята ближайшая возможная. Если заданное время больше текущего, то будет установлена текущая дата, если меньше , — то следующий день, потому что сегодня эта команда уже выпол- ниться не сможет. Рассмотрим использование команды at на реальном примере, с которым вы можете столкнуться в жизни. Допустим, что в начале рабочего дня мы завели нового пользователя. Мы также знаем, что этот сотрудник будет ра- ботать до половины первого. Если после этого времени забыть удалить учетную запись, то пользователь останется в системе, а это большая дыра в безопасности. Добро пожаловать в Linux 89 Для начала необходимо выполнить команду 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 90 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 и , не введя команд , нажмете Будьте внимательны , для выхода из про - граммы без сохранения используйте только Добро пожаловать в Linux 91 Помимо этого, у сервиса 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 с параметром -l . Для редактирования уже созданных записей вы- полните команду crontab с параметром -e . В ответ на это запустится тексто- вый редактор, в котором можно корректировать записи. Кстати, если вы не работали с этим редактором, то могут возникнуть проблемы, потому что он достаточно специфичный. Тогда нажмите Команды тоже вводятся необычно. По выходу из этого редактора изменения вступают в силу мгновенно, а чтобы закончить работу без сохранения изме- нений , наберите ":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 -e Глава 3 92 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. Если что-то произойдет без вашего ведома, то это можно будет определить по журналу. Добро пожаловать в Linux 93 3.6. Настройка сети После установки ОС Linux легко определяет сетевые карты. С этим у меня еще не было проблем. Но для работы в сети этого недостаточно. Во время инсталляции вы уже могли указать основные параметры подключения, но иногда появляется необходимость изменить настройки, и не будете же вы переустанавливать систему, когда нужно выполнить всего пару команд. Для передачи данных по сети необходимо установить и настроить прото- кол — правила, по которым два удаленных устройства будут обмениваться информацией . Правила описывают, нужно ли устанавливать соединение, как происходит проверка целостности переданных данных, требуется ли под- тверждение доставки и т. д. Все это реализовано в протоколе, а ваша задача лишь правильно его настроить. 3.6.1. Адресация Основным для Linux является ставший стандартом для Интернета протокол TCP/IP (Transmission Control Protocol/Internet Protocol, протокол управления передачей /протокол Интернет), который уже установлен, и достаточно его только настроить. Если вы еще не встречались с этим протоколом, то сове- тую прочитать соответствующую книгу по этой теме. Мы не сможем здесь затронуть все нюансы TCP/IP, а остановимся только на базовых понятиях. В основном мы будем говорить о 4-й версии, которая пока что наиболее рас- пространена Для того чтобы сеть работала, нам необходимо, как минимум, настроить сле- дующие параметры: 1. Указать адрес. Каждое устройство в сети должно иметь свой адрес. Без этого связь невозможна. Представьте себе, если бы дома не имели своего адреса , как бы тогда почтальоны доставляли письма? Имена компьютеров для этого не годятся, и об этом мы поговорим в главе 11. Вся адресация в сети происходит по IP-адресу, который состоит (для са- мой распространенной сейчас версии 4 протокола IP) из четырех десятич- ных чисел (октетов), разделенных точками. Каждое число не может быть более 255. Если вы подключены к Интернету, то для такого интерфейса может быть установлен адрес, который выдал вам провайдер. Для подключения по локальной сети адреса задаются самостоятельно. Я рекомендую ограничиться адресами вида 192.168.1.х, где х — это число от 1 до 254 (значения 0 и 255 имеют специальное назначение). Каждому компьютеру должен быть присвоен свой адрес, отличающийся последней Глава 3 94 цифрой . Третий октет может быть любым, но обязательно одинаковым для всех компьютеров вашей сети. Я у себя использую число 77, то есть адреса машин имеют вид 192.168.77.x. 2. Установить маску подсети. В сочетании с IP-адресом используется но- мер , называемый маской подсети, позволяющий разбить сеть на более мелкие сегменты (узлы). Из чего состоит ваш домашний адрес? Это город, улица и дом. Сеть имеет только две характеристики — номер сети и номер компьютера внутри нее. Маска определяет, какая часть в IP-адресе отно- сится к сети, а что характеризует компьютер. Для примера рассмотрим маску 255.255.255.0. Чтобы понять назначение маски , необходимо каждое число перевести в двоичную систему. Маска 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, а значит, и сеть будет масштабнее. Теперь можно сделать одно заключение. Компьютеры, имеющие один адрес сети (совпадают три первые числа), могут общаться между собой. Машины в разных сетях не видят друг друга. Чтобы они смогли взаимодействовать, Добро пожаловать в Linux 95 необходимо специальное устройство (маршрутизатор), которое объединяет различные сети и может передавать пакеты между ними. В современных дистрибутивах можно найти визуальные средства настройки сетевой карты. Например, в Mandriva 2008 в GNOME такую утилиту можно найти в центре администрирования. Для его запуска выберите Система | Администрирование | Настройка компьютера. В окне настройки найдите раздел Сеть и Интернет (рис. 3.5) и здесь выберите пункт Настройка ново- го сетевого интерфейса (LAN, ISDN, ADSL…). Рис . 3.5. Окно настройки сети и Интернета Перед вами появится окно мастера установки сетевого интерфейса. На пер- вом шаге нужно выбрать тип устройства, которое нужно настроить. Для на- стройки сетевой карты выберите пункт Ethernet и нажмите Далее. Дальней- шие шаги зависят от выбранного устройства и рассматривать все варианты не имеет смысла. Если вы разобрались с теорией, которую мы уже затронули, то никаких проблем с мастером не возникнет. Глава 3 96 Мастер будет удобен и в том случае, если вы решите использовать IPv6. Этот протокол обещают внедрить уже очень долго, но конца и края процессу вне- дрения не видно. Поэтому я решил не тратить время и место в книге на опи- сание данной версии. Утилиты для настройки будут использоваться те же, нужно только понимание того, как происходит адресация в IPv6, а это от- дельная и достаточно длинная история. Я постараюсь написать что-нибудь на эту тему и выложить в Интернете. 3.6.2. Информация о сетевых подключениях Для получения информации о текущей настройке сетевых карт и протокола TCP/IP необходимо выполнить команду ifconfig . Пример ее вывода можно увидеть в листинге 3.1. Листинг 3.1. Информация о конфигурации и состоянии сети 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.1 показано два интерфейса: eth0 и lo. Первый из них — это реальная сетевая карта, имя которой в общем виде имеет вид ethX, где X — число, означающее номер устройства связи в системе. Нумерация начинается с нуля. Если у вас в компьютере две сетевые карты, то их имена будут eth0 и eth1. Второй интерфейс имеет имя lo (loopback), IP-адрес 127.0.0.1 и маску 255.0.0.0. Этот интерфейс существует в любой системе с сетевой картой Добро пожаловать в Linux 97 и имеет именно этот 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 Можно одновременно изменить и маску сети. Для этого выполняем Глава 3 98 директиву 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 назад это было диковинкой и дорогим удовольствием, то сейчас Интернет стал неотъемлемой частью любого компьютера. Трудно себе пред- ставить жизнь без общения и обмена информацией. Лично я к сети подключен как минимум 10 часов в день. Хотя нет, это не я подключен, а мой компьютер. Всемирная сеть является громадным хранилищем всевозможных данных. Здесь вы сможете найти различную документацию или программное обес- печение . Впоследствии я дам ссылки в Интернете на программы, которые смогут облегчить жизнь, и их будет полезно скачать. Без доступа в сеть это невозможно Добро пожаловать в Linux 99 Я не стану описывать все возможные настройки соединений, потому что кон- кретные нюансы вы сможете узнать у вашего провайдера. Если вы установили графическую оболочку, то в ней соединение с Интерне- том создать легко. Да и работать с WEB-страницами в графическом режиме (в браузерах типа Mozilla) намного проще, удобнее и приятнее. Только ради этого стоит установить и настроить графическую оболочку, но пользоваться ею необходимо только на рабочей станции, но не на действующем сервере. Действующий сервер лучше держать в текстовом режиме, это намного эф- фективнее и безопаснее. Для настройки Интернета в графическом режиме можно использовать ту же утилиту , что и для настройки сети. Мы ее рассмотрели в разд. 3.6.1. 3.8. Обновление ядра Обновление программ позволяет получать новые возможности и исправлять ошибки , сделанные программистами в предыдущих версиях. Основа Linux — это ядро, и оно обновляется очень часто за счет динамичного развития этой ОС . Не пугайтесь ошибок, они есть всегда и везде, и мы еще поговорим об этом . Вы должны уметь устанавливать новое ядро в свою систему. Большинство программ в настоящее время реализованы в виде пакетов rpm, ко- торые очень легко инсталлировать. То же самое относится и к ядру ОС. Но на практике самые свежие версии ядра поставляются в исходных кодах. В этом случае процесс установки усложняется, но зато появляется возможность настроить систему на максимальную производительность. Вы можете включить в ядро только то, что необходимо, и оптимизировать под конкретное железо. Производители дистрибутивов включают в поставку универсальное ядро, которое сможет одинаково хорошо работать на различных платформах. При этом во всех дистрибутивах, которые я видел, включена поддержка модулей. Это очень удобно, но не всегда хорошо. Еще несколько лет назад взломщики очень часто использовали подмену сис- темных файлов, чтобы встроить в них сплоиты (программа, позволяющая использовать уязвимость) или потайные двери (backdoor). Для борьбы с та- кой подделкой было разработано множество утилит, которые запрещают из- менение системных файлов и следят за их контрольной суммой. В случае ка- ких -либо трансформаций бьется тревога. Хакеры , недолго думая, перешли на использование модулей к ОС Linux. Модули — это коллекции подпрограмм, выполняющие какую-то определен- ную системную функцию, например, поддержку устройства или, скажем, Глава 3 100 конкретной файловой системы. Поскольку различных модулей может быть очень много, отследить хакерский модуль сложнее, а результат его использо- вания тот же — дыра в системе безопасности. Запретив использование моду- лей , мы закрываем эту дыру, но при этом могут возникнуть проблемы в работе ОС . Некоторые производители железа или системных утилит любят исполь- зовать модули. Это и понятно, ведь их установка проще и позволяет получить необходимые возможности без перекомпиляции ядра. Но мы же знаем, что безопасность и удобство — несовместимые понятия. 3.8.1. Подготовка к компиляции Прежде чем выполнять какие-то действия по обновлению ярда, нужно подго- товиться к самому худшему, а именно — к краху системы. Да, неправильные действия действительно могут нарушить работу или сделать невозможной загрузку системы. Ядро — это основа, и если что-то указать неправильно, то ядро может работать некорректно. Если на вашем сервере уже есть какие-либо данные, то следует сделать их резервную копию (см. главу 13). Помимо этого, приготовьте загрузочную дискету , которая может пригодиться в случае нарушения загрузочной записи. Для создания загрузочной дискеты необходимо выполнить следующую команду : /sbin/mkbootdisk ver В данном случае ver — это номер версии ядра, установленного в вашей сис- теме . Если вы не знаете текущую версию вашего ядра, выполните команду: uname -r На моем тестовом сервере на данный момент установлено ядро 2.6.31. Чтобы создать загрузочную дискету для него, выполняем: /sbin/mkbootdisk 2.6.31 Если неверно указать версию, то дискета не будет создана, потому что про- грамма ищет необходимые для загрузочной дискеты файлы в директории /lib/modules/ver, где ver — это номер версии. В моем случае это директория /lib/modules/2.6.31. 3.8.2. Обновление ядра из пакета rpm Самый простой способ установить новое ядро — использование пакета rpm. Процесс установки такой же, как и любой другой программы. Для обновле- ния ядра можно выполнить команду: rpm —Uvh ИмяПакета Добро пожаловать в Linux 101 Если вы хотите установить новое ядро, то ключ U необходимо заменить на ключ i . ОС Linux удобна тем, что можно одновременно установить несколь- ко ядер. Правда, загрузить можно только одно из них. Из пакета rpm устанавливаются только файлы, модули и загрузчик, но чтобы можно было загрузиться с новым ядром, необходимо еще прописать ядро в загрузчик GRUB. Установка из пакета rpm проста, но дает лишь доступ к новым возможностям и исправляет старые ошибки. Возможности ядра остаются теми же, что зало- жил разработчик. Максимальных преимуществ от обновления можно добить- ся только при компиляции ядра. 3.8.3. Компиляция ядра При установке из rpm-пакета мы можем получить модульное ядро, в котором драйверы устройств могут быть как скомпилированы в одно целое с ядром, так и загружаться в виде модулей. Такое ядро медленнее в работе, но позво- ляет обновлять драйверы простой заменой модулей. При компиляции можно выбрать и монолитное ядро. В этом случае в него будут встроены все необходимые драйверы, что повысит производитель- ность , но сделает невозможным обновление драйверов без перекомпиляции всего ядра. Я рекомендую вам разобраться с компиляцией, потому что все свежие ядра выходят в исходных кодах, а издание rpm-пакетов иногда запаздывает на не- делю и более. Все это время ваша система будет уязвимой. Как правило, ядро поставляется в виде tar-архива. Сначала его надо разархи- вировать : tar xzvf linux-2.6.10-rc2.tar.gz Имя архива в вашем случае может отличаться. Я беру самое новое на момент написания книги ядро, которое специально скачивал из Интернета. Ядро все- гда можно найти на сайте www.kernel.org. Архив распаковывается в директорию linux-2.6.10-rc2 (имя архива без рас- ширения tar.gz). Необходимо перейти в этот каталог, чтобы выполнять даль- нейшие действия по компиляции из этой директории. Для начала нужно сконфигурировать ядро, то есть указать, что мы хо- тим получить в результате. Для этого можно использовать одну из четырех утилит : 1. oldconfig — сценарий, который устанавливает значения по умолчанию без нашего ведома. Для вызова используйте команду make oldconfig Глава 3 102 Рис . 3.6. Текстовая утилита конфигурирования ядра menuconfig Рис . 3.7. Графическая утилита конфигурирования ядра qconf Добро пожаловать в Linux 103 2. config — сценарий, который в командном интерпретаторе задает вам во- просы о параметрах будущего ядра и в зависимости от ваших ответов формирует конфигурационный файл для компиляции. Для вызова исполь- зуйте команду make config 3. menuconfig — текстовая утилита (рис. 3.6). Наиболее удобный вариант конфигурирования из консоли. Для вызова используйте команду make menuconfig 4. qconf ( xconfig ) — графическая утилита (рис. 3.7). Наиболее удобный ва- риант конфигурирования ядра из графической оболочки Linux. Для вызова используйте команду make xconfig Во время конфигурации с помощью любой из вышеперечисленных утилит, вы должны указать, нужна ли поддержка загружаемых модулей. Если вы хотите иметь два разных ядра одной и той же версии, например, с поддержкой модулей и без нее, то необходимо открыть файл Makefile и в параметре EXTRAVERSION указать различные значения: EXTRAVERSION=-rc2-module — при компиляции ядра с модулями; EXTRAVERSION=-rc2-nomodule — при компиляции ядра без модулей. Лучше всего в этом параметре указывать, чем именно будет отличаться ядро. Например , помимо -rc2-module можно вставить дополнительное пояснение, но оно должно быть максимально коротким. Теперь выполняем команды подготовки к компиляции: make dep make clean Следующая команда отнимет достаточно много времени, потому что она бу- дет компилировать непосредственно ядро. Можно отправляться готовить кофе и пить его медленно и печально. Если у вас слабый процессор и менее 1024 Мбайт памяти, то процесс будет долгим. Итак , для компиляции ядра выполним команду: make bzImage Во время компиляции вы увидите список собираемых в ядро модулей. Их очень много, поэтому процесс продолжительный. Если вы выбрали компиляцию ядра с использованием загружаемых модулей, то следующие две команды должны выполнить эту операцию: make modules make modules_install Если вы запретили использование модулей, то эти команды можно пропус- тить , потому что в этом случае толку от них мало, а выполняются они долго. Глава 3 104 Все модули располагаются в директории /lib/modules/. С помощью первой команды мы скомпилировали модули нового ядра, а вторая скопирует их в каталог /lib/modules/. Здесь вы найдете директории модулей для каждой из версий ядер, установленных в системе. Теперь инсталлируем скомпилированное ядро. Для этого выполняем сле- дующую команду: make install Эта команда скопирует все необходимые файлы для загрузки на свои места. Загляните в директорию /boot. Здесь можно найти несколько файлов, в том числе и загрузчик для новой версии ядра. Их легко можно определить по но- меру . Например, я компилировал ядро 2.6.10, и у меня появились файлы vmlinuz-2.6.10 и initrd-2.6.10.img. 3.8.4. Настройка загрузчика Ядро скомпилировано, и теперь его нужно добавить в загрузчик GRUB. Са- мый простой вариант — скопировать текущее меню и изменить его заголовок и параметр kernel, чтобы он указывал на новый файл. Перезагрузите систему, и теперь при старте компьютера вы сможете вы- бирать , какое ядро загружать. При этом будут использоваться одни и те же конфигурационные файлы, что очень удобно. Если новое ядро окажется неработоспособным , достаточно перезагрузить компьютер со старым ядром и продолжить работу до выхода обновлений. 3.8.5. Работа с модулями Преимущество модульной сборки ядра заключается в том, что вы можете из- начально включить только самые необходимые функции и тем самым уменьшить потенциальные уязвимости, которыми может воспользоваться хакер . Но при этом мы должны иметь возможность управлять модулями (так же , как и сервисами). Система должна загружаться только с теми модулями, которые применяются. Все остальные должны подгружаться по мере необходимости и отключаться, когда не используются. lsmod С помощью команды lsmod можно увидеть список загруженных модулей. Результат выполнения инструкции имеет примерно следующий вид: Module Size Used by Not tainted binfmt_misc 7428 1 Добро пожаловать в Linux 105 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.o 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 Эта команда, в основном, используется системой для загрузки установлен- ных модулей, но можно это делать и самостоятельно. В качестве единст- венного параметра нужно передать команде имя модуля, который нужно загрузить Глава 3 106 Например , следующая команда загружает модуль iptable_nat (о нем мы бу- дем говорить в разд. 4.12): modprobe iptable_nat rmmod Эта команда выгружает модуль, имя которого указано в качестве параметра. Если вы воспользовались модулем для выполнения определенных действий, то не забудьте по окончании работы его выгрузить. Иначе как раз он и может стать причиной взлома. |