Академический Документы
Профессиональный Документы
Культура Документы
РУКОВОДСТВО
СИСТЕМНОГО
АДМИНИСТРАТОРА
--5-еиздание - -
UNIX® AND LINUX® SYSTEM
ADMINISTRATION
HANDBOOK
- - - - - - - FIFTH EDITION - - - - - -
Evi Nemeth
Garth Snyder
Trent R. Hein
Веп Whaley
DanMackin
Boston • Columbus • lndianapolis • New York • San Francisco • Amsterdam •Саре Town
Dubai • London • Madrid • Milan • Munich • Paris • Montreal • Toronto • Delhi • Mexico City
Sao Paulo • Sydney • Hong Kong • Seoul • Singapore • Taipei • Tokyo
UNIXИLINUX
РУКОВОДСТВО
СИСТЕМНОГО
АДМИНИСТРАТОРА
---- 5-еиздание ----
ЭвиНемет,
Гарт Снайдер,
ТрентХейн,
Бэн Уэйли,
ДэнМакин
Москва • Санкт-Петербург
2020
ББК 32.973.26-018.2.75
Н50
УДК 681.3.07
ООО "Диалектика"
Немет, Эви, Снайдер, Гарт, ХеАн, Трент, УэАли, Бен, Макни, Дэн.
Н50 Uпix иLinux: руководство системною администратора, 5-е изд.: Пер. с англ. -
СПб. : ООО "Диалектика", 2020. - 1168 с. : ил. - Парал. тит. англ.
ISBN 978-5-907144-10-1 (рус.)
ББК 32.973.26-018.2.75
Все названия про11Jаммных продуктов являются зарегистрированными торговыми марками со
ответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой
бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические,
включая фотокопирование и запись на магнитный носитель, если на это нет письменного разре
шения и111ательства Addisoп-~sley PuЫishiпg Company, lnc.
Copyright © 2020 Ьу Dialektika Computer PuЫishing Ltd.
Authorized Russian translation of the English edition of UNIX and Linux System Administration
Handbook, 5th Edition (ISBN 978-0-13-427755-4) © 2018 Pearson Education lnc.
This translation is puЫished and sold Ьу permission of Pearson Education lnc., which owns or contгols
all rights to puЫish and sell the same.
All rights reserved. No ра11 of this book may Ье reproduced or transmitted in any form or Ьу any means,
electronic or mechanical, including photocopying, recording, or Ьу any information storage or retrieval sys-
tem, without the prior written permission ofthe copyright owner and the PuЫisher.
Научно-популярное издание
Эви Немет, Iарт Снайдер, '!Рент ХеАн, Бен Уэйли, Дэн Макни
ООО "Диалектика", 195027, Санкт-Петербург, Магнитогорская ул" д. 30, лит. А, пом. 848
О соавторах 33
Об авторах 34
ПамятиЭви 35
Предисловие 36
Организация книги 36
Авторы 37
Контактная информация 37
Введение 38
Благодарности 39
От издательства 40
Частьl.Основыадминистрирования 41
Глава 1. С чего начать 43
1.1. Основные обязанности системного администратора 44
Управление доступом 44
Добавление оборудования 44
Автоматизация задач 44
Управление резервными копиями 44
Установка и обновление программного обеспечения 45
Мониторинг 45
Исправление проблем 45
Ведение локальной документации 45
Бдительный мониторинг безопасности 46
Настройка производительности 46
Разработка правил 46
Работа с поставщиками 46
Тушение пожаров 46
1.2. Предварительный опыт 47
1.3. Дистрибутивы Linux 48
1.4. Примеры систем, используемых в этой книге 49
Примеры дистрибутивов Linux 50
Пример дистрибутива UNIX 51
1.5. Обозначения и типографские соглашения 52
1.6. Единицы измерения 53
1.7. Маn-страницы и другая онлайн-документация 54
Организация mаn-страниц 54
Команда man: чтение страниц интерактивного руководства 55
Хранение страниц интерактивного руководства 55
1.8. Другая официальная документация 56
Руководства по конкретным системам 56
Документация по конкретным пакетам 56
Содержание 7
Книги 57
Документы RFC 57
1. 9. Другие источники информации 57
Сохранение актуальности 58
Практические руководства и справочные сайты 58
Конференции 59
1.1 О. Способы поиска и установки программного обеспечения 60
Как определить, установлено ли программное обеспечение 60
Добавление нового программного обеспечения 61
Создание программного обеспечения из исходного кода 63
Установка с помощью веб-сценария 64
1.11. Где разместить программное обеспечение 65
1.12. Специализация и смежные дисциплины 66
Методология DevOps 66
Инженеры по надежности сайтов 66
Инженеры по безопасности 66
Сетевые администраторы 66
Администраторы баз данных 67
Инженеры центра сетевых операций 67
Технические специалисты центров обработки данных 67
Архитекторы 67
1.13. Литература 67
Системное администрирование и методология DevOps 68
Важные инструменты 68
Глава 2. Загрузка и системные демоны 69
2.1. Обзор процесса загрузки 69
2.2. Системные прошивки 70
BIOS или UEFI 71
Устаревший интерфейс BIOS 72
UEFI 72
2.3. Загрузчики 74
2.4. GRUB: универсальный загрузчик 74
Конфигурация GRUB 74
Командная строка GRUB 76
Параметры ядра Linux 76
2.5. Процесс загрузки FreeBSD 77
Вариант BIOS: bootO 77
Вариант UEFI 78
Конфигурация загрузчика 78
Команды загрузчика loader 79
2.6. Демоны управления системой 79
Обязанности демона ini t 80
Реализации демона ini t 80
Традиционный стиль ini t 81
Менеджер systemd против остального мира 82
Аргументы против ini t 82
8 содержание
Об авторах
Эви Немет уволилась с факультета вычислительной техники Универ
ситета штата Колорадо в 2001 г. Многие годы она исследовала просторы
Тихого океана на своей 40-футовой яхте "Wonderland" ( " Страна чудес")
до ее трагического исчезновения в 2013 г. Четвертое издание этой кни
ги - это последнее издание, в котором она принимала активное уча
стие, но мы изо всех сил старались сохранить ее текст там , где это было
возможно.
'3ашпая , которая ставится перед союзом and в конце перечисления. - Примеч. ред.
памяти эви
В каждой области знаний есть авторитет, который ее определяет и олицетворяет.
В системном администрировании таким человеком является Эви Немет.
Это пятое издание книги, в которой Эви является главным автором. Хотя Эви не
смогла физически присоединиться к нам, ее образ всегда был рядом, кроме того, ей
принадлежат многие главы и примеры. Мы прилагали огромные усилия для сохранения
необычного стиля Эви, для которою характерна объективность, техническая глубина
и внимание к деталям.
1 Этот принцип также известен как Закон Постела, названный в честь Джонатана Постела (Jon
Postel), который был редактором серии документов RFC с 1969 r. до своей смерти в 1998 r.
предисловие
Современные технологи - мастера в поиске ответов в Google. Если другой систем
ный администратор уже столкнулся с проблемой (и, возможно, решил ее), вы наЙдете
описание решения в Интернете. Мы приветствуем и поощряем этот открытый обмен
идеями и решениями.
Если в Интернете есть так много информации, зачем нужно новое издание данной
книги? Мы считаем, что эта книга способствует профессиональному росту системного
администратора.
• Это книга не о том, как запустить операционную систему UN IX или Linux у себя
дома, в гараже или на смартфоне. Вместо этого мы описываем управление произ
водственными средами, такими как предприятия, правительственные учреждения
ОРГАНИЗАЦИЯ книги
Книга разделена на четыре большие части: основы администрирования, сеть, хране
ние и эксплуатация.
АВТОРЫ
Мы рады приветствовать Джеймса Гарнетта, Фабрицио Бранку и Адриана Муата
в качестве соавторов этого издания. Глубокие знания этих ученых в разных областях
значительно обогатили содержание книги.
КОНТАКТНАЯ ИНФОРМАЦИЯ
Пожалуйста, отправляйте предложения, комментарии и сообщения об ошибках
на адрес ulsah@book. adтin. сот. Мы отвечаем на письма, но, пожалуйста, будьте тер
пеливы; иногда может пройти несколько дней до того, как один из нас сможет ответить.
Из-за объема электронной почты, которая приходит на этот адрес, мы сожалеем, что не
можем ответить на технические вопросы.
ных компьютеров с уже устаревшими технологиями, такими как rdist. В те годы из-
Введение 39
дания этой книги помогали таким людям, как я (и Эви), справляться с разнообразными,
а иногда и особенными компьютерами, которые были реальными, а не виртуальными,
и каждый из которых нужно было поддерживать, а не инсталлировать заново (или, как
на платформе Docker, собирать заново) каждый раз, когда что-то требовало исправления
или обновления.
Мы адаптируемся или сходим со сцены. "Дети Эви", которые продолжают наследие
Эви, адаптировались и вернулись в этом пятом издании, чтобы рассказать вам, что не
обходимо знать о том, как работают современные компьютеры под управлением систем
UNIX и Linux и как заставить их работать так, как вы хотите. Потеря Эви знаменует
собой конец эры, но также поднимает вопрос о том, сколько аспектов системного ад
министрирования ушло в историю вместе с ней. Я знаю десятки умных и успешных
технологов, которые никогда не будут заделывать кабели в задней части стойки обору
дования, не услышат тон модема и не увидят кабель RS-232. Это издание предназначе
но для тех, чьи системы живут в облаке или в виртуализированных центрах обработки
данных; тех, чья административная работа в значительной степени принимает форму
исходного кода автоматизации и конфигурации; тех, кто тесно сотрудничает с разработ
чиками, сетевыми инженерами, сотрудниками службы контроля и всеми другими рабо
чими пчелами, которые населяют современный улей.
Вы держите в руках новейшее, лучшее издание книги, чье рождение и эволюция точ
но отслеживали рождение и эволюцию UNIX и интернет-сообщества. Эви очень гор
дилась бы своими детьми, как из-за этой книги, так и из-за того, кем они оказались.
Я ими горжусь.
Пол Викси (Раи/ Vixie)
Ла Хонда, Калифорния
Июнь 2017 г.
БЛАГОДАРНОСТИ
Многие люди внесли свой вклад в этот проект - от технических обзоров и конструк
тивных предложений до общей моральной поддержки. Следующие лица заслуживают
особой благодарности.
Мэри Лу Нор (Mary Lou Nohr) уже более 20 лет является нашим безжалостным ре
дактором рукописей. Когда мы начали работу над этим изданием, Мэри Лу уже ушла
на заслуженную пенсию. После многочисленных и продолжительных просьб она согла
силась присоединиться к нам на бис. (И Мэри Лу Нор, и Эви Немет изображены на об
ложке. Вы можете найти их?)
У нас была фантастическая команда технических рецензентов. Три преданных друга
оценили всю книгу: Джонатан Корбет (Jonathan Corbet), Пэт Парсегян (Pat Parseghian)
и Дженнин Таунсенд (Jennine Townsend). Мы высоко ценим их упорство и тактичность.
Удивительные картинки и обложка этого издания бьши задуманы и исполнены Лизой
Хейни (Lisa Haney). Ее портфолио находится в режиме онлайн на сайте lisahaney. сот.
И последнее, но не менее важное: спасибо Ласло Немет (Laszlo Nemeth) за его готов
ность поддержать продолжение этой серии.
От издАтЕльствА
Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим
ваше мнение и хотим знать, что было сделано нами правильно, что можно бьшо сде
лать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать
и любые другие замечания, которые вам хотелось бы высказать в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам элек
тронное письмо, либо просто посетить наш веб-сайт и оставить свои замечания там.
Одним словом, любым удобным для вас способом дайте нам знать, нравится или нет
вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более ин
тересными для вас.
E-mail: info@dialektika.com
WWW: http://www.dialektika.com
ЧАСТЬ 1
Основы администрирования
Глава 1
с чеrо начать
вания является то, что разумные люди могут иметь совершенно разные представления
Управление доступом
Системный администратор создает учетные записи для новых пользователей, удаляет
учетные записи неактивных пользователей и решает все связанные с учетными запися
ми проблемы, которые могут возникнуть (например, забытые пароли и потерянные пары
ключей). Процесс добавления и удаления учетных записей обычно автоматизируется с по
мощью системы управления конфигурацией или централизованной службы каталогов.
Добавление оборудования
Администраторы, работающие с физическим оборудованием (в отличие от облачных
систем и систем, размещенных на виртуальном сервере), должны устанавливать и на
страивать его так, чтобы операционная система могла его распознать. Функции под
держки оборудования могут варьироваться от простой задачи добавления сетевой интер
фейсной карты до настройки специализированного внешнего массива хранения.
Автоматизация задач
Использование инструментов для автоматизации повторяющихся и трудоемких задач
повышает эффективность работы, снижает вероятность ошибок и повышает вашу спо
собность быстро реагировать на изменяющиеся требования. Администраторы стремят
ся сократить количество ручного труда, необходимого для бесперебойной работы систем.
Знакомство с языками сценариев и инструментами автоматизации - важная часть работы.
Мониторинг
Работа над решением проблемы обычно требует меньше времени, чем документиро
вание и создание отчетов, и пользователи, работающие в организации, зачастую следуют
по пути наименьшего сопротивления. Внешние пользователи чаще открыто публикуют
свои жалобы, чем просят о помощи. Администраторы могут предотвратить жалобы, об
наруживая и устраняя проблемы до их открытого проявления. К задачам мониторинга
относится обеспечение того, чтобы веб-службы быстро и корректно реагировали на со
бытия, собирали и анализировали файлы журналов и отслеживали доступность ресурсов
сервера, таких как дисковое пространство. Все это открывает отличные возможности
для автоматизации, а множество систем мониторинга (как коммерческих, так и с откры
тым исходным кодом) могут помочь системным администраторам решить эти задачи.
Исправление проблем
Сбои сетевых системы происходят неожиданно, а иногда приводят к тяжелым по
следствиям. В обязанности администратора входят функции механика, который диагно
стирует проблемы и при необходимости прибегает к помощи экспертов. Поиск источ
ника проблемы часто сложнее, чем ее решение.
Разработка правил
По нормативно-правовым причинам в большинстве организаций необходимо уста
новить правила, регулирующие допустимое использование компьютерных систем,
Работа с поставщиками
Для предоставления разнообразных вспомогательных услуг и продуктов, связанных
с их вычислительной инфраструктурой, большинство организаций прибегает к по
сторонней помощи. Эту помощь могут оказывать разработчики программного обе
спечения, поставщики облачной инфраструктуры, продавцы программных продуктов
как услуг (service-as-a-service - SaaS), сотрудники службы поддержки, консультанты,
подрядчики, эксперты по безопасности и поставщики платформ или инфраструктур.
Администраторам можно поручить выбирать поставщиков, помогать в переговорах
по контрактам и внедрять решения после завершения работы над документами.
Тушение пожаров
Хотя помощь другим людям с их разнообразными проблемами редко включается
в описание функциональных обязанностей системного администратора, эти задачи за
нимают значительную часть большинства рабочих дней администраторов. На системных
Глава 1. С чего начать 47
администраторов обрушивается град жалоб, начиная с "Он еще вчера работал, а сегодня
нет! Что вы изменили?" и заканчивая "Я пролил кофе на клавиатуру! Можно ли вылить
на нее воду, чтобы смыть кофе?"
В большинстве случаев ваши ответы на эти вопросы гораздо больше влияют на то,
насколько ценным администратором вас будут считать, чем любые технические навыки,
которыми вы могли бы обладать. Вы можете либо выть от несправедливости, либо радо
ваться тому, что за одну хорошо выполненную просьбу о помощи вам будет начислено
больше баллов, чем за пять часов ночной работы. Выбор за вами!
Для создания новых сценариев мы рекомендуем языки Bash (или bash, или sh), Ruby
или Python. Bash - это командная оболочка, принятая по умолчанию для большинства си
стем UNIX и Linux. Bash примитивен как язык программирования, но является хорошим
средством интеграции инструментов системного администратора. Python - это умный язык
с хорошо понятным синтаксисом, широким сообществом разработчиков и библиотеками,
которые облегчают решение многих задач. Разработчики, использующие язык Ruby, описы
вают его как "приятный" и "красивый". Языки Ruby и Python во многом похожи, и мы об
наружили, что они обладают одинаковыми функциональными возможностями д11я управле
ния системами. Выбор между ними в основном зависит от личных предпочтений.
Мы также предполагаем, что вы умеете работать с инструментом expect, который
представляет собой не язык программирования, а интерфейс для запуска интерактивных
48 Часть 1. Основы администрирования
Самые важные факты, которые необходимо знать о сценариях дпя работы с языками
Bash, Python и Ruby, обобщаются в главе 7. В ней также рассматриваются регулярные
выражения (шаблоны соответствия текста) и некоторые идиомы оболочки, полезные
дпя системных администраторов.
• FreeBSD® 11.0
Большинство этих торговых марок принадлежат производителям, выпускающим со
ответствующее программное обеспечение, и используются с любезного разрешения их
владельцев. Тем не менее поставщики не рецензировали и не утверждали содержание
ЭТОЙ КНИГИ.
50 Часть 1. Основы администрирования
RHEL Система Red Hat была доминирующей силой в мире Linux более двух десяти
летий, и ее дистрибутивы широко используются в Северной Америке и за ее
пределами. По количеству инсталляций Red Hat, lnc. является самой успеш
ной в мире компанией с открытым исходным кодом.
• Дистрибутив
BSD.
такие как
FreeBSD, впервые выпущенный в конце
более широко используемым производным инструментом
ствии со статистикой использования он занимает
Linux, FreeBSD -
полная операционная система, а не только ядро. Как программное обеспе
это
предполагается, что аргумент файл следует заменить именем реального файла, а аргу
мент каталог - именем реального каталога.
• текст, заключенный в квадратные скобки (" [" и "] "), является необязательным;
• текст, после которого стоит многоточие (" ... "), можно повторять;
• фигурные скобки (" {" и ") ") указывают на то, что необходимо выбрать один из
элементов, разделенных вертикальной чертой (" 1").
Например, спецификации
bork [-х] (onloff} имя_файла
В этой книге мы используем единицы измерения МЭК (IEC) для степеней двойки
и метрические - для степеней числа 10. Метрические единицы измерения мы при
меняем также для приблизительных значений и в тех случаях, когда точное основание
степени неясно, не зафиксировано в документах или его невозможно определить. В ко
мандах файлов конфигурации output и in мы оставляем исходные значения и указа
тели единиц измерений. Для обозначения бита служит буква Ь, а для байта - буква В.
Некоторые примеры интерпретации единиц измерения приведены в табл. 1.2.
Таблица 1.2. Примеры интерпретации единиц измерения
100 Мбайт (МВ) Номинально составляет 108 байт (неоднозначность, понимается по контексту)
100 Мбайт (МВ) Номинально составляет 108 байт, в зависимости от контекста, возможно, 99 999 744 байl"
1 ГиБ (GiB) 1073 741 824 байт памяти
1 Гбит/с (Gb/s) Скорость передачи информации в сети, равная 1000000000 бит в секунду
бТбайт(ТВ) Объем жесткого диска, равный 6 ООО ООО ООО ООО байт
•Число 10 округлено в меньшую сторону до ближайшего целого, кратного размеру 512-байтового сектора диска.
8
Буква К в аббревиатуре, как в случае "8 Кбайт (КВ)", не является частью стандар
та. Это компьютерная адаптация метрической аббревиатуры k (обозначение приставки
54 Часть 1. Основы администрирования
кило-), которая означает 1024 в отличие от 1ООО. Поскольку в аббревиатурах для многих
метрических приставок уже используется прописная буква, стала возникать путаница
при новом и исходном использовании буквы К в качестве множителя 1ООО.
В большинстве стран эта проблема не считается важной, например в США метриче
ские префиксы часто используются неоднозначно. В дистрибутиве Ubuntu была пред
принята попытка реализовать последовательную политику использования единиц из
Организация mаn-страниц
Системы FreeBSD и Linux разделяют mаn-страницы на разделы. Их базовая схема
показана в табл. 1.3. Другие варианты UNIX иногда определяют разделы несколько
иначе.
Точная структура разделов не важна для большинства тем, потому что человек на
ходит соответствующую страницу там, где она хранится. Просто учитывайте определе
ния разделов, если тема с тем же именем появляется в нескольких разделах. Например,
passwd - это и команда, и конфигурационный файл, поэтому существуют соответству
ющие записи как в разделе 1, так и в разделе 5.
Таблица 1.3. Разделы шаn-страниц
Раздел Содержание
3 Библиотечные вызовы
6 Игры и демонстрации
$ man -k translate
objcopy (1) - сору and translate object files
dcgettext (3) - translate message
tr (1) - translate or delete characters
snmptranslate (1) - translate SNMP OID values into more useful information
tr (lp) - translate characters
База данных ключевых слов может устаревать. При добавлении новых справочных
страниц к системе вам, возможно, придется перестроить этот файл с помощью команд
makewhatis (Red Hat и FreeBSD) или mandb (Ubuntu).
$ export МANPATH=/home/share/localman:/usr/share/man
Книги
К самым лучшим источникам информации для системных администраторов в книж
ном мире можно отнести серию книг издательства O'Reilly. Начало этой серии было
положено книгой UNIX in а Nutshell. Теперь же практически всем важным подсистемам
и командам UNIX и Linux посвящены ее отдельные тома. Издательство O'Reilly публи
кует также книги о сетевых протоколах, операционной системе Microsoft Windows и дру
гим темам, не связанным с UNIX. Все эти книги имеют приемлемую цену, своевремен
ны и ориентированы на конкретную аудиторию.
Документы RFC
Документы из серии RFC (Request for Comments - запрос на комментарии) опи
сывают протоколы и процедуры, используемые в Интернете. Большинство из этих до
кументов достаточно детализированы и специализированы, но некоторые написаны
в виде обзоров. Информации, которую они содержат, вполне можно доверять, но не
которые из них являются всего лишь обзорами. Фраза "эталонная реализация" озна
чает, что программа "разработана надежным источником в соответствии со специфи
кациями RFC".
Авторитет RFC незыблем, а некоторых из документов этой серии достаточно полез
ные для системных администраторов. Подробное описание этих документов приведено
в разделе 13.1. Мы будем часто цитировать их в нашей книге.
1 Или, что еще хуже, указывают ссыпку на Google через сайт lmgtfy. сот.
58 Часть 1. Основы администрирования
Сохранение актуальности
Операционные системы, инструменты и методы их поддержки быстро меняются.
Советуем вам ежедневно просматривать сайты, перечисленные в табл. 1.5, чтобы быть
в курсе тенденций, наблюдаемых в отрасли.
Веб-сайт Оnисание
darkreading. com Новости о средствах безопасности, тенденции и обсуждение
devopsreactions. tumЫr. com Юмор системных администраторов в анимированном виде
linux. com Сайт консорциума Liпux Fouпdatioп; форум полезен для новых
пользователей
s ysadvent. Ыogspot. сот Благ для системных администраторов, публикующий статьи каж
дый декабрь
•см. также сборник Томаса Лимончелли April Fools's RFC на сайте rfc-humor. сот
Социальные сети также полезны. Twitter и Reddit, в частности, имеют сильные со
общества с большим количеством предложений, хотя отношение сигнал-шум в этих се
тях иногда может быть довольно плохим. На сайте Reddit присоединяйтесь к разделам
основного форума sysadmin, linux, linuxadmin и netsec.
Веб·саiт - Оnиоаиме
wiki. archlinux. org Статьи и руководства по Arch Liпux; многие из них носят более общий
характер
'Cм.Digitalocean.com/community/tutorials
бТакже см. аналогичный сайт stackoverflow. com, посвященный программированию, но полезный и для систем
ных администраторов
Сайты Stack Overflow и Server Fault, указанные в табл. 1.6 (оба входят в группу сай
тов Stack Exchange), требуют более пристального взгляда. Если у вас возникла проблема,
скорее всего, кто-то с ней уже сталкивался и попросил о помощи на одном из этих сай
тов. Авторитетный формат вопросов и ответов, используемый сайтами Stack Exchange,
хорошо подходит для тех проблем, с которыми сталкиваются системные администра
торы и программисты. Рекомендуем создать учетную запись и присоединиться к этому
большому сообществу.
Конференции
Отраслевые конференции - отличный способ наладить связь с другими професси
оналами, следить за технологическими тенденциями, проходить учебные курсы, полу
чать сертификаты и узнавать о последних услугах и продуктах. В последние годы рез
ко возросло количество конференций, связанных с системным администрированием.
Некоторые из наиболее известных конференций предстамены в табл. 1.7.
Таблица 1.7. Конференции по системному администрированию
DevOpsDays По всему миру Переменное Ряд тем для преодоления разрыва между ко-
мандами разработки и групп по эксплуатации
Зная имя пакета, который ищете, вы также можете использовать утилиты для упаков
ки системы, чтобы напрямую проверить наличие пакета. Например, в системе Red Hat
следующая команда проверяет наличие (и установленную версию) интерпретатора Python:
redhat$ rpm -q python
python-2.7.5-18.el7_1.l.x86_64
W Дополнительную информацию об управлении пакетами см. в главе 6.
Вы также можете узнать, к какому пакету принадлежит определенный файл:
сов в Интернете, но Google, как правило, так же эффективен. Например, поиск "locate
command" приводит вас непосредственно к нескольким соответствующим обсуждениям.
В следующих примерах показана инсталляция команды tcpdwap для каждой из наших
иллюстративных систем. Команда tcpdump - это инструмент для захвата пакетов, позво
ляющий просматривать исходные пакеты, отправляемые в систему и из системы в сети.
RHEL ~ В системах Red Hat и CentOS аналогичная версия выглядит следующим об-
~ разом.
redhat# sudo yum install tcpdump
Loaded plugins: fastestmirror
Determining f astest mirrors
* base: mirrors.xmission.com
* epel: linux.mirrors.es.net
* extras: centos.arvixe.com
* updates: repos.lax.quadranet.com
Resolving Dependencies
--> Running transaction check
---> Package tcpdump.x86_64 14:4.5.1-2.е17 will Ье installed
--> Finished Dependency Resolution
tcpdump-4.5.1-2.el7.x86_64.rpm 1 387 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 14:tcpdump-4.5.l-2.el7.x86_64 1/1
Verifying : 14:tcpdump-4.5.1-2.el7.x86_64 1/1
Installed:
tcpdump.x86_64 14:4.5.1-2.е17
Complete!
Fetching meta.txz:
FreeBSD
freebsd# sudo pkq install -у tcpdump
Updating FreeBSD repository catalogue ...
100%
называется pkg.
Первая задача - найти сам код. Сторонники программного обеспечения иногда хра
нят индекс выпусков на веб-сайте проекта, которые можно загрузить в виде архивов. Для
проектов с открытым исходным кодом вы, скорее всего, найдете код в репозитории Git.
Источник tcpdum.p хранится в репозитории GitHub. Выполните клонирование ре
позитория в каталоге /tmp, создайте ветку с тегами, которую вы хотите создать, затем
распакуйте, настройте, создайте и установите:
redhat$ cd /tmp
redhat$ qit clone https://qithuЬ.com/the-tcpdump-qroup/tcpdump.qit
<status messages as repository is cloned>
redhat$ cd tcpdump
redhat$ qit checkout taqs/tcpdump-4.7.4 -Ь tcpdump-4.7.4
Switched to а new branch 'tcpdump-4.7.4'
redhat$ ./confiqure
checking build system type ... x86_64-unknown-linux-gnu
checking host system type ... x86_64-unknown-linux-gnu
checking for gcc ... gcc
checking whether the С compiler works ... yes
redhat$ make
<several pages of compilation output>
redhat$ sudo make install
<files are moved in to place>
Эта последовательность configure/m.ake/m.ake устанавливается для большинства
программ, написанных на языке С, и работает во всех системах UNIX и Linux. Всегда
полезно проверить файл INSTALL или READМE пакета для уточнения. Должна быть уста
новлена среда разработки и любые необходимые для пакета требования. (В случае паке
та tcpdump необходимой предпосылкой является установка библиотеки libpcap и со
путствующих библиотек.)
64 Часть 1. Основы администрирования
III Более подробную информацию о цепочке доверия НТТРS см. в разделе 27.6.
Будьте очень подозрительными, если URL-aдpec загрузочного сценария небезопасен
(т.е. он не начинается с префикса https: ). Незащищенный НТГР является легкоуязви
мым для захвата, а U RL-aдpeca инсталляции представляют особый интерес для хакеров,
потому что они знают, что вы, скорее всего, будете работать в качестве привилегиро
ванного пользователя, независимо от того, какой код возвращается. В отличие от этого,
протокол НТГРS проверяет подлинность сервера с помощью криптографической це
почки доверия. Это не вполне, но достаточно надежный способ.
Некоторые продавцы публикуют URL-aдpec инсталляции по протоколу НТТР. кото
рый автоматически перенаправляет пользователя на НТГРS-версию. Это глупо и на самом
деле не более безопасно, чем прямой адрес НlТР. Ничто не мешает перехвату исходного
НlТР-обмена, поэтому вы, возможно, никогда не достигнете перенаправления поставщика.
Однако наличие таких переадресаций означает, что стоит попробовать собственную замену
https для http в небезопасных URL-aдpecax. Чаще всего это работает отлично.
Оболочка принимает текст сценария как свой стандартный вход, и эта функция по
зволяет использовать процедуры инсталляции в режиме онлайн, например:
$ curl -L https://badvendor.com 1 sudo sh
2 Эrо все простые НТТР-клиенты, загружающие содержимое URL-aдpeca в локальный файл или
(необязательно) распечатывающие содержимое в виде результата своей работы.
Глава 1. С чего начать 65
• Готовые решения для общих вспомогательных потребностей, таких как базы дан
ных, балансировки нагрузки, очереди, мониторинг и т.д.
Digita\Ocean - это более простая служба, целью которой является высокая произ
водительность. Она ориентирована на разработчиков, которым Digita\Ocean предла-
66 Часть 1. Основы администрирования
Методология DevOps
Ш Дополнительную информацию о методологии DevOps см. в главе 31.
DevOps - это не столько специфическая методология, сколько культура или фило
софия работы. Ее цель - повышение эффективности создания и поставки программ
ного обеспечения, особенно в крупных организациях, в которых существует множество
взаимосвязанных служб и команд. Организации, внедрившие методику DevOps, стиму
лируют интеграцию между инженерными командами и могут не делать различия между
Инженеры по безопасности
Инженеры по безопасности сосредоrочены на практической, повседневной стороне ин
формационной безопасности. Эrи люди устанавливают и используют инструменты дЛЯ по
иска уязвимых мест и мониторинга дЛЯ предотвращения сетевых атак. Они также участвуют
в имитации атак, чтобы оценить эффективность методов их профилактики и обнаружения.
Сетевые администраторы
Сетевые администраторы проектируют, устанавливают, настраивают и управляют се
п1м~1. Организации, в которых функционируют центры обработки данных, скорее всего,
будут использовать сетевых администраторов; это объясняется тем, что такие объекты
Глава 1. С чего начать 67
Архитекторы
Системные архитекторы обладают глубокими знаниями в более чем одной обла
сти. Они используют свой опыт для разработки распределенных систем. Их должност
ные инструкции могут предусматривать определение зон безопасности и сегментацию,
устранение отдельных точек отказа, планирование будущего роста, обеспечение взаимо
действия между несколькими сетями и третьими сторонами, а также принятие решений,
касающихся всей организации. Хорошие архитекторы технически компетентны и обыч
но предпочитают внедрять и тестировать свои собственные проекты.
1.13. ЛИТЕРАТУРА
• Аввотт, МлRПN L., AND М1снлн Т. F1sHER. The Art of Scalabllity: Sса!аЬ/е Web
Architecture, Processes, and Organizations for the Modern Enterprise (2nd Edition).
Addison-Wesley Professional, 2015.
• GлNcлRZ, М1кЕ. Linux and the Unix Philosophy. Boston: Digital Press, 2003.
• L1моNСЕШ, Тномлs А., AND РЕТЕR Sлшs. The Comp/ete April Fools' Day RFCs.
68 Часть 1. Основы администрирования
• К1м, GENE, JEZ НuмвLЕ, PATRICK DEвo1s, AND JoнN W1LL1s. The DevOps Handbook:
Ноw to Create World-Class Agility, Reliabllity, and Security iп Technology Organizations.
Portland, OR: 1Т Revolution Press, 2016.
• L1мoNCELLI, ТномАs А., CHRISТINA J. HoGAN, AND SтRATA R. СнАШР. The Practice о/
System and Network Administration (2nd Edition). Reading, МА: Addison-Wesley, 2008.
Это хорошая книга, в которой очень подробно описаны организационные и про
цедурные аспекты системного администрирования Авторы ведут блог, посвящен
ный системному администрированию: everythingsysadmin. com.
• L1мoNCELLI, ТномАs А., CнRISТINA J. HoGAN, AND SтRАтА R. СнАШР. The Practice о/
Cloud System Administration. Reading, МА: Addison-Wesley, 2014. Книга предыдущих
авторов, посвященная распределенным системам и облачным вычислениям.
Важные инструменты
• BLuм, R1cнARD, AND СнюsпNЕ BRESNAHAN. Linux Command Line and She/l Scripting
ВiЫе (Зrd
Edition). Wiley, 2015.
• DouaнERТY, DALE, AND ARNOLD Roв1Ns. Sed & Awk (2nd Edition). Sebastopol, СА:
O'Reilly Media, 1997. Классическая книга издательства O'Reilly о мощных и ши
роко распространенных текстовых процессорах sed и awk.
• Кlм, РЕТЕR.The Hacker Playbook 2: Practical Guide То Penetration Testing. CreateSpace
lndependent PuЫishing Platform, 2015.
• Nш., DREW. Practical Vim: Edit Text at the Speed о/ Тhought. Pragmatic Вookshelf, 2012.
• S1ютrs, WILLIAM Е. The Linux Command Line: А Complete lntroduction. San Francisco,
СА: No Starch Press, 2012.
• SwEIGART, А1.. Automate the Boring Stuff with Python: Practica/ Programming for Total
Beginners. San Francisco, СА: No Starch Pгess, 2015.
Глава 2
Загрузка и системные демоны
тивов Linux теперь используют демон системного менеджера под названием systemd
вместо традиционного демона UNIX init. Помимо всего прочего, менеджер systemd
упрощает процесс загрузки путем добавления управления зависимостями, поддержки
одновременных процессов запуска и комплексного подхода к протоколированию.
Создать структуры
Загрузить ядро
данных ядра
Прежде чем система будет полностью загружена, должны быть проверены и смон
тированы файловые системы и запущены системные демоны . Этими процедурами
управляет набор сценариев оболочки (иногда называемых "сценариями ini t") либо
файлы, которые запускаются последовательно с помощью демона init или анали
зируются менеджером systemd. Точная компоновка сценариев запуска и способ их
выполнения зависит от операционной системы. Подробности изложены в этой главе
ниже.
Прошивка системы, как правило, знает обо всех устройствах, которые подклю
чены к материнской плате, таких как контроллеры SATA, сетевые интерфейсы, USВ
контроллеры и датчики для питания и температуры 1 • Помимо возможности аппаратной
настройки этих устройств, прошивка позволяет вам либо сообщить о них операционной
системе, либо отключить и скрыть их.
На физическом (в отличие от виртуального) оборудовании большинство проши
вок предлагает пользовательский интерфейс. Тем не менее оно, как правило, слиш
ком простое и неудобное. Для работы с ним необходимо иметь доступ к компьютеру
и консоли, а также сразу же нажать на конкретную клавишу после включения системы.
ких как "системный раздел EFI". Во всех, кроме самых очевидных ситуаций, эти терми
ны можно рассматривать как эквивалентные.
В наши дни поддержка UEFI довольно типична для новых персональных компью
теров, но в мире существует очень много систем BIOS. Более того, виртуальные среды
часто используют BIOS в качестве основного механизма загрузки, поэтому мир BIOS
еще не находится под угрозой исчезновения.
Поскольку мы предпочли бы игнорировать BIOS и говорить только об UEFI, вполне
вероятно, что вы столкнетесь с обоими типами систем еще в течение довольно долгого
времени. UEFI также интегрирует в себя некоторые функции BIOS, поэтому рабочие
знания BIOS могут быть весьма полезны для расшифровки документации UEFI.
UEFI
Спецификация UEFI включает в себя современную схему разделения диска, извест
ную как GPT (таблица разделов GUID, где GUID (global\y unique identifier) обознача
ет "глобально уникальный идентификатор"). UEFI также понимает файловую систему
FAT (File Allocation ТаЬ\е), простую, но функциональную схему, впервые примененную
в MS DOS. Эти функции объединяются для определения концепции системного раздела
EFI (ESP - EFI System Partition). Во время загрузки микропрограмма обращается к та
блице разделов G РТ для идентификации ESP. Затем она считывает настроенное целевое
приложение непосредственно из файла в ESP и выполняет его.
ревшими BIOS.
Интерфейс UEFI сохраняет имя пути для загрузки из ESP в качестве параметра
конфигурации. Если этот параметр не задан, используется стандартный путь, в со
временных системах lntel обычно это путь /efi/boot/bootx64 .efi. Более типич
ный путь в системе с заданной конфигурацией (для Ubuntu и загрузчика GRUB) -
/efi/ubuntu/grubx64. efi. Другие дистрибутивы придерживаются аналогичного
соглашения.
$ efiЬootmgr -v
BootCurrent: 0004
BootOrder: 0000,0001,0002,0004,0003
BootOOOO* EFI DVD/CDROM PciRoot(Ox0)/Pci(Oxlf,Ox2)/Sata(l,0,0)
BootOOOl* EFI Hard Drive PciRoot(Ox0)/Pci(Oxlf,Ox2)/Sata(0,0,0)
Boot0002* EFI Network PciRoot(Ox0)/Pci(Ox5,0x0)/МAC(00lc42fb5baf,0)
ВооtОООЗ* EFI Internal Shell MemoryMapped(ll,Ox7ed5d000,0x7f0dcfff)/
FvFile(c57adбb7-0515-40a8-9d21-551652854e37)
Boot0004* ubuntu HD(l,GPT,020c8d3e-fd8c-4880-9b61-
ef4cffc3d76c,Ox800,0xl00000)/File(\EFI\ubuntu\shimx64 .efi
Команда efibootmgr позволяет изменить порядок загрузки, выбрать следующий
настроенный параметр загрузки или даже создать и уничтожить загрузочные записи.
Например, установить порядок загрузки так, чтобы сначала обращаться к системному
диску, а потом - к сети, игнорируя другие параметры загрузки, можно с помощью ко
манды
4Для получения дополнительной информации см. goo. g 1 / QMS i SG (ссьmка на статью Phoroпix).
74 Частьl.Основыадминистрирования
2.3. ЗАГРУЗЧИКИ
Большинство процедур начальной загрузки включают в себя выполнение загрузчика,
который отличается от кода BIOS/UEFI и ядра операционной системы. Он также отде
лен от начального загрузочного сектора в BIOS, если вы считаете этапы.
Основное задание загрузчика - определить и загрузить соответствующее ядро опера
ционной системы. Большинство загрузчиков также могут предоставлять пользователь
ский интерфейс загрузки, который позволяет выбирать, какое из нескольких возмож
ных ядер или операционных систем вызвать.
Конфигурация GRUB
GRUB позволяет указать такие параметры, как загрузочное ядро (указанное в каче
стве записи меню GRUB) и режим работы для загрузки.
Поскольку эта информация о конфигурации необходима во время загрузки, можно
подумать, что она будет храниться где-то в необычном месте, например в энергонеза
висимой системной памяти NVRAM или в секторах диска, зарезервированных для за
грузчика. На самом деле GRUB понимает большинство используемых файловых систем
и обычно может самостоятельно найти корневую файловую систему. Это позволяет за
грузчику GRUB читать свою конфигурацию из обычного текстового файла.
Глава 2. Загрузка и системные демоны 75
Конфигурационный файл называется gruЬ. cfg, и его обычно хранят в каталоге /boot/
gruЬ (/boot/gruЬ2 в системах Red Hat и CentOS) вместе с выбором других ресурсов и мо
дулей кода, которыеG RU В может потребовать для доступа во время загрузки. 5 Изменение
конфигурации загрузки - это простой вопрос об обновлении файла gruЬ. cfg.
Хотя можно создать файл grub. cfg самостоятельно, чаще всего его проще гене
рировать с помощью утилиты grub-mkconfig, которая называется grub2-mkconfig
в системах Red Hat и CentOS и update-gruЬ в системах Deblan и Ubuntu. Фактически
большинство дистрибутивов предполагают, что файл gruЬ. cfg может быть регенериро
ван по желанию, и они делают это автоматически после обновлений. Если вы не пред
примете никаких шагов, чтобы предотвратить это, ваш файл grub. cfg будет испорчен.
Как обычно в системе Linux, дистрибутивы задают конфигурацию утилиты grub-
mkconfig различными способами. Чаще всего конфигурация задается в каталоге /etc/
default/gruЬ в виде присваивания переменных sh. В табл. 2.1 показаны некоторые из
часто изменяемых опций.
Таблица 2.1. Общие параметры конфиrурации GRUB в файле / etc/ defaul t/ gruЬ
Обозначение переменной оболочки Содержимое или функция
GRUB _ CMDLINE _ LINUX Параметры ядра для добавления в записи меню для Linux6
GRUB DEFAULT Номер или название элемента меню по умолчанию
GRUB_ PRELOAD _ MODULES Список модулей GRUB, загружаемых как можно раньше
•Фоновое изображение должно иметь формат . pnq, . tqa, • jpq или . jpeq.
6 8 табл. 2.3 в разделе 3.4 перечислены некоторые из доступных опций.
'Если вы знакомы с соглашениями файловой системы UNIX (см. главу 5), то можете задаться
вопросом, почему каталог /boot/qruЬ не назван как-то более стандартно, например /var/lib/
qruЬ или /usr/local/etc/gruЬ. Причина в том, что драйверы файловой системы, используемые
во время загрузки, несколько упрощены. Загрузчики не могут обрабатывать дополнительные
функции, такие как точки монтирования, когда они обходят файловую систему. Все в каталоге
/boot должно быть простым файлом или каталогом.
76 Часть 1. Основы администрирования
#!/Ьin/sh
ехес tail -n +3 $0
Jt This file provides an easy way to add custom menu entries. Just type
Jt the menu entries you want to add after this comment. Ве careful not to
Jt change the 'ехес tail' line above.
menuentry 'Му Awesome Kernel'
set root=' (hdO,msdosl)'
linux /awesome_kernel root=UUID=XXX-XXX-XXX ro quiet
initrd /initrd.img-awesome_kernel
Опция Значение
debug Включает отладку ядра
init=/Ьin/bash Запускает только оболочку bash; полезна для аварийного восстановления
root=/dev/foo Инструктирует ядро использовать /dev/foo в качестве корневого устройства
single Загрузка в однопольэовательском режиме
цию сохранять старые версии ядра. Попробуйте выбрать другое ядро, если ваша система
не будет загружаться после обновления.
Подробнее о параметрах ядра см. в главе 11.
UEFI.
loader -
поскольку загрузчик
использует файл конфигурации на ос
Вариант UEFI
Операционная система FreeBSD, использующая интерфейс UEFI, создает систем
ный раздел EFI и устанавливает там заrрузочный код в файле /Ьооt/Ьооtхб4 .ef"i. 6 Это
путь по умолчанию, который проверяют системы UEFI во время заrрузки (по крайней
мере на современных платформах персональных компьютеров), поэтому никакой кон
фиrурации прошивки не требуется, за исключением правильно установленных приори
тетов заrрузки устройств.
По умолчанию система FreeBSD не сохраняет смонтированным системный раздел
EFI после заrрузки. Таблицу разделов можно идентифицировать с помощью команды
gpart.
$ gpart shov
=> 40 134217648 adaO GPT (64G)
40 1600 1 efi (800К)
1640 127924664 2 freebsd-ufs (61G)
127926304 6291383 3 freebsd-swap (3.0G)
134217687 1 - free - (5128)
Хотя существует возможность подключить системный раздел ESP, чтобы узнать, что
в нем содержится (используя команду mount -t msdos), вся файловая система - это
всеrо лишь копия образа, найденного в файле /Ьoot/bootl. ef"if"at на корневом дис
ке. Внутри нет деталей, которые пользователь мог бы изменить.
Конфигурация загрузчика
Заrрузчик
loader на самом деле является средой сценариев на языке Forth. 8 Внутри
каталога /boot хранится код на языке Forth, управляющий операциями заrрузчика, но
он вполне самодостаточный - вам не нужно изучать Forth.
Чтобы получить значения переменных конфиrурации, сценарии на языке Forth счи
тывают файл /boot/loader. conf", поэтому задавать их следует именно здесь. Не путай
те этот файл с файлом /boot/def"aults/loader.conf", который содержит настройки
по умолчанию и не предназначен для изменения. К счастью, присваивания переменных
6 Непуrайте каталог /boot в системном разделе EFI с каталогом /boot в корневой файловой
системе FreeBSD. Они отделены друг от друга и служат различным uелям, хотя, конечно, оба
связаны с начальной загрузкой.
7 Начиная с версии FreeBSD 10.1, в качестве корневого раздела в системе UEFJ можно
использовать ZFS.
"Это замечательный и интересный факт, имеющий значение лишь для людей, интересующихся историей
языков программирования.
Глава 2. Загрузка и системные демоны 79
Туре '?' for а list of commands, 'help' for more detailed help.
ок ls
1
d .snap
d dev
d rescue
1 home
ок unload
ОК load /boot/kernel/kernel.old
/boot/kernel/kernel.old text=Oxf8f898 data=Oxl24 ... Ь077)
ОК boot
Для достижения этой цели ini t поддерживает понятие режима, в котором система
должна работать. Ниже перечислены некоторые общепринятые режимы 9 •
У демона init очень мало встроенных знаний об этих задачах. Он просто запускает
набор команд или сценариев, которые были назначены для выполнения в этом конкрет
ном контексте.
''Не принимайте эти имена или описания режимов слишком буквально; это всего лишь примеры
общих режимов работы, которые большинство систем определяют так или иначе.
Глава 2. загрузка и системные демоны 81
Говоря конкретно, эта система не имеет общей модели зависимостей между служ
бами, поэтому требуется, чтобы все запуски и демонстрации выполнялись в порядке,
заданном администратором. Более поздние действия не могут выполняться до тех пор,
пока не будут закончены все предыдущие, поэтому выполнять их параллельно невоз
можно, и система тратит много времени, чтобы изменить состояние.
82 Часть 1. Основы администрирования
По крайней мере, имейте в виду, что традиционный демон init, который вытесняет
ся менеджером systemd, не был идеальным. Помимо всего прочего, менеджер systemd
просто устраняет несколько ненужных различий между дистрибутивами Linux.
Дебаты действительно не имеют значения, потому что соревнование завершено.
Аргументы против использования systemd потеряли силу, когда на него переключились
системы Red Hat, Deblan и Ubuntu. Многие другие дистрибутивы Linux теперь принима
ют systemd либо вольно, либо невольно.
Традиционный демон ini t по-прежнему играет определенную роль, если дистрибу
тив либо нацелен на небольшой размер инсталляции, либо не нуждается в расширенных
функциях управления процессом systemd. Также существует значительное количество
глава 2. Загрузка и системные демоны 83
[Service]
ExecStart=/usr/bin/rsync --daernon --no-detach
[Install]
WantedBy=multi-user.target
Если вам показалось, что это напоминает файл в формате . ini, используемом в сис
темах MS-DOS, значит, вы хорошо понимаете почему к systemd так плохо относятся.
Модульные файлы могут находиться в нескольких местах. Основное место, где паке
ты сохраняют свои модульные файлы во время инсталляции - /usr/liЬ/systemd/
system; в некоторых системах для этого используется каталог /lib/systemd/system.
Содержимое этого каталога считается ресурсом, поэтому вы не должны изменять его.
Файлы локальных файлов и настройки могут выполняться в каталоге /etc/systemd/
system. В каталоге /run/systemd/system есть также каталог модулей, который явля
ется рабочей областью для переходных модулей.
Менеджер systemd поддерживает телескопическое представление всех этих катало
гов, поэтому они в значительной степени эквивалентны. Если возникает конфликт, то
файлы в каталоге /etc имеют наивысший приоритет.
cron.service enaЫed
Глава 2. Загрузка и системные демоны 85
cryptdisks-early.service masked
cryptdisks.service masked
cups-browsed.service enaЫed
cups.service disaЫed
wpa_supplicant.service disaЫed
xll-common.service masked
Состояние модуля
В выводе команды systemctl list-unit-files, приведенном выше, мы видим,
что модуль cups. service отключен. Для получения более подробной информации мы
можем использовать команду systemctl status.
Ьаd У менеджера systemd возникла какая-то проблема; обычно это связано со сбоем
модульного файла
indi rect Отключен, но имеет одинаковые значения в разделах Also, которые могут быть включены
linked Модульный файл, доступный через символическую ссылку
mas ked Нежелательный статус с логической точки зрения
st а t i с Зависит от другого устройства; не требует установки
Цели
Модульные файлы могут объявлять свои отношения с другими модулями различ
ными способами. Так, в примере, приведенном в начале раздела "Модули и модульные
файлы", спецификатор WantedBy означает, что, если система имеет модуль multi-
user. target, то данный модуль должен зависеть от него (rsync. service}, когда тот
находится в состоянии enaЫed.
Поскольку модули непосредственно поддерживают управление зависимостями,
для реализации эквивалента уровней выполнения ini t не требуется никаких допол
нительных механизмов. Для ясности менеджер systemd определяет отдельный класс
модулей (типа . target), чтобы использовать их как маркеры общих режимов работы.
Однако цели не имеют особой силы, за исключением управления зависимостями. до
ступного для любого другого модуля.
Традиционный демон init определяет как минимум семь уровней выполнения, но
многие из них на самом деле не используются. Стремясь к ложно понятой исторической
преемственности, менеджер systemd определяет цели как прямые аналоги уровней за
пуска демона ini t (runlevelO. target и т.д.). Он также определяет мнемонические
цели для повседневного использования, такие как poweroff. target и graphical .
target. В табл. 2.6 показано сопоставление между уровнями выполнения init и целя
ми systemd.
Единственными целями, которые действительно необходимо знать, являются mul ti-
user. target и graphical . target для повседневного использования и rescue.
target для доступа к однопользовательскому режиму. Для того чтобы изменить теку
щий режим работы системы, используйте команду systemctl isolate:
"По умолчанию цель 11ul ti-user. target соответствует runlevelЗ. target, многопользовательскому сете
вому режиму.
Подкоманда isolate называется так, потому что она активирует указанную цель
и ее зависимости, но деактивирует все остальные модули.
В традиционном демоне ini t для изменения уровней запуска после загрузки си
стемы используется команда telini t. Некоторые дистрибутивы теперь определяют
telini t как символическую ссылку на команду systemctl.
Для того чтобы увидеть цель, к которой система загружается по умолчанию, запусти
те подкоманду get-defaul t:
$ systemctl get-default
graphical.target
Большинство дистрибутивов Linux загружаются по умолчанию в модуль graphical .
target, что не подходит для серверов, которым не нужен графический интерфейс. Но
это легко изменить:
вочную страницу дпя типа systemd. uni t, (например. man systemd. service).
Третий класс зависимостей - те, которые явно объявлены в разделе [Unit] модуль
ных файлов. Доступные параметры показаны в табл. 2.7.
Параметр Значение
Wants Модули, которые должны быть активированы одновременно, если это возможно, но не
обязательно
Requi re s Строгие зависимости; отказ от каких-либо предварительных условий прекращает работу
этой службы
Порядок выполнения
Разумно предположить, что если модуль А требует (Requeres) наличия модуля В,
то модуль В будет запущен или настроен до модуля А. Но на самом деле это не так.
В менеджере systemd порядок, в котором блоки активируются (или деактивируются),
является совершенно отдельным вопросом.
Когда система переходит в но1юе состояние, менеджер systemd сначала отслежива
ет различные источники информации о зависимости, изложенные в предыдущем раз
деле, чтобы определить задействованные модули. Затем он использует разделы Before
и After из модульных файлов, чтобы упорядочить список заданий. Если модули не
имеют разделов Before или After, они могут быть скорректированы параллельно.
Это удивительная, но достойная внимания функция дизайна. Одной из основных целей
проектирования менеджера syst8111d было облегчение параллелизма, поэтому логично, что
модули не получают зависимостей сериализации, если они явно не запрашивают их.
На практике раздел After используется чаще, чем Wants или Requires. Определе
ния целей (и, в частности, обратных зависимостей, закодированных в предложениях
WantedBy и RequiredBy) устанамивают общие контуры служб, работающих в каждом
рабочем режиме, а отдельные пакеты беспокоятся только о своих непосредственных
и прямых зависимостях.
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $МAINPID
KillMode=process
KillSignal=SIGQUIT
TimeoutStopSec=S
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Эта служба имеет тип forking, что означает, что команда запуска должна завершить
ся, даже если демон продолжает работать в фоновом режиме. Так как менеджер systemd
не будет непосредственно запускать демона, тот записывает свой идентификатор PID
(идентификатор процесса) в указанном PIDFile, чтобы systemd мог определить, какой
процесс является основным экземпляром демона.
будет иметь по существу тот же результат. Если работа демона не закончится за коли
чество секунд, заданных параметром TimeoutStopSec, менеджер system.d заставит его
прекратить работу с помощью сигнала ТЕRМ, а затем неперехватываемоrо сигнала KILL.
Параметр PrivateTmp - попытка повысить безопасность. Он помещает каталог
службы /tmp в место, отличающееся от фактического каталога /tm.p, который использу
ется всеми процессами и пользователями системы.
12 Символы > и !$ - это метасимволы оболочки. Символ > переадресовывает вывод в файл,
а действие символов !$ распространяется до последнего компонента предыдущей командной
строки, так что вам не нужно его повторно вводить. Все оболочки понимают эти обозначения.
Информацию о некоторых других удобных функциях см. в разделе 7.2.
Глава 2. Загрузка и системные демоны 93
Некоторые задачи загрузки систем Red Hat и CentOS продолжают использовать кон
фигурационные файлы, найденные в каталоге /etc/sysconfig. Эти данные приведены
в табл. 2.8.
Таблица 2.8. Файлы и подкаталоги каталога Red Hat /etc/sysconfig
•устанавливает аргументы для системы SELinux или позволяет полностью отключить ее; см. раздел 3.4.
11 Быстрая команда sudo chmod +х /etc/rc.d/rc. local гарантирует, что файл будет исполняться.
94 Часть 1. основы администрирования
Журнал systemd
Фиксация сообщений в журнале, созданных ядром, всегда был сложной задачей. Она
стала еще более важной с появлением виртуальных и облачных систем, поскольку не
возможно просто стоять перед консолями этих систем и следить за тем, что происходит.
$ journalctl
-- Logs begin at Fri 2016-02-26 15:01:25 UTC, end at Fri 2016-02-26
15:05:16 uтс. --
Feb 26 15:01:25 ubuntu systemd-journal[285]: Runtime journal is using
4.6М (max allowed 37 .ом, t
Feb 26 15:01:25 ubuntu systemd-journal[285]: Runtime journal is using
4.6М (max allowed 37.ОМ, t
Feb 26 15:01:25 ubuntu kernel: Initializing cgroup subsys cpuset
Feb 26 15:01:25 ubuntu kernel: Initializing cgroup subsys cpu
Feb 26 15:01:25 ubuntu kernel: Linux version 3.19.0-43-generic (buildd@
lcyOl-02) (gcc version 4.
Feb 26 15:01:25 ubuntu kernel: Command line: BOOT_IМAGE=/boot/vmlinuz-
3.19.0-43-generic root=UUI
Feb 26 15:01:25 ubuntu kernel: KERNEL supported cpus:
Feb 26 15:01:25 ubuntu kernel: Intel Genuineintel
$ journalctl -Ь -1
$ journalctl -Ь a73415fade0e4e7f4bea60913883d180dc
Для того чтобы ограничиться конкретным модулем, используйте флаг -u.
$ journalctl -u ntp
-- Logs begin at Fri 2016-02-26 15:11:03 UTC, end at Fri 2016-02-26
15:26:07 uтс. --
Feb 26 15:11:07 ub-test-1 systernd[l]: Stopped LSB: Start NТР daemon.
Feb 26 15:11:08 ub-test-1 systernd[l]: Starting LSB: Start NТР daemon ...
Feb 26 15:11:08 ub-test-1 ntp[761]: * Starting NTP server ntpd
• /etc/defaults/config
• / etc/ rc. conf
• /etc/rc.conf .local
Эти файлы сами являются сценариями, но обычно они содержат только определения
значений переменных оболочки. Затем сценарии запуска проверяют эти переменные,
чтобы определить, как вести себя дальше. (Программа /etc/rc использует некоторые
средства оболочки, чтобы гарантировать, что переменные, определенные в этих файлах,
будут видны повсюду.)
#!/Ьin/sh
# PROVIDE: sshd
# REQUIRE: LOGIN FILESYSTEMS
# KEYWORD: shutdown
/etc/rc.subr
name="sshd"
rcvar="sshd еnаЫе"
command="/usr/sЬin/${name}"
14Для локальных настроек можно либо создать стандартные сценарии в стиле rc. d, которые
находятся в каталоге /usr/local/etc/rc.d, либо редактировать общедоступный сценарий /etc/
rc. local. Первый вариант предпочтительнее.
15 Версия службы, которую использует система FreeBSD, основывается на команде service
в системе Liпux, которая управляет традиционными службами ini t.
Глава 2. Загрузка и системные демоны 97
Команда shutdown - это надстройка над командами hal t и reboot, которая обе
спечивает запланированные выключения и выдачу тревожных предупреждений для за
регистрированных пользователей. Она восходит к эпохе систем разделения времени и в
настоящее время в значительной степени устарела. Команда shutdown не делает ничего
важного, кроме выполнения команд hal t или reboot, поэтому ее можно не использо
вать, если у вас нет многопользовательских систем.
В среде AWS операции Stop и ReЬoot делают именно то, что вы ожидаете. Команда
Terminate деактивирует экземпляр и удаляет его из памяти. Если для базового устрой
ства хранения установлено значение delete on termination (удалить при заверше
нии), будет уничтожен не только ваш экземпляр, но и данные на корневом диске. Все
хорошо, если вы хотели сделать именно это. Если же вы считаете, что это плохо, можно
включить параметр termination protection (защита завершения).
Однопользовательский режим
В однопользовательском режиме, также известном как rescue. target, для систем,
использующих менеджер systemd, запускается только минимальный набор процессов,
демонов и служб. Корневая файловая система смонтирована (как правило, /usr), но
сеть остается неинициализированной.
Во время заrрузки вы запрашиваете однопользовательский режим, передавая аргу
мент ядру, обычно single или -s. Это можно сделать с помощью интерфейса команд
ной строки загрузчика.
В некоторых случаях он может быть настроен автоматически в качестве опции меню
загрузки. Если система уже запущена, ее можно перевести в однопользовательский ре
жим с помощью команды shutdown (FreeBSD), telini t (традиционный ini t) или
systemctl (systemd).
Ш Дополнительную информацию об учетной записи root см. в главе 3.
Системы Sane перед запуском однопользовательской корневой оболочки запрашива
ют корневой пароль. К сожалению, это означает, что сбросить забытый корневой пароль
в однопользовательском режиме практически невозможно. Если вам нужно сбросить па
роль, придется получить доступ к диску с помощью отдельного загрузочного носителя.
# mount -о rw,remount /
В системах FreeBSD возможность повторного подключения является неявной, когда вы
повторяете монтирование, но необходимо явно указать исходное устройство. Например,
# mount -о rw /dev/qpt/rootfs /
• Система
1.
2.
3.
4.
FreeBSD включает одноnользовательский вариант в меню загрузки.
Options
5. Kernel: default/kernel (1 of 2)
6. Configure Boot Options ...
Одна приятная особенность однопользовательскоrо режима в FreeBSD заключается
в том, что он спрашивает, какую проrрамму использовать в качестве оболочки. Просто
нажмите <Enter> для оболочки /bin/ sh.
Выбрав вариант 3, вы переЙдете в среду командной строки заrрузочного уровня, реа
лизованную финальным загрузчиком FreeBSD loader.
сможете использовать этот метод. Понятно, что это похоже на загрузку с USВ-накопителя,
так что можно сориентироваться на загрузочном диске физической системы.
Вот что надо сделать.
Эта глава посвящена контролю доступа, под которым, в отличие от концепции без
опасности, мы подразумеваем механизм принятия решений, связанных с безопасно
стью, реализуемый ядром и его делегатами. В главе 27, посвященной безопасности, рас
сматривается более общий вопрос о том, как настроить систему или сеть, чтобы свести
к минимуму вероятность нежелательного доступа злоумышленников.
Контроль доступа - это область активных исследований, которая уже давно является
одной из главных проблем разработки операционных систем. За последнее десятилетие
мир UNIX и Liпux пережил кембрийский взрыв новых возможностей в этой области.
Первичным драйвером этого всплеска стало появление АРl-интерфейсов ядра, которые
позволяют сторонним модулям увеличивать или заменять традиционную систему управ
ления доступом UNIX. Этот модульный подход создает множество новых возможностей;
контроль доступа теперь так же открыт для изменений и экспериментов, как и любой
другой аспект UNIX.
Тем не менее традиционная система остается стандартом UNIX и Liпux, и она подхо
дит для большинства установок. Даже системные администраторы, которые хотят выйти
на новые рубежи, должны овладеть основами.
104 Часть 1. Основы администрирования
в группе UNIX.
• Объекты (например, файлы и процессы) имеют владельцев. Владельцы имеют ши
рокий (но не обязательно неограниченный) контроль над своими объектами.
Усложнение этой картины состоит в том, что ядро и файловая система тесно пере
плетаются. Например, вы управляете и общаетесь с большинством устройств через фай
лы, которые представляют их в каталоге /dev. Поскольку файлы устройств являются
объектами файловой системы, они подчиняются семантике управления доступом к фай
ловой системе. Ядро использует этот факт в качестве основной формы контроля доступа
для устройств.
1 Имейте в виду, что мы здесь описываем оригинальный дизайн системы контроля доступа. В наши
дни не все эти утверждения остаются истинными в буквальном смысле. Например, процесс Liпux,
который имеет соответствующие возможности (см. раздел 3.3), теперь может выполнять некоторые
операции, которые ранее были ограничены только компетенцией пользователя root.
Глава 3. Управление доступом и привилегии суперпользователя 105
Хотя владельцем файла всегда является один человек, многие могуr быть владельца
ми файлов, если они все являются частью одной группы. Группы традиционно опреде
ляются в файле /etc/group, но в настоящее время информация о группе часто сохра
няется в системе сетевых баз данных, такой как LDAP; для получения дополнительной
информации см. главу 17.
m Для получения дополнительной информации о группах см. раздел 8.5.
Владелец файла определяет, что могут сделать с ним члены групп. Эта схема позволя
ет делиться файлами между членами одного и того же проекта.
Владельца файла можно определить с помощью команды ls -1:
$ ls -1 ~qarth/todo
-rw-r----- 1 garth staff 1259 Мау 29 19:55 /Users/garth/todo
Данный файл принадлежит пользователю garth и группе staf'f'. Буквы и тире
в первом столбце символизируют разрешения на файл; для получения подробной ин
формации о том, как декодировать эту информацию, обратитесь к разделу 5.5. В данном
случае коды означают, что пользователь garth может читать или записывать файл и что
члены группы staf'f' могут его прочитать.
Владение процессом
Владелец процесса может отправлять сигналы процесса (см. раздел 4.2), а также мо
жет понизить (повысить) приоритет планирования процесса. Процессы на самом деле
имеют несколько идентификаторов, связанных с ними: реальный, текущий и сохранен
ный UID; реальный, текущий и сохраненный GID; а в системе Linux - "идентификатор
файловой системы", который используется только для определения разрешений доступа
к файлам. Вообще говоря, реальные номера используются для учета (и в настоящее вре
мя в значительной степени являются рудиментарными), а текущие номера - для опре
деления разрешений доступа. Реальные и текущие номера, как правило, одинаковы.
Сохраненные UID и GID - это парковочные места для идентификаторов, которые
в настоящее время не используются, но остаются доступными для вызова из процесса.
рации.
2 Дженнин Таунсенд, одна из наших рецензентов, прокомментировала это так: "Настолько плохие
идеи, что я боюсь даже упоминать их, чтобы кого-нибудь не спровоцировать".
3 3десь ключевое слово - "допустимая". Некоторые операции (например, выполнение файла,
для которого не устаноw~ен бит разрешения выполнения) запрещены даже суперпользователю.
Глава 3. Управление доступом и привилегии суперпользователя 107
консоли. Мы преддагаем вам использовать эти возможности. Чтобы узнать, как реали
зовать эту политику в вашей конкретной системе, см. раздел 17.3.
Если у пользователя root есть пароль (т.е. учетная запись root не отключена,
см. ниже), этот пароль должен быть очень сложным. Для получения дополнительных
комментариев относительно выбора пароля см. раздел 27.3.
Пример конфигурации
Файл sudoers разработан таким образом, что одна версия может использоваться
сразу на нескольких разных хостах. Вот типичный пример.
# Define aliases for machines in CS & Physics departments
Host_Alias CS = tigger, anchor, piper, moet, sigi
Host Alias PHYSICS = eprince, pprince, icarus
# Permissions
mark, ed PHYSICS = ALL
herb CS = /usr/sЬin/tcpdump : PHYSICS = (operator) DUMP
lynda ALL = (ALL) ALL, !SHELLS
%wheel ALL, !PHYSICS = NOPASSWD: WATCHDOG
Первые два набора строк определяют группы хостов и команды, которые упоми
наются в дальнейших спецификациях разрешений, включенных в файл. Списки могут
быть включены буквально в спецификации, но псевдонимы облегчают чтение и пони
мание файла sudoers; они также упрощают обновление файла в будущем. Также воз-
110 Часть 1. Основы администрирования
• Реальный пароль root может быть известен только одному или двум людям. 5
• Использование программы sudo быстрее, чем вызов su или вход в систему с пра
вами root.
• Программа sudo работает на всех системах UNlX и Linux. Вам не нужно беспоко-
иться об управлении различными решениями на разных платформах.
• Вы можете использовать один файл конфигурации во всей организации.
• Вы бесплатно получаете качественные протоколы.
Даже не пытайтесь использовать эти конфигурации. Если вам нужна эта функцио
нальная возможность, лучше всего подключить одну из систем управления доступом,
Типичная настройка
За многие годы система конфигурации sudo накопила много функций. Она была
модифицирована, чтобы учесть множество необычных ситуаций и крайних случаев.
В результате текущая документация создает впечатление сложности, которое не обяза
тельно оправданно.
шения проблем, которые полезны дпя конкретных ситуаций. Для общей надежности
больше ничего не требуется.
Управление окружением
1'Поясним, что сценарий в этом случае заключается в том, что ваша учетная запись была
скомпрометирована, но злоумышленник не знает ваш фактический пароль и поэтому не может
напрямую запускать программу sudo. К сожалению, это обычная ситуация, все, что требуется, -
это терминальное окно, оставленное на мгновение без присмотра.
Глава 3. Управление доступом и привилегии суперпользователя 113
Иногда это делается из-за лени, но, как правило, основная причина - желание вы
полнить какие-то операции без санкции программы sudo. Наиболее распространенны
ми случаями являются удаленная настройка с помощью такой системы, как AnsiЫe, или
запуск команд из планировщика cron.
W Дополнительную информацию о системе AnsiЫe см. в главе 23.
Излишне говорить, что эта конфигурация опасна, поэтому избегайте ее, если може
те. По крайней мере ограничьте выполнение небезопасного доступа к определенному
набору команд, если сможете.
Другим вариантом, который хорошо работает в контексте удаленного выполнения,
является замена введенных вручную паролей аутентификации с помощью программы
ssh-agent и перенаправленных SSН-ключей. Вы можете настроить этот метод аутен
тификации с помощью модуля РАМ на сервере, где будет выполняться программа sudo.
Большинство систем не включают модуль РАМ, который по умолчанию использует
аутентификацию на основе SSH, но он легко доступен. Найдите пакет pam_ ssh _ agent_
auth.
Пересылка ключей SSH имеет собственный набор проблем безопасности, но это,
безусловно, лучше, чем полное отсутствие аутентификации.
Приоритет
Вызов программы sudo потенциально может быть рассмотрен несколькими запися
ми в файле sudoers. Например, рассмотрим следующую конфигурацию:
User Alias ADMINS = alice, ЬоЬ, charles
User Alias MYSQL_ADMINS = alice, ЬоЬ
Defaults !requiretty
Опция requiretty предлагает небольшую символическую защиту от определенных
сценариев атаки. Тем не менее ее легко обойти, таким образом, она дает мало реальных
преимуществ в плане безопасности. По нашему мнению, опцию requiretty необходи
мо отключить, потому что это общий источник проблем.
Естественным следствием этого подхода является то, что разрешения sudo могут
быть лучше выражены в терминах учетных записей пользователей, а не групп UNIX.
Например, запись
Сетевая файловая система (NFS) использует учетную запись nobody для представ
ления пользователей root в других системах. Для удаленных суперпользователей, ко
торые должны быть лишены своих привилегированных полномочий, удаленный UID,
равный О, должен быть сопоставлен с чем-то другим, кроме локального UID, равного О.
Учетная запись nobody действует как общее имя для этих удаленных суперпользовате
лей. В системе NFSv4 учетная запись nobody может применяться к удаленным поль
зователям, которые также не соответствуют действительной локальной учетной записи.
• Начнем с того, что учетная запись root представляет собой потенциально един
ственную точку отказа. Если она будет скомпрометирована, целостность всей си
стемы будет нарушена, и, по существу, нет ограничений на ущерб, который может
нанести злоумышленник.
• Стандартная модель мало что может сказать о безопасности в сети. Нет компью
тера, к которому непривилегированный пользователь имел бы физический доступ
и которому можно было бы доверять, чтобы точно представлять владельцев запу
скаемых процессов. Кто скажет, что кто-то не переформатировал диск и не уста
новил свою собственную операционную систему с идентификатором UID по сво
ему выбору?
не должны предполагать, что пароли вообще используются. Что делать, если вы хотите
использовать биометрическую идентификацию, систему идентификации сети или ка
кую-либо двухфакторную аутентификацию? На помощь приходят подключаемые моду
ли аутентификации РАМ!
РАМ (PluggaЬle Autentication Modules) - это оболочка для различных библиотек ау
тентификации, реализующих разные методы. Системные администраторы определя
ют методы аутентификации, которые они хотят использовать в системе, а также соот
ветствующие контексты для каждого из них. Программы, требующие аутентификации
пользователя, просто вызывают систему РАМ, а не реализуют собственные методы ау
тентификации.
В свою очередь РАМ вызывает библиотеку аутентификации, указанную системным
администратором. Строго говоря, РАМ - это технология аутентификации, а не техно
логия контроля доступа. Следовательно, вместо ответа на вопрос "Имеет ли пользова
тель Х разрешение на выполнение операции У?", она помогает ответить на вопрос "Как
узнать, что это действительно пользователь Х?"
РАМ является важным компонентом цепочки контроля доступа в большинстве си
стем, а конфигурация РАМ является общей административной задачей. Более подроб
ную информацию о РАМ вы можете найти в разделе 17.3.
Возможности Linux
Системы мандатов (capabllity systems) делят полномочия учетной записи
root на несколько (около 30) отдельных разрешений.
Версия системы мандатов в Linux основана на черновике проекта POSIX 1003.le,
который используется, несмотря на то, что он официально не был одобрен в качестве
стандарта. Ломимо прочего, теоретики считают, что эта зомби-система не соответствует
академической концепции системы мандатов. Однако это не важно; система существует,
и Linux называет ее мандатной, поэтому мы подчиняемся.
Мандаты могут быть унаследованы от родительского процесса. Они также могут
быть включены или отключены атрибутами, установленными в исполняемом файле,
в процессе, напоминающем выполнение программы с флагом setuid. Лроцессы могут
отказаться от мандатов, которые они не планируют использовать.
чает в себя расширения, такие как доступ к файловой системе для копирования на за
пись. Нам еще немного нужно сказать о контейнерах в главе 25.
В качестве формы контроля доступа пространство имен является относительно гру
бым подходом. Конструкция правильно настроенных гнезд для процессов, в которых
можно жить, также несколько сложна.
Отдельные экосистемы
Контроль доступа по своей сути относится к уровню ядра. За исключением списков
управления доступом к файловой системе (см. раздел 5.6), по существу, среди систем
в отношении альтернативных механизмов контроля доступа нет стандартизации. В ре
зультате каждое ядро имеет свой собственный набор доступных реализаций, и ни одна
из них не является кросс-платформенной.
Поскольку дистрибутивы Linux имеют общую линию ядра, все они теорети
чески совместимы со всеми раз.личными предложениями обеспечения без
опасности Linux. Однако на практике это не так: эти системы нуждаются
в поддержке на уровне пользователя в виде дополнительных команд, моди
Роли похожи на разные rруппы UNIX, но они носят более общий характер, посколь
ку моrут использоваться вне контекста файловой системы. Роли также моrут образовы
вать иерархии, что значительно упрощает администрирование. Например, вы можете
определить роль "старшеrо администратора", которая имеет все разрешения "админи
стратора" плюс дополнительные разрешения Х, У и Z.
Мноrие версии UNIX, включаяSolaris, HP-UX и AIX, включают в себя некоторую
форму встроенной системы RBAC. Системы Linux и FreeBSD не имеют четкоrо, соб
ственноrо средства RBAC. Однако она встроена в несколько более полных вариантов
системы МАС.
8 Если вы склонны к подозрениям, то стоит отметить. что в качестве части дистрибуrива ядра Linux
кодовая база SELinux открьrrа для проверки.
124 Часть 1. Основы администрирования
AppArmor
ф
Система AppArmor является продуктом компании Canonical, Ltd., вы
пускающей дистрибутив Ubuntu. Она поддерживается системами Deblan
и Ubuntu, но также была принята в качестве стандарта дистрибутивами
SUSE. Системы Ubuntu и SUSE позволяют устанавливать ее по умолчанию,
хотя набор защищенных служб не является обширным.
/usr/sbin/cups-browsed (
#include <abstractions/base>
#include <abstractions/nameservice>
126 Часть 1. Основы администрирования
#include <abstractions/cups-client>
#include <abstractions/dbus>
#include <abstractions/pll-kit>
/etc/cups/cups-browsed.conf r,
/etc/cups/lpoptions r,
/{var/,}run/cups/certs/* r,
/var/cache/cups/* rw,
/tmp/** rw,
Большая часть этого кода является модульным шаблоном. Наnример, этот де
мон должен выполнять поиск имен хостов, поэтому nрофиль интерnолирует nуть
aьstractions/nameservice и предостамяет доступ к библиотекам разрешений имен,
файлам /etc/nsswitch.conf и /etc/hosts, сетевым портам, используемым протоко
лом LDAP и т.д.
Информация профилирования, специфичная для этого демона, состоит (в данном
случае) из списка файлов, к которым может обращаться демон, а также разрешений
для каждого файла. Синтаксис сопостамения шаблонов немного отличается: символы
**могут соответствовать нескольким компонентам пути, а {var/, 1 соответствует стро
ке var / в соответствующем месте пути.
Даже этот простой профиль устроен довольно сложно. Если раскрыть все инструк
ции iinclude, то профиль имеет длину около 750 строк. (А ведь мы выбрали этот nри
мер ради его краткости. Увы!)
Система AppArmoг ссылается на файлы и программы no имени пути, что дела
ет профили удобочитаемыми и независимыми от какой-либо конкретной реализации
файловой системы. Однако этот подход ямяется компромиссным. Например, система
AppArmor не распознает жесткие ссылки, указывающие на один и тот же объект.
3.5. ЛИТЕРАТУРА
• FERRAJOLo, Dлvю F., D. R1cнлRD KuнN, дND Rлмлswлмv CндNDRAMOULI. Role-Based
Access Control (2nd Edition). Вoston, МА: Artech House, 2007.
• HлrNEs, RrcнлRD. The SELinux Notebook (4th Edition). 2014. Сборник информации,
относящейся к системе SELinux, наиболее близкий к официальной документации.
Доступен для загрузки на сайте freecomputerbooks. сот.
• VERMEULEN, SvEN. SELinux Cookbook. Birmingham, UK: Packt PuЬlishing, 2014. Книга,
содержащая самые разнообразные советы по работе с системой SELinux. В ней
описаны модели обеспечения безопасности как служб, так и пользователей.
Глава 4
Управление процессами
• приоритет процесса;
1 Страницы - это базовые блоки памяти, размер которых состамяет от 1до8 Кбайт.
128 Часть 1. Основы администрирования
Поток - это контекст выполнения процесса. Каждый процесс имеет как минимум
один поток, но некоторые процессы могут иметь несколько потоков. Каждый поток,
действуя в адресном пространстве внешнего процесса, имеет свой собственный стек
и регистры центрального процессора
ким группам. Список групп хранится отдельно от значений GID и EGID. При анализе
прав доступа проверяется текущий идентификатор и дополнительный список групп, но
не значение GID.
130 Часть 1. Основы администрирования
Фактор уступчивости
Приоритет процесса определяет, какую долю времени центрального процессора по
лучает программа. Ядро применяет динамический алгоритм вычисления приоритетов,
учитывающий, сколько времени центрального процессора уже использовал процесс
и сколько времени он ожидает своей очереди. Кроме того, учитывается заданный адми
нистратором так называемый фактор уступчивости, который определяет, в какой сте
пени программа может "делиться" процессором с другими пользователями. Подробнее
этот механизм рассматривается в разделе 4.4.
Управляющий терминал
m Дополнительную информацию о стандартных каналах связи см в разделе 7.2.
С большинством процессов, не являющихся демонами, связан управляющий терми
нал, который определяет базовую конфигурацию стандартных каналов ввода, вывода
и ошибок. От управляющего терминала зависит также распределение сигналов в ответ
на события клавиатуры, например нажатие клавиш <Ctrl+C>, о чем пойдет речь в раз
деле 4.2.
Системный вызов fork имеет уникальное свойство: он возвращает два разных зна
чения. В дочернем процессе это число О, а в родительском - идентификатор PID про
цесса-потомка. Поскольку в остальном процессы идентичны, они должны проверять
результат вызова, чтобы определить, какую роль следует играть в дальнейшем.
После завершения системного вызова fork дочерний процесс обычно запускает но
вую программу с помощью одного из системных вызовов семейства ехес. Все вызовы
этого семейства заменяют программу, выполняемую процессом, и устанавливают сег
менты памяти в исходное состояние. Формы вызовов ехес различаются только спосо
бами указания аргументов командной строки и переменных среды, передаваемых новой
программе.
тер их действий в UNIX и Linux различается. Все процессы, кроме тех, что создаются
ядром, являются потомками этих процессов. Дополнительная информация о загрузке
и демоне ini t содержится в главе 2.
Демон ini t (или systemd) играет и другую важную роль в управлении процесса
ми. Завершающийся процесс вызывает функцию_exi t, чтобы уведомить ядро о своей
готовности прекратить работу. В качестве параметра функции_exi t передается код за
вершения - целое число, обозначающее причину прекращения процесса. По общепри
нятому соглашению, нуль свидетельствует об успешном завершении процесса.
Ядро системы требует, чтобы, прежде чем процесс окончательно исчезнет, его удале
ние было подтверждено родительским процессом с помощью системного вызова wai t.
Этот вызов возвращает код завершения потомка (или сообщает о причине его уничто
жения, если завершение не было естественным) и в случае необходимости статистику
использования ресурсов.
Сигналы
Сигналы - это запросы на прерывание, реализуемые на уровне процессов.
Существуют свыше тридцати различных сигналов, и они находят самое разное приме
нение.
W Дамп памяти - это файл, содержащий образ памяти процесса. Его можно использовать
для отладки.
Когда поступает сигнал, возможен один из двух вариантов развития событий. Если
процесс назначил сигналу подпрограмму обработки, то после вызова ей предоставляется
информация о контексте, в котором был сгенерирован сигнал. В противном случае ядро
выполняет от имени процесса действия, заданные по умолчанию. Эти действия зависят
от сигнала. Многие сигналы приводят к завершению процесса, а в некоторых случаях
при этом еще и создаются дампы памяти.
4 Функции, связанные с комбинациями клавиш <Ctrl+Z> или <Ctrl+C>, мо~уг назначаться другим
клавишам с помощью команды stty, но на практике такое встречается очень редко. В этой главе
мы подразумеваем, что с данными клавишами связаны их стандартные функции.
132 Часть 1. Основы администрирования
Реакция Дамn
№' Имя Описание ПереХ88ТЫвеется? &покируетсt1?
ПО yмD.llЧ8HMIO памяти?
1 HUP Отбой Завершение ~ ~ Нет
2 INT Прерывание Завершение ~ ~ Нет
"Список названий сигналов и номеров также можно получить с помощью встроенной в оболочку bash команды
kill -1.
"Зависит от используемой системы. Подробнее см. файл /usr/ include/ signal. h или тап-страницы интерак-
тивного руководства для системного вызова s i gna 1 ( ) .
Перехват и блокирование сигналов обычно разрешены, так как есть достаточно "ум
ные" программы, устраняющие последствия ошибок.
Сигналы вus и SEGV также посылаются при возникновении ошибок. Мы включили
их в таблицу, поскольку они чрезвычайно распространены: обычно программа аварийно
завершается именно из-за них. Сами по себе эти сигналы не имеют диагностической
ценности. Они лишь указывают на факт неправильного обращения к памяти.
Сигналы KILL и STOP нельзя ни перехватить, ни заблокировать, ни проигнориро
вать. Сигнал KILL приводит к уничтожению процесса, которому он посылается, а сиг-
глава 4. Управление процессами 133
где сигнал - это номер или символическое имя посылаемого сигнала (см. табл. 4.1),
а pid - идентификационный номер целевого процесса.
Команда kill без номера сигнала не гарантирует, что процесс будет уничтожен, по
скольку сигнал TERM можно перехватывать, блокировать и игнорировать. Команда
$ kill -9 pid
"гарантированно" уничтожает процесс, так как сигнал с номером 9 (KILL) не перехваты
вается. Используйте команду kill -9 только в случае, если "вежливый" запрос на за
вершение программы не был выполнен. Мы написали слово "гарантированно" в кавыч
ках, так как иногда процессы переходят в такое состояние, в котором их нельзя завершить
даже таким способом (обычно это связано с блокировкой ввода-вывода, например при
остановке жесткого диска). Единственный выход в такой ситуации - перезагрузка.
Команда killall уничтожает процессы, заданные именем. Например, следующая
команда уничтожает все процессы веб-сервера Apache.
$ sudo killall httpd
Команда pkill осуществляет поиск процессов, заданных именами (или другими
атрибутами, например EUID), и посылает найденным процессам сигнал. Например,
следующая команда посылает сигнал TERM всем процессам, выполняемым от имени
пользователяben.
$ sudo pkill -u Ьеn
5 Аналоrичным образом можно управлять отдельными потоками. Однако эти объекты в первую
очередь представляют интерес для разработчиков; системные администраторы не должны
беспокоиться по этому поводу.
Глава 4. Управление процессами 135
Некоторые операции могут привести к тому, что процессы или потоки войдут в со
стояние беспробудного сна. Это состояние обычно является переходным и не наблю
дается в результате работы команды ps (оно обозначается буквой D в столбце STAT,
см. табл. 4.2). Однако несколько специфических ситуаций могут привести к тому, что
это состояние станет постоянным. Наиболее распространенная причина связана с про
блемами сервера в файловой системе NFS, инсталлированной с параметром hard.
Поскольку процессы в состоянии беспробудного сна не могут просыпаться даже для об
служивания сигнала, они не могут быть прекращены. Чтобы избавиться от них, вы
должны устранить основную проблему или перезагрузить компьютер.
Не пугайтесь всех этих сложностей: пусть они будут кошмаром разработчиков ядра,
а не системных администраторов! Дпя повседневной работы достаточно знать лишь не
сколько наиболее важных опций команды ps.
Получить список всех процессов, выполняющихся в системах, можно с помощью
команды ps aux. Ключ а означает, что мы хотим увидеть все процессы, ключ х - что
мы хотим увидеть даже процессы, отсоединенные от управляющего терминала, а ключ u
обеспечивает фильтрование по имени или идентификатору пользователя, который запу
стил программу. Ниже показаны результаты работы команды ps aux в системе Red Hat.
redhat$ ps aux
USER PID %CPU %МЕМ vsz RSS ТТУ SТАТ TIME СОММАND
root 1 0.1 0.2 3356 560 ? s 0:00 init [5]
root 2 о о о о ? SN 0:00 [ksoftirqd/0]
root 3 о о о о ? S< 0:00 [events/0]
136 Часть 1. Основы администрирования
•программы могут модифицировать эту информацию, так что она не всегда точно представляет реальную команд
ную строку.
Глава 4. Управление процессами 137
этого служит свободно распространяемая утилита top, которая работает во многих си
стемах, регулярно обновляя сводку активных процессов и используемых ими ресурсов.
Рассмотрим пример.
redhat$ top
top - 20:07:43 up 1:59, 3 users, load average: 0.45, 0.16, 0.09
Tasks: 251 total, 1 running, 250 sleeping, О stopped, О zomЫe
%Cpu (s): 0.7 us, 1.2 sy, О .О ni, 98.0 id, о.о wa, о.о hi, О. 2 si, о.о st
KiB Mem : 1013672 total, 128304 free, 547176 used, 338192 buf f /cache
KiB Swap: 2097148 total, 2089188 free, 7960 used. 242556 avail Мет
сору. 7 Чем выше фактор уступчивости, тем ниже приоритет процесса и наоборот, от
сюда и название термина. Низкое или отрицательное значение означает использова
ние высокого приоритета: процесс ведет себя не слишком уступчиво.
В настоящее время администраторам редко приходится определять приоритеты вруч
ную. Сегодня, когда на рабочих столах стоят намного более быстродействующие ком
пьютеры, системный планировщик, как правило, обслуживает все процессы весьма
оперативно. Добавление классов планирования предоставляет разработчикам дополни
тельные средства управления в тех случаях, когда важна быстрая ответная реакция.
Диапазон допустимых значений фактора уступчивости зависит от используемой си
стемы. В частности, в системе Linux используется диапазон от -20 до + 19, а в системе
FreeBCD - от -20 до +20.
Если пользователь не предпринимает специальных мер, дочерний процесс наследует
приоритет своего родительского процесса. Владелец процесса может увеличить фактор
уступчивости, но не может уменьшить его, даже чтобы вернуться к стандартному значе
нию. Это не позволяет процессам с низким приоритетом порождать высокоприоритет
ных потомков. Однако суперпользователь может устанавливать произвольные значения
фактора уступчивости.
К сожалению, уровень производительности подсистемы ввода-вывода растет не так
стремительно, как быстродействие центральных процессоров, поэтому жесткие диски
стали основным узким местом в большинстве операционных систем. Фактор уступчи
вости никак не влияет на подсистемы управления памятью и вводом-выводом, поэтому
11 фактор уступчивости) на 5
$ sudo renice -5 8829 11 Задаем фактор уступчивости равным -5
$ sudo renice 5 -u boqqs 11 Задаем фактор уступчивости процессов
Все эти варианты приведены в табл. 4.3. Элемент приор для среды, в которой вызы
вается команда nice или renice, означает абсолютное значение фактора уступчивости,
а инкр - относительное. Знаки "плюс" в команде nice обязательны только для интер
претатора команд; в остальных случаях они игнорируются.
Таблица 4.3. Как выражаются приоритеты в различных версиях команд nice и renice
Система Диапазон ОС-команда nice Команда nice в оболочке csh Команда renice
Uпux -20-19 -n инкр +инкр или -инкр приор или -n приор
FreeBSD -20-20 -n инкр +инкрили -инкр инкр или -n инкр
Несмотря на имя /proc (и имя базового типа файловой системы - "proc"), хра
нящаяся в этом каталоге информация не ограничивается одними лишь процессами -
здесь хранится вся информация о состоянии и статистические сведения, генерируемые
ядром. Некоторые параметры можно даже изменять, записывая новые значения в соот
ветствующий файл каталога /proc, - ряд примеров приведен в разделе 11.4.
Хотя большую часть информации проще получать с помощью таких интерфейсных
команд, как vmstat и ps, некоторые данные придется считывать непосредственно из
каталога /proc. Следовательно, целесообразно просмотреть его, чтобы ознакомиться со
всеми помещенными в него файлами. Команда man proc позволяет ознакомиться с ря
дом полезных советов и приемов.
Поскольку ядро создает содержимое файлов каталога /proc на лету (во время их
считывания), большинство из них выглядят пустыми при их открытии с помощью ко
манды ls -1. Для просмотра действительного содержимого этих файлов придется
прибегнуть к командам cat или less. Однако будьте осторожны: некоторые файлы со
держат двоичные данные либо ссылаются на двоичные данные, непосредственный про
смотр которых может поставить в тупик эмулятор терминала.
Файл Содержимое
• В системе
лога /proc.
FreeBSD также используется файловая система на основе ката
Однако она объявлена устаревшей. По соображениям совме
стимости ее все еще можно смонтировать, но только не по умолчанию. Для
этого можно выполнить командук
в системе
Схема файловой системы похожа на версию файловой системы procfs Linux,
но не совпадает с ней. Информация о процессе включает в себя его состояние, символи
ческую ссьшку на выполняемый файл, детали виртуальной памяти, выделенной процессу,
а также другую подробную информацию (см. также справочную страницу man procfs).
"Чтобы автоматически монтировать файловую систему /proc во время загрузки, добавьте в файл
в /etc/fstaЬ строку proc /proc procfs rw О О.
142 Часть 1. Основы администрирования
УПо крайней мере, как правило. Команда strace может прерывать системные вызовы. В этих
случаях отслеживаемый процесс должен быть подготовлен для повторного запуска этих вызовов.
Таково стандартное правило выполнения программ в среде UNIX, но оно не всегда соблюдается.
Глава 4. Управление процессами 143
ввода-вывода. Если загрузка процессора составляет около 100%, это, вероятно, является
узким местом.
Процессы, вышедшие из-под контроля, моrут заполнить всю файловую систему, что
вызовет многочисленные проблемы. Когда файловая система заполняется, на консоль
записывается большое количество сообщений, и попытки записи в файловую систему
будут вызывать сообщения об ошибках.
Первое, что нужно сделать в этой ситуации, - определить, какая файловая система
заполнена и какой файл ее заполняет. Команда df -h показывает использование диска
файловой системы в единицах, читаемых человеком. НаЙдите файловую систему, запол-
Глава 4. Управление процессами 145
&_ По причинам, которые остаются неясными, демон cron в системе Red Hat
RHEL. был переименован в crond. Однако это все тот же самый cron, который все
мы знаем и любим.
Демон cron обычно работает молча, но большинство версий могут вести файл жур
нала (обычно /var/log/cron), в котором перечислены команды, которые были выпол
нены, и моменты времени, когда они запускались. Взгляните на файл журнала cron,
если у вас возникли проблемы с работой демона cron и вы не можете понять, почему.
Первые пять полей сообщают демону cron, когда нужно выполнить команду. Они
разделены пробелами, но внутри поля команды пробелы передаются прямо в оболоч
ку. Поля в спецификации времени интерпретируются, как показано в табл. 4.5. Запись
в файле crontaЬ часто называют заданием планировщика.
Диапазоны времени в файле crontaЬ могут включать значение шага. Например, ряд
О, 3, 6, 9, 12, 15, 18 можно записать более кратко как 0-18/3. Можно также использо
вать трехбуквенную текстовую мнемонику для имен месяцев и дней, но не в сочетании
с диапазонами. Насколько нам известно, эта функция работает только с английскими
именами.
0,30 * 13 * 5
означает "каждые полчаса в пятницу и каждые полчаса 13-ro числа", а не "каждые пол
часа в пятницу 13-ro".
Команда представляет собой командную строку оболочки sh, которая должна быть
выполнена. Это может быть любая допустимая команда оболочки и ее не нужно брать
в кавычки. Предполагается, что команда продолжается до конца строки и может содер
жать пробелы или знаки табуляции.
Знаки процента(%} указывают символы новой строки в поле команда. В фактиче
скую команду включается только текст, стоящий до первого знака %. Остальные строки
передаются команде в качестве стандартного ввода. Используйте обратную косую черту
(\}в качестве управляющего символа в командах с значащим знаком процента, напри
мер dаtе + \%s.
Хотя оболочка sh участвует в выполнении команды, она не действует как оболоч
ка регистрации (login shell) и не читает содержимое файлов-./ .profile или-./ .bash_
profile. В результате переменные окружения команды могут быть настроены не
сколько иначе, чем ожидаемые. Если команда работает нормально из-под оболочки, но
терпит сбой при включении в файл crontaЬ, вероятным виновником является окруже
ние. Если это необходимо, всегда можете обернуть свою команду сценарием, устанавли
вающим соответствующие переменные окружения.
РАТИ= /bin:/USR/bin
* * * * * echo $(date) - $(uptime) >> -/uptime.log
Вот еще несколько примеров корректных записей в файле crontaЬ:
Если ваше задание cron является сценарием, обязательно сделайте его исполняемым
(с помощью команды chmod +х), иначе демон cron не сможет его выполнить. В каче
стве альтернативы настройте команду cron для непосредственного выполнения вашего
сценария прямо из командной оболочки (например, bash -с ... /Ьin/myscript. sh).
ля. Дополнительное поле имени пользователя находится перед именем команды. Поле
имени пользователя отсутствует в файлах crontab, поскольку имя файла crontaЬ и так
предоставляет эту информацию.
В общем случае, файл /etc/crontaЬ - это файл для системных администраторов,
который можно сохранить вручную, тогда как /etc/cron.d - это своего рода храни
лище, в которое пакеты программного обеспечения могут устанавливать любые записи
конфигурации демона cron, которые им могут понадобиться. Файлы в каталоге /etc/
cron. d по умолчанию называются именами пакетов, которые их установили, но в демо
не cron это соглашение не применяется.
Системные таймеры
В соответствии с задачей дублировать функции всех других подсистем Linux коман
даsystemd включает в себя концепцию таймеров, которые активируют данную службу
systemd по предопределенному расписанию. Таймеры мощнее, чем записи crontaЬ, но
их сложнее настраивать и ими труднее управлять. Некоторые дистрибутивы Linux (на
пример, CoreOS) полностью отказались от демона cron в пользу таймеров systemd, но
наши иллюстративные системы продолжают использовать демон cron и запускать его
по умолчанию.
стему, потому что программные пакеты добавляют свои задания в произвольную систе
му по своему выбору. Вам всегда нужно проверять обе системы, когда вы пытаетесь вы
яснить, как выполняется конкретное задание.
В отличие от записей crontaЬ, таймеры systemd могут быть описаны как в абсо
лютных календарных терминах ("среда в 10:00 утра"), так и в терминах, относящихся
к другим событиям ("через 30 секунд после загрузки системы"). Параметры объединя
ются, чтобы позволить создавать сложные выражения, которые не имеют ограничений,
характерных для демона cron. Параметры выражения времени описаны в табл. 4.6.
Таблица 4.6. Типы таймеров systemd
Тип ВреМ11
OnUni tActi veSec Относительно времени, в течение которого указанное устройство было активным
OnUni tinacti vesec Относительно времени, в течение которого указанное устройство неактивно
OnCalendar Определенный день и время
Как показывают их имена, значения для этих параметров таймера указаны в се
кундах. Например, OnActiveSec=ЗO означает 30 секунд после включения таймера.
Фактически это значение может быть любым действительным выражением времени
systemd, как более подробно описано ниже.
[Service]
Type=simple
ExecStart=/usr/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle
Целевую службу можно запустить напрямую (т.е. независимо от таймера) с помо
щью команды systemctl start systemd-tmpfiles-clean, как и любую другую
службу. Этот факт значительно облегчает отладку запланированных задач, которые мо
гут быть источником значительных административных сложностей при использовании
демона cron.
Для того чтобы создать собственный таймер, создайте файлы . timer и . service
в каталоге /etc/systemd/system. Если хотите, чтобы таймер запускался при загру:~ке,
добавьте следующий текст:
[ Install]
WantedBy = multi-user.target
152 Часть 1. Основы администрирования
в конце файла блока таймера. Не забудьте включить таймер во время загрузки с помощью
команды systemctl enaЬle. (Вы также можете сразу запустить таймер с помощью ко
манды systemctl start.)
Параметр таймера AccuracySec задерживает его активацию случайным количеством
времени в пределах указанного временного окна. Эта функция удобна, когда таймер ра
ботает на большой группе сетевых машин, и вы хотите, чтобы все таймеры не срабаты
вали в один и тот же момент. (Напомним, что с помощью демона cron для достижения
этого эффекта необходимо использовать сценарий случайной задержки.)
По умолчанию параметр AccuracySec равен 60 сек. Если вы хотите, чтобы ваш таймер
выполнялся в точно запланированное время, используйте настройку AccuracySec = lns.
(Точность, равная наносекунде, вероятно, будет достаточной. Впрочем, обратите внимание
на то, что вы на самом деле не получите точность наносекунды.)
Временные таймеры
С помощью команды systemd-run можно запланировать выполнение команды
в соответствии с любым из стандартных типов таймера systemd, но не создавая файлы
таймера и службы, предназначенные для конкретной задачи. Например, можно извле
кать файлы из репозитория Git каждые десять минут:
Чтобы отменить и удалить временный таймер, просто остановите его, выполнив ко
манду stop systemct:
$ sudo systemctl stop run-8823.timer
Команда systemd-run создает таймер и модульные файлы в подкаталогах /run/
systemd/ system. Однако временные таймеры после перезагрузки не сохраняются.
Чтобы сделать их постоянными, нужно найти их в каталоге /run, настроить их по мере
необходимости и инсталлировать в каталоге /etc/systemd/system. Обязательно оста
новите временный таймер перед запуском или включением постоянной версии.
Отправка почты
Следующая запись crontab реализует простую электронную почту. Вы можете ис
пользовать такую запись, чтобы автоматически отправлять результаты ежедневного от
чета или результаты выполнения команды. (Строки были обрезаны, чтобы поместиться
на странице. На самом деле это одна длинная строка.)
• Процессы
• Аудиоустройства
Если речь идет о системах UNIX или Linux, ответ будет таков: все перечисленное
выше. Ну и, конечно же, в файловую систему входят собственно файлы 1•
1 Точнее говоря, эти элементы представлены внутри файловой системы. В большинстве случаев
Термины имя файла и путь в той или иной степени являются взаимозаменяемыми
(по крайней мере так они трактуются в данной книге). Соответственно, имена файлов
и пути бывают абсолютными и относительными.
Файловое дерево может иметь произвольную глубину, однако каждый компонент
имени файла должен состоять не более чем из 255 символов. Существует также огра
ничение на длину пути, который вы можете передавать ядру в качестве аргумента си
стемного вызова (4095 байт в Linux и 1024 байт в BSD). Для того чтобы получить доступ
к файлу, полное имя которого превышает эти ограничения, необходимо с помощью ко
манды cd перейти в промежуточный каталог, а затем воспользоваться относительным
путем к файлу.
1 Мы говорим "в большинстве случаев", поскольку в файловой системе ZFS принят несколько
другой подход к монтированию и демонтированию, не говоря уже о других аспектах
администрирования файловых систем. Подробнее см. раздел 20.12.
Глава 5. Файловая система 159
стоит применять ее в системах, не использующих NFS. Кроме того, она может не при
меняться к определенным типам файловых систем (например, к таким, как системы XFS
или ext4, которые ведут системные журналы).
Если файловая система, которую вы пытаетесь демонтировать, занята, вместо ис
пользования команды wnount -f выполните команду fuser, чтобы узнать, какие про
цессы работают с файловой системой. Команда fuser -с точка_ монтирования выво
дит идентификаторы всех процессов, обращающихся к файлам или каталогам указанной
файловой системы, а также ряд буквенных кодов, которые отображают природу этой
активности. Например,
freebsd$ fuser -с /usr/home
/usr/home: 15897с 87787с 67124х 11201х 11199х 11198х 972х
Буквенные коды в столбце ACCESS такие же, как u результате выполнения команды
fuser -с.
Более удачной альтернативой команде fuser является утилита lsof. Утилита
lsof - более сложная программа, чем fuser, и, соответственно, результаты ее работы
более содержательны. Она по умолчанию инсталлируется во всех наших иллюстратив
ных системах Linux, а в системе FreeBSD доступна в виде пакета.
m Побудительные причины для разбиения дисков и его основные правила см. в раз
деле 20.б.
Глава 5. Файловая система 161
Чаще всего разбиение диска используют для того, чтобы одна часть файлового дерева
не занимала все доступное пространство и не вызывала сбой системы. Соответственно,
чаще всего разбиению подвергаются каталог /var (содержащий файлы журнала, разме
ры которых со временем растут и могут вызвать проблемы), /tmp и рабочие каталоги
пользователей. Специальные файловые системы могут хранить большие объемы инфор
мации, например библиотеки исходных кодов и базы данных.
Наиболее важные стандартные каталоги перечислены в табл. 5.1.
Каталог Содержимое
Окончание табл. 5. 1
Катаnог Содержимое
/var Системные данные и конфигурационные файлы
/var/adm Разное: журнальные файлы, записи об инсталляции системы,
административные компоненты
•в прошлом отличительная особенность команд в каталоге / sЬin обычно состояла в том, что они связаны со ста
П1ческими версиями системных библиотек и, следовательно, не имеют многочисленных зависимостей от других
частей системы. В настоящее время все бинарные модули связаны динамически и поэтому между каталогами
/Ьin и /sЬin реальной разницы нет.
Несмотря на свой статус "стандарта", это скорее отражение реальной практики, чем
регламентирующий документ. К тому же в последнее время он не часто обновляется.
поэтому не описывает точное расположение файловой системы, обнаруженное в совре
менных дистрибутивах
• обычные файлы;
• каталоги;
• локальные сокеты;
Определить тип существующего файла можно с помощью команды file. Эта коман
да не только определяет стандартные типы файлов, но и распознает их форматы.
$ file /usr/include
/usr/include: directory
'Cм.wiki.linuxfoundation.org/en/FHS.
Глава 5. Файловая система 163
$ file /Ьin/sh
/bin/sh: ELF 64-bit LSB executaЫe, х86-64, version 1 (FreeBSD),
dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 11.0
(1100122), FreeBSD-style, stripped
Многословная информация о файле /Ьin/sh означает всего лишь "это исполняемая
команда."
Другая возможность исследования файлов предоставляется командой ls - ld. Флаг
-1 подразумевает вывод подробной информации, а флаг -d заставляет команду ls вы
водить информацию о каталоге, а не его содержимое.
Первый символ в строке вывода обозначает тип объекта. В следующем примере вы
дается информация о каталоге /usr/include.
$ ls -ld /usr/include
drwxr-xr-x 27 root root 4096 Jul 15 20:57 /usr/include
Возможные коды для представления различных типов файлов перечислены в табл. 5.2.
Таблица 5.2. Кодирование типов файлов в листинге команды ls
Как видно из табл. 5.2, команда rm является универсальным средством удаления фай
лов. Но как удалить файл, имя которого, скажем, -f? В большинстве файловых систем
это абсолютно корректное имя, но команда rm -f не сделает то, что нужно, поскольку
выражение -f будет воспринято как флаг команды. Выйти из положения можно, либо
указав более полное имя (например, . /-f), либо воспользовавшись специальным аргу
ментом--, который сообщит команде rm о том, что остальная часть командной строки
представляет собой имя файла, а не список аргументов: rm -- -f.
Похожая проблема возникает с файлами, в именах которых присутствуют управля
ющие символы, поскольку такие имена трудно или вообще невозможно воспроизвести
с помощью клавиатуры. В подобной ситуации нужно воспользоваться метасимволами
интерпретатора команд, чтобы задавать не имя целиком, а лишь его шаблон. Указывайте
также опцию -i, чтобы команда rm требовала подтвердить удаление каждого файла. Это
позволит не удалить нужные файлы, соответствующие шаблону. Вот как, к примеру,
можно удалить файл с оригинальным именем foo<Ctrl+D>bar.
$ ls
foo?bar foose kde-root
$ rm -i foo*
rm: remove 'foo\004bar'? у
rm: remove 'foose'? n
164 часть 1. Основы администрирования
Команда ls отображает вместо управляющего символа знак вопроса, что иногда сби
вает с толку. Если забыть, что символ "?" тоже является подстановочным знаком интер
претатора, и попытаться выполнить команду rm foo?bar, можно удалить более одного
файла (правда, не в данном примере). Ценность флага -i очень велика!
Команда ls -Ь выводит управляющие символы в виде восьмеричных чисел. Это
свойство может оказаться полезным, если необходимо специально идентифициро
вать эти символы. Например, <Ctrl+A> - это 1 (\001 в восьмеричной системе счис
ления), <Ctrl+B> - это 2и т.д. в алфавитном порядке. Страница man aseii и раздел
Википедии о системе ASCII содержат прекрасную таблицу управляющих символов и их
восьмеричных эквивалентов.
Обычные файлы
Обычный файл - это просто последовательность байтов. Файловые системы не на
лагают ограничения на его структуру. Текстовые документы, файлы данных, программ
ные файлы, библиотеки функций и многое другое - все это хранится в обычных фай
лах. К их содержимому возможен как последовательный, так и прямой доступ.
Каталоги
Каталог хранит именованные ссылки на другие файлы. Он создается командой
mkdir и удаляется (при условии, что он пуст) командой rmdir. Непустые каталоги мож
но удалить командой rm -r.
Специальные ссылки " . " и " .. " обозначают сам каталог и его родительский каталог
соответственно. Такие ссылки нельзя удалить. Поскольку корневой каталог находится
на вершине иерархии, ссылка "/ .. " в нем эквивалентна ссылке "/. " (и обе эти ссылки
эквивалентны "/").
Жесткая ссылка
Имя файла в действительности хранится в родительском каталоге, а не в самом файле.
На файл можно ссылаться из нескольких каталогов одновременно и даже из нескольких
элементов одного и того же каталога, причем у всех ссьuюк могут быть разные имена. Это
создает иллюзию того, что файл одновременно присутствует в разных каталогах.
Эти дополнительные "жесткие" (фиксированные) ссьmки (которые следует отличать
от символических, или "мягких") можно считать синонимами для исходных файлов, и с
точки зрения файловой системы все ссъmки на файл эквивалентны. Файловая система
подсчитывает количество ссьmок на каждый файл и при удалении файла не освобождает
блоки данных до тех пор, пока не будет удалена последняя ссылка на него. Ссьmки не
могут указывать на файл, находящийся в другой файловой системе.
Жесткие ссылки создаются командой ln и удаляются командой rm. Синтаксис ко
манды ln легко запомнить, поскольку она является "зеркальным отражением" команды
ер. Команда ер oldfile newfile создает копию файла oldfile с именем newfile,
а команда ln oldfile newfile преобразует имя newfile в дополнительную ссылку
на файл oldfile.
Глава 5. Файловая система 165
Важно понимать, что жесткие ссылки не являются особым типом файлов, просто
файловая система позволяет создавать несколько ссьmок на один файл. Не только со
держимое, но и атрибуты файла, в частности права доступа и идентификатор владельца,
являются общими для всех ссылок.
Локальные сокеты
Установленные посредством сокетов соединения позволяют процессам взаимодей
ствовать, не подвергаясь влиянию других процессов. В системе UN IX поддерживается не
сколько видов сокетов, использование которых, как правило, предполагает наличие сети.
Именованные каналы
Подобно локальным сокетам, именованные каналы обеспечивают взаимодействие
двух процессов, выполняемых на одном компьютере. Такие каналы еще называют фай
лами FIFO (First In, First Out - "первым поступил, первым обслужен"). Они создаются
командой mknod и удаляются командой rm.
Символические ссылки
Символическая, или "мягкая", ссылка позволяет вместо имени файла указывать его
псевдоним. Столкнувшись при поиске файла с символической ссылкой, ядро извлекает
хранящееся в ней имя. Разница между жесткими и символическими ссылками состоит
в том, что жесткая ссылка является прямой, т.е. указывает непосредственно на индекс
ный дескриптор файла, тогда как символическая ссылка указывает на файл по имени.
Файл, адресуемый символической ссылкой, и сама ссылка представляют собой разные
объекты файловой системы.
Символические ссылки создаются командой ln -s и удаляются командой rm. Они
могут содержать произвольное имя, т.е. разрешается указывать на файлы, хранящиеся
в других файловых системах, и даже на несуществующие файлы. Иногда несколько сим
волических ссылок образуют петлю.
Символическая ссылка может хранить как полное, так и сокращенное имя файла.
Например, команда
$ sudo ln -s archived/secure /var/data/secure
посредством относительного пути связывает имя /var/data/secure с именем /var/
data/archived/secure. Как видно из следующего результата выполнения команды
ls, она создает символическую ссьтку /var/data/secure с целью archived/secure.
$ ls -1 /var/data/secure
lrwxrwxrwx 1 root root 18 2009-07-05 12:54 /var/data/secure -> archived/secure
Глава 5. Файловая система 167
Биты режима
Девять битов режима определяют, кто и какие операции может выполнять над фай
лом. Традиционная система UNIX не позволяет устанавливать режим на уровне от
дельного пользователя (хотя теперь списки управления доступом поддерживаются во
всех основных системах). Подробнее это описано в разделе 5.6. Вместо этого три раз
личных набора битов определяют права доступа, предоставляемые владельцу файла,
членам группы, которой принадлежит файл, и прочим пользователям (именно в таком
порядке) 5 • Каждый набор состоит из трех битов: бита чтения, записи и выполнения (в
том же порядке).
Код доступа удобно записывать в виде восьмеричного числа, так как каждая цифра
в нем представляется тремя битами. Три старших бита (в коде доступа им соответствуют
восьмеричные значения 400, 200 и 100) служат для управления доступом к файлу его
владельца. Вторые три бита (40, 20 и 10) задают доступ для членов группы. Последние
три бита (4, 2 и 1) определяют доступ к файлу остальных пользователей. Старший бит
каждой триады - это бит чтения, средний - бит записи, младший - бит выполнения.
Если пользователь попадает только в одну из двух-трех категорий прав доступа, ему
предоставляются только самые ограниченные права. Например, права владельца файла
Для обычного файла бит чтения означает возможность открывать и читать файл.
Бит записи позволяет изменять содержимое файла, в том числе полностью стирать его.
Правом удаления и переименования файла упрамяют биты, заданные для его родитель
ского каталога, поскольку именно там хранится имя файла.
Установкой бита выполнения задается разрешение запускать файл. Существует два
типа исполняемых файлов: бинарные файлы, которые выполняются непосредственно
центральным процессором, и сценарии, обрабатываемые интерпретатором команд или
какой-нибудь другой аналогичной программой. В соответствии с принятыми соглаше
ниями, сценарии начинаются со строки примерно такого вида.
#!/usr/Ьin/perl
Дополнительный бит
Бит, которому в коде доступа соответствует восьмеричное значение 1000, называется
дополнительным (sticky Ьit). В первых UNIХ-системах дополнительный бит запрещал вы
грузку программ из памяти. Сегодня он утратил свое значение и попросту игнорируется.
Если дополнительный бит установлен для каталога, то файловая система позволит
удалять и переименовывать его файлы только владельцу каталога, владельцу файла или
суперпользователю. Иметь одно лишь право записи в каталог недостаточно. Такая мера
позволяет несколько лучше защитить каталоги вроде /t.zпp.
него обращения и последней модификации, размер и тип файла. Всю эту информацию
можно получить с помощью команды ls -1 (или команды ls -ld в случае каталога; без
флага -d команда ls перечисляет содержимое каталога).
Для каждого файла хранится также время последнего изменения атрибутов.
Традиционное название этого поля ("ctime" от "change time" - время изменения) мно
гих вводит в заблуЖДение, так как они полагают, что это время создания файла. На са
мом деле здесь зафиксировано время последнего изменения одного из атрибутов файла
(владелец, код доступа и так далее), но не его содержимого.
Рассмотрим пример.
$ ls -1 /usr/bin/gzip
-rwxr-xr-x 4 root wheel 37432 Nov 11 2016 /usr/bin/gzip
В первом поле задается тип файла и режим доступа к нему. Поскольку первый сим
вол - дефис, значит, перед нами обычный файл (см. табл. 5.2).
Следующие девять символов - это три набора битов режима. Порядок наборов та
ков: владелец, группа, другие пользователи. В листинге команды ls биты режима пред
ставляются буквами r, w их (чтение, запись и выполнение). В показанном примере
владелец имеет все права доступа к файлу, а остальные пользователи - только право
на чтение и выполнение.
Следующие два поля определяют аладельца и группу файла. В данном примере файл
принадлежит пользователю root и одноименной группе. В действительности ядро хра
нит эти данные не в строковом виде, а в виде идентификаторов. Если символьные вер
сии идентификаторов определить невозможно, в этих полях будут отображаться числа.
Так происходит, когда запись пользователя или группы была удалена из файла, соот
ветственно, /etc/paввwd или /etc/group. Не исключено также, что возникла ошибка
в базе данных LDAP (описана в главе 17), если она используется.
В следующем поле отображается размер файла в байтах. Рассматриваемый файл
имеет размер 37432 байт. Далее указана дата последней модификации файла: 11 ноя
бря 2016 г. В последнем поле листинга приведено имя файла: /usr/Ьin/gzip.
Для файла устройства команда ls вьшает несколько иную информацию.
$ ls -1 /dev/ttyO
crw--w----. 1 root tty 4, О Aug 3 15:12 /dev/ttyO
Большинство полей осталось теми же, но вместо размера в байтах показаны старший
и младший номера устройства. Имя /dev/ttyO относится в данной системе (Red Hat)
к первой виртуальной консоли, упрааляемой драйвером устройства 4 (драйвер термина
ла). Точка в конце названия режима означает отсутствие списка управления доступом
(ACL, см. раздел 5.6).
При поиске жестких ссылок может пригодиться команда ls -i, отображающая
для каждого файла номер его индексного дескриптора. Не вдаваясь в детали реализации
файловой системы, скажем, что этот номер предстааляет собой индекс таблицы, в ко
торой перечислены все файлы системы. Именно на индексные дескрипторы ссылают
ся файловые записи каталогов. Жесткие ссылки, указывающие на один и тот же файл,
будут иметь одинаковый номер. Для того чтобы составить представление о "паутине"
ссылок, воспользуйтесь командой ls -li для определения числа ссылок и номера ин
дексного дескриптора какого-нибудь файла, а затем найдите его "двойников" с помо
щью команды find 7•
Другими важными опциями команды ls яаляются -а, отображающая все записи
в каталоге (даже те файлы, имена которых начинаются с точки), -t, выполняющая сор
тировку файлов по времени изменения (или -tr, осущесталяющая сортировку в обрат
ном хронологическом порядке), -F, отображающая имена файлов с вьшелением каталогов
и исполняемых файлов, -R, выводящая рекурсивный список, и -h, которая отображает
размеры файлов в удобной для человеческого восприятия форме (например, 8К или SЗМ).
В большинстве версий lв теперь по умолчанию используются файлы цветового ко
дирования, если ваша программа терминала поддерживает эту возможность (в большин
стве случаев эта возможность существует). Команда ls указывает цвета в соответствии
с ограниченной и абстрактной палитрой ("красный", "синий" и т. д.), и конечная про
грамма должна отображать эти запросы в определенные цвета. Вам может потребоваться
настроить оба варианта lв (переменные окружения LSCOLORS или LS _ COLORS). Кроме
того, вы можете просто удалить конфигурацию по умолчанию для раскраски (обычно
/etc/profile.d/colorlв*), чтобы полностью исключить цвета.
Например, команда chmod 711 myprog предостамяет мадельцу все права, а осталь
ным пользователям - только право выполнения 8 •
При использовании мнемонического синтаксиса вы объединяете множество исполни
телей (u - пользователь, q - группа или о - другой) с оператором(+ - добавить, - -
удалить и =- присвоить) и набором прав доступа. Более подробное описание мнемони
ческого синтаксиса можно найти на тап-странице команды chmod, но синтаксис всегда
лучше изучать на примерах. В табл. 5.4 приведено несколько примеров мнемонических
спецификаций.
Спецификация Назначение
'Если файл myprog является сценарием интерпретатора команд, должно быть задано также
право чтения для остальных пользователей. Файлы сценариев, запускаемые интерпретатором,
открываются и читаются в текстовом виде, а бинарные файлы выполняются непосредственно
ядром, поэтому для них не нужно задавать право чтения.
172 Часть 1. Основы администрирования
Как и команда chmod, команды chown и chgrp имеют флаг -R, который задает смену
владельца или группы не только самого каталога, но и всех его подкаталогов и файлов.
Например, последовательность команд
Дело в том, что указанному шаблону соответствует также файл ...matt/ .. , поэтому бу
дет изменен владелец родительского каталога и, возможно, домашних каталогов других
пользователей.
Команда chown может изменить владельца файла и группу одновременно с помощью
такого синтаксиса.
Например:
На самом деле можно не указывать пользователя или группу, что делает команду
chqrp излишней. Если включить двоеточие, но не назвать конкретную группу, то версия
команды chown в системе Linux использует группу по умолчанию для пользователя.
Некоторые системы принимают обозначение пользователь. группа как эквива
лентное обозначению пользователь: группа. Это всего лишь историческое наследие.
Например, команда umask 027 предоставляет все права владельцу файла, запрещает
читать файл членам группы и не дает никаких прав другим пользователям. Стандартное
значение umask равно, как правило, 022, т.е. право модификации файла предоставляет
ся только его владельцу.
поэтому не все флаги могут использоваться во всех файловых системах. Кроме того, не
которые флаги являются экспериментальными, нереализованными или предназначен
ными только для чтения.
Как и следовало ожидать от такого случайного набора функций, значение этих фла
гов для администраторов меняется. Главное, чтобы помнить, что если какой-то конкрет
ный файл ведет себя странно, проверьте его с помощью команды lsattr, чтобы узнать,
включен ли один или несколько флагов.
Отказ от учета времени последнего доступа (флаг А) может повысить производитель
ность в некоторых ситуациях. Однако его значение зависит от реализации и доступа
к файловой системе; вам придется провести самостоятельное тестирование производи
тельности. Кроме того, современные ядра теперь по умолчанию устанавливают файло
вые системы с параметром relatime, что сводит к минимуму обновления в переменной
s t _а t ime и делает флаг А в значительной степени устаревшим.
Флаги, запрещающие изменение и разрешающие только добавление (i и а), бьши
в значительной степени задуманы как способы сделать систему более устойчивой к ха
керским подделкам или враждебному коду. К сожалению, они могут запутать программ
ное обеспечение и защищать только от хакеров, которые плохо знают, как использовать
команду chattr -ia. Реальный опыт показал, что эти флаги чаще используются хаке
рами, чем для защиты от них.
сто подумайте о стыде, который испытает ваша мать, когда узнает, что вы натворили.
Устраните проблему в системе управления конфигурацией - слушайтесь свою маму.
Флаг, отменяющий резервное копирование (d), потенциально может представлять
интерес для системных администраторов, но поскольку он является рекомендацией,
убедитесь, что ваша резервная система его поддерживает.
Флаги, которые влияют на ведение журнала и поддержку синхронности (D, j и S),
существуют в основном для поддержки баз данных. Они не являются общедоступными
для системных администраторов. Все эти параметры могут значительно снизить произ
водительность файловой системы. Кроме того, известно, что вмешательство в синхро
низацию записи затрудняет работу программы fsck в файловых системах ext"'.
торое позволяет определять права доступа для передачи их вновь создаваемым элемен
Предупреждение
Списки ACL получили широкое распространение и поэтому будут занимать все наше
внимание в остальной части этой главы. Однако ни один из перечисленных ниже фак
тов не следует толковать как поощрение их использовать. Списки ACL имеют собствен
ную нишу, но она находится вне основного направления администрирования UNIX
и Linux.
Списки ACL существуют прежде всего для обеспечения совместимости с системами
Windows и удовлетворения потребностей малого сегмента предприятий, которые фак
тически требуют гибкости на уровне ACL. Они не являются блестящим следующим по
колением средств управления доступом и не предназначены для вытеснения традицион
ной модели.
Сложность ACL создает несколько потенциальных проблем. Списки ACL утомитель
ны в использовании, но также могут вызывать неожиданные взаимодействия с системами
176 часть 1. Основы администрирования
Типы ACL
В качестве доминирующих стандартов для систем UN IX и Linux появились два вида
списков ACL: POSIX ACL и NFSv4 ACL.
Версия POSIX восходит к спецификации, созданной в середине 1990-х годов. К со
жалению, ни один фактический стандарт не был принят, и первоначальные реализа
ции сильно различались. В наши дни мы находимся в лучшей ситуации. Все системы
свелись в основном к синхронизации ACL POSIX и общему набору команд, getfacl
и setfacl, для управления ими.
В первом приближении модель ACL POSIX просто расширяет традиционную систе
му разрешений UNIX rwx для обеспечения разрешений для нескольких групп и пользо
вателей.
После появления списков POSIX ACL для систем UNIX и Linux все более распро
страненным явлением стал обмен файловыми системами с операционной системой
Windows, которая имеет свой собственный набор соглашений ACL. Здесь ситуация ус
ложняется, поскольку Windows порождает множество различий, которые не встречаются
ни в традиционной модели UNIX, ни в эквиваленте ACL POSIX. Списки ACL Windows
также семантически более сложны; например, они допускают отрицательные разреше
ния (записи отрицания) и имеют сложную схему наследования.
Архитекторы четвертой версии NFS - общего протокола обмена файлами - хотели
внедрить списки ACL как сущности первого класса. Из-за разделения UNIX/Windows
и несоответствий между реализациями ACL UNIX было ясно, что системы на концах
NFSv4-соединения часто могут иметь разные типы. Каждая система может понимать
ACL, NFSv4, POSIX ACL, Windows ACL или вообще не ACL.
Ш Дополнительную информацию о протоколе NFSC см. в главе 21.
Стандарт NFSv4 должен быть совместим со всеми этими различными мирами, не
вызывая слишком много сюрпризов или проблем безопасности. Учитывая это ограниче
ние, неудивительно, что списки ACL NFSv4 по сути являются объединением всех суще
ствующих систем. Они являются строгим надмножеством списков ACL POSIX, поэтому
любой ACL POSIX может быть представлен как ACL N FSv4 без потери информации.
В то же время в ACL NFSv4 содержатся все биты разрешений, найденные в системах
Windows, и у них также есть большинство семантических функций Windows.
ACL могли бы быть реализованы ядром от имени всех файловых систем, отдельными
файловыми системами или, может быть, такими высокоуровневыми программами, как
серверы N FS и SMB.
На практике поддержка ACL зависит от операционной и файловой систем. Файловая
система, которая поддерживает списки ACL в одной операционной системе, может не
поддерживать их в другой или может предусматривать несколько другую реализацию,
поддерживаемую другими командами.
Демоны службы файлов отображают собственную схему ACL своего узла (или схемы)
в соответствии с соглашениями, соответствующими файловому протоколу: NFSv4 ACL
для NFS и ACL для Windows для SMB. Детали этого отображения зависят от реализации
файлового сервера. Как правило, правила сложны и настраиваются с помощью опций
конфигурации.
Поскольку реализации списков ACL зависят от конкретной файловой системы и опе
рационные системы поддерживают несколько реализаций файловых систем, во многих
системах предусматривается поддержка нескольких типов списков ACL. Даже отдельно
взятая файловая система может предложить несколько вариантов ACL, как в системе
ZFS. Если возможно использование нескольких систем ACL, команды по управлению
ими могут быть одинаковыми или различными - все зависит от конкретной системы.
Преимущество этой стандартизации заключается в том, что почти все файловые си
стемы Linux теперь включают поддержку ACL POSIX, включая XFS, Btrfs и семейство
ext*. ZFS, чья собственная система ACL поддерживает протокол NFSv4, была
Даже
перенесена в Linux с помощью POSIX ACL. Стандартные команды getfacl и setfacl
могут использоваться везде, независимо от типа базовой файловой системы. (Тем не ме
нее иногда следует проверять, что для монтирования файловой системы используется
правильная опция монтирования. Файловые системы обычно поддерживают параметр
acl, параметр noacl или оба, в зависимости от их значений по умолчанию.)
• Система
ACL
но (с
Файловые системы
же поддерживает
FreeBSD
родные команды
в стиле
2017 г.).
поддерживает как
getfacl
NFSv4.
и
Поддержка
setfacl
ACL POSIX,
ACL NSFv4
так и ACFS NFSv4.
были расширены, чтобы включить
появилась относительно недав-
файловая система ZFS, которая поддерживает только протокол NFSv4 в системе BSD
(и ее предшественнике- системе Solaris) и только POSIX в системе Liпux.
Для файловой системы UFS следует использовать один из вариантов монтирования
acJ.s или nfsv4acls, чтобы указать, чеrо именно вы хотите. Эти варианты являются
взаимоисключающими.
а Иногда маски не совсем понятны; пояснения к ним даны далее в этом разделе.
$ ls -1 example
-rw-r----- 1 garth garth О Jun 14 15:57 example
$ getfacl --omit-header example 9
user::rw-
group:: r--
other: :---
Эта принудительная целостность атрибутов позволяет более старым программам, ко
торые даже не подозревают о существовании списков ACL, достаточно успешно рабо
тать в среде, использующей эти списки. Однако существует и определенная проблема.
Несмотря на то что АСL-запись group: : в приведенном примере вроде и отслеживает
средний набор традиционных битов режима, это не всегда так.
Для того чтобы понять, в чем здесь дело, предположите, что унаследованная про
грамма очищает биты разрешения записи во всех трех наборах прав традиционного ре
жима (например, chmod ugo-w файл). Понятно, что целью выполнения этой команды
является запрет выполнения записи в файле кем-либо. Но что произойдет, если резуль
тирующий список ACL будет выглядеть следующим образом?
user: : r--
group:: r--
group:staff:rw-
other: :r--
С точки зрения унаследованной программы файл выглядит неизменяемым, хотя в дей
ствительности он доступен для записи любому члену группы staff. Подобная ситуация
нежелательна. Для снижения вероятности недоразумений приняты следующие правила.
Иначе говоря, маска определяет верхний предел прав доступа, которые система ACL
может присваивать отдельным группам и пользователям. Концептуально эта маска ана
логична команде umask, за исключением того, что маска ACL действует всегда и указы
вает предоставленные, а не отобранные права. Записи ACL для названых пользовате
лей, названых групп и группы, заданной по умолчанию, могут содержать права доступа,
отсутствующие в маске, но ядро будет просто их игнорировать.
9 Это пример из системы Linux. В системе FreeBSD для подавления вывода комментариев на
дисплей версия команды getfacl использует флаг -q, а не --omit-header.
180 Часть 1. основы администрирования
$ ls -1 example
-rw-r----- 1 garth garth О Jun 14 15:57 example
$ setfacl -m user::r,user:trent:rw,qroup:admin:rw example
$ ls -1 example
-r--rw----+ 1 garth garth О Jun 14 15:57 example
$ qetfacl --omit-header example
user::r--
user:trent:rw-
group:: r--
group:admin: rw-
mask::rw-
other: :---
Параметр -m для команды setfacl означает "изменить": он добавляет записи, ко
торых еще нет, и настраивает те, которые уже существуют. Обратите внимание: команда
setfacl генерирует маску, которая позволяет вступить в действие всем правам, предо
ставленным в списке ACL. Для определения маски вручную нужно включить ее в спи
сок записей ACL, переданный команде setfacl, либо использовать опцию -n, чтобы
помешать ее повторному генерированию командой setfacl.
Обратите внимание на то, что в результате выполнения второй команды ls -1 (по
сле команды setfacl) в конце режима файла выводится знак "+", означающий, что
с ним теперь связан реальный список ACL. Первая команда ls -1 не выводит знак"+",
поскольку на данный момент список ACL является "минимальным".
Следует иметь в виду, что применение традиционной команды chmod для манипули
рования правами доступа группы в файле, связанном с ACL, сказывается только на ма
ске. Продолжим рассмотрение предыдущего примера.
$ chmod 770 example
$ ls -1 example
-rwxrwx---+ 1 garth staff О Jun 14 15:57 example
$ qetfacl --olllit-header example
user:: rwx
user:trent:rw-
group:: r--
group: admin: rw-
mask::rwx
other::---
8 данном случае результат выполнения команды ls вводит в заблуждение. Несмотря
на обширные права, предоставленные группе, ни один из ее членов в действительно
сти не обладает правами выполнения файла на одном лишь основании принадлежности
к группе. Для того чтобы предоставить это право, придется отредактировать список ACL
вручную.
стеме FreeBSD. Без него команда setfacl в системе FreeBSD создает набор рутинных
масок, которая позже испортит изменения в групповом режиме. Однако в системе Linux
флаг -n можно установить, не создавая проблем. )
•
Windows.
В этом разделе рассмотрим характеристики списков
сис команд на примере системы
мой Linux
С точки зрения структуры списки NFSv4 ACL
FreeBSD.
(демоны которой отличаются от служб
NFSv4 ACL
Они не поддерживаются систе
NFS).
аналогичны спискам
Основное различие между ними состоит в спецификации категории, к которой
относится запись контроля прав доступа.
ACL
и синтак
в системе
В списках ACL обеих систем запись хранится в виде строки. Для списков Windows
ACL эта строка обычно содержит идентификатор защиты Windows (Windows security
identifier - SID), в то время как NFSv4-cтpoкa, как правило, имеет такой формат:
usеr:имя_пользователя или grоuр:имя_группы. Она также может иметь один из
специальных маркеров: owner@, group@ или everyone@. В действительности эти "спе
циальные" записи можно считать самыми популярными, поскольку они связаны с бита
ми режима доступа, установленными для каждого файла.
182 Часть 1. Основы администрирования
Такие системы, как Samba, которые разделяют файлы между системами UNJX
иWindows, должны обеспечивать определенный способ преобразования данных между
Windows и N FSv4.
Модель прав доступа систем Windows и NFSv4 отличается большей детализаци
ей по сравнению с традиционной UN JХ-моделью "чтение-запись-выполнение".
Рассмотрим ее основные отличительные черты.
В табл. 5.8 приведены различные разрешения (права доступа), которые могут назна
чаться в системе NFSv4, а также однобуквенные коды, используемые мя их представ
ления.
р append data
-
Добавление данных в файл или создание подкаталога в каталоге
D delete - child Удаление дочернего каталога в каталоге
d delete Удаление
буты в основном используются д;1я сохранения самих списков ACL. Однако модель прав
доступа в системе NFSv4 предусматривает обработку списков ACL отдельно от других
расширенных атрибутов.
В системе FreeBSD владелец файла всегда имеет разрешения read_acl, write ac:l,
read_attributes и write attributes, даже если в списках управления доступом за
даны другие значения.
Система NFSv4 отличается от POSIX по ряду признаков. Прежде всего, тем, что
N FSv4 не имеет стандартного объекта, используемого по умолчанию д;1я управления
наследованием списков ACL. Вместо этого любая отдельная запись управления досту
пом (АСЕ) может быть помечена как передающаяся по наследству (см. ниже раздел
"Наследование списков ACL в протоколе NFSv4"). Кроме того, система NFSv4 не ис
пользует маску д;1я согласования прав доступа, заданных в режиме файла с помощью
списка ACL. Режим, необходимый для согласования с параметрами, задаваемыми
д;1я owner@, group@ и everyone@, а также файловые системы, которые реализуют спи
ски N FSv4 ACLs, должны сохранять эту совместимость при обновлении режима либо
спискаАСL.
Windows, и, во-вторых, потому, что это единственный вариант, который имеет смысл.
$ qetfacl -q example
owner@:rwxp--aARWcCos:------:allow
group@:r-x---a-R-c--s:------:allow
everyone@:r-x---a-R-c--s:------:allow
Флаг -v запрашивает подробные имена разрешений.
freebsd$ qetfacl -qv example .
owner@:read_data/write_data/execute/append_data/read_attributes/
write_attributes/read_xattr/write_xattr/read_acl/write_acl/
write_owner/synchronize::allow
group@:read_data/execute/read_attributes/read_xattr/read_acl/
synchronize::allow
everyone@:read_data/execute/read_attributes/read_xattr/read_acl/
synchronize::allow
m Мы отформатировали этот вывод и расставили косые черты, чтобы его было легче
читать.
Поле объект может занимать одно из таких ключевых слов, как owner@, group@,
everyone@, или элемент в такой форме: user: имя_полъзователя либо group: имя_
группы. Оба поля права_доступа и флаги_ наследования представляют собой списки
опций, разделенные косыми чертами в развернутом виде или в стиле битовых масок ко
манды ls в лаконичном виде. Поле тип в записи АСЕ задает один из двух возможных
вариантов: разрешение или отказ.
ACL. Например:
$ getfacl -q file> /tmp/file.acl
$ vi /tmp/file.acl # Внесите необходимые изменения
$ setfacl -Ь -м /tmp/file.acl file
Параметр -Ь команды setfacl удаляет существующий список ACL перед добавле
нием записей управления доступом, перечисленных в файле file. acl. Это позволяет
удалять записи, просто стирая их в текстовом файле.
глава 6
инсталляция и управление
программным обеспечением
Ubuntu help.uЬuntu.com/community/Installation
FreeBSD freebsd.org/doc/handЬook/Ьsdinstall.html
Настройка РХЕ
Наиболее широко используемой системой загрузки РХЕ является PXELINUX, авто
ром которой является Питер Авлин (Н. Peter Anvin). Она является частью набора загру
зочных устройств SYSLINUX для каждого случая. Ее можно найти на сайте syslinux.
org. Другим вариантом является система iPXE (ipxe. org), поддерживающая дополни
тельные режимы начальной загрузки, включая поддержку беспроводных сетей.
190 Часть 1. Основы администрирования
PXELINUX использует для своих загрузок РХЕ API и поэтому не зависит от аппарат
ной части в течение всего процесса загрузки. Более того, она может загружать не толь
ко Linux, но и другие операционные системы. С помощью системыPXELINUX можно
инсталлировать системы FreeBSD и другие операционные системы, включая
Windows.
На стороне сервера лучше всего использовать DНСР-сервер организации ISC (lntemet
Systems Consortium). В качестве альтернативы можно использовать Dnsmasq ( goo. g 1 /
FNk7a), упрощенный сервер, поддерживающий DNS, DHCP и сетевую загрузку.
%packages
@ Networked Workstation
@ Х Window System
@ GNOME
mylocalpackage
В третьем разделе конфигурационного файла указывается произвольный набор ко
манд интерпретатора, которые подлежат выполнению утилитой Кickstart. Существует
два возможных набора команд. Один из них начинается с директивы %pre и содержит
команды, выполняемые перед началом инсталляции. Команды, выполняемые по завер
шении инсталляции, помечаются директивой %post. В обоих случаях возможности си
стемы по распознаванию имен компьютеров ограничены, так что лучше пользоваться
IР-адресами. Кроме того, команды второго набора выполняются в среде ohrooted, по
этому они не имеют доступа к инсталляционному носителю.
192 Часть 1. Основы администрирования
Файл ks. cfg довольно легко создавать программно. Один из вариантов - исполь
зовать библиотеку Pykickstart Python, которая может читать и писать конфигурации ути
литы Кickstart.
Например, предположим, что вы хотели установить разные наборы пакетов на серве
рах и клиентах, и у вас также есть два отдельных физических местоположения, которые
требуют немного разных настроек. Вы можете использовать библиотеку pykickstart
для написания сценария, который преобразует главный набор параметров в набор из че
тырех отдельных файлов конфигурации, один для серверов и один для клиентов в каж
дом офисе.
Изменение дополнения к пакетам может быть просто вопросом изменения основно
го файла конфигурации, а не изменения всех возможных файлов конфигурации. Могут
быть даже случаи, когда вам нужно создавать индивидуальные файлы конфигурации
для определенных хостов. В этой ситуации вы, конечно, хотите, чтобы окончательные
файлы ks . cfg автоматически генерировались.
рrеsееd/url=httр://хост/путь/к/файл_предварительной_инсталляции
1 До появnения системы RHEL 7 этот параметр назывался ks. В настоящее время используются оба
варианта названия, но в будущем от имени ks будут постепенно отказываться.
194 Часть 1. Основы администрирования
Ряд опций в этом листинге просто запрещают диалоги, которые обычно требуют вза
имодействия с пользователем. Например, опция console-setup/ask_detect запреща
ет выбор раскладки клавиатуры.
Такая конфигурация старается идентифицировать сетевой интерфейс, который
в действительности подключен к сети (choose interface select auto) и получает
сетевую информацию через протокол динамического конфигурирования хоста DHCP.
Предполагается, что значения системного имени хоста и домена предоставляются про
токолом DHCP и не переопределяются.
При выполнении "предварительной" инсталляции нельзя использовать существу
ющие разделы диска: в этом случае либо задействуется существующее свободное про
странство, либо выполняется перераспределение всего диска. Наличие строк partman *
свидетельствует о том, что для сегментирования дисковой памяти используется пакет
par:tman-auto. Если система имеет несколько дисков, то для инсталляции вы должны
указать нужный диск. В противном случае (т.е. для единственного диска) используется
значение /dev/sda.
Предлагается несколько "рецептов" сегментирования дисковой памяти:
Фрагмент (snippet) - это всего лишь набор команд оболочки. Например, следующий
фрагмент добавляет открытый ключ к авторизованным ключам SSH для пользователя
root:
rnkdir -р --rnode=700 /root/.ssh
cat >> /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaClyc2EAAAADAQABAAABAQDKErzVdarNkL4bzAZotSzU/
... Rooy2R6TCzc1Bt/oqUK1RlkuV
EOF
chrnod 600 /root/.ssh/authorized_keys
Вы сохраняете фрагмент кода в каталоге фрагментов СоЬЫеr, а затем ссылаетесь
на него в шаблоне быстрой инсталляции. Например, если вы сохранили фрагмент. по
казанный выше, как root_yuЬkey_snippet. то можете ссылаться на него в шаблоне
следующим образом.
%post
SNIPPET::root_pubkey_snippet
$kickstart_done
Используйте шаблоны СоЬЫеr для настройки разделов диска. условной установки
пакетов, настройки часовых поясов, добавления пользовательских репозиториев паке
тов и выполнения любых других требований к локализации.
СоЬЫеr также может создавать новые виртуальные машины под различными гипер
визорами. Он может интегрироваться с системой управления конфигурацией для предо
ставления машин после их загрузки.
Версия системы FreeBSD в архиве tar понимает формат ISO в дополнение ко мно
гим другим форматам, поэтому вы можете просто извлечь файлы образа компакт-диска
в пустой каталог. Создайте подкаталог перед извлечением, потому что файл ISO распа
ковывается в текущий каталог.
freebsd$ sudo mkdir FreeBSD
freebsd$ sudo tar xpCf FreeBSD FreeBSD-11.0.iso
После того как вы извлекли содержимое образа, вы можете настроить их, чтобы ото
бразить нужные параметры установки. Например, вы можете добавить собственные
DNS-резолверы, отредактировав файл FreeBSD/etc/resolv. conf, чтобы включить
в него свои собственные серверы имен.
Обычно программа bsdinstall требует от пользователей выбора таких параме
тров, как тип используемого терминала, сопоставление клавиатуры и нужный стиль
разбиения диска. Вы можете обойти интерактивные вопросы, поместив файл с именем
installerconfig в каталог etc образа системы.
Формат этого файла описан на странице руководства bsdinstall. Он имеет два раз-
дела.
архивов (. tar. gz или . tgz). Для разработчиков это удобно, но для пользователей и ад
министраторов создает сложности. Содержимое этих архивов нужно было компилиро
вать и собирать для каждой системы и каждой версии. Это утомительный и уязвимый
для ошибок процесс.
Со временем появились системы управления пакетами, упрощающие и облегчаю
щие работу по управлению программным обеспечением. Пакеты включают все файлы,
необходимые для запуска части программного обеспечения, включая предварительно
скомпилированные двоичные файлы, информацию о зависимостях и шаблоны конфи
гурационных файлов, которые могут быть настроены администраторами. Возможно, са
мое главное, что системы упаковки пытаются сделать процесс установки максимально
атомарным. Если во время установки возникает ошибка, пакет может быть отменен или
загружен повторно. Новые версии программного обеспечения могут быть установлены
с помощью простого обновления пакета.
Установщики пакетов обычно осведомлены о файлах конфигурации и, как правило,
не перезаписывают локальные настройки, сделанные системным администратором. Они
либо создают резервные копии существующих файлов конфигурации, которые меняют,
либо предоставляют примеры файлов конфигурации под другим именем. Если вы обна
ружите, что недавно установленный пакет испортил что-то в вашей системе, вы можете
теоретически вернуть его обратно, чтобы восстановить свою систему в исходное состоя
ние. Конечно, теория отличается от практики, поэтому не пытайтесь это делать на про
изводственной системе, предварительно не проверив.
Системы управления пакетами определяют модель зависимостей, которая позволяет
разработчикам пакетов обеспечивать правильную установку библиотек и инфраструкту
ры поддержки, от которых зависят их приложения. К сожалению, графики зависимо
стей иногда несовершенны. В случае неудачи администраторы могут оказаться в слож
ной ситуации, когда невозможно обновить пакет из-за несовместимости версий между
его зависимостями. К счастью, последние версии программного обеспечения для управ
ления пакетами, по-видимому, менее восприимчивы к этому эффекту.
В ходе установки пакеты могут запускать сценарии в разные моменты времени, по
этому они могут делать гораздо больше, чем просто выгружать новые файлы. Пакеты ча
сто добавляют новых пользователей и группы, запускают проверки работоспособности
и настраивают параметры в соответствии с окружающей средой.
К сожалению, версии пакетов не всегда соответствуют версиям программного обе
спечения, которое они устанавливают. Например, рассмотрим следующий пакет RPM
для приложения docker-engine:
$ rpm -qa 1 qrep -i docker
docker-engine-1.13.0-l.e17.centos.x86 64
$ docker version 1 qrep Version
Version: 1.13 .1
Сам пакет объявляет версию 1.13.0, но двоичные отчеты демона docker сообщают
о версии l .13. l. В этом случае специалисты, поддерживающие распространение дистри
бутивов, учитывают изменения и увеличивают версию младшего пакета. Имейте в виду,
что строка версии пакета не обязательно является точным указанием версии программ
ного обеспечения, которая фактически установлена.
Вы можете создавать пакеты для облегчения распространения ваших собственных
локализаций или программного обеспечения. Например, вы можете создать пакет, ко
торый при инсталляции считывает информацию о локализации для машины (или полу-
198 Часть 1. Основы администрирования
чает ее из центральной базы данных) и использует эту информацию для настройки ло
кальных файлов конфигурации.
Вы также можете связывать локальные приложения в пакеты (в комплекте с зави
симостями) или создавать пакеты мя сторонних приложений, которые обычно не рас
пространяются в формате пакета. Вы можете обновлять свои пакеты и использовать ме
ханизм зависимостей для автоматического обновления компьютеров при выпуске новой
версии пакета локализации. Мы рекомендуем использовать программу fpm, Effing Package
Manager, которая является самым простым способом начать сбор пакетов для нескольких
платформ. Вы можете найти ее на сайте github.com/jordansissel/fpm.
Вы также можете использовать механизм зависимости для создания групп паке
тов. Например, вы можете создать пакет, который не устанавливает ничего, но зависит
от многих других пакетов. Установка пакета с включенными зависимостями приводит
к тому, что все пакеты будут установлены за один шаг.
Режим, который вы выбираете для работы rpm (например, -i или -q), определяет,
к каким функциям этой утилиты вы хотите обратиться. Команда rpm --help перечис
лит все опции, разбивая их по режимам. Если вам часто приходится иметь дело с паке
тами RPM, нужно будет внимательно прочесть главную страницу.
Глава 6. Инсталляция и управление программным обеспечением 199
Теперь можно ввести команду dpkg -1, чтобы узнать, все ли прошло нормально.
Флаг -1 допускает наличие шаблона поиска, благодаря чему можно получить информа
цию только по редактору nvi.
ubuntu$ dpkq -1 nvi
Name Version Description
ii nvi 1.81.6-12 4.4BSD re-implementation of vi.
Инсталляция завершилась успешно.
эти системы предлагают первоклассную базу, чтобы вы могли создать собственную си
стему внутреннего распределения.
RHEL Служба Red Hat Network неразрывно связана с дистрибутивом Red Hat
Enterprise Linux. Это коммерческая служба, пользование которой стоит де
нег, зато она обладает привлекательным интерфейсом и более мощными
возможностями в Шiане автоматизации, чем АРТ и yum. Служба Red Hat
Network - это улучшенная открытая версия дорогостоящего сервера Satellite
Server. Клиент может ссылаться на хранилища yum и AP'f, и эта возможность
позволяет таким дистрибутивам, как CentOS, адаптировать клиентский гра
фический интерфейс под нестандартное использование.
Система АРТ документирована гораздо лучше, чем Red Hat Network, и к тому же бес
Шiатна. Она также является более гибкой в плане настройки. Система АРТ разрабатыва
лась для системы Deblan и программного обеспечения dpkg, но была расширена и теперь
может работать с RPM. Доступными являются все версии, работающие со всеми наши
ми примерами дистрибутивов. На данный момент система АРТ более других подходит
на роль универсального стандарта для распространения программного обеспечения.
Программа yum - это аналог AP'f, предназначенный дляRPM. Она также является
стандартным администратором пакетов для Red Hat Enterprise Linux и CentOS, хотя мо
жет работать в любой системе, основанной на RPM, при условии что вы сможете ука
зать ей хранилища, имеющие соответствующий формат.
Мы предпочитаем АРТ, и считаем, что это разумный выбор, если нужно настро
ить собственную автоматизированную сеть распределения пакетов. Более подробно
об этом можно прочитать в разделе "Создание локального зеркала хранилища" далее
в этой главе.
Хранилища пакетов
Дистрибьюторы Linux поддерживают хранилища программного обеспечения, ко
торые работают совместно с выбранными ими системами управления пакетами.
Конфигурация, выбираемая по умолчанию для системы управления пакетами, обычно
ссылается на один или несколько хорошо известных веб- или FТР-серверов, находя
щихся под управлением дистрибьюторов.
Однако из этого факта нельзя сразу понять, что может содержаться в таких храни
лищах. Должны ли они включать только наборы пакетов, принятых в качестве офици
альных, основных, версий? Официальные версии ШIЮС текущие обновления системы
защиты? Современные версии всех пакетов, которые существовали в официальных вы
пусках? Полезные программы сторонних производителей, которые официально не под
держиваются дистрибьютором? Исходный код? Бинарные файлы для многочисленных
архитектур аппаратных средств? Если вы запускаете apt upgrade или yum upgrade,
чтобы обновить систему, что именно под этим подразумевается?
Вообще, системы управления пакетами должны отвечать на все эти вопросы и облег
чать организациям выбор специфических профилей, которые они хотят включить в их
"мир программного обеспечения". Следующие концепции помогут структурировать
этот процесс.
пользовании.
В этом смысле она мало чем отличается от тех служб уведомления об ис
правлениях, которые у:же много лет эксплуатируются различными постав
Недостатком такого подхода является то, что решения об обновлении системы при
нимаются за вас. Определите для себя, в какой степени следует доверять разработчикам
системы Red Hat (а также тех программ, которые они предлагают в виде пакетов).
Разумным компромиссом будет выделение одного из компьютеров в качестве сер
вера автоматических обновлений. Периодически можно создавать образы серверной
системы и проверять, в какой степени они подходят для внутреннего распространения.
Теперь можно приступить к получению пакета. Обратите внимание на то, что мы ис
пользуем команду sudo в процессе инсталляции нового пакета sudo - утилита apt спо
собна обновлять даже те пакеты, которые в настоящий момент используются.
debian$ sudo apt install sudo
Reading Package Lists ... Done
Building Dependency Tree ... Done
1 packages upgraded, О newly installed, О to remove and 191 not upgraded.
Need to get OB/122kB of archives. After unpacking lЗlkB will Ье used.
(Reading database ... 24359 files and directories currently installed.)
Preparing to replace sudo 1.б.2р2-2 (using ... /sudo_l.8.10p3-l+deb8u3
amd64 .dеЬ) ...
Unpacking replacement sudo ...
Setting up sudo (l.8.10p3-l+deb8u3)
Installing new version of config file /etc/pam.d/sudo
• Тип пакета. В настоящее время это deb или deb-src для пакетов в стиле Deblan
либо rpm или rpm-src - для RPM.
• URL-aдpec файла, компакт-диска, сервера НТТР или FТР, где находятся пакеты.
• Дистрибутив (на самом деле - название выпуска), если нужно работать с несколь
кими версиями пакета. Дистрибьюторы используют его для главных выпусков, од
нако вы можете использовать его для других целей, если вам нужны внутренние
системы распространения. 2
(по объему) мира Linux. Пакеты multiverse включают такие неоткрытые исходные тек
сты, как некоторые утилиты и компоненты VMware.
В процессе редактирования файла sources. list вам следует перенастроить
отдельные записи для указания адреса зеркала, задав более близко расположен
ный сервер. Полный список зеркал Ubuntu находится по адресу: launchpad. net/
ubuntu/+archivemirrors. Это динамический (и длинный) список зеркал, который
регулярно изменяется, поэтому обязательно отслеживайте изменения между выпусками.
Убедитесь, что в качестве источника указан элемент securi ty. ubuntu. com, и тог
да вы точно получите доступ к самым последним исправлениям, связанным с мерами
по укреплению безопасности.
Для того чтобы заставить клиентов использовать свое локальное зеркало, отредакти
руйте файлы sources. list так, как если бы выбрали нелокальное зеркало.
Команда apt upgrade загрузит и инсталлирует новые версии любых пакетов, имею
щихся на локальном компьютере. Обратите внимание на то, что команда apt upgrade
определена немного иначе, чем низкоуровневая команда apt-get upgrade. Тем не ме
нее она точно соответствует вашим целям. (Она эквивалентна команде apt-get dist-
upgrade --wi th-new-pkgs.) Команда apt upgrade может удалить пакеты, которые
утилита посчитает несовместимыми с модернизированной системой, так что к этому
нужно быть готовым.
Если вы любите риск, то можете даже позволить автоматическое обновление с зер
кала дистрибутивов. Для этого предназначен параметр -у утилиты apt-get, благодаря
которому на любой вопрос будет выдано оптимистичное "Да!" Имейте в виду, что не
которые обновления (например, пакеты ядра) могут не вступать в силу до тех пор, пока
система не будет перезагружена.
Обычно не рекомендуется автоматически загружать обновления непосредственно
с зеркал дистрибутивов. Другое дело, когда имеются внутренние серверы АРТ и система
управления версиями. Следующий маленький сценарий позволит клиенту поддерживать
синхронизацию с сервером АРТ.
Этот сценарий может запускаться демоном cron по расписанию. Можно также соз
дать ссылки на него в сценариях запуска системы (см. главу 2), чтобы обновления вы
полнялись на этапе начальной загрузки.
Если процедуры обновления запускаются на большом числе компьютеров, то с помо
щью демона cron необходимо распределить их по времени, чтобы не перегрузить сеть.
Если вы не вполне доверяете источнику пакетов, можно автоматически загружать
их, но не инсталлировать. Это позволяет делать опция --download-only утилиты apt-
get. Просмотрите полученные пакеты и определите сами, какие из них инсталлиро
вать. Загруженные пакеты находятся в каталоге /var/aaahe/apt, который со време
нем может серьезно разрастись. Удаляйте неиспользуемые файлы командой apt-get
autoclean.
Начиная с версии FreeBSD 11, границы между этими территориями стали еще более
запутанными. Базовая система уже упакована, но старая схема управления базовой сис
темой как единым целым все еще существует. Многие программные пакеты могут быть
установлены либо как двоичные пакеты, либо как порты с аналогичными результатами,
но с разными последствиями для будущих обновлений. Однако взаимная совместимость
еще не обеспечена; некоторые вещи могут устанавливаться только как порт или как пакет.
Одна из целей версии FreeBSD 12 заключается в том, чтобы более решительно пере
ключить систему на универсальное управление пакетами. Базовая система и порты мо
гут продолжать существовать в той или иной форме (в настоящее время слишком рано
говорить точно, как все будет работать), но будущее направление ясно.
Соответственно, попробуйте, по возможности, управлять дополнительным про
граммным обеспечением с помощью pkg. Избегайте портов, если требуемое программ
ное обеспечение не имеет упакованной версии или вам нужно настроить параметры вре
мени компиляции.
Глава 6. Инсталляция и управление программным обеспечением 209
Базовая система
Базовая система обновляется как единое целое и функционально отличается от лю
бых дополнительных пакетов (по крайней мере теоретически). Базовая система поддер
живается в хранилище Subversion. Вы можете просмотреть исходное дерево, включая все
ветви источника, на сайте svnweb. freebsd. org.
Определены несколько ветвей разработки.
• Ветвь CURRENТ предназначена только для активных целей развития. Она первой
получает новые функции и исправления, но не получила широкого распростране
ния от сообщества пользователей.
Коллекция портов
Порты FreeBSD представляют собой коллекцию всеrо проrраммноrо обеспечения, кото
рое FreeBSD может со:щать на основе исходных кодов. После инициализации дерева портов
вы найдете все доступное программное обеспечение в катеrоризированных подкаталогах
/usr /ports. Чтобы инициализировать дерево портов, используйте утилиту portsnap:
freebsd$ portsnap fetch extract
Глава 6. Инсталляция и управление программным обеспечением 211
freebsd$ cd /usr/ports/ports-mgmt/portmaster
freebsd$ make install clean
Выполните команду portmaster -L, чтобы увидеть все порты, имеющие доступные
обновления, и сразу обновите их с помощью команды portmaster -а.
Вы также можете устанавливать порты через portmaster. Фактически это несколько
более удобно, чем типичный процесс на основе команды make, потому что вам не нуж
но покидать свой текущий каталог. Чтобы установить программу zsh, выполните следу
ющую команду:
Организация локализации
Если в компании тысяча компьютеров с различными конфигурациями, администратор
вынужден тратить большую часть времени на выяснение причин того, почему такая-то
проблема возникла только на этом компьютере. Думаете, решением проблемы будет уни
фикация всех конфигураций? Не спешите с выводами! Ограничения, существующие в ре
альном мире, а также различные нужды ваших пользователей делают это невозможным.
Между администрированием многочисленных и бесчисленных конфигураций есть раз
ница. Важно разделить вашу установку на управляемые части. Вы увидите, что одни
части локализации применяются ко всем управляемым компьютерам, другие - только
Структурные изменения
Помимо выполнения инсталляций с чистого листа, вам придется также постоянно
загружать и инсталлировать обновления. Следует иметь в виду, что на разных компьюте
рах установлены различные сроки действия и предъявляются разные требования к ста
бильности и периоду работоспособности.
Не стоит развертывать новые выпуски программного обеспечения на всех компью
терах сразу. Наоборот, нужно делать это с учетом нужд каждой группы и потратить не
которое время на выявление проблем на самых ранних этапах, чтобы не допустить се
рьезного повреждения системы. Важные серверы нельзя обновлять до тех пор, пока не
будет уверенности в надежности производимых изменений, и избегайте пятниц, если вы
не готовы проводить долгие выходные перед монитором.
Глава 6. инсталляция и управление программным обеспечением 213
Тестирование
Важно протестировать изменения, пока их еще можно отменить. По меньшей мере,
это означает тестирование собственных настроек. Но в той же степени это касается
и системного программного обеспечения. Один известный поставщик UNJX однажды
выпустил исправление, которое, будучи примененным определенным образом, выпол
няло команду rm -rf /. Представьте последствия установки такого исправления во всей
организации без предварительного тестирования.
Тестирование особенно полезно, когда применяются средства, способные автома
тически устанавливать исправления (как большинство систем управления пакетами,
рассмотренных в этой главе). Никогда не подключайте компьютеры, ответственные
за выполнение ключевых задач, к службе обновления, спонсируемой поставщиком.
Постарайтесь подключить к этой службе простой компьютер и уже с него распростра
няйте изменения на остальные компьютеры в вашей организации.
6.7. ЛИТЕРАТУРА
• INTEL CoRPORAПON AND SYSТEмSoFТ. Preboot Execution Environment (РХЕ) Specification,
v2. l. 1999. pix. net/software/pxeboot/archive/pxespec. pdf.
• LAwsoN, №LAN. What itfeels like to Ье ап open-source maintainer. wp. me/plt8Ca-lry.
• PXELinux Questions. syslinux. zytor. com/wiki/ index. php/PXELINUX.
• RooIN, JosIP. Deblan New Maintainers' Guide. deЬian.org/doc/maint-guide.
В этом документе содержится полезная информация о пакетах . deb. См. также
главы 2 и 7 справочника по системе Deblan.
Глава]
сценарии и командная
оболочка
компьютерах. В реальном мире это означает, что эти изменения должны быть подкре
плены программным обеспечением, а не выполняться администраторами, работающи
ми по контрольным спискам, или, что еще хуже, по памяти.
Создание микросценариев
Начинающие системные администраторы часто откладывают изучение сценариев,
пока не столкнутся с особенно сложной или утомительной работой. Например, необ
ходимо автоматизировать резервное копирование определенного типа, чтобы оно вы
полнялось регулярно и чтобы данные резервного копирования хранились в двух разных
центрах обработки данных. Или, возможно, есть конфигурация облачного сервера, ко
торая была бы полезной для создания, инициализации и развертывания с помощью од
ной команды.
Подобные разумные сценарии могут оставить впечатление, что сценарий - это се
кретное оружие, которое должно приводиться в готовность только тогда, когда на го
ризонте возникает большая задача. Допустим, что создание и отладка вашего первого
100-строчного сценария заняли несколько дней. Вы же не можете тратить целые дни
на каждую маленькую задачу... Не так ли?
На самом деле вы достигнете большей эффективности, сэкономив несколько нажа
тий клавиш здесь и несколько команд там. Сценарии типа Marquee, которые являются
частью формальных процедур вашего сайта, - это лишь видимая часть айсберга. Ниже
ватерлинии лежат многие более мелкие формы автоматизации, которые одинаково по
лезны для системных администраторов. Как правило, подходите к каждой задаче с во
просом "Как справиться с этой проблемой, если она возникнет снова?"
Большинство администраторов сохраняют набор коротких сценариев для лично
го использования (вроде скриплетов) в своих каталогах ~ /Ьin. Используйте эти на
спех сделанные сценарии, чтобы устранить проблемы, с которыми вы сталкиваетесь
в повседневной работе. Они обычно достаточно короткие, чтобы можно было их по
нять с первого взгляда, поэтому им не нужна документация, кроме простой инструкции
об использовании. Обновляйте их по мере изменения ваших потребностей.
Для сценариев оболочки у вас также есть возможность определять функции, которые
находятся внутри конфигурационных файлов (например, .bash_profile), а не в авто
номных файлах сценариев. Функции оболочки работают аналогично автономным сце
нариям, но не зависят от вашего пути поиска и автоматически перемещаются вместе
function backup () {
newname=$1. 'date +%Y-%m-%d.%H%M.bak';
mv $1 $newname;
echo "Backed up $1 to $newname.";
ер -р $newname $1;
глава 7. Сценарии и командная оболочка 217
1 Забегая вперед, укажем, что это, вероятно, должны быть Bash, vim и Python.
218 Часть 1. Основы администрирования
Например, авторы английского издания создали эту книгу в среде Adobe InDesign, ко
торая якобы является графическим приложением. Однако она также допускает использо
вание сценариев, написанных на языке JavaScript, поэтому мы создали библиотеку сце
нариев InDesign для реалюации и обеспечения соблюдения многих наших соглашений.
Такие возможности существуют повсюду.
• Приложения Microsoft Office программируются на Visual Basic или С#. Если ваша
работа включает анализ или отчетность, делайте отчеты TPS (Testing Procedure
Specification) самостоятельно.
Впрочем, нам все еще нравится термин программирование сценариев (scripting); он оз
начает использование программного обеспечения в качестве своего рода универсально
го клея, связывающего различные команды, библиотеки и файлы конфигурации в одно
функциональное целое.
Административные сценарии должны подчеркивать эффективность програм
мы и ясность кода, а не вычислительную эффективность. Это не повод быть неакку
ратным, подтверждение того, что сценарии редко выполняются за одну-две секунды.
Оптимизация может иметь удивительно низкую отдачу даже для сценариев, которые ре
гулярно запускаются из демона oron.
Язык Perl, разработанный в конце 1980-х годов, стал важным шагом вперед для раз
работки административных сценариев. Либеральный синтаксис, обширная библиотека
пользовательских модулей и встроенная поддержка регулярных выражений сделали его
фаворитом системных администраторов на протяжении многих лет. Язык Perl разрешает
(а некоторые говорят, поощряет) определенный стиль кодирования "полный вперед -
к черту торпеды" 2 • Существуют разные мнения по поводу того, является это преимуще
ством или недостатком.
В наши дни язык Perl Perl 5. Эту версию следует отличать от перерабо
известен как
танной и несовместимой версии Perl 6, которая наконец бьmа выпущена после 15 лет
подготовительных работ. К сожалению, Perl 5 немного устарел по сравнению с более но
выми языками, а использование Perl 6 пока еще недостаточно распространено для того,
чтобы мы рекомендовали его в качестве безопасного выбора. Возможно, мир полностью
отказался от языка Perl. На данном этапе мы предлагаем избегать языка Perl, если вы
начинаете новый проект.
Языки JavaScript и РНР лучше всего известны как языки для веб-разработки, но их мож
но использовать в качестве инструментов для общего использования. К сожалению, оба
языка имеют недостатки дизайна, когорые ограничивают их привлекательность, и им не
хватает многих сторонних библиотек, на которые пмагаются системные администраторы.
Если вы прИЦUIИ из мира веб-разработки, у вас может возникнуть соблазн применить
существующие навыки РНР или JavaScript для системного администрирования. Мы ре
комендуем не делать этого. Код есть код, но проживание с другими системными адми
нистраторами в одной экосистеме приносит множество долгосрочных преимуществ. (По
крайней мере, избегая РНР, вам не придется терпеть насмешки, участвуя в вики-конфе
ренциях локальных системных администраторов.)
Python и Ruby - современные, универсальные языки программирования, которые
хорошо подходят для административной работы. Эти языки являются результатом не
скольких десятилетий развития языкового дизайна по сравнению с оболочкой, а их
средства обработки текста настолько сильны, что sh может тихо курить в сторонке.
Основной недостаток как Python, так и Ruby заключается в том, что их среды могут
быть немного неудобными для настройки, особенно когда вы начинаете использовать
сторонние библиотеки, которые скомпилировали компоненты, написанные на языке С.
Оболочка обходит эту проблему, отказавшись от модульной структуры и сторонних би
блиотек.
В отсутствие внешних ограничений Python является наиболее широко используемым
языком сценариев для системных администраторов. Он тщательно разработан, широко
используется и поддерживается другими пакетами. В табл. 7.1 приведены некоторые об
щие примечания о других языках.
2 Цитата героя Гражданской войны в США адмирала Дэвида Фаррагуrа (David Farragut). - Примеч. ред.
220 Часть 1. Основы администрирования
Bourne shell Стефан Борн (Stephen Bourne) Простая серия команд, переносимые сце-
нар и и
Cshell Билл Джой (Bill Joy) Никогда не используйте для создания сцена-
риев; см. сноску в разделе 7.2
JavaScript Брендан Эйх (Brendan Eich) Веб-разработка, сценарий приложений
РНР Расмус Лендорф (Rasmus Lerdorf) Вы плохо себя вели и заслуживаете наказания
Python Гвидо ван Расмуссен (Guido van Rossum) Сценарии общего назначения, обработка
данных
Следуйте рекомендациям
Несмотря на то что фрагменты программ в этой главе снабжены некоторыми ком
ментариями и сообщениями о правильном применении сценариев, они являются слиш
ком схематичными. Существует множество книг о написании качественных программ,
но все же будет не лишним изложить здесь некоторые основные рекомендации по на
писанию сценариев.
1 Имена самих сценариев также имеют большое значение. В этом контексте в роли пробелов
дефисы предпочтительнее, чем знаки подчеркивания (например, system-config-printer).
Глава 7. Сценарии и командная оболочка 221
• В оболочке bash используйте ключ -х, чтобы отобразить команды, прежде чем
они будут выполнены, и ключ -n, чтобы проверить синтаксис команд без их вы
полнения.
4Сдругой стороны, разработка руководства по стилю позволит привлечь к себе внимание членов
вашей команды на несколько недель. Не ссорьтесь из-за руководства по стилю; старайтесь найти
взаимопонимание и избегайте длительных переговоров по поводу использования квадратных
скобок и запятых. Главное - убедиться, что все согласны с соглашениями об именах.
222 часть 1. Основы администрирования
Существуют разные варианты оболочки Вoume, в частности ksh (оболочка Kom) и род
ственная ей оболочка zsh, которая обеспечивает широкую совместимость с sh, ksh и bash,
а также имеет множество интересных функций, включая исправление орфографии и улуч
шенные средства универсализации (globblng). Насколько нам известно, она не используется
как оболочка по умолчанию в любой системе, но у нее есть что-то вроде культа.
Исторически ВSD-производные системы благоприятствовали интерактивной обо
лочке на языке С, csh. В настоящее время она чаще всего встречается в виде расширен
ной версии tcsh. Несмотря на ранее широко распространенное применение csh в каче
стве стартовой оболочки, ее не рекомендуется использовать в качестве языка сценариев. 5
tcsh - это превосходная и широко доступная оболочка, но она не является произ
водной от sh. Оболочки сложны; если вы не знакомы с оболочкой, нет смысла изучать
одну оболочку для сценариев, а вторую - с различными функциями и синтаксисом -
для ежедневного использования. Придерживайтесь современной версии sh как оболоч
ки двойного назначения.
В наши дни среди всех вариантов оболочки sh оболочка bash является универсаль
ным стандартом. Чтобы легко перемещаться между различными системами, стандарти
зируйте свою личную среду в bash .
• В системе
bash
полните команду
FreeBSD
и используйте команду
новить bash
оболочка tcsh используется по умолчанию, а оболочка
поставляется как часть базовой системы. Но это легко исправить: вы
sudo pkg install bash для инсталляции оболочки bash
chsh, чтобы переключить оболочку. Вы можете уста
как значение по умолчанию для новых пользователей, выпол
нив команду adduser -с. 6
~подробное объяснение того, почему это так, содержится в классическом заявлении Тома
Кристиансена Программирование для csh считается вредным (Csh Programming Coпsidered Harmful). Оно
широко воспроизводится в Интернете, например на сайте har!Пul. cat-v. orq/ softvare/ csh.
6 Изменение значения по умолчанию может показаться самонадеянным, но стандартная система
FreeBSD оrсьшает новых пользователей к оболочке Almquist sh, так что им некуда идти - только вверх.
Глава 7. Сценарии и командная оболочка 223
Редактирование команд
Мы наблюдали, как многие редактируют командные строки с помощью клавиш
управления курсором. Вы ведь так не поступаете в своем текстовом редакторе, верно?
Если вы предпочитаете редактор emacs, то все основные команды редактора emacs
доступны при редактировании уже выполненного ряда команд (т.е. "предыстории").
Нажав комбинацию клавиш <Ctrl+ Е>, вы переместитесь в конец строки, а с помощью
комбинации клавиш <Ctrl+A> - в начало. Нажатие комбинации клавиш <CtrJ+P> по
зволяет вернуться к предыдущим командам и вызвать их для редактирования. С помо
щью комбинации клавиш <Ctrl+R> вы сможете шаг за шагом "прокрутить" свою "пре
дысторию" и найти старые команды.
Если вы предпочитаете использовать редактор vi, переключите свою командную
оболочку в режим vi.
$ set -о vi
В режиме vi редактирование является модальным, но вы начинаете работать в ре
жиме ввода команд. Для того чтобы выйти из режима ввода, нажмите вначале клавишу
<Esc>, а затем клавишу
<i>, чтобы вернуться в него. В режиме редактирования нажатие
клавиши <w> переместит вас вперед на одно слово; использование комбинации кла
виш <f+X> позволит найти следующий символ "Х" в строке и т.д. "Прогуляться" по ко
мандам, зафиксированным в "предыстории'', можно с помощью клавиш <Esc> и <k>.
Решили вернуться в режим редактирования emacs? Выполните следующую команду.
$ set -о emacs
данных из файла. Символ "<" связывает канал STDIN с содержимым некоторого суще
ствующего файла. Символы">" и">>" перенаправляют поток STDOUT; причем символ
">"используется для замены содержимого файла, а">>" - для добавления данных в его
конец. Например, команда
$ qrep bash /etc/passwd > /tmp/bash-users
копирует строки, содержащие слово "bash" из файла /etc/passwd в файл /tmp/bash-
users (при необходимости файл будет создан). Следующая команда упорядочивает со
держимое этого файла и выводит результат на терминал.
$ sort < /tmp/bash-users 7
root:x:O:O:root:/root:/bin/bash
Для того чтобы перенаправить потоки STDOUT и STDERR в одно и то же место, ис
пользуйте символ">&". Для того чтобы перенаправить только поток STDERR, исполь
зуйте вариант "2>".
На примере команды find можно показать, почему важно обрабатывать потоки
STDOUТ и SТDERR отдельно. Дело в том, что она формирует выходные данные по обо
им каналам, особенно в случае ее выполнения непривилегированным пользователем.
Например, при выполнении команды
$ find / -name core
обычно генерируется так много сообщений об ошибках "permission denied" (отсутствие
прав доступа), что настоящие результаты поиска теряются в "шуме". Чтобы отбросить
все сообщения об ошибках, можно использовать такой вариант.
$ find / -name core 2> /dev/null
В этой версии команды find только настоящие совпадения (где пользователь имеет
разрешение на чтение родительского каталога) выводятся в окно терминала. Чтобы со
хранить список совпадающих путей в файле, выполните такую команду.
$ find / -name core > /tmp/corefiles 2> /dev/null
Эта командная строка отправляет совпадающие пути в файл /tmp/corefiles, от
брасывая все ошибки и ничего не посылая в окно терминала.
Для того чтобы связать канал STDOUT одной команды с каналом STDIN другой, ис
пользуйте символ " 1". Рассмотрим несколько примеров.
$ find / -name core 2> /dev/null 1 less
Первая команда выполняет операцию find из предыдущего примера, но посылает
список найденных файлов не в файл, а в программу постраничного вывода less.
$ ps -ef 1 qrep httpd
Здесь команда ps генерирует список процессов, из которого команда grep выбирает
строки, содержащие слово httpd. Результат выполнения команды grep никуда больше
не перенаправляется, поэтому совпадающие строки попадают в окно терминала.
7 По правде говоря, команда sort может работать с файлами напрямую, поэтому символ < в этом
контексте является необязательным. Он используется здесь для иллюстрации.
Глава 7. Сценарии и командная оболочка 225
пытается создать каталог с именем foo и в случае успеха выполняет команду cd. В данном
случае успех выполнения команды mkdir будет зафиксирован при получении кода завер
шения, равного нулю. Использование для этой цели символа, означающего операцию "ло
гическое И", может сбить с толку тех, кто в других языках программирования использовал
вычисления в сокращенной форме записи. Если кому-то это непонятно, не стоит слишком
долго здесь застревать; а просто примите это как идиому командной оболочки.
И наоборот, символ "1 1" обеспечит выполнение следующей команды только в том
случае, если предыдущая команда не выполнится (т.е. сгенерирует ненулевое значение
кода завершения).
$ etcdir=' / etc'
$ echo $etcdir
/etc
Не ставьте до и после знака равенства ( =) пробелы, в противном случае оболочка
ошибочно примет имя вашей переменной за имя команды.
При ссьшке на переменную можно заключить ее имя в фигурные скобки, чтобы син
таксический анализатор (да и сам человек) не сомневался в том, где заканчивается имя
переменной и начинается другой текст; например, используйте запись$ {etcdir) вме
сто $etcdir. Обычно без фигурных скобок можно обойтись, но они могут оказаться по
лезными в случае, если вам понадобится раскрывать переменные в строках с двойными
кавычками. Часто нужно сделать так, чтобы после значения переменной стояли буквы
или знаки препинания. Например,
$ mylang="Pennsylvania Dutch"
$ echo "I speak ${mylang}."
I speak Pennsylvania Dutch.
$ echo 'I speak ${mylang}.'
I speak $(mylang).
Обратные апострофы (также известные как обратные галочки, левые кавычки, ле
вые одиночные кавычки или открывающие кавычки) интерпретируются аналогично
двойным кавычкам, но несут при этом дополнительную нагрузку. Эта нагрузка состоит
в интерпретации содержимого такой строки, как команды оболочки, выполнении этой
команды и замене строки результатом выполнения этой команды.
$ echo "Тhere are 'wc -1 < /etc/passwd" lines in the passwd file."
There are 28 lines in the passwd file.
Переменные окружения
При запуске процесса UNIX он получает список аргументов командной строки,
а также набор переменных окружения. Большинство оболочек показывают вам текущее
окружение в ответ на команду printenv:
$ printenv
EDITOR = VI
USER = garth
EN\' = / gome / garth/. bashrc
LSCOLORS = exfxgxgxdxgxgxbxbxcxcx
PWD = /mega/Documents/Projects/Code/spl
HOl'IE = /home/garth
... <total of about 50>
По соглашению имена переменных окружения набираются прописными буквами, но
формально это не требуется.
Программы, которые вы запускаете, могут обращаться к этим переменным и соответ
ствующим образом изменять их поведение. Например, программа vipw проверяет перемен
ную среды EDITOR, чтобы определить, какой текстовый редактор будет работать для вас.
Переменные окружения автоматически импортируются в пространство имен пере
менных sh, поэтому их можно установить и прочитать с помощью стандартного син
таксиса. Чтобы превратить переменную оболочки в переменную среды, используйте ко
манду export имя_ переменной. Вы также можете комбинировать этот синтаксис со
значением присваивания, как показано здесь:
Команды фильтрации
Любая корректная команда, которая считывает данные из канала STDIN и записы
вает данные в канал STDOUТ, может использоваться в качестве фильтра (т.е. компонента
конвейера) для обработки данных. В этом разделе мы кратко рассмотрим некоторые из
наиболее широко используемых команд фильтра, но список практически бесконечен.
Команды фильтрации отличаются настолько сильным "коллективизмом'', что порой
даже трудно продемонстрировать их индивидуальное использование.
Большинство команд фильтра принимают одно или несколько имен файлов в ко
мандной строке. Только если вы не укажете файл, они прочитают данные из стандарт
ного входного потока.
Также полезна опция -h, реализующая числовую сортировку, которая понимает суф
фиксы, такие как м мя мега и G мя гига. Например, следующая команда правильно со
ртирует размеры подкаталогов в каталоге /usr, сохраняя корректность вывода.
$ du -sh /usr/* 1 sort -h
lбК /usr/locale
128К /usr/local
648К /usr/games
15М /usr/sЬin
20М /usr/include
117М /usr/src
126М /usr/Ьin
845М /usr/share
1.7G /usr/lib
нкоманда sort принимает ключ -kЗ (а не -kЗ, З), но, вероятно, она не делает то, что вы ожидаете.
Без номера завершающего поля ключ сортировки действует до конца строки.
глава 7. Сценарии и командная оболочка 229
Выполнение
В оболочке sh комментарии начинаются со знака # и продолжаются до конца стро
ки. Как и в командной строке, вы можете разбить одну логическую строку на несколько
физических строк, обозначив переход на новую строку символом обратной косой черты
(\). И, наоборот, можно поместить на одной строке несколько операторов, разделив их
точкой с запятой.
Сценарий для оболочки sh может состоять только из последовательности командных
строк. Например, следующий сценарий helloworld просто выполняет команду echo.
#!/Ьin/sh
echo "Hello, world!"
Первая строка содержит сочетание символов#!, которое означает, что данный тек
стовый файл является сценарием, предназначенным для интерпретации командной обо
лочкой из каталога /Ьin/sh (которая сама может служить ссылкой на оболочку dash
и bash) При принятии решения о том, как выполнить этот файл, ядро найдет соответ
ствующий синтаксис. С точки зрения оболочки, выполняющей этот сценарий, первая
строка представляет собой просто комментарий.
Теоретически, если ваша оболочка sh находится в другом месте, вам придется отре
дактировать первую строку. Тем не менее многие существующие сценарии предполага
ют, что она находится в каталоге /Ьin/sh, который системы вынуждены поддерживать,
хотя бы через ссылку.
Если вам нужен сценарий для запуска в оболочке bash или в другом интерпретаторе,
который может не иметь одного и того же командного пути в каждой системе, вы може
те использовать каталог /usr/Ьin/env для поиска переменной среды РАТН для опреде
ленной команды. 10 Например,
#! /usr/Ьin/env ruby
является распространенной идиомой для запуска сценариев на языке Ruby. Подобно ка
талогу /Ьin/sh, каталог /usr/Ьin/env является настолько широко распространенным
вариантом, что все системы обязаны его поддерживать.
Для того чтобы подготовить этот файл к выполнению, достаточно установить его бит,
"отвечающий" за выполнение (см. раздел 5.5).
$ chmod +х helloworld
$ • /helloworld' 1
Hello, world!
'"Поиск путей имеет последствия для безопасности, особенно при запуске сценариев в среде
sudo. Дополнительную информацию об обработке переменных окружения в среде sudo см. в
разделе 3.2.
11 Если ваша оболочка понимает команду helloworld без префикса . /, это означает, что в
вашем пути поиска указан текущий каталог (. ). Это плохо, поскольку дает другим пользователям
возможность устраивать для вас ''ловушки" в надежде, что вы будете пытаться выполнить
определенные команды при переходе к каталогу, в котором они имеют доступ д.1я записи.
232 Часть 1. Основы администрирования
$ sh helloworld
Hello, world!
$ source helloworld
Hello, world!
Первая команда выполнит сценарий helloworld в новом экземпляре оболочки sh,
а вторая - заставит вашу начальную оболочку прочитать содержимое файла, а затем вы
полнить его. Второй вариант полезен в случае, когда сценарий устанавливает перемен
ные среды или выполняет другие операции настройки, применимые только к текущей
оболочке. Обычно этот вариант используется при написании сценариев, включающих
содержимое файла конфигурации, написанного в виде ряда присваиваний значений
переменным. 12
m Дополнительную информацию о битах разрешения можно прочитать в разделе 5.5.
Если вы пришли из мира Windows, то вам привычно использовать понятие расши
рения файла, по которому можно судить о типе файла, а также о том, можно ли его
выполнить. В мире UNIX и Linux признак того, может ли файл быть выполнен (и если
да, то кем), содержится в специальных битах полномочий. При желании вы можете на
делить свои Ьаsh-сценарии суффиксом . sh, который бы напоминал вам об их типе, но
тогда при выполнении соответствующей команды вам придется вводить суффикс . sh,
поскольку UNIX не интерпретирует расширения специальным образом.
От команд к сценариям
Прежде чем переходить к особенностям написания сценариев для оболочки sh, оста
новимся на методике этого процесса. Многие пишут эти сценарии так же, как на языке
Python или Ruby, т.е. используя какой-нибудь текстовый редактор. Однако удобнее рас
сматривать в качестве интерактивной среды разработки сценариев режим с приглаше
нием на ввод команды.
Ой! Похоже на то, что нам надо включить в шаблон точку и при поиске игнориро
вать каталоги. Нажмите комбинацию клавиш <Ctrl+P>, чтобы вернуться в режим ко
мандной строки, а затем модифицируйте ее.
$ find . -type f -name '*.log'
.do-not-touch/important.log
foo.log
12 Синонимом для команды source служит команда в виде точки (dоt-команда), например
. helloworld.
Глава 7. Сценарии и командная оболочка 233
genius/spew.log
Отлично, это уже выглядит лучше. Правда, каталог . do-not-touch (т.е. "не тро
гать") вызывает смутное чувство тревоги; но мы можем избавиться от него.
$ find . -type f -name '*.log' 1 grep -v .do-not-touch
foo. log
genius/spew.log
Да, это именно те команды, которые позволят переименовать нужные файлы. Как
же их выполнить? Мы могли бы снова вызвать уже выполненную команду и отредакти
ровать команду echo, чтобы заставить оболочку sh выполнять команды mv, а не просто
выводить их. Ведь передача команд в отдельную копию оболочки sh - более надежный
вариант работы, который к тому же требует меньшего объема редактирования.
Нажав комбинацию клавиш <Ctrl+P>, мы обнаруживаем, что оболочка bash забот
ливо свернула наш мини-сценарий в одну-единственную строку. К этой "уплотненной"
командной строке мы просто добавляем канал, передаюший выходные данные команде
sh -х.
1. Разрабатывайте сценарий (или его часть) в виде конвейера команд, причем по
шагово и в режиме выполнения командных строк.
$ echo 11 \taa\t.ЬЬ\tcc\n"
\taa\tbb\tcc\п
$ printf 11 \taa\tЬb\tcc\n"
аа ЬЬ се
if [ -п "$user_пaтe" ]; then
echo "Hello $user_пaтe!"
exit О
else
echo "Greetiпgs, пaтeless опе!"
exit 1
fi
Ключ -n в команде eoho подавляет привычный переход на новую строку, но здесь
была бы кстати команда printf. Мы еще рассмотрим вкратце синтаксис оператора if,
но его действие здесь, с нашей точки зрения, очевидно. Ключ -n в операторе if обе-
Глава 7. Сценарии и командная оболочка 235
спечит значение истины, если его строковый аргумент не окажется нулевым. Вот как
выглядит результат выполнения этого сценария.
$ sh readexample
Enter your name: Ron
Hello Ron !
show_usage()
echo "Usage: $0 source dir dest dir" 1>&2
236 Часть 1. Основы администрирования
exit 1
show_ usage () {
echo "Usage: $0 source_dir dest_dir" 1>&2
if [ $# -eq О]; then
exit 99 # Exit with arbitrary nonzero return code
else
exit $1
fi
show_usage 5
приводит к тому, что сценарий завершает работу после вывода сообщения об использо
вании именно с этим кодом. (Переменная оболочки$? содержит статус выхода послед
ней выполненной команды, независимо от того, используется она внутри сценария или
в командной строке.)
В оболочке sh сильна аналогия между функциями и командами. Вы можете опре
делить полезные функции в файле~/ .bash_profile (~/ .profile для обычной обо
лочки sh), а затем использовать их в командной строке, как если бы они были команда
ми. Например, если ваш сайт стандартизован на сетевом порту 7988 для протокола SSH
(форма "безопасность через безвестность"), вы можете определить функцию
ssh () {
/usr/bin/ssh -р 7988 $*
}
Поток управления
Выше в этой главе мы уже рассмотрели несколько конструкций if-then и if-then-
else (они работают вполне ожидаемым образом). Терминатором (признаком конца)
для оператора if служит оператор fi. Для образования цепочки if-операторов можно
использовать ключевое слово elif, означающее "else if".
if [ $base -eq 1 ] && [ $dm -eq 1 ]; then
installDMBase
elif [ $base -ne 1 && $dm -eq 1 ] ; then
installBase
elif [ $base -eq && $dm -ne 1 ] ; then
installDM
else
echo '==> Installing nothing'
fi
Как и специальный []-синтаксис для выполнения операций сравнения, так и "пара
метрические" имена операторов целочисленного сравнения (например, -eq) являются
наследием утилиты /Ьin/test из ранней командной оболочки Стивена Борна. В дей-
238 Часть 1. Основы администрирования
ствительности квадратные скобки - это не что иное, как условное обозначение вызова
утилиты test; они не являются частью оператора if. 13
В табл. 7.3 собраны операторы оболочки bash, позволяющие сравнивать числа
и строки. В отличие от языка Perl, в оболочке bash используются текстовые операторы
для чисел и символические операторы для строк.
Несмотря на всю полезность формы elif, зачастую с точки зрения ясности про
граммного кода лучше использовать структуру case. Ниже показан ее синтаксис на при
мере функции, которая централизует процесс регистрации сценария. Конкретные вари
анты описываются закрывающими скобками после каждого условия и двумя точками
с запятой, завершающими блок операторов, который должен быть выполнен при реали
зации заданного условия. Оператор case завершается ключевым словом esac.
# Уровень протоколирования устанавливается в глобальной
# переменной LOG_LEVEL. Возможные варианты перечислены в порядке
# от самого строгого до наименее строгого: Error, Warning, Info и Debug.
logMsg {
message level=$1
11 Сейчас эти оnераuии встроены в оболочку и уже не запускают на выполнение утилиту /Ьin/test.
Глава 7. Сценарии и командная оболочка 239
message_itself=$2
if [ $message_level -le $LOG_LEVEL ]; then
case $message_level in
0) message_level_text="Error" ;;
1) message_level_text="Warning" ;;
2) message_level_text="Info" ;;
3) message_level_text="Debug" ,,
*) message_level_text="Other"
esac
echo "${message_level_text}: $message_itself"
if
Циклы
В оболочке sh конструкция for".in позволяет упростить выполнение некоторых
действий для группы значений или файлов, особенно при универсализации файловых
имен, т.е. замене реальных символов в имени и расширении универсальными (напри
мер, "*"и "?")с целью формирования целых списков имен файлов. Шаблон *. sh
в приведенном ниже цикле for позволяет обработать целый список совпадающих с ним
(шаблоном) имен файлов из текущего каталога. Оператор for, проходя по этому списку,
по очереди присваивает имя каждого файла переменной script.
#!/Ьin/sh
suffix=BACKUP--'date +%Y-%m-%d-%H%M'
$ sh forexample
Copying rhel.sh to rhel.sh.BACKUP--2017-01-28-2228 .. .
Copying sles.sh to sles.sh.BACKUP--2017-01-28-2228 .. .
В раскрытии имени файла нет ничего магического; все работает в точном соответ
ствии с тем, как написано в командной строке. Другими словами, сначала имя файла
раскрывается (т.е. шаблон заменяется существующим именем), а затем обрабатывается
интерпретатором в развернутом виде. Имена файлов можно также вводить статически,
как показано ниже:
#!/Ьin/sh
for file; do
newname="$(file).backup"
echo "Copying $file to $newname ... "
ер -р $file $newname
done
Циклы в оболочке bash, в отличие от традиционной оболочки sh, ближе к циклам
из традиционных языков программирования, в которых задается стартовое выражение,
ехес 0<$1
counter=l
while read line; do
echo "$counter: $line"
counter=$ ( (counter + 1) )
done
Вот как выглядит результат выполнения этого сценария.
$ sh whileexample /etc/passwd
1: root:x:O:O:Superuser:/root:/Ьin/bash
2: Ьin:x:l:l:Ьin:/Ьin:/Ьin/bash
3: daemon:x:2:2:Daemon:/sЬin:/Ьin/bash
14 8 зависимости от вызова, оператор ехес может иметь и такое значение: "Остановить этот сценарий
и передать управление другому сценарию или выражению". В этом состоит еще одна странность
оболочки: доступ к обеим упомянутым здесь функциям реализуется через один и тот же оператор.
Глава 7. Сценарии и командная оболочка 241
Арифметика
Все переменные в оболочке sh представляют собой строковые значения, поэтому
оболочка sh не делает различия в присваиваниях между числом l и символьной стро
кой "1 ". Различие состоит в использовании переменных. Следующий код иллюстрирует
это различие.
# ! /Ьin/sh
a=l
Ь=$ ( (2))
с=$а+$Ь
d=$((a + Ь))
с="$а+$Ь"
Процесс сопоставления
Код, который использует регулярное выражение, пытается сопоставить одну задан
ную текстовую строку с одним заданным шаблоном. Сопоставляемая текстовая строка
может иметь очень большой размер и содержать встроенные символы перехода на но
вую строку. Зачастую регулярное выражение удобно использовать для сопоставления
с содержимым целого файла или документа.
Для того чтобы механизм сопоставления мог доложить о благоприятном исходе, ша
блон поиска должен целиком совпасть с непрерывной областью исследуемого текста. При
этом шаблон может совпасть в любом месте исследуемого текста. Обнаружив успешное
совпадение, вычислитель возвращает текст совпадения вместе со списком совпадений
для любых частей (подразделов) шаблона, ограниченных специальным образом.
Литеральные символы
В общем случае символы регулярного выражения при сопоставлении должны соот
ветствовать самим себе. Так, шаблон
Специальные символы
В табл. 7.5 собраны значения некоторых распространенных специальных символов,
которые могут использоваться в регулярных выражениях (вообще, этих специальных
символов гораздо больше).
Многие такие специальные конструкции, как + и 1, оказывают влияние на сопо
ставление подстрок слева или справа. В общем случае подстроку может составлять один
символ, или "подшаблон", заключенный в круглые скобки, или класс символов, заклю-
ченный в квадратные скобки. Однако дпя символа " 1" подстрока распространяется нео
граниченно как влево, так и вправо. Если вы хотите ограничить область действия верти
кальной черты, заключите ее и обе подстроки в их собственный набор круглых скобок.
Например, шаблон
I am the (walruslegg man)\.
даст совпадение либо со строкой "1 am the walrus.", либо со строкой "1 am the egg man. ". Эrот
пример демонстрирует также способ "экранирования" специальных символов (в данном слу
чае точки) с помощью обратной косой черты (\). Шаблон
• 1 am the walrus.
• 1 am the egg man.
• 1 am the walrus. 1 am the egg man.
• 1 am the egg man. 1 am the walrus.
• 1 am the egg man. 1 am the egg man.
• 1 am the wa\rus. 1 am the walrus.
Приведенный выше шаблон также совпадет со строкой "1 am the walrus. 1 am the egg
man. 1 am the walrus.", хотя количество повторений явно ограничено числом два. Дело
в том, что шаблон не обязательно должен совпадать полностью с исследуемым текстом.
В данном случае после обнаружения совпадений этого регулярного выражения с двумя
предпожениями дальнейшее его сопоставление прекратилось с объявлением об успеш-
244 Часть 1. основы администриравания
16 0братите
внимание: это регулярное выражение должно быть гибким при сопоставлении.
Многие шаблоны, которые не являются законными написаниями, также соответствуют шаблону:
например, "Mo'ammer е\ Qhuuuzzthaf'.
Глава 7. Сценарии и командная оболочка 245
ражении.
Захваты
В случае если совпадение происходит, каждый набор круглых скобок становится
"группой захвата", которая фиксирует реально совпавший текст. То, как именно эти
элементы становятся доступными мя вас, зависит от конкретной реализации и контек
ста. В большинстве случаев доступ к результатам можно получить в виде списка или по
следовательности пронумерованных переменных.
Поскольку круглые скобки могут быть вложенными, как узнать, чему соответствует
каждое совпадение? Ответ простой: совпадения выстраиваются в результате в том же по
рядке, в котором располагаются открывающие скобки. Количество "захватов" равно ко
личеству открывающих скобок, независимо от роли (или ее отсутствия), которую игра
ла каждая взятая в скобки группа в реальном совпадении. Если взятая в скобки группа
не используется (например, при сопоставлении регулярного выражения Mu ( ' ) ? amma r
со строкой "Muammar"), соответствующий "захват" будет пустым.
Если обнаружится несколько совпадений группы, в качестве результата возвращается
содержимое только последнего совпадения. Например, при шаблоне
(I am the (walruslegg man)\. ?) {1,2)
и таком варианте обрабатываемого текста
I am the egg man. I am the walrus.
существуют два результата (по одному мя каждого набора круглых скобок).
I am the walrus.
walrus
Обратите внимание на то, что обе захваченные группы в действительности совпали
дважды. Однако был захвачен только последний текст, совпавший с каждым набором
круглых скобок.
246 Часть 1. Основы администрирования
17 Несмоrря на то что в этом разделе в качестве примеров обрабатываемого текста показаны фрагменты
НТМL-кода, регулярные выражения - не самый подходящий инструмент в данном случае (что не
преминули отметить и наши рецензенты). Языки Ruby и Pythoп имеют прекрасные расширения,
которые анализируют НТМL-документы надлежащим образом. Вы можете получить доступ к
интересующим вас порциям с помощью Xpath- или СSS-селекторов. Подробнее о модульных
репозиториях соответствующих языков можно узнать, обратившись к странице Википедии,
посвященной языку запросов Xpath (XML Path Language) и соответствующим модулям в репозиториях.
Глава 7. Сценарии и командная оболочка 247
тегами, и так далее, одним словом, вам придется создавать задание, которое потребует,
чтобы анализатор проверил массу возможных комбинаций.
Большой специалист в области регулярных выражений Ян Гойвертс (Jan Goyvaerts)
называет этот эффект катастрофическим откатом (catastrophic backtracking) и описыва
ет его в своем блоге (за подробностями и некоторыми удачными решениями обращай
тесь по адресу: regular-expressions. info/catastrophic. html).
Из всего сказанного выше можно сделать такие выводы.
• Если вы можете организовать построчное сопоставление шаблона, а не пофай
ловое (т.е. с просмотром сразу всего файла), значит, вы значительно уменьшаете
риск получения, мягко говоря, низкой производительности.
Страсти по Python 3
Python уже успел стать основным языком написания сценариев в мире, когда
в 2008 году появилась версия Python 3. В этой версии разработчики решили отказаться
от обратной совместимости с Python 2, чтобы можно было реализовать группу скром
ных, но фундаментальных изменений и исправлений в языке, особенно в области ин
тернационализированной обработки текста. 18
Проект Fedora работает над тем, чтобы сделать Python 3 своей верси
RHEL. ей по умолчанию, а системы Red Hat и CentOS намного отстают и даже
не определяют предварительно построенный пакет для версии Python 3.
Однако вы можете выбрать один из репозиториев EPEL Fedora (Extra
Packages for Enterprise Linux). Для получения инструкций по доступу к это
му репозиторию, обратитесь в раздел FAQ на сайте fedoraproj ect. org /
wiki/EPEL для получения инструкций по доступу к этому репозиторию. Его
легко настроить, но точные команды зависят от версии.
$ chmod +х helloworld
$ . /helloworld
Hello world!
Самый крупный разрыв Python с традиционным стилем программирования заклю
чается в том, что отступы имеют логический смысл. Для разграничения блоков в язы
ке Python не используются фигурные и квадратные скобки или ключевые слова begin
и end. Блоки автоматически формируются из выражений, находящихся на одном уровне
отступов. Точный стиль отступов (пробелы или табуляция, а также глубина отступов)
значения не имеет.
Например, строка
print ("один", "два", "три", sep " - 11 , end "! \n")
производит вывод
один-два-три!
20 0днородный и более эффективный тип массива реализован в модуле array, но для большинства
целей мы рекомендуем использовать списки.
Глава 7. Сценарии и командная оболочка 251
$ pythonЗ dictionary
Упорядоченные словарные литералы: { 1: 'первый', 2: 'второй', 3: 'третий')
Первый литерал: первый
$ pythonЗ fileio
root:x:O:O:root:/root:/bin/bash
daemon:x:l:l:daemon:/usr/sbin:/usr/sbin/nologin
Переход на новую строку в конце вызовов функции print подавляется с помощью
параметра end = "",потому что каждая строка уже содержит символ перехода на но
вую строку из исходного файла. Python не разделяет их автоматически.
if len(sys.argv) != 3:
2 аргумента; вы
show_usage("Hyжны ввели один %d" % (len(sys.argv) - 1))
elif not os.path.isdir(sys.argv[l]):
show_usage("Иcxoдный каталог не найден")
elif not os.path.isdir(sys.argv[2]):
show_usage("Цeлeвoй каталог не найден")
В первой позиции список sys. argv содержит имя сценария, поэтому его длина
больше, чем количество аргументов командной строки, которые были фактически пре
доставлены. Форма sys. argv [ 1: З] - это список фрагментов. Любопытно, что срезы
не включают элемент в дальнем конце указанного диапазона, поэтому этот фрагмент
включает только элементы sys. argv [1] и sys. argv [2]. Чтобы включить второй и по
следующие аргументы, можно просто написать sys. argv [ 1:].
Как и в sh, в языке P_ython есть специальное условие "else if'; ключевым словом яв
ляется elif. Но в нем нет явной инструкции case или switch.
Параллельное присваивание переменных source и dest немного отличается от не
которых языков тем, что сами переменные не входят в список. Python допускает парал
лельные назначения в любой форме.
В языке Python используются одинаковые операторы сравнения для числовых
и строковых значений. Оператор сравнения "не равен" имеет вид ! =, но в языке нет
Глава 7. Сценарии и командная оболочка 253
унарного оператора ! ; для этой цели используется ключевое слово not. Существуют
также булевы операторы and и or.
Циклы
В приведенном ниже фрагменте используется конструкция for ... in для обхода
элементов в диапазоне от 1 до 1О.
for counter in range (1, 10):
print(counter, end=" ")
print () # Последний переход на новую строку
• В циклах for и while в конце могут быть разделы else, которые выполняются
только в том случае, если цикл завершается нормально, в отличие от выхода из цик
import sys
import re
suits = {
'Bashful': 'yellow', 'Sneezy': 'brown', 'Doc': 'orange', 'Grumpy': 'red',
'Dopey': 'green', 'Нарру': 'Ыuе', 'Sleepy': 'taupe'
создает объект класса т ime без ссылки на имена любых связанных с временем классов
или выполнения явных арифметических операций над датой и временем. Платформа
Rails определяет объект days как расширение класса
Fixnum, представляющего целые
числа. Этот метод возвращает объект Duration, который действует как число; исполь
зуется в качестве значения, эквивалентного 604800, т.е. количеству секунд в семи днях.
Если проверить его в отладчике, он опишет себя как "7 дней". 21
Язык Ruby упрощает разработку "доменных языков" (например, DSL), мини-язы
ков, которые на самом деле являются подмножеством языка Ruby, но которые рассма
триваются как специализированные системы конфигурации. Например, язык Ruby DSL
используется в средствах настройки Chef и Puppet.
Инсталляция
В некоторых системах язык Ruby установлен по умолчанию, а в некоторых - нет.
Тем не менее он всегда доступен как пакет, часто в нескольких версиях.
На сегодняшний день (версия 2.3) язык Ruby поддерживает относительно хорошую
совместимость со старым кодом. В отсутствие конкретных предупреждений обычно луч
ше всего установить самую последнюю версию.
name = 'Gwen'
rating = 10
characters [ 'SpongeBob', 'Patrick', 'Squidward' ]
elements = { З => 'lithium', 7 => 'carbon', 5 => 'boron'
ность. (Обратите внимание на то, что некоторые из вызовов функции печати включают
в себя несколько аргументов, разделенных запятыми.)
В нескольких случаях мы использовали фигурные скобки # { } скобки для интерполя
ции значений переменных, заключенные в строках с двумя кавычками. Такие скобки мо
гут содержать произвольный код Ruby; любое значение. созданное кодом, автоматически
преобразуется в тип строки и вставляется во внешнюю строку. Вы также можете конка
тенировать строки с помощью оператора +. но интерполяция обычно более эффективна.
Строка, вычисляющая element_names, иллюстрирует еще несколько возможностей
языка Ruby:
element_names = elements.values.sort! .map (&: upcase) .join (', ')
Это серия вызовов методов, каждый из которых работает с результатом, возвра
щаемым предыдущим методом, подобно конвейеру. Например, метод values объек
та elements создает массив строк, которые затем сортируются в алфавитном порядке
функцией sort ! . 23 Метод map класса Array вызывает метод upcase для каждого эле
мента, а затем снова собирает все результаты в новый массив. Наконец, метод j oin
объединяет элементы этоrо массива, чередующиеся с запятыми, для создания строки.
Блоки
В предыдущем коде текст между do и end представляет собой блок, известный в дру
гих языках как лямбда-функция, замыкание или анонимная функция. 24
22 Есть также функция puts, которая добавляет символы перехода на новую строку автоматически,
но она, возможно, слишком изощренная. Если вы попытаетесь самостоятельно добавить символ
перехода на новую строку, функция puts не будет вставлять эти символы автоматически.
2 .~восклицательный знак в имени функции sort! предупреждает вас, что при использовании этого
метода нужно быть осторожным. Это не синтаксическое правило, а просто часть имени метода.
В данном случае функция sort ! сортирует массив на месте. Существует также метод sort без
восклицательного знака, который возврашает элементы в новом отсортированном массиве.
24 Фактически в языке Ruby существуют три объекта этого общего типа, известные как блоки,
процедуры и лямбда. Различия меЖдУ ними незначительны и не важны для этого обзора.
Глава 7. Сценарии и командная оболочка 257
Оператор each выглядит как функция языка, но это всего лишь метод, определя
емый хешами. Оператор each принимает блок как аргумент и вызывает его один раз
для каждой пары ключ-значение, содержащей хеш. Этот тип итерационной функции,
используемой в сочетании с блоком, очень характерен для кода на языке Ruby. Имя
each является стандартным именем обобщенных итераторов, но многие классы опреде
ляют более конкретные версии, такие как each _ line или each_ character.
В языке Ruby есть альтернативный синтаксис для блоков, в котором в качестве раз
делителей используются фигурные скобки, а не do ... end. Он означает точно то же са
мое, но больше похож на часть выражения. Например,
characters.map {1 с 1 c.reverse} # ["boBegnopS", "kcirtaP", "drawdiuqS"]
Эта форма функционально идентична character. map ( & : reverse) , но вместо того,
чтобы просто указывать методу map, какой метод вызывать, мы включили явный блок,
вызывающий обратный метод.
Значение блока - это значение последнего выражения, которое оно вычисляет
до завершения. Удобно, что почти все в языке Ruby является выражением (т.е. "фраг
ментом кода, который может быть выполнен для создания значения"), включая струк
туры управления, такие как case (аналог конструкции swi tch в большинстве языков)
и if-else. Значения этих выражений отражают значение, полученное в зависимости
от того, какой из разделов case или ветви инструкции if-else был выполнен.
Блоки имеют много применений, помимо итераций. Они позволяют одной функции
выполнять процедуры настройки и удаления от имени другого раздела кода, поэтому
они часто представляют собой многоэтапные операции, такие как транзакции баз дан
ных или операции с файловой системой.
Например, следующий код открывает файл /etc/passwd и выводит строку, опреде
ляющую учетную запись root:
open '/etc/passwd', 'r' do 1file1
file.each_line do llinel
print line if line.start with? 'root:'
end
end
Функция open открывает файл и передает его объект IO во внешний блок. После
того как блок завершит работу, файл откроется автоматически. Нет необходимости
в отдельной операции закрытия (хотя она существует, если вы хотите ее использовать),
и файл закрывается независимо от того, как завершается внешний блок.
Применяемая здесь постфиксная конструкция i f может быть знакома тем, кто ис
пользовал язык Perl. Это хороший способ выразить простые условные обозначения без
сокрытия основного действия. Здесь сразу видно, что внутренний блок представляет со
бой цикл, который выводит некоторые строки.
В случае, если структура аргумента line функции print не ясна, в нее снова вклю
чаются необязательные круглые скобки. Оператор i f имеет самый низкий приоритет
и использует один метод вызова для обоих вариантов:
Как и в случае метода sort ! , знак вопроса представляет собой соглашение об именах
методов, возвращающих логические значения.
Символы так часто используются в качестве хеш-ключей, что в версии Ruby 2.0
определили альтернативный синтаксис для хеш-литералов, чтобы уменьшить количе
ство знаков препинания. Стандартный хеш
h = { :animal => 'cat', :vegetaЫe => 'carrot', :mineral => 'zeolite'}
можно написать в стиле Ruby 2.0 следующим образом:
h = { animal: 'cat', vegetaЫe: 'carrot', mineral: 'zeolite'}
Вне этого хеш-литерального контекста символы сохраняют свои префиксы : везде,
где они появляются в коде. Например, вот как получить конкретные значения из хеша:
healthy_snack = h[:vegetaЫe] # 'carrot'
В языке Ruby принято своеобразное, но мощное соглашение для обработки пара
метров в вызовах функuий. Если вызываемая функuия запрашивает такое поведение,
язык Ruby сdбирает завершающие аргументы вызова, которые напоминают хеширо
ванные пары, в новый хеш. Затем он передает этот хеш функuии в качестве аргумента.
Например, в выражении, допустимом на платформе Rails,
file_field_tag :upload, accept: 'application/pdf', id: 'commentpdf'
функuия f ile _ f ield_ tag получает только два аргумента - символ : upload и хеш, со
держащий ключи : accept и : id. Поскольку хеш и не имеют жесткого порядка, неваж
но, в каком порядке появляются параметры.
Глава 7. Сценарии и командная оболочка 259
Этот тип гибкой обработки аргументов проявляется в стандарте языка Ruby и дру
гими способами. Библиотеки Ruby, включая стандартную библиотеку, как правило, де
лают все возможное, чтобы принять максимально широкий диапазон входных данных.
Скаляры, массивы и хеши часто ямяются равноправными аргументами, и многие функ
ции можно вызывать с помощью блоков или без них.
Для того чтобы получить доступ к компонентам соответствия, явно вызовите метод
match регулярного выражения. Он возвращает либо nil (если соответствий нет), либо
объект, к которому можно получить доступ в виде массива компонентов.
if m = /(лH\w*)\s/.match("Heinrich Hoffmeyer headed this heist")
puts m[O] # 'Heinrich'
end
Рассмотрим предыдущую программу для определения цвета костюма гнома на языке
Ruby.
suits = {
Bashful: 'yellow', Sneezy: 'brown', Doc: 'orange', Grumpy: 'red',
Dopey: 'green', Нарру: 'Ыuе', Sleepy: 'taupe'
if matches.any?
dwarf, color = matches.first
print "%s\'s dwarf suit is %s.\n" %
[ dwarf.to_s.sub(pat, ' \1 '), color.sub(pat, ' \1 ')
else
print "No dwarves or dwarf suits matched the pattern.\n"
end
Метод select, примененный к коллекции, создает новую коллекцию, включаю
щую только те элементы, для которых предоставленный блок имеет значение как true.
В этом случае совпадения представляют собой новый хеш, содержащий только пары,
мя которых либо ключ, либо значение соответствует шаблону поиска. Поскольку
мы применили ленивый вызов (lazy), фильтрация на самом деле не произойдет, пока мы
не попытаемся извлечь значения из результата. Фактически этот код проверяет столько
пар, сколько необходимо мя поиска соответствия.
Вы заметили, что оператор =- сопостамения с образцом использовался на символах,
которые представляют имена гномов? Он работает, потому что оператор =- достаточно
умен, чтобы перед сопостамением преобразовать символы в строки. К сожалению, при
260 часть 1. Основы администрирования
Оператор % для строк работает аналогично такому же оператору в языке Python; это
версия функции sprintf в языке Ruby. Здесь есть два компонента для заполнения, по
этому мы передаем значения как двухэлементный массив.
Несколько сред
Команда pip и bundle успешно осуществляют управление зависимостями для от
дельных программ Python и Ruby, но что, если две программы на одном сервере имеют
противоречивые требования?
В идеале каждая программа в производственной среде будет иметь собственную би
блиотечную среду, которая не зависит от системы и всех других программ.
2 ~nакеты в языке Ruby моrут содержать команды на уровне оболочки. Однако у них обычно
нет справочных страниu; для получения подробных сведений о пакете выполните команду
bundle help или обратитесь к полной документаuии на сайте bundler. io"
2 ''Или, по крайней мере, это поведение по умолчанию. При необходимости в файле Gelllfile леrко
указывать различные требования к средам разработки и развертывания.
27 Некоторые программные пакеты, такие как Rails, являются совместимыми с менеджером Buпdler
и моrут использовать локально установленные пакеты даже без выполнения команды ехес
bundle.
Глава 7. сценарии и командная оболочка 263
$ virtualenv myproject
New python executaЫe in /home/ulsah/myproject/bin/python
Installing setuptools, pip, wheel ... done.
Каждая виртуальная среда имеет каталог Ьin/, содержащий двоичные файлы
Д11Я виртуальных сред Python и PIP. Когда вы запускаете один из этих двоичных файлов,
вы автоматически помещаетесь в соответствующую виртуальную среду. Установите па
кеты в среду, как обычно, запустив копию команды pip в виртуальной среде.
Для того чтобы запустить виртуализованную программу Python из демона cron или
из сценария запуска системы, явно укажите путь к правильной копии python. (В каче
стве альтернативы поместите путь в строку сценария.)
При интерактивной работе в оболочке можно запустить сценарий Ьin/activate
виртуальной среды, чтобы установить версии утилит python и pip в виртуальной сре
де по умолчанию. Сценарий перестраивает переменную РАТН вашей оболочки. Для того
чтобы покинуть виртуальную среду, используйте команду deactivate.
Виртуальные среды привязаны к определенным версиям Python. Во время создания
виртуальной среды вы можете установить связанный двоичный код Python с помощью па
раметра --python virtualenv. В результате будет устаномен бинарный файл Python.
активирует Ruby версии 2.3.0 и набор пакетов под названием ulsah. Ссьmки на утилиты
ruby или
gem теперь разрешаются в рамках указанных версий. Этот пример также ра
ботает Д11Я программ, устаноменных пакетами, такими как bundle и rails. К счастью,
упрамение пакетами не изменилось; просто используйте пакет или комплект, как обыч
но, и все вновь устаноменные пакеты автоматически попадут в нужное место.
28 Как и в случае с другими командами, связанными с языком Pythoп, существуют версии команды
virtualenv с числовыми суффиксами, которые поступают с определенными версиями Pythoп.
264 Часть 1. Основы администрирования
#!/usr/bin/env ruby
Символы #! в стандартном Ruby видят только системные пакеты. Следующий вариант
более гибкий:
#!/usr/bin/env ruby
Он находит команду ruЬy в соответствии с контекстом RVM пользователя, который его
запускает.
Команда rvm install устанавливает новые версии языка Ruby. Эта функция RVМ
позволяет легко устанавливать несколько разных версий Ruby. Ее следует предпочесть
собственным пакетам Ruby вашей операционной системы, которые редко обновляются.
Команда rvm install загружает двоичные файлы, если они доступны. Если нет, она
устанавливает необходимые пакеты операционной системы, а затем строит Ruby из ис
ходного кода.
Вот как мы можем настроить развертывание приложения Rails, которое, как извест
но, совместимо с Ruby 2.2. l.
$ rvm install ruЬy-2.2.1
Searching for binary rubies, this might take some time.
No binary rubies availaЫe for: ubuntu/15.10/x86_64/ruby-2.2.1.
Continuing with compilation. Please read 'rvm help mount' to get more
information on binary rubies.
Checking requirements for ubuntu.
Installing required packages: gawk, libreadlineб-dev, zliЬlg-dev,
libncurses5-dev, automake, libtool, bison, libffi-dev ............... .
Requirements installation successful.
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.2.1, this
may take а while depending on your cpu(s) ...
Если вы установили RVM, как описано выше, система Ruby устанавливается в ката
логе /usr/local/rvm и доступна для всех учетных записей в системе.
Для поиска версии RVM следует использовать команду rvm first known, которая,
как известно, знает, как выполнять загрузку и сборку. Команда rvm list выводит спи
сок уже установленных и доступных для использования пакетов RVM.
$ cd myproject.rails
$ rvm ruЬy-2.2.l@myproject --create --default --ruЬy-version
ruby-2.2.1 - #gemset created /usr/local/rvm/gems/ruby-2.2.l@myproject
ruby-2.2.1 - #generating myproject wrappers ......... .
$ gem install bundler
Fetching: bundler-1.11.2.gem (100%)
Successfully installed bundler-1.11.2
1 gem installed
$ bundle
Fetching gem metadata from https://rubygems.org/ .......... .
Fetching version metadata from https://rubygems.org/ .. .
Fetching dependency metadata from https://rubygems.org/ ..
Resolving dependencies ..... .
/usr/local/rvm/wrappers/ruЬy-2.2.l@myproject/ruЬy
Системы контроля версий решают ряд проблем. Во-первых, они определяют орга
низованный способ отслеживания истории изменений в файле, чтобы эти изменения
можно было понять в контексте и чтобы можно было восстановить более ранние вер
сии. Во-вторых, они расширяют концепцию версий выше уровня отдельных файлов.
Связанные группы файлов могут быть сопоставлены вместе с учетом их взаимозависи
мостей. Наконец, системы контроля версий координируют действия нескольких редак
торов, поэтому условия гонки не могут привести к тому, что чьи-либо изменения будут
окончательно потеряныJ 0 , и поэтому несовместимые изменения от нескольких редакто
ров не станут активными одновременно.
10 Например, предположим, что системные администраторы Алиса и Боб оба редактируют один и
тот же файл и каждый из них вносит некоторые изменения. Алиса сохраняет файл первой. Когда
Боб сохраняет свою копию файла. он перезаписывает версию Алисы. После того как Алиса выйдет
из редактора, ее изменения полностью и бесследно исчезнут.
Глава 7. Сценарии и командная оболочка 267
Система Git обладает сотнями функций и может быть довольно сложной в использо
вании. Тем не менее большинство пользователей Git обойдутся лишь несколькими про
стыми командами. Особые ситуации лучше всего обрабатывать путем поиска в Google
описания того, что вы хотите сделать (например, "git undo last commit"). В первую оче
редь Google, конечно же, предложит посетить сайт Stack Overflow и найти дискуссию,
которая точно соответствует вашей ситуации. Прежде всего, не паникуйте. Даже если
вам кажется, что вы испортили хранилище и удалили результаты работы за последние
несколько часов, в системе Git, скорее всего, есть скрытая копия. Вам просто нужно ис
пользовать флан reflog и найти ее.
Прежде чем вы начнете использовать систему Git, укажите свое имя и адрес элек
тронной почты:
лища. Файлы в индексе имеют содержимое, и в зависимости от того, какие команды вы вы
полняете, это содержимое может отличаться как от хранилища, так и от рабочего каталога.
Команда git add на самом деле просто означает "ер из рабочего каталога в индекс".
Команда gi t commi t вводит содержимое индекса в хранилище. Для каждой фикса
ции требуется сообщение журнала. Флаг -m позволяет включить сообщение в команд
ной строке. Если вы оставите это, команда gi t запустит для вас редактор.
Теперь внесите изменения и проверьте их в хранилище.
$ vi super-script.sh
$ git commit super-script.sh -m 11 маdе the script more super"
[master 67514fl] Made the script more super
1 file changed, 1 insertions(+), О deletions(-)
Именование модифицированных файлов в командной строке gi t commi t обходит
обычное использование Git индекса и создает вариант, который включает только изме
нения в указанные файлы. Существующий индекс остается неизменным, и система Git
игнорирует любые другие файлы, которые могут быть изменены.
Если изменение связано с несколькими файлами, существуют несколько вариантов.
Если вы точно знаете, какие файлы были изменены, вы всегда можете их перечислить
в командной строке, как показано выше. Если вы ленивы, то можете выполнить команду
git commit -а, чтобы система Git добавляла все измененные файлы в индекс перед вы
полнением фиксации. Однако у этого последнего варианта есть пара подводных камней.
Во-первых, могут быть изменены файлы, которые вы не хотите включать в фикса
цию. Например, если у сценария super-script. sh был файл конфигурации, и вы из
менили этот файл конфигурации для отладки, вы можете не захотеть перенести изме
ненный файл обратно в хранилище.
Вторая проблема заключается в том, что команда git commit -а выбирает только
изменения в файлах, которые в настоящее время находятся под управлением системы
контроля версий. Он не отображает новые файлы, которые вы, возможно, создали в ра
бочем каталоге.
Для обзора состояния системы Git вы можете выполнить команду get status. Эта
команда сообщает вам о новых, измененных и индексированных файлах. Например,
предположим, что вы добавили сценарий more-scripts/another-script. sh.
Система Git может показать следующее.
$ git status
On branch master
Changes not staged for commit:
(use "git add <file> ... " to update what will Ье committed)
(use "git checkout -- <file> ... " to discard changes in working directory)
modified: super-script.sh
Untracked files:
(use "git add <file> ... " to include in what will Ье committed)
more-scripts/
tmpfile
no changes added to commit (use "git add" and/or "git commit -а")
Сценарий another-script. sh не указан по имени, потому что система Git еще не
видит каталог more-scripts, который его содержит. Вы можете видеть, что сценарий
super-script. sh был изменен, а также увидеть файл tmpfile, который, вероятно, не
должен быть включен в хранилище. Вы можете выполнить команду gi t diff super-
script. sh, чтобы увидеть изменения, внесенные в сценарий. Команда gi t предлагает
команды для следующих операций, которые вы можете выполнить.
глава 7. Сценарии и командная оболочка 269
$ git add .
$ sudo git commit -m "Ignore tmpfile; Add another-script.sh to the repo"
Created commit 32978еб: Ignore tmpfile; add another-script.sh to the repo
2 files changed, 2 insertions(+), О deletions(-)
create mode 100644 .gitignore
create mode 100755 more-scripts/another-script.sh
Обратите внимание на то, что сам файл . gi tignore становится частью управляемого
набора файлов, который обычно вы хотите. Зачастую приходится повторно добавлять фай
лы, которые уже находятся под контролем, поэтому команда gi t add - это простой способ
сказать: "Я хочу, чтобы образ нового хранилища выглядел как рабочий каталог, за исключе
нием того, что указано в . gi tignore". В этой ситуации нельзя просто выполнить команду
gi t commi t -а, потому что она не найдет файлы another-script. sh и . gi tignore; эти
файлы являются новыми Д11Я системы Git и поэтому должны быть явно добавлены.
Ловушки Git
Для того чтобы заставить вас думать, что система Git управляет файлами разреше
ний, а также их содержимым, она показывает вам режимы файлов при добавлении но
вых файлов в хранилище. Это неправда; система Git не отслеживает режимы, владель
цев или время модификации.
Система Git отслеживает бит исполнения. Если вы выполняете сценарий с установ
ленным битом исполнения, любые будущие клоны также исполняются. Однако не сле
дует ожидать, что система Git будет отслеживать право собственности или статус "только
Д11Я чтения". Следствием является то, что вы не можете рассчитывать на использование
системы Git для восстановления сложных иерархий файлов в ситуациях, когда важны
права собственности и разрешения.
Другим следствием является то, что в хранилище Git никогда нельзя включать простые
текстовые пароли и другие секреты. Они не только открыты Д11Я всех, кто имеет доступ
к хранилищу, но также могут бьпь непреднамеренно распакованы в форме, доступной миру.
изменения, либо для дальнейшей интеграции с основным проектом, либо для соз
дания совершенно отдельного пути разработки.
7.9. ЛИТЕРАТУРА
• BRooкs, FREDER1cк Р. JR. The Mythical Man-Month: Essays оп Software Engineering.
Reading, МА: Addisoп-Wesley, 1995.
• СнлсоN, Sсотт, AND SтRAuв, BEN. Pro Git, 2nd edition. 2014. git-scm. com/book/
en/v2. Исчерпывающая книга о Pro Git, свободно опубликованная по лицензии
Creative Commons.
• Roвв1Ns, ARNOLD, AND №LsoN Н. F. ВЕЕВЕ. Classic Shell Scrlpting. Sebastopol, СА:
O'Reilly Media, 2005. Книга, посвященная традиционному (и переносимому) диа
лекту оболочки Boume. Она также содержит довольно много информации об ути
литах sed и awk.
• PoWERs, SнELLEY, JERRY РЕЕК, Т1м O'REILLY, AND М1кЕ LotJКIDES. Unix Power Too/s, (Зrd
Edition), Sebastopol, СА: O'Reilly Media, 2002. Классическая книга о системе UNIX,
охватывающая много вопросов, в том числе сценарии для оболочки sh и работу
с командной строкой. Некоторые разделы несколько устарели, но материал, каса
ющийся оболочек, остается актуальным.
• SoвELL, МдRК G. А Practical Guide to Linux Commands, Editors, and Shell Programming.
Upper Saddle River, NJ: Prentice На\\, 2012. Книга заслуживает внимания, посколь
ку в ней описываются оболочки tcsh и bash.
• Sноттs, W1LL1лм Е., JR. The Linux Command Line: А Complete lntroduction. San
Francisco, СА: No Starch Press, 2012. Книга посвящена оболочке bash, но в ней
также есть материал об интерактивной работе и программировании. Большая
часть материала относится к системам UNIX и Linux.
• Вшм, R1снлRо, AND CнR1sпNE BRESNAHAN. Linux Command Line and Shell Scripting
ВiЬ/е (Зrd Edition). lndianapo\is, IN: John Wiley & Sons, Inc. 2015. Книга посвящена,
в основном, оболочкам, в частности оболочке bash.
• CooPER, MENDEL. Advanced Bash-ScriptingGuide. www.tldp.org/LDP/abs/html.
Свободно распространяемая и легко доступная в Интернете книга. Несмотря на ее
название, новички ее легко поймут благодаря множеству хороших примеров.
Регулярные выражения
• FRIEDL, JEFFREY. Mastering Regular Expressions (Зrd Edition), Sebastopol, СА: O'Reilly
Media, 2006.
• GovvлERтs, JлN AND SтEVEN LЕvпнлN. Regular Expressions Cookbook. Sebastopol, СА:
O'Reilly Media, 2012.
272 Часть 1. Основы администрирования
• KRUMINS, PEТERIS. Perl Oпe-Liпers: 130 Prograтs That Get Thiпgs Dопе. San Francisco,
СА: No Starch Press, 2013.
Python
• SwEIGART, AL. Аиtотаtе the Boriпg Stиff with Pythoп: Practical Prograттiпg for Total
Begiппers. San Francisco, СА: No Starch Press, 2015. Удачное введение в програм
мирование на языке Python 3 и программирование в целом. Содержит множество
примеров системного администрирования.(Эл СвЕйГАРТ. Автоматизация рутинных
задач с помощью Pythoп: практическое руководство для начинающих, пер. с англ.,
изд. "Диалектика", 2016.)
• PtLGRIM, MARK. Dive /пtо Pythoп. Berkeley, СА: Apress, 2004. Классическая книга
о языке Python 2, свободно доступная на веб-сайте di veintopython. net.
• P1LGRIM, МАRк. Dive /пtо Pythoп 3. Berkeley, СА: Apress, 2009. Dive lnto Python updated
for Python 3. Книга свободно доступна на веб-сайте di veintopythonЗ. net.
• Luтz, МлRк. Learпiпg Pythoп, 5th Editioп. O'Reilly, 2013. Фундаментальная книга о
языке Python.(MAPK ЛУГц. Изучаем Pythoп, 5-е издание, в двух томах, пер. с англ"
изд. "Диалектика", 2019.)
• RАмлLно, Luc1лNo. F/иепt Pythoп. Sebastopol, СА: O'Reilly Media, 2015. Advanced,
idiomatic Python 3.
• BEAZLEY, Dлvю, AND BRtAN К. JoNES. Pythoп Cookbook (3rd Editioп), Sebastopol, СА:
O'Reilly Media, 2013. Covers Python 3.
• Gtтт, Nолн, AND JEREMY М. JoNEs. Pythoп for Uпix апd Liпих Systeт Adтiпistrators,
Sebastopol, СА: O'Reilly Media, 2008.
Ruby
• FLANAGAN, Dлvю, AND Уuк1н1Rо Млтsuмото. The RиЬу Prograттiпg Laпgиage.
Sebastopol, СА:O'Reilly Media, 2008. Классическая, исчерпывающая и хорошо на
писанная книга о языке Ruby из первых рук. Она уже немного устарела и не учи
тывает Ruby 2.0 и более новые версии; однако языковые различия между ними яв
ляются минимальными.
• ВLАск, Dлvю А. The Well-Groипded Rиbyist (2пd Editioп). Shelter lsland, NY: Manning
PuЫications,2014. Не бойтесь названия, которое может отпугнуть новичков; это
хорошая, основательная книга о языке Ruby 2.1.
• Тномлs, DAVE. Prograттiпg RиЬу 1.9 & 2.0: 1he Pragmatic Prograттer's Gиide (4th Editioп).
Pragmatic Вookshelf, 2013. Classic and frequently updated.
• FuLтoN, HAL. The RиЬу Way: Solиtioпs апd Techпiqиes iп RиЬу Prograттiпg (3rd Editioп).
Upper Saddle River, NJ: Addison-Wesley, 2015. Еще один классический и современ
ный справочник по языку Ruby, с легким философским уклоном.
глава 8
Управление учетными
записями пользователей
Регистрационное имя
Регистрационные имена (называемые также именами пользователей) должны быть
уникальными и в зависимости от системы могут иметь ограничения на длину и набор
символов. В настоящее время во всех версиях систем UNIX и Linux эта длина не превы
шает 32 символа.
Пользовательские имена не могут содержать двоеточия и символы новой строки, по
скольку эти символы применяются в качестве разделителей полей и записей соответ
ственно в файле passwd. В зависимости от системы на пользовательские имена могут
быть наложены и другие ограничения. В системе Ubuntu эти ограничения наиболее
слабые, поскольку они допускают имена, начинающиеся или целиком состоящие из
чисел и других специальных символов.' По многочисленным причинам, которые было
бы слишком долго объяснять, мы рекомендуем ограничивать допустимый диапазон ре
гистрационных имен алфавитно-цифровыми символами, использовать только нижний
регистр и начинать имена с буквы.
Регистрационные имена чувствительны к регистру. Нам неизвестны случаи. ког
да смешение регистров в именах приводило бы к возникновению проблем, но имена,
Зашифрованные пароли
Исторически системы шифровали пароли пользователей с помощью алгоритма
DES. По мере увеличения вычислительной мощности эти пароли стали тривиальными
для взлома. Затем системы перешли на скрытые пароли и криптографию на основе алго
ритма MD5. Теперь, когда в алгоритме MD5 были обнаружены значительные недостатки,
текущим стандартом стало хеширование паролей с помощью криптографической "соли"
на основе алгоритма SHA-512 (см. документ Guide to Cryptography на веб-сайте owasp. org).
Наши иллюстративные системы поддерживают множество алгоритмов шифрования,
но все они по умолчанию соответствуют алгоритму SHA-512. Если вы не обновляете си
стемы из более старых версий, вам не нужно обновлять выбор алгоритма .
•
(ё'Ф
В системе FreeBSD
ровать с помощью файла
В системах Deblan и
алгоритм, заданный по умолчанию, можно модифици
/etc/login. conf.
Ubuntu
модифицировать с помощью файла
алгоритм, заданный по умолчанию, можно было
/etc/login.defs,
подключаемых модулей аутентификации РАМ, этот подход стал устаревшим.
Политики установления паролей по умолчанию, включая выбор алгоритма
но после появления
2 Стандарт RFC5321 требует, чтобы локальная часть адреса (т.е. часть перед знаком @) считалась
$ chage -d О имя_пользователя
Качество пароля - еще одна важная проблема. Теоретически более длинные пароли
более безопасны, как и пароли, содержащие разнотипные символы (например, пропис
ные буквы, знаки препинания и цифры).
Большинство систем позволяют устанавливать стандарты построения паролей
для пользователей, но имейте в виду, что пользователи могут умело обойти эти требо
вания, если найдут их чрезмерными или обременительными. Стандарты, используемые
нашими иллюстративными системами, приведены в табл. 8.1.
'Дополнительную информаuию по этой проблеме см. по адресу xkcd. сот/ comi cs /password _
strength. png.
278 Часть 1. Основы администрирования
Идентификатор пользователя
Ш Дополнительную информацию об учетной записи пользователя root см. в разделе 3.1.
По определению идентификатор пользователя root равен нулю. Большинство си
стем также определяют псевдопользователей, например Ьin и daemon, как владельцев
команд или файлов конфигурации. Эти фиктивные регистрационные имена принято
указывать в начале файла /etc/passwd, присваивая им низкие идентификаторы UID
и назначая для них фиктивную оболочку (например, /Ьin/false), чтобы никто не мог
войти в систему под этими именами.
Для того чтобы зарезервировать достаточно места для будущих фиктивных пользо
вателей, мы рекомендуем назначать UID для реальных пользователей начиная с \ООО
или выше. (Желаемый диапазон для новых UID можно указать в файлах конфигурации
с помощью параметров команды useradd.) По умолчанию наши системы ссылокLinux
присваивают идентификаторы UID, начиная с 1000. Система FreeBSD присваивает пер
вому реальному пользователю UID, равный 1001, а затем добавляет единицу для каждо
го нового пользователя.
группа Ьin имеет идентификатор GJD, равный 1, в системах Red Hat, CentOS и GID,
равный 2, - в системах Ubuntu, Deblan и GJD, равный 7, - в системе FreeBSD.
В те далекие времена, когда компьютеры были еще дорогим удовольствием, группы
использовались для учета машинного времени, чтобы время работы центрального про
цессора, время, затраченное на регистрацию, и использованное дисковое пространство
Поле GECOS
Это поле иногда используется для хранения персональной информации о каждом
пользователе. Оно является наследием некоторых из ранних версий системы UNIX,
использовавших для разных целей семейство операционных систем General Electric
Comprehensive Operating Systems. Оно не имеет четко определенного синтаксиса.
В принципе структура поля G ECOS может быть произвольной, а ее элементы разделя
ются запятыми и размещаются в следующем порядке:
Домашний каталог
Войдя в систему, пользователь попадает в свой домашний каталог. Именно в домаш
них каталогах оболочки регистрации ищут информацию, связанную с учетной записью,
280 Часть 1. Основы администрирования
Следует иметь в виду, что если домашние каталоги смонтированы вне файловой си
стемы, то в случае проблем с сервером или с самой сетью они могут оказаться недо
ступными. Если на момент регистрации этот каталог отсутствует, выводится сообщение
вроде no home directory (домашний каталог отсутствует) и пользовательские данные
помещаются в каталог /. 4 В качестве альтернативы регистрацию можно отключить со
всем с учетом системной конфигурации. Более подробно домашние каталоги описыва
ются в разделе 8.6.
Регистрационная оболочка
В качестве регистрационной оболочки, как правило, задается интерпретатор команд,
но в принципе это может быть любая программа. По умолчанию для системы FreeBSD
используется интерпретатор sh, а для системы Linux - интерпретатор bash (GNU-
версия оболочки sh).
В некоторых системах пользователи могут менять интерпретатор с помощью коман
ды chsh, но, подобно chfn, эта команда может не работать, если для управления ре
гистрационной информацией вы используете базу данных LDAP или какую-либо иную
службу каталогов. Если вы используете файл /etc/passwd, системный администратор
всегда может заменить интерпретатор пользователя, отредактировав файл passwd с по
мощью программы vipw.
• регистрационное имя;
• зашифрованный пароль;
4 Это сообщение появляется при регистрации в системе через консоль или терминал, но не через
экранный диспетчер, такой как xdm, gdm или kdm. В последнем случае пользователь вообще
будет немедленно выведен из системы, поскольку программа-диспетчер не сможет осуществить
• количество дней по истечении срока действия пароля, когда учетная запись анну-
лируется;
Лишь первые два поля обязательно должны быть заполнены. Поля дат в файле
/ etc/ shadow задаются в виде числа дней (а не секунд), прошедших с 1 января 1970 года,
что не является стандартным способом вычисления времени в системах UNIX и Linux. 5
Типичная запись выглядит так.
millert:$6$iTEFbMTM$CXmxPwErbEef9RUBvflzv8EgXQdaZg2eOd5uXyvt4sFzi6G41
IqavLilTQgniAHm3Czw/LoaGzoFzaМm.Yw01/:16971:0:180:14:::
• В пятом поле задано максимальное число дней между двумя изменениями паро
ля. С помощью этой установки администраторы заставляют пользователей менять
свои пароли (подробнее механизм устаревания паролей описан в разделе 27.4).
В системе Linux максимальное время жизни пароля определяется суммой значе
ний данного и седьмого (льготный период) полей.
• В восьмом поле задан день, в который истекает срок действия учетной записи
(считая от 1 января 1970 года). По прошествии этой даты пользователь не смо
жет зарегистрироваться в системе, пока администратор не сбросит значение поля.
Если поле оставлено пустым, учетная запись всегда будет активной. 6
• Чтобы установить поле даты истечения срока, можно использовать команду
usermod (даты здесь должны быть в формате гггг-мм-дд).
• Девятое поле зарезервировано на будущее. 7
Теперь, когда назначение полей понятно, вернемся к рассмотренному выше примеру.
millert:$6$iTEFbMTM$CXmxPwErbEef9RUBvflzv8EgXQdaZg2eOd5uXyvt4sFzi6G41
IqavLilTQgniAHm3Czw/LoaGzoFzaМm.Yw01/:17336:0:180:14:::
5 При этом вы можете преобразовать секунды в дни с помощью команды expr 'date+'iss' / 86400.
6 Седьмое поле в книге не описано.- Примеч. ред.
7 Возможно, это поле никогда не будет использовано.
282 Часть 1. Основы администрирования
В этой записи говорится о том, что пользователь millert последний раз менял свой
пароль 19 июня 2017 года. Следующий раз пароль должен быть изменен через 180 дней.
За две недели до этого пользователь начнет получать предупреждения о необходимости
сменить пароль. Учетная запись не имеет срока действия.
С помощью утилиты pwconv можно согласовать содержимое файлов shadow
и passwd, выявляя и удаляя пользователей, не указанных в файле passwd.
• класс регистрации;
Класс регистрации (если он указан) относится к записи в файле /etc/ login. conf.
Этот класс определяет ограничения потребления ресурсов и управляет множеством дру
гих параметров (см. следующий раздел).
Поле времени изменения пароля отражает возраст пароля. Он содержит время в секун
дах с момента UNIX, после которого пользователь будет вынужден изменить свой пароль.
Вы можете оставить это поле пустым, указав, что пароль будет действовать вечно.
Время истечения срока действия учетной записи означает время и дату (в секундах,
как и для момента истечения срока действия пароля), по прошествии которого истекает
срок действия учетной записи пользователя. Пользователь не может войти в систему по
сле этой даты, если поле не будет сброшено администратором. Если это поле оставлено
пустым, учетная запись останется действительной.
Глава 8. Управление учетными записями пользователей 283
sysadrnin:\
:ignorenologin:\
:requirehome@:\
:maxproc=unlimited:\
:openfiles=unlimited:\
:tc=default:
Пользователи, имеющие класс регистрации sysadmin, могут войти в систему, даже
если их имя указано в файле /var/run/noloqin и у них может не быть рабочего домаш
него каталога (этот параметр позволяет регистрацию, когда система NFS не работает).
Пользователи класса sysadmin могут запускать любое количество процессов и открывать
любое количество файлов.~ Последняя строка записывает информацию в запись defaul t.
Хотя система FreeBSD имеет разумные стандартные значения, может возникнуть
необходимость обновить файл / etc/ loqin. conf, чтобы установить предупреждения
об истечении времени ожидания или об истечении срока действия пароля. Например,
чтобы установить время ожидания равным 15 мин. и вьщавать предупреждения за семь
дней до истечения срока действия паролей, необходимо добавить следующие элементы
в запись default:
warnpassword=7d:\
: idletime=l5m:\
Если вы изменяете файл / etc/ loqin. conf, вы также должны выполнить следую
щую команду для компиляции ваших изменений в хешированную версию файла, кото
рую система фактически использует в повседневной работе:
$ cap_lllkdЬ /etc/loqin.conf
• имя группы;
• идентификатор группы;
вать использованию групп как таковых, а просто создать более ограничительную группу
по умолчанию для каждого пользователя, чтобы файлы не бьmи предоставлены для совмест
ного пользователя непреднамеренно. Можно также ограничить доступ к вновь созданным
файлам и каталогам, установив маску umask по умолчанию вашего пользователя в файле
запуска по умолчанию, например /etc/profile или /etc/bashrc (см. раздел 8.6).
m Дополнительную информацию о программе sudo см. в разделе 3.2.
Членство в группах также может служить маркером для других контекстов или при
вилегий. Например, вместо того, чтобы вводить имя пользователя каждого системного
администратора в файл sudoers, вы можете настроить программу sudo так, чтобы все
члены группы "admiп" автоматически имели привилегии sudo.
В системе Liпux для создания, изменения и удаления групп предусмотрены
• Система
pw.
FreeBSD для выполнения всех этих функций использует команду
Чтобы добавить пользователя dan в группу staff,
что изменение было правильно реализовано, необходимо выполнить следу
ющие команды:
staff:*:20:dan,evi,garth,trent,ben
• Обязательные этапы:
• отредактировать файлы passwd и shadow (или файл master. passwd в систе
ме FreeBSD), чтобы создать учетную запись пользователя;
• Пользовательские этапы:
• Административные этапы:
Для выполнения этого списка действий необходимо иметь сценарий или утилиту,
и во всех наших иллюстративных системах они предусмотрены в виде команд adduser
и useradd.
''Если сначала выполнить команду vipw (или vigr), системы Ubuntu и Deblan предложат вам
выбрать одну из команд vim.basic, vim. tiny, nano или ed. Если впоследствии вы передумаете,
выполните команду select-editor.
Глава 8. Управление учетными записями пользователей 287
•
Задание пароля
Чтобы внести изменения в файл
ется команда pw groupmod.
/etc/group,
•
возможность зарегистрироваться
"Оболочка bash также читает файлы .profile или /etc/profile в режиме эмуляции sh. Файл .bash_
profile считывается командами регистрации, а файл . bashrc считывается с помощью интерактивных оболочек
без регистрации.
Не забудьте задать разумное значение umask (рекомендуем 077, 027 или 022, в зави
симости от "дружелюбности" среды и размеров организации). Если вы не используете
индивидуальные группы, рекомендуем установить для umask значение 077, поскольку
оно предоставляет владельцу полный доступ, а для группы и вообще для всех осталь
ных - никакого доступа.
Заключительные действия
Для того чтобы удостовериться, что новая учетная запись сконфигурирована надле
жащим образом, завершите сеанс работы (т.е. выйдите из системы}, а затем снова во
йдите в систему под именем нового пользователя и выполните следующие команды.
чтобы срок их действия истекал через несколько дней, если они не используются и не
были изменены.
"'Поскольку один и тот же пароль может иметь множество зашифрованных предстамений, этот
метод проверяет только сам факт изменения пользователем своего пароля, а не то, что пароль
реально был заменен другим паролем.
глава 8. Управление учетными записями пользователей 291
следует настраивать, где следует реализовать настройки и каково должно быть стандарт
ное поведение, поэтому мы описываем эти подробности в соответствующих разделах.
В табл. 8.3 приведены команды и файлы конфигурации, имеющие отношение
к управлению пользователями.
и т.д.;
Другие типичные параметры команды useradd, такие как правила для паролей,
устанамиваются как параметры модуля РАМ, который выполняет обычную аутенти
фикацию пароля. (Подключаемые модули аутентификации РАМ обсуждаются в разделе
17.3.) У команд adduser и deluser есть аналоги для групп: addgroup и delgroup.
рию файл после флага -f, содержащий список учетных записей для создания, или вве
сти каждого пользователя в интерактивном режиме.
Login group is raphael. Invite raphael into other groups? (]: <return>
Login class (default]: <return>
Shell (sh csh tcsh bash rbash nologin) (sh]: Ьавh
Home directory (/home/raphael]: <return>
Home directory perrnissions (Leave ernpty for default): <return>
Use password-based authentication? (yes] : <return>
Use an ernpty password? (yes/no) (no]: <return>
Use а randorn password? (yes/no) (no]: уев
Lock out the account after creation? (no]: <return>
Usernarne raphael
Password <randorn>
Full Name Raphael Dobbins
Uid 1004
Class
Groups raphael
Home /home/raphael
Ноте Mode
Shell /usr/local/bin/bash
Locked no
ОК? (yes/no) уев
adduser: INFO: Successfully added (raphael) to the user database.
adduser: INFO: Password for (raphael) is: RSCAds5fyOvxOt
Add another user? (yes/no) : no
Goodbye!
• Система
манды
FreeBSD позволяет блокировать
pw. Например, команда
$ sudo pw lock пользователь
помещает строку
ную запись.
учетные записи с помощью ко
UNIX- и Linuх-системы, то, возможно, проще всего позволить службе Active Directory ис
пользовать ваши UNIХ-базы данных LDAP в качестве вспомоrательных серверов.
Подробнее вопросы интеграции систем UNIX и Linux со службами LDAP, Kerberos
и Active Directory см. в главе 17.
нами из сферы маркетинга. Основным элементом для всех этих систем является база
данных, которая содержит информацию, связанную с аутентификацией и авторизацией
пользователей, часто хранимую в формате LDAP. Управление реализуется на базе таких
понятий, как группы UN\X, а ограниченные административные права усиливаются по
средством таких утилит, как sudo. Большинство таких систем было разработано с целью
урегулирования требований, диктуемых с точки зрения возможности идентификации,
использования контрольных записей и слежения за ними.
Создано много коммерческих систем в этой сфере, например: ldentity Management
(Oracle), Sun ldentity Management Suite 12 , Courion, Avatier ldentity Management Suite (AIMS)
и ВМС ldentity Management Suite. Оценивая системы управления учетными данными,
ищите следующие функции.
• Контроль:
• безопасный веб-интерфейс для управления, доступного как изнутри, так
и снаружи организации;
• Удобство использования:
• возможность для пользователей менять их пароли глобально в одной операции;
Рассмотрите также, как реализована система с точки зрения того, какие в действи
тельности выполняются аутентификации и авторизации. Требуется ли системе повсе
местная инсталляция пользовательских агентов или возможно самостоятельное согласо
12 Теперь, коrда компания Oracle купила Sun, не ясно, выживет ли эта система как продукт после
завершения процесса поглощения.
глава 9
Облачные вычисления
ми обработки данных.
Облако - это реализация "коммунальных вычислений", впервые задуманная уче
ным-программистом Джоном Мак-Карти, который описал эту идею в одной беседе
в Массачусетском технологическом институте в 1961 году. Многочисленные техноло
гические достижения, появившиеся за прошедшее время, помогли воплотить эту идею
24.6 Packer (использование инструмента Packer для создания изображений ОС для облака)
Гибкость - еще одна важная движущая сила внедрения облаков. Поскольку облач
ные системы могут предоставляться и освобождаться автоматически, любая компания,
имебщая циклический спрос, может оптимизировать эксплуатационные расходы за счет
добавления дополнительных ресурсов в периоды максимального использования и уда
ления дополнительной емкости, когда она больше не нужна. Встроенные функции ав
томатического масштабирования, доступные на некоторых облачных платформах, упро
щают этот процесс.
матизировать.
Cloud Platfoпn (GCP) и DigitalOcean (DO). В этом разделе мы упомянем несколько допол
нительных вариантов. Основные игроки в этой области перечислены в табл. 9.2.
Таблица 9.2. Наиболее wироко используемые облачные платформы
Amazoп Web Services ...... O~POt.1~~1.~.Pa~t.1e.P:. .~~'~!.POe . ~.~.e.,[1pe.~.~e. . ~.~.~O.~a.L\~.~· ..~.ОJКе.т . быть. доро~О~:~~О)l(Н~я
DigitalOceaп Простая и надежная. Имеет удобный интерфейс прикладного программирования.
Хороша для разработки
Google Cloud Platform Технически сложная и быстро совершенствующаяся. Делает акцент на производи-
················· .......................... ".......................................!.е.~.~~.О?.!..~.:. .~.t.1е.е.!...~~Р.О~~.~ . ~.n._е.~!.Р ... У~~У.~П.О.П.е.Р.е.!:l~~е...~.~.~.~.~.~. ,!\З..~~~.1 ~ ................................ ·······-····
IBM Softlayer Больше похожа на хостинг, чем на облачную платформу. Имеет глобальную част
сеть
Microsoft Azure Вторая по размеру, но далеко отстает от первой. Имеет историю отключений .
... . . ....................................... ..... ............ ....~О.~.t.1.0.'."~0.~...~.З..~~-~-~-~-а.е..т.~~~t.1.З.~~~ ?.О ~торо~ы м_~г~~инов Microsoft . ..
OpeпStack Модулярная DIY платформа с открытым исходным кодом для создания частных об-
····........................... - - .. - ....... ~З.~ОВ: ~t.le.e.!. ~~~?.O~t.1e.~!.~t.1~1e ~~!.е.РФе.йсы прикладного программирования
Rackspace Открытые и частные облака, реализующие проекты OpeпStack. Предлагает управ
ляемые службы для AWS и Azure. Имеет фанатичных сторонников
. . . . .
VMware vCloud Air Заумный сервис для публичных, частных и гибридных облаков. Использует техно
логию VMware. Вероятно, обречен
ализацию VMware в своем локальном центре обработки данных. Эти пользователи могут
прозрачно перемещать приложения в инфраструктуру vC\oud Air и из нее.
Термин публичное облако является немного неудачным и вызывает опасения, связанные
с безопасностью. На самом деле пользователи публичных облаков изолированы друг от друга
несколькими слоями аппаратной и программной виртуализации. Частное облако практически
не имеет преимущества в области безопасности над публичным облаком.
Кроме того, работа с частным облаком - это сложная и дорогостоящая перспекти
ва, которую нельзя предпринимать необдуманно. Только крупнейшие и наиболее совер
шенные организации имеют инженерные ресурсы и финансовые средства, необходимые
дЛЯ внедрения надежного, безопасного частного облака. В то же время, после реали
зации функции частного облака обычно не соответствуют тем, которые предлагаются
коммерческими облаками.
Для большинства организаций мы рекомендуем публичное облако над частными или
гибридными опциями. Публичные облака предлагают наивысшую ценность и простоту
администрирования. В оставшейся части этой книги мы ограничимся публичными об
лаками. В следующих нескольких разделах представлен краткий обзор каждой из при
веденных выше платформ.
DigitalOcean
DigitalOcean - это другая разновидность публичного облака. В то время как AWS
и GCP конкурируют за крупные предприятия и стартапы, ориентированные на рост,
DigitalOcean привлекает маленьких клиентов с более простыми потребностями.
Название этой стратегии - минимализм. Нам нравится применять DigitalOcean для экс
периментов и проверок концепций.
DigitalOcean предлагает центры обработки данных в Северной Америке, Европе
и Азии. В каждом из этих регионов есть несколько центров, но они не связаны напря
мую и поэтому не могут считаться зонами доступности (см. раздел 9.3). В результате по
строить глобальные высокодоступные производственные службы на основе DigitalOcean
значительно сложнее, чем на основе AWS или
Google.
Серверы DigitalOcean называются дроплетами (droplet). Они просто управляются из
командной строки или веб-консоли и быстро загружаются. DigitalOcean поставляет об
разы для всех наших демонстрационных операционных систем, кроме Red Hat. Он так
же имеет несколько образов для популярных приложений с открытым исходным кодом,
таких как Cassandra, Drupal, Django и Git Lab.
Платформа DigitalOcean также имеет функции балансировки нагрузки и хранения
блоков. В главе 26 мы приводим пример предоставления балансировщика нагрузки
DigitalOcean с двумя дроплетами с использованием инструмента обеспечения инфра
структуры Terraform компании HashiCorp.
Базы данных .( .( .(
.( .( .(
Время выполнения приложения
Операционная система .( .(
Платформа виртуализации .(
Физические серверы .(
Системы хранения .(
Физическая сеть .(
В большинстве случаев эти сети являются частными для вашей организации. IaaS
также может включать в себя другие основные службы, такие как базы данных, очереди,
хранилища ключей-значений и вычислительные кластеры. Эти функции в совокупности
создают полную замену традиционного центра обработки данных (и во многих случаях
даже улучшение).
306 Часть 1. Основы администрирования
Доступ к облаку
Первичный интерфейс большинства облачных провайдеров - это своего рода веб
интерфейс. Новые системные администраторы должны использовать эту веб-консоль
для создания учетной записи и для настройки своих первых ресурсов.
Облачные провайдеры также определяют интерфейсы прикладного программирова
ния, имеющие доступ к тем же базовым функциям, что и к веб-консоли. В большинстве
случаев у них также есть стандартная оболочка командной строки, переносимая боль
шинством систем для этих интерфейсов прикладного программирования.
Даже ветераны системного администрирования часто используют веб-графические
интерфейсы. Тем не менее важно также дружить с инструментами командной строки, по
скольку они легче справляются с автоматизацией и повторяемостью. Используйте сцена
рии, чтобы избежать утомительного и вялого процесса запроса всего и вся через браузер.
Облачные поставщики также поддерживают комплекты разработки программного
обеспечения (SDK) для многих популярных языков, чтобы помочь разработчикам ис
пользовать их интерфейсы прикладного программирования. Сторонние инструменты
используют SDK для упрощения или автоматизации определенных наборов задач. Вы,
несомненно, столкнетесь с этими SDK, если напишете свои собственные инструменты.
Обычно для доступа к системам UNIX и Linux, работающим в облаке, используется
алгоритм SSH с аутентификацией открытого ключа. Для получения дополнительной ин
формации об эффективном использовании SSH см. раздел 27.7.
Некоторые поставщики облачных вычислений позволяют получить доступ к сеансу
консоли через веб-браузер, что может быть особенно полезным, если вы ошибочно за
блокируете себя с помощью правила брандмауэра или сломанной конфигурации SSH.
Однако это не означает представление реальной консоли системы, поэтому вы не мо
жете использовать эту функцию для отладки начальной загрузки или проблем с BIOS.
1
1
Западный реrион США
~
в зависимости от объема
)Для сигнала, передаваемого 110 шпическому волокну, требуется около 5 мс, чтобы преодолеть 1000 км,
поэтому ре1·ионы размером с восточное побережье США с точки зрения производительности вполне
приемлемы. Сетевое подклю•1ение, доступное ДJIЯ дата-центра, важнее, чем его точное местоположение.
308 Часть 1. основы администрирования
жения, а затем закрыть экземпляры, когда они больше не нужны. Вы платите только за
то, что используете, и обычно не несете авансовых расходов.
Поскольку экземпляры являются виртуальными машинами, их мощность процессо
ра, память, размер диска и сетевые настройки могут настраиваться, когда экземпляр соз
дается и даже корректируется постфактум. Открытые облачные платформы определяют
предустановленные конфигурации, называемые типами экземпляров. Они варьируются
от однопроцессорных узлов с 512 Мбайт памяти до больших систем со многими ядрами
процессора и несколькими ТиБ памяти. Некоторые типы экземпляров сбалансированы
для общего использования, а другие специализируются на приложениях с процессором,
памятью, диском или сетью. Конфигурации экземпляров - это одна из областей, в ко
торой поставщики облачных вычислений энергично конкурируют, чтобы соответство
вать потребностям рынка.
Экземпляры создаются из образов, сохраненного состояния операционной системы,
которое содержит (как минимум) корневую файловую систему и загрузчик. Образ мо
жет также включать в себя тома дисков для дополнительных файловых систем и других
настраиваемых параметров. Вы можете легко создавать собственные образы с помощью
собственного программного обеспечения и настроек.
Все наши иллюстративные операционные системы используются широко, поэтому
облачные платформы обычно предоставляют для них официальные образы. 4 Многие
сторонние поставщики программного обеспечения также поддерживают образы обла
ков, которые имеют предустановленное программное обеспечение для облегчения при
нятия клиентами.
Также легко создавать свои собственные образы. Подробнее о том, как создавать об
разы виртуальной машины в пакете, см. раздел 24.5.
Сети
Облачные провайдеры позволяют создавать виртуальные сети с настраиваемыми то
пологиями, которые изолируют ваши системы друг от друга и от Интернета. На плат
формах, которые предлагают эту функцию, вы можете установить диапазоны адресов ва-
48 настоящее время вы должны создать свой собственный образ FreeBSD, если используете Google
Compute Eпgine.
глава 9. Облачные вычисления 309
Хранилище
Важной частью облачных вычислений является хранение данных. Облачные про
вайдеры имеют самые большие и самые современные системы хранения данных на пла
нете, поэтому вам будет трудно обеспечить их объем и возможности в частном центре
обработки данных. Поставщики облачных вычислений взимают nлату с объема данных,
которые вы храните. Они очень мотивированы, чтобы дать вам как можно больше воз
можностей мя хранения ваших данных. 5
Перечислим несколько наиболее важных сnособов хранения данных в облаке.
Идентификация и авторизация
Администраторам, разработчикам и другим техническим сотрудникам необходимо
управлять облачными службами. В идеальном случае средства управления доступом
должны соответствовать принципу наименьших привилегий: каждый директор может
иметь доступ только к объектам, которые имеют к нему отношение, и не более того.
В зависимости от контекста такие спецификации контроля доступа могут стать доволь
но сложными.
Автоматизация
Инструменты API и CLI, созданные поставщиками облачных технологий. являют
ся основными строительными блоками пользовательской автоматизации. но они часто
неуклюжи и непрактичны для организации больших коллекций ресурсов. Например,
что делать, если вам нужно создать новую сеть, запустить несколько экземпляров VPS,
предоставить базу данных, настроить брандмауэр и, наконец, подключить все эти ком
поненты'? С точки зрения облачного API это бьш бы сложный сценарий.
AWS CloudFormation стала первой службой для решения этой проблемы. Она принимает
шаблон в формате JSON или YAML, который описывает требуемые ресурсы и связанные
Глава 9. Облачные вычисления 311
Веб-службы Amazon
Для того чтобы использовать AWS, сначала настройте учетную запись на сайте aws.
amazon. com. Создав учетную запись, немедленно следуйте инструкциям AWS Trusted
Advisor, чтобы настроить свою учетную запись в соответствии с предлагаемыми рекоменда
циями. Затем вы можете перейти к отдельным консолям обслуживания для ЕС2, VPC и т.д.
Каждая служба AWS имеет специальный пользовательский интерфейс. Когда вы
войдете в веб-консоль, вы увидите вверху список служб. Внутри Amazon каждая служ
ба управляется независимой командой, и, к сожалению, данный интерфейс отражает
этот факт. Хотя это решение помогло развивать АWS-службы, это приводит к несколь
ко фрагментированному опыту взаимодействия. Некоторые интерфейсы более удобны
и интуитивны, чем другие.
Для того чтобы защитить свою учетную запись, включите многофакторную аутенти
фикацию (MFA) для пользователя root, а затем создайте привилегированного пользова
теля \АМ для повседневного использования. Мы также обычно настраиваем псевдоним,
чтобы пользователи могли получить доступ к веб-консоли без ввода номера учетной за
писи. Эта опция находится на начальной странице службы IAM.
В следующем разделе мы представляем официальный инструмент aws - интерфейс
командной строки, написанный на Python. Новые пользователи также могут воспользо
ваться службой быстрого запуска Amazon Lightsail, целью которой ямяется запуск эк
земпляра ЕС2 с минимальными усилиями.
312 Часть 1. Основы администрирования
"PrivateipAddress": "10.0.0.27",
"Instanceld": "i-c4f60303",
"Imageld": "ami-d440aбe7",
"PrivateDn sName": "ip-10-0-0-27.us-west-2.compute.internal",
"KeyName": "admin-key",
"SecurityGroups": [
{
"GroupName": "default",
"Groupld": "sg-9eb477fb"
] ,
"Subnetld": "subnet-ef67938a",
"InstanceType": "t2.nano",
"Instanceid": "i-c4f60303",
"Timestamp": "2015-12-21T00:01:45.000Z",
"Output": "[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000) Initializing cgroup subsys cpuacct
[ 0.000000) Linux version 4.l.7-15.23.amznl.x86_64
(mockbuild@gobi-build-60006) (gcc version 4.8.З 20140911
Глава 9. Облачные вычисления 315
Настройка gcloud
Программа gcloud, приложение на языке
Python, является инструментом CLI
для GCP. Это компонент
Google Cloud SDK, который содержит множество библиотек
и инструментов для взаимодействия с GCP. Чтобы установить его, следуйте инструкци
ям по установке на сайте cloud. goog le. com/ sdk.
316 Часть 1. Основы администрирования
Первое действие должно состоять в том, чтобы настроить среду, выполнив команду
gcloud ini t. Эта команда запускает небольшой локальный веб-сервер, а затем откры
вает ссылку браузера для отображения пользовательского интерфейса Google для аутен
тификации. После аутентификации через веб-браузер gcloud попросит вас (в оболоч
ке) выбрать профиль проекта, зону по умолчанию и другие значения по умолчанию.
Настройки сохраняются в файле~/. config/gcloud/.
Выполните команду gcloud help для получения общей информации или gcloud -h
для краткого описания использования. Также доступна помощь по подкоманде; например,
команда gcloud help compute показывает справочную страницу для службы Compute
Engine.
6 Выполните команду aws ес2 wai t для получения информации об опросе событий или состояний
вAWS ЕС2.
глава 9. Облачные вычисления 317
DigitalOcean
С объявленным временем загрузки 55 с виртуальные серверы DigitalOcean (дропле
ты) - это самый быстрый путь к корневой оболочке. Стоимость начального уровня со
ставляет 5 долл. США в месяц, поэтому они также не разорят вас.
Затем подключите программу tugboat API DigitalOcean, введя токен доступа, кото
рый вы получите с веб-сайта. Программа tugboat сохраняет токен для будущего ис
пользования в файле"/. tugboat.
Вам также нужен цифровой идентификатор DigitalOcean для ключа SSH, вставлен
ного в веб-консоль.
318 Часть 1. основы администрирования
$ tuqboat keys
SSH Keys:
Name: id_rsa_do, (id: 1587367), fingerprint:
bc:32:3f:4d:7d:b0:34:ac:2e:3f:Ol:fl:el:ea:2e:da
Этот вывод показывает, что числовой идентификатор для ключа с именем id rsa
do равен 1587367. Создайте и запустите дроплеты следующим образом: -
$ tuqboat create -i uЬuntu-16-04-x64 -k 1587367 ulsah-uЬuntu
queueing creation of droplet 'ulsah-ubuntu' ... Droplet created!
Здесь аргумент -k - это идентификатор ключа SSH, а последний аргумент - корот
кое имя для дроплета, которое вы можете назначить по своему усмотрению.
Сравнить цены на Google Compute Engine достаточно просто. При длительном ис
пользовании автоматически применяются скидки, и вы никогда не будете платить аван
сом. Вы платите полную базовую цену за первую неделю месяца, а инкрементная цена
падает каждую неделю на 20% от базовой ставки до максимальной скидки 60%. Чистая
скидка на полный месяц использования составляет 30%. Это примерно сопоставимо
с дисконтом на один год зарезервированного экземпляра ЕС2, но вы можете изменять
экземпляры в любое время. 7
Еще более сложно прогнозировать сетевой трафик. Факторы, которые, как правило,
вызывают высокие затраты на передачу данных, включают в себя следующее.
7 Совет для бережливых людей: поскольку схема скидок связана с вашим биллинrовым циклом, время
переходов имеет значение. Вы можете переключать типы экземпляров в начале или в конце цикла
без штрафа. Наихудший случай заключается в том, чтобы переключаться на полпуrи биллинговоrо
цикла. Эго переключение штрафуется примерно на 20% от месячной базовой ставки экземпляра.
320 Часть 1. Основы администрирования
а не используя три или более. Некоторые программы предлагают такие настройки, как
сжатие, которое может уменьшить количество реплицированных данных.
9.6. ЛИТЕРАТУРА
• Wптю, ANDREлs, AND М1снлЕL Wптю. Amazon Web Services /п Action. Manning
PuЫications, 2015.
• GooGLE. cloudplatforт. googleЫog. сот. Официальный блог Google Cloud
Platfonn .
• BARR, JEFF, AND OTHERS АТ АмлzоN WEB SERVICES. aws. aтazon. coт/Ыogs/aws.
Официальный блог Amazon Web Services.
• Dю1тлLОСЕАN. digitalocean.coт/coтpany/Ьlog. Технический и производствен
ный блог DigitalOcean.
• VoGELS, WERNER. А/1 Things Distributed. all thingsdistributed. сот. Блог Вернера
Фогельса (Wemer \Ьgels), технического директора компании Amazon.
• WлRDLEY, S1мoN. Bits or pieces? Ыоg. gardeviance. org. Блог исследователя и за
конодателя мод в области облачных технологий Саймона Уордли (Simon Wardley),
содержащий анализ тенденций в области облачных технологий, а иногда и резкую
критику.
• CлNТRJLL, BRYAN. The Observation Deck. dtrace. org /Ыogs /Ьтс. Интересные точ
ки зрения и технические идеи о вычислениях технического директора компании
1 Конечно, точное системное время имеет значение даже без наличия регуляторных норм. Мы
настоятельно рекомендуем включить протокол NTP дЛЯ всех ваших систем.
Глава 1О. Журналирование 323
в в
NTP
cron
друrи@ ..•
Двоичный журнал Обычные текстовые файлы
Имена файлов в табл. 10. \ даны относительно каталогов, /var/log, если не указано
иное. Многие журнальные файлы из числа перечисленных в табл. 10.1 контролируются
системой Syslog, а остальные - приложениями.
324 Часть 1. Основы администрирования
Журнальные файлы могут очень быстро увеличиваться в размере, особенно это каса
ется файлов для службы электронной почты, веб- и DNS-cepвepoв. Неконтролируемый
файл регистрации может заполнить весь диск и тем самым вывести систему из строя.
Поэтому мы предпочитаем определять раздел /var/109 как отдельный раздел диска
или отдельную файловую систему. (Этот совет одинаково полезен как для облачных эк
земпляров, и частных виртуальных машин, так и для физических серверов.)
Для того чтобы нормальные пользователи могли читать из журнала без необходимых
разрешений sudo, добавьте их в группу UNlX systemd-journal.
Опция -disk-usage показывает размер журнала на диске.
# journalctl --disk-usage
Journals take up 4.ОМ on disk.
Параметр -list-boots показывает последовательный список системных загрузок
с числовыми идентификаторами. Самая последняя загрузка всегда имеет идентифика
тор, равный О. Даты в конце строки показывают временные метки первого и последнего
сообщений, сгенерированных во время этой загрузки.
# journalctl --list-boots
-1 сеО ... Sun 2016-11-13 18:54:42 UTC-Mon 2016-11-14 00:09:31
о 844 ... Mon 2016-11-14 00:09:38 UTC-Mon 2016-11-14 00:12:56
# journalctl -Ь О -u ssh
Для того чтобы показать все сообщения, начиная с прошлой полночи до сегодняш
него дня, выполните команду:
В системах Linux исходный демон системы Syslog (syslogd) был заменен более но
вой реализацией, называемой Rsyslog (rsyslogd). Rsyslog - проект с открытым исход
ным кодом, который расширяет возможности исходной системы Syslog, но поддержива
ет обратную совместимость с интерфейсом прикладного программирования. Это самый
разумный выбор для администраторов, работающих в современных системах UN IX
и Linux, и это единственная версия Syslog, которую мы рассмотрим в этой главе .
• Система Rsyslog
php/FreeBSD.
доступна для
FreeBSD, и мы рекомендуем вам принять ее,
а не стандартный системный журнал FreeBSD, если у вас нет простых тре
бований. Инструкции по преобразованию системы FreeBSD для использо-
вания демона rsyslog содержатся по адресу wiki. rsyslog. сот/ index.
• Временная метка.
• Системное имя хоста, в данном случае j essie.
• Имя процесса и его идентификатор в квадратных скобках.
• Полезная нагрузка сообщения.
Глава 1о. Журналирование 331
Версии Rsyslog
Системы Red Hat и CentOS используют Rsyslog версии 7, а Deblan и Ubuntu обновле
ны до версии 8. Пользователи FreeBSD, устанавливающие систему из портов, могут вы
брать либо версию 7, либо 8. Как и следовало ожидать, в проекте Rsyslog рекомендуется
использовать самую последнюю версию, но мы не следуем этим советам. Тем не менее,
если ваша операционная система является самой современной, это не повлияет на ваш
опыт ведения журнала.
Конфигурация Rsyslog
Поведение демона rsyslogd контролируется настройками в файле /etc/rsyslog.
conf. Все наши примеры дистрибутивов Linux включают в себя простую конфигурацию
с разумными значениями по умолчанию, которые подходят большинству организаций.
Пустые строки и строки, начинающиеся с символа#, игнорируются. Строки в конфигу
рации системы Rsyslog обрабатываются в порядке от начала до конца, а порядок имеет
значение.
Модули
Модули системы Rsyslog расширяют возможности основного механизма обработки.
Все входы (источники) и выходы (адресаты) настраиваются через модули, а модули мо
гут даже анализировать и изменять сообщения. Хотя большинство модулей были напи
саны Райнером Герхардсом, некоторые из них были внесены третьими лицами. Если вы
программист на языке С, то можете написать свой собственный.
Имена модулей соответствуют предсказуемому префиксному шаблону. Те, которые
начинаются с префиксаim, являются модулями ввода; om* - модули вывода, mm* - мо
дули модификации сообщений и т.д. Большинство модулей имеют дополнительные па
раметры конфигурации, которые настраивают их поведение. Документация о модулях
системы Rsyslog является полным и исчерпывающим справочником.
В следующем списке кратко описаны некоторые из наиболее распространенных (или
интересных) модулей ввода и вывода, а также несколько экзотических примеров.
• Модуль imklog понимает, как читать сообщения ядра в системах Linux и BSD.
• Модуль imfile преобразует простой текстовый файл в формат сообщения систе
мы Syslog. Это полезно для импорта файлов журналов, созданных с помощью про
граммного обеспечения, не имеющего встроенной поддержки Syslog. Существуют
два режима: режим опроса, который проверяет файл на наличие обновлений в на
страиваемый интервал и режим уведомления (inotify), который использует ин
терфейс событий файловой системы Linux. Этот модуль допускает восстановление
после отключения при перезапуске демона rsyslogd.
334 Часть 1. Основы администрирования
• Модули imtcp и imudp принимают сетевые сообщения через ТСР и UDP соот
ветственно. Они позволяют централизовать ведение журнала в сети. В сочетании
с драйверами сетевого потока системы Rsyslog модуль ТСР также может прини
мать взаимно аутентифицированные сообщения системы Syslog через TLS. Для
сайтов Linux с чрезвычайно высоким объемом см. также модуль imptcp.
• Если модуль immark присутствует, система Rsyslog создает сообщения с отметкой
времени через равные промежутки времени. Эти метки времени могут помочь вам
понять, что ваща машина потерпела крах между 3:00 и 3:20 утра, а не просто но
чью. Эта информация также является большой помощью, когда вы отлаживаете
проблемы, которые происходят регулярно. Для настройки интервала метки ис
пользуйте параметр MarkМessagePeriod.
• Модуль omfwd пересылает сообщения на удаленный сервер Syslog через ТСР или
UDP. Этот модуль особенно полезен, если ваша организация нуждается в центра
лизованном протоколировании.
Селектор отделен от действия одним или несколькими пробелами или знаком табу
ляции. Например, строка
auth.* /var/log/auth.log
обеспечивает сохранение сообщений, связанных с аутентификацией пользователей, в файле
/var/log/auth.log.
Глава 10. Журналирование 335
Селектор Назначение
auth.info Выбор почтовых сообщений уровня info и выше
auth.=info Выбор почтовых сообщений только уровня i nf о
auth.info;auth. !err Выбор почтовых сообщений уровней info, notice и warning
auth.debug;auth.!=warning Выбор почтовых сообщений любого уровня, кроме wa rning
Игнорировать сообщение
лпроrрамма ;шаблон Форматировать сообщение в соответствии со спецификацией
шаблон и послать его проrрамме как первый аргумент<'
•Для получения дополнительной информации о каналах FIFO введите команду man mk.fifo.
0 Для получения дополнительной информации о шаблонах введите команду man 5 rsyslog. conf.
Если в качестве действия задано имя файла (или имя канала FIFO), то это должно
быть полное имя. При отсуrствии указанного файла демон rsyslogd создает его в про
цессе записи первого сообщения. Права владения и разрешения для файла указаны
в глобальных директивах конфигурации (см. выше).
Приведем для примера несколько конфигураций, использующих традиционный син
таксис:
Устаревшие директивы
Несмотря на то что в документации по системе Rsyslog эти директивы называют
ся устаревшими, они все еще широко используются во многих конфигурациях Rsyslog
configurations. Устаревшие директивы могуr конфигурировать все аспекты системы
Rsyslog, включая глобальные параметры демонов, модули, фильтрацию и правила.
Однако на практике эти директивы чаще всего используются для настройки модулей
и самого демона rsyslogd. Документация по системе Rsyslog не рекомендует использо
вать устаревшие директивы для форматирования правил обработки сообщений, уrверж
дая, что это "крайне трудно сделать правильно". Для фильтрации и обработки сообще
ний следует использовать демон sysklogd или форматы RainerScript.
Параметры демонов и модулей очевидны. Например, приведенные ниже параме
тры позволяют регистрацию по протоколам UDP и ТСР на стандартном порту системы
338 Часть 1. Основы администрирования
Syslog (514). Они также позволяют посылать клиентам пакеты активации, чтобы под
держивать соединения ТСР открытыми; это позволяет уменьшить стоимость восстанов
ления соединений после завершения сеанса.
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$InputTCPServerKeepAlive on
Для того чтобы ввести данные параметры в действие, необходимо добавить эти
строки в новый файл, который включается в основную конфигурацию, например
/etc/rsyslog. d/10-network-inputs. conf. Затем следует заново запустить демон
rsyslogd. Любые параметры, модифицирующие поведение модулей, должны устанав
ливаться после того, как модуль будет загружен.
Некоторые из устаревших директив перечислены в табл. 10.6.
Таблица 10.6. Устаревшие параметры конфиrурации системы Rsyslog
Параметр Описание
$MainMsgQueueSize Размер буфера памяти между полученным и отосланным сообщениями•
SMaxMessageSize По умолчанию равен 8 Кбайт; должен быть установлен до загрузки любых моду
лей ввода
$LocalHostName Замещает локальное имя хоста
$WorkDirectory Указывает, где сохранить рабочие файлы системы Rsyslog
$ModLoad Загружает модуль
$MaxOpenFiles Модифицирует системный параметр no f i 1 е, заданный по умолчанию для сис
темы Rsyslogd
SincludeConfig Включает дополнительные файлы конфигурации
SUМASK Устанавливает флаг umas k для новых файлов, созданных системой Rsyslogd
•Этот параметр полезен для медленно выполняемых действий, например для вставок в базу данных.
Синтаксис RainerScript
Синтаксис RainerScript - это язык обработки потока событий с возможностями
фильтрации и управления потоком. Теоретически с помощью синтаксиса RainerScript
можно также установить основные параметры демона rsyslogd. Однако, поскольку не
которые устаревшие параметры не имеют эквивалентов в синтаксисе RainerScript, сме
шивать два формата совершенно нецелесообразно.
Язык RainerScript более выразительный и понятный дпя человека, чем устаревшие ди
рективы демона rsyslogd, но его синтаксис принципиально отличается от всех извест
ных нам систем конфигурации. На практике, работа с этим синтаксисом немного утом
ляет. Тем не менее мы рекомендуем его дпя фильтрации и разработки правил обработки
сообщений. В этом разделе мы обсудим лишь часть его функциональных возможностей.
Например. мы могли бы приказать системе Rsys\og прослушивать порты ТСР 514 и 1514:
rnodule(load="imtcp" KeepAlive="on")
input(type="imtcp" port="514")
input(type="imtcp" port="l514")
Большая часть преимуществ системы RainerScript связана с возможностями фильтра
ции. С помощью его выражений можно выбирать сообщения. соответствующие опре
деленным критериям, а затем применять к ним определенное действие. Например, сле
дующие строки направляют сообщения аутентификации в файл /var/log/auth. log:
if $syslogfacility-text == 'auth' then {
action(type="omfile" file="/var/log/auth.log")
В данном примере $syslog facili ty-text - это свойство сообщения, т.е. часть ме
таданных сообщения. Знак доллара, стоящий перед именем свойства, сообщает системе
Rsyslog, что это переменная. В данном случае действие заключается в том, что для запи
си соответствующих сообщений в файл auth. log используется модуль вывода omfile.
Наиболее часто используемые свойства перечислены в табл. 10.7.
Таблица 10.7. Наиболее часто используемые свойства системы Rsyslog
Свойст~о Описание
module(load="builtin:omfile"
# Используем традиционный формат временной метки
template="RSYSLOG TraditionalFileFormat"
input(type="imfile"
Tag="apache-error"
File="/var/log/apache2/error.log"
Severity="info"
6 Демон httpd может вести журнал непосредственно в системе Syslog с помощью модуля mod_
sysloq, но мы используем модуль illlfile дпя иллюстрации.
глава 10. Журналирование 343
module(
load="imtcp"
streamDriver.name="gtls"
streamDriver.mode="l"
streamDriver.authMode="x509/name"
input(type="imtcp" port="6514")
Сервер журнала прослушивает ТLS-версию стандартного порта системы Syslog, 6514.
Параметр authMode сообщает системе Syslog, какой тип проверки должен выполняться.
Параметр x509/name, заданный по умолчанию, подразумевает проверку того факта, что
сертификат подписан доверенным органом, а также проверяет имя субъекта, которое
связывает сертификат с конкретным клиентом через систему DNS.
Конфигурация для клиентской стороны ТLS-соединения аналогична. Используйте
сертификат клиента, закрытый ключ и драйвер потока gtls для пересылки журналов
с ПОМОЩЬЮ модуля вывода.
global(
defaultNetstreamDriver="gtls"
defaultNetstreamDriverCAFile="/etc/ssl/ca/admin.com.pem "
defaultNetstreamDriverCertFile="/etc/ssl/certs/client.co m.pem"
defaultNetstreamDriverKeyFile="/etc/ssl/private/client. com.key"
* * action(type="omfwd"
Protocol="tcp"
Target="logs.admin.com"
Port="6514"
StreamDriverMode="l"
StreamDriver="gtls"
StreamDriverAuthMode="x509/name"
local5.warning /tmp/evi.log
и нужно убедиться в том, что она работает, введите такую команду.
$ loqqer -р localS.warninq "test messaqe"
Строка, содержащая фразу test message (тестовое сообщение), должна быть запи
сана в файл /t.mp/evi. log. Если этого не произошло, то, возможно, вы забыли переза
пустить демон rsyslog?
# Глобальные параметры
errors errors@book.admin.com
rotate 5
weekly
/var/log/samba/*.log
notifempty
copytruncate
sharedscripts
postrotate
/bin/kill -HUP 'cat /var/lock/samЬa/*.pid'
endscript
dail у, wee kl у, топ thl у Осуществлять ротацию журнальных файлов ежедневно, еженедельно
или ежемесячно
prerotate Этот параметр помечает начало блока команд, выполняемых перед ро-
тацией журнального файла
sharedscripts Запускать сценарии один раз для всей группы журнальных файлов
size порог Выполнять ротацию, если размер журнального файла превышает порог
(например, 100 Кбайт, 4 Мбайт)
Стек ELK
Явным лидером в области программного обеспечения с открытым исходным ко
дом - и действительно одним из лучших пакетов программного обеспечения, с кото
рыми мы с удовольствием работаем, - является мощный стек ELK, состоящий из ин
струментов Elasticsearch, Logstash и Kibana. Эта комбинация инструментов позволяет
сортировать, искать, анализировать и визуализировать большие объемы журнальных
данных, создаваемых глобальной сетью клиентов регистрации. Стек ELK создан компа
нией Elastic (elastic. со), которая также предЛагает обучение, поддержку и корпора
тивные надстройки дЛЯ ELK.
Elasticsearch - это масштабируемая база данных и поисковая система с интерфейсом
прикладного программирования RESTful дЛЯ запроса данных. Она написана на языке
Java. Установки Elasticsearch могут варьироваться от одного хоста, который обрабатывает
низкий объем данных, до нескольких десятков хостов в кластере, который индексирует
много тысяч событий каждую секунду. Поиск и анализ журнальных данных является од
ним из самых популярных приложений дЛЯ Elasticsearch.
Если поисковая система E\asticsearch является основным инструментом стека ELK,
то конвейер обработки данных Logstash является его союзником и доверенным пар
тнером. Конвейер Logstash принимает данные из многих источников, включая системы
массового обслуживания, такие как RabbltMQ и AWS SQS. Он также может считывать
данные непосредственно из сокетов ТСР или UDP и традиционного протокола систе
мы Syslog. Конвейер Logstash может анализировать сообщения дЛЯ добавления допол
нительных структурированных полей и отфильтровывать нежелательные или несоот
ветствующие данные. Когда сообщения попадают в сеть, Logstash может записывать их
в самые разные пункты назначения, включая, конечно, Elasticsearch.
Вы можете отправлять записи журнала в конвейер Logstash различными способами.
Вы можете настроить вход конвейера Logstash на систему Syslog и использовать модуль
вывода omfwd системы Rsyslog, как описано в конфигурации Rsyslog в разделе 10.3. Вы
также можете использовать выделенный отправитель журналов. Собственная версия
348 Часть 1. Основы администрирования
Elastic называется Filebeat и может отправлять журналы либо в Logstash, либо непосред
ственно в Elasticsearch.
Последний компонент ELK, Kibana, является графическим интерфейсом
для Elasticsearch. Он предоставляет интерфейс поиска, с помощью котороrо можно най
ти записи, которые вам нужны, среди всех данных, которые были проиндексированы
поисковой системой Elasticsearch. Интерфейс Кibana может создавать графики и ви
зуализации, которые помогают генерировать новые сведения о ваших приложениях.
Нам известна по крайней мере одна служба, logz. io, предлагающая услуrу ELK
на уровне производства. Вы можете отправлять сообщения журнала из своей сети по за
шифрованным каналам в конечную точку, которую предоставляет logz. io. Там со
общения регистрируются, индексируются и становятся доступными через интерфейс
Кibana. Это довольно дорогое решение, но его стоит оценить. Как и во многих облачных
службах, вы можете обнаружить, что в конечном итоге реплицировать службу локально
обойдется дороже.
Graylog
Graylog - аутсайдер по сравнению с пакетом
ELK. Он похож на стек ELK: он тоже
хранит данные в базе данныхElasticsearch и может принимать сообщения журнала на
прямую или через конвейер Logstash, как и в стеке ELK. Реальным отличием являет
ся пользовательский интерфейс Graylog, который многие пользователи считают более
удачным и простым в использовании.
с LDAP.
Система Graylog, безусловно, заслуживает внимания, когда вы выбираете новую ин
фраструктуру журналирования.
Ядро - это главная часть операционных систем UNIX и Linux. Оно устанавливает
правила, распределяет ресурсы и предоставляет пользователям основные услуги.
мяти. Ядро плавно переключается между процессами системы, вьщеляя каждому выпол
няемому потоку небольшой отрезок времени, в котором необходимо выполнить работу.
Ядро запрещает процессам читать и записывать данные в памяти друг друга, если у них
нет явного разрешения на это.
Более старый из двух основных выпусков (в данном случае FreeBSD 12) можно рас
сматривать как текущую версию. Он не содержит новых функций и делает упор на ста
бильности и безопасности.
Более поЗдняя версия (FreeBSD 13) прямо сейчас находится на стадии активной раз
работки. Она также имеет стабильные версии, предназначенные для общего исполь
зования, но код этого ядра всегда будет более новым и несколько менее проверенным
по сравнению с предыдущей основной версией.
Как правило, подверсии (dot version) появляются примерно каждые четыре ме
сяuа. Основные выпуски явно поддерживаются в течение пяти лет, а подверсии вну
три них поддерживаются в течение трех месяцев после выхода следующей подверсии.
Полдверсии быстро устаревают; система FreeBSD предполагает, что пользователи будут
обновлять ее с помощью заплаток.
Здесь имя_ файла - это создаваемый файл устройства, тип - тип устройства (с - в слу
чае символьного устройства и Ь - в случае блочного), а старший и младший - старший
и младший номера устройства соответственно. Если вы вручную создаете файл устрой
ства, драйвер которого уже имеется в ядре, просмотрите соответствующую этому драй
веру mаn-страницу и найдите указанные в ней старший и младший номера.
Каталог Описание
Команда udevadm в качестве своего первого аргумента ожидает одну из шести команд:
info, trigger, settle, control, monitor или test. Особый интерес для системных
администраторов представляют две команды: info, которая выводит информацию, зави
сящую от конкретного устройства, и control, которая запускает и останавливает работу
менеджера устройств udev или заставляет его перезагрузить свои файлы правил. Команда
moni tor отображает события по мере того, как они происходят в системе.
Следующая команда отображает все атрибуты демона udev для устройства sdЬ. Здесь
результат выполнения команды представлен в усеченном виде, но в действительности
он содержит список всех родительских устройств (например, шины USB), которые в де
реве устройств являются предками устройства sdЬ.
ATTR{ext_range\=="256"
ATTR{removaЬlel=="l"
ATTR{ro\=="O"
AТTR{size\=="1974271"
ATTR{capability\=="53"
ATTR{stat}==" 71 986 1561 860 1 О 1 12 О 592 872"
PROGRAМ Выполняет внешнюю команду; условие считается выполненным, если код завер-
шения команды равен О
•Имя_файла - это лист на дереве файловой системы sys f s, соответствующий конкретному атрибуту.
ubuntu$ lsusb
Bus 001 Device 007: ID 1307:0163 Transcend, Inc. USB Flash Drive
Bus 001 Device 001: ID ld6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID ld6b:0001 Linux Foundation 1.1 root hub
В качестве альтернативного варианта можем проверить записи в журнале ядра с по
мощью команд dmesg или journalctl. В нашем случае устройство оставляет простран
ную контрольную запись.
DRIVERS== 1111
ATTRS{scsi_level}== 11 3 11
ATTRS{vendor}== 11 Utl6З
ATTRS {rnodel} == 11 USB2FlashStorage 11
Затем мы используем ключ ACTION для выполнения ряда команд всякий раз, ког
да устройство будет появляться на шине USB. Ключ элемента назначение RUN позво
ляет создавать соответствующий каталог точки монтирования и монтировать там наше
устройство.
ACTION=="remove", ATTRS(model}=="USB2FlashStorage",
KERNEL=="sd[a-z]l", RUN+="/Ьin/umount -1 /mnt/ate-flash%n"
ACTION=="remove", ATTRS(model}=="USB2FlashStorage",
KERNEL=="sd[a-z)l", RUN+="/bin/rmdir /mnt/ate-flash%n"
Теперь, когда правила подготовлены, мы должны уведомить демон udevd о на
ших изменениях. Команда control, используемая в качестве аргумента команды
udevadm, - одна из немногих, которые требуют полномочий суперпользователя.
ubuntu$ sudo udevad111 control --reload-rules
Опечатки молча игнорируются после перезагрузки, даже с использованием флага
--deЬug, поэтому не забудьте дважды проверить синтаксис своих правил.
Вот и все! Теперь, когда флеш-nамять вставляется в разъем USВ-порта, демон udevd
создает символическую ссылку /dev/ate-flashl и монтирует устройство /mnt/ate-
flashl.
ubuntu$ ls -1 /dev/ate•
lrwxrwxrwx 1 root root 4 2009-08-09 21:22 /dev/ate-flashl -> sdЫ
Формат файла / etc/ devd. oonf концептуально прост и состоит из инструкций, содер
жащих Il>YllПЫ подстановок. Инструкции - это, по сути, правила, а вложенные инструкции
содержат сведения о правиле. Доступные типы операторов перечислены в табл. 11 .4.
Таблица 11.4. Типы инструкций в файле /etc/devd. conf
Инструкция Описание
attach Что делать, когда устройство вставлено
detach Что делать, когда устройство удалено
nomatch Что делать, если никакие другие инструкции не соответствуют устройству
notify Как реагировать на события ядра, касающиеся устройства
options Параметры конфигурации для самого демона devd
Для того чтобы эти параметры при перезагрузке сохранялись, необходимо использо
вать команду sysctl. Она позволяет задавать отдельные переменные либо в командной
строке, либо с помощью списка пар переменная=значение в файле конфигурации. По
умолчанию файл /etc/sysctl. conf считывается при загрузке системы, а его содержи
мое используется для установки начальных значений ее параметров.
Например, команда
net/ip* / conf/ defaul t/rp_ fil ter Включает проверку маршрутизации по IР-адресу отправителя•
net/ip*/icmp_echo_ignore_all Включает игнорирование эхо-запросов ICMP, если равен единице 6
net/ip*/ip_forward Позволяет IР-переадресацию, если равен единице•
net/ip*/ip_local_yort_range Устанавливает диапазон локального порта, используемый при на
стройке соединения'
net/ip*/tcp_syncookies Защищает от синхронных атак (SYN flood attack); включите, если
подозреваете атаку "отказ в обслуживании" (DoS)
tcp_fin_timeout Устанавливает секунды для ожидания окончательного пакета
TCPFl№
vm/overcollDllit_memory Контролирует переполнение памяти, т. е. определяет, как ядро
реагирует на нехватку физической памяти для обработки запроса
на размещение виртуальной машины
vm/overcollDllit_ratio Определяет, сколько физической памяти (в процентах) будет ис
пользоваться при недостатке памяти
'Этот механизм защиты от дезинформирующих помех заставляет ядро отбрасывать пакеты, полученные из невоз-
можных адресов.
'Увеличьте этот диапазон до 1024-65000 на серверах, которые инициируют множество исходящих подключений.
дна серверах с высоким трафиком для повышения производительности попробуйте установить это значение на бо
лее низком уровне {- 20).
366 Часть 1. Основы администрирования
Обратите внимание на то, что есть два подкаталога 1Р-сети /proc/ sys/net: ipv4
и ipvб. Раньше администраторам приходилось беспокоиться только о поведении про
токола 1Pv4, потому что он был единственным. Но на момент написания этой книги
(2017) все блоки адресов 1Pv4 уже были распределены, а протокол 1Pv6 развернут и ис
пользуется почти повсеместно, даже в небольших организациях.
В общем случае, когда вы изменяете параметр для 1Pv4, вы также должны изменить
этот параметр для 1Pv6, если вы поддерживаете оба протокола. Слишком легко изменить
одну версию 1Р, а не другую, а затем столкнуться с проблемами несколько месяцев или
лет спустя, когда пользователь сообщит о странном сетевом поведении.
Сборка ядра
Операционная система Liпux развивается столь быстрыми темпами, что рано или
по:щно ее ядро приходится компилировать заново. Постоянно появляются исправления
ядра, драйверы устройств и новые функции. Все это вызывает противоречивые чувства.
С одной стороны, удобно иметь под рукой всегда самые новые инструменты, а с дру
гой - стремление идти в ногу со временем требует постоянных усилий и значительных
затрат времени.
Для того чтобы не редактировать файл . config напрямую, в системе Liпux предус
мотрено несколько целевых модулей утилиты make, реализующих различные интерфей
сы конфигурирования ядра. Если в системе инсталлирована оболочка KDE, то удобнее
всего воспользоваться командой make xconfig. Аналогично, если вы используете обо
лочку GNOME, вероятно, лучше всего применить команду make gaonfig. Эти коман
ды отображают окно конфигурации, в котором можно выбрать драйверы устройств, до
бавляемые к ядру (или компилируемые в качестве загружаемых модулей).
В отсутствие графической среды на помощь придет команда make menuoonfig.
Наконец, есть старая команда make config, которая выводит запрос на изменение каж
дого конфигурационного параметра и не позволяет изменять ранее установленные значе
ния. Мы рекомендуем пользоваться командой make xaonfig или make gaonfig, если
используемая среда их поддерживает, и командой make 111Snucюnfig - в противном случае.
Применения команды make config лучше избегать (как самой негибкой и трудоемкой).
При переносе конфигурации существующего ядра в новую версию ядра (или фай
ловую систему) можно использовать команду make oldoonfig для считывания ранее
использовавшегося файла . config и определения только тех параметров, которые из
менились или являются новыми.
Все эти команды довольно просты, так как их действие сводится к установке нужных
опций. Тем не менее они мало подходят для ситуации, когда нужно поддерживать не
сколько версий ядра для различных платформ или аппаратных конфигураций.
В любом случае генерируется файл . config, имеющий примерно такой вид.
# Autornatically generated rnake config: don't edit
# Code maturity level options
CONFIG_EXPERIMENTAL=y
Компиляция ядра
Формирование файла . config - самый важный этап конфигурирования ядра Liпux,
но нужно выполнить еще ряд действий, прежде чем будет получено готовое ядро.
Схема всего процесса такова:
• загружаемого модуля;
правления.
Параметры net. inet. ip. forwarding и net. inetб. iрб. forwarding управляют
пересылкой IР-пакетов для протоколов 1Pv4 и 1Pv6.
Параметр kern.maxfiles устанавливает максимальное количество дескрипторов
файлов, которые система может открыть. Возможно, вам придется увеличить этот пара
метр в таких системах, как база данных или веб-серверы.
Параметр net. inet. tcp. mssdfl t устанавливает максимальный размер сегмента
ТСР по умолчанию, который является размером полезной нагрузки ТСР-пакета, пере
носимой по протоколу 1Pv4. Определенные размеры полезной нагрузки слишком вели
ки для сетевых линий дальней связи и, следовательно, могут быть сброшены их марш
рутизаторами. Изменение этого параметра может быть полезно при отладке проблем
с удаленной связью.
Параметр net. inet. udp. Ыackhole контролирует, будет ли возвращен пакет
ICMP с меткой "port unreachaЫe", когда пакет поступает на закрытый UDР-порт.
Включение этой опции (т.е. блокирование пакетов с меткой "port unreachaЫe") мо
жет создать помехи для сканирования портов и потенциальных злоумышленников.
нагрузку. Для серверов, которые испытывают тяжелые сетевые нагрузки, это значение,
возможно, потребуется увеличить по сравнению с заданным по умолчанию (в настоящее
время оно равно 507270 на FreeBSD 13).
Параметр kern. maxvnodes устанавливает максимальное количество виртуальных уз
лов, которые являются структурами данных ядра для отслеживания файлов. Увеличение
количества доступных виртуальных узлов может повысить пропускную способность
диска на занятом сервере. Изучите значение vfs. numvnodes на серверах, которые ис
пытывают низкую производительность; если его значение близко к значению kern.
maxvnodes, увеличьте его.
Для окончательного этапа сборки ядра в системе FreeBSD есть единая, высокоавто
матизированная команда make buildkernel, которая объединяет анализ файла конфи
гурации, создание каталогов сборки, копирование соответствующих исходных файлов
и компиляцию этих файлов. Этой целевой задаче можно указать пользовательское имя
файла конфигурации в виде переменной сборки, KERNCONF. Аналогичная целевая задача
инсталляции, make installkernel, устанавливает ядро и загрузчик.
Вот краткое описание процесса.
path[misc]=/liЬ/modules/2.6.6
# Aliases
alias Ыock-major-1 rd
alias Ыock-major-2 floppy
. ko,
/boot/kernel
/boot/modules (пере
носные, коммерческие и специальные модули). Каждый модуль ядра ис
пользует расширение имени файла но нет необходимости указывать
это расширение при загрузке, разгрузке или просмотре состояния модуля.
11. 7. ЗАГРУЗКА
Теперь, когда мы рассмотрели основы ядра, пришло время узнать, что на самом деле
происходит, когда ядро загружается и инициализируется при загрузке системы. Вы, без
сомнения, видели бесчисленные загрузочные сообщения, но знаете ли вы, что на самом
деле означают все эти сообщения?
Следующие сообщения и аннотации приводятся на некоторых ключевых этапах про
цесса загрузки. Они почти наверняка не будут точно соответствовать тому, что вы видите
в своих системах и ядрах. Тем не менее они должны дать вам представление о некоторых ос
новных темах, возникающих при загрузке, и о том, как запускаются ядра Linux и FreeBSD.
Например, микросхемы ТРМ можно использовать дпя подписания кода ядра и пля
отказа системы выполнить любую часть кода, дпя которой текущая подпись не соот
ветствует подписи ТРМ. Эта мера помогает избежать выполнения вредоносного кода.
Администратор, который ожидает иметь работоспособную микросхему ТРМ, будет не
доволен, увидев это сообщение!
В последнем сообщении показано, как ядро устанавливает часы реального времени
с батарейным питанием в текущее время суток. Это тот же пакет RTC, который мы ви
дели ранее, когда он был идентифицирован как устройство.
Feb 14 17:18:57 localhost kernel: elOOO: Intel(R) PR0/1000 Network
Driver - version 7.3.21-k8-NAPI
Feb 14 17:18:57 localhost kernel: elOOO: Copyright (с) 1999-2006 Intel
Corporation.
376 Частьl.Основыадминистрирования
Sep 25 12:48:36 bucephalus kerпel: usbusO: 12Mbps Full Speed USB vl.O
Sep 25 12:48:36 bucephalus kerпel: ugeп0.1: <Apple> at usbusO
Sep 25 12:48:36 bucephalus kerпel: uhubO: <Apple OHCI root HUB, class
9/0, rev 1.00/1.00, addr 1> оп usbusO
Sep 25 12:48:36 bucephalus kerпel: adaO at ataO bus О scbusO tgt О luп О
Sep 25 12:48:36 bucephalus kerпel: cdO at atal bus О scbusl tgt О luп О
Sep 25 12:48:36 bucephalus kerпel: cdO: <VBOX CD-ROM 1.0> RетоvаЫе
CD-ROM SCSI device
После компиляции нового ядра отредактируйте файл /boot/ gruЬ/menu. lst, чтобы
добавить его в список загрузки.
default О
fallback 1
timeout О
hiddenmenu
Для этого есть множество причин. К сбою системы могут привести неправильные ко
манды, введенные привилегированными пользователями, но более распространенной
причиной является неисправное оборудование. Ошибки физической памяти и жесткого
диска (сбойные сектора на диске или устройстве) также печально известны тем, что вы
зывают панику ядра.
Также возможно, что к сбоям приводят ошибки в реализации ядра. Однако в ядрах,
отмеченных как стабильные, такие аварии чрезвычайно редки. Драйверы устройств -
это другое дело. Они поступают из разных источников и часто имеют более низкое ка
чество кода.
380 Часть 1. Основы администрирования
Если аппаратное обеспечение является основной причиной сбоя, имейте в виду, что
авария могла произойти задолго до сбоя устройства, вызвавшего его. Например, суще
ствует возможность "горячей" замены жесткого диска. Система может довольно долго
работать бесперебойно, пока вы не попытаетесь перезагрузить или выполнить какую
либо другую операцию, зависящую от этого конкретного диска.
Несмотря на эмоциональные названия "паника" и "авария", паника ядра - это, как
правило, относительно структурированное событие. Программы из пространства поль
зователя полагаются на то, что ядро само справится с многими видами неправильного
поведения, но ядро должно выполнять мониторинг себя самого. По этой причине ядра
содержат средства для проверки работоспособности, которые пытаются проверять важ
ные структуры данных и инварианты. Ни одна из этих проверок не должна потерпеть
неудачу; если это произойдет, это будет достаточным основанием для паники и останов
ки системы, и ядро делает это профилактически.
По крайней мере, это традиционный подход. Linux немного ослабила это правило
с помощью функции oops; см. следующий раздел.
Мягкая блокировка происходит, когда система находится в режиме ядра более не
скольких секунд, тем самым предотвращая запуск пользовательских задач. Интервал на
страивается, но обычно он составляет около 10 с, что является длительным периодом,
когда процесс отказывается от циклов процессора! Во время мягкой блокировки ядро -
единственный работающий компонент, но оно по-прежнему обслуживает прерывания,
такие как сетевые интерфейсы и клавиатуры. Данные все еще текут и выходят из систе
мы, хотя и потенциально искалечены.
нагрузку на процессор.
Геометрические размеры 8 15 16 24
640х480 769 784 785 786
800 х 600 771 787 788 789
1024 х 768 773 790 791 792
1280 х 1024 775 793 884 795
1400 х 1050 834
1600 х 1200 884
11.10. ЛИТЕРАТУРА
Самую свежую информацию о ядрах можно найти не сайте lwn. net. Кроме того. мы
рекомендуем следующие книги.
• Воvп, DлNIEL Р., AND МлRсо СЕsлп. Uпderstaпdiпg the Liпих Kernel (3rd Editioп).
Sebastopo1, СА: O'Reilly Media, 2006.
• LovE, RoвERT. Liпих Kernel Developmeпt (3rd Editioп). Upper Saddle River, NJ: Addison-
Wesley Professional, 2010. (Роберт Лав. Ядро Liпих: описание процесса разработки, 3-е
издание, nep. с англ., изд. "Диалектика", 2012 г.)
• McKus1cк, MARSHALL К1Rк, п AL. The Desigп апd lmplemeпtatioп of the FreeBSD
Operatiпg System (2пd Editioп). Upper Saddle River, NJ: Addison-Wesley Professional,
2014.
• RosEN, Rлм1. Liпих Kernel Networkiпg: lmplemeпtatioп апd Тheory. Apress, 2014.
Глава 12
печать
лочки. В системе CUPS есть аналоги многих команд оболочки из классических систем
печати BSD и System V. К сожалению, система CUPS не эмулирует все, без исключения,
свойства этих систем. Иногда она эмулирует старые интерфейсы слишком хорошо; напри
мер, вместо того чтобы выдать пользователю краткую информативную справку, команды
lpr --help и lp --help просто распечатывают сообщения об ошибках.
Вот как можно было бы распечатать файлы foo.pdf и /tmp/testprint.pdf.
$ lpr foo.pdf /tmp/testprint.ps
Команда lpr передает копии файлов серверу CUPS cupsd, который сохраняет их
в очереди на печать (print queue). Когда принтер готов,CUPS начинает обрабатывать
каждый файл по очереди.
Во время печати система CUPS проверяет как документ, так и РРD-файл принте
ра (PostScript Printer Description - описание принтеров в PostScript), чтобы узнать,
что необходимо сделать для того, чтобы документ был распечатан должным образом.
(Несмотря на свое название, РРD-файлы используются и для принтеров, не понимаю
щих язык PostScript.)
Для того чтобы подготовить задание к печати на конкретном принтере, CUPS пропу
скает его через конвейер, состоящий из фильтров. Эти фильтры могут выполнять самые
разные функции. Например, фильтр может изменять формат задания так, чтобы на каж
дой физической странице печаталось по два экземпляра уменьшенных в размере страниц,
или преобразовывать задание из формата Postscript в PCL. Фильтр также может выпол
нять такую специфическую для принтера операцию обработки, как инициализация прин
тера. Фильтр даже может преобразовывать изображения в растровый формат, превращая
абстрактные инструкции, такие как "проведите линию поперек страницы", в двоичное
изображение. Такая функция полезна для принтеров, которые не могут самостоятельно
выполнять растеризацию или не понимают язык, на котором сформулировано задание.
Последним этапом в конвейере печати является внутренний интерфейс, который от
правляет задание с хоста на принтер через подходящий протокол, такой как Ethemet.
Она также отправляет информацию о состоянии обратно на сервер CUPS. Передав за
дание на печать, демон CUPS возвращается снова к обработке своих очередей и запросов
от клиентов. Принтер приступает к работе, пытаясь распечатать переданное ему задание.
Очередь на печать
Централизованное управление демона cupsd позволяет легко понять, как работают
пользовательские команды. Например, команда lpq запрашивает с сервера CUPS ин
формацию о состоянии задания и форматирует ее для отображения. Клиенты CU PS мо
гут просить сервер откладывать задания, отменять их или изменять их приоритет. Они
также могут переносить задания из одной очереди в другую.
Почти все изменения требуют указания номера задания, который сообщается в отче
те, возвращаемом командой lpq. Например, чтобы удалить какое-нибудь задание, нуж
но просто выполнить такую команду: lprm идентификатор_ задания.
Множество принтеров
Система CUPS создает для каждого принтера отдельную очередь. Для клиентов ко
мандной строки существует аргумент (обычно -Р принтер или -р принтер) для указа-
386 Часть 1. Основы администрирования
ния очереди принтера. Также можно самостоятельно задать принтер, который должен
использоваться по умолчанию, просто установив переменную окружения PRINТER:
$ export РRINТЕR=имя_принтера
или указав системе CUPS использовать определенный параметр по умолчанию для дан
ной учетной записи.
$ lpoptions -dимя_принтера
Экземпляры принтеров
Если имеется только один принтер и его нужно использовать и для быстрой печати
черновых вариантов, и для качественной печати производственных документов, система
CUPS позволяет создавать разные "экземпляры принтера".
Например, если уже есть принтер с именем Phaser 6120, команда
Сетевая печать
С точки зрения системы CUPS сеть со множеством машин не очень отличается
от изолированной машины. На каждом компьютере выполняется демон cupsd, и все
эти демоны CUPS взаимодействуют между собой.
Для того чтобы сконфигурировать демон CUPS так, чтобы он принимал задания
на печать с удаленных систем, можно отредактировать файл / etc/ cups/ cupsd. conf
(подробнее об этом будет рассказываться чуть позже в этой главе, в разделе "Настройка
сервера сетевой печати"). Настроенные таким образом серверы CU PS по умолчанию
каждые 30 с рассылают информацию об обслуживаемых ими принтерах. Благодаря это
му имеющиеся в локальной сети компьютеры автоматически узнают о доступных им
принтерах. Такую же конфигурацию можно создать, просто установив флажки в графи
ческом пользовательском интерфейсе CU PS в вашем браузере.
Если кто-нибудь подключил новый принтер или включил в сеть ноутбук либо ин
сталлировал новую рабочую станцию, то с помощью команды cupsd можно най
ти и увидеть новые компоненты сети, щелкнув на кнопке Find New Printers вкладки
Administration графического пользовательского интерфейса CU PS.
Сделать принтеры доступными для множества сетей или подсетей немного сложнее,
потому что рассылаемые пакеты не пересекают границ подсетей. Наиболее популярным
решением является выделить в каждой подсети подчиненный сервер, который будет за
прашивать информацию с серверов в других подсетях и затем рассылать ее машинам
в своей локальной подсети.
Глава 12. Печать 387
Фильтры
Вместо того чтобы использовать специализированную утилиту печати для каждого
принтера, система CUPS применяет ряд фильтров, которые преобразовывают формат
распечатываемого файла в формат, понятный для имеющегося принтера.
Схема фильтров в системе CUPS является довольно изящной. Когда система CUPS
получает подлежащий распечатке файл, она определяет его тип MIME. Затем она про
веряет файл PPD и выясняет, какие типы MIME может обрабатывать принтер. После
этого с помощью файлов . convs она решает, какая цепочка фильтров может преоб
разовать один тип в другой и сколько это будет стоить. В заключение она выбирает
цепочку и пропускает документ через фильтры. Последний фильтр в цепочке пере
дает серверу пригодный для печати формат, а он, в свою очередь, передает данные
на принтер либо через аппаратное устройство, либо через протокол, поддерживаемый
принтером.
или даже
<Location />
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
на
<Location />
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
Allow From адрес_сети
</Location>
В качестве параметра адрес сети следует указать IР-адрес сети, из которой должны
приниматься задания на печать (например, 192 .168. О. О).
Далее нужно отыскать ключевое слово BrowseAddress и указать напротив него
адрес рассылки в этой сети и порт CUPS.
BrowseAddress 192.168.0.255:631
Эти два действия заставят сервер принимать запросы с любой машины в сети и рас
сылать известную ему информацию об обслуживаемом им принтере всем имеющимся
в сети демонам CUPS. Вот и все! После перезапуска демон cupsd станет сервером.
Отключение принтера
Если вы хотите удалить принтер или класс, это можно легко сделать при помощи
команды lpadmin -х.
$ lpadmin -х fezmo
Но как быть, если нужно только временно отключить принтер для прохождения
технического осмотра, а не удалять его? В таком случае можно просто заблокировать
очередь печати на входе или выходе. Если отключить "хвост'' (т.е. выходную или прин
терную сторону) очереди, пользователи по-прежнему смогут отправлять задания, но эти
задания никогда не будут печататься. Если отключить "головную" (входную) часть оче
реди, те задания, которые уже находятся в очереди, будут распечатаны, а вот все попыт
ки добавить в очередь новые задания будут отклоняться.
Глава 12. печать 391
вателям.
Команда Функция
"""".. "... "."":1:~~~~~.~~ ... "." .. "... "..~?.?.~~~~~~"~.~.~~~~~~.~~~.У.~~~~~~.~~Р.О~~.?.:~.~~~.~.?.:~...... ".".""."." .. "......... ""
392 Часть 1. Основы администрирования
•На самом деле это просто переименованные команды disaьle и еnаЫе из System V.
Регистрационные журналы
Система CUPS поддерживает три регистрационных журнала: журнал страниц, жур
нал доступа и журнал ошибок. Журнал страниц представляет собой просто список напе
чатанных страниц. Журнал доступа и журнал ошибок похожи на аналогичные журналы
в неб-сервере Apache. И в этом нет ничего удивительного, потому что сервер CUPS -
это веб-сервер.
Уровень регистрации и путь к журнальным файлам задается в файле cupsd.conf.
Обычно журнальные файлы сохраняются в каталоге /var/log.
Ниже приведен фрагмент из журнального файла, охватывающий одно задание на печать.
I [12/Jul/2017:18:59:08 -0600) Adding start banner page "none" to job 24.
I [12/Jul/2017:18:59:08 -0600) Adding end banner page "none" to job 24.
I [12/Jul/2017:18:59:08 -0600) Job 24 queued on 'Phaser_6120' Ьу 'jsh'.
I [12/Jul/2006:18:59:08 -0600) Started filter usr/libexec/cups/filter/pstops
(PID 19985) for job 24.
I [12/Jul/2017:18:59:08 -0600) Started backend /usr/libexec/cups/backend/usb
(PID 19986) for job 24.
Глава 12. Печать 393
$ /usr/li.Ь/cups/backend/usb
direct usb "Unknown" "USB Printer (usb)"
direct usb://XEROX/Phaser%206120?serial=YGG210547 "XEROX Phaser 6120"
"Phaser 6120"
Если USВ-кабель принтера Phaser 6120 отключится, строка для этого принтера ис
чезнет из вывода внутренней программы.
$ /usr/liЬ/cups/backend/usb
direct usb "Unknown" "USB Printer (usb)"
12.4. ЛИТЕРАТУРА
Система CUPS поставляется с обширной документацией в формате HTML. Для того
чтобы получить к ней доступ, необходимо соединиться с сервером CUPS и щелкнуть
на справочной ссылке. Разумеется это не поможет, ели у вас нет связи с этим серве
ром. Впрочем, на вашем компьютере эта документация инсталлируется в каталог /usr/
share/doc/cups в форматах HTML и PDF. Если ее там нет, обратитесь к менеджеру,
поставившему дистрибутивный пакет, или на сайт cups. org.
• Sнлн, ANKtJR. CUPS Administrative Guide: А practical tutorial to installing, managing, and
securing this powerful printing system. Birmingham, U К: Packt PuЫishing, 2008.
ЧАСТЬ 11
Работа в сетях
глава 13
Сети TCP/IP
именно в Интернете позволило этому семейству одержать верх над несколькими конку
рирующими семействами, популярными в свое время по политическим или коммерче
ским причинам.
Эти протоколы образуют иерархию (или стек), в которой протокол верхнего уровня
использует протокол нижележащего уровня. Систему TCP/IP обычно описывают в виде
пятиуровневой структуры (рис. 13.1 ), но реальная система TCP/IP содержит только три
из этих уровней.
УРОВЕНЬ
ПРИЛОЖЕНИА
ТРАНа!ОРТНЫЙ
УРОВЕНЬ
сmвой
УРОВЕНЬ
IP
КАНАЛЬНЫЙ
УРОВfНЬ
ARP, драйверы устройств
ФИЗИЧЕСКИЙ
УРОВfНЬ
'Присутствие сайта Biпg компании Microsoft в этом списке особенно интересно, учитывая, что
это один из нескольких крупных сайтов, представленных в материалах Всемирной маркетинговой
кампании \Рvб Lauпch 2012 (под девизом «На этот раз это реально»). Мы не знаем полной истории
этой ситуации, но сайт Biпg, очевидно, поддерживал \Рvб в какой-то момент, а затем компания
решила, что это не стоит возникающих проблем. См. Wor ldipvбlaunch. org.
4 Эrо сайты, чьи первичные веб-адреса не связаны ни с одним адресом IPvб (записьюАААА) в DNS.
глава 13. Сети TCP/IP 403
тая обязанность. Не слушайте тех, кто продолжает отговаривать вас от перехода на 1Pv6.
Кем вы хотите быть: Google или Microsoft Bing?
Кроме того, есть аргументы в пользу внедрения протокола 1Рvб в центрах обработки
данных, где прямая связь с внешним миром через 1Pv4 не требуется. В этих ограничен
ных средах у вас действительно есть возможность перейти на IPvб и оставить 1Pv4 поза
ди, тем самым упростив свою инфраструктуру. Серверы, ориентированные на Интернет,
могут общаться с помощью протокола 1Pv4, даже если они маршрутизируют весь вну
тренний и внутренний трафик через IPvб.
В заключение приведем несколько дополнительных соображений.
Пакеты и их инкапсуляция
Система TCP/IP располагает средствами поддержки целого ряда физических сетей
и транспортных систем, включая технологии Ethemet, Token Ring, MPLS (Multiprotocol
Label Switching), беспроводную технологию Ethemet, а также системы с последователь
ными соединениями. Управление аппаратными устройствами осуществляется на ка
нальном уровне архитектуры ТСР/1 Р, а протоколам более высоких уровней неизвестно,
как именно используются аппаратные средства.
нения.
IР-адресация
Ш Дополнительную информацию о технологии NAT и пространствах частных адресов
см. в разделе 13.4.
На следующем, более высоком, уровне используется интернет-адресация (чаще
называемая IР-адресацией). IР-адреса аппаратно независимы. В любом конкретном
сетевом контексте 1Р-адрес идентифицирует конкретное и уникальное место назна
чения. Тем не менее не совсем точно говорить, что IР-адреса глобально уникальны,
потому что существует несколько исключений: NAT использует один IР-адрес интер
фейса для обработки трафика для нескольких машин; пространства частных адресов
IP - это адреса, которые могут использовать сразу в нескольких локальных сетях,
Глава 13. Сети TCP/IP 407
если эти адреса не видны в Интернете; альтернативная адресация назначает один IР
адрес нескольким машинам одновременно.
11
Адресация" имен машин
m Дополнительную информацию о системе DNS см. в главе 16.
Поскольку 1Р-адреса представляют собой длинные числа, запоминать их трудно.
Операционные системы позволяют закреплять за IР-адресом одно или несколько текстовых
имен, чтобы вместо 4. 31.198.49 пользователь мог ввести rfc-editor. org. В системах
UNIX и Linux это отображение можно осуществить с помощью статического файла (/etc/
hosts), базы данных LDAP и, наконец, DNS (Domain Name System) - глобальной системы
доменных имен. Следует помнить о том, что имя компьютера - это лишь сокращенный
способ записи IР-адреса, и он относится к сетевому интерфейсу, а не компьютеру.
Порты
IР-адреса идентифицируют сетевые интерфейсы компьютера, но они недостаточно
конкретны для идентификации отдельных процессов и служб, многие из которых могут
активно использоваться в сети одновременно. Протоколы ТСР и UDP расширяют кон
цепцию IР-адресов, вводя понятие порта. Порт представляет собой 16-разрядное число,
добавляемое к IР-адресу и указывающее конкретный канал взаимодействия. Его зна<1е
ние варьируется в диапазоне от 1 до 65535.
Стандартные службы, такие как SMTP, SSH и НТТР, ассоциируются с хорошо из
вестными портами, определенными в файле /etc/services. Вот некоторые типичные
записи из файла services.
Файл services является частью инфраструктуры. Вам не нужно изменять его, хотя
вы можете сделать это, если хотите добавить нестандартную службу. Полный список на
значенных портов вы можете найти по адресу iana.org/assignments/port-nwoЬers.
408 Часть 11. Работа в сетях
Хотя в протоколах ТСР и UDP предусмотрены порты, и эти порты имеют одина
ковые наборы потенциальных значений, их пространства портов полностью разделены
и не связаны друг с другом. Брандмауэры должны быть настроены отдельно ддя каждого
из этих протоколов.
Типы адресов
В протоколе IP поддерживается несколько типов адресов, некоторые из них имеют
эквиваленты на канальном уровне.
13.4. IР-АДРЕСА
За исключением групповых адресов, адреса Интернета состоят из двух частей: сетевой
и машинной. Сетевая часть идентифицирует логическую сеть, к которой относится адрес,
а машинная - хост этой сети. В протоколе 1Pv4 адреса состоят из четырех байтов, а гра
ница между сетевой и машинной частями устанавливается административно. В протоколе
IPvб адреса состоят из 16 байт, а сетевая и машинная части всегда состоят из 8 байт.
В протоколе 1Pv4 адреса записываются в виде группы десятичных чисел (по одному
на каждый байт), разделенных точками, например 209.85.171.147. Крайний слева байт -
старший; он всегда относится к сетевой части адреса.
Если первым байтом адреса является число 127, то оно обозначает интерфейс обратной
связи (''loopback network") - фиктивную сеть, не имеющую реального аппаратного интер
фейса и состоящую из одного компьютера. Адрес 127.0.0.1 всегда ссылается на текущий
компьютер. Ему соответствует символическое имя localhost. (Это еще одно небольшое
нарушение требования уникальности IР-адресов, поскольку каждый компьютер интер
претирует адрес 127.0.0.1 как адрес другого компьютера, хотя этим компьютером является
он сам.)
Адреса в протоколе 1Pv6 и их текстовые эквиваленты являются немного более слож
ными. Они будут рассмотрены далее в подразделе "Адресация в протоколе IPvб".
IР-адрес и другие параметры сетевого интерфейса задаются командой ifconfig.
Она описывается в разделе 13.9.
с 192-223 с.с.с.м Небольшие организации; адреса данного класса получить легко, они
выделяются целыми блоками
аЗначение О не используется в качестве первого байта обычных IР-адресов. Значение 127 зарезервировано
для адресов обратной связи.
410 Часть 11. Работа в сетях
В редких случаях в состав локальной сети входит более ста комnьютеров. По этой
nричине nолезность адресон класса А или В (которые доnускают наличие в одной сети
соответственно 16777214 и 65534 хостов) весьма сомнительна. К nримеру, 127 адресов
сетей класса А занимают nоло11ину достуnного адресного nространства. Кто же знал, что
адресное nространство nротокола 1Pv4 станет таким ценным!
Подсети 1Pv4
Для того чтобы эффективнее исnользовать адреса. оnределенную долю машинной
части адреса можно "одолжить" мя расширения сетевой части, явно указав четырехбай
товую маску nодсети ("subnet mask"), или сетевую маску (''netmask"), в которой едини
цы соответст11уют сетевой части, а нули - машинной. Единицы должны занимать левую
часть маски и следовать одна за другой без разрывов . Сетевая часть должна занимать
не менее восьми битов, а машинная - не менее двух битов. Следовательно , маска nод
сети в соответствии с протоколом 1Pv4 доnускает только 22 возможных значения.
Наnример, четыре байта адреса класса В обычно интерnретируются как С.С.М.М .
Следовательно, неявная маска подсети класса В в десятичной системе выглядит как
255.255.0.0. Однако адрес с маской 255.255.255.0 можно интерnретировать как С.С.С.М.
Использование такой маски превращает одну сеть класса В в 256 разных nодсетей, nо
добных сетям класса С, т.е. в каждую из них может входить 254 компьютера .
Маски nодсети, как и любой сетевой интерфейс , задаются с помощью команд ip или
ifconfig. По умолчанию эти команды исnользуют класс адреса для того, чтобы выяс
нить, какие биты относятся к сетевой части. Если задается явная маска, то эта функция
просто отменяется .
IР-адрес
Двоичная сетевая маска 1111 1111 1111 1111 1111 1111 1100 0000
Рис. 13. З. Структура маски подсети в разных системах счисления
В сети с маской /26 для нумерации хостов отводится шесть битов (32 - 26 = 6).
Таким образом, появляется нозможность задать 64 адреса (2 6 = 64). В действительности
допускается использовать лишь 62 адреса, поскольку адреса, полностью состоящие из
нулей или единиц, зарезер11иро11аны (для обозначения самой сети и широковещательно
го режима соответственно) .
Глава 13. Сети TCP/IP 411
В нашем примере старшие два бита последнего байта адреса могут принимать значе
ния 00, О 1, JО и 11. Таким образом, сеть 128.138.243.0/24 может быть разделена на четыре
сети /26:
• 128.138.243.0/26 (О в десятичной системе - 00000000 в двоичной);
• 128.138.243.64/26 (64 в десятичной системе - 01000000 в двоичной);
• 128.138.243.128/26 (128 в десятичной системе - 10000000 в двоичной);
• 128.138.243.192/26 (192 в десятичной системе - 11000000 в двоичной).
Выделенные полужирным шрифтом биты последнего байта каждого адреса относят-
ся к его сетевой части.
Так, в рассмотренном выше случае формула даст результат 256 - 64 = 192, где 192 -
последний байт маски. Другое правило гласит о том, что значение последнего байта
фактического адреса сети (не сетевой маски) должно нацело делиться на число хостов
сети. В рассматриваемом примере последние байты равны О, 64, 128 и 192 - каждое из
этих чисел делится нацело на 64. 5
Имея только IР-адрес (допустим, 128.138.243.100), невозможно сказать, каким будет
адрес сети и широковещательный адрес. В табл. 13.3 представлены возможные вариан
ты для масок /16 (выбирается по умолчанию для адресов класса В), /24 и /26 (наиболее
приемлемая длина, если имеющееся адресное пространство невелико).
Программа IP Calculator делает все, что требуется пользователю при работе с сетевыми
адресами и масками подсети, а также широковещательными адресами и т.п.
Ниже приведен образец работы программы ipcalc (формат вывода для наглядности
немного изменен).
$ ipcalc 24.8.175.69/28
Address: 24.8.175.69 00110000.00001000.10101111.0100 0101
Netmask: 255.255.255.240 28 llllllll.11111111.11111111.1111 0000
Wildcard: 0.0.0.255 00000000.00000000.00000000.1111 1111
=>
Network: 24.8.175.64/28 00011000.00010000.10101111.0100 0000
Broadcast: 24.8.175.65 00011000.00010000.10101111.0100 0001
HostMin: 24.8.175.78 00011000.00010000.10101111.0100 1110
HostMax: 24.8.175.79 00011000.00010000.10101111.0100 1111
Host/Net 14 Class А
Эти результаты позволяют не только просто и понятно представить адреса, но и "ко
пировать и вставлять" версии. Очень полезная программа.
Если этот калькулятор вам по каким-то причинам не подойдет, воспользуйтесь стан
дартной утилитой Ьс, поскольку она может выполнять арифметические операции в лю
бой системе счисления. Установите основания систем счисления для ввода и вывода,
используя директивы ibase и obase. Сначала выполните директиву obase, в против
ном случае ее результат будет интерпретироваться в зависимости от нового основания
системы счисления, устаноWiенной директивой ibase.
• 16 сетей с миной маски /25 - 126 хостов в каждой, сетевая маска 255.255.255.128;
• 32 сети с миной маски /26 - 62 хоста в каждой, сетевая маска 255.255.255.192 и т.д.
Для перечисленных адресов не обязательно иметь 32, 16 или даже 8 записей в таб-
лице маршрутизации. Ведь все они ссылаются на хосты одной и той же организации,
поэтому пакеты предварительно нужно доставлять в общий приемный пункт. В табли
цу маршрутизации достаточно внести запись 192.144.0.0/21. Протокол CIDR позволяет
даже выделять фрагменты адресных пространств классов А и В, благодаря чему увеличи
вается число доступных адресов.
Внутри сети допускается смешение подсетей с разной длиной маски, если только
они не перекрывают друг друга. Это называется формированием подсетей перемен
ного размера. Например, интернет-провайдер, которому выделена адресная область
192.144.0.0/21, может создать группу сетей с маской /30 для коммутируемых РРР
клиентов, несколько сетей с маской /24 - д11я крупных клиентов и ряд сетей с маской
/27 - д11я более мелких компаний.
Все хосты конкретной сети должны конфигурироваться с помощью одной сетевой
маски. Нельзя д11я одного хоста задать мину маски /24, а для другого - /25.
Выделение адресов
Формально назначаются лишь адреса сетей. Организации должны самостоятельно
определять номера компьютеров и закреплять за ними IР-адреса. Деление на подсети
также осуществляется произвольно.
Документ RFC 1918 определяет, что одна сеть класса А, 16 сетей класса В и 256 сетей
класса С резервируются для частного использования и никогда не выделяются глобаль
но. В табл. 13.5 показаны диапазоны частных адресов (каждый диапазон представлен
в более короткой нотации протокола CIDR).
Табnица 13.5. IР-адреса, зарезервированные дnя частного испопьзования
Кnасс Начапо Конец Диапазон CIDR
А 10.0.0.0 10.255.255.255 10.0.0.0/8
в 172.16.0.0 172.З 1.255.255 172.16.0.0/12
с 192.168.0.0 192.168.255.255 192.168.0.0/16
Изначально идея состояла в том, чтобы хосты могли самостоятельно выбирать класс
адресов из указанных возможностей и правильно определять свой размер. Однако в на
стоящее время протокол CIDR и подсети стали универсальным инструментом, поэтому
для всех новых частных сетей целесообразнее всего использовать адреса класса А (раз
умеется, с подсетями).
Для того чтобы хосты, использующие частные адреса, могли получать доступ
в Интернет, на пограничном маршрутизаторе организации должна выполняться систе
ма NAT (Network Address Translation - трансляция сетевых адресов). Эта система пере
хватывает пакеты и заменяет в них адрес отправителя реальным внешним IР-адресом.
Может также происходить замена номера исходного порта. Система хранит таблицу
преобразований между внутренними и внешними адресами/портами, чтобы ответные
пакеты доставлялись нужному адресату.
Многие варианты системы NAT на самом деле выполняют преобразование адресов пор
тов (Port Addre~ Tmnslation - РАТ): они используют один внешний IР-адрес и соединяют
его с несколькими внутренними хостами. Например, эта конфигурация по умолчанию уста
новлена в большинстве популярных маршрутизаторов, использующих кабель и модемы. На
практике реализации систем NAT и РАТ очень похожи, поэтому они обе называются NАТ.
Хост, использующий систему NАТ, запрашивает небольшой сегмент адресного про
странства у провайдера, но большинство адресов теперь используется для внутрисистем
ных привязок и не назначается отдельным компьютерам. Если хост позднее пожелает
сменить провайдера, потребуется лишь изменить конфигурацию пограничного маршру
тизатора и его системы NАТ, но не самих компьютеров.
Крупные организации, использующие адреса NAT и RFCl918, должны иметь неко
торую форму центральной координации, чтобы все хосты, независимо от их отдела или
административной группы, имели уникальные IР-адреса. Ситуация может осложниться,
когда одна компания, использующая адресное пространство RFC1918, приобретает дру
гую компанию, которая делает то же самое, или объединяется с ней. Части объединен
ной организации необходимо часто перенумеровывать.
Существует возможность заставить операционные системы UNIX или Linux выпол
нять функции NАТ, хотя во многих организациях предпочитают делегировать эти обя
занности маршрутизаторам или устройствам подключения к сети. 6 Вопросы, связанные
с конкретными поставщиками, мы обсудим в этой главе позднее.
Неправильная конфигурация системы NAT может привести к тому, что пакеты с част
ными адресами начнут проникать в Интернет. Они могут достичь хоста назначения, но от-
~Это настоящий 1Рv6-адрес, поэтому не используйте ero в своих системах даже для экспериментов.
В стандарте RFC3849 предполагается, что в документации и примерах указаны адреса 1Pv6
в блоке с префиксом 2 О О 1 : db В : : / З 2. Но мы хотели показать реальный пример, который
маршрутизируется в сети Интернет.
416 Часть 11. Работа в сетях
2607:f8bO:a:806:0:0:0:200e
Во-вторых, вы можете заменить любое количество смежных нулевых 16-разрядных
групп двойным двоеточием:
2607:f8b0:a:806::200e
Символы : : в адресе можно использовать только один раз. Они могут отображаться
как первый или последний компонент. Например, адрес обратной связи IPv6 (аналогич
ный 127.0.0.1 в 1Pv4) равен : : 1, что эквивалентно О: О: О: О: О: О: О: 1.
Исходная спецификация адресов 1Pv6, RFC492 l, описывала эти упрощения нотации,
но не требовала их использования. В результате для записи заданного 1Рv6-адреса может
существовать несколько способов, совместимых со спецификацией RFC491, что иллю
стрируется несколькими версиями приведенного выше примера.
Эrа полиморфность делает поиск и сопоставление трудной задачей, потому что адре
са перед сравнением необходимо нормализовать. Это проблема: мы не можем ожидать,
что стандартное программное обеспечение для обработки данных, такое как электрон
ные таблицы, языки сценариев и базы данных, знает подробности нотации 1Pv6.
Документ RFC5952 обновил спецификацию RFC492 l, чтобы сделать упрощенные
обозначения обязательными. Он также добавил еще несколько правил, гарантирующих,
что каждый адрес имеет только одно текстовое представление.
Префиксь1 /Рvб
Адреса 1Pv4 не были предназначены ДIIЯ географической кластеризации наподобие
телефонных номеров или почтовых индексов, но кластеризация бьmа добавлена пост
фактум в виде соглашений CIDR. (Разумеется, соответствующая "география" на самом
деле представляет собой пространство маршрутизации, а не физическое местоположе
ние.) Протокол CIDR бьm настолько технически успешным, что иерархическое перена
значение сетевых адресов теперь принимается во всем протоколе 1Pv6.
Ваш интернет-провайдер IPv6 получает блоки префиксов 1Pv6 от одного из регио
нальных реестров, перечисленных в табл. 13.4. Интернет-провайдер, в свою очередь,
назначает вам префикс, который вы добавляете к локальным частям адресов, обычно
Глава 13. сети TCP/IP 417
Всякий раз, когда префикс адреса представляется в текстовой форме, протокол 1Pv6
использует обозначение CIDR для представления длины префикса. Общий шаблон име
ет следующий вид:
/Рvб-адрес/префикс-длина-в-десятичном-виде
Часть 1Рv6-адреса приведена в предыдушем разделе. Это должен быть полноразмер
ный 128-разрядный адрес. В большинстве случаев биты адресов за префиксом устанав
ливаются равными нулю. Однако иногда бывает необходимо указать полный адрес хоста
вместе с длиной префикса; намерение и смысл обычно ясны из контекста.
1Рv6-адрес, указанный в предыдущем разделе, приводит к серверу Google. 32-разряд
ный префикс, который маршрутизируется на североамериканской интернет-магистра
ли, имеет вид:
10 8 этом случае длина префикса блока адреса, назначенного регистратором AR1N, и записи
Туннелирование/Рvб
Для облегчения перехода от 1Pv4 к 1Pv6 были предложены различные схемы, в ос
новном ориентированные на способы туннелирования трафика 1Pv6 через сеть 1Pv4
для компенсации пробелов в поддержке 1Pv6. Две широко используемые системы тун-
Глава 13. Сети TCP/IP 419
13.5. МАРШРУТИЗАЦИЯ
Маршрутизация - это процесс направления пакета по лабиринту сетей, находящих
ся между отправителем и получателем. В системе TCP/IP маршрутизация происходит
примерно так, как путешественник, первый раз посетивший страну, находит нужный
ему дом, задавая вопросы местным жителям. Первый человек, с которым он заговорит,
возможно, укажет ему нужный город. Войдя в город, путешественник спросит другого
человека, и тот расскажет, как попасть на нужную улицу. В конце концов наш путеше
ственник подойдет достаточно близко к конечному пункту своих странствий, чтобы кто
нибудь указал ему дом, который он ищет.
Маршрутная информация в системе TCP/IP имеет форму правил (маршрутов), на
пример: "Для того чтобы достичь сети А, посылайте пакеты через компьютер С". Часто
существует и стандартный маршрут. В нем объясняется, что нужно делать с пакетами,
предназначенными для отправки в сеть, маршрут к которой не указан явным образом.
Данные маршрутизации хранятся в одной из таблиц ядра. Каждый элемент этой
таблицы содержит несколько параметров, включая сетевую маску. Для направления
пакета по заданному адресу ядро подбирает наиболее конкретный маршрут (т.е. тот,
где самая длинная маска). Если ни один из маршрутов (в том числе стандартный) не
подходит, то отправителю возвращается IСМР-сообщение вида "network unreachaЫe"
(сеть недоступна).
Слово "маршрутизация" широко употребляется в двух различных смыслах:
Таблицы маршрутизации
Таблицу маршрутизации можно просмотреть с помощью команды ip route show
в системе Linux или netstat -r в системе FreeBSD. Команда netstat в системе Linux
также существует и продолжает применяться. Мы используем ее в примерах просто, что
бы не приводить две разные версии одного и того же вывода. Версия ip выдает такое же
содержимое, но в другом формате.
420 Часть 11. Работа в сетях
Команда netstat -rn запрещает поиск доменных имен в системе DNS и выводит
всю информацию в числовом виде, что в принципе полезнее. Ниже приводится таблица
маршруrизации IPv4, которая должна дать читателям более ясное представление о том,
что такое маршруr.
11 Маршрутизация по 1Р-адресу отправителя является исключением из этоrо правила; см. раздел 13.8.
Глава 13. Сети TCP/IP 421
• В системе
трами
FreeBSD допустимость переадресации ICMP управляется параме
net. inet. icmp. drop redirect и net. inetб. icmpб. rediraccept
соответственно. Для того чтобы игнорировать переадресацию установите их
равными единице и нулю соответственно в файле /etc/sysctl. conf.
активации новых установок необходимо выполнить перезагрузку или ко
манду sudo /etc/rc.d/sysctl reload).
(Для
422 Часть 11. Работа в сетях
•
команда ip neigh show отображает содержимое кеша .
В системе FreeBSD команда arp управляет кешем ARP, а команда ndp пре
доставляет доступ к кешу ND.
Эти команды, как правило, применяются для отладки и при работе со специальным
оборудованием. Например, если два хоста сети имеют одинаковый IР-адрес, то на од
ном из них запись в АRР-таблице будет правильной, а на другом - нет. С помощью
команды arp можно найти хост-нарушитель.
Неправильные записи в кеше могут быть признаком того, что некто, имеющий до
ступ в вашу локальную сеть осуществляет подмену сетевого трафика. Этот вид атаки
известен как АRР-фишинг (ARP spoofing) или отравление кеша (cache poisoning).
• адреса DNS-cepвepoв;
Существуют десятки других параметров (см. RFC2132 для \Pv4 и RFC3315 для lvб).
Впрочем, на практике экзотические параметры используются редко.
Периодически клиенты должны повторно обращаться к DНСР-серверу с целью
продления срока аренды. Если этого не делать, аренда рано или поздно закончится.
DНСР-сервер будет тогда волен предоставить адрес (или иной арендованный параметр)
другому клиенту. Срок аренды конфигурируется, но обычно он достаточно велик (до не
скольких дней).
Даже если вы хотите, чтобы каждый хост имел собственный постоянный IР-адрес,
протоколDHCP может значительно сэкономить ваши время и усилия. Когда сервер
DHCP сконфигурирован и запущен, клиенты почти автоматически определяют параме
тры сетевой конфигурации на этапе начальной загрузки, и никакой путаницы не воз
никает.
Все основные дистрибутивы системы Linux используют ту или иную версию пакета
ISC, хотя его серверную часть, возможно, придется устанавливать явно. В системах
Red Hat и CentOS эта серверная часть называется dhcp, в системах Deblan и Ubuntu -
ics-dhcp-server, а в системе FreeBSD - ics-dhcp43-server. Убедитесь, что вы
установили именно то программное обеспечение, которое хотели, поскольку многие
системы имеют собственные реализации серверной и клиентской частей протокола
DHCP.
Мы рекомендуем не вмешиваться в клиентскую часть протокола DHCP, поскольку
эта часть кода относительно проста и поставляется заранее сконфигурированной и го
товой к использованию. Изменение клиентской части протокола DHCP - непростая
задача.
• адреса подсетей, ДJIЯ которых демон dhcpd должен управлять IР-адресами, и диа
пазоны выделяемых адресов;
МАС-адреса получателей;
На справочной странице (man page), посвященной демону dhcpd, дан обзор процес
са конфигурации. Точный синтаксис конфигурационного файла описан на справочной
странице файла dhcpd. conf. Кроме того, следует убедиться, что демон dhcpd автома
тически запускается на этапе начальной загрузки системы (см. главу 3). Если система
не выполняет эту операцию автоматически, полезно сделать запуск демона условным,
host gandalf {
hardware ethernet 08:00:07:12:34:56;
fixed-address gandalf.synack.net;
Если вы не назначаете статические адреса, как это сделано выше, необходимо про
анализировать, как ваша DНСР-конфигурация будет взаимодействовать с системой
DNS. Проше всего присвоить каждому динамически выделяемому адресу общее имя
(например, dhcpl. synack. net) и разрешить, чтобы имена отдельных компьютеров из
менялись вместе с IР-адресами. В качестве альтернативы можно сконфигурировать де
мон dhopd так, чтобы он обнонлял базу данных DNS при выделении очередного адреса.
Динамические обновления - сложное решение, но оно позволяет сохранять имена ком
пьютеров неизменными.
Перенаправление IР-пакетов
Если в UNIX- или Linux-cиcтeмe разрешено перенаправление IР-пакетов, то ком
пьютер может выступать в качестве маршрутизатора. Иначе говоря, он может прини
мать пакеты от третьей стороны, поступающие на его сетевой интерфейс и пересылать
их шлюзу или хосту через другой интерфейс.
Если ваша система не имеет несколько сетевых интерфейсов и не предназначена
для функционирования в роли маршрутизатора, эту функцию рекомендуется отключить.
Хосты, перенаправляющие пакеты, часто оказываются вовлеченными в атаки на системы
безопасности, будучи вынужденными выдавать внешние пакеты за свои собственные. Эта
уловка позволяет пакетам :иоумышленников обходить сетевые сканеры и фильтры.
Лучше всего, чтобы хост использовал несколько сетевых интерфейсов для своего
собственного трафика и не пересылал посторонние пакеты.
Но, согласитесь, вряд ли можно назвать приемлемой ситуацию, когда на несколько ча
сов весь трафик организации перенаправляется конкуренту, особенно если в это время
выполняется резервное копирование. Мы рекомендуем так конфигурировать маршрути
заторы (или системы, играющие роль маршрутизаторов), чтобы переадресующие IСМР
пакеты игнорировались и, возможно, фиксировались в журнальном файле.
Подмена IР-адресов
Исходный адрес IР-пакета обычно заполняется реализациями протокола TCP/IP
в ядрах и представляет собой адрес хоста, с которого был отправлен пакет. Но если про-
14Тем не менее маршрутизация по адресу отправителя в протоколе IPv6 может быть в некоторой
степени реабилитирована в виде "сегментной маршрутизации", которая теперь интегрирована в
ядро Linux (см. L wn . пе t / Ar ti с 1еs/7 2 2 В О 4, где обсуждается эта технология).
428 Часть 11. Работа в сетях
зоне. Это особенно важно в университетских сетях, где студенты любят эксперименти
ровать и часто подобным образом срывают свою злость.
В то же время, если в локальной сети используются адреса из частного диапазона,
то фильтрации могут подвергаться пакеты с частными адресами, пытающиеся "проско
чить" в Интернет. Ответ на такие пакеты никогда не будет получен из-за отсутствия со
ответствующих маршрутов в магистральной сети. Их появление свидетельствует о том,
что в системе имеется внутренняя ошибка конфигурации.
Необходимо также защищаться от хакеров, подделывающих исходные адреса внеш
них пакетов, вследствие чего брандмауэр начинает считать, будто они поступили из ло
кальной сети. Помочь этому может эвристический метод, "одноадресная трансляция
по обратному пути " (unicast reverse path forwarding - uRPF). В этом случае IР-шлюзы
будут отвергать все пакеты, удовлетворяющие следующему условию: интерфейс, через
который пришел пакет, не совпадает с тем интерфейсом, через который пакет уйдет,
если его исходный адрес будет равен целевому адресу. Для проверки источника сетевых
пакетов этот метод использует обычную таблицу IР-маршрутизации. Метод uRPF при
меняется не только в специализированных маршрутизаторах, но и в ядре системы Linux,
в которой этот режим включен по умолчанию.
Если ваш сервер имеет несколько выходов в Интернет, целесообразно разделить
внешние маршруты на исходящие и входящие. В этом случае следует отключить режим
uRPF, чтобы протокол маршрутизации работал правильно. Если же выход в Интернет
только один, безопаснее включить режим uRF.
Встроенные брандмауэры
Как правило, соединение вашей локальной сети с внешним миром и управление тра
фиком в соответствии с правилами, принятыми в организации, осуществляют сетевые
фильтры пакетов или брандмауэры (firewalls). К сожалению, компания Microsoft извра
тила представление о том, как должен работать брандмауэр, на примере своих систем
Windows, печально известных своей уязвимостью. Несколько последних выпусков систе
мы Windows содержали свои собственные брандмауэры и "громко возмущались", когда
пользователь пытался их отключить.
С этой точки зрения системы VPN, основанные на протоколе TLS, являются лидера
ми. Они также безопасны, как и протокол IPsec, но намного проще. Свободная реализа
ция в виде OpenVN также не наносит никакого вреда. (К сожалению, эта система пока
не работает под управлением операционных систем HP-UX и AIX.)
Для поддержки пользователей, работающих дома или в поездке, стало общеприня
тым использование небольшого компонента Java или ActiveX, загружаемого через их
веб-браузеры. Эти компоненты устанавливают соединение VPN с сетью предприятия.
Этот механизм удобен для пользователей, но следует учесть, что браузеры сильно от
личаются друг от друга: некоторые из них реализуют службу VPN с помощью псевдо
сетевого интерфейса, а другие используют только специальные порть1. Впрочем, веб
браузеры последней категории намного малочисленнее, чем знаменитые веб-прокси.
Пожалуйста, проверьте, что вы правильно понимаете технологию, на которой основа
ны применяемые решения, и не ожидайте невозможного. Истинная служба VPN (т.е. пол
ноценное 1Р-соединение через сетевой интерфейс) требует наличия административных
привилегий и инсталляции программного обеспечения на клиентской машине, независи
мо от того, какая операционная система на ней установлена: Windows или UNLX. Кроме
того, следует проверить совместимость браузера, поскольку механизм, применяемый при
реализации систем VPN с помощью одного браузера, часто не поддерживается другим.
430 Часть 11. Работа в сетях
Если в сети используется сервер DHCP (Dynamic Host Configuration Protocol - про
токол динамического конфигурирования хостов), он возьмет на себя перечисленные
выше обязанности. Инсталляция новой операционной системы обычно настраива
ет свою конфигурацию через протокол DHCP, поэтому новые машины могут вообще
не потребовать определения сетевой конфигурации. Общая информация о протоколе
DHCP приведена в разделе 13.7.
После внесения любого изменения, которое может повлиять на загрузку операци
онной системы, следует выполнить ее перезагрузку, чтобы проверить, что машина была
подключена правильно. Через полгода, когда произойдет сбой питания и машина от
кажется загрузиться, будет сложно вспомнить, какие изменения вызвали эти проблемы.
Процесс проектирования и инсталляции физической сети описан в главе 14. Если вы
имеете дело с существующей сетью и в общих чертах знаете, как она организована. то,
наверное, читать о физических аспектах сетей имеет смысл только в том случае, когда
планируется расширение действующей сети.
В этом разделе мы рассмотрим разные команды и проблемы, связанные с ручной на
стройкой конфигурации сети. Этого вполне достаточно для применения к любой версии
систем UNIX или Linux. В разделах, посвященных конкретным версиям операцион
ных систем, мы обсудим особенности, которые отличают эти системы от систем UNIX
и Linux и друг от друга.
Просматривая базовую конфигурацию сети любой машины, полезно протестировать
соединение с помощью базовых инструментов, таких как утилиты ping и tUЬuntuoute.
Эти инструменты описаны в разделе 13.12.
15 Для этой цели можно также использовать разделенную конфигурацию системы DNS (см. раз
дел 16.7).
432 часть 11. Работа в сетях
ные протоколы, которые обычно требуется настроить, но важно понимать, что конфи
гурации определены для пар интерфейс-протокол. В частности, протоколы 1Pv4 и 1Pv6
являются полностью отдельными мирами, каждый из которых имеет свою собственную
конфиГурацию.
IР-конфигурация в основном связана с настройкой lР-адреса для интерфейса.
Протокол 1Pv4 также должен знать маску подсети (сетевую маску) для подключенной
сети, чтобы она могла различать сетевые и хостовые части адресов. На уровне сетевого
трафика внутри и вне интерфейса 1Pv6 не использует сетевые маски; сетевая и хостовая
части адреса lPvб имеют фиксированный размер.
В протоколе 1Pv4 можно назначить широковещательный адрес на любой IР-адрес,
действительный для сети, к которой подключен компьютер. Некоторые организации вы
брали странные значения для широковещательного адреса в надежде избежать определен
ных типов атак типа "отказ в обслуживании", которые используют широковещательные
эхо-запросы, но это рискованно и, вероятно, излишне. Неправильная настройка широко
вещательного адреса каждой машины может привести к широковещательным штормам,
в которых пакеты перемещаются от машины к машине до истечения срока их ТГL. 16
Лучший способ избежать проблем с широковещательными сообщениями - не до
пустить, чтобы ваши пограничные маршрутизаторы пересылали их, и сделать так, чтобы
отдельные хосты не реагировали на них. В протоколе lPvб больше нет широковещатель
ной передачи; она заменена различными формами многоадресатной рассылки.
Интерфейсу можно назначить несколько IР-адресов. В прошлом иногда было по
лезно сделать так, чтобы один сервер мог обслуживать несколько веб-сайтов; однако
потребность в этой функции была заменена заголовком НТТР Host и функцией SNI
для TLS (см. раздел 19.1).
Настройка маршрутизации
Маршрутизация рассматривается нами в этой и 15-й главе. И хотя информация
по основам маршрутизации и командах ip route (Linux) и route (FгeeBSD приведена
здесь, полезно прочитать также несколько первых разделов главы 15.
Маршрутизация осуществляется на уровне протокола lP. Когда приходит пакет,
предназначенный для другого хоста, его IР-адрес получателя сравнивается с записями
в таблице маршрутизации ядра. При совпадении (хотя бы частичном) с каким-нибудь
маршрутом в таблице пакет направляется по IР-адресу следующего шлюза, связанного
с данным маршрутом.
Но есть два особых случая. Во-первых, пакет может быть адресован компьютеру,
включенному в ту же сеть, что и хост-отправитель. В этом случае адрес следуюшего
шлюза соответствует одному из интерфейсов локального компьютера, и пакет посыла
ется прямо получателю. Маршруты такого типа добавляются командами ifconfig и ip
address при конфигурировании интерфейса.
какой для этой цели назначен широковещательный IР-адрес. Например, предположим, что
машина Х считает, что широковещательный адрес равен А\, а машина У - А2. Если Х отправит
пакет по адресу AI, то У получит пакет (поскольку адрес получателя канального уровня является
широковещательным адресом), увидит, что пакет не предназначен для него и не отправлен по
широковещательному адресу (потому что У считает, что широковещательный адрес равен А2),
поэтому может перенаправить пакет обратно в сеть. Если две машины находятся в состоянии
У, пакет будет циркулировать до истечения срока его TTL. Широковещательные штормы могут
подорвать пропускную способность, особенно в большой коммутируемой сети.
434 Часть 11. Работа в сетях
• Если вы хотите увидеть имена, а не числа, то для того, чтобы проверить существу
ющие маршруты, используйте команды netstat -nr или netstat -r. Числа ча
сто удобнее при отладке, поскольку преобразование их в имена не всегда работает
должным образом. Пример работы команды netstat приведен в разделе 13.5. В
системе Linux команда ip route show считается стандартом де-факто для про
смотра маршрутов. Однако, по нашему мнению, ее вывод менее понятен, чем вы
вод команды netstat.
• Для указания стандартного маршрута системы используйте ключевое слово
default вместо адреса или сетевого имени. Мнемонически оно эквивалентно
значению О.О.О.О/О, что соответствует любому адресу и менее конкретно, чем лю
бой реальный адрес пункта назначения маршрута.
• Для того чтобы удалить записи из таблицы маршрутизации, используйте команды
ip route delete (Linux) или route del (FreeBSD).
• Для инициализации таблицы маршрутизации и начала работы используйте коман
ды ip route flush (Linux) или route flush (FreeBSD).
• Маршруты в протоколе 1Pv6 задаются так же, как и маршруты в протоколе 1Pv4.
Для того чтобы указать команде ip route, что используется адресное простран
ство протокола 1Pv6, необходимо использовать опцию -6. Как правило, команда
ip route без проблем распознает маршруты 1Pv6 (проверяя формат адреса), но
аргумент -6 также допускается.
Конфигурирование DNS
Для того чтобы сконфигурировать компьютер в качестве DNS-клиента, достаточно
отредактировать файл /etc/resolv.conf. DNS-служба при этом, строго говоря, не
нужна, но трудно представить себе ситуацию, в которой без нее можно было бы вообще
обойтись.
Файл resolv. conf содержит список DNS-доменов, просматриваемых при анализе
неполных имен (например, anchor вместо anchor. cs. colorado. edu), и список IР
адресов серверов имен, в которых осуществляется поиск имен. Ниже показан пример
этого файла; подробнее о нем рассказывается в разделе 16.1.
search cs.colorado.edu colorado.edu
nameserver 128.138.242.1
nameserver 128.138.243.151
nameserver 192.108.21.1
Первым в файле /etc/resolv. conf должен быть указан ближайший стабильный
сервер имен. Серверы опрашиваются по очереди и перерыв между последователь
ными опросами может оказаться довольно долгим. Всего можно задать три записи
nameserver. Желательно указывать более одного сервера.
Если локальный хост получает адреса своих DNS-служб через протокол DHCP, то
клиентское программное обеспечение протокола DHCP записывает адреса, полученные
в аренду, в файл resolv. conf. Поскольку конфигурация DHCP в большинстве систем
задана по умолчанию, обычно нет необходимости редактировать файл resolv. conf са
мостоятельно, если DНСР-сервер настроен корректно.
Многие серверы используют реализацию DNS-cepвepa Active Directory, созданную
компанией Miscosoft. Она прекрасно работает с файлом resolv. conf, используемым
в системах UNIX и Linux, и нет никакой необходимости придумывать что-либо другое.
• Основная конфигурация.
• Конфигурация DНС-клиента.
• Динамическое конфигурирование и настройка.
• Безопасность, брандмауэры, фильтрация и конфигурация NАТ.
Программа NetworkManager
Поддержка работы в мобильной сети, осуществляемая в системе Linux, некоторое время
бьша довольно неорганизованной, пока в 2004 r. не появилась программа NetworkManager.
Она состоит из службы, предназначенной для непрерывного функционирования, а также
приложения для работы с областью уведомлений, позволяющего конфигурировать ин
дивидуальные сетевые интерфейсы. Кроме разнообразных проводных сетей, программа
NetworkManager поддерживает также работу беспроводных сетей, систем беспроводного
широкополосного доступа и частных виртуальных сетей (virtual private network - VPN). Она
постоянно осуществляет оценку доступных сетей и переключает службу на "предпочтитель
ные" сети, как только те становятся доступными. Наиболее предпочтительными являются
проводные сети, за ними следуют обычные беспроводные сети.
Все это довольно сильно изменило сетевую конфигурацию системы Linux. Помимо
того что она стала более изменчивой по сравнению с традиционной статической кон
фигурацией, теперь она запускается и управляется пользователем, а не системным ад
министратором. Программа NetworkManager широко внедрена в дистрибутивы систем
Linux, включая все экземпляры, рассматриваемые в книге, но для того, чтобы избежать
нарушения существующих сценариев и настроек, она обычно предусматривается как
В данном случае раздел broadcast является излишним, потому что в любом случае
это значение будет установлено по умолчанию с учетом сетевой маски. Но если бы вам
потребовалось задать этот параметр явным образом, это можно сделать именно так, как
показано выше.
Файл Содержимое
DEVICE=ethO
IPADDR=l92.168.l.13
NETМASK=255.255.255.0
NETWORK=l92.168.l.O
BROADCAST=l92.168.l.255
ONBOOT=yes
и
DEVICE=lo
IPADDR=l27.0.0.l
NETМASK=255.0.0.0
NETWORK=l27.0.0.0
BROADCAST=l27.255.255.255
ONBOOT=yes
NAМE=loopback
DEVICE=ethO
BOOTROTO=dhcp
ONBOOT=yes
После изменения информации о конфигурации в каталоге /etc/sysconfig следует
выполнить команду ifdown имя_ инт, а затем ifup имя_ инт, где имя_ инт - имя соот
ветствующего интерфейса. Для одновременной конфигурации нескольких интерфейсов
можно использовать команду service network restart, которая перезагружает сеть.
440 Часть 11. Работа в сетях
Еще одним полезным вариантом является опция -k, которая показывает, какая из
задач, связанных с протоколом, бьmа назначена сетевому интерфейсу, а не выполняется
ядром. Большинство интерфейсов может вычислять контрольные суммы, а также вы-
Глава 13. Сети TCP/IP 441
показывает, что значение этой переменной равно нулю, т.е. широковещательная про
верка связи не игнорируется. Для того чтобы установить это значение равным единице
(и тем самым предотвратить атаку DoS типа Smurf), следует выполнить команду
ubuntu# sudo sh -с "echo 1 > icmp_echo_ignore_broadcasts" 19
в каталоге/proc/sys/net или
ubuntu$ sysctl net.ipv4.icmp_echo_ignore_broadcasts=l
Имена переменных в команде sysctl представляют собой имена путей относи
тельно каталога /proc/вys. Традиционным разделителем являются точки, но команда
sysctl также допускает использование обратной косой черты.
19 Если попытаться выполнить эту команду в форме sudo echo 1 > icmp echo iqnore
Для того чтобы указанные изменения стали постоянными (или, говоря точнее, чтобы
они восстанавливались при каждой перезагрузке системы), добавьте соответствующие
переменные в каталог / etc/ sysctl . conf, который считывается командой sysctl во
время загрузки. Например, строка
net.ipv4.ip_forward=O
в файле/ etc/ sysctl . conf отключает пересылку 1Р-пакетов на заданный хост.
Некоторые подкаталоги каталога /proc документированы лучше, чем другие.
Рекомендуем обратиться к разделу 7 справочной системы протокола. Например, коман
да шаn 7 iсшр документирует четыре из шести возможных вариантов. (При этом не
обходимо, чтобы справочные страницы о ядре системы Linux были инсталлированы за
ранее.)
Кроме того, полезные комментарии можно найти в файле ip-sysctl. txt, находя
щемся в дистрибутивах исходного кода ядра. Если исходный код ядра не инсталлирован,
то отправьте в поисковую систему запрос ip-sysctl-txt.
•В качестве параметра интерфейс может быть задано имя конкретного интерфейса или ключевое слово all.
444 Часть 11. Работа в сетях
Параметр адрес указывает IР-адрес интерфейса. Здесь также допустимо имя хоста,
но оно должно определено для IР-адреса во время загрузки. Для основного интерфейса
машины это означает, что имя хоста должно быть указано в файле локальных хостов,
поскольку другие методы определения имен зависят от инициализации сети.
Для сетей, имеющих подсети, можно указать сетевую маску в стиле CIDR, как по
казано в примере выше, или включить отдельный аргумент netmask. Маска может быть
указана в десятичной системе с точками или в виде 4-байтового шестнадцатеричного
числа, начинающегося с Ох.
Параметр broadcast указывает IР-широковещательный адрес интерфейса, выражен
ный в шестнадцатеричной или точечной четырехзначной нотации. Широковещательный
адрес по умолчанию - это номер, в котором машинная часть состоит из одних единиц.
hostname="freebeer"
ifconfig_emO="inet 192.168.0.48 netmask 255.255.255.0"
defaultrouter="l92.168.0.1"
Каждый сетевой интерфейс имеет собственную переменную ifconfig_*. Значение
переменной просто передается команде ifconfig как ряд аргументов командной стро
ки. Раздел defaul trouter определяет сетевой шлюз по умолчанию.
Чтобы получить сетевую конфигурацию системы с DНСР-сервера, используйте сле
дующий параметр:
ifconfig_emO="DHCP"
Эта форма является "черным ящиком" и не передается команде ifconfig, которая
не знает, как интерпретировать аргумент DHCP. Вместо этого она активирует сценарии за
пуска команды dhclient emO. Чтобы изменить рабочие параметры системы DHCP (вре
мя ожидания и т.д.), установите их в файле / etc/ dhclien t. conf. Версия этого файла
по умолчанию пуста, за исключением комментариев, и обычно ее не нужно изменять.
Если вы измените конфигурацию сети, то можете выполнить команду service
netif restart, чтобы повторить начальную процедуру настройки. Если вы изменили
параметр defaultrouter, также выполните команду service routing restart.
20 Если
машина подвисает во время загрузки, загружается очень медленно или зависает от входящих
соединений SSH, основной подозреваемой должна быть система DNS. В большинстве систем
используется механизм преобразования имен, который настраивается в файле / etc/nsswi tch.
conf. Если в системе запущен nscd, демон кеширования службы имен, этот компонент заслуживает
некоторого подозрения. Если демон nscd выходит из строя или неправильно сконфигурирован, это
влияет на поиск имен. Используйте команду getent, чтобы проRерить правильность работы ваших
механизмов преобразования имен и серверов имен (например, getent hosts qooqle. com).
21 0братите внимание на то, что в последних версиях операционной системы Windows эхо-запросы
по умолчанию блокируются.
448 Часть 11. Работа в сетях
хост игнорирует эхо-запрос, убедитесь, что брандмауэр не мешает вашей отладке. Чтобы
облегчить отладку, можно ненадолго отключить промежуточный межсетевой экран.
Если ваша сеть находится в плохом состоянии, возможно, что не работает система
DNS. Упростите ситуацию, используя числовые IР-адреса при выполнении эхо-запро
сов, и примените параметр -n команды ping для предотвращения попыток выполнить
обратный поиск по IР-адресам - этот поиск также инициирует запросы DNS.
Помните о проблеме брандмауэра, если вы используете команду ping для проверки
возможности подключения к Интернету. Одни известные серверы отвечают на пакеты
эхо-запросов, а другие нет. Мы обнаружили, что сервер google. сот всегда отвечает
на эхо-запросы.
на IСМР-пакеты, это означает, что маршрутизатор может отложить ответ на ваш эхо-за
прос, если он в текущий момент обрабатывает большой объем другого трафика.
Программа ping может отправлять пакеты эхо-запросов любого размера, поэтому,
используя пакет, превышающий MTU сети (1500 байт для Ethernet), вы можете прину
дительно ero фрагментировать. Эта практика помогает идентифицировать ошибки сре
ды передачи данных или другие проблемы низкого уровня, такие как проблемы с пере
груженной сетью или VPN. Размер требуемого пакета задается в байтах после флага -s:
$ ping -s 1500 cuinfo.cornell.edu
Обратите внимание на то, что даже такая простая команда, как ping, может вызвать
драматические последствия. В 1998 г. так называемая атака "Ping of Death" вывела из
строя большое количество систем UNIX и Windows. Эта атака была выполнена просто
путем передачи слишком большого пакета эхо-запросов. Когда фрагментированный
пакет был повторно собран, он заполнил буфер памяти получателя и вывел машину из
строя. Хотя проблема "Ping of Death" уже давно исправлена, следует иметь в виду не
сколько других предостережений относительно команды ping.
Во-первых, только с помощью команды ping трудно отличить отказ сети от от
каза сервера. В среде, где обычно выполняются эхо-запросы, неудачное выполнение
команды ping просто говорит вам о том, что что-то идет не так, как надо. Также стоит
отметить, что успешный эхо-запрос не дает подробной информации о состоянии целе
вой машины. Пакеты эхо-запросов обрабатываются в стеке протокола IP и не требуют,
чтобы серверный процесс выполнялся на зондируемом хосте. Ответ гарантирует только,
что машина включена и не испытала панику ядра. Для проверки доступности отдельных
служб, таких как НТТР и DNS, вам понадобятся методы более высокого уровня.
$ traceroute nuЬark
traceroute to nubark (192.168.2.10), 30 hops max, 38 byte packets
1 lab-gw (172.16.8.254) 0.840 ms 0.693 ms 0.671 ms
2 dmz-gw (192.168.1.254) 4.642 ms 4.582 ms 4.674 ms
3 nubark (192.168.2.10) 7.959 ms 5.949 ms 5.908 ms
Анализируя этот вывод, мы можем сказать, что хост j agua r находится в трех переходах
от nubark, и мы можем видеть, какие шлюзы задействованы в соединении. Также показано
время прохождения в оба конца для каждого шлюза - в выводе измеряются и отобража
ются три отсчета для каждого перехода. Типичный маршрут между интернет-хостами часто
включает в себя более 15 переходов, даже если оба сервера находятся в одном городе.
22 Эrа команда есть даже в системе Windows, но nод именем tracert (nоnробуйте догадаться, почему).
450 Часть 11. Работа в сетях
21 Мы удалили несколько долей миллисекунд из более длинных строк, чтобы они уместились на
странице.
Глава 13. Сети TCP/IP 451
нам. Ядро lnit Seven простирается от Цюриха (zur) до Франкфурта (fra), Амстердама
(ам), Лондона (lon) и, наконец, Лос-Анджелеса (lax). Здесь трафик переносится в сеть
cenic. net, которая доставляет пакеты хосту caida. org в сети компьютерного центра
San Diego Supercomputer Center (sdsc) в Ла-Холле, Калифорния.
На переходе 8 мы видим звездочку вместо одного из показателей. Это означает, что
не был получен ответ на зондирующий пакет (т.е. пакет с ошибкой). В данном случае
вероятной причиной является затор, но это не единственная возможность. Команда
traceroute использует низкоприоритетные IСМР-пакеты, которые многие маршрути
заторы распознают и отбрасывают в пользу реального трафика. Несколько звездочек не
должны приводить вас в состояние паники.
Если вы видите звездочки во всех полях времени для данного шлюза, значит, из этой
машины не возвращаются сообщения об истечении времени. Возможно, шлюз просто
не работает. Иногда шлюз или брандмауэр настроены на безмолвное удаление пакетов
с просроченными ТГL. В этом случае вы все равно можете видеть, что находится за "не
мым" шлюзом хоста. Вполне возможно, что ошибочные пакеты шлюза возвращаются
слишком медленно, поэтому команда traceroute перестает их ждать.
Некоторые брандмауэры полностью блокируют сообщения ICMP об истечении вре
мени. Если такой брандмауэр расположен вдоль пути, вы не получите информацию
о каком-либо из шлюзов, расположенных за ним. Тем не менее вы все равно можете
определить общее количество переходов в пункт назначения, потому что зондирующие
пакеты в конечном итоге проходят всегда.
Если вам кажется, что команда traceroute не работает или работает медленно, это
может объясняться временем ожидания при попытке определить имена хостов с по
мощью системы DNS. Если DNS-cepвep на хосте, с которого вы выполняете команду
traceroute, не работает, используйте команду traceroute -n для запроса числово
го вывода. Этот параметр отключает поиск имен хостов; это может быть единственный
способ заставить команду traceroute функционировать в поврежденной сети.
452 часть 11. Работа в сетях
Первый пакет показывает, что машина bull отправила DNS-зaпpoc на поиск IР
адреса, соответствующему имени atrust. сот, машине nubark. Ответ - это IР-адрес
машины, связанной с этим именем, который равен 66.77.122.161. Обратите внимание
на метку времени слева и распознавание утилитой tcpdump протокола уровня прило
жений (в данном случае DNS). Номер порта на машине bull произволен и поэтому вы
водится в виде числа (41537), но поскольку номер порта DNS-cepвepa (53) хорошо из
вестен, утилита tcpdump выводит его символическое имя с суффиксом domain.
Пакетные анализаторы трафика могут обеспечить огромное количество информа
ции, которая может перегрузить не только вас, но и операционную систему. Чтобы из
бежать этой проблемы в загруженных сетях, утилита tcpdump позволяет создавать слож
ные фильтры. Например, следующий фильтр собирает только входящий веб-трафик из
одной подсети:
ются в том, что доступ к хосту осуществляется по нескольким путям или что он факти
чески представляет собой набор из нескольких хостов, имеющих одно и то же имя DNS,
но несколько 1Р-адресов.
70 m
60 11'1
50.
"' 46 11
~
о
~ зе • '
1
10.
10.
о
Week 13 iweek 14 Week 15 11"k 16 Week 17 \loek 18 Week 19
11edian rtt: 37.8 •s avg 52.l •s •aix 25.7 11s •1n 40.б •s now 5 . З •s sd 7 О а•/$
packet \oss: о. 66 \ avo 7. 93 \ •ах о ' 00 \ •1n е. ео \ now
\oss со\ог: 8 е 8 1/10 8 1/28 8 3/26 8 4/20 8 16/26 8 19/20
probe: 20 IСМР Echo Pings {56 Bytes) every ЗIЭ0s end : Tue Мау 16 02:33 2017 МЕSТ
Se r ve r l istening on Т С Р po r t 5001
ТС Р wi ndow siz e : 85 .3 KByt e (defa ul t)
$ iperf -с 10 . 211.55 . 11
3] local 10. 211 . 55 .1 0 port 53862 connected with 10 . 211. 55. 11 port 500 1
I D] Interva l Tra nsfe r Bandwi dth
3 ] 0 .0-1 0 . 0 sec 4.1 3 GByte s 3 . 55 Gbi ts / sec
Программа iPerf возвращает большие объемы потоковых данных для отслеживания
полосы пропускания . Это особенно полезно для оценки влияния изменений параметров
ядра, которые управляют сетевым стеком, таких как изменения в максимальном блоке
передачи (MTU); более подробную информацию см. в разделе 13.2.
Глава 13. Сети ТСР/IP 457
1.0
"
"'"'
"'~"' " ........".......... ~
Е week 34 week 35
"'
О 1 мinute Avнage current: о. 76
О 5 м1 nute Ave rage cu r·rent: о. 50
8 15 Minute Average current: о. 39
HOU- S2- SW6S09- 2 - Traffi c - 1/1
i~ 6М
' ;, : _~"~~y~~~~~,fl··\\л_ ~~ .. !
! .N~.; ' ' r _, f ·у~~~ 't .
i
~ . ! J
~ • 1 • 1
Q -.i.u.....-."".•. м....... • ."~•м ........... i • ""J. 1-·1·...... +-.f-·----+- ~·'- 1 ..........._.,_>$._"_.._ .... ~"-.. ,...-..Р
02: 00 04: 00 Об: 00 OS: 00 10: 00 12: 00 14: 00 16: 00 18: 00 20: 00 22: 00
О Inbound current: 3.64 м Average: 7.86 м t~aximu111: 12.63 и тotal In: 674.89 св
8 outbound cu rrent: 3. 88 М Ave rage: 6. 30 м махiюuО1: 9. 20 м Total O!Jt: 541, 56 св
24 Темне менее многие бюджетные потребительские сетевые устройства, такие как маршрутизаторы
Liпksys, используют Linuxи iptaЬle1 в своем ядре.
21 Еше 3
более новая система, nftaЬle1, была доступна в версии ядра 3. 1 с 2014 г. Эrо разработка
системы Netfilter, которая конфигурируется командой мt, а не командой iptaЫes. Мы не обсуждаем
ее в этой книге, но ее стоит внедрить о орrанизаuиях, использующих новые ядра.
глава 13. сети ТСР/IP 459
Как правило, эти три стандартные цепочки, - все, что вам нужно для создания меж
сетевого экрана между двумя сетевыми интерфейсами. При необходимости вы може
те определить настраиваемую конфигурацию для поддержки более сложных сценариев
учета или маршрутизации.
Целями, доступными для правил в таблице фильтров, являются АССЕРТ, DROP, REJECT,
LOG, ULOG, REDIRECT, RETURN, MIRROR и QUEUE. Если правило приводит к цели АССЕРТ,
то соответствующим ему пакетам разрешается продолжать свой путь. Цели DROP и REJECT
отбрасывают свои пакеты; цель DROP не выдает никаких сообщений, а цель REJECT воз
вращает сообщение об ошибке ICMP. Цель LOG предоставляет простой способ отслежи
вания пакетов, если они соответствуют правилам, а ULOG расширяет протоколирование.
Цель REDIRECT отправляет пакеты на прокси-сервер вместо того, чтобы позволить
им идти своим путем. Например, вы можете использовать эту функцию, чтобы заста
вить весь веб-трафик вашего сайта проходить через кеш-сервер, например Squid. Цель
RETURN завершает определяемые пользователем цепочки и действует аналогично опера
тору return в вызове подпрограммы. Цель MIRROR меняет местами IР-адрес отправите
ля и адреса получателя перед отправкой пакета. Наконец, цель QUEUE передает пакеты
локальным пользовательским программам через модуль ядра.
460 Часть 11. Работа в сетях
Первая форма (-F) сбрасывает все предыдущие правила из цепочки. Вторая форма
(-Р) устанавливает политику по умолчанию (т.е. цель) для цепочки. Мы рекомендуем
использовать DROP для целевой цепочки по умолчанию. Третья форма (-А) добавляет
текущую спецификацию в цепочку. Если вы не укажете таблицу с аргументом -t, ваши
команды применяются к цепочкам в таблице фильтров. Параметр -i применяет прави
ло к именованному интерфейсу, а -j идентифицирует цель. Программа iptaЬles при
нимает множество других параметров, часть из которых приведена в табл. 13. 10.
Таблица 13.10. Флаги командной строки дпя фильтров iptaЬles
Отмена параметра
-t таблица Указание таблицы, к которой применяется команда (по умолчанию - фильтр)
Полный пример
Ниже мы разберем полный пример. Мы предполагаем, что интерфейс ethl имеет вы
ход в Интернет и что интерфейс ethO имеет выход во внутреннюю сеть. IР-адрес ethl -
128.138.101.4, IР-адрес ethO - 10.1.1.1, причем оба интерфейса имеют сетевую маску
255.255.255.0. В этом примере используется фильтрация пакетов без сохранения состояния
для защиты веб-сервера с IР-адресом 10.1.1.2, что является стандартным методом защи
ты интернет-серверов. Позже в этом примере мы покажем, как использовать фильтрацию
с сохранением состояния для защиты пользователей настольных компьютеров.
Наш первый набор правил инициализирует таблицу фильтров. Во-первых, все це
почки в таблице пусты, а для цели цепочек INPUT и FORWARD по умолчанию установлено
значение DROP. Как и в случае с любым другим сетевым брандмауэром, наиболее без
опасной стратегией является удаление любых пакетов, которые вы явно не разрешали.
iptaЫes -F
iptaЫes -Р INPUT DROP
iptaЫes -Р FORWARD DROP
Глава 13. Сети TCP/IP 461
26 0днако вы должны быть осторожными, чтобы изменение порядка правил для повышения
производительности не влияло на функциональность.
462 Часть 11. Работа в сетях
• Пакет
IPFilter, пакет с открытым исходным кодом, разработанный Дарреном Ридом
(Darren Reed), предоставляет технологию NAT и услуги брандмауэра с под
держкой состояния в различных системах, включая Linux и FreeBSD. Вы мо-
жете использовать пакет IPFilter в качестве загружаемого модуля ядра (кото
рый рекомендуется разработчиками) или статически включить его в ядро.
Для предоставления услуг NAT программа IPFilter использует ключевое слово map
(вместо pass и Ыосk). В следующем правиле трафик из сети 10. О. О. 0/24 отображает
ся на текущий маршрутизируемый адрес интерфейса emO.
map emO 10.0.0.0/24 -> 0/32
Если адрес emO изменится, то фильтр должен быть перезагружен. Это может слу
читься, если emO получает IР-адрес динамически через DHCP. По этой причине NАТ
функции IPFilter лучше всего использовать на серверах со статическим IР-адресом в ин
терфейсе, обращенном к Интернету.
В табл. 13.12 перечислены инструменты командной строки, которые поставляются
с пакетом IPFilter.
Табnица 13.12. Команды IPFilter
Команда Функция
ipf Управляет правилами и списками фильтров
Из команд, приведенных в табл. 13.12, наиболее часто используется ipf. Эта коман
да принимает файл правил в качестве входных данных и добавляет правильно разобран
ные правила в список фильтров ядра. Если вы не используете аргумент -Fa, который
сбрасывает все существующие правила, команда ipf добавляет правила в конец филь
тра. Например, чтобы очистить существующий набор фильтров ядра и загрузить правила
из файла ipf. conf, используйте следующий синтаксис:
$ sudo ipf -Fa -f /etc/ipf/ipf.conf
Программа IPFilter использует файлы псевдоустройств из каталога /dev для управле
ния доступом, и по умолчанию только пользователь root может редактировать список
как мост между локальным центром обработки данных и облаком, открывая множество
гибридных вариантов использования для корпоративных организаций. Сегодня VPC
является центральной особенностью AWS и по умолчанию включена для всех учетных
записей. Экземпляры ЕС2 для новых учетных записей AWS должны быть созданы в со
ответствии с технологией VPC, а большинство новых служб AWS запускаются с под
держкой родной VPC.2'
Перечислим основные функциональные особенности VPC.
• Диапазон адресов 1Pv4, выбранный из частного адресного пространства RFCl918,
выраженный в нотации CIDR (например, 10.110.0.0/16 для адресов 10.110.0.0-
IO.I 10.255.255). 28
• Сегментация адресного пространства VPC на более мелкие подсети.
• Списки контроля доступа к сети (Network Access Coпtrol List - NACL) для изо
ляции подсетей друт от друrа.
Вы можете создать столько частных сетей VPC, сколько вам нужно, и ни один другой
пользователь AWS не имеет доступа к их сетевому трафику. 29 Сети VPC в одном регионе
могут взаимодействовать, создавая частные маршруты между отдельными сетями. Сети
VPC в разных регионах могут быть связаны с программными VРN-туннелями через
Интернет или с дорогостоящими, настраиваемыми, прямыми подключениями к цен
трам обработки данных AWS через частные сети, которые вы должны арендовать у теле
коммуникационной компании.
Сети VPC могут быть такими же маленькими, как сеть /28, или большими как /16.
Это очень важно планировать заранее, потому что после создания сети VPC ее размер
не может быть скорректирован. Выберите адресное пространство, которое достаточно
велико для обеспечения будущего роста, но также убедитесь, что оно не конфликтует
с другими сетями, которые вы можете подключить.
27 Долrое время пользователи жаловались на то, что службы AWS являются неполными, если они
не поддерживают технологию УРС.
2 'Недавно в технологию УРС также добавили поддержку протокола IPvб
''8
2 зависимости от состояния вашей учетной записи служба AWS может сначала ограничить вас
пятью сетями УРС. Однако, если вам это нужно, вы можете запросить более высокий лимит.
Глава 13. Сети TCP/IP 467
подсеть для каждой зоны и равномерно распределите экземпляры всех подсетей. В ти
пичной схеме балансировщики нагрузки или другие прокси-серверы размещаются
в публичных подсетях и ограничивается доступ к неб-серверам, приложения и серверам
баз данных только из частных подсетей.
•Подробные инструкции см, на странице goo. gl /WrETNq; эта запись немного сложна для настройки.
Публичные СfТИ
Пользователи Интернета
Uужба1 Служба 2
"- ------------- - ----' ---------- ---"
' '
' : 1
'
Гpynna 1
ПиринrVРС • аатоматмчt<коrо : :
--~с~т~~~о~~~ -: 1
Гpynrli бfзопо<ноmо • Гpynrui 6tзоnасносrи :
'--------·-----------'
Частнынtтм Частные сети
Архитектурные диаграммы, такие как на рис . 13.6, обеспечивают более четкие тех
нические детали, чем письменные описания . Мы создаем такие диаграммы для каждого
используемого приложения.
# Сеть VPC
resource "aws_vpc" "default" {
cidr_Ыock = "${var.vpc_cidr}"
еnаЫе dns hostnames = true
}
# Публичная подсеть
resource "aws_subnet" "puЫic-us-west-2a" {
vpc_id = "${aws_vpc.default.id}"
cidr_Ыock = "${var.puЫic_subnet_cidr}"
availaЫlity_zone = "us-west-2a"
$ AWS_ACCESS_КEY_ID=AКIAIOSFODNN7EXAМPLE
$ AWS_SECRET_ACCESS_КEY=wJalrXUtnFEМI/K7МDENGЬPxRfiCYEXAМPLEКEY
$ time terraf orm apply
aws_vpc.default: Creating ...
cidr Ыосk: => 11 10.110.0.0/16 11
default - network - acl - id: => 11 <computed> 11
default_security_group_id: => 11 <computed> 11
dhcp - options id: => 11 <computed> 11
еnаЫе dns hostnames:
- => "1"
enaЫe_dns_support: => "<computed>"
main route_taЫe_id: => "<computed> 11
aws_vpc.default: Creation complete
aws_internet_gateway.default: Creating ...
vpc_id: "" => "vpc-a9ebe3cc 11
aws_subnet.puЫic-us-west-2a: Creating ...
availability_zone: 1111 => "us-west-2a"
cidr Ыосk: " 11 => 11 10.110.0.0/24"
map_puЫic ip_on launch: "" => 11 0 11
vpc_id: "" => "vpc-a9ebe3cc 11
aws_subnet.puЫic-us-west-2a: Creation complete
aws_route_taЫe.puЫic-us-west-2a: Creation complete
[snip]
Apply complete! Resources: 5 added, О changed, О destroyed.
real Om4.530s
user Om0.221s
sys Om0.172s
Команда time измеряет, сколько времени потребуется для создания всех ресурсов
в конфигурации (около 4,5 с). Значения <computed> указывают, что программа Terrafonn
выбрала значения по умолчанию, потому что мы не указали эти настройки явно.
Состояние всех ресурсов, созданных Terraform, сохраняется в файле terraform.
tfstate. Этот файл должен быть сохранен, чтобы программа Terrafonn знала, какие ре
сурсы находятся под ее контролем. В будущем Terraform самостоятельно откроет управ
ляемые ресурсы.
----1Внутренняя маршрутизация~-----..
[]
192.168.10.19
us-central1-f us-central1-b us-east1-b
us-central1
us-east1
10.100.0.0/16
10.120.0.0/16
192.168.10.0/24
опасаясь, что они будут назначены другому клиенту. Когда экземпляр имеет внешний
адрес, вы все равно не увидите его, выполнив команду ip addr show; компания Google
выполняет перевод адресов дЛЯ вас.
Сеть DigitalOcean
Сеть DigitalOcean не имеет частной сети, по крайней мере такой, как GCP и AWS.
Дроплеты могут иметь частные интерфейсы, которые обмениваются данными по вну
тренней сети в одном регионе. Однако эта сеть используется совместно со всеми други
ми клиентами DigitalOcean в том же регионе. Это небольшое улучшение по сравнению
с использованием Интернета, но брандмауэры и шифрование в пути становятся жестки
ми требованиями.
Мы можем исследовать загруженный дроплет DigitalOcean с помощю интерфейса
CLI tugboat:
$ tugboat info ulsah
Droplet fuzzy name provided. Finding droplet ID ... done, 8857202
(ulsah-ubuntu-15-10)
Name: ulsah-ubuntu-15-10
ID: 8857202
Status: active
IP4: 45.55.1.165
IP6: 2604:A880:0001:0020:0000:0000:01EF:D001
Private IP: 10.134.131.213
Region: San Francisco 1 - sfol
Image: 14169855 - ubuntu-l5-10-x64
Size: 512МВ
Backups Active: false
Вывод включает в себя адрес IPvб в дополнение к общедоступным и частным адре
сам 1Pv4. На примере мы можем продолжить изучение, просмотрев адреса на локальных
интерфейсах.
# tugboat ssh ulsah-uЬuntu-15-10
# ip address show ethO
2: ethO: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo fast
state UP group default qlen 1000
link/ether 04:01:87:26:d6:01 brd ff:ff:ff:ff:ff:ff
474 Часть 11. Работа в сетях
13.16. ЛИТЕРАТУРА
История
• СомЕR, DouuLлs Е. Jnternetworking with ТСР//Р Volume 1: Principles, Protocols, and
Architectures (бth Edition). Upper Saddle River, NJ: Prentice Hall, 2013. Эта книга дол
гое время являлась стандартным справочником по протоколам TCP/IP. Она напи
сана как учебник для студентов и является хорошим введением в тему.
• Sлшs, PETER Н. Casting the Net, From ARPANET to INTERNET and Beyond. Reading,
МА: Addison-Wesley Professional, 1995. Это прекрасная история ARPANET, пред
течи Интернета, написанная ученым, который так долго был близко знаком с раз
работчиками системы UNIX, что стал восприниматься как один из них. Эта книга
представляет собой отличный сборник документов об истории Интернета и его
ра111ичных технологиях (см. сайт isoc. org / internet/history).
Классика
• SтEVF.NS,
W. R1cнARIJ. UNJX Network Programming. Upper Saddle River, NJ: Prentice
Hall, 1990.
• Sпvt.:Ns, W. R1c11лRD, BIL.L FENNER, AND ANDREW М. RuDOFI'. UNJX Network
Programming, Volume 1, The Sockets Networking APJ (Зrd Edition). Upper Saddle River,
NJ: Addison-~sley, 2003.
• SТEVENS, W. RICHARD. UNJX Network Programming, Volume 2: lnterprocess Communications
(2nd Edition). Upper Saddle River, NJ: Addison-Wesley, 1999.
Эти книги - канонические учебники о сетевых классах, в том числе о сетевом
программировании в UN IX. Если вам нужен только интерфейс сокетов Berkeley,
оригинальное издание по-прежнему является прекрасным источником знаний.
Если вам нужен интерфейс STREAMS, то третья версия, включающая IPvб, - хо
роший выбор. Все три книги четко и ясно написаны в типичном стиле Ричарда
Стивенса.
Глава 13. Сети TCP/IP 475
• ТлNЕNвлuм, ANDREW S., AND Dлvro J. WEТHERALL. Computer Networks (5th Edition).
Upper Saddle River, NJ: Prentice Hall PTR, 2011.
Это первая книга о сетях, которая стала классикой. Она содержит подробное опи
сание всех деталей физических и канальных уровней стека протоколов. Последнее
издание охватывает беспроводные сети, гигабитную сеть Ethernet, одноранговые
сети, голосовую IР-телефонию, сотовые сети и т.д.
Протоколы
• FлLL, KEVIN R" AND W. R1снлRо SТEVENS. ТСР//Р lllustrated, Volume Опе: The Protocols
(2nd Edition). Reading, Addison-Wesley, 2011.
МА:
• WRIGHT, GлRY R" AND W. RtcHARD STEVENS. ТСР//Р lllustrated, Volume Two: The
lmplementation. Reading, МА: Addison-Wesley, 1995.
Книги в серии TCP/IP lllustrated - отличное и подробное руководство по стеку
протоколов ТСР /1 Р.
• HtJNT, СRлю. ТСР//Р Network Administration (Згd Edition). Sebastopol, СА: O'Reilly
Media, 2002. Как и другие книги данной серии, эта книга предназначена для ад
министраторов систем UNIX. Половина книги посвящена протоколу TCP/IP,
а остальная часть описывает высокоуровневые функции UNIX, такие как элек
тронная почта и удаленная регистрация.
• FлRREL,
AoRtAN. The lnternet and lts Protocols: А Comparative Approach. San Francisco,
СА:
Morgan Kaufmann PuЬlishers, 2004.
• KozrERAK, CНARLES М. The ТСР//Р Guide: А Comprehensive, !llustrated lnternet Protocols
Reference. San Francisco, СА: No Starch Press, 2005.
• DoNAHUE, GARY А. Network Warrior: Everything Уои Need to Know That Wasn't оп the
CCNA Ехат. Sebastopol, СА: O'Reilly Media, 2015.
глава 14
Сетевые аппаратные средства
"Промышленный проект.
'Мы немного сомневаемся и предполагаем, что этот вариант кодировки был неудачным совпадением.
Топология Ethernet
С точки зрения топологии сеть Ethernet представляет собой разветвляющуюся шину,
но без петель. У пакета есть только один путь следования между любыми двумя хостами,
расположенными в одной сети. В сети Ethernet могут передаваться пакеты трех типов:
однонаправленные (unicast), групповые (multicast) и широковещательные (broadcast).
Пакеты первого типа адресованы одному хосту, второго - группе хостов, третьего -
всем хостам сегмента.
480 Часть 11. Работа в сетях
r@51
~
Питание
Единица Категории
Параметр•
измерения
5 D6 5е 6Е 6аЕА 7F 7aFA 81
Ширина полосы МГц 100 100 250 500 600 1000 2000
Затухание дБ 24 24 21,7 18,4 20,8 60 50
NЕХТ дБ 27, 1 ЗО, 1 39,9 59 62, 1 60,4 35,6
ELFEXТ дБ 17 17,4 23,2 43,1 46,0 35,1
Затухание отраженного сигнала дБ 8 10 12 32 14, 1 61,93 8
{обратная потеря)
Задержка распространения сигнала нс 548 548 548 548 504 534 548
"NЕХТ (Near-end crosstalk) - ослабление перекрестной наводки на ближнем конце. ELFEXТ (Equal level far-end
crosstalk) - ослабление равноуровневой перекрестной наводки на дальнем конце.
0 Включая дополнительные спецификации TIA TSB 95 и ISO FDAM 2.
Кабель категории 5 поддерживает работу на скорости 100 Мбит/с. Кабели категорий 5е,
б и ба поддерживают скорость передачи 1 Гбит/с и в настоящее время используются в ка
честве стандарта. Кабель категории ба лучше всего подходит для организации новых сетей,
поскольку он особенно устойчив к помехам, возникающим из-за использования старых
стандартов передачи сигналов (например, IOBASE-T). При прокладке кабелей категорий 5
и Se бьuш зафиксированы определенные проблемы. Кабели категорий 7 и 7а предназначены
мя передачи данных со скоростью 10 Гбит/с, а кабели категорий 8 - 40 Гбит/с.
Более быстродействующие стандарты требуют применения нескольких пар НВП. Это
ускоряет передачу данных по линии связи по сравнению с использованием единственной
пары. Для соединений lOBASE-T требуются две пары проводов категории 5. В соедине
ниях IOOBASE-TX предельная длина та же, но используются две пары проводов катего
рии 5. Соединение \ОООВАSЕ-ТХ требует четырех пар проводов категорий 5е или б/ба.
Аналогично соединение IOGBASE-ТX требует четырех пар проводов категорий ба, 7 или
7а. Длина кабеля во всех стандартах ограничена 100 м.
Существуют провода с поливинилхлоридной и тефлоновой изоляцией. Выбор изо
ляции диктуется средой, в которой будут проложены кабели. В замкнутых помещениях,
связанных с вентиляционной системой здания, обычно требуется тефлоновая изоляция 4 •
Поливинилхлоридная изоляция дешевле и проще в эксплуатации.
1 Белый/синий 5/4
2 Белый/оранжевый 3/6
3 Белый/зеленый 1/2
4 Белый/коричневый 7/8
Имеющаяся в здании проводка может не подходить для прокладки сетей, в зависи
мости от того, как и когда она прокладывалась.
Оптическое волокно
Оптическое волокно используется в тех ситуациях, когда применение медного ка
беля по тем или иным причинам неприемлемо. Оптическое волокно передает сигнал
быстрее, чем медный провод. Кроме того, оно является более устойчивым к электриче
ским помехам, что в некоторых приложениях очень важно. Там, где оптическое волокно
не является абсолютно необходимым, обычно выбирают медный кабель, поскольку он
дешевле и с ним легче работать.
Оптическое волокно бывает "многомодовым" и "одномодовым". Многомодовое оп
тическое волокно обычно используется в зданиях или комплексах зданий. Оно толще,
чем одномодовое, и может проводить несколько лучей света; это свойство позволяет ис
пользовать менее дорогую электронику (например, в качестве источника света можно
использовать светодиоды).
Одномодовое оптическое волокно часто используется в магистральных приложени
ях, например для прокладки линий связи между городами и регионами. Оно может про
водить только один световой луч и требует дорогой прецизионной электроники в конеч
ных точках.
Концентраторы
Концентраторы (hub) иногда еще называют повторителями (repeators). Это актив
ные устройства, используемые для соединения сегментов сетей Ethemet на физическом
уровне. Им требуется внешний источник питания.
Выступая в качестве повторителя, концентратор ретранслирует Еthеmеt-фреймы, но
никак не интерпретирует их. Он "не имеет представления" ни о том, куда направля
ются пакеты, ни о том, какой протокол они используют. За исключением экзотических
ситуаций, концентраторы больше не должны использоваться в промышленных сетях, и мы
не советуем их использовать даже в домашних сетях. (Почему? Потому что коммутаторы
(switches) значительно эффективнее используют полосу пропускания частот в сети и в
настоящее время стоят недорого.)
Коммутаторы
Коммутатор соединяет сети Ethemet на канальном уровне. Его назначение - объ
единить две физические сети так, чтобы они выглядели как одна большая физическая
сеть. В настоящее время коммутаторы являются промышленным стандартом для соеди
нения устройств Ethemet.
Коммутаторы принимают, регенерируют и ретранслируют пакеты на аппаратном
уровне. Они используют алгоритм динамического обучения. Коммутаторы запоминают,
какие исходные адреса поступают с одного порта, а какие - с другого. Пакет переходит
из одного порта в другой только при необходимости. Первоначально пересьшаются все
пакеты, но через несколько секунд, когда коммутатор изучит расположение большин
ства хостов сети, запускается механизм фильтрации.
Поскольку между сетями пересылаются не все пакеты, каждый сегмент кабеля менее
загружен, чем в случае, когда все компьютеры подключены к одному кабелю. А если
учесть, что основной трафик имеет тенденцию к локализации, то увеличение реальной
пропускной способности может оказаться заметным. Кроме того, коммутатор не влияет
на логическую модель сети, поэтому его установка требует лишь незначительного вме
шательства со стороны администратора.
484 Часть 11. Работа в сетях
Если сеть имеет петли, коммутатор может безнадежно запутаться, потому что паке
ты, посылаемые одним компьютером, окажутся сразу на двух (или более) портах ком
мутатора. В одной сети Ethernet петлей не бывает, но после объединения нескольких
таких сетей с помощью маршрутизаторов и коммутаторов топология изменится, вслед
ствие чего может образоваться несколько путей к одному хосту. Некоторые коммутаторы
решают эту проблему путем резервирования альтернативных маршрутов на тот случай,
если основной маршрут станет недоступным. Они упрощают топологию видимой ими
сети, отсекая дублирующиеся пути до тех пор, пока в оставшихся сегментах не окажется
только по одному маршруту к каждому хосту сети. Другие коммутаторы создают между
сетями двойные каналы и переключают трафик по циклическому принципу.
Коммутаторы должны просматривать каждый пакет, определяя, нужно ли ero пере
сылать в другой сегмент. Производительность этих устройств обычно измеряют как ско
ростью просмотра пакетов, так и скоростью их пересылки. Многие поставщики не ука
зывают в диаграммах производительности коммутаторов размеры протестированных
Важно помнить, что сами сети VLAN почти не обеспечивают дополнительной защи
ты. Для того чтобы обеспечить защиту, необходимо фильтровать трафик VLAN.
Маршрутизаторы
Маршрутизаторы (известные также как "коммутаторы третьего уровня") направля
ют трафик на третьем сетевом уровне модели OSI. Маршрутизаторы доставляют пакеты
адресатам на основании информации, хранящейся в ТСР/IР-заголовках. Помимо про
стого перемещения пакетов, маршрутизаторы могут также выполнять ряд особых функ
ций, например фильтрацию пакетов (в соответствии с правилами безопасности), раз
деление трафика по приоритетам (в соответствии с заданным качеством обслуживания)
и обнаружение общей сетевой топологии.
Конфигурация маршрутизаторов бывает фиксированной или модульной.
• Устройства первого типа содержат сетевые интерфейсы, установленные в за
водских условиях. Они обычно подходят для специализированных применений.
Например, маршрутизатор с интерфейсами Т1 и Ethernet может оказаться удоб
ным, когда нужно подключить небольшую компанию к Интернету.
• Модульные маршрутизаторы имеют слотовую или шинную архитектуру, а ин
терфейсы к ним добавляются пользователями. Как правило, это более дорогие
устройства, но зато они гибче в эксплуатации.
В зависимости от необходимой надежности и ожидаемого трафика, специализиро
ванный маршрутизатор может оказаться как дороже, так и дешевле системы UNIX или
Linux, сконфигурированной в качестве маршрутизатора. Однако специализированное
устройство, как правило, демонстрирует более высокую производительность и надеж
ность. Это та область сетевого проектирования, где лучше заранее вложить чуть больше
денег, чем потом иметь головную боль.
Автосогласование
С появлением разных стандартов Ethernet возникла необходимость, чтобы устрой
ства могли идентифицировать конфигурацию своих соседей и согласовывать с ними
свои настройки. Например, сеть не будет работать, если на одной стороне соединения
она работает со скоростью 1 Гбит/с, а на другой - со скоростью 10 Гбит/с. Для выяв
ления и решения этой проблемы организацией IEEE был разработан стандарт автосо
rласования Ethernet. В одних случаях он работает, а в других применяется неправильно
и лишь усугубляет проблему.
Следует запомнить два золотых правила автосогласования.
Для того чтобы выяснить, как задать стратегию автосогласования интерфейсов, про
читайте специальный раздел 13.1 О.
486 Часть 11. Работа в сетях
логию РоЕ. Эти порты дороже, чем порты, не поддерживающие технологию РоЕ.
Гигантские пакеты
водительность сети можно повысить, если допустить более крупные размеры пакетов.
К сожалению, стандарты IEEE для разных типов сетей Ethernet запрещают использо
вание крупных пакетов по соображениям совместимости сетей. Однако, поскольку ско
рость магистрального трафика часто во много раз превышает установленный предел, не
стандартные большие пакеты Ethernet в современных сетях перестали быть редкостью.
Подстрекаемые нетерпеливыми потребителями, производители сетевого оборудования
негласно бойкотируют стандарт IEEE и обеспечивают поддержку крупных фреймов
в своей гигабитной продукции.
Для использования так называемых гигантских пакетов (jumЬo frames) необходимо
лишь повысить максимально возможный размер пакета (maximal transmission uпit -
MTU) в интерфейсах сети. Повышение производительности зависит от вида трафика,
но наибольший выигрыш достигается для крупномасштабных перемещений по прото
колу ТСР (например, в файловых службах NFSv4 или CIFS). Ожидается, что умеренное,
но заметное повышение производительности должно составить примерно 10%.
5 Для интересующихся этим вопросом: да, существует возможность загрузить небольшую
систему Liпux через порт сети РоЕ. Возможно, проще всего это сделать с помощью RaspЬerry Pi
и коммутатора Pi РоЕ Switch НАТ.
Глава 14. Сетевые аппаратные средства 487
•скорость 600 Мбит/с в стандарте 802.1 ln является, скорее, теоретической. На практике полоса
пропускания в окрестности точки WAP при оптимальной конфигурации может обеспечить
скорость передачи данных не более 400 Мбит/с. Это объясняется разJiичием между теоретическ11ми
и практическими возможностями оборудования и среды. В беспроводных сетях всякое бывает!
488 Часть 11. Работа в сетях
Нет ничего лучше, чем изобретательные чудаки ... В простейших сценариях точка WAP
объявляет единственный SSID, ваш клиент подключается к этому SSID и всё - вы в сети!
Тем не менее несколько аспектов беспроводной сети действительно просты. Что де
лать, если ваш дом или здание слишком большие, чтобы обслуживаться одной точкой
WAP? Или что если вам нужно предоставлять разные сети различным группам пользова
телей (например, сотрудникам или гостям)? Для этих случаев вам необходимо стратеги
чески структурировать свою беспроводную сеть.
Вы можете использовать несколько SSID для разбивки групп пользователей или
функций. Как правило, вы сопоставляете их с отдельными виртуальными локальны
ми сетями, которые затем можно маршрутизировать или фильтровать по желанию, как
и проводные сети.
Теория состоит в том, что по мере того, как клиенты перемещаются по окружаю
щей среде, они будут отделяться от одной точки WAP, когда ее сигнал становится сла
бым, и соединяться с ближней точкой WAP с более сильным сигналом. Однако теория
и реальность часто не согласуются друг с другом. Многие клиенты поддерживают связь
с точкой WAP, излучающей слабый сигнал, и игнорируют лучшие варианты.
В большинстве ситуаций вы должны разрешить WAP автоматически выбирать свои
предпочтительные каналь1. Если вы должны вручную вмешаться в этот процесс, ис
пользуя стандарты 802.11 b/g/n, рассмотрите выбор между каналами 1, 6 или 11. Спектр,
выделенный этим каналам, не перекрывается, поэтому комбинации этих каналов обе
спечивают наибольшую вероятность широкого распространения - открытую беспро
водную магистраль. Каналы по умолчанию для 802. l la/ac не перекрываются вообще,
поэтому просто выберите свой любимый номер.
Некоторые точки WAP имеют несколько антенн и используют технологию множе
ственного ввода и множественного вывода (multiple-input, multiple-output - MIMO).
Эта практика может увеличить доступную полосу пропускания, используя несколько
передатчиков и приемников, чтобы использовать преимущества смещения сигнала в ре
зультате задержки распространения. В некоторых ситуациях эта технология может обе
спечить небольшое улучшение производительности, хотя, вероятно, не такое значитель
ное улучшение, как широкая сеть антенн.
Если вам нужна физически большая зона покрытия, разверните несколько точек
WAP. Если область полностью открыта, вы можете развернуть их в структуре решет
ки. Если существуют физические препятствия вроде стен, проведите исследование
для определения наилучших вариантов размещения точек WAP с учетом физических
атрибутов вашего пространства.
490 Часть 11. Работа в сетях
• Гораздо дешевле проложить весь кабель сразу, чем делать это поэтапно.
7 Как и многие популярные программы, программа Wireshark часто подвергается атакам хакеров.
Убедитесь, что вы используете самую последнюю ее версию.
Глава 14. Сетевые аппаратные средства 493
• оконечной аппаратуры;
• кабелей;
• прокладки кабелей;
• цветовой маркировки;
теров, включенных в одну сеть. Также предполагается, что работа будет начата с нуля.
Основной объем работ по проектированию сети состоит из определения:
Расширение сетей
Прогнозировать потребности на десять лет вперед очень сложно, особенно в области
вычислительной техники и сетей. Поэтому, проектируя сеть, всегда следует учитывать
перспективы ее расширения и увеличения пропускной способности. Прокладывая ка
бель, особенно в труднодоступных местах, протягивайте в три-четыре раза больше пар,
'Речь идет о брандмауэрах в виде бетонных, кирпичных или огнеупорных стен, которые
препятствуют распространению огня по всему зданию. Значительно отличаясь от сетевых
брандмауэров, они не менее важны.
Глава 14. Сетевые аппаратные средства 495
чем нужно. Помните: основная часть стоимости прокладки сети приходится на оплату
труда, а не на материалы.
Перегрузка
Сеть - как цепь: ее качество определяется самым слабым или самым медленным
звеном. Производительность Ethernet, как и многих других сетевых технологий, при уве
личении нагрузки падает.
Обслуживание и документирование
Опыт показывает, что удобство обслуживания сети напрямую зависит от качества до
кументации на нее. Точная, полная, своевременно корректируемая документация абсо
лютно необходима.
Кабели следует маркировать во всех точках подключения. Рекомендуем вкладывать
копии местных монтажных схем в коммутационные шкафы, чтобы при всех изменениях
эти экземпляры можно было скорректировать на месте. Каждые несколько недель не
обходимо переносить все корректировки в электронную базу данных.
Стыки между крупными системами в виде коммутаторов или маршрутизаторов могут
упростить отладку, поскольку позволяют изолировать части сети и отлаживать их по от
рутизатор и создать подсеть для подключения к магистрали. Такое решение иногда не
обходимо для того, чтобы новое соединение не навредило работе существующей сети.
Если в сети работают разнородные компьютеры, операционные системы и протоко
лы, обязательно нужно иметь "высокоинтеллектуальный" маршрутизатор (например,
компании Cisco), который будет служить шлюзом между сетями.
Тестовые приборы
Fluke Siemon Viavi
(800) 443-5853 (800) 945-4395 (844) 468-4284
fluke.com siemon.com vivasolutions.com
Маршрутизаторы/коммутаторы
Cisco Systems Juniper Network
(415) 326-1941 (408) 745-2000
www.cisco.com juniper.com
14.9. ЛИТЕРАТУРА
• ANSI/ТIA/EIA-568-A. Commercial Building Telecommunications CaЬling Standard
и ANSl(ГIA/EIA-606, Administration Standard for the Telecommunications lnfrastrncture
о/ Commercial Buildings. Это стандарты телекоммуникационной промышленно
сти для построения кабельных систем зданий. К сожалению, они не бесплатны.
Посетите веб-сайт www. tiaonline. org.
• BдRNETT Dлvю, GRотн Dлvю дND J1м МсВЕЕ. CaЬling: The Complete Guide to Network
Wiring (Зrd
edition). San Francisco: Sybex, 2004.
• GoRANssoN, PдuL, дND Снuск ВLлск. Software Defined Networks, А Comprehensive
Approach (2nd Edition). Burlington, МА: Morgan Kaufman, 2016.
• SruRGEON, CндRLES, дND JoдNN Z1мMERMAN. Ethernet: The Definitive Guide: Designing
and Managing Local Area Networks (2nd Edition). Sebastopol, СА: O'Reilly, 2014.
Глава 15
IР-маршрутизация
Во всем мире доступны более 4,3 миллиарда IР-адресов, поэтому получение пакетов
в нужном месте в Интернете - непростая задача. 1 Маршрутизация IР-пакетов уже была
кратко представлена в главе 13. В этой главе мы рассмотрим процесс маршрутизации
более подробно и исследуем несколько сетевых протоколов, которые позволяют марш
рутизаторам автоматически обнаруживать эффективные маршруты. Протоколы маршру
тизации не только уменьшают административную нагрузку, связанную с обработкой ин
формации о маршрутизации, но также позволяют быстро перенаправить сетевой трафик,
если маршрутизатор, соединение или сеть не вышли из строя.
'Cм.wapo.st/world-ip.
500 Часть 11. Работа в сетях
199.165.146
Хоа 145.17 сеть
А
146.4
145.24 Марwруrиптор 146.1
R1
А$ netstat -rn
Destinat ion Gat e way Genmask Fl ags MSS Window irt t I f ace
127.0. 0 . 0 о. о.о . о 255 . 0.0 . 0 u о о о lo
199.165.145.0 о. о . о . о 255 . 25 5. 255.0 u о о о ethO
о .о .о .о 199.1 65.145.24 о.о . о . о UG о о о e th O
В приведенном выше примере для запроса таблицы маршрутизации использует
ся хорошо известный инструмент netstat. Этот инструмент распространяется с опе
рационной системой FreeBSD и доступен для Linux как часть пакета net-tools. Этот
пакет больше не имеет активной поддержки и, как ре зультат, считается устаревшим.
Официально рекомендованным способом получить эту информацию в Linux является
менее функциональная команда ip route:
2 Мы не рекомендуем использовать системы UNIX или Linux в качестве сетевых маршрутизаторов
в производственной инфраструктуре - лучше купите выделенный маршрутизатор .
' 1Р-пакеты также могут маршрутизироваться на основе адреса отправителя - по крайней
мере теоретически , но это почти никогда н е выполняется. Эта функция не получила широкого
распространения из соображений безопасности .
Глава 15. IР-маршрvтизация 501
А$ ip route
default via 199.165.145.24 dev ethO onlink
199.165.145.0/24 dev ethO proto kernel scope link src 199.165.145.17
Результат работы команды netstat -rn немного легче читать, поэтому мы исполь
зуем его для последующих примеров и исследования рис. 15.1.
Хост А имеет самую простую конфигурацию среди всех четырех компьютеров.
Первые два маршрута описывают собственные сетевые интерфейсы хоста. Они необхо
димы, чтобы пакеты, направляемые непосредственно в подключенные сети, не марш
рутизировались особым образом. Устройство ethO - это Еthеrnеt-интерфейс хоста А,
а lo - интерфейс обратной связи (виртуальный сетевой интерфейс, эмулируемый про
граммным обеспечением). Обычно такие записи автоматически добавляются при кон
фигурировании сетевого интерфейса.
Заголовок
Заrоловок IP Заголовок UDP и данные
Ethernet
От: А От: 199.165.145.17
Кому: Rl Кому: 199.165.146.4 о
ПАКЕТUDР
ПАКЕТIР
ФРЕЙМ ЕТНЕRNЕТ
Она почти аналогична таблице хоста А. за исключением того, что здесь присуrству
ет два физических сетевых интерфейса. Стандартный маршрут в данном случае ведет
к устройству R2, поскольку через него осуществляется выход в Интернет. Пакеты, адре
сованные любой из сетей 199.165, доставляются напрямую.
Подобно хосту А, хост В имеет один реальный сетевой интерфейс. Но для корректного
функционирования ему необходим дополнительный маршруr, поскольку хост имеет пря
мое соединение сразу с двумя маршруrизаторами. Трафик сети 199.165.145 должен про
ходить через устройство Rl, а весь остальной трафик - направляться в Интернет через
устройство R2.
В$ netstat -rn
Destination Gateway Genmask Flags MSS Window irtt Iface
127.0.0.0 о.о.о.о 255.0.0.0 u о о о lo
199.165.145.0 199.165.146.1 255.255.255.0 u о о о ethO
199.165.146.0 о.о.о.о 255.255.255.О u о о о ethO
о.о.о.о 199.165.146.3 о. о. о. о UG о о о ethO
lll Описание переадресации ICMP см. в разделе 13.5.
Теоретически, как и хост А, хост В можно сконфигурировать так, чтобы изначально
он "знал" только об одном шлюзе, полагаясь на помощь директив переадресации про
токола ICMP для устранения избыточных переходов. Ниже показан пример начальной
конфигурации.
В$ netstat -rn
Destination Gateway Genmask Flags MSS Window irtt Iface
127.0.0.О О.О.О.О 255.О.О.О U О О О lo
199.165.146.0 О.О.О.О 255.255.255.0 U О О О ethO
О.О.О.О 199.165.146.3 О.О.О.О UG О О О ethO
Теперь, если хост В посылает пакет хосту А (199.165.145.17), прямой маршруr най
ден не будет, и пакет отправится на устройство R2. Поскольку устройство R2 является
маршруrизатором, оно имеет полную информацию о состоянии сети и. следовательно,
"знает" о роли устройства Rl, куда и будет послан пакет. Кроме того, маршруrизатор R2
обнаружит, что хосты Rl и В находятся в одной сети, поэтому он дополнительно напра
вит хосту В IСМР-сообщение, в соответствии с которым хост В добавит в свою таблицу
маршруrизации прямой маршруr к хосту А.
199.165.145.17 199.165.146.1 255.255.255.255 UGHD о о о ethO
Благодаря этому маршруту весь трафик, адресованный хосту А, начнет идти непо
средственно через маршруrизатор Rl. Однако это изменение не затрагивает трафик
к другим хостам в сети 145. Для них нужно получить отдельные директивы от маршру
тизатора R2.
Некоторые администраторы выбирают для своих систем директивы переадресации
протокола ICMP в качестве основного "протокола" маршруrизации, думая, что подоб
ный подход обеспечит большую динамичность. К сожалению, системы и маршруrиза
торы осуществляют перенаправление по-разному. Некоторые хранят эти директивы по
стоянно. Другие удаляют их из таблицы маршруrизации через относительно короткое
время (5-15 минут). Третьи вообще игнорируют их, что, вероятно, правильно с точки
зрения безопасности.
Перенаправления имеют несколько других потенциальных недостатков: например,
увеличение нагрузки на сеть, увеличение нагрузки на R2, беспорядок в таблице марш
руrизации и зависимость от дополнительных серверов, поэтому мы не рекомендуем их
Глава 15. IР-маршрутизация 503
Дистанционно-векторные протоколы
В основе дистанционно-векторных протоколов лежит следующая идея: если маршрути
затор Х находится в пяти переходах от сети У и является моим соседом, то я нахожусь в ше
сти переходах от данной сети. Демон, работающий по такому протоколу, объявляет о том.
504 Часть 11. Работа в сетях
как далеко, по его расчетам, расположены известные ему сети. Если соседние демоны не
"знают" более коротких маршрутов к этим сетям, они помечают данный компьютер как оп
тимальный шлюз. В противном случае они просто игнорируют этот анонс. Предполагается,
что со временем таблицы маршрутизации придут в стабильное состояние.
Это действительно элегантная идея, и, если бы все работало так, как задумано,
маршрутизация существенно упростилась бы. К сожалению, описанный алгоритм не
лучшим образом справляется с изменениями топологии. 4 Иногда стабилизация таблиц
вообще не наступает вследствие возникновения бесконечных циклов (например, марш
рутизатор Х получает информацию от маршрутизатора У и посылает ее маршрутизатору
Z, который возвращает ее маршрутизатору У). На практике приходится вводить сложные
эвристические правила или задавать ограничения. К примеру, в протоколе RIP (Routing
Information Protocol - протокол маршрутной информации) считается, что любая сеть,
находящаяся на расстоянии более пятнадцати переходов, недоступна.
Даже в обычных ситуациях может потребоваться слишком много циклов обновле
ний, прежде чем все маршрутизаторы перейдут в стабильное состояние. Следовательно,
чтобы не превысить допустимые пределы, необходимо сделать периоды обновлений ко
роткими, а это, в свою очередь, ведет к тому, что дистанционно-векторные протоколы
RIPng Routing lnformation Protocol (протокол маршрутной ин- Локальные сети с протоколом IPvб
формации), следующее поколение
EIGRP• Enhanced lnterior Gateway Routing Protocol (улучшенный Глобальные сети, корпоративные
протокол маршрутизации внутреннего шлюза) локальные сети
BGP Border Gateway Protocol (протокол граничного шлюза) Магистральные сети Интернета
Топологические протоколы
В топологических протоколах, или протоколах состояния канала, информация
рассылается в относительно необработанном виде. Записи выглядят примерно так:
"Маршрутизатор Х является смежным по отношению к маршрутизатору У, и канал
функционирует". Полный набор таких записей образует карту сетевых связей, на ос-
протоколы так, чтобы не возникало циклов. Изменения в тополоmческой базе данных рас
пространяются по сети очень быстро, не перегружая ни канал, ни центральный процессор.
Топологические протоколы сложнее дистанционно-векторных, зато они позволяют ре
ализовать такие технологии, как маршрутизация на основании запрашиваемого типа об
служивания (поле TOS IР-пакета) и поддержка нескольких маршрутов к одному адресату.
Единственным топологическим протоколом, получившим широкое распростране
ние, ямяется протокол OSPF.
Метрика стоимости
Для того чтобы протокол маршрутизации мог определить, какой путь к заданной
сети является кратчайшим, необходимо вначале выяснить, что значит "кратчайший".
Это путь с наименьшим числом переходов? С наименьшей задержкой? С наименьшими
финансовыми затратами?
Для целей маршрутизации качество канала связи определяется числом, называемым
метрикой стоимости. Путем сложения метрик отдельных отрезков пути вычисляется
общая стоимость маршрута. В простейших системах каждому каналу назначается сто
имость 1, и в результате метрикой маршрута становится число переходов. Но любой из
перечисленных выше критериев может являться метрикой стоимости.
Эксперты в области сетей долго и упорно трудились над тем, чтобы определение
такого понятия, как метрика стоимости, было максимально гибким, а некоторые со
временные протоколы даже позволяют использовать разные метрики для разных видов
сетевого трафика. Тем не менее в 99% случаев на все это можно не обращать внимания.
Для большинства систем вполне подойдут стандартные метрики.
Бывают ситуации, когда кратчайший физический маршрут к адресату не должен
быть выбран по умолчанию из административных соображений. В таких случаях мож
но искусственно завысить метрики критических каналов. Всю остальную работу предо
ставьте демонам.
факт, что соседние маршрутизаторы находятся под контролем других людей. Внешние
протоколы не раскрывают топологию автономной системы, поэтому в определенном
смысле их можно рассматривать как второй уровень маршрутизации, на котором соеди
няются группы сетей, а не отдельные компьютеры или кабели.
На практике небольшим и среднего размера организациям редко требуется внешний
протокол, если только они не подключены к нескольким провайдерам одновременно. При
наличии нескольких провайдеров традиционное разделение на локальный домен и домен
Интернета нарушается, поскольку маршрутизаторам приходится определять, какой марш
рут в Интернете лучше всего подходит для конкретного адреса. (Это не означает, что каж
дый маршрутизатор должен знать всю необходимую информацию. Большинство хостов мо
жет направлять свои пакеты внутреннему шлюзу, хранящему необходимые сведения.)
Поскольку внешние протоколы не сильно отличаются от своих внутренних аналогов,
в этой главе мы сосредоточим внимание на внутренних протоколах и демонах, которые
их поддерживают. Если в вашей сети поддерживается внешний протокол, обратитесь
к литературным источниками, ссылки на которые приведены в конце главы.
Протокол OSPF
OSPF (Open Shortest Path First - открытый протокол обнаружения первого кратчайше
го маршрута) является самым популярным топологическим протоколом. Термин первый
кратчайший маршрут (shortest path first) означает специальный математический алгоритм,
по которому вычисляются маршруты; термин открытый (ореn)-синоним слова "непатен
тованный". Основная версия протокола OSPF (версия 2) определена в документе RFC2328,
а расширенная версия протокола OSPF, поддерживающая протокол 1Pv6 (версия 3), - в до
кументе RFC5340. Первая версия протокола OSPF устарела и сейчас не используется.
OSPF - протокол промышленного уровня, который эффективно функционирует
в крупных сетях со сложной топологией. По сравнению с протоколом RIP, он имеет
ряд преимуществ, включая возможность управления несколькими маршрутами, ве
Протокол EIGRP
EIGRP (Enhanced lnterior Gateway Routing Protocol - улучшенный протокол марш
рутизации внутреннего шлюза) - это патентованный протокол маршрутизации, ис
пользуемый только маршрутизаторами компании Cisco. Протокол IGRP был разработан
для устранения некоторых недостатков протокола RIP еще в те времена, когда не было
такого надежного стандарта, как протокол OSPF. Протокол IGRP был отклонен в пользу
протокола EIGRP, который допускает произвольные сетевые маски CIDR. Протоколы
IGRP и EIGPR конфигурируются одинаково, несмотря на различия в их организации.
Протокол EIG RP поддерживает протокол 1Pv6, но в нем, как и во всех других про
токолах маршрутизации, адресные пространства 1Pv6 и 1Pv4 конфигурируются отдельно
и существуют как параллельные домены маршрутизации.
• динамическая маршрутизация.
• Если из сети есть только один выход во внешний мир, клиенты сети (нешлюзовые
хосты) должны иметь стандартный статический маршрут к этому шлюзу. Никакой
другой конфигурации не требуется, кроме как на самом шлюзе.
вы хотите, чтобы ваша подсеть была доступной для других сетей в вашей организации,
вам необходимо сообщить о ее существовании и идентифицировать маршрутизатор,
к которому будут привязаны пакеты, посылаемые данной подсетью. Обычно для этого
на шлюзе запускается демон маршрутизации.
Маршрутизатор XORP
Проект XORP (eXtensiЫe Open Router Platform - расширяемая платформа маршрути
зации с открытым кодом) бьm открыт примерно в то же время, что и проект Zebra, но
его цели бьmи более универсальными. Вместо маршрутизации проект XORP бьm нацелен
на эмулирование всех функций заданного маршрутизатора, включая фильтрацию пакетов
и управление трафиком. Информация об этом проекте хранится на сайте xorp. org.
Интересный аспект платформы XORP заключается в том, что она не только функ
ционирует в разных операционных системах (Linux, разных версиях BSD, Мае OS Х
и Windows Seiver 2003), но и может запускаться непосредственно с "живого" компакт
диска (т.е. непосредственно с компакт-диска, без инсталляции на жесткий диск. -
Примеч. ред.) на персональном компьютере. Этот "живой" компакт-диск (live CD)
скрытно основан на системе Linux, но он прошел долгую эволюцию и позволяет превра
щать типичный персональный компьютер в специализированное устройство для марш
рутизации.
$ ssh acme-gw.acme.com
Password: <password>
После ввода правильного пароля появится приглашение интерпретатора ЕХЕС.
acme-gw.acme.com>
С этого момента можно начинать вводить команды, например show interfaces
для отображения списка сетевых интерфейсов маршрутизатора или show ? для получе
ния справки по возможным параметрам.
interface EthernetO
description Acme internal network
ip address 192.108.21.254 255.255.255.О
no ip directed-broadcast
interface Ethernetl
description Acme backbone network
ip address 192.225.33.254 255.255.255.0
no ip directed-broadcast
ip classless
line con О
transport input none
line aux О
transport input telnet
line vty О 4
password хххххххх
514 Часть 11. Работа в сетях
login
end
Модифицировать конфигурацию маршрутизатора можно разными способами.
Компания Cisco предлагает графические утилиты, работающие в некоторых версиях
LJNJX/Linux и Windows, но опытные сетевые администраторы никогда ими не пользу
ются. Их самый мощный "инструмент" - командная строка. Кроме того, с помощью
команды scp можно загрузить с маршрутизатора его конфигурационный файл и отре
дактировать в любимом текстовом редакторе, после чего снова записать файл в память
маршрутизатора.
ворит само за себя, но у этой программы есть одно преимущество: она регистрируется
на ваших маршрутизаторах каждую ночь и получает их файлы конфигурации. Затем она
сравнивает эти файлы и сообщает вам об их изменениях. Кроме того, она автоматиче
ски передает файлы конфигурации системе контроля версий (см. раздел 7.8).
15.8. ЛИТЕРАТУРА
• PERLMAN Rло1л. Interconnections: Bridges, Routers, Switches, and lnterworking Protocols
(2nd Edition). Readiпg, МА: Addisoп-Wiley, 2000. Это вьщающаяся книга в данной
области. Если вы решили купить только одну книгу об основах работы в сетях,
покупайте ее. Кроме того, не упускайте шанса "зависнуть" с Радией - она очень
веселая и обладает удивительно обширными знаниями.
• EDGEWORTH, BRAD, AлRoN Foss, AND Rлм1Rо GлRZA Rюs. /Р Routing оп Cisco /OS,
IOS ХЕ, and IOS XR: Ап Essential Guide to Understanding and Implementing /Р Routing
Protocols. lпdiaпapolis, IN: Cisco Press, 2014.
• НuпЕмл CнRISТIAN. Routing in the lnternet, Second Edition. Preпtice Hall, 2000. Эта
книга представляет собой отличное введение в маршрутизацию для начинающих.
В ней описано большинство используемых сегодня протоколов маршрутизации,
а также рассматривается ряд сложных тем, например групповое вещание.
держивает более трех миллиардов пользователей на более чем одном миллиарде ком
пьютеров.' Примеров информационной системы, которая выросла до этого масштаба
с таким количеством вопросов, больше нет. Без DNS Интернет давно бы провалился.
Запросы и ответы
DNS-зaпpoc состоит из имени и типа записи. Возвращаемый ответ - это набор "запи
сей о ресурсах" (resource records - RR), которые реаmруют на запрос (или, альтернативно,
на ответ, указывающий, что имя и тип записи, которые вы запрашивали, не существуют).
"Реаrирует" не обязательно означает "знает". DNS-cepвepы образуют иерархию,
и для ответа на конкретный запрос может потребоваться связь с серверами на несколь
ких уровнях (см. раздел 16.4). 2 Серверы, не знающие ответа на запрос, возвращают за
писи ресурсов, которые могут помочь клиенту найти сервер, знающий ответ.
Наиболее распространенный запрос - это запрос записи А, которая возвращает IР
адрес, связанный с именем. На рис. 16.l показан типичный сценарий.
9et~ostbynue
( "faceЬook.cOID")
Системная бмбnиотека
Человек Веб-браузер и механизм Сервер имен
преобразования имен
Во-первых, человек вводит имя желаемого сайта в веб-браузер. Затем браузер вызы
вает библиотеку DNS Resolver для поиска соответствующего адреса. Библиотека Resolver
создает запрос на запись А и отправляет ее на сервер имен, который возвращает запись
А в своем ответе. Наконец, браузер открывает ТСР-соединение с целевым хостом через
IР-адрес, возвращаемый сервером имен.
/ . (root)
~ра _.-!---л~
in-addr com org net de ' au . . . ···
···--61~~~--- /\~ /\ /\
/'/\ amazon atrust ··· /\
... 173 ... / /'\"
.. , ., {;?' \.. www n~ba~ ···
../~ ...
Для того чтобы система DNS могла работать с данными обоих видов, ветвь IР
адресов в пространстве имен инвертируется, т.е. октеты IР-адресов записываются в об
ратном порядке. Например, если хост "nubark. atrust. сот." имеет адрес 63.173.189.1,
то соответствующий узел на ветви прямых преобразований в дереве имеет имя "nubark.
аtrus t . сот. ", а узел на ветви обратных преобразований имеет имя "1 . 18 9 . 1 7 3 . 6 3 .
in-addr.arpa." 5
Оба эти имени заканчиваются точкой, так же как полные пути файлов всегда на
чинаются с косой черты. Это делает их "полностью квалифицированными доменными
именами", или FQDN для краткости.
Вне контекста системы DNS имена, такие как nubark. а trust. сот (без конечной
точки), иногда называются "полностью квалифицированными именами хостов", но это
жаргонизм . В самой системе DNS наличие или отсутствие конечной точки имеет реша
ющее значение.
Существует два типа доменов верхнего уровня: национальные домены верхнего уров
ня (country code top-level domain - ccTLD) и общие домены верхнего уровня (generic top
level domain - gTLD). Организация ICANN (lnternational Corporation for Assigned Names
and Numbers) управляет проектом регистрации имен в доменах gTLD, таких как сот,
net и org, с помощью аккредитованных агентств. Для регистрации имени в домене
ccTLD зайдите на веб-страницу организации IANA (lnternet Assigned Numbers Authority)
iana. org / cctld и найдите реестр соответствующей страны.
Серверы имен
Сервер имен выполняет несколько рутинных операций.
• Отвечает на запросы об именах и IР-адресах компьютеров.
• Посылает запросы локальным и удаленным компьютерам от имени своих пользо
вателей.
• Кеширует ответы на запросы, для того чтобы ускорить ответы на них в следую
щий раз.
6С технической точки зрения, поскольку вы сами устанавливаете правила для своего поддомена.
может быть один сервер или несколько.
Глава 16. DNS: система доменных имен 523
переадресующий (forwarder) Выполняет запросы от имени многих клиентов; формирует большой кеш
Рекурсивный (recursive) Осуществляет запросы от имени клиента до тех пор, пока не будет най
ден ответ
Нерекурсивный (пoпrecursive) Отсылает клиента к другому серверу, если не может получить ответ
на запрос
7 Некоторые организации используют несколько главных серверов или вообще обходятся без них;
мы описываем вариант, в котором существует один главный сервер.
524 Часть 11. Работа в сетях
В каждой зоне должен быть хотя бы один подчиненный сервер. В идеале подчинен
ных серверов имен должно быть минимум два, причем один из них - вне организации.
Подчиненные серверы на местах должны быть включены в разные сети и в разные цепи
электроснабжения. Если служба имен вдруг перестанет функционировать, пользователи
не смогут нормально работать в сети.
Записи о ресурсах
Каждая организация поддерживает один или несколько фрагментов распределенной
базы данных, лежащей в основе всемирной системы DNS. Ваш фрагмент данных состоит
из текстовых файлов, содержащих записи о каждом компьютере вашей сети; эти записи на
зываются "записями о ресурсах". Каждая запись представляет собой отдельную строку, со
стоящую из имени (обычно имени компьютера), типа записи и некоторых значений. Поле
имени можно не указывать, если его значение совпадает с именем в предьщущей строке.
Например, строки
nubark IN А 63.173.189.1
IN МХ 10 mailserver.atrust.com.
в файле "прямого преобразования" (с именем atrust. com) и строка
1 IN PTR nubark.atrust.com.
Глава 16. DNS: система доменных имен 525
в файле "обратного преобразования" (с именем 63 .173 .189. rev) связывают сайт nubark.
atrust. сот с IР-адресом 63.173.189.1. Запись МХ перенапрамяет сообщение электронной
почты, адресованное на эту машину, на компьютер тailserver. atrust. сот.
Поля IN обозначают классы записей. На практике, эти поля означают Интернет.
Записи о ресурсах - это универсальный язык системы DNS. Они не зависят от фай
лов конфигурации, управляющих операциями , которые выполняются на любой реали
зации данного сервера DNS. Все они являются фрагментами данных, циркулирующих
внутри системы DNS, и кешируются в разных местах.
Делегирование
Все серверы имен считывают имена корневых серверов из локальных файлов кон
фигурации или содержат их в своем коде. Корневые серверы "знают" о доменах сот,
org, edu, fi, de и других доменах верхнего уровня . Эта цепочка продолжается даль
ше: сервер домена edu "знает" о домене colorado. edu, berkely. edu, сервер домена
сот "знает" о домене adтin. сот и т.д. Каждая зона может делегировать полномочия
по управлению своими поддоменами другим серверам .
Рекурсивный Нерекурсивный
СТАРТ
root(".")
Числа возле стрелок определяют порядок событий, а буквы - тип транзакции (запрос,
ссылка или ответ) . Предполагается , что никакие из требуемых данных предварительно
не кешировались, за исключением имен и IР-адресов серверов корневого домена.
Локальный сервер имен не "знает" адреса компьютера vangogh. Более того, ему
ничего не известно о доменах cs. berkeley. edu, berkeley. edu и даже edu. Он "зна
ет" лишь некоторые серверы корневого домена, запрашивает корневой домен об хосте
vangogh. cs. berkeley. edu и получает ссылку на серверы в домене edu.
Локальный сервер имен является рекурсивным. Если ответ на запрос содержит
ссылку на другой сервер, то локальный сервер повторно направляет запрос новому сер
веру. Он продолжает этот процесс, пока не найдет требуемый сервер .
В нашем примере локальный сервер имен посылает запрос серверу домена edu (как
всегда, запрашивая компьютер vangogh. cs. berkeley. edu) и получает ссылку на неза-
526 Часть 11. Работа в сетях
висимые серверы домена berkeley. edu. Затем локальный сервер повторяет запрос, на
правляя его в домен berkeley. edu. Если сервер университета Беркли не содержит ответ
в кеше, он вернет ссьmку на домен cs. berkeley. edu. Сервер этого домена компетентен
в отношении запрашиваемой информации и возвращает адрес компьютера vangogh.
По окончании процедуры в кеше сервера ns. cs. colorado. edu окажется адрес
компьютера vangogh. В кеше будут также находиться списки серверов доменов edu,
berkeley. edu и cs. berkeley. edu.
Детали процедуры запроса можно выяснить с помощью утилит dig +trace или
drill -Т. 8
Кеwирование и эффективность
Кеширование повышает эффективность поиска: кешированный ответ выдается поч
ти мгновенно и обычно точен, так как адресно-именные соответствия меняются редко.
Ответ хранится в течение периода времени, называемого TTL (time to live), продолжи
тельность которого задается владельцем искомой записи. Большинство запросов каса
ется локальных компьютеров и обслуживается быстро. Повышению эффективности не
вольно содействуют и сами пользователи, так как многие запросы повторяются.
Обычно записи о ресурсах вашей организации должны использовать период TTL,
продолжительность которого, как правило, лежит в диапазоне от одного часа до одного
дня. Чем дольше период TTL, тем меньше трафик сети, потребляемый интернет-клиен
тами, получающими свежие копии записи.
Если у вас есть специальная служба, загрузка которой сбалансирована между логи
ческими подсетями (этот процесс называется балансированием нагрузки глобального сер
вера), вы можете потребовать, чтобы поставщик услуг, выполняющий балансирование
загрузки, выбрал более короткую продолжительность TTL, например десять секунд или
одну минуту. (Короткий период TTL позволяет балансировщику загрузки быстро реа
гировать на бездействие серверов и атаки на основе отказа в обслуживании.) Система
с короткими периодами TTL продолжает работать корректно, но ваши серверы имен
должны работать в более интенсивном режиме.
В примере, описанном выше, продолжительность периодов TTL бьmа установлена так:
на корневых серверах- 42 дня, в домене edu - два дня, в домене berkeley. edu - два дня
и один день - для сайта vangough. cs. berkeley. edu. Это разумные величины. Если вы
планируете крупную перенумерацию, то можете сделать периоды TTL короче, чем раньше.
Серверы DNS также реализуют негативное кеширование. Иначе говоря, они помнят,
в каких ситуациях запрос остался без ответа, и не повторяют его, пока не истечет период
TTL для негативного кеширования. Ответы при негативном кешировании сохраняются
в следующих ситуациях.
Сервер BIND кеширует данные в двух первых ситуациях, а сервер UnЬound - во всех
четырех. Количество повторений негативного кеширования можно задавать в любой ре
ализации.
кутилиты diq иdrill - это инструменты системы DNS; утилита diq входит в дисТРибутивный
набор сервера BIND, а утилита drill разработана группой NLпet Labs.
Глава 16. DNS: система доменных имен 527
щий все 13 корневых серверов. Большинство серверов имен возвращает ответы в слу
чайном порядке, выполняя примитивный вид балансирования загрузки.
Можно достичь балансирования загрузки своих серверов, закрепив одно имя за не
сколькими IР-адресами (которые в реальности соответствуют разным компьютерам).
www IN А 192.168.0.1
IN А 192.168.0.2
IN А 192.168.0.З
ные данные, связанные с ним. Итак, чтобы получить все записи, необходимо выполнить
команду dig домен NS, за которой следует выражение dig @nsl.домен. домен any.
(Авторитетные данные в этом контексте рассматриваются как кешированные.)
9 0днако это поведение не является обязательным. Разные клиенты могут иести себя по-разному.
528 Часть 11. Работа в сетях
Утилита dig имеет более 50 опций, а утилита drill - около половины этого коли
чества. Получив флаг -h, эти утилиты выдают список всех своих опций. (Для того чтобы
упорядочить вывод, можно передать его утилите less.) Для обеих утилит опция -х зме
няет порядок следования байтов в IР-адресе на противоположный и выполняет обрат
ный запрос. Флаги +trace утилиты dig и -т утилиты drill показывают итеративные
шаги в процессе распознавания, начиная от корня и вниз по дереву иерархии.
,, QUESTION SECTION:
;viawest.coт. IN SOA
;; AUTHORITY SECTION:
сот. 172800 IN NS c.gtld-servers.net.
сот. 172800 IN NS b.gtld-servers.net.
сот. 172800 IN NS a.gtld-servers.net.
;; ADDITIONAL SECTION:
c.gtld-servers.net. 172800 IN А 192.26.92.30
b.gtld-servers.net. 172800 IN А 192.33.14.30
b.gtld-servers.net. 172800 IN АААА 2001:503:23ld::2:30
a.gtld-servers.net. 172800 IN А 192.5.6.30
,, QUESTION SECTION:
;viawest.corn. IN SOA
;; AUTHORITY SECTION:
viawest.corn. 172800 IN NS nsl.viawest.net.
viawest.corn. 172800 IN NS ns2.viawest.net.
;; ADDITIONAL SECTION:
nsl.viawest.net. 172800 IN А 216.87.64.12
ns2.viawest.net. 172800 IN А 209.170.216.2
,, Query tirne: 52 rnsec
,, SERVER: 192.26.92.30#53(192.26.92.30)
,, WHEN: Wed Feb 3 18:40:48 2016
'' MSG SIZE rcvd: 108
Этот ответ намного более краткий, и теперь мы знаем, что следующий сервер для за
проса - nsl. viawest. сот (или ns2. viawest. com).
$ dig @nsl.viawest.net viawest.com soa
; <<>> DiG 9.8.3-Pl <<>> @ns2.viawest.net viawest.corn soa
; (1 server found)
,, global options: +crnd
, , Got answer:
'' ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61543
'' flags: qr аа rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
,, WARNING: recursion requested but not availaЫe
,, QUESTION SECTION:
;viawest.corn. IN SOA
;; ANSWER SECTION:
viawest.corn. 3600 IN SOA rnvec.viawest.net. hostrnaster.
viawest.net. 2007112567 3600 1800 1209600 3600
,, AUTHORITY SECTION:
viawest.corn. 86400 IN NS ns2.viawest.net.
;; ADDITIONAL SECTION:
ns2.viawest.net. 3600 IN А 209.170.216.2
,, QUESTION SECTION:
;www.viawest.com. IN ANY
;; ANSWER SECTION:
www.viawest.com. 60 IN СNАМЕ hm-d8ebfa-vial.threatx.io.
;; AUTHORITY SECTION:
viawest.com. 86400 IN NS ns2.viawest.net.
;; ADDITIONAL SECTION:
ns2.viawest.net. 3600 IN А 209.170.216.2
$0RIGIN имя_домена
Указанный файл включается в базу данных в том месте, где стоит эта директива.
Если имя файла не является полностью определенным, оно интерпретируется относи
тельно каталога, из которого был запущен сервер имен.
Если задано значение параметра источник, то синтаксический анализатор действу
ет так, будто чтению файла предшествовала директива $ORIGIN. Обратите внимание
на то, что значение источник не возвращается к своему предыдущему значению после
$ТТ1 86400
$ТТ1 24h
$ТТ1 ld
устанавливают значение $TTL равным одному дню.
Записи о ресурсах
С каждой зоной в иерархии DNS связан набор записей о ресурсах. Базовый формат
этой записи имеет следующий вид.
Символ Назначение
Начало комментария
@ Имя текущей зоны
(} Разбивка данных на несколько строк
Поле имя идентифицирует объект (обычно хост или домен), к которому относится
запись. Если несколько последовательно расположенных записей ссылаются на один
и тот же объект, то после первой записи поле имя можно опустить. Поле должно начи
наться в первой колонке, если она присутствует.
Имя может быть относительным либо абсолютным. Абсолютные имена заканчива
ются точкой и полностью определены. На внутреннем уровне программное обеспечение
работает с полными именами, добавляя имя текущего домена и точку ко всем именам,
которые не заканчиваются точкой. Это позволяет укорачивать имена, но часто сопряже
но с ошибками.
Например, в домене cs. colorado. edu имя anchor интерпретируется как "anchor.
cs. colorado. edu. ". Если же ввести имя anchor. cs. colorado. edu, то отсутствие
точки в конце также будет подразумевать сокращенное имя, к которому следует добавить
стандартный домен, что в итоге даст имя "anchor. cs. colorado. edu. cs. colorado.
edu. ". Это очень распространенная ошибка.
В поле ttl (time-to-live - время существования) задается время (в секундах), в тече
ние которого элемент данных может оставаться в кеше и при этом считаться достовер
ным. Это поле часто опускают, но оно обязательно на корневом сервере в файле под
сказок. Стандартное значение поля задается директивой $TTL, указываемой в первой
строке файла зоны.
Если время существования записей задать равным примерно неделе, то это приведет
к значительному снижению сетевого трафика и нагрузки на DNS. Однако следует пом
нить о том, что после сохранения записи в кеше за пределами локальной сети ее уже
нельзя принудительно сделать недостоверной. Поэтому, планируя серьезную реструкту
ризацию сети, сделайте значение $TTL достаточно низким (например, один час), чтобы
записи, находящиеся во внешних кешах, быстро устарели, а новые параметры в течение
часа вступили в действие. После завершения работы восстановите исходное значение
этого параметра.
Для выяснения этих данных мы использовали команду dig; для простоты вывод бьm
сокращен.
В поле класс задается тип сети. По умолчанию запись IN всегда означает Интернет.
Существуют различные типы DNS-записей, из которых широко используются менее
десяти. В стандарте 1Pv6 было добавлено еще несколько типов. Записи о ресурсах раз
биваются на четыре группы.
Содержимое поля данные зависит от типа записи. Запрос DNS о конкретном домене
и типе записи получает в ответ все соответствующие ему записи о ресурсах, извлечен
юзаписи о маршруrизации почты МХ относятся как к категории записей зон, так и к категории
базовых записей, поскольку они могуr относиться как ко всей зоне, так и к отдельным хостам.
534 Часть 11. Работа в сетях
Запись SOA
Запись SOA (Start of Authority - начало полномочий) обозначает начало зоны - груп
пы записей о ресурсах, расположенных в одной точке пространства имен DNS. Этот
узел дерева DNS называют также точкой передачи полномочий. Как мы увидим ниже,
домен DNS обычно охватывает минимум две зоны: для прямого преобразования имен
компьютеров в IР-адреса и обратного преобразования. Часть дерева DNS, которая слу
жит целям прямого преобразования, упорядочена по именам, а ветвь обратного преоб
разования - по IР-адресам.
Порядковым номером может быть любое 32-разрядное целое число, причем оно долж
но увеличиваться при каждом изменении файла зоны. Во многих организациях в этом
номере зашифровывается дата последней модификации файла. Например, значение
2017110200 указывает на первое изменение в файле зоны, сделанное 2 ноября 2017 года.
Порядковые номера могут не быть последовательными, но должны монотонно воз
растать. Если случайно задать на главном сервере очень большое число и передать его
подчиненным серверам, то исправить порядковый номер на главном сервере не удастся.
Подчиненные серверы запрашивают новые данные только в том случае, когда порядко
вый номер записи SOA главного сервера больше, чем у них.
Существует два способа решения этой проблемы.
Следующие четыре элемента записи SOA - значения интервалов времени (по умол
чанию в секундах), определяющих, как долго данные могут находиться в кеше в раз
личных точках глобальной базы данных DNS. Можно поменять едИницы измерения,
воспользовавшись суффиксами m (минуты), h (часы), d (дни) и w (недели). Например,
выражение lhЗOm означает" 1 час 30 минут". Выбор интервала времени требует компро
мисса между эффективностью (использование старого значения дешевле выборки ново
го) и точностью (новые значения более точные). Эти четыре поля называются refresh,
upda te, expire и minimum.
Первый элемент задает периодичность обновления данных. Он показывает, как часто
подчиненные серверы должны связываться с главным сервером и проверять, не поме-
11 На самом деле в записи SOA может быть указан любой сервер имен зоны, если вы не используете
динамическую систему DNS. В этом случае запись SOA должна содержать имя главного сервера.
536 Часть 11. Работа в сетях
нялся ли порядковый номер конфигурации зоны. Если база данных зоны изменилась
(порядковый номер главного сервера стал больше, чем у подчиненного сервера), подчи
ненные серверы должны обновить свои копии базы данных. Общепринятые значения
для этого интервала - от одного до шести часов (3600-21600 секунд).
Вместо того чтобы пассивно ждать истечения периода обновления, современные
серверы BIN D (всегда) и NSD (иногда) самостоятельно уведомляют свои подчиненные
серверы об изменениях зон. Уведомление об обновлении может быть потеряно из-за
перегруженности сети, поэтому значение параметра refresh должно быть разумным.
Если подчиненный сервер пытается узнать порядковый номер у главного сервера,
а тот не отвечает, то через некоторое время будет сделана повторная попытка. Как пока
зывает опыт, нормальное значение для второго элемента - от 20 до 60 минут (1200-3600
секунд).
Если главный сервер длительное время отключен, то подчиненные серверы будут
безуспешно пытаться обновить свои данные. По истечении определенного времени все
подчиненные серверы должны "решить", что главный сервер не включится никогда
и его данные наверняка устарели. Параметр expire определяет, как долго подчинен
ные серверы будут обслуживать домен в отсутствие главного сервера. Система должна
сохранить работоспособность, даже если главный сервер не работает неделю, поэтому
третьему элементу следует присваивать большое значение. Мы рекомендуем выбирать
интервал от одного до двух месяцев.
Записи NS
Записи NS (name server - сервер имен) идентифицируют серверы имен, которые
авторитетны для зоны (т.е. все главные и подчиненные серверы), а также делегируют
полномочия по управлению поддоменами другим организациям. Обычно эти записи
следуют сразу после записи SOA.
Ш Записи NS определены в документе RFC1035 (1987).
Эти записи имеют следующий формат.
Рассмотрим пример.
NS nsl.atrust.com.
NS ns2.atrust.com.
booklab NS ubuntu.booklab.atrust.com.
NS nsl.atrust.com.
Глава 16. DNS: система доменных имен 537
Первые две строки определяют серверы имен для домена atrust. сот. Здесь пара
метр пате не указан, потому что он совпадает с полем пате записи SOA, которая пред
шествует этим записям; поэтому поле пате оставлено пустым. Параметр class также не
указан, потому что по умолчанию он равен IN и его необязательно задавать явно.
Третья и четвертая строки делегируют поддомен с именем
booklab. а trust. сот. сер
верам имен ubuntu.booklab и nsl. Эти записи на самом деле являются частью поддо
мена booklab, но они должны также появляться в родительской зоне atrust. сот, чтобы
делегирование бьuю возможным. Аналогично записи NS для домена atrust. сот хранят
ся в файле зоны . сот, чтобы определить поддомен atrust. сот и идентифицировать его
серверы. Серверы домена . сот отсьmают запросы об хостах в домене atrust. сот серве
рам, перечисленным в записях NS для домена atrust. сот внутри домена . сот.
Записи А
Записи А (address - адрес) являются основной частью базы данных DNS. Они обе
спечивают перевод имен компьютеров в lР-адреса. Для каждого из сетевых интерфейсов
компьютера должна существовать одна запись А. Она имеет следующий формат.
имя_хоста [tt.l] [IN] А IР-адрес
Рассмотрим пример.
nsl IN А 63.173.189.1
В этом примере поле имя_хоста не завершается точкой, поэтому сервер имен до
бавляет домен, заданный по умолчанию, и образует полностью определенное имя "nsl.
atrust. сот.". Эта запись связывает данное имя с IР-адресом 63.173.189.l.
ЗаписиАААА
Записи АААА (address - адрес) представляют собой эквивалент записей А в протоколе
1Pv6. Эти записи не зависят от транспортного протокола, с помощью которого они до
ставляются. Публикация записей 1Pv6 в ваших DNS-зoнax не означает, что вы должны
отвечать на DNS-запросы с помощью протокола lv6.
Запись АААА имеет следующий формат.
имя_хоста [ttl] [IN] АААА IР-адрес
Рассмотрим пример.
f.root-servers.net. IN АААА 2001:500:2f::f
538 Часть 11. Работа в сетях
Записи PTR
Записи PTR обеспечивают обратный перевод IР-адресов в доменные имена. Как ука
зывалось ранее, записи обратного отображения существуют в домене in-addr. arpa
и именуются байтами IР-адреса, следующими в обратном порядке. Например, зона
для подсети 189 в данном примере имеет имя 18 9. 174. 63. in-addr. arpa.
Общий формат записи PTR таков.
адрес [ttl] IN PTR имя_хоста
Например, запись PTR в зоне 189 .1 73. 63. in-addr. arpa, соответствующая приве
денной выше записи А для хоста nsl, будет иметь следующий вид.
1 IN PTR nsl.atrust.com.
Имя 1 не заканчивается точкой и потому является относительным. Вопрос: относи
тельно чего? Не относительно домена atrust. сот, поскольку для того, чтобы эта запись
бьша точной, домен по умолчанию должен называться 189 .173. 63. in-addr. arpa.
Этого можно добиться, поместив записи PTR для каждой подсети в отдельный файл.
Домен, связанный по умолчанию с этим файлом, задан в файле конфигурации сервера
имен. Другой способ выполнить обратное преобразование - включить в файл зоны за
писи вида
Формат "nibЫe" меняет адресную запись АААА на обратную, расширяя каждый фраг
мент адреса, разделенный двоеточием, до четырех шестнадцатеричных цифр, а затем ме
няя порядок следования этих цифр и приписывая iрб. arpa в конце. Например, запись
PTR, которая соответствует нашей записи АААА из предыдуmего примера, имеет вид
f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.2.0.0.0.0.5.0.1. 0.0.2.ipб.arpa.
PTR f.root-servers.net.
Эта строка была разделена на две, чтобы информация поместилась на странице.
К сожалению, это не очень удобно для системного администратора, который должен
вводить, отлаживать или даже анализировать такие данные. Конечно, в ваших реальных
файлах зоны DNS оператор $0RIGIN может скрыть некоторые сложности.
Записимх
Записи МХ (mail exchanger - обмен почтой) используются системой электронной по
чты для более эффективной маршрутизации почтовых сообщений. Запись мх подменяет
адресата сообщения, в большинстве случаев направляя сообщение концентратору элек
тронной почты на сервере получателя, а не прямо на его рабочую станцию.
• если администратор локальной сети лучше знает, куда следует рассьmать сообще
ния (т.е. всегда).
Компьютер, принимающий почту для другого хоста, должен настроить свою програм
му пересьmки соответствующим образом. Как задать такую конфигурацию для программы
sendmail и почтовых серверов Postfix, показано в разделах 20.1 О и 20.15 соответственно.
В базе данных DNS иноrда можно встретить метазаписи МХ.
* IN МХ 10 mailserver.atrust.com.
На первый взгляд кажется, что такая запись позволяет избежать многократного ввода
данных и является стандартной для всех хостов. Однако метасимвол интерпретируется
совсем не так, как можно ожидать. Он соответствует полю имени, которое еще не было
указано в явном виде в других записях о ресурсах.
Записи СNАМЕ
Записи CNAME (canonical name - каноническое имя) позволяют назначать хосту до
полнительные мнемонические имена. Псевдонимы широко применяются для закре
пления за компьютером какой-либо функции либо просто для сокращения его имени.
Реальное имя иногда называют каноническим. Приведем несколько примеров.
ftp IN СNАМЕ anchor
kb IN СNАМЕ kibЫesnbits
' 2 Это правило, касающееся записей СNАМЕ, явным образом ослаблено в спецификациях DNSSEC,
которые добавили цифровые подписи к каждому набору записей о ресурсах DNS.
Глава 16. DNS: система доменных имен 541
Записи SRV
Эти записи определяют местонахождение служб в пределах домена. Например, бла
годаря записи SRV можно запросить удаленный домен и узнать имя его FТР-сервера.
Раньше в подобной ситуации приходилось действовать наугад в надежде на то, что ад
министратор удаленного домена, следуя традиционной практике, добавил запись СNАМЕ
для имени "ftp" в базу данных DNS.
W Записи SRV определены в документе RFC2782 (2000).
Гораздо разумнее применять для этих целей записи SRV. С их помощью админи
страторам намного удобнее менять адреса служб и контролировать их использование.
Однако требуется, чтобы сами клиенты знали, как найти и проанализировать записи
SRV, поэтому эффект от их применения пока не столь ощутим.
Записи SRV напоминают обобщенные записи МХ с дополнительными полями, кото
рые позволяют администратору DNS управлять внешними соединениями и распреде
лять нагрузку на сервер. Формат записей выглядит следующим образом.
служба.протокол.имя [ttl] [IN] SRV приоритет вес порт сервер
ется служба, а сервер - имя сервера, предоставляющего данную услугу. Для того чтобы
избежать повторного обращения, в ответ на запрос к записи SRV обычно возвращается
запись А сервера.
Если вес равен О, то специального распределения нагрузки не требуется. Имя серве
ра, равное ' . ', означает, что служба на данном хосте недоступна.
Ниже показан пример из документа RFC2782, адаmированный для домена atrust. com.
ftp.tcp SRV О О 21 ftp-server.atrust.corn.
Записи тхт
Эти записи добавляют в базу данных DNS произвольный текст. Например, в нашей
базе данных имеется следующая запись, идентифицирующая организацию.
11 Эrо немного не так. Для SPF существует определенный тип записи DNS; однако предпочтитель
ной является версия записи тхт.
Глава 16. DNS: система доменных имен 543
Файлы конфигурации
Полная конфигурация демона named включает его конфигурационный файл (named.
conf), файлы данных зоны, содержащие адресные привязки для каждого хоста, и файл
подсказок для корневого сервера имен. Авторитетные серверы должны иметь файл кон
фигурации и файлы данных зоны для каждой зоны, относительно которых они явля
ются главными серверами. Кеширующие серверы должны иметь файл конфигурации
и файл подсказок для корневого сервера имен.
Файл конфигурации демона named имеет специфический формат; все остальные
файлы представляют собой коллекции отдельных записей данных DNS, рассмотренных
в разделе 16.4.
В конфигурационном файле named. conf задается роль хоста (главный, подчинен
ный, тупиковый или только кеширующий) и определяется способ, которым он должен
получать копию записей о данных каждой зоны, которую он обслуживает. Здесь же при
водятся всевозможные параметры - как глобальные, связанные с работой самого де
мона named, так и локальные, связанные с серверами и :зонами и относящиеся только
к части трафика DNS.
Файл конфигурации состоит из набора инструкций, каждая из которых оканчивается
точкой с запятой и описывается в последующих разделах книги. К сожалению, формат
544 Часть 11. Работа в сетях
файла довольно "хрупкий": достаточно одной пропущенной точки с запятой, чтобы все
перестало работать.
Комментарии допускаются везде, где могут стоять пробелы. Поддерживаются ком
ментарии в стиле языков С, С++ и командного интерпретатора, но лучше выбрать один
стиль и придерживаться только его.
Инструкция Назначение
mas ter s Определяет список главных серверов для тупиковых и подчиненных зон
con t rol s Определяет, как утилита ndc будет управлять сервером имен named
view Определяет представление данных зоны
• оператор отрицания !.
Инструкция include
Когда конфигурационный файл становится слишком большим, можно разбить его
на части, поместив их в отдельные файлы. Дополнительные компоненты подключаются
к файлу named. conf посредством инструкции include.
include "путь";
Инструкция options
Эта инструкция задает глобальные параметры конфигурации, часть из которых впо
следствии может быть переопределена мя конкретных зон или серверов. Общий фор
мат инструкции имеет следующий вид.
options {
параметр;
параметр;
};
Если в файле named. conf нет инструкции opt ions, принимаются значения
по умолчанию.
В пакете BIND существует много параметров, даже слишком много. В версии 9.9 их
более 170, что очень затрудняет их изучение. Полный список параметров можно найти
в документации. К сожалению, ходят слухи, что разработчики пакета BIND подумывают
546 Часть 11. Работа в сетях
о том, чтобы удалить некоторые параметры, которые оказались неудачными или больше
не нужны. Это будет ударом Д/\Я организаций, которые все же используют такие пара
метры и нуждаются в них. Ниже будут описаны лишь те параметры, которые рекомен
дуется задавать. (Мы опросили разработчиков пакета BIND и учли их мнения и советы.)
Для более полного изучения параметров рекомендуем обратиться к одной из по
священных системе DNS и пакету BIND книг, упомянутых в конце главы. Кроме того,
советуем обратиться к документации, сопровождающей пакет BIND. Все параметры,
включая их синтаксис и значения по умолчанию, описаны в документе АRМ, находящем
W Местоположение файлов
ШI Синхронизация зон
В ранних версиях сервер BIND синхронизировал файлы зон между главным и под
чиненным серверами только по истечении тайм-аута для обновления, заданного в за
писях зоны SOA. В настоящее время главный сервер named автоматически уведомляет
подчиненные серверы при перезагрузке соответствующей базы данных зоны, если па
раметр notify равен yes. В ответ на полученное уведомление подчиненные серверы
связываются с главным сервером, чтобы проверить, изменились ли файлы, и обновляют
свои копии данных.
шению к которым данный сервер является главным. Если параметр notify установлен
равным explici t, то демон named уведомляет только серверы, указанные в разделе
also-notify.
W Более подробно тупиковые зоны обсуждаются в подразделе "Инструкция zone".
Демон named выясняет, какие компьютеры являются подчиненными серверами
зоны, просматривая записи NS этой зоны. При наличии параметра also-notify бу
дут также уведомляться дополнительные серверы, которые не зарегистрированы по
W Рекурсия запросов
Если ваш сервер имеет слишком большой объем трафика, то иногда необходимо ис
пользовать параметры recursive-clients и max-cache-size. Параметр recursive-
clients управляет многочисленными рекурсивными процессами поиска, которые
сервер выполняет одновременно. Каждый из них требует около 20 двоичных килобайт
памяти. Параметр max-cache-size ограничивает объем памяти сервера, который будет
использоваться для кеширования ответов на запросы. Если объем кеша увеличивается
слишком сильно, то демон named удаляет записи до истечения их периода ТТL, чтобы
предотвратить превышение лимита.
W Использование IP-nopтa
Порты отправителя стали играть важную роль в системе DNS после обнаружения
ошибки протокола DNS, выявленной Дэном Камински (Dan Kaminsky). Этот недоста
ток допускает атаку кеша DNS, когда серверы имен используют предсказуемые порты
источника и идентификаторы запросов. Параметры use- и avoid- для портов UDP
в сочетании с изменениями программного обеспечения демона named смягчили послед
ствия таких атак.
11 Некоторые брандмауэры запоминают состояние и могут распознавать ответ системы DNS на за
прос, посланный секунду назад. Таким серверам не требуется помощь, обеспечиваемая параметра
ми avoid-v*-udp-ports.
Глава 16. DNS: система доменных имен 549
ный IР-адрес, чтобы пройти через брандмауэр или отличить внутреннее представление
от внешнего.
W Использование переадресации
W Разрешения
Эти параметры позволяют указать, какие хосты (или сети) могут обращаться к сер
веру имен и запрашивать пересылку баз данных зон, а также динамически обновлять
зоны. Списки соответствия адресов представляют собой слабый способ обеспечения
безопасности и уязвимы для подделки IР-адресов, поэтому полагаться на них рискованно.
Вероятно, не составит никакого труда заставить ваш сервер ответить на DNS-зaпpoc, но
следует избегать использования параметров allow_update и allow_transfer; вместо
них следует применять криптографические ключи.
В списке Ыackhole перечислены серверы, которые никогда не "удостоятся внимания"
демона named: он не будет принимать от них запросы и обращаться к ним за ответом.
W Размеры пакетов
W Статистика
Инструкция acl
Список управления доступом - это просто именованный список соответствия адресов.
acl имя_ списка {
список_соответствия_адресов
);
Заданное имя можно указывать везде, где требуется список соответствия адресов.
Инструкция а с 1 должна быть самой первой в файле named. conf, так что не 11ы
тайтесь ставить ее среди других объявлений. Файл named.conf читается за один про
ход, поэтому списки управления доступом должны быть определены до того, как на них
встретится ссылка. Существует четыре стандартных списка соответствий:
Для создания ключа нужно указать как алгоритм шифрования, так и общий секрет
ный ключ, который представлен в виде строки, закодированной в формате Base64 (см.
раздел 16.10).
key идентификатор_ключа
algorithm строка;
secr:et строка;
};
на эти запросы.
Инструкция server
Демон named способен общаться с серверами, которые не используют последнюю
версию пакета BIND или просто неправильно сконфигурированы. Инструкция server
сообщает демону характеристики удаленных серверов. Она может заменять стандартные
значения параметров конкретного сервера, хотя это не обязательно, пока вы не захотите
сконфигурировать ключи для передачи зоны.
server iр-адрес {
bogus yes 1 no; [нет]
provide-ixfr: yes 1 no; [да]
request-ixfr yes 1 no; [да]
keys {идентификатор_ключа; идентификатор ключа; ... } ; [нет]
transfer-source iр-адрес [порт]; [ближайший интерфейс]
transfer:-sour:ce-vб iрvб-адрес [порт]; [ближайший интерфейс]
};
Инструкция masters
Эта инструкция позволяет задавать имена одного или нескольких главных серверов,
указывая их IР-адреса и криптографические ключи. Затем это имя можно использовать
в разделе masters инструкций zone вместо повторения IР-адресов и ключей.
W В каких случаях главных серверов бывает несколько? Ответ см. через несколько страниц.
Инструкция masters удобна, когда несколько подчиненных или тупиковых зон по
лучают данные от одного и того же удаленного сервера. Если адреса и криптографиче
ские ключи удаленного сервера изменились, вы можете обновить инструкцию masters,
которая их задает, а не изменять многочисленные инструкции zone.
Синтаксис этой инструкции выглядит следующим образом.
Инструкция logging
Демон named в настоящее время заслуживает награды "За наиболее конфигуриру
емую подсистему журнальной регистрации на Земле". Система Syslog предоставляет
программистам контроль над приоритетами сообщений, а системным администрато
рам - контроль над местом хранения этих сообщений. Но в рамках заданного приори
тета администратор не может указать: "Это сообщение меня интересует, а это - нет".
В систему BIND были добавлены категории, позволяющие классифицировать сообще
ния по типам, и каналы, расширяющие возможности в плане хранения сообщений.
Категории назначаются программистом, а каналы - администратором.
Поскольку вопросы журнальной регистрации лежат несколько в стороне от нашего
повествования (особенно если учесть объем материала), мы рассмотрим их позднее.
Инструкция statistics-channels
Эта инструкция statistics-channels позволяет соединиться с выполняемым де
моном named с помощью браузера и просмотреть статистические показатели, которые
на нем собраны. Поскольку статистические показатели сервера имен могут быть конфи
денциальными, следует ограничить доступ к этим данным, открыв их только для дове-
554 Часть 11. Работа в сетях
Инструкция zone
Это "сердце" файла naaad.aonf, которое сообщает демону named о зонах, для ко
торых он авторитетен, и задает параметры управления каждой зоной. Инструкция zone
также используется для предварительной загрузки "подсказок" с корневого сервера
("подсказки" - это имена и адреса корневых серверов, участвующих в инициализации
DNS-поиска).
Точный формат инструкции zone зависит от роли, которую демон named должен
играть в отношении этой зоны. Возможными типами зоны являются master, slave,
hint, forward, stub и delegation-only. Мы не будем рассматривать зоны типов stub
(используется только в системе BIND) и delegation-only (применяется для прекраще
ния использования записей с шаблонными символами в зонах верхнего уровня при изве
щении служб регистратора). Остальные типы зон описаны в последующих разделах.
Многие из рассмотренных ранее глобальных параметров могут быть частью инструк
ции zone, т.е. переопределять глобальные установки. Мы не будем повторно упоминать
о них, за исключением тех параметров, которые наиболее часто используются.
zone "имя_домена" {
type master;
file "путь";
};
При наличии столь большого числа параметров зоны (есть еще порядка сорока, о ко
торых мы не упомянули) конфигурация зоны кажется довольно сложной. Однако су
ществует возможность объявить главную зону, состоящую только из пути к файлу зоны.
Ниже показан слегка модифицированный пример, взятый из документации.
zone "example.com" {
type master;
file "forward/example.com";
allow-query { any; );
allow-transfer { my-slaves; );
};
zone "имя_домена"
type slave;
file "путь";
masters { iр_адрес [port iр_порт] [key имя_ключа]; ... };
allow-query { список_соответствия_адресов ); [все хосты]
};
Подчиненные серверы обычно хранят полную копию базы данных зоны. Директива
file задает имя локального файла, в котором сохраняется реплицированная база дан
ных. Получив новую копию данных зоны, сервер сохраняет ее в этом файле. В случае сбоя
и перезагрузки сервера файл можно просто прочитать с диска, а не пересьmать по сети.
Редактировать файл реплицированной базы данных не нужно, так как он управля
ется демоном named. Тем не менее имеет смысл просмотреть его, если есть подозрение,
что в базу данных главного сервера закралась ошибка. Файл подчиненной зоны создает
ся уже после того, как демон named интерпретировал исходные данные зоны и раскрыл
все относительные имена. Когда в файле присутствуют имена наподобие
128.138.243.151.cs.colorado.edu.
anchor.cs.colorado.edu.cs.colorado.edu.
можно быть уверенным в том, что где-то пропущена завершающая точка.
В списке masters перечислены IР-адреса компьютеров, с которых может быть за
гружена база данных зоны. Она также может содержать имя списка главных серверов,
определенных предыдущей инструкцией masters.
Ранее мы говорили, что только один компьютер может быть главным сервером зоны,
так почему же разрешается список, состоящий из нескольких адресов? Во-первых,
16 Необходима также входная фильтрация на брандмауэре (см. раздел 13.14), а еще лучше использо
вать технологию аутентификации TSIG.
556 Часть 11. Работа в сетях
zone ' 1
."
type hint;
file "путь";
};
в домене ". ". На самом деле вы можете сгенерировать файл подсказок, выполнив ути
литу dig. Рассмотрим пример.
$ diq@f.root-servers.net . ns > root.cache
Обратите внимание на точку. Если сервер f. root-servers. net не отвечает, вы мо
жете выполнить запрос, не указывая конкретный сервер.
zone "имя_домена" {
type forward
forward only 1 first;
forwarders { iр_адрес; iр_адрес; ... }
};
Создавать такую зону имеет смысл, если у организации имеется деловой партнер
и нужно направлять трафик непосредственно его серверам имен в обход стандартного
пути распространения запросов.
controls {
inet iр_адрес port порт allow { список_соответствия_адресов
keys {список_ключей)
в списке keys.
В системе BIND существует команда rndc-confgen, позволяющая сгенериро
вать ключ аутентификации, используемый в диалоге между командой rndc и демоном
named. Это можно сделать двумя способами. Первый способ - заставить обе стороны
загрузить ключ из общего конфигурационного файла (/etc/rndc. key) или поместить
ключ в два разных файла (/etc/rndc. conf для и /etc/named. conf для named).
rndc
Второй способ сложнее, но он необходим, если демон named и команда rndc запуска
ются на разных компьютерах. Команда rndc-confgen -а задает ключи для доступа
к локальному хосту.
% ./rndc-confgen -Ь 256
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "orZuz5amkUnEp52zlHxD6cd5hACldOGsG/elP/dv2IY=";
};
options
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
view имя_представления {
match-clients { список_соответствия_адресов ); [все ХОСТЬI]
match-destinations { список_соответствия_адресов ); [все ХОСТЬI]
match-recursive-only yes 1 no; [нет]
параметр_представления;
инструкция_zопе; ...
view "external" {
match-clients { any; ); 11 допускаются любые запросы
recursion по; 11 рекурсия запрещена
zone "example.com" { 11 только "общедоступные" хосты
type master;
file "example-external.db";
};
};
17 На самом деле к локальному хосту относится весь класс сетей А 127/8, но большинство исполь
зует просто адрес 127.0.0.1.
Глава 16. DNS: система доменных имен 561
3600 ;минимум
NS localhost.
А 127.0.0.1
Обратный файл 127. О. О имеет следующий вид.
$TTL 30d
0.0.127.in-addr.arpa
@ IN SOA localhost. postmaster. localhost. (
2015050801 ;регистрационный номер
3600 ;тайм-аут обновления
1800 ;тайм-аут повторения
604800 ;срок действия
3600 ) ;минимальный тайм-аут
NS localhost.
PTR localhos t.
Отображение для адреса локального хоста ( 127 .О.О.\) никогда не изменяется, поэтому
тайм-ауты могут быть большими. Обратите внимание на регистрационный номер, кото
рый кодирует дату; данный файл последний раз изменялся в 2015 году. Кроме того, об
ратите внимание на то, что для домена локального хоста указан только главный сервер
имен. Символ@ здесь означает "О. О .127. in-addr. arpa. ".
controls
inet 127.0.0.1 allow ( 127.0.0.1; 1 keys { atkey; 1;
1;
// подчиненные серверы
); //конец внутреннего представления
match-clients { any; );
recursion no;
}
.
.
'
... //Тут пропущено много главных и подчиненных зон
};// конец внешнего представления
Файл atrust. key содержит определение ключа "а t key".
key "atkey" {
algorithm hmac-md5;
secret "общий секретный ключ";
};
Глава 16. DNS: система доменных имен 563
Файл trademark. zones содержит варианты имени а t rus t. сот как в раз
ных доменах верхнего уровня (net, org, us, info и т.д.), так и с разным написанием
(appliedtrust. сот и т.д.), а файл infrastructure. zones содержит корневые под
сказки и файлы локального хоста.
Файлы зон определяют два разных представления (внутреннее и внешнее) и тип сер
вера (главный или подчиненный). Это отображается в соглашении об именах файлов
зон. Во внутреннем представлении данный сервер является рекурсивным. Это представ
ление содержит все локальные хосты, многие из которых используют частные адреса. Во
внешнем представлении этот сервер не является рекурсивным. Данное представление
содержит только выбранные хосты домена atrust. сот и внешние зоны, для которых
они обеспечивают DNS-услуги главных или подчиненных серверов.
Ниже приведены фрагменты файлов internal/atrust.com и world/atrust.com.
Сначала рассмотрим файл internal.
; файл atrust.com - внутренний файл
$TTL 86400
$0RIGIN atrust.com.
@ 3600 SOA nsl.atrust.com. trent.atrust.com. (
2001110500 10800 1200 3600000 3600
3600 NS NSl.atrust.com.
3600 NS NS2.artust.com.
3600 мх 10 mailserver.atrust.com.
3600 А 66.77.22.161
nsl А 192.168.2.1
ns2 А 66. 77 .122 .161
www А 66.77.122.161
mailserver А 192.168.2.11
exchange А 192.168.1.100
secure А 66.77.122.161
Здесь использованы частные адреса RFC1918. Кроме того, обратите внимание на то,
что вместо записей СNАМЕ для определения имен локального хоста эта организация ис
пользует несколько записей А. 18 Эта схема работает быстрее, поскольку она не учиты
вает результат проверки записи СNАМЕ в дополнительном запросе. Этот подход неплох,
но каждому IР-адресу должна соответствовать только одна запись PTR в зоне обратного
преобразования.
Рассмотрим текст внешнего представления той же зоны а t ru s t. сот из файла
world/atrust.com.
; файл atrust.com - внешний файл
$TTL 57600
$0RIGIN atrust.com.
@ SOA nsl.atrust.com. trent.atrust.com. (
2010030400 10800 1200 3600000 3600
NS NSl.atrust.com.
NS NS2.atrusr.com.
~модно время распознавание записей было потенциально быстрее, чем распознавание СNАМЕ, по
тому что они освобождали клиентов от необходимости выполнять второй DNS-зaпpoc мя полу
чения адреса цели СNАМЕ. В наши дни DNS-cepвepы стали изощреннее и автоматически включают
запись А для цели в исходном ответе на запрос (если они ее знают).
564 Часть 11. Работа в сетях
мх 10 mailserver.atrust.com.
А 66.77.122.161
nsl.atrust.com. А 206.168.198.209
ns2.atrust.com. А 66.77.122.161
www А 69.77.122.161
mailserver А 206.168.198.209
secure А 66.77.122.161
; обратные преобразования
exteriorl А 206.168.198.209
209.198.168.206 PTR exteriorl.atrust.com.
exterior2 А 206.168.198.213
213.198.168.206 PTR exterior2.atrust.com.
Как и во внутреннем преобразовании, имена реализованы с помощью записей А.
Очень немногие хосты на самом деле видны во внешнем представлении, хотя из данных
фрагментов это не следует. Обратите внимание на то, что компьютеры, которые видны
в обоих представлениях (например, ns 1. а trust. com), во внутреннем представлении
имеют частные адреса RFCl918, а во внешнем - реальные IР-адреса.
В этих файлах зоны параметр ТТL по умолчанию установлен равным 16 часам (5700
секунд), а для внутренних зон - одному дню (86400 секунд).
Передача зоны
Серверы DNS синхронизируются посредством механизма передачи зоны. Передача
зоны может включать в себя всю зону (такая передача называется AXFR) или только
последние изменения (такая передача именуется IXFR). По умолчанию передача зоны
осуществляется по протоколу ТСР через порт 53. Сервер BIND регистрирует соответ
ствующую информацию в системном журнале с пометкой "xfer-in" или "xfer-out".
В процессе передачи зоны подчиненный сервер запрашивает информацию от главного
сервера и создает резервную копию данных о зоне на диске. Если данные на главном сер
вере не изменились, что определяется по порядковым номерам (не по реальным данным),
то обновления не выполняются и резервные файлы просто фиксируются. (Иначе говоря,
их время изменения устанавливается равным текущему времени.)
И отправляющий, и получающий серверы способны отвечать на запросы при пере
даче зоны. Подчиненный сервер начинает использовать новые данные только после за
вершения передачи.
Если зона очень большая (например, com) или обновляется динамически (о чем пой
дет речь в следующем подразделе). то объем изменений обычно мал в сравнении с раз
мером зоны. При передаче IXFR пересылаются только изменения (когда размер изме
нений начинает превышать размер зоны, включается режим обычной передачи AXFR).
Механизм IXFR напоминает программу patch: старая база данных сравнивается и син
хронизируется с новой.
В системе BIND передача IXFR задается по умолчанию, а демон named, предна
значенный для ведения журнала транзакций, - именем имя_зоны.jnl. В инструкции
server любого сервера, которому нужны такие передачи, можно задать параметры
provide-ixfr и request-ixfr. Параметр provide-ixfr включает и отключает
службу IXFR для зон, по отношению к которым сервер является главным. Параметр
request-ixfr включает и отключает службу IXFR для зон, по отношению к которым
сервер является подчиненным.
dhcp-hostl.domain. IN А 192.168.0.1
dhcp-host2.domain. IN А 192.168.0.2
Эго простое решение, но оно означает, что указанные имена постоянно связаны с IР
адресами и, следовательно, компьютер, получающий новый адрес, меняет имя. В такой
среде трудно соблюдать требования безопасности и вести журнальную регистрацию.
Механизм динамических обновлений, появившийся в последних версиях BIND, пред
лагает альтернативное решение. Он позволяет демону DHCP уведомлять сервер BIND
о сделанных адресных назначениях, обновляя, таким образом, содержимое базы данных
DNS "на лету". Динамические изменения могут добавлять, удалять и модифицировать за
просы о ресурсах. Если динамические изменения дозволены, демон named ведет журнал
динамических изменений (имя_ зоны.jnl), который может оказаться полезным при сбое
сервера. Демон named восстанавливает состояние зоны, сохраненное в памяти, считывая
исходные файлы зон и воспроизводя изменения на основе журнала.
После того как зона бьша динамически обновлена, ее уже нельзя редактировать вруч
ную. Необходимо сначала остановить сервер BIND с помощью команд rndc freeze
зона или rndc freeze зона класс представление. Эти команды синхронизируют
журнальный файл с файлом главной зоны на диске, а затем удаляют журнал. После это
го можно отредактировать файл зоны вручную. К сожалению, исходное форматирова
ние файла пропадет (он будет иметь вид файла, который ведется демоном named на под
чиненных серверах).
При "заморозке" зоны попытки динамического обновления отменяются. Для того
чтобы загрузить файл зоны с диска и все-таки выполнить динамическое обновление,
следует использовать команду rndc thaw с теми же аргументами, которые бьши указа
ны при "заморозке" зоны.
Утилита nsupdate, входящая в дистрибутив BIND 9, позволяет осуществлять ди
намические обновления из командной строки. Утилита работает в пакетном режиме,
принимая команды, вводимые с клавиатуры, или читая их из файла. Пустая строка или
команда send являются признаком завершения обновления и пересьшают изменения
на сервер. Две пустые строки означают конец входного потока. В командном языке
предусмотрена примитивная инструкция i f. позволяющая формулировать условия вида
"если имя неизвестно в DNS, добавить его". Искомое имя (или набор записей о ресур
сах) может существовать либо отсутствовать. В качестве предиката утилиты nsupdate
можно потребовать, чтобы имя или запись о ресурсе суrnествовали или не существовали.
Ниже показан простейший сценарий nsupdate, который заносит в базу данных
информацию о новом хосте, а также псевдоним существующего хоста при условии,
что этот псевдоним нигде не используется. Угловые скобки создаются программой
nsupdate и не являются частью командного сценария.
$ nsupdate
> update add newhost.cs.colorado.edu 86400 А 128.138.243.16
>
> prereq nxdomain gypsy.cs.colorado.edu
> update add gypsy.cs.colorado.edu СNАМЕ evi-laptop.cs.colorado.edu
Динамические обновления - очень опасная возможность. Они потенциально спо
собны предоставить право неконтролируемой записи важных системных данных.
Не пытайтесь контролировать доступ на основании IР-адресов: их легко подделать.
Лучше воспользоваться системой аутентификации TSIG с общим секретным ключом.
Например, в системе BIND 9 поддерживается команда
$ nsupdate -k каталог_ключа:файл_ключа
Глава 16. DNS: система доменных имен 567
или
% nsupdate -k каталог_ключа:секретный_ключ
Поскольку пароль задается в командной строке после ключа -у, его может увидеть
тот, кто запустит команду w или ps в правильный момент. По этой причине более пред
почтительной является форма -k. Подробнее технология TSIG описана в разделе 16. IO.
Динамические обновления зоны разрешаются в файле named.conf посредством па
раметра allow-update или update-policy. Параметр allow-update предоставляет
право обновления любых записей клиентам, чьи IР-адреса и ключи шифрования указа
ны в списке. Параметр update-policy появился в BIND 9 и позволяет точнее управ
лять обновлениями на основании имен хостов и типов записей. Он требует использовать
механизмы аутентификации. Оба параметра являются зонными.
С помощью параметра update-policy можно разрешить клиентам обновлять свои
записи А и PTR, но не SOA, NS или КЕУ. Можно также позволить хосту обновлять толь
ко свои записи. Имена допускается задавать явно, в виде поддоменов, с метасимвола
ми или с помощью ключевого слова self, которое задает правила доступа компьютера
к собственным записям. Записи о ресурсах идентифицируются по классу или типу.
Синтаксис параметра update-policy выглядит следующим образом.
(grantldeny) сущность имя_типа имя [типы] ;
Сущность - это имя криптографического ключа, необходимого для авторизации
обновлений. Имя_типа имеет четыре значения: name, subdomain, wildcard или self.
Опция self является особенно полезной, потому что позволяет хосту обновлять только
свои записи. По возможности, следует использовать именно ее.
Имя - это обновляемая зона, а типы - типы записей о ресурсах, которые можно об
новить. Если типы не указаны, то могут обновляться записи всех типов, кроме SOA, :-is,
RRSIG и NSEC или NSECЗ. Рассмотрим пример.
update-policy ( grant dhcp-key subdomain dhcp.cs.colorado.edu А ) ;
В такой конфигурации любому, у кого есть ключ dhcp-key, разрешается обнов
лять адресные записи в поддомене dhcp. cs. colorado. edu. Эта дир·ектива должна
появиться в файле named.conf в инструкции zone домена dhcp.cs.colorado.e ju. 0
);
568 Часть 11. Работа в сетях
1 '>Не делайте частные адреса недоступными, если они используются для конфигурирования вну
тренних DNS-cepвepoв!
Глава 16. DNS: система доменных имен 569
198.11.16.0/24;
204.228.69.0/24;
);
allow-recursion { cunets; );
Ыackhole { bogusnets; );
Желательно также ограничить передачи зон только легитимными подчиненными
серверами. Это достигается с помощью следующих списков.
acl ourslaves {
128.138.242.1; 11 сервер anchor
);
acl measurements {
198.32.4.0/24; 11 проект Билла Маннинга, адрес v4
2001:478:6:: :/48; 11 проект Билла Маннинга, адрес v6
);
на каждом хосте. Если такой возможности нет, ограничьте трафик DNS-пакетов шлюзо
вым компьютером, который находится под постоянным административным контролем.
Открытые распознаватели
Открытый распознаватель - это рекурсивный кеширующий сервер имен, получаю
щий запросы от любого пользователя Интернета и отвечающий на них. Открытые рас
познаватели опасны. Внешние пользователи могут потреблять ваши ресурсы без вашего
разрешения или ведома, и, если они делают это со злым умыслом, кеш вашего распоз
жете также проверить все серверы имен вашей сети или все серверы вашей организации,
используя идентификаторы whois.
Для того чтобы ваши кеширующие серверы имен отвечали на запросы только локаль
ных пользователей, исполь.зуйте список упрамения доступом в файлах named. conf.
20 Это число выглядит случайным, но на самом деле оно представляет собой хешированное значе
ние ключа TSJG.
572 Часть 11. Работа в сетях
Ключ должен быть записан в файлах named. conf на обоих компьютерах. В связи
с тем, что эти файлы общедоступны, а ключ - нет, поместите ключ в отдельный файл,
который будет включаться в файл named. conf. Файл ключа должен иметь уровень до
ступа, равный 600, и принадлежать пользователю демона named.
Например, можно создать файл master-slavel. tsig и включить в него следующий
фрагмент.
key master-slavel {
algorithm hmac-md5
secret "сгенерированный_ ключ"
};
В файл
named. conf ближе к началу нужно добавить такую строку.
include "master-slavel.tsig";
На данном этапе лишь определен ключ. Для того чтобы его можно было использо
вать для подписи и проверки обновлений, нужно посредством инструкции server иди
рективы keys заставить каждый сервер идентифицировать другую сторону. Например,
в инструкцию zone на главном сервере можно включить строку
бенность которой состоит в том, что в модулярной арифметике возвести число в степень довольно
просто, а вычислить логарифм по этой степени практически невозможно.
Глава 16. DNS: система доменных имен 573
Другой механизм для подписи транзакций между серверами или службами динами
ческого обновления и главным сервером называется SIG(O). Он использует криптогра
фию, основанную на открытых ключах. Детали этой технологии описаны в документах
RFC2535 и RFC293 l.
Технология DNSSEC
DNSSEC - это набор расширений DNS, позволяющих аутентифицировать ис
точник данных зоны и проверить их целостность, используя шифрование с открытым
ключом. Таким образом, DNSSEC позволяет DNS-клиентам задавать вопросы вида
"Действительно ли данные зоны поступили от владельца зоны?" и "Те ли это данные, ко
торые послал владелец?"
Технология DNSSEC основана на цепочке доверия: корневые серверы предоставля
ют подтверждающую информацию для доменов верхнего уровня, те - для доменов вто
рого уровня и т.д.
тем, что ключи мoryr быть изменены без прерывания работы службы DNS. Если рекур
сивный сервер имен, использующий технологию DNSSEC, посылает запрос неподпи
санной зоне, то поступающий неподписанный ответ считается корректным. Проблема
возникает лишь тогда, когда срок действия подписи истек или родительская и дочерняя
зоны не согласовали текущий ключ DNSKEY дочерней зоны.
Запись DS (Designated Signer) возникает только в дочерней зоне и означает, что под
зона является безопасной (подписанной). Она также идентифицирует ключ, использу
емый дочерней зоной для подписания своего собственного набора записей о ресурсах
КЕУ. Запись DS содержит идентификатор ключа (пятизначное число), криптографи
ческий алгоритм, тип дайджеста (digest type) и дайджест записи об открытом клю
че, разрешенном (или использованном) для подписи записи о ключе дочерней зоны.
Соответствующий пример приведен ниже. 22
example.com. IN DS 682 5 1 12898DCF9F7AD20DBCE159E7 ...
Изменение существующих ключей в родительской и дочерней зонах является сложной
проблемой и требует сотрудничества и взаимодействия между родительской и дочерней
зонами. Для решения этой проблемы создаются записи DS, используются отдельные клю
чи для подписи ключей и зон, а также применяются пары многократных ключей.
Ключи, содержащиеся в записи о ресурсах DNSKEY, могут быть либо ключами
для подписания ключа (key-signing key - KSK), либо ключами для подписания зоны
(zone-sigпing key - ZSK). Для различия между ними используется новый флаг под на
званием SEP ("secure eпtry poiпt" - "точка безопасного входа"). Пятнадцатый бит поля
флагов устанавливается равным единице для ключа KSK и О - для ключа ZSK. Это со
глашение делает поле флагов нечетным числом для ключа KSK и четным для ключей
22 8 этом разделе 64-разрядные хеши и ключи были усечены, чтобы сэкономить пространство и
лучше проиллюстрировать структуру записей.
Глава 16. DNS: система доменных имен 575
ZSK, если интерпретировать его как десятичное число. В настоящее время эти значения
равны 257 и 256 соответственно.
Для обеспечения удобного перехода от одного ключа к другому можно генерировать
многократные ключи. Дочерняя зона может изменить свои ключи подписания зоны, не со
общая об этом родительской зоне. Она должна согласовывать с родительской зоной только
изменение ключа для подписания ключей. Когда ключ изменяется, и старый, и новый клю
чи на определенном отрезке времени считаются действующими. Как только срок действия
кешированных значений в Интернете истечет, старый ключ будет считаться отмененным.
Запись RRSIG - это подпись набора записей о ресурсах (т.е. набора всех записей од
ного и того же типа и с одним и тем же именем внутри зоны). Записи RRSIG генериру
ются программным обеспечением, предназначенным для подписания зоны, и добавля
ются в подписанную версию файла зоны.
Запись RRSIG содержит много информации.
• Тип записей о ресурсах, входящих в подписываемый набор.
• Алгоритм, используемый для подписания и закодированный небольшим числом.
• Количество меток (фрагментов, разделенных точками) в поле имени.
• Значение ТТL для подписываемого набора записей.
• Срок действия подписи (в формате ггггммддччсссс).
• Время подписания набора записей (также в формате ггггммддччсссс).
• Идентификатор ключа (пятизначный номер).
Рассмотрим пример.
RRSIG NS 5 2 57600 20090919182841 (
20090820182841 23301 example.com.
pMKZ76waPVTЫguEQNUojNV1VewHau4p ... ==)
При подписании зоны также генерируются записи NSEC или NSECЗ. В отличие
от подписанных наборов записей, они сертифицируют интервалы между именами на
боров записей и тем самым позволяют подписывать ответ типа "нет такого домена" или
"нет такого набора записей о ресурсах". Например, сервер может ответить на запрос за
писей А с именем bork. atrust. сот, послав запись NSEC, подтверждающую отсутствие
любых записей А между именами bork. atrust. сот и borrelia. atrust. сот.
К сожалению, включение в записи NSEC конечных точек позволяет обойти зону
и выяснить все ее действующие хосты. В версии NSECЗ этот недостаток был устранен пу
тем включения в запись хешированных имен конечных точек, а не самих имен. Правда,
это было сделано за счет более интенсивных вычислений: чем выше безопасность, тем
ниже производительность. В настоящее время используются как записи NSEC, так и за
писи NSECЗ, и вы должны будете сделать выбор между ними при генерировании своих
ключей и подписании своих зон.
Если защита от блуждания по зоне не является критически важной для вашей орга
низации, мы рекомендуем пока использовать запись NSEC.
На самом деле лучше изолировать закрытые ключи и процесс подписания зоны, сильно за
Jl)ужающий центральный процессор, на компьютере, который не доступен из Интернета.
(Разумеется, компьютер, обрабатывающий данные, должен быть виден из Интернета.)
На первом этапе настройки протокола DNSSEC следует организовать файлы зон
так, чтобы все файлы данных для зоны находились в одном каталоге. Это необходимо
для правильной работы инструментов, управляющих зонами по протоколу DNSSEC.
Затем следует включить протокол DNSSEC на своих серверах с помощью опиций
файла named.conf.
options {
dnssec-enaЫe yes;
options {
dnssec-enaЫe yes;
dnssec-validation yes;
Команды
$ dnssec-keygen -а RSASRA25б -Ь 1024 -n ZONE example.com
Kexample.com.+008+29718
$ dnssec-keygen -а RSASRA25б -Ь 2048 -n ZONE -f KSK example.com
Kexample.com.+008+05005
генерируют для сайта example. сот пару 1024-битовых ключей ZSK, использующую ал
горитмы RSA и
SHA-256, а также соответствующую пару 2048-битовых ключей KSK. 23
Серьезная проблема, связанная с Оfl)аничением на предельный размер пакета UDP, вы
нуждает отдавать предпочтение коротким ключам для подписания зоны и часто их ме
нять. Для повышения уровня безопасности можно использовать более длинные ключи
для подписания ключей.
Генерирование ключей занимает немного времени - всего несколько секунд. Как
правило, Оfl)аничивающим фактором является не мощность центрального процессора,
а энтропия, доступная для рандомизации. В системе Linux для повышения энтропии за
счет дополнительных источников используется демон haveged, который повышает ско
рость генерирования ключей.
В идеале закрытая часть любой пары ключей должна храниться в компьютере, отклю
ченном от сети, или хотя бы в компьютере, недоступном из Интернета. Для динамически
обновляемых зон это требование практически невыполнимо, а для ключей, предназначен
ных для подписания зон, еще и непрактично. Тем не менее для ключей, предназначенных
для подписания других ключей, данное требование абсолютно разумно, поскольку эти
ключи имеют долгий срок действия. Подумайте о скрытом главном сервере, недоступном
извне для ключей ZSК. Распечатайте закрытый ключ KSK или запишите его на флешку,
а затем спрячьте в сейфе, пока он не потребуется в следующий раз.
"Заперев" новые закрытые ключи, целесообразно записать информацию о новых
ключах в системный файл ключей. При этом не обязательно записывать туда сами клю
чи. Достаточно записать их идентификаторы, алгоритмы, дату, назначение и т.д.
По умолчанию срок действия подписи ограничен одним месяцем для записей RRSIG
(ZSК-подписи наборов записей о ресурсах) и тремя месяцами для записей DNSSIG (КSК
подписи ключей ZSK). В настоящее время рекомендуется использовать 1024-битовые
ключи ZSK от трех месяцев до одного года, а 1280-битовые ключи KSK - от одного
до двух лет. 25 Поскольку рекомендуемые сроки действия ключей дольше, чем сроки, уста
новленные для них по умолчанию, эти параметры необходимо указывать явно при под
писании или периодическом переподписании зон, даже если сами ключи не изменились.
24 Исполыуйте команду наподобие cat Кехтарlе. сот+*. key >> zonefile. Операция>> означает до
бамение ключа в конец файла zonefile, а не его замену, как операция>. (Не перепугайте их!)
25 Рекомендации разных организаций, касающиеся мин криптографических ключей, приведены на
веб-сайте keylength. сот.
578 Часть 11. Работа в сетях
Подписание зоны
Итак, теперь, когда у вас есть ключи, вы можете подписывать зоны с помощью ко
манды dnssec-signzone, добавляющей записи RRSIG и NSEC или NSECЗ в каждый на
бор записей о ресурсах. Эти команды считывают оригинальный файл зоны и создают
отдельную подписанную копию с именем файл_ зоны. signed.
Синтаксис команды dnssec-signzone для сервера BIND имеет следующий вид.
dnssec-signzone [-о зона] [-N increment] [-k КSК-файл]
файл_зоны [ZSК-файл]
где параметр зона по умолчанию равен файл_ зоны, а ключевые файлы по умолчанию
задаются командой dnssec-keygen, как описано выше.
Если имена ваших файлов зоны совпадают с именами зон, а имена ключевых файлов
не изменялись, то команда сокращается до следующего варианта:
Флаг Описание
-g Генерирование записи (записей) os, которая должна быть включена в роди
тельскую зону
Размеры файлов подписанных зон от четырех до десяти раз больше, чем размеры
файлов исходных зон, и все попытки навести логический порядок напрасны. Строка
наподобие
rnail-relay А 63.173.189.2
превращается в несколько следующих строк.
Как только ваша зона подписана, остается лишь указать сервер имен в подписан
ных версиях файлов зоны. Если вы используете сервер BJND, поищите инструкцию
zone, соответствующую каждой зоне в файле named. conf, и измените параметр file
с ехатрlе. сот на ехатрlе. сот. signed.
В заключение перезапустите демон сервера имен, заставив его прочитать снова
свой файл конфигурации. Для сервера BIND следует выполнить команды sudo rndc
reconfig и sudo rndc flush.
Теперь мы обслуживаем подписанную зону DNSSEC! Для того чтобы внести измене
ния, вы можете отредактировать либо исходный неподписанный файл зоны, либо под
писанный файл зоны, а затем переподписать зону. Редактирование подписанной зоны
иногда оказывается чрезвычайно сложной задачей, но это проще, чем повторное под
писание всей зоны. Удалите записи RRSIG, соответствующие всем изменяемым записям.
Для того чтобы избежать путаницы между версиями, вероятно, следует внести идентич
ные изменения в неподписанную зону.
Это все, что касается локальной части конфигурации протокола DNSSEC. Осталось
только решить трудную проблему: соединить наш безопасный "DNS-островок" с дру
гими надежными и подписанными частями иерархии DNS. Мы должны либо передать
наши записи DS в подписанную родительскую зону, либо использовать динамическую
проверку доменов. Решение этих задач описывается в следующем разделе.
• Подождать 24 часа (период ТТL); теперь все могут использовать как старый ключ,
так и новый.
Глава 16. DNS: система доменных имен 581
Механизм смены ключей KSK называется двойным подписанием (douЫe signing) и так
же довольно прост. Однако вам придется переслать новую запись DS родительской зоне
или послать запись DLV своему "суррогатному родителю". Убедитесь, что родительская
зона или репозитарий точек доверия вас признали, прежде чем переключиться на новый
ключ. Процесс смены ключей KSK состоит из следующих этапов.
Инструменты DNSSEC
В дистрибутивный набор BIND 9.10 входит новый инструмент для отладки. Domain
Entity Lookup and Vcllidation Engine (DELV) выполняет поиск аналогично утилите diq,
но при этом он лучше согласован с протоколом DNSSEC. Фактически утилита delv
проверяет цепочку доверия DNSSEC с помощью того же самого кода, который исполь
зует демон named в пакете BIND 9.
Кроме инструментов DNSSEC, поставляемых с пакетом BIND, существует четыре
набора инструментов для развертывания и тестирования: ldns, DNSSEC-Too\s (бывший
Sparta), RIPE и OpenDNSSEC (opendnssec. org).
нием каждого из них. Все они находятся в каталоге exaaples, за исключением уrилиты
drill, имеющей свой собственный каталог в дистрибуrивном пакете. Команды сопро
вождаются справочными страницами. Файл READМE, относящийся к верхнему уровню
иерархии каталогов, содержит очень краткие инструкции по инсталляции.
Инcmpyмeнmыdnssec-tools.org
Комплект инструментов DNSSEc-Tools создан на основе инструментов сервера
BIND, предназначенных для поддержки протокола DNSSEC, и включает в себя следу
ющие команды.
Команда drill имеет два особенно полезных флага: -т - для отслеживания цепоч
ки доверия от корня до указанного хоста и -s - для отслеживания подписей от ука
занного хоста обратно к корню. Рассмотрим практический пример вывода, полученно
го от команды drill -S, позаимствованный из документа DNSSEC НОWТО компании
NLnet Labs.
$ drill -s -k ksk.keyfile example.net SOA
DNSSEC Trust tree:
example.net (SOA)
1---example.net. (DNSKEY keytag: 17000)
1---example.net. (DNSKEY keytag: 49656)
1---example.net. (DS keytag: 49656)
1---net. (DNSKEY KEYTAG: 62972)
Канал Место, куда направляются сообщения, - система Syslog, файл или устройство /dev/null"
Категория Класс сообщений, генерируемых демоном named, например сообщения о динамических об
новлениях или об ответах на запросы
Средство Название средства системы Syslog; за DNS не закреплено собственное средство, но можно
выбрать любое стандартное
Важность Степень важности сообщения об ошибке
logging {
определение_канала
определение_канала
category имя_категории
имя канала
имя канала
};
};
Каналы
Аргумент определение_канала выглядит по-разному, в зависимости от того, ве
дет он к файлу или к системе Syslog. Для каждого канала необходимо выбрать либо тип
file, либо тип syslog; совмещать их канал не может.
channel имя_канала {
file путь [versions число_версий 1 unlimited) [size размер);
syslog средство;
severity важность;
print-category yes no;
print-severity yes no;
print-time yes 1 no;
};
Для файлового канала аргумент число_ версий сообщает о том, сколько резервных
копий файла нужно хранить. Аргумент размер задает предельно допустимый размер
файла (например, 2048, lOOk, 20rn, 15g, unlirnited, default), по достижении кото-
586 Часть 11. Работа в сетях
def ault _syslog Направляет сообщениs~ уровнs~ info и выше в систему Syslog от имени средства
daemon
de f а ul t _ debug Направляет сообщениs~ в файл named. run; уровень важности устанавливаетсs~
равным dynamic
defaul t stderr Направляет сообщениs~ в стандартный канал ошибок демона named с уровнем
важности i nf о
null Отбрасывает все сообщения
Категории
В момент создания программы категории определяются программистом. Они орга
низовывают сообщения по темам или функциональным возможностям, а не по важно
сти. В табл. 16.9 приведен текущий список категорий сообщений.
Журнал запросов
Стандартный вид инструкции logging таков.
logging {
category default ( default_syslog; default debug; );
);
с запросом.
• Отклонение запроса ("".query (cache) ххх denied"). Причиной этого сообщения мо
жет быть неправильная конфигурация удаленного сайта, нарушение правил или
ситуация, в которой некто делегировал вам зону, но вы ее не конфигурировали.
сконфигурированной зоне.
• Зона отклонена ("Zone rejected"). Демон named отказался загружать файл зоны,
поскольку тот содержит ошибки.
• Не найдены записи NS ("No NS RR for"). В файле зоны после записи SOA не найдены
записи NS. Возможно, они отсутствуют либо не начинаются с табуляции или како
го-нибудь другого пробельного символа. Во втором случае они не присоединяются
к зоне и, следовательно, интерпретируются неправильно.
• Не задано стандартное значение TTL ("No default ТТL set"). Желательно задавать
стандартное значение TTL посредством директивы $TTL, располагаемой в нача
ле файла зоны. Ошибка свидетельствует о том, что такая директива отсутствует.
В версии BIND 9 наличие этой директивы обязательно.
• Нет корневых серверов имен для класса ("No root nameservers for class"). Демону
named не удается найти корневые серверы имен. Следует проверить файл корне
вых "подсказок" и подключение сервера к Интернету.
• Адрес уже используется ("Address already in use"). Порт, который нужен для работы
демона named, занят другим процессом, возможно, другой копией демона. Если де
мон отсутствует в списке выполняющихся процессов, то, очевидно, он перед этим
итоге попадут сообщения. Чем выше уровень важности, тем больше информации реги
стрируется.
reload зона [класс [представление]] Повторно загружает только указанную зону или
представление
retransfer зона [класс Повторно копирует данные для зоны из главного сервера
[представление]]
•Аргумент класс означает то же, что и в случае записей о ресурсах; для Интернета он обычно равен IN.
ко одна зона, а остальные трогать не нужно. Кроме того, можно задать параметры
класс и представление, чтобы загрузить только указанное представление данных
зоны.
Обратите внимание на то, что команды rndc reload недостаточно, чтобы доба
вить совершенно новую зону; для этого требуется, чтобы демон
named прочитал файл
named. conf и новый файл зоны. Для новых зон следует использовать команду rndc
reconfig, которая заново прочитывает файл конфигурации и загружает любую новую
зону, не трогая суrnествующие.
Версии демона named и программы rndc должны со1шадать, иначе будет выдано со
общение о несовпадении версий протокола. Обычно они устанавливаются на один и тот
же компьютер, и расхождение версий может вызвать проблемы, если попытаться управ
лять демоном named, запущенном на другом компьютере.
Некорректное делегирование
Подавая заявку на регистрацию доменного имени, вы просите, чтобы основному
серверу имен и администратору DNS была выделена (делегирована) часть дерева имен.
Если не поддерживать работу домена или изменить адреса серверов имен, не обновив
связующие записи родительского домена, будет иметь место так называемое некоррект
ное делегирование (lame delegation).
Последствия некорректного делегирования могут оказаться весьма негативными.
Если хотя бы один из ваших серверов окажется некорректным, то вся ваша система
DNS снизит эффективность работы. Если все серверы имен являются некоррект
ными, то ни один из них не будет доступен. Все запросы будут начинаться с кор
ня, пока ответы будут кешироваться, поэтому некорректные серверы и неисправное
программное обеспечение, которое не делает негативного кеширования ошибок
SERVFAIL, увеличивают нагрузку на каждый хост, находящийся на пути от корня
к некорректному домену.
Послав с помощью команды dig запрос о серверах имен для домена wЗwЗ. сот одно
му из серверов gТLD-домена . сот, мы получим следующую информацию.
$ d.ig @e.gtld-servers.net wЗwЗ.com ns
;; ANSWER SECTION:
w3w3.coт 172800 IN NS nsO.naтeservices.net.
w3w3.coт 172800 IN NS nsl.naтeservices.net.
Если же теперь опросить каждый из этих серверов по очереди, задав им этот же во
прос, то мы получим ответ от сервера nsO и не получим ответа от сервера nsl.
$ d.ig @nsO.nameservices.net wЗwЗ.com ns
;; ANSWER SECTION:
w3w3.coт 14400 IN NS nsO.naтeservices.net.
w3w3.coт 14400 IN NS nsl.naтeservices.net.
, , AUTHORITY RECORDS:
сот. 92152 IN NS M.GTLD-SERVERS.NET.
сот. 92152 IN NS I.GTLD-SERVERS.NET.
сот. 92152 IN NS E.GTLD-SERVERS.NET.
Сервер имен nsl. naтeservices. net делегировал ответственность за домен wЗwЗ.
сот серверам домена . сот, но они эту ответственность не приняли. Эта конфигурация
является неправильной, и возникло некорректное делегирование. Клиенты, пытающи
еся попасть в домен wЗwЗ. сот, будут обслуживаться медленно. Если домен wЗwЗ. сот
оплачивает услуги DNS домену naтeservices. net, то он заслуживает компенсации!
Иногда, посылая запрос с помощью команды dig на авторитетный сервер в поисках
некорректности, можно не получить никакой информации. В этом случае следует по
пытаться повторить запрос с флагом +norecurse, чтобы можно было увидеть точно, что
знает искомый сервер.
16.12. ЛИТЕРАТУРА
Система доменных имен и пакет BIN D описаны во многих источниках, включая до
кументацию, входящую в состав пакета, отдельные главы в книгах об Интернете, целую
книгу серии ln а Nutshell издательства O'Reilly, а также многочисленные ресурсы в гло
бальной сети.
26 80 многих организациях в качестве канала laтe-servers для журналов регистрации указан ка
талог /dev/null, чтобы не беспокоиться о некорректном делегировании других доменов, не при
надлежащих этой организации. Это допустимо, если ваш домен находится в полном порядке и не
является ни источником, ни жертвой некорректного делегирования.
Глава 16. DNS: система доменных имен 593
• Lщ СR1скЕт, AND PлuL АLвпz. DNS and В/ND (5th Edition). Sebastopo\, СА:O'Reilly
Media, 2006. Эта книга стала настольным справочником по серверу BIND, хотя
и написана довольно тяжелым языком.
• Lщ CRICKET. DNS & В/ND Cookbook. Sebastopo\, СА: O'Reilly Media, 2002. Это
упрощенная версия книги издательства O'Reilly о системе DNS, содержащая чет
кие инструкции и примеры работы с серверами имен. Довольно старая, но все еще
полезная.
• Lщ СR1скп. DNS and В/ND оп !Рvб. Sebastopol, СА: O'Reilly Media, 2011. Книга
ориентирована на DNS и BIND в рамках протокола IPvб. Она невелика и содер
жит исключительно материал, связанный с протоколом IPvб.
• Lucлs, М1снлн W DNSSEC Mastery: Securing the Domain Name System with BJND.
Grosse Point Woods, MI: 1ilted Windmill Press, 2013.
Ресурсы в Интернете
Веб-сайты isc.org, dns-oarc.net, ripe.net, nlnetlabs.nl, f.root-servers.
org и k. root-servers. org содержат много информации о системе DNS, исследовани
ях, результатах измерений, презентациях и др.
Подробная информация о протоколе DNS, записях о ресурсах и других аспектах
DNS iana. org / assignments/dns-parameters. Этот документ со
приведена на сайте
держит информацию о том, в каком документе RFC описан тот или иной факт, касаю
щийся работы системы DNS.
Справочник DNSSEC НОWТО, написанный Олафом Колкманом (O\af Kolkman), -
это 70-страничный документ, в котором изложены все аспекты развертывания и отлад
ки протоколаDNSSEC. Его можно загрузить с сайта nlnetlabs. nl/ dnssec _ howto/
dnssec howto. pdf.
Документы RFC
Документы RFC, в которых описывается система доменных имен, доступны на веб
сайте www. rfc-edi tor. org. Мы использовали только самые важные из них, хотя в на
стоящее время есть около 100 документов и около 50 черновиков, опубликованных
в Интернете, поэтому рекомендуем читателям зайти на сайт www. rfc-edi tor. org и из
учить весь архив.
Для того чтобы увидеть все документы, касающиеся текущей версии BIND, найдите
каталоги doc/rfc и doc/draft.
Глава 17
Система единого входа
1 Сообщество специалистов по системам безопасности делится на тех, кто считает, что наилучшую
зашиту аутентификации обеспечивает служба LDAP, и сторонников протокола Kerberos. Дорога
жизни усеяна расплющенными белками, которые не могли сделать выбор. Выберите свой вариант
и не оглядывайтесь назад.
Глава 17. Система единого входа 597
Провайдер
login, getty, идентификации
оконный сервер
ntpd - - - - Сервер NTP
nss_sss
!
Библ и отека С
Связующее
звено LDAP
Сервер
getp~ntO шd
getpwnam() Active Directory
Связующее
звено Kerberos
раm_ш
[
Провайдер аутентификации JРаспознаватель DNS 1---8"1~ Сервер DNS j
Текущая стандартная система, пред.11оженная организацией IETF д.11я этих целей, на
зывается LDAP (Lightweight Directory Access Protocol - упрощенный протокол доступа
к каталогам). 2 Изначально LDAP задумывался как простой шлюзовой протокол, кото
рый позволял бы клиентам TCP/IP взаимодействовать с серверами каталогов Х.500, те
перь уже устаревшими.
Особенности LDAP
Для уверенной работы с LDAP вам нужен хотя бы небольшой опыт. Протокол LDAP
сам по себе не решает какую-либо административную проблему. Нет какой-то "'глав
ной задачи", которую можно было бы решить исключительно с помощью LDAP; к тому
2 Как это ни парадоксально, но протокол LDAP можно назвать каким угодно, но только не упро
щенным.
'ТСР-порт 389 является портом по умолчанию для всех реализаций протокола LDAP.
598 Часть 11. Работа в сетях
ных с LDAP. и в реализациях серверов. Причиной успеха этого формата яШiяется то обсто
ятельство, что LDAP можно без труда преобразовывать в простой текст и обратно.
Записи образуют иерархию по "отличительным именам" (имя атрибута: dn -
distinguished name), которые формируют некоторую разновидность пути поиска. Как и в
системе DNS, "самый старший бит" находится справа. Например, в приведенном выше
примере имя DNS navy. rnil используется для построения верхних уровней иерархии
LDAP. Оно разбивается на два компонента домена: navy и rnil, хотя это всего лишь
одно из некоторых обычных соглашений.
Каждая запись имеет только одно отличительное имя. Записи совершенно изолиро
ваны друг от друга и не образуют иерархии, за исключением иерархии, неявно опре
деляемой атрибутами dn. Это гарантирует их уникальность и подсказывает реализации
протокола, как эффективно индексировать и искать данные. Виртуальную иерархию,
созданную атрибутами dn, применяют разные пользователи протокола LDAP, но она
является скорее соглашением о структуризации данных, чем явной функциональной
возможностью протокола LDAP. В то же время существуют возможности для создания
символических связей между записями и ссьшками на другие серверы.
Записи LDAP обычно составляются на основе использования атрибута obj ectCla.s s.
Классы объектов определяют атрибуты, которые может содержать запись, причем не
которые из них могут требоваться для проверки достоверности. Каждому атрибуту на
значается тип данных. Схема вложения и комбинирования классов объектов ничем не
отличается от схемы, принятой в традиционном объектно-ориентированном програм
мировании. Верхний уровень дерева класса объектов называется top; он означает лишь
то, что запись должна иметь атрибут obj ectClass.
В табл. 17.1 приведены некоторые обычные атрибуты LDAP, назначение которых
с первого взгляда может быть непонятным.
Таблица 17. 1• Некоторые имена атрибутов, которые можно встретить в иерархиях LDAP
Существует множество причин рассматривать проект 389 Directory Server как альтер
нативу для OpenLDAP, но среди его явных преимуществ все же стоит выделить более
совершенную документацию. Проект 389 Directory Server поставляется с инструкциями
профессионального уровня по администрированию и использованию, включая подроб
ные руководства по инсталляции и внедрению.
Глава 17. система единого входа 601
Создание LDАР-запросов
Для администрирования LDAP вам не обойтись без просмотра содержимого базы
данных и управления им. Для этого вам очень пригодится упомянутый выше свободно
распространяемый пакет phpLDAPadmin, который предоставляет удобный интерфейс,
работающий по принципу "указал и щелкнул". Помимо phpLDAPadmin, можно ис
пользовать утилиту ldapsearch (распространяемую с OpenLDAP и 389 Directory Server),
которая предназначена для поиска информации в службе каталога и является анало
гичным инструментом командной строки, генерирующим результат в формате LDIF.
Утилита ldapsearch особенно полезна для вызова из сценариев, а также для сред ог
ладки, в которых служба Active Directory действует в качестве сервера
LDAP.
В следующем примере запроса используется утилита ldapsearch для просмотра
информации о каталогах тех пользователей, у которых обычное имя сп (common name)
начинается с "ned". В данном случае найден только один результат, соответствующий
такому запросу. Назначения используемых :щесь флагов рассматриваются ниже.
$ ldapsearch -h atlantic.atrust.com -р 389
-х -D "cn=trent,cn=users,dc=boulder,dc=atrust,dc=com" -W
-Ь "cn=users,dc=Ьoulder,dc=atrust,DC=com" "cn=ned*"
# LDAPvЗ
# base <cn=users,dc=boulder,dc=atrust,dc=com> with scope sub
# filter: cn=ned*
# requesting: ALL
#
# ned, Users, boulder.atrust.com
dn: cn=ned,cn=Users,dc=boulder,dc=atrust,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: ned
602 Часть 11. Работа в сетях
sn: McClain
telephoneNumber: 303 245 4505
givenName: Ned
distinguishedName: cn=ned,cn=Users,dc=boulder,dc=atrust,dc=com
displayName: Ned McClain
memЬerOf: cn=Users,cn=Builtin,dc=boulder,dc=atrust,dc=com
memЬerOf: cn=Enterprise Admins,cn=Users,dc=boulder,dc=atrust,dc=com
name: ned
sAМAccountName: ned
userPrincipalName: ned@boulder.atrust.com
lastLogonTimestamp: 129086952498943974
mail: ned@atrust.com
Флаги -h и -р команды ldapsearch позволяют указать в запросе хост и порт серве
ра LDAP соответственно.
Обычно вам потребуется аутентифицировать себя на сервере LDAP. В этом случае ис
пользуются специальные флаги. Флаг -х запрашивает простую аутентификацию (в отли
чие от SASL). Флаг -D идентифицирует отличительное имя учетной записи пользователя,
который имеет права доступа, необходимые для выполнения запроса. Наконец, флаг -w
предписывает утилите ldapsearoh предложить вам ввести соответствующий пароль.
Флаг -Ь указывает утилите ldapsearch, где именно в иерархии LDAP начать поиск.
Этот параметр известен как baseDN (отсюда и имя флага "Ь"). По умолчанию утили
та ldapsearch возвращает все соответствующие критерию поиска строки, найденные
ниже базовой точки дерева baseDN, т.е. поиск будет выполняться только в дочерних эле
ментах базы поиска (включая ее саму). Уточнить характер такого поиска можно с по
мощью флага -s.
Последний аргумент представляет собой "фильтр", который описывает объект ва
шего поиска. Он не требует использования флагов. Этот фильтр, cn=ned*, обеспечи
вает возвращение всех строк LDAP, "обычное имя" которых начинается с "ned". Этот
фильтр заключается в кавычки ("cn=ned*"), чтобы специальные символы универсали
зации в строке поиска (в данном случае это "звездочка") не были восприняты системой
как управляющие символы командной оболочки.
Если вы хотите извлечь все записи ниже заданной базы baseDN, просто используйте
в качестве фильтра поиска выражение objectClass=* - или же опустите фильтр во
обще, поскольку такой характер поиска действует по умолчанию.
Любые аргументы, которые указаны за фильтром, обеспечивают выбор конкретных
атрибутов для возвращаемого результата. Например, если бы вы добавили в конец при
веденной выше командной строки аргумент mail givenName, утилита ldapsearch воз
вратила бы только эти атрибуты отфильтрованных записей.
Система Kerberos
Kerberos - это система аутентификации на основе мандатов, использующая крип
тографию с симметричным ключом. Его популярность в последнее время была обеспе
чена прежде всего компанией Microsoft, которая использует ее как часть системы ау
тентификации в службе Active Directory и операционной системе Windows. В контексте
SSO мы описываем, как интегрироваться со средой Active Directory Kerberos в системах
Linux и FreeBSD. Если вы используете LDAP-cepвep, отличный от Active Directory, или
если вы хотите пройти аутентификацию в службе Active Directory с помощью LDAP, а не
Kerberos, вы можете сразу перейти к обсуждению демона sssd.
W Дополнительную информацию о системе Kerberos см. в разделе 27.6.
Например, если ваше доменное имя Active Directory - ULSAH.COM, а учетная за
пись Active Directory под именем trent имеет право на присоединение системы к до
мену, вы можете использовать следующую команду мя присоединения вашей системы
к домену.
Во-первых, дважды проверьте, что полное доменное имя системы включено в файл
/etc/hosts, а протокол NTP настроен и работает. Затем отредактируйте файл krbS.
conf, чтобы добавить область, как показано в следующем примере. Замените имя до
мена Active Diгectory вашего сайта для ULSAH.COM.
[logging]
default = FILE:/var/log/krb5.log
[libdefaul ts]
clockskew = 300
default realrn = ULSAH.COM
kdc_tirnesync = 1
ccache_type = 4
forwardaЫe = true
proxiaЫe true
[realrns]
ULSAH.COM
kdc = dc.ulsah.corn
adrnin server = dc.ulsah.corn
default dornain = ULSAH
[dornain_realrn]
.ulsah.corn = ULSAH.COM
ulsah.corn = ULSAH.COM
В приведенном выше примере интерес представляют несколько значений.
Пятиминутное рассогласование часов разрешено, даже если время установлено с по
мощью протокола NTP. Эта свобода позволяет системе работать даже в случае проблем
с протоколом NTP. Область по умолчанию установлена в домене Active Diгectory, а центр
распределения ключей (или КОС) настроен как контроллер домена Active Diгectory. Для
отладки может пригодиться файл krb5. log.
Запросите мандат из контроллера Active Diгectory, запустив команду kini t. Укажите
действительную учетную запись пользователя домена. Аккаунт administrator обычно
является хорошим тестом, но подойдет и любая учетная запись. При появлении запроса
введите пароль домена.
$ kinit administrator@ULSAН.COМ
Password for adrninistrator@ULSAH.COM: <password>
Используйте команду klist, чтобы показать мандат КегЬегоs.
$ klist
Ticket cache: FILE:/trnp/krb5cc_l000
Default principal: adrninistrator@ULSAH.COM
[sssd]
services = nss, pam
domains = ULSAH.COM
[domain/ULSAH.COM]
id_provider = ad
access_provider = ad
Если вы используете сервер LDAP, не задействующий службу Active Directory, то ваш
файл sssd. conf может выглядеть примерно так:
[sssd]
services = nss, pam
domains = LDAP
Глава 17. Система единого входа 607
[domain/LDAP]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://ldap.ulsah.com
ldap_user_search_base = dc=ulsah,dc=com
tls_reqcert = demand
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
По очевидным причинам безопасности демон sssd не разрешает аутентификацию
по незашифрованному каналу, поэтому требуется использование LDAPS/ТLS. Установка
атрибута tls_reqcert для запроса в приведенном выше примере застамяет демон sssd
дополнительно проверять сертификат сервера. Демон sssd отключает соединение, если
обнаруживается, что сертификат недостаточен.
Когда демон sssd запущен и работает, вы должны сообщить системе, чтобы
она использовала его в качестве источника для идентификации и аутентификации.
Следующим шагом в этом процессе является настройка ключа службы имен и настрой
ка РАМ.
bwhaley:x:l0006:10018::/home/bwhaley:/Ыn/sh
guest:*:lOOOl:lOOOl:Guest:/home/ULSAH/guest:/Ыn/bash
ben:*:l0002:10000:Ben Whaley:/home/ULSAН/ben:/Ыn/bash
krbtgt:*:lOOOЗ:lOOOO:krbtgt:/home/ULSAH/krbtgt:/Ыn/bash
Остановка Остановка
Флаг Комментарии
в случае ошибки в случае успеха
Если бы модуль РАМ мог просто возвращать код ошибки, как только первый модуль
в стеке потерпит неудачу, то система этих флагов бьша бы проще. К сожалению, систе
ма разработана так, что большинство модулей имеет шанс на выполнение независимо
от успеха или сбоя других модулей, находящихся с ними на одном и том же уровне, и этот
факт имеет определенные тонкости, связанные с потоком управления. (Это бьшо сделано
для того, чтобы хакеры не могли понять, какие модули РАМ в стеке вызывают отказ.)
Модули required должны следовать один за другим; отказ одного из них гаранти
рует, что весь стек со временем даст сбой. Однако отказ модуля, помеченного флагом
required, не приводит к немедленному сбою стека. Если вы хотите, чтобы сбой насту
пал моментально, вместо флага required используйте флаг requisite.
Успех модуля типа sufficient немедленно прекращает работу стека. Однако окон
чательный результат работы стека не обязательно должен быть успешным, поскольку
модуль типа sufficient не может компенсировать ошибку выполненного ранее мо
дуля типа required. Если ранее выполненный модуль типа required выдал ошибку,
успешно выполненный модуль типа sufficient прекращает работу стека и возвращает
ошибку в качестве итогового результата.
Прежде чем изменять параметры безопасности системы, еще раз убедитесь, что вы
понимаете, что делаете. (Вы можете настраивать модули РАМ хоть каждый день, но как
долго вы способны помнить, какая версия указана в атрибуте requ i s i te, а какая -
в атрибуте required?)
гие десятилетия появилось много других подходов. Два старых варианта, служба N IS
и утилита rsync, все еще используются в отдельных изолированных пакетах.
17 .5. ЛИТЕРАТУРА
В качестве общего введения в систему LDAP мы можем порекомендовать непло
хой "хрестоматийный учебник" LDAP for Rocket Scientists, который содержит описание
архитектуры и протоколаLDAP. Эта книга опубликована в электронном виде на сайте
zytrax. com/books/ldap. Кроме тоrо, существует множество разнообразных докумен-
612 Часть 11. Работа в сетях
тов RFC, посвященных протоколу LDAP, каждый из которых является довольно слож
ным. Наиболее важные документы перечислены в табл. 17.3.
Таблица 17.3. Документы RFC, посвященные протоколу LDAP
RFC Название
2307 An Approach for Using LDAP as а Network lnformation Service
2820 Access Control Requirements for LDAP
2849 LDAP Data lnterchange Format (LDIF) - Technical Specification
3112 LDAP Authentication Password Schema
3672 Subentries in the Lightweight Directory Access Protocol (LDAP)
4511 LDAP: The Protocol
4512 LDAP: Directory lnformation Models
4513 LDAP: Authentication Methods and Security Mechanisms
4514 LDAP: String Representation of Distinguished Names
4515 LDAP: String Representation of Search Filters
4516 LDAP: Uniform Resource Locator
4517 LDAP: Syntaxes and Matching Rules
4519 LDAP: Schema for User Applications
• Пользовательский агент (Mail User Agent- MUA, или UA), который дает пользова
телям возможность читать и составлять сообщения.
'Шутка!
614 Часть 11. Работа в сетях
UA МТА МТА DA
Тhunderblrd sendmail sendmail local
Exim Exim mail.local
UA MS Exchange MS Exchange (nорт25)
......
UA
Хранилище
macOSMail MSA сообщений
,"
(nорт587)
.......
UA :i::.
Alpine АА АА
UA - пользовательский
UA
/Ьin/mail
Cyrus
.
МТд - транспортный локальным попыовательским
агент
аzентам
DA- агент доставки
АА - агент доступа
Пользовательские агенты
Пользовательский агент (иногда говорят "клиент электронной nочты " ) nрименяет
ся для чтения и составления электронных сообщений. Первоначально сообщения мог
ли содержать только простой текст, однако благодаря стандарту MIME (Multipurpose
lnternet Mail Extensions - многоцелевые расширения электронной почты в сети
Интернет) nоявилась возможность включать в них <tюрматированный текст и присоеди
нять разные файлы (в том числе вирусы). Ста ндарт MIME лоддерживается большин
ством лользовательских агентов . Поскольку он н е влияет на процесс адресации и до
ставки nочты, мы не будем его рассматривать.
Самым первым пользовательским агентом была утилита /Ьin/mail, которая и сей
час остается удобным инструментом для чтения текстовых сообщений . Поскольку элек
тронная почта в Интернете давно вышла за пределы "текстовой эры", пользовательские
агенты , ориентированные на текст, для большинства пользователей являются непрак -
Агенты передачи
Агенты MSA - последнее новшество в пантеоне электронной почты - были изобре
тены для того, чтобы разгрузить агентов МТА от некоторых задач. Агенты MSA облег
чают серверам-концентраторам задачу различения входящих и исходящих сообщений
(например, для принятия решения об ответе) и обеспечивают пользовательским агентам
единообразную и простую конфигурацию исходящей почты.
Агент MSA напоминает секретаря, который ведет прием новых сообщений и внедрен
в систему локальными пользовательскими агентами. Агент MSA располагается между
пользовательским и транспортным агентами и выполняет несколько функций, которые
ранее относились к компетенции агента МТА. Агент MSA реализует безопасную (зашиф
рованную и аутентифицированную) связь с пользовательскими агентами и часто немного
изменяет заrоловки и удаляет входящие сообщения. Во многих ситуациях агент MSA про
сто прослушивает агентов МТА на разных портах, применяя разные конфигурации.
Агенты MSA используют тот же протокол передачи почты, что и агенты МТА, поэто
му с точки зрения пользовательских агентов они выглядят как агенты МТА. Однако они
обычно прослушивают соединение на порту 587, а не 25, который является стандарт
ным для агентов МТА. При такой схеме работы пользовательские агенты должны соеди
няться с портом 587, а не 25. Если ваш пользовательский агент не может использовать
порт 587, вы можете запустить агент MSA на порту 25, но в системе, которая отличается
от системы, в которой бьт запущен агент МТА; в каЖдый момент времени конкретный
порт может прослушивать только один процесс.
в "черный список".
Транспортные агенты
Задача транспортного агента - принимать почту от пользовательского агента или
агента передачи, интерпретировать адреса получателей и перенаправлять почту на соот
ветствующие почтовые серверы для последующей доставки. Транспортные агенты рабо
тают по протоколу SMTP (Simple Mail Traпsport Protocol - простой протокол передачи
616 Часть 11. Работа в сетях
электронной почты), который вначале был определен в документе RFC82l, а затем до
полнен в документе RFC532 l. Расширенная версия этого протокола называется ESMTP
(Extended SMTP).
Список заданий транспортных агентов как отправителя, так и получателя содержит
следующие пункты.
Хранилища сообщений
Хранилище сообщений - пункт назначения, находящийся в конце долгого пути, кото
рый сообщение электронной почты проходит по Интернету от отправителя к получателю.
Почта обычно хранится в формате mЬох или Maildir. В первом случае вся почта
хранится в одном файле, как правило, /vаr/mаil/имя_пользователя, а индивидуаль
ные сообщения отделяются специальной строкой Fro111. Во втором варианте каждое со
общение хранится в отдельном файле. Хранить сообщения в отдельных файлах намного
удобнее, но при этом в каталоге находится очень много маленьких файлов; некоторые
файловые системы этого не одобряют.
Эти простые файлы до сих пор используются в качестве хранилищ сообщений, но
интернет-провайдеры, имеющие тысячи и миллионы клиентов электронной почты,
ищут другие технологии для реализации своих хранилищ, как правило, на основе баз
данных. К сожалению, это приводит к тому, что хранилища сообщений становятся все
более сложными.
Агенты доступа
Для доступа к хранилищам и загрузки сообщений электронной почты на локальное
устройство (рабочую станцию, ноутбук, телефон и т.п.) используются два протокола:
lntemet Message Access Protocol версии 4 (IMAP4) и Post Office Ptorocol версии З (РОРЗ).
Глава 18. Электронная почта 617
• Конверт
• Заголовки
• Тело
Конверт определяет, куда должно быть доставлено сообщение или куда его требуется
возвратить в случае, если доставка невозможна. Обычно конверт невидим для пользова
теля и не является частью самого сообщения; он используется транспортным агентом.
Если отправителем и получателем являются обычные люди, то адреса конверта
обычно согласованы со строками From и То заголовка. Если же сообщение направлено
списку рассылки или было сгенерировано спамером, пытающимся подделать идентич
ность отправителя, то конверт и заголовки могут быть не согласованы друг с другом.
Заголовки - это набор пар "свойство-значение", отформатированных в соответ
ствии с документом RFC5322. В них содержится различная информация о сообщении,
включая дату и время его отправки, а также сведения о транспортных агентах, через ко
торые оно прошло на своем пути. Заголовки являются неотъемлемой частью сообще
ния, но пользовательские агенты часто скрывают некоторые менее интересные заголов
3 8 память об Эви, которая была автором этого раздела, данный исторический пример приводится
без изменений.
618 Часть 11. Работа в сетях
Для того чтобы прочитать эту тарабарщину, начнем со строк Received, но в направ
лении снизу вверх (т.е. со стороны отправителя). Это сообщение пришло с домашнего
компьютера Дэвида Швайкерта (David Schweikert), находящегося в домене schweikert.
ch, на его почтовый сервер (тail. schweikert. ch), где оно прошло сканирование
на вирусы. Затем оно было переслано получателю по адресу evi@atrust. сот. Однако
получатель тail-relay. atrust. сот послал его по адресу sailingevi@gтail. сот, где
находился почтовый ящик Эви.
Delivered-To: sailingevi@gmail.com
Received: Ьу 10.231.39.205 with SMTP id ... ; Fri, 19 Oct 2009 08:59:32
-0700 ...
Received: Ьу 10.231.5.143 with SMTP id... ; Fri, 19 Oct 2009 08:59:31
-0700 ...
Return-Path: <smotheringl39@sherman.dp.ua>
Received: from mail-relay.atrust.com (mail-relay.atrust.com
(63.173.189.2]) ...
Received-SPF: neutral (google.com: 63.173.189.2 is neither
permitted nor denied Ьу best guess record for domain of
smotheringl39@sherman.dp.ua) client-ip=63.173.189.2;
Authentication-Results: mx.google.com; spf=neutral (google.
com: 63.173.189.2 is neither permitted nor denied Ьу best
guess record for domain of smotheringl39@sherman.dp.ua)
smtp.mail=smotheringl39@sherman.dp.ua
Received: from SpeedTouch.lan (187-10-167-249.dsl.telesp.net.br
(187 .10.167 .249] (may Ье forged)) Ьу mail-relay.atrust.com ...
Received: from 187.10.167.249 Ьу relay2.trifle.net; Fri, 19 Oct 2009
13: 59: ...
From: "alert@atrust.com" <alert@atrust.com>
То: <ned@atrust.com>
Subject: А new settings file for the ned@atrust.com mailbox
Date: Fri, 19 Oct 2009 13:59:12 -0300 _
В соответствии с заголовком From, отправителем этого сообщения является почто
вый ящик alert@atrust.com. Однако заголовок Return-Path, содержащий копию
конверта отправителя, свидетельствует о том, что источником сообщения является поч
товый ящик smotheringl39@sherman. dp. ua, адрес которого указывает на Украину.
Первый транспортный агент, обработавший сообщение, имеет IР-адрес 187.10.167.249
и находится в Бразилии. Хитрые спамеры ... 4
Проверка по технологии SPF, которую выполнил сервер Google, снова завершилась
провалом, но на этот раз с "нейтральным" результатом, потому что домен sherтan.
dp. ua не имеет записи SPF, с которой можно бьmо бы сравнить IР-адрес сервера mail-
relay. atrust. сот.
Информация о получателе также не совсем правдива. Заголовок то указывает, что
сообщение направлено по адресу ned@atrust. сот. Однако мятого, чтобы сообщение
было направлено по адресу sailingevi@gmail.com, среди адресов получателя на кон
верте должен находиться адрес evi@atrust.com.
4 Следует отметить, что многие строки заголовка, включая строки Received, мoryr оказаться под
дельными. С этими данными необходимо быть крайне осторожными.
620 Часть 11. Работа в сетях
хорошо в нем разбираться. Его язык имеет всего несколько команд; самые важные пере
числены в табл. 18.1.
Таблица 18.1. Команды протокола SMTP
Команда Функция
Аутентификация SMTP
Документ RFC4954 определяет расширение исходного протокола SMTP, позволяю
щее SМТР-клиенту идентифицировать себя и проходить аутентификацию у почтового
сервера. После этого сервер может позволить клиенту использовать себя для пересылки
почты. Этот протокол поддерживает несколько механизмов аутентификации. Обмен ин
формацией состоит из следующих этапов.
Для того чтобы узнать, какой механизм аутентификации поддерживает сервер, мож
но применить утилиту telnet к порту 25 и выполнить команду EHLO. Например, ниже
приведен усеченный вариант обмена сообщениями с почтовым сервером mail-relay.
atrust. сот (команды набраны полужирным шрифтом).
$ telnet mail-relay.atrust.com 25
Trying 192.168.2.1 ...
Connected to mail-relay.atrust.com.
Escape character is 1 л] '.
220 mail-relay.atrust.com ESMTP АТ Mail Service 28.1.2/28.1.2; Mon, 12
Sep 2016 18:05:55 -0600
ehlo booklaЬ.atrust.com
250-mail-relay.atrust.com Hello [192.168.22.35], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
В данном случае почтовый сервер поддерживает механизмы аутентификации LOGIN
и PLAIN. Серверы sendmail, Exim и PostflX поддерживают аутентификацию SMTP; де
тали их конфигураций описаны в разделах 18.8, 18.9 и 18.10.
В любом случае, посоветуйте своим пользователям просто удалять спам, который они
получают. Многие сообщения, являющиеся спамом, содержат инструкции о том, как уда
лить свой адрес из списка рассылки. Если последовать этим инструкциям, спамеры мо
гут действительно удалить ваш адрес из текущего списка, но они немедленно добавят его
в несколько других списков с аннотацией "доставлено реальному человеку, прочитавшему
это сообщение". С этого момента ваш электронный адрес будет стоить еще дороже.
Подделки
Подделать электронное письмо очень просто; многие пользовательские агенты по
зволяют заполнять поле адреса отправителя чем угодно. Транспортные агенты могут ис
пользовать аутентификацию по протоколу SMTP между локальными серверами, но они
не могут этого сделать в масштабе всего Интернета. Некоторые транспортные агенты
добавляют предупреждающие заголовки в исходящие локальные сообщения, которые
могут быть подделаны.
В электронном сообщении личность любого отправителя может быть фальсифицирова
на. Будьте очень осторожны, если в вашей организации электронные сообщения исполь
зуются в качестве средства авторизации, например, ключей от дверей, карточек доступа
и денег. Вы должны предупредить об этом администраторов и полагаться на то, что они про
сматривают подозрительные письма, поступающие от авторитетных отправителей, и про
веряют корректность сообщений. Следует быть еще более осторожным, если в сообщении
премагается предоставить необычной персоне непропорциональные привилегии.
Системы DКIM
DКIM (DomainKeys ldentified Mail - почта, идентифицированная доменными клю
чами) - это система криптографических подписей для сообщений электронной почты.
Она позволяет получателю верифицировать не только личность отправителя, но и тот
факт, что сообщение не бьmо подделано по пути. Система использует DNS-записи
для публикации доменных криптографических ключей и правил подписи сообщений.
Система DKIM поддерживается всеми транспортными агентами, описанными в этой
главе, но на практике встречается крайне редко.
5 "Эксперт по компьютерной безопасности" Дональд Дж. Трамп как-то сказал: "Я не верю в это
[в электронную почту], потому что, по-моему, во-первых, ее можно взломать. Но если я все же
отправлю электронное письмо - если я вообще отправлю его когда-нибудь, - то сделаю это в по
рядке исключения. Я просто не верю в электронную почту". Мудрые слова.
6 Кстати, если вы используете системы PGP/GPG и S/MIME, то вы можете повысить степень без
опасности, часто меняя открытый ключ или сертификат.
Глава 18. Электронная почта 625
шем центре обработки данных, либо облачные службы (такие как Zix, z ixcorp. сот),
которые могут быть сконфигурированы для шифрования исходящих сообщений в со
ответствии с их содержимым или другими правилами. Централизованное шифрование
электронной почты - это одна категория услуг, для которой лучше всего использовать
коммерческое решение, а не изобретать свои собственные.
По крайней мере в области электронной почты системы предотвращения потери
данных (data loss prevention - DLP) тесно связаны с централизованным шифрованием.
DLР-системы стремятся предотвратить или как минимум обнаружить утечку конфиден
циальной информации в потоке электронной почты, исходящей из вашей организацию.
Они сканируют исходящую электронную почту в поисках потенциально секретного со
держания. Подозрительные сообщения могут быть помечены, заблокированы или воз
вращены отправителям. Мы рекомендуем выбрать централизованную платформу шиф
рования, включающую возможности DLP, - одной проблемой будет меньше.
В дополнение к шифрованию транспорта между транспортными агентами важно
обеспечить, чтобы связь между пользователем и агентом-получателем всегда была за
шифрована, особенно потому, что этот канал обычно использует определенные формы
учетных данных пользователя для установления связи. Убедитесь, что агентами доступа
разрешены только безопасные версии протоколов IMAP и РОР, поддерживающие техно
логию TLS. (Они известны как IMAPS и РОРЗS соответственно.)
С точки зрения почтовой системы файл alises заменяет файл /etc/passwd, по
этому запись
david: david@sornewhere-else.edu
не позволит локальному пользователю david вообще получать сообщения электрон
ной почты. Следовательно, при выборе новых имен для пользователей администраторы
и инструменты adduser должны проверять как файл passwd, так и файл aliases.
Файл aliases всегда должен содержать псевдоним postrnaster, перенаправляющий
сообщение тому, кто обслуживает почтовую систему. Аналогично псевдоним aьuse под
ходит для ситуаций, когда кто-то извне вашей организации хочет прислать вам жалобу
по поводу спама или любых других подозрительных действий, проистекающих из вашей
сети. Кроме того, в файле должен присутствовать псевдоним для автоматических сооб
щений от транспортного агента; обычно этот агент называется Mailer-Daemon и часто
имеет псевдоним postmaster.
К сожалению, в настоящее время в почтовой системе происходит столько злоупотре
блений, что некоторые организации настраивают эти стандартные контактные адреса
так, чтобы отбрасывать почту вообще, вместо ее пересылки индивидуальным пользова
телям. Записи вроде
# Basic systern aliases - these MUST Ье present
rnailer-daernon: postrnaster
postmaster: "/dev/null"
стали обычными. Мы не рекомендуем эту практику, поскольку люди, испытывающие
проблемы с пересылкой почты в вашу организацию, будут сообщать об этом админи
стратору почтового сервера.
Учетные записи Ьin, sys, daemon, nobody и hostmaster (а также любые другие учет
ные записи псевдопользователей) должны иметь похожие псевдонимы.
Помимо списков пользователей, псевдонимы могут ссылаться на следующие файлы
и программы.
Глава 18. Электронная почта 627
'Мы не придерживались последовательной терминологии в этой главе, иногда называя возврат со
общения "рикошетом", а иногда "ошибкой". На самом деле мы имеем в виду, что в этом случае
генерируется уведомление о состоянии доставки (DSN, представляющее собой сообщение, форма
тированное специальным образом). Такое уведомление обычно означает, что сообщение не бьmо
доставлено и. следовательно, возвращается отправителю.
628 Часть 11. Работа в сетях
cron-status: /usr/local/admin/cron-status-messages
Возможность посылать почту в файл или на вход программы очень полезна, но она
ослабляет безопасность и потому должна быть ограничена. Приведенный синтаксис до
пустим только в файле aliases и пользовательском файле . forward (а также в файлах,
которые внедряются в них посредством директивы : incl ude: ). Имя файла не трактует
ся как адрес, поэтому почта, направленная по адресу /etc/passwd@host. domain, будет
возвращена.
autoftp: "l/usr/local/bin/autologger"
Однако использование такого способа доставки почты создает еще более серьезные
бреши в защите, чем направление почты в файл, поэтому данный механизм тоже раз
решен только для файлов aliases и . forward, а также для файлов, которые подключа
ются к ним посредством директивы : incl ude:, и часто требует использования ограни
ченной оболочки (restricted shell).
• Обеспечение безопасности.
• Отладка.
Для того чтобы найти файлы программы sendmail в своей системе, посмотрите
в начало инсталлированного файла /etc/mail/sendmail. cf. Комментарии, которые
там находятся, содержат имя каталога, в котором была собрана данная конфигур'1;ция.
Этот каталог, в свою очередь, приведет вас к файлу .mc, являющемуся исходным источ
ником конфигурации.
Большинство поставщиков программы sendmail включают в дистрибутивный пакет
не только исполняемый модуль, но и каталог cf из дистрибутивного дерева, который
они прячут среди файлов операционной системы. Найти его поможет табл. 18.4.
Ubuntu /usr/share/sendmail
DeЬian /usr/share/sendmail
Red Hat /etc/mail
CentOS /etc/mail
FreeBSD /etc/mail
Файл переключения
m Переключение служб более подробно описано в разделе 17.3.
В большинстве систем существует конфигурационный файл "переключения
служб" / etc/nsswi tch. conf, в котором перечисляются методы. удовлетворяющие
разным стандартным запросам, например запросам поиска пользователя и компью
тера. Если для данного типа запросов в файле указано несколько методов распоз
навания, то файл переключения служб также определит порядок, в котором будут
проверяться эти методы.
Таблица 18.5. Флаги командной строки для основных режимов работы программы sendmail
Флаг Описание
-Ьа Функционирует в режиме ARPANET (ожидает управляющих символов CR/LF в конце строки)
-Ьd Функционирует в режиме демона и прослушивает соединения на порту 25
-ЬD Функционирует в режиме демона, но явно, а не в фоновом режиме•
-Ьs Устанавливает режим сервера SMTP (для стандартного входа, но не для порта 25)
-Ьt Устанавливает режим проверки адреса
-Ьv Только проверяет почтовые адреса; не посылает почту
Почтовые очереди
Программа sendmail использует по крайней мере две очереди: /var / spool/
mqueue, когда функционирует как транспортный агент на порту 25, и /var/spool/
clientmqueue, когда функционирует как агент доставки на порту 587. 11 Все сообще
ния, как минимум на короткое время оказываются в очереди, прежде чем отправиться
в дальнейший путь.
Сообщения, находящиеся в очереди, сохраняются в виде фрагментов в разных фай
лах. Каждое имя файла имеет двухбуквенный префикс, идентифицирующий фрагмент,
за ним следует случайный идентификатор, построенный на основе идентификатора
процесса в программе sendmail. Шесть возможных фрагментов приведены в табл. 18.6.
Таблица 18.6. Префиксы АЛЯ файлов из очереди
Препроцессор m4
Изначально предназначенный для использования в сочетании с языками программи
рования, препроцессор m4 позволяет пользователям писать более удобочитаемые (или,
наоборот, запуганные) программы. Это достаточно мощный инструмент, чтобы ока
заться полезным во многих ситуациях, связанных с преобразованием входной инфор
мации, он прекрасно работает с конфигурационными файлами программы sendmail.
Макрос препроцессора
m4 имеет следующую форму.
name(argl, arg2, _, argn)
Между именем и открывающей скобкой не должно быть пробелов. Левая и правая
одинарные кавычки обозначают строки в качестве аргументов. Соглашения о кавычках
в макросах препроцессора m4 являются странными, поскольку левая и правая кавыч
ки - разные символы. Кроме того, кавычки могут быть вложенными.
Препроцессор m4 имеет несколько встроенных макросов, и пользователи могут
определять свои собственные макросы. Основные встроенные макросы, используемые
в конфигурации программы eendmail, приведены в табл. 18.7.
Глава 18. электронная почта 635
mailer Файлы m4, описывающие основные программы для рассылки (агенты доставки)
создавать новые. Скопируйте тот из них, который лучше соответствует вашей системе,
и присвойте ему новое имя.
Каталог of/feature - это место, где вы будете искать все фрагменты конфигура
ции, которые вам нужны. Там найдутся все функциональные возможности, которые мо
гут оказаться полезными для сайта, использующего программу sendmail.
Остальные подкаталоги каталога of служат, скорее, как заглушки. Их не надо иссле
довать или анализировать - просто используйте их.
DOМAIN
FEATURE
определения локальных макросов
МAILER
Даже имея простую систему конфигурации m4 для программы sendmail, вам, воз
можно, придется принимать несколько разных решений, связанных с конфигурацией
вашего почтового сервера. Читая о функциональных возможностях, описанных ниже,
подумайте о том, как их применять к вашей сети. Небольшая сеть, вероятно, будет иметь
один концентратор и концевые хосты, а значит, только два варианта файла конфигура
ции. В более крупной сети могут понадобиться отдельные концентраторы для входящей
и исходящей почты и, вероятно, отдельный сервер POP/IMAP.
Независимо от сложности вашей сети и ее подключения ко внешнему миру (откры
той, за брандмауэром или виртуальной частной сети, например), скорее всего, вы найде
те в каталоге cf готовые фрагменты, подходящие для настройки и использования.
из текстового файла следует использовать команду makemap, задав тип и имя выходного
файла базы данных. Текстовая версия базы данных должна передаваться на стандартный
вход команды makemap. Рассмотрим пример.
Макрос OSTYPE
Файл OSTYPE содержит разнообразную информацию от производителей, например
ожидаемое местонахождение файлов, связанных с почтовой системой, пути к командам,
которые необходимы для программы sendmail, флаги для программ рассылки и т.д.
Список всех переменных, которые можно определить в файле OSTYPE, перечислены
в файле cf/READМE. 12
Макрос DOМAIN
Директива DOМAIN позволяет указывать всю общую информацию о сайте в одном ме
сте (сf/dоmаin/имя_файла .m4), а затем включать в каждый конфигурационный файл
компьютера.
DOМAIN ( 'имя_файла')
Макрос МAILER
Этот макрос следует включать в каждый агент доставки, который вы хотите исполь
зовать. Полный список программ рассылки можно найти в каталоге cf/mailers, но
обычно необходимы только local, smtp и, возможно, cyrus. Строки, содержащие мак
рос МAILER, обычно являются последними в файле .mc.
Макрос FEAТURE
Рассматриваемый макрос позволяет реализовать большое количество сценариев (по
последним данным, 56!), включая файлы препроцессора m4 из каталога feature. Его
синтаксическая конструкция выглядит следующим образом.
Клиентская машина на самом деле не нуждается в этой возможности, если у нее есть
псевдоним. Файл local-host-names должен содержать имена всех локальных хостов
12 Так где же все-таки определен макрос OSTYPE? В одном из файлов в каталоге cf/m4, который та
инственным образом добавляется к вашему конфигурационному ф11йлу при запуске сценария Build.
640 Часть 11. Работа в сетях
Если Джо Смит окончил университет oldsi te. edu (регистрационное имя smi thj)
и перешел в организацию newsi te. com (регистрационное имя j ое), то, включив функ
циональную возможность redirect с помощью примитива
FEATURE ( 'redirect' )
и добавив строку
smithj: joe@newsite.com.REDIRECT
в файл на сайте olds i te. edu, вы сможете возвращать почту, адресованную поль
aliases
зователю smi th j, отправителю вместе с сообщением об ошибке, в котором указан новый
адрес получателя joe@newsite.com. Само письмо автоматически не перенаправляется.
localhost RELAY
127.0.0.1 RELAY
192 .168. 1. 1 RELAY
192.168.1.17 RELAY
66. 77. 123 .1 ок
fax.com ок
61 ERROR:"550 We don't accept mail from spammers"
67.106.63 ERROR:"550 We don't accept mail from spammers"
@appliedtrust.com %1@atrust.com
unix@book.admin.com sa-book-authors@atrust.com
linux@book.admin.com sa-book-authors@atrust.com
webmaster@example.com billy.q.zakowski@colorado.edu
info@testdomain.net ausername@hotmail.com
Все ключи в левой части отображения данных должны быть перечислены в файле cw,
т.е. /etc/шail/local-host-naшes, или находиться в списке VIRTUSER_DOMAIN. Если
это условие не выполняется, то программа sendJllail не сможет принять локальную по
чту и попытается найти адресата в Интернете. Однако записи DNS мх вернут программу
sendJllail назад на тот же самый сервер, и в результате рикошета вы получите сообще
ние "local configuration error" ("ошибка локальной конфигурации"). К сожале
нию, программа sendJllail не может сообщить, что это сообщение на самом деле озна
чает "ключа виртуального пользователя в файле cw нет".
Протокол LDAP использует порт 389, если вы не указали явным образом другой порт,
добавив в инструкцию define параметр -р порт_ldар.
Программа sendmail использует значения двух дескрипторов в базе данных LDAP.
• mailLocalAddress - для адресата входящей почты.
LDAPROUTE_EQUIVALENT_FILE('filename')
Кроме того, дополнительные аргументы свойства ldap _ rou ting позволяют более
подробно описать схему LDAP и точнее управлять обработкой имен адресатов, для ко
торых предусмотрен раздел +detail. Как всегда, более подробную информацию следует
искать в файле cf/READМE.
Конфигурация клиентов
Большинство ваших компьютеров необходимо конфигурировать как клиентов, же
лающих посылать исходящую почту, генерируемую пользователями, и не получать почту
FEATURE ( 'nocanonify')
FEATURE ( 'nullclient', ·mailserver')
EXPOSED_USER('root')
Здесь mailserver - имя центрального концентратора почты. Параметр nocanoni fy
сообщает программе sendmail, что она не должна выполнять поиск в системе DNS или
перезаписывать адреса с полностью определенными именами доменов. Всю эту рабо
ту будет выполнять почтовый сервер. Этот параметр похож на параметр SMART _ ноsт
и предполагает, что клиент применяет к почтовому серверу инструкцию МASQUERADE
AS. Инструкция EXPOSED _ USER исключает пользователя root из маскировки и откры
вает возможности для отладки.
644 часть 11. Работа в сетях
•точнее говоря, это максимальное количество дочерних процессов, которые можно выполнить одновременно. При
достижении предельного значения программа sendmail отказывается принимать запросы. Эта опция позволяет
предотвратить атаки типа "отказ от обслуживания".
Ретрансляция
Программа sendmail получает входящую почту, просматривает адреса конверта,
принимает решение о том, куда переслать сообщение, после чего отправляет его в со
ответствующий пункт назначения. Это может быть не только локальный получатель, но
и другой транспортный агент, расположенный далее по цепи доставки. Когда входящее
сообщение не имеет локального получателя, транспортный агент, обрабатывающий его,
играет роль ретранслятора (relay).
Только хостам, помеченным ключевым словом RELAY в базе данных доступа (см. выше),
а также хостам, перечисленным в файле /etc/mail/relay-domains, разрешается ретран
слировать почту. Впрочем, некоторые типы ретрансляции необходимы. Как определить, ка
кое сообщение следует ретранслировать, а какое - отклонить? Ретрансляция нужна лишь
в двух случаях.
• Когда транспортный агент является сервером исходящей почты для других хостов.
В этом случае имена и IР-адреса всех хостов-отправителей являются локальными
(или, по крайней мере, заданы явно).
• Когда вы согласны служить получателем для резервных записей МХ для другой орга
низации.
FEATURE('relay_entire_domain')
Если вы рассматриваете возможность разрешения ретрансляции в какой-то фор~е.
обратитесь к документации программы sendmail в файле cf'/READМE. чтобы ненаро
ком не стать подручным спамеров. Если решите включить ретрансляцию, то обратитесь
к одному из специализированных сайтов с просьбой проверить, что вы случайно не соз
дали открытую ретрансляцию, в частности можно обратиться на сайт spamhelp. org.
FEATURE('Ьlacklist_recipients')
Примитив Описание
МАХ_ RCPTS _PER _MESSAGE Откладывает доставку, если сообщение имеет слишком много получателей
greet _pause Задерживает ответ HELO, требует точного подчинения протоколу SMTP
define('confBAD_RCPT_THROTTLE', '3')
Параметр MAX _ RCPTS _ PER_ MESSAGE заставляет отправителя поставить дополнитель
ных получателей в конец очереди. Это простая форма серого списка для сообщений,
имеющих подозрительно много получателей.
Параметры ratecontrol и conncontrol позволяют установить для каждого ком
пьютера или каждой сети скорость приема входящих соединений и количество одно
временно устанавливаемых соединений соответственно. Оба параметра можно задать
в файле /etc/mail/access, чтобы указать пределы и домены, к которым они относят
ся. Первый параметр сопровождается дескриптором ClientRate: в поле ключа, авто
рой - дескриптором ClientConn:. Для того чтобы включить режим контроля скоро
сти, вставьте следующие строки в свой файл с расширением . mc. 14
FEATURE ( · ra tecontrol', · nodelay' , · terminate')
FEATURE('conncontrol', 'nodelay', 'terminate')
Затем добавьте в свой файл /etc/mail/access список компьютеров или сетей, под
лежащих контролю, а также соответствующие предельные значения. Например, строки
ClientRate:l92.l68.6.l7 2
ClientRate:l70.65.3.4 10
Владельцы файлов
Программа sendmail различает трех специальных пользователей: De f а u 1 t u s е r,
RunAsUser и TrustedUser.
По умолчанию все агенты доставки работают от имени пользователя DefaultUser,
если не установлены специальные флаги. При наличии в файле /etc/passwd учет
ной записи mailnull, sendmail или daemon именно эта запись будет соответство
вать пользователю De f а ul tU se r. В противном случае пользователю будут соответ
ствовать значения GID, равные 1. Мы рекомендуем применять учетную запись
UID и
mailnull. Добавьте ее в файл /etc/passwd со звездочкой в поле пароля, с пустым по
лем идентификатора команд, с пустым полем начального каталога и группой mailnull.
Понадобится также добавить запись mailnull в файл /etc/group. Этой учетной запи
си не должны принадлежать никакие файлы. Если программа sendmail не выполняется
с правами суперпользователя, д11я агентов доставки должен быть установлен бит setuid.
Если задан пользователь RunAsUser, программа sendmail работает от его имени, иг
норируя пользователя DefaultUser. Если программа запускается с установленным битом
setgid (идентификатор группы меняется на smmsp), то агент передачи почты (програм
ма sendmail) передает транспортному агенту (другой экземпляр sendmail) сообще
ния по протоколу SMTP. Транспортный агент sendmail не имеет установленного бита
setuid, но вызывается с правами корневого пользователя из сценариев запуска системы.
Пользователю RunAsUser соответствует значение UID, которое программа sendmail
использует после открытия сокета, подключенного к порту 25. Привилегированные пор
ты (их номера не превышают 1024) могут открываться только суперпользователем, сле
довательно, программа sendmail первоначально должна работать от имени пользовате
ля root. Тем не менее по завершении указанной операции программа может взять себе
другое значение UID. Это уменьшает вероятность возможных злоупотреблений, если
программа sendmail запускается обманным путем. Не применяйте средство RunAsUser
на компьютерах, где есть другие пользовательские учетные записи и службы; оно пред
назначено для брандмауэров и бастионных хостов. 15
По умолчанию программа не меняет идентификационную информацию и продол
жает выполняться от имени пользователя root. Если же учетная запись RunAsUser не
эквивалентна суперпользователю, придется многое изменить. Пользователю RunAsUser
должна принадлежать очередь почтовых сообщений, он должен иметь возможность читать
все хеш-файлы и файлы баз данных, запускать нужные программы и т.д. На поиск всех
файлов и каталогов, владелец которых должен быть изменен, может уйти несколько часов.
"Бастионные хосты - это специально укрепленные хосты, предназначенные ДllЯ отражения атаки
и размещенные в зоне DMZ или за пределами брандмауэра.
Глава 18. Электронная почта 651
Права доступа
Для безопасности программы sendmail большое значение имеют права доступа
к определенным файлам и каталогам. Установки, приведенные в табл. 18.12, считаются
безопасными.
Таблица 18.12. Владельцы и права доступа для каталогов, связанных с программой seпdmail
Программа sendmail больше не читает файл . forward, если число ссылок на него
больше единицы, а путь к каталогу небезопасен (права доступа ослаблены). В такую ловуш
ку однажды попалась Эви Немет, когда ее файл . forward, представляющий собой жесткую
ссьшку либо на файл . forward. to. Ьoulder, либо на файл . forward. to. sandiego, пере
стал поддерживать пересьшку почты от небольшого хоста, с которого ей иногда приходили
сообщения. Прошли месяцы, прежде чем Эви поняла, что это происходит по ее вине и фра
за "Я никогда не получала от вас почту" не ямяется оправданием.
Отключить многие ограничения на доступ к файлам можно с помощью опции
DontBlameSendmail. Но не забывайте о безопасности.
Операционная
smrsh 111&il.local sm.Ьin
система
Опции безопасности
В программе sendmail есть опции безопасности, которые определяют следующее:
'ETRN - это команда протокола ESMTP, которая используется хостами с коммутируемым доступом. Она запраши
вает обработку очереди только для сообщений данного хоста.
"в "многословном" режиме команда EXPN отслеживает переадресацию в файле . forward и выдает дополнитель
ную информацию о местонахождении пользовательской почты. Необходимо включать опцию noverb или, еще луч
ше, noexpn на любом компьютере, имеющем выход во внешний мир.
возможность хакерам очень легко одолеть службу SMTP. Опция MaxMessageSize за
щищает каталог очереди от переполнения, но если задать значение опции слишком
в базе данных доступа указывают на то, что используется механизм STARТГLS. Почта,
направляемая в домен secure. ехатрlе. сот, должна шифроваться как минимум
112-битовыми ключами. Почта, поступающая от хоста secure. ехатрlе. сот, будет
приниматься лишь в том случае, если клиент пройдет процедуру аутентификации.
Хотя протокол STARTTLS обеспечивает надежное шифрование, обратите внима
ние, что его защита охватывает только текущий сеанс связи с транспортным агентом
"следующего перехода" передачи почты. Как только сообщение поступит в следующий
переход, оно может быть перенаправлено другому транспортному агенту, который не
использует безопасный транспортный метод. Если вы контролируете все возможные
транспортные агенты на своем пути, то сможете создать безопасную почтовую транс
портную сеть. В противном случае вам придется полагаться на пакет шифрования для
конечного пользователя (например, PGP/GPG) или централизованную службу шифро
вания электронной почты (см. раздел 18.5).
Грег Шапиро и Клаус Ассманн из компании Sendmail, lnc. накопили некоторый
объем дополнительной документации (хотя и немного устаревшей), относящийся
к системе безопасности и работе программы sendmail в веб. С ней можно ознако
миться по адресам sendтail. org/-gshapiro и sendтail. org/-ca. Особенно полез
на вторая ссылка.
Мониторинг очереди
С помощью команды mailq (эквивалент команды eendJllail -Ьр) можно просма
тривать состояние сообщений, помещенных в очереди. Сообщение могут помещаться
в очередь после доставки или при неудачной попытке доставки.
Команда mailq выводит отчет о файлах в каталоге /var/epool/:mqueue в любой за
данный момент. Результат позволяет определить, почему сообщение могло быть задержа
но. Если выясняется, что в системе увеличивается поток почтовых сообщений, системный
администратор может отследить попытки программы sendmail разобрать этот завал.
По умолчанию существует две очереди: для сообщений, полученных через порт 25,
и для сообщений, полученных через порт
587 (очередь подачи для клиентов). Клиентскую
очередь можно увидеть с помощью команды mailq -Аа.
Ниже приведен типичный результат работы команды mailq. В отчете указано, что
доставки ожидают три сообщения.
656 часть 11. Работа в сетях
$ sudo mailq
/var/spool/mqueue (3 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-------
k623gYYk008732 23217 Sat Jul 1 21:42 МAILER-DAEMON
8BITMIME (Deferred: Connection refused Ьу agribusinessonline.com.)
<Nimtz@agribusinessonline.com>
k5ULkAHB032374 279 Fri Jun 30 15:46 <randy@atrust.com>
(Deferred: Name server: k2wireless.com.: host name lookup fa)
<relder@k2wireless.com>
k5UJDm72023576 2485 Fri Jun 30 13:13 МAILER-DAEMON
(reply: read error from mx4.level3.com.)
<lfinist@bbnplanet.com>
Если вы считаете, что разбираетесь в ситуации лучше, чем программа sendmail, или
просто хотите, чтобы программа sendmail попыталась немедленно повторить попытку
доставки сообщений, попавших в очередь, можете запустить повторную обработку оче
реди с помощью команды sendmail -q. Если вы используете команду sendmail -q -v,
то программа sendmail выведет результаты для каждой попытки доставки, что часто
оказывается полезным для отладки. Программа sendmail повторяет попытки доставить
сообщения в каждой очереди по истечении заданного интервала времени (как правило,
каждые 30 минут).
Журнальная регистрация
Программа sendmail регистрирует сообщения об ошибках и своем состоянии че
рез систему Syslog. Это делается от имени средства mail на уровнях от debug до cri t.
Все сообщения помечаются строкой "sendmail". Изменить эту установку можно с по
мощью флага командной строки -L, что довольно удобно, если отлаживается одна из
копий программы, в то время как остальные копии продолжают нормально работать.
о Регистрация отключена
Файл / etc/ syslog. conf определяет окончательный пункт назначения каждого сооб
щения. Местоположения, заданные по умолчанию, показаны в табл. 18.16.
Таблица 18.16. Местоположения регистрационных журналов программы seпdmail
DeЬian /var/log/mail.log
Ubuntu /var/log/mail.log
Red Hat /var/log/maillog
CentOS /var/log/maillog
FreeBSD /var/log/maillog
17 Для экспертов в компьютерных науках заметим, что этот язык является полным по Тьюрингу;
в переводе для простых смертных это значит "мощный и сложный".
662 Часть 11. Работа в сетях
. include полный-путь
.include if exists полный-путь
Первая форма генерирует ошибку, если файла нет. Несмотря на то что включение
файлов позволяет сохранять небольшой объем конфигурационного файла, за время об
работки сообщения они считываются несколько раз, поэтому лучше просто включить их
содержимое прямо в файл конфигурации.
Глобальные параметры
В разделе глобальных параметров задается множество данных, включая рабочие па
раметры (пределы, размеры, тайм-ауты, свойства почтового сервера на указанном хо
сте), определения списков (локальных хостов, локальных хостов для перенаправления,
удаленных доменов для перенаправления) и макросы (имя хоста, контакт, местоположе
ние, сообщения об ошибках, баннер SMTP).
Глава 18. электронная почта 663
Параметры
Параметры устанавливаются с помощью следующей синтаксической конструкции.
имя_параметра = значение[я]
Здесь значения могут быть булевыми или строчными, целыми или десятичными
числами, а также временными интервалами. Допускается также несколько значений,
в этом случае они разделяются двоеточиями.
Списки
Программа Exim использует четыре вида списков, которые объявляются с помощью
ключевых слов hostlist, domainlist, addresslist и localpartslist. Ниже при
ведены два примера использования ключевого слова hostlist.
Символ @ может быть членом списка; он означает имя локального хоста и помогает
написать единственный обобщенный конфигурационный файл, который будет приме
няться на всех компьютерах вашей сети. Не менее полезным является обозначение @ [ J ,
которое означает все IР-адреса, прослушиваемые программой Exim; иначе говоря, все
IР-адреса локального хоста.
Для того чтобы сослаться на список, следует просто поставить символ + перед его
именем, если хотите сравнивать его члены, или !+, если хотите сравнивать элементы, не
являющиеся членами списка; например, +my relay list. Между знаком+ и именем
списка пробела быть не должно.
Списки могут содержать ссылки на другие списки, а знак ! означает отрицание.
Списки, содержащие ссылки на переменные (например, $variaЫe_name), замедляют
обработку, потому что по умолчанию программа Exim не может кешировать результаты
сравнений по списку.
664 Часть 11. Работа в сетях
Макрос
предсказуемых результатов.
домену получателя.
ному как получатель данного сообщения. Списки управления доступом можно задать
в разделе acl в файле конфигурации, в файле, на который ссылается параметр acl
smtp _команда, или в командной строке.
Ниже приведен пример списка управления доступом my_acl check_rcpt. Его мож
но вызвать, присвоив это имя параметру acl _ smtp_ rcpt в разделе глобальных парамет
ров в файле конфигурации. Если этот список управления доступом отвергает адрес,
указанный в команде RСРТ, то сервер отправителя должен прекратить отправку сообще
ния на этот адрес. Другой параметр списка управления доступом - acl _smtp _ data -
применяется к сообщению после его получения, например д11я сканирования его содер
жимого.
begin acl
my_acl check_rcpt:
accept hosts
control dkim_disaЫe verify
Глава 18. электронная почта 665
Этому списку упрааления доступом по умолчанию назначено имя acl _ check_ rcpt;
вероятно, это имя изменять не следует. Тем не менее мы изменили его, чтобы продемон
стрировать, что оно задается вами, а не фиксируется заранее в параметрах конфигура
ции программы Exim.
Первая строка, содержащая раздел accept и одно двоеточие, предстааляет собой пу
стой список. Пустой список удаленных хостов применяется в ситуациях, когда локаль
ный пользовательский почтовый агент (MUA) подает сообщение на стандартный вход
транспортного агента. Если проверяемый адрес соответствует данному условию, список
управления доступом принимает адрес и отключает проверку подписи DKIM, которая
по умолчанию включена. Если же адрес не соответствует данному оператору address,
то управление переходит к следующему разделу в определении списка.
Следующий раздел accept проверяет хосты, для которых разрешается выполнять ре
трансляцию, т.е. локальные хосты, подающие почту в систему. Эта строка означает, что
программа exim. должна действовать как агент передачи почтовых сообщений и исправ
лять любые недостатки в заголовках при поступлении сообщений от пользовательского
агента. Адрес отправителя не проверяется, потому что многие пользовательские аген
ты сбиваются с толку ошибочными возвратами. (Это приемлемо только для локальных
машин, которые выполняют ретрансляцию на интеллектуальный хост, не во внешние
домены.) Верификация подписи DKIM отключена, поскольку эти сообщения отправля
ются вашими пользователями или их коллегами по ретрансляции.
accept authenticated = *
control = submission
control = dkim_disaЫe_verify
Последний раздел accept относится к локальным хостам, выполняющим аутенти
фикацию с помощью протокола SMTP AUTH. Эти сообщения снова обрабатываются как
передачи от пользовательских агентов.
Аутентификаторы
Аутентификаторы (authenticators) - это драйверы, взаимодействующие с последователь
ностью "вызов-ответ" команд SMTP AUTH и идентифицирующие механизм аутентифика
ции, приемлемый для клиента и сервера. Программа Exim поддерживает перечисленные
ниже механизмы.
• AUTH_CRAМ_MDS (RFC2195).
• AUTH- PLAINTEXT' включающий макросы PLAIN и LOGIN.
• AUTH_SPA, поддерживающий механизм аутентификации Secure Password
Authentication компании Microsoft.
668 Часть 11. Работа в сетях
Когда агент exim получает электронную почту, он действует как сервер SMTP AUTH.
Посылая электронную почту, он является клиентом. Параметры, появляющиеся в опре
делениях экземпляров аутентификатора, сопровождаются префиксами s е rve r или
client , позволяющими задавать разные конфигурации в зависимости от роли, кото
рую играет агент Exim.
Аутентификаторы используются в списках управления доступом, как показано в од
ном из примеров, приведенных выше.
deny !authenticated = *
Ниже приведен пример, демонстрирующий клиентский и серверный механизмы
LOG[N. В этом простом примере используются фиксированные имя пользователя и па
роль, что приемлемо для небольших организаций, но, вероятно, это не следует рекомен
довать для крупных сетей.
begin authenticators
my_client_fixed_login:
driver = plaintext
puЫic_name LOGIN
client send = : myusername mypasswd
my server_fixed_login:
driver = plaintext
puЫic_name = LOGIN
server_advertise_condition = ${if def:tis_cipher}
server_prompts = User Name : Password
server_condition = ${if and {{еq{$аuthl}{имя_пользователя}} \
{eq{$auth2}{пapoль}}}}
server_set_id = $authl
Данные для аутентификации могут поступать из многих источников: LDAP, РАМ,
/etc/passwd и т.д. Раздел server_advertise condition в указанном фрагменте кода
предотвращает открытую пересылку по линии связи паролей почтовых клиентов по тре
бованию протокола TLS (через STARТТLS или SSL). Если вы хотите, чтобы програм
ма exim действовала аналогично, будучи клиентский системой, используйте параметр
client_condition в разделе client, тоже вместе с параметром tis cipher.
Детальное описание всех возможных параметров аутентификации программы Exim
и примеры их использования можно найти в документации.
Маршрутизаторы
Маршрутизаторы обрабатывают адреса электронной почты, либо перезаписывая их,
либо переприсваивая транспортному агенту и посылая в пункт назначения. Конкретный
маршрутизатор может иметь несколько экземпляров с разными параметрами.
Флаr Смысл
accept Маршрутизатор принимает адрес и передает его драйверу транспорта
decline Маршрутизатор решает не обрабатывать адрес; следующий маршрутизатор, пожалуйста!
defer Оставляет сообщение в очереди для последующей обработки
error Обнаружена ошибка в спецификации маршрутизатора; сообщение откладывается
fail Адрес является неправильным; маршрутизатор ставит его в очередь для генерации сообще
ния о недоставке
pass Данный маршрутизатор не может обработать указанный адрес; управление передается сле
дующему маршрутизатору
кой статус оно получило у текущего маршрутизатора. Например, если ваш удаленный
SМТР-маршрутизатор выполнил предусловие domains = ! +local _ domains и устано
вил параметр no _ more, то следующему маршрутизатору в последовательности отправля
Маршрутизатор accept
Этот маршрутизатор помечает адрес как приемлемый и передает соответствующее
сообщение драйверу транспорта. Ниже приведен пример экземпляров маршрутизатора
accept с именами localusers (для доставки локальной почты) и save to file (для
отправки сообщения в архив).
localusers:
driver = accept
domains = example.com
check- local - user
transport = my_local_delivery
save to file:
driver = accept
domains = dialup.example.com
transport = batchsmtp_appendfile
Экземпляр маршрутизатора с именем localusers проверяет, совпадает ли домен
ная часть адреса доставки с именем домена example. com и является ли локальная часть
адреса регистрационным именем локального пользователя. Если оба условия выпол
нены, маршрутизатор передает сообщение экземпляру драйвера транспорта с именем
670 Часть 11. Работа в сетях
Маршрутизатор dnslookup
Как правило, маршрутизатор dnslookup используется для исходящих сообщений.
Он ищет запись МХ о домене отправителя и передает сообщение драйверу транспорта
SMTP для доставки. Ниже приведен экземпляр маршрутизатора с именем remoteusers.
remoteusers:
driver = dnslookup
domains = !+example.com
transport = my_remote_delivery
m Более подробно пространство частных адресов RFC1918 описано в разделе 13.4.
Код dnslookup ищет записи МХ об адресате. Если их нет, он проверяет запись А.
В итоге данный экземпляр маршрутизатора может запрещать доставку сообщений
на определенные IР-адреса; например, частные адреса RFC\918 не могут маршрутизи
роваться в Интернет. Больше информации об этом можно найти в описании параметра
ignore_target_hosts.
Маршрутизатор manualrou te
Гибкий драйвер manualroute может посылать электронную почту куда угодно.
Информация о маршрутизации может быть представлена в виде таблицы правил соот
ветствия для домена получателя (route_list) или отдельного правила, которое приме
няется для всех доменов (route _ data). Ниже приведены два экземпляра маршрутизато
ра manualroute. Первый экземпляр реализует концепцию "интеллектуального хоста",
в которой все исходящие сообщения посылаются центральному "интеллектуальному"
хосту для обработки. Этот экземпляр называется smarthost и применяется ко всем до
менам получателей, не указанным (используется символ !) в списке local _ domains.
smarthost:
driver = manualroute
domains = !+local domains
transport = remote_snmp
route_data = smarthost.example.com
Экземпляр маршрутизатора firewall, приведенный ниже, использует протокол
SMTP для отправки входящих сообщений хостам, находящимся за брандмауэром (воз
можно, после сканирования их на спам и вирусы). Он ищет данные о маршрутизации
для каждого домена получателя в базе данных DBM, содержащей имена локальных хос
тов.
firewall:
driver = manualroute
transport = remote-smtp
route_data = ${lookup{$domain} dbm {/internal/host/routes}}
Маршрутизатор redirect
Драйвер redirect перезаписывает адрес, используя псевдонимы из системного фай
ла aliases или пользовательского файла"/. forward. Обычно он не присваивает пере-
глава 18. Электронная почта 671
user forward:
driver = redirect
check- local - user
file = $home/.forward
no_verify
Параметр check_local user гарантирует, что получатель является корректным
локальным пользователем. Параметр no _ ve r i f у означает, что проверка правильности
адреса, на который перенаправляется сообщение, не нужна, следует просто выполнить
доставку.
#Sieve filter
то последующие команды фильтрации (их около 15) можно использовать для выработки
решения, куда следует доставить сообщение. Фильтрация на самом деле не подразуме
вает доставки сообщения, она просто выясняет пункт назначения. Рассмотрим пример.
#Exim filter
if $header_subject: contains SAGE or $header_subject: contains sysadmin
then
save $home/mail/sage-sysadmin
endif
Для того чтобы управлять тем, что пользователи могут делать в своих файлах . forward,
а чего они делать не могут, используется множество параметров . forward. Имена этих па
раметров начинаются с префиксов forЬid _или allow_. Важно предотвратить запуск поль
зователями оболочек, загрузку библиотек в бинарных кодах или использование встроенного
интерпретатора языка Perl, если они не должны этого делать. Производя обновление почто
вой системы, проверьте новые параметры forЬid _*,чтобы убедиться, что пользователи не
имеют возможности экспериментировать со своими файлами . forward.
672 Часть 11. Работа в сетях
Транспортные механизмы
Маршруrизаторы решают, куда должны следовать сообщения, а транспортные меха
низмы выполняют их фактическое перемещение в пункт назначения. Локальные транс
порты обычно добамяют сообщения в файл, передают их локальной программе или об
мениваются информацией по протоколу LMTP с серверами IMAP. Удаленные транспорты
обмениваются информацией со своими партнерами в Интернете по протоколу
SMTP.
В агенте Exim существует пять транспортных механизмов: appendfile, lmtp,
smtp, autoreply и pipe; мы опишем транспортные механизмы appendfile и smtp.
Транспорт autoreply обычно используется для отправки сообщений автоответчика,
а транспорт pipe передает сообщения на вход команд через канал UNIX. Как и при
работе с маршруrизаторами, необходимо определить экземпляры транспортов, причем
желательно иметь несколько экземпляров транспорта одного и того же типа. Порядок
важен для маршруrизаторов, но не для транспортных механизмов.
Конфигурация retry
В файле конфигурации должен существовать раздел retry, иначе программа Exim
никогда не будет повторять попытку доставить почту, которая не была достамена с пер-
Глава 18. Электронная почта 673
вого раза. Можно указать три временных интервала, каждый из которых длиннее преды
дущего. После истечения последнего интервала сообщения будут возвращены обратно
отправителю как недоставленные.
Этот пример означает следующее: "Для любого домена доставку почты на временно
недоступный адрес следует повторять каждые 15 минут в течение двух часов, каждый час
в течение следующих 24 часов, а затем каждые 6 часов в течение 4 дней и в заключение
отправить сообщение обратно как недоставленное".
Конфигурация перезаписи
Раздел перезаписи в файле конфигурации начинается словами beg in rew r i te.
Он используется для исправления адресов, а не для перенаправления сообщений.
Например, его можно использовать для исходящих адресов.
• Для того чтобы точно указать, что сообщение исходит из вашего домена, а не
от индивидуальных хостов.
Регистрация
По умолчанию программа Exim записывает три разных регистрационных файла:
главный журнал, журнал отказов и журнал тревоги. Каждая запись в журнале содержит
время ее создания. Местоположение регистрационных файлов задается в файле ЕDIТМЕ
(до компиляции программы exim) или в файле конфигурации времени выполнения
с помощью параметра log_file_path. По умолчанию файлы регистрации хранятся
в каталоге /var/spool/exim/log.
Параметр log f i le _pa th может принимать до двух значений, разделенных двое
точием. Каждое значение должно быть либо ключевым словом syslog, либо абсолют
ным путем со встроенными символами %, вместо которых подставляются имена main,
reject и panic. Например, инструкция
Отладка
Программа Exim имеет мощные средства для отладки. Вы можете управлять объемом
информации, которую хотите видеть для каждой настраиваемой возможности. Команда
exim -d заставляет программу exim переключиться в режим отладки, в котором она ра
ботает на переднем плане и не отключается от терминала. К параметру -d можно добавить
дополнительные категории отладки, вставляя символы + или - перед названием катего
Затем можно подключиться через telnet к порту 26 и набрать команды SMTP, пы
таясь воспроизвести проблемы, решение которых следует отладить.
Глава 18. электронная почта 675
smtp
1 trivial-rewrite
_.I i i lmtp
l.._rl local
.---pic-k-up--.1 L
cleanup
i
. - - - 1- - - .
. bounce
virtual
pipe
Получение почты
Программа smtpd получает почту, поступающую в систему по протоколу SMTP. Она
также проверяет, имеют ли право клиенты, установившие соединение, отправлять поч
ту, которую они пытаются доставить. Если электронная почта послана локально с по
мощью программы /usr/liЬ/sendmail, то файл записывается в каталог /var/spool
/postfix/maildrop. Этот каталог периодически сканируется программой pickup, об
рабатывающей любой найденный новый файл.
Вся входящая почта проходит через программу cleanup, которая добавляет пропущен
ные заголовки и перезаписывает адреса в соответствии с таблицами canonical и vi rtual.
Прежде чем поместить сообщение в очередь входящих сообщений, программа cleanup
передает его программе tri vial-rewri te, которая выполняет небольшое редактирование
адресов, например добавляет почтовый домен к не полностью заданным адресам.
кеширование состояния .
Глава 18. Электронная почта 677
Отправка сообщений
Программа qmqr с помощью программы trivial-rewrite решает, куда следует по
слать сообщение. Вместо решений, принимаемых программой trivial-rewri te, мож
но использовать поиск в таблицах (transport_maps).
Доставка почты удаленным серверам по протоколу SMTP выполняется программой
smtp. Программа lmtp доставляет почту, используя протоколLMTP (Local Mail Transfer
Protocol), определенный в документе RFC2033. Протокол LMTP основан на протоколе
SMTP, но был модифицирован так, чтобы почтовый сервер не управлял почтовой очере
дью. Этот обработчик почты очень полезен для доставки сообщений на почтовые серве
ры, обслуживающие клиентские ящики, такие как Cyrus 1МАР.
Программа local предназначена для локальной доставки электронной почты. Она
находит адреса в таблице aliases и следует инструкциям, указанным в файлах полу
чателя . forward. Сообщения пересылаются на другой адрес, передаются внешней про
грамме для обработки или сохраняются в почтовых папках пользователя.
Программа virtual доставляет почту в "виртуальные почтовые ящики", т.е. в поч
товые ящики, не связанные с локальной учетной записью в системе Linux, но имею
щие корректные адреса. И, наконец, программа pipe выполняет доставку посредством
внешних программ.
Безопасность
Система Postfix обеспечивает безопасность на нескольких уровнях. Большинство
серверных программ системы Postfix могут выполняться в окружении, созданном с по
мощью команды chroot. Это отдельные программы, не имеющие отношений типа
"предок-потомок". Ни одна из них не имеет механизма setuid. Каталог maildrop раз
решен по записи для группы postdrop, для которой в программе postdrop установлен
идентификатор setgid.
Основные установки
Начнем с самой простой конфигурации: пустого файла. Как это ни удивительно, это
вполне допустимая конфигурация системы Postfix. Результатом такой конфигурации яв
ляется почтовый сервер, доставляющий электронную почту локально внутри того же са
мого домена, в котором находится локальная хост-система, и посьшающий все сообще
ния на нелокальные адреса непосредственно на соответствующий удаленный сервер.
Нулевой клиент
Еще одна простая конфигурация называется нулевым клиентом; иначе говоря, систе
ма, не выполняющая локальной доставки никаких электронных сообщений и перена
правляющая внешную почту на предназначенный для этого центральный сервер. Для
реализации этой конфигурации определим несколько параметров: параметр mydomain,
задающий доменную часть имени хоста, и myorigin, представляющий собой имя по-
Глава 18. электронная почта 679
чтового домена, добавляемое в не полностью заданные адреса. Если эти два параметра
совпадают, то можно написать, например, следующие строки.
mydomain = cs.colorado.edu
myorigin = $mydomain
Еще один параметр, который необходимо определить, - mydestination, задающий
локальные почтовые домены. Если в адресе получателя сообщения имя почтового домена
совпадает со значением параметра
mydestination, сообщение доставляется с помощью
программы local соответствующему пользователю (в предположении, что не найдены ни
релевантный псевдоним, ни файл .forward). Если в параметре mydestination указаны
имена нескольких доменов, то все они считаются псевдонимами одного и того же домена.
mydestination =
relayhost = [mail.cs.colorado.edu]
Квадратные скобки означают, что система Postfix должна интерпретировать указан
ную строку как имя хоста (запись А в DNS ), а не как имя домена (запись мх в DNS).
Поскольку нулевые клиенты не должны получать почту от других систем, в конфигура
ции нулевого клиента осталось только закомментировать строку smtpd в файле master.
cf. Эrо изменение не позволяет системе Postfix вообще запускать программу smtpd. Итак,
с помощью всего нескольких строк мы определили полнофункциональный нулевой клиент!
Для "реального" почтового сервера необходимо задать немного больше параметров,
а также некоторые таблицы отображений. Эrи темы рассмотрим в следующих подразделах.
$ postconf mydestination
mydestination =
$ postconf -d mydestination
mydestination = $myhostname, localhost.$mydomain, localhost
Еще один полезный флаг -n заставляет утилиту postconf выводить только те пара
метры, которые отличаются от заданных по умолчанию. Если вам необходима помошь
от участников списка рассылки Postfix, именно эту информацию следует указать в ва
шем электронном письме.
Таблицы поиска
Многие аспекты функционирования системы Postfix зависят от использования таблиц
поиска, которые могут отображать ключи в значения или реализовать простые списки.
Например, настройки по умолчанию для таблицы alias _ maps имеют следующий вид.
alias_maps = dbm:/etc/mail/aliases
680 Часть 11. Работа в сетях
alias_database = hash:/etc/mail/aliases
alias_maps = hash:/etc/mail/aliases
Параметр alias_database задает таблицу, которая перестраивается с помощью ко
манды newaliases и должна соответствовать таблице, заданной параметром alias
maps. Причина, по которой используются два параметра, заключается в том, что табли
ца alias _ maps может содержать источники, не являющиеся базами данных, например
mysql или nis, которые не требуют перестройки.
Все таблицы баз данных (dbm, sdbm, hash и Ьtree) представляют собой текстовые
файлы, которые компилируются в эффективный бинарный формат, предназначенный
для поиска. Синтаксис этих текстовых файлов похож на синтаксис файлов конфигура
ции тем, что в них также используются комментарии и продолжения строк. Записи за
даются как простые пары "ключ-значение", разделенные пробелами, за исключением
таблиц псевдонимов, в которых используются двоеточия после ключей, чтобы обеспе
чить совместимость с программой sendmail. Например, следующие строки являются
характерными для таблицы псевдонимов.
postmaster: david, tobias
webmaster: evi
В следующем примере задается таблица доступа для ретрансляции почты от любого
клиента, имя хоста которого заканчивается строкой cs. colorado. edu .
. cs.colorado.edu ОК
Глава 18. Электронная почта 681
Локальная доставка
Программа local доставляет почту локальным получателям. Кроме того, она об
рабатывает локальные псевдонимы. Например, если параметр mydestination задан
равным cs. colorado. edu, а почта поступает на адрес evi@cs. colorado. edu, то про
грамма local сначала проверяет таблицы alias _maps, а затем рекурсивно заменяет все
соответствующие записи.
Параметр Описание
mail _ spool directory Доставляет поч~у в центральный каталог, обслуживающий всех пользователей
mai lbox _ transport Доставляет поч~у с помощью службы, определенной в файле master. cf •
Виртуальные домены
Есть три возможности организовать почтовый домен на почтовом сервере Postfix.
• Указать домен в параметре mydestination. Доставка выполняется, как описано
выше: псевдонимы раскрываются и почта доставляется на соответствующие учет
ные записи.
Домен можно указать только в одном из трех описанных параметров. Решение следует
хорошенько обдумать, потому что от него зависят многие элементы конфигурации. Мы
уже описывали применение метода mydestination. Рассмотрим остальные возможности.
myorigin = cs.colorado.edu
mydestination = cs.colorado.edu
virtual - alias - domains = admin.com
virtual_alias_maps = hash:/etc/mail/admin.com/virtual
В файле
/eto/mail/admin. oom/virtual могут содержаться следующие строки.
postmaster@admin.com evi, david@admin.com
david@admin.com david@schweikert.ch
evi@admin.com evi
Почта, направляемая на адрес
evi@admin.com, будет перенаправлена на адрес evi@
cs. colorado. edu (добавлен параметр
myorig in) и в итоге будет доставлена в почто
вый ящик пользователя evi, потому что имя домена cs. colorado. edu указано как зна
чение параметра mydestination.
Определения могут быть рекурсивными: правая часть может содержать адреса, ко
торые в дальнейшем определяются в левой части. Обратите внимание на то, что правая
часть может быть только списком адресов. Если необходимо выполнить внешнюю про
грамму или использовать подстановку файлов с помощью инструкции : include:, то
нужно перенаправить почту на псевдоним, который впоследствии может быть раскрыт
в соответствии с потребностями пользователя.
Для того чтобы хранить всю информацию в одном файле, можно присвоить параме
труvirtual_alias_domains имя той же таблицы поиска, которая задана параметром
virtual alias_maps, и внести в эту таблицу специальную запись, которая отмечала
Глава 18. Электронная почта 683
Правая часть записи для почтового домена (admin. com) на самом деле никогда не
используется; наличия имени admin. com в этой таблице в качестве независимого поля
уже достаточно для того, чтобы система Postfix рассматривала его как псевдоним вирту
ального домена.
Если имя пути заканчивается косой чертой, почтовые ящики хранятся в формате
Мaildir. Значение параметра virtual_mailbox base всегда является префиксом за
данных путей.
Часто возникает необходимость заменить псевдонимом некоторые адреса в вирту
альных почтовых доменах. Для этого следует использовать параметр virtual alias
map. Рассмотрим полный пример. В файле main. cf
virtual - mailbox - domains = admin.com
virtual_mailbox_base = /var/mail/virtual
virtual mailbox maps = hash:/etc/mail/admin.com/vmailboxes
virtual=alias_maps = hash:/etc/mail/admin.com/valiases
имеется ссылка на файл / etc/mail/ admin. com/vmailboxes, который может содер
жать следующую запись.
evi@admin.com nemeth/evi/
Файл / etc/mail/ admin. com/valiases может содержать следующую строку.
postmaster@admin.com evi@admin.com
Отображения виртуальных псевдонимов можно применять даже к адресам, которые
не являются псевдонимами виртуальных доменов. Отображения виртуальных псевдони
мов позволяют перенаправлять любой адрес от любого домена независимо от типа до
мена (канонического, виртуального псевдонима или виртуального почтового ящика).
Поскольку пути к почтовому ящику могут находиться только в правой части отобра
жения виртуального почтового ящика, использование этого механизма является един
Управление доступом
Почтовые серверы должны ретранслировать почту для третьих лиц только со сторо
ны доверенных клиентов. Если почтовый сервер перенаправляет почту от неизвестных
684 Часть 11. Работа в сетях
стен и можно определить, локальный он или нет. Все другие параметры из табл. 18.21
в конфигурации, заданной по умолчанию, остаются пустыми. По умолчанию параметр
smtpd recipient restrictions имеет следующее значение.
srntpd_recipient_restrictions = perrnit_rnynetworks,
reject_unauth_destination
Каждое из указанных ограничений проверяется по очереди, пока не будет принято
определенное решение о том, что делать с почтой. Общие ограничения перечислены
в табл. 18.22.
Таблица 18.22. Общие ограничения доступа в системе Postfix
Ограничение Функция
check client access Проверяет адрес хоста клиента, просматривая таблицу поиска
check_ recipient _ access Проверяет почтовый адрес получателя, просматривая таблицу поиска
Таблицы доступа
Каждое ограничение возвращает одно действие, указанное в табл. 18.23. Таблицы
доступа используются в ограничениях check_client_access и check_recipient
access для выбора действия, зависящего от адреса клиентского хоста или адреса полу
чателя соответственно.
Действие Описание
smtpd_recipient_restriction s =
permit_mynetworks
check_client access hash:/etc/postfix/relaying access
reject_unauth_destination
check_recipient_access hash:/etc/postfix/restricted _recipients
Обратите внимание на то, что запятые являются необязательными, если указан спи
сок значений параметра.
В файл /etc/postfix/relaying_ac cess следует внести следующую строку.
. cs.colorado.edu ОК
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_cert_file = /etc/certs/smtp.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_tls_protocols = !SSLv2
Необходимо также поместить правильно подписанный сертификат в файл /etc/
certs/ sш.tp. реш.. Кроме того, рекомендуется подключить шифрование на исходящие
соединения SMTP.
smtp_tls_security_level = may
smtp_tls_loglevel = 1
Отладка
Если в системе Postfix возникает проблема, в первую очередь следует проверить ре
гистрационные файлы. Ответы на возможные вопросы, скорее всего, найдутся в этих
файлах; просто надо их поискать. Каждая программа в системе Postfix обычно создает
регистрационную запись для каждого обработанного сообщения. Например, ниже при
веден пример регистрационных записей для исходящего сообщения.
Aug 18 22:41:33 nova postfix/pickup: ОЕ4А93688: uid=506
from=<dws@ee.ethz.ch>
Aug 18 22:41:33 nova postfix/cleanup: ОЕ4А93688: message-id=
<20040818204132.GA11444@ee.ethz.ch>
Aug 18 22:41:33 nova postfix/qmgr: ОЕ4А93688: from=<dws@ee.ethz.ch>,
size=577,nrcpt=l (queue active)
Aug 18 22:41:33 nova postfix/smtp: ОЕ4А93688:
to=<evi@ee.ethz.ch>,relay=tardis.ee.ethz.ch[129.132.2.217],delay=O,
status=sent (250 Ok: queued as 154D4D930B)
Aug 18 22:41:33 nova postfix/qmgr: ОЕ4А93688: removed
Легко видеть, что интересующая нас информация разбросана по нескольким стро
кам. Обратите внимание на то, что идентификатор ОЕ4А93688 встречается на каж:дой
Глава 18. Электронная почта 687
строке: система Postfix присваивает идентификатор очереди сразу, как только сообщение
поступает в почтовую систему, и никогда не изменяет его. Следовательно, при поиске
регистрационных записей об истории сообщения в первую очередь следует определить
идентификационный номер сообщения в очереди. Узнав его, легко применить команду
qrep ко всем релевантным записям.
Просмотр очереди
Еще одно место, где следует искать решение проблем, - почтовая очередь. Как и в
системе sendmail, команда m.ailq выводит на экран содержимое очереди. Его можно
использовать для того, чтобы выяснить причину задержки отправки сообщения.
Полезным инструментом является также сценарий qshape, который поставляется
с последними версиями системы Postfix. Он демонстрирует суммарные статистические
показатели о содержимом очереди. Его вывод выглядит следующим образом.
$ sudo qshape deferred
т 5 10 20 40 80 160 320 640 1280 1280+
TOTAL 78 О О О 7 3 3 2 12 2 49
expn.com 34 о о о о о о о 9 о 25
chinabank.ph 5 о о о 1 1 1 2 о о о
prob-helper.Ьiz 3 о о о о о о о о о 3
Сценарий qshape создает отчет о заданной очереди (в данном случае об очереди от
ложенных сообщений), упорядоченной по доменам получателя. В столбцах отчета ука
зывается, сколько минут релевантное сообщение провело в очереди. Например, в отчете
видно, что 25 сообщений, направленных в домен expn. сот, провели в очереди более
1280 минут. Все пункты назначения в данном примере вызывают подозрения, что со
общения были посланы автоответчиком в ответ на спам.
Сценарий qshape также создает отчет в соответствии с доменами отправителей, если
он запущен с флагом -s.
Мягкий рикошет
Если параметр soft bounce установлен равным yes, система Postftx посылает сооб
щения о временных ошибках, а не только сообщения о постоянных ошибках, таких как
"пользователь неизвестен" или "ретрансляция запрещена". Этот параметр предоставляет
отличную возможность для тестирования; он позволяет отслеживать местонахождение со
общения после изменения конфигурации без риска потери законной электронной почты.
В этом случае любой отказ в конце концов приводит к повторной попытке доставки.
Не забудьте отключить эту функциональную возможность, когда закончите тестиро
вание, иначе попытки доставки отвергнутой почты будут повторяться снова и снова.
18.11. ЛИТЕРАТУРА
Для того чтобы не смешивать все ссылки в один список, мы упорядочили их
по транспортным агентам и темам.
688 Часть 11. Работа в сетях
Документы RFC
Текущими версиями документов RFC82 I и RFC822 являются документы RFC532 I
(обновлен в RFC7504) и RFC5322 (обновлен в RFC6854). В них определен протокол
SMTP и форматы сообщений и адресов для электронной почты в Интернете. Документы
RFC653 l и RFC6532 посвящены вопросам интернационализации адресов электронной по
чты. Сушествует около 90 документов RFC, связанных с электронной почтой. Их слишком
много, чтобы перечислять в данной книге. Все эти документы можно найти на сайте rfc-
edi tor. org с помощью поисковой системы.
глава 19
Веб-хостинr
в рамках этой схемы. Например, URL mail to: ulsah@admin. сот инкапсулирует адрес
электронной почты. Если он вызывается в качестве целевой ссылки в Интернете, боль
шинство браузеров будут открывать окно почтового клиента для отправки электронной
почты по указанному адресу.
Для Интернета релевантными являются схемы http и https. На практике можно также
встретить схемы ws ~bSockets), wss (~bSockets over TLS), ftp, ldap и многие другие.
Адресная часть URL-aдpeca для веба позволяет определить довольно внушительную
внутреннюю структуру. Вот как выглядит общий шаблон:
схема://{имя_пользователя{:пароль]@]имя_хоста{:порт][{/путь][?запрос][#якорь]
НТТР-эапросы
Первая строка запроса указывает действие, которое должен выполнить сервер. Она
состоит из метода запроса (также известного как глагол), пути для выполнения действия
и используемой версии НТТР. Например, запрос на получение НТМL-страницы верхне
го уровня может выглядеть так:
HEAD /JIJ. Аналогичен GET, но не требует никакой нагрузки; извлекает только метаданные
НТТР-ответы
Начальная строка в ответе, называемая строкой состояния. указывает текущую ситу
ацию с запросом. Это выглядит так:
НТТР/1.1 200 ОК
Первая цифра в коде определяет его класс, т.е. общий характер результата. В табл. 19.2
показаны пять определенных классов. Остальные две цифры в классе дают дополнитель
ную информацию. В протоколе определено более 60 кодов состояния, но только некото
рые из них обычно встречаются на практике.
1 Различие между глаголами POST и PUT является тонким и в значительной степени связано
с разработкой интерфейсов прикладного программирования для веба. Глагол PUT должен быть
идемпотентным, т.е. PUT можно повторить, не вызывая вредных эффектов. Например, транзакция,
которая заставляет сервер отправлять электронную почту, не должна быть представлена как PUT.
Правила кеширования НТТР для PUT и POST также значительно различаются между собой. Более
подробную информацию см. в спецификации. RFC2616.
Глава 19. Веб-хостинг 693
201 Created
··········································································
Authorization: Basic QWx ... FtZ== ---+ Сертификаты для базовой аутентифика
ции протокола НТТР
Last-Modified: Wed, Sep 7 Последняя известная дата модификации
2016 ... объекта
Cookie: flavor=oatmeal Объект cookie, возвращаемый пользо
вательским агентом
добавляет задержку, эквивалентную полному раунду пересылки пакетов еще до того как
НТТР-запрос вообще начнет выполняться. 4
По оценкам НТТР Archive, проекта по сбору неб-статистики, при загрузке страниLiы
среднестатистического сайта выполняются запросы на 99 ресурсов. Если каждому ре
сурсу потребовалось бы новое ТСР-соединение, производительность сети была бы очень
низкой. На самом деле так и было в первое время после появления Интернета.
Исходная спецификация НТТР/1.0 не содержала никаких пред;южений для повтор
ного использования соединений, но некоторые авантюрные разработчики добавили
экспериментальную поддержку в качестве расширения. К клиентам и серверам нефор
мально был добавлен заголовок Connection: Keep-Ali ve, который затем был улуч
шен и принят по умолчанию в версии НТТР/1.1. Благодаря постоянным подключениям
(также называемым персистентными) НТТР-клиенты и серверы отправляют несколько
запросов по одному соединению, что позволяет сэкономить часть ресурсов и времени
4 ТСР Fast Open (TFO) - это предложение. целью которого является улучшение этой ситуации,
позволяющее также передавать пакеты SYN и SYN-ACK трехстороннего квитирования протокола
ТСР (см. спецификацию RFC7413).
696 Часть 11. Работа в сетях
и подмены на время обмена. Атакующие все еще моrут видеть хает и порт, используе
мые на уровне ТСР, но они не могут получить доступ к НТТР-данным, таким как U RL-
aдpec запроса или заголовки, которые его сопровождают.
Виртуальные хосты
В первые дни Интернета на веб-сервере обычно размещался только один веб-сайт.
Например, при запросе adтin. сот клиенты выполняли поиск в DNS, чтобы найти IР
адрес, связанный с этим именем, а затем отправляли НТТР-запрос на порт 80 по этому
адресу. Сервер по этому адресу знал, что он был связан с сайтом adтin. сот и соответ
ствующим образом обрабатывал результаты.
По мере увеличения использования Интернета администраторы поняли, что они мо
гут достичь эффекта масштабирования, если на одном сервере будут размещаться сра
зу несколько сайтов. Но как отличить запросы, связанные с сайтом adтin. сот, от тех,
которые связаны с сайтом ехатрlе. сот, если оба трафика идут через один и тот же
сетевой порт?
Одна из возможностей состоит в том, чтобы определить виртуальные сетевые интер
фейсы, что по сути привязывает несколько различных IР-адресов к одному физическо
му соединению. В большинстве систем это допускается и работает нормально, но такая
схема неудобна и требует управления на нескольких уровнях.
Лучшее решение (виртуальные хосты) было предоставлено в протоколе НТТР 1.1,
описанном в спецификации RFC26\6. Эта схема определяет НТТР-заголовок Host, ко
торый пользовательские агенты задают явно, чтобы указать, с каким именно сайтом они
5 Предшественник протокола TLS бьm известен под именем SSL (Secure Sockets Layer). Все версии
SSL офиuиально объявлены устаревшими. но аббревиатура SSL все еще широко используется. Вне
криптоrрафического контекста мы будем считать, что SSL на самом деле означает TLS.
Глава 19. Веб-хостинг 697
ходным кодом. Проект httpd находится в активной разработке с 1995 r. и многими рас
сматривается как эталонная реализация НТТР-сервера.
NG INX - это универсальный сервер, предназначенный для обеспечения скорости
и эффективности. Как и httpd, NGINX поддерживает обслуживание статического веб
содержимого, балансировку нагрузки, мониторинг подчиненных серверов, проксирова
ние, кеширование и другие связанные функции.
Некоторые системы разработки, в частности Node.js и язык Go, реализуют внутрен
ние веб-серверы и могут обрабатывать множество рабочих процессов по протоколу
НТТР без необходимости использования отдельного веб-сервера. Эти системы включа
ют в себя сложные функции управления подключением и достаточно надежны для про
изводственных нагрузок.
Сервер Н20 (h2o. example. net, обратите внимание на то, что в слове example
стоит цифра 1) - это новый проект неб-сервера, который в полной мере использует
функции НТТР/2 и обеспечивает еще более высокую производительность, чем NGINX.
Поскольку он был впервые выпущен в 2014 r., он не может претендовать на послужной
список Apache или NGINX. С другой стороны, он никак не связан историческими огра
ничениями в плане реализации, а также с проектом httpd. Его, безусловно, стоит рас
сматривать как вариант для новых развертываний.
Трудно сделать хорошие рекомендации относительно этих вариантов, потому что они
все неплохие. Тем не менее для основного производственного сервера мы используем
сервер NGINX. Он представляет исключительную производительность и относительно
простую и современную систему конфигурации.
Балансировщики нагрузки
Невозможно запустить высокодоступный веб-сайт на одном сервере. Эта конфигура
ция не только создаст вашим пользователям все возможные проблемы, связанные с сер
вером, но также не дает возможности обновлять программное обеспечение, операцион
ную систему или конфигурацию без простоя.
Отдельные серверы также особенно уязвимы для перегрузок и преднамеренных атак.
Чем больше перегружается сервер, тем больше времени он тратит вместо того, чтобы
выполнять полезную работу. Пройдя определенный порог нагрузки (который еще нуж
но будет обнаружить путем горького опыта!), его производительность резко падает, а не
плавно снижается.
Балансировщик
нагрузки
Клиенты Веб-серверы
Кеши
Веб-кеши появились в результате наблюдения, что клиенты часто повторно обра
щаются к одному и тому же содержимому за короткое время. Кеши находятся между
клиентами и веб-серверами и хранят результаты самых частых запросов, иногда в опера
тивной памяти. Затем они могут вмешиваться, чтобы ответить на запросы, для которых
они знают правильный ответ, тем самым снижая нагрузку на авторитетные веб-серверы
и улучшая время отклика для пользователей.
На жаргоне кеширования источник - это исходный поставщик содержимого, источ
ник подлинной информации о нем. Кеши получают свое содержимое непосредственно
из источника или из другого вышестоящего кеша.
702 часть 11. Работа в сетях
Кеш браузера
Все современные веб-браузеры хранят недавно использованные ресурсы (изобра
жения, таблицы стилей, файлы JavaScript и некоторые НТМL-страницы) локально,
чтобы ускорить выборку данных и отображение веб-страниц. Теоретически кеши бра
узера должны следовать точно таким же правилам кеширования, как и любой другой
НТТР-кеш. 8
''Поскольку данные в протоколе НТТРS зашифрованы , ответы не могут быть кешированы, если
сервер кеша не является конечным пунктом соединения TLS и может дешифровать полезную
нагрузку. При подключении с сервера кеша к источнику может потребоваться отдельно
зашифрованное ТLS-соединение (или нет, в зависимости от того, есть ли доверие к соединению
между ними).
7 0ни не учитываются всеми кешами, поэтому, как правило , менее эффективны .
"Вот почему после щелчка на кнопке Back (Назад) вашего браузера обычно происходит небольшая
задержка, а не мгновенно отображается предыдущая страница. Несмотря на то что большинство
ресурсов, необходимых для создания страницы, кешируются локально, НТМL-оболочка верхнего
уровня страницы обычно является динамической и некешируемой, поэтому по-прежнему
требуется обращение к серверу. Браузер мог бы просто отобразить данные, полученные за время
предыдущего визита - и некоторые браузеры именно так и делали , но этот прием нарушает
правильность кеширования и приводит к множеству тонких проблем .
Глава 19. Веб-хостинг 703
Кеширующий прокси-сервер
Чтобы ускорить доступ для всех пользователей, можно установить кеширующий
прокси-сервер на границе сети организации. Когда пользователь загружает веб-сайт,
запросы сначала принимаются кеширующим прокси-сервером. Если запрашиваемый
ресурс находится в кеши, он немедленно возвращается пользователю без обращения к
удаленному веб-серверу.
Настроить кеширующий прокси-сервер можно двумя способами: активно, изменяя
настройки браузера пользователей, указывая адрес и порт прокси-сервера вручную,
или пассивно, изменив конфигурацию сетевого маршрутизатора так, чтобы тот "заво
рачивал" всесь веб-трафик на кеширующий прокси-сервер. Последняя конфигурация
известна как перехватывающий прокси-сервер. Существуют также методы, с помощью
которых пользовательские агенты могут автоматически обнаруживать соответствующие
прокси-серверы.
Проблемы с кешем
Веб-кеши чрезвычайно важны для работы в Интернете, но они также создают слож
ности. Проблема на любом уровне кеширования может привести к появлению устарев
шего по отношению к исходному серверу содержимого. Проблемы с кешем могут воз
никнуть как у пользователей, так и у администраторов, и иногда их трудно отлаживать.
Записи старого кеша лучше всего обнаруживаются с помощью прямого запроса
на каждый сервер, находящийся по пути к веб-сайту. Если вы являетесь оператором сай
та, попробуйте использовать команду curl, чтобы запросить проблемную страницу не
посредственно из источника, затем из кеширующего обратного прокси-сервера и, если
получится, из кеширующего прокси-сервера и из любых других кешей, расположенных
на на пути прохождения запроса.
Сервер Описание
~
Клиент запрашивает файл
image. png у веб-<:ервера с
присланным IР-адресом +
Пограничный сервер
возвращает файл
image. png из своего кеша
Рис. 19.4. Роль DNS в сети доставки содержимого
Языки веба
Веб прошел эволюцию от преимущественно статичной сети до весьма интерактивной.
Веб-приложения, которые обеспечивают это преимушество, кодируются на разных язы
ках программирования, каждый из которых связан с соответствующими инструментами
и уникальными особенностями. Администраторам необходимо управлять библиотеками
программного обеспечения, запускать серверы приложений и настраивать веб-приложения
в соответствии со стандартами, установленными д.11я экосистемы каждого языка.
Ruby
W Краткое описание языка Ruby приведено в разделе 7.6.
Язык Ruby хорошо известен в среде DevOps и в кругах системного администриро
вания, поскольку используется в инструментах Chef и Puppet. Он также лежит в основе
каркаса Ruby оп Rails, широко используемого для создания веб-приложений.
Rails - хороший выбор для быстрых процессов разработки и часто используется
для создания прототипов новых идей.
Rails имеет посредственную производительность и ориентирован на поддержку
монолитных приложений. Со временем многие приложения Rails имеют тенденцию
706 Часть 11. Работа в сетях
Язык Ruby имеет большую коллекцию библиотек, называемых геммами 10 (gems), ко
торые разработчики могут использовать для упрощения своих проектов. Большинство из
них размещено на сайте rubygems. org. Они курируются сообществом, но многие из них
имеют крайне невысокое качество. Упрамение устаноменными версиями системы Ruby
и ее различными зависимостями от гемм может быть утомительным и неприятным.
Python
m Краткое описание языка Python см. в разделе 7.5.
Python - это язык общего назначения, используемый не только для неб-разработки,
но и в широком круге научных дисциплин. Его программы легко читать и изучать.
Наиболее широко развернутым неб-каркасом для Python ямяется Django, который име
ет много преимуществ и недостатков, как и Ruby on Rails.
Java
Язык Java, теперь контролируемый компанией Oracle, чаще всего используется в кор
поративных средах с более медленными технологическими процессами разработки. Java
обеспечивает быструю производительность за счет сложных, неуклюжих инструментов
и множества уровней абстракции. Сложные требования к лицензированию Java и слож
ные соглашения могут помешать новичкам.
Node.js
Язык JavaScript известен прежде всего как язык написания клиентских сценариев,
которые работают в веб-браузерах. Он был жестоко осмеян как поспешно разработан
ный, трудно читаемый и часто противоречивый язык. После выхода платформы Node.js
появилась возможность запустить сценарии JavaScript на серверах. Она также позволяет
использовать язык JavaScript в центрах обработки данных.
Справедливости ради следует отметить, что платформа Node.js может похвастаться
высоким параллелизмом и возможностью обмена сообщениями в реальном времени.
Поскольку это новая платформа, она пока что не обременена кучей неуклюжих реше
ний. используемых на протяжении многих лет в других системах.
РНР
Язык РНР очень прост, и по этой причине он привлекает начинающих и неопытных
программистов. Приложения РНР печально известны тем, что их трудно сопровождать.
Старые версии РНР предоставляли разработчиками слишком много возможностей соз
давать большие дыры в системе безопасности своих приложений, но в последних вер
сиях эта ситуация была существенно исправлена. РНР - это язык, используемый си
стемами \\OrdPress, Drupa\ и несколькими другими системами управления содержимым
(CMS).
Go
Go - это язык более низкого уровня, разработанный компанией Google. Он при
обрел популярность в последние годы благодаря использованию в крупных проектах
с открытым исходным кодом, таких как Docker. Он отлично подходит для системно-
11 Дуrлас Крокфорд (Douglas Crockford), который назвал и продвинул формат JSON, rоворит, что
это название произносится как имя Джейсон, но почему-то в техническом сообществе более
широкое распространение получило произношение "JAY-sawп" (джейсоун).
12 Как мы узнали, что 3WrFJ7ztbogyGnTHbHJFl2 - это идентификатор Spotify для rруппы The
"href": null,
"total": 1566620
} 1
Здесь мы передали результат в формате JSON на обработку утилите jq, чтобы немно
го улучшить форматирование. 13 На терминале утилита jq раскрашивает результат.
Интерфейс API Spotify RESTful, который сегодня
также является примером стиля
является преобладающим. REST (Representational State Transfer - передача состоя
ния представления) - это архитектурный стиль проектирования API, предложенный
Роем Филдингом (Roy Fielding) в его докторской диссертации. 14 Этот термин перво
начально был весьма специфичным, но теперь он менее тесно связан с неб-службами,
которые 1) явно используют НТТР-глаголы для передачи намерений и 2) исполь
зуют каталогизированную структуру пути для поиска ресурсов. Большинство АРl
интерфейсов REST используют формат JSON в качестве основного средства для пред
ставления данных.
Стиль REST резко контрастирует с протоколом SOAP (Simp\e Object Access Protocol -
простой протокол доступа к объектам), более ранней системой для реализации НТТР
API, которая определяет строгие и сложные многоуровневые рекомендации для взаимо
действия между системами. АРl-интерфейсы SOAP используют сложный формат XML,
который объединяет все вызовы с помощью нескольких конкретных URL-aдpecoв, что
приводит к большим объемам пересылок данных по протоколу НТТР, низкой произво
дительности и бесконечным трудностям при разработке, отладке и развертывании. 15
с помощью которых технические инициативы могут сойти с рельс. В частности, это иллюстрирует
риски, связанные с попыткой разработать системы для туманного и неопределенного будущего.
SOAP приложил немало усилий для сохранения нейтральной платформы, языка, данных
и транспорта, и в значительной степени достиг этих целей - даже базовые типы данных, такие как
целые, оставались открытыми для определения. К сожалению, получившаяся система оказалась
сложной и не соответствовала потребностям практики.
Глава 19. Веб-хостинг 709
Бессерверные веб-приложения
AWS Lambda - это вычислительная служба на основе событий. Разработчики, ис
пользующие службу Lambda, пишут код, который запускается в ответ на событие, та
кое как приход сообщения в очередь, новый объект в корзине или даже НТТР-запрос.
Служба Lambda передает полезную нагрузку и метаданные события в качестве входных
данных для пользовательской функции, которая выполняет обработку и возвращает от
вет. Управлять экземплярами или операционными системами не требуется.
Чтобы обрабатывать НТТР-запросы, служба Lambda используется совместно с дру
гой службой AWS под названием API Gateway, прокси-сервером, который может мас
штабироваться до сотен тысяч одновременных запросов. Перед источником вставлен
интерфейс API Gateway, чтобы добавить такие функции, как управление доступом, огра
ничение скорости и кеширование. НТТР-запросы принимаются шлюзом API, и когда
приходит запрос, шлюз запускает функции службы Lambda.
В сочетании со статическим хостингом на SЗ, Lambda и API Gateway могут приве
сти к полностью бессерверной платформе для запуска веб-приложений, как показано
на рис. 19.5.
Глава 19. Веб-хостинг
~----+
'
Имя api. example. сот nреобразуется в адрес
API Gateway для заnросов, требующих
обработки в реальном времени
~ ---+ Имя example . соа преобразуется в
адрес сети CloudFront CDN
Эта технология все еще находится на начальном этале, но уже меняет механику раз
мещения неб-приложений. Мы ожидаем, что усовершенствования, каркасы, конкуриру
ющие службы и передовая практика появятся уже в ближайшие годы.
# apachectl start
Performing sanity check on apache24 configuration:
Syntax ОК
Starting apache24.
# apachectl status
apache24 is running as pid 1337.
В этом выводе из системы FreeBSD оболочка apachectl сначала выполняет про
верку конфигурации, подобно lint, путем выполнения команды httpd -t, а затем за
пускает демон. 18
Команда apachectl graceful ждет, пока закроются все открытые соединения, а за
тем перезагружает сервер. Эта функция удобна мя обновления конфигурации сервера
без прерывания активных подключений. Она доступна через системные сценарии за
пуска и остановки.
17 httpd - это имя двоичного файла демона и nроекта. Разработчики системы Ubuпtu взяли
на себя смелость переименовать httpd в apache2, что соответствует названию пакета apt, но
в целом nриводит к небольшой путанице.
1 "Утилита lint - это nрограмма UNIX, которая оценивает код на языке С в поисках возможных
ошибок. Этот термин теперь более широко nрименяется к любому инструменту, который nроверяет
файлы nрограммноrо обесnечения и конфигурации на наличие ошибок, опечаток и других проблем.
Глава 19. Веб-хостинг 713
VirtualHost.
Многие администраторы обычно удовлетворены глобальными настройками и огра
ничиваются управлением несколькими разделами VirtualHosts.
Модули существуют независимо от ядра httpd и часто имеют свои собственные па
раметры конфигурации. Большинство поставщиков операционных систем предпочита
ют переносить конфигурацию модуля в отдельный подкаталог.
Настройка веб-сервера Apache в системах Deblaп и Ubuntu имеет особенности. Их
структура подкаталогов, файлов конфигурации и символических ссылок создает более
гибкую систему управления сервером, по крайней мере теоретически.
Эту загадку мы попытались прояснить на рис. 19.6. Главный файл apache2. conf
включает все файлы из подкаталогов* -enaЫed в каталоге /etc/apache2. Эти файлы
на самом деле являются символическими ссылками на файлы в каталогах * -availaЫe.
Для каждого набора подкаталогов предоставляется пара команд конфигурации, которые
создают и удаляют символические ссьmки.
714 Часть 11. Работа в сетях
mods-enaЬled/
mods-availaЫe/
1
(ИМВОllИЧеоtме CCЫJIКll, 1 Модули Apache м их файпы конфиrурации. Файпы . load вызываКJТ заrрузку
упрамяемые командами
~- модуля, а файпы . conf настраивают соответствующие модули
a2en111od/a2d1s111od
con1'-enaЫed/
conf-availaЫe/
1
(ИMBOllMЧtOOlt CCЫJIКll, 1 Фрагме1m1 глобальной, необязателыюii конфиrурацин,
упра111яемы1 командами ~- не включенные в главный файп конфигурации Apache
a2enconf/a2d1sconf
s1tes-enaЬled/
sites-availaЫe/
CИMBOllИЧtOOlt ССЫJIКМ, Оnредепения виртуального xom. Именно здесь смmмныii администратор
управляемые командами должен указm. информацию, mецифичную для сайта
a2ens1 te/a2d1ss1 te
<VirtualHost *:443>
ServerName admin.com
ServerAlias www.admin.com
ServerAlias ulsah.admin.com
DocumentRoot /var/www/admin.com/
CustomLog /var/log/apache2/admin_com_access comЬined
ErrorLog /var/log/apache2/admin_com_error
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/admin.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/admin.com.key"
Глава 19. Веб-хостинг 715
<Directory "/var/www/adrnin.com">
Require all granted
</Directory>
<Directory "/var/www/adrnin.com/photos">
Options +Indexes
</Directory>
<IfModule mod rewrite.c>
RewriteEngine оп
RewriteRule л/(usahllsah)$ /ulsah
</IfModule>
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Require ip 10.0.10.10/32
</Location>
</VirtualHost>
Большая часть этого кода не нуждается в разъяснениях, но стоит отметить несколько
деталей.
• Запросы к каталогу adтin. coт/photos выводят список всех файлов в этом ката
логе.
запросов в секунду и т.д. Системы мониторинга могут использовать эту функцию для сбо
ра данных о неб-сервере для оповещения, отчетности и визуализации НТГР-трафика.
Здесь доступ к состоянию сервера ограничен одним IР-адресом, 10.0.10.10.
<Location /server-status>
SetHandler server-status
Require ip 10.0.10.0/24
716 Часть 11. Работа в сетях
AuthType Basic
AuthName "Restricted"
AuthUserFile /var/www/.htpasswd
Require valid-user
</Location>
Обратите внимание на то, что информация об учетной записи не хранится в файле
конфигурации. Используйте утилиту htpasswd для создания учетной записи:
# htpasswd -с /var/www/.htpasswd ben
New password: <password>
Re-type new password: <password>
Adding password for user ben
# cat /var/www/.htpasswd
ben:$apr1$mPh0x0Cj$hfqMavkdHfVRVscE678SpO
# chown www-data /var/www/.htpasswd # Установка владельца
# chmod 600 /var/www/.htpasswd # Ограничение доступа
Настройка ТLS
Хотя имяSSL было заменено на TLS, в интересах обратной совместимости Apache
сохраняет имя SSL для своих параметров конфигурации (как и многие другие пакеты
программного обеспечения). Для настройки TLS требуется несколько строк:
SSLEngine on
SSLProtocol all -SSLv2 -SSLvЗ
SSLCertificateFile "/etc/ssl/certs/admin.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/admin.com.key"
Здесь сертификат и ключ TLS находятся в самом сердце системы Linux, в каталоге
/etc/ssl. Открытые сертификаты могут быть прочитаны кем угодно, но ключ должен
быть доступен только пользователю мастер-процесса Apache, обычно root. Мы предпо
читаем устанавливать разрешения 4 4 4 для сертификата и 4 О О для ключа.
Все версии фактического протокола SSL (предшественника TLS), как известно, яв
ляются небезопасными и должны быть отключены с помощью директивы SSLProtocol,
показанной выше.
ются внутри процессов Apache и имеют доступ к полному жизненному циклу НТТР
запроса/ответа.
Модули предоставляют дополнительные директивы конфигурации, которые позво
ляют администраторам управлять характеристиками среды выполнения приложений.
В табл. 19.7 перечислены некоторые распространенные модули сервера приложений.
Модуль Slэык
В следующем примере настройки приложения Django Python для сайта api. admin.
сот используется модуль mod wsgi:
LoadModule wsgi_module mod_wsgi.so
<VirtualHost *:443>
ServerName api.admin.com
CustomLog /var/log/apache2/api_admin_com_access comЬined
ErrorLog /var/log/apache2/api_admin_com_error
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/api_admin.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/api_admin.com.key"
<Directory /var/www/api.admin.com>
WSGIProcessGroup admin_api
WSGIApplicationGroup %(GLOBAL}
Require all granted
</Directory>
</VirtualHost>
После того как модуль mod_ wsgi. so был загружен веб-сервером Apache, стали до
ступными несколько директив конфигурации WSGI. Файл WSGIScriptAlias в приве
денной выше конфигурации admin_api. wsgi содержит код на Python, необходимый
модулю WSGI.
Ведение журнала
Веб-сервер httpd предлагает лучшие в своем классе возможности ведения журнала,
с детальным контролем над данными, которые регистрируются, и возможностью разде
лить данные журналов для разных виртуальных хостов. Администраторы используют эти
журналы для отладки проблем конфигурации, обнаружения потенциальных угроз без
опасности и анализа информации об использовании.
Пример сообщения журнала admin. com. access. log выглядит так:
718 Часть 11. Работа в сетях
• временную метку;
NGINX. Рабочие процессы выполняют большую часть тяжелой работы с помощью об
работки запросов. В некоторых конфигурациях используются дополнительные процес
сы, предназначенные мя кеширования. Как и в Apache, гланный процесс ныполняется
как root, поэтому он может открывать сокеты для любых портов с номерами меньше
1024. Другие процессы выполняются как менее привилегированный пользователь.
Количество рабочих процессов можно задавать. Хорошее эмпирическое прави
ло состоит в том, чтобы запускать столько рабочих процессов, сколько процессорных
ядер есть у системы. В системах Deblan и Ubuntu именно так и настраивается NGINX
по умолчанию, если он установлен из пакета. В системах FreeBSD и RHEL по умолча
нию запускается один рабочий процесс.
Сигнал Функция
USRl Повторно открывает файлы журналов (используется для облегчения ротации журна
лов)
'Этот параметр проверяет синтаксис новой конфигурации, и, если синтаксис корректный, запускает новые рабочие
процессы с новой конфигурацией, а затем аккуратно закрывает старые рабочие процессы.
"Подробнее о том, как это работает, см. в документации nqinx.
site-enaЫed/
http {
server
server name www.admin.com;
root /var/www/admin.com;
• Прослушивается порт 80, если сервер запущен с правами root, или порт 8000
в противном случае.
http {
server
server name admin.com www.admin.com;
root /var/www/admin.com;
server {
server_name example.com www.example.com;
root /var/www/example.com;
server (
listen 10.0.10.10:80
server_name admin.com www.admin.com;
root /var/www/admin.com/sitel;
server {
listen 10.0.10.11:80
server_name admin.com www.admin.com;
root /var/www/admin.com/site2;
Эта конфигурация создает две версии сайта adтin. сот, которые обслуживаются
из разных корневых каталогов. IР-адрес интерфейса, на который был получен запрос,
определяет, какую версию сайта видит клиент.
Каталог root - это базовый каталог, в котором хранятся HTML, изображения, таб
лицы стилей, сценарии и другие файлы для виртуального хоста. По умолчанию веб
сервер NGINX просто выбирает файлы из каталога root, но для более сложной марш-
19 Имейте в виду, что использование этого синтаксиса обязывает веб-сервер NGINX выполнять
проверку регулярного выражения для каждого НlТР-заnросом. Мы используем его здесь, чтобы
продемонстрировать гибкость NGINX, но на практике вы, вероятно, захотите просто перечислить все
возможные имена хостов в виде простого текста. Разумно исnоЛhЗОвать регулярные выражения в файле
nginx. conf, но убедитесь. что они соответствуют реальным значениям, и старайтесь поддерживать
их в нижней части иерархии конфигурации, чтобы они активизировались только в определенных
ситуациях.
722 часть 11. Работа в сетях
upstreaт admin-servers {
server weЫ.admin.com:8080 шах - fails 2;
server web2.admin.com:8080 max fails 2;
http
server {
server_name admin.com www.admin.com;
location / {
proxy_pass http://admin-servers;
health check interval=ЗO fails=З passes=l uri=/health_check
match=admin-health # в оригинале строка не разрывается
match admin-health {
status 200;
header Content-Type = text/html;
body - "Red Leader, Standing Ву";
Здесь трафик сайтов admin. сот и www. adтin. сот обрабатывается серверами wеЫ
и web2 в циклическом порядке (по умолчанию).
Эта конфигурация также устанавливает проверки работоспособности дЛЯ рабочих
неб-серверов. Проверки выполняются каждые 30 с (interval=ЗO) дЛЯ каждого сервера
в конечной точке /heal th check (uri=/heal th _ check). NGINX отмечает сервер как
неработоспособный, если проверка работоспособности завершится неудачно после трех
724 Часть 11. Работа в сетях
В системах Deblan и
RHEL конфигурация находится в файле /etc/haproxy/
haproxy. cfg. СистемаFreeBSD не предоставляет значение по умолчанию, так как
на самом деле для него не существует разумной рекомендации - все полностью зависит
от вашей конфигурации. Пример конфигурации в системе FreeBSD можно найти в ка
талоге /usr/local/share/examples/haproxy после установки пакета HAProxy.
Следующая простая примерная конфигурация позволяет HAProxy прослушивать
порт 80 и распределять запросы с помощью циклического режима между двумя веб
серверами wеЫ и web2, запущенными на порту 8080.
global
daemon
maxconn 5000
defaults
mode http
timeout connect 5000 # Milliseconds
timeout client 10000
timeout server 10000
frontend http-in
Ьind *:80
default backend webservers
backend webservers
balance roundroЬin
server wеЫ 10.0.0.10:8080
server web2 10.0.0.11:8080
Глава 19. Веб-хостинг 725
f:~·: ~_д_____J. ~
--+~~~
Ь.ckend ~""
Кllменты HAProxy перенопра//ЛRеm ~ .
запросы
но ее6-серееры, Веб-серверы
прослушиеоющие порт 8080
и как долго нужно держать соединения открытыми после их установки. Точная настрой
ка этих значений важна для загруженных веб-серверов. В локальных сетях значение
timeout connect может быть довольно низким (500 мс или меньше), потому что новые
соединения устанавливаются очень быстро.
Проверки работоспособности
Хотя предыдущая конфигурация обеспечивает базовые функции, она не проверяет
состояние нижестоящих веб-серверов. Если один из серверов wеЫ или web2 перестанет
отвечать на запросы, половина входящих запросов даст сбой.
Функция проверки состояния HAProxy выполняет регулярные НТТР-запросы
для определения работоспособности каждого сервера. Пока серверы отвечают кодом от
вета НТТР 200, они считаются в работоспособном состоянии и продолжают получать
запросы от балансировщика нагрузки.
Если сервер не проходит проверку работоспособности (возвращая что-либо, кроме
кода состояния 200), то программа HAProxy удаляет его из пула. Однако HAProxy про
должает выполнять проверки работоспособности этого сервера. Если он снова начнет
отвечать успешно, то программа HAProxy вернет его в пул.
Все параметры проверки работоспособности, такие как метод запроса, интервал
между проверками и URL запроса, могут быть скорректированы. В следующем примере
HAProxy выполняет запрос GET для каталога / на каждом сервере каждые 30 с:
backend webservers
balance roundrobin
option httpchk GET /
server wеЫ 10.0.0.10:8080 check inter 30000
server web2 10.0.0.11:8080 check inter 30000
726 Часть 11. Работа в сетях
Статистика сервера
Программное обеспечение HAProxy предлагает удобный неб-интерфейс, который
отображает статистику сервера, так же как модуль mod_ status в веб-сервере Apache.
Версия HAProxy показывает состояние каждого сервера в пуле и позволяет вручную
включать и отключать серверы по мере необходимости.
Синтаксис прост:
listen stats :8000
mode http
stats еnаЫе
stats hide-version
stats realm HAProxy\ Statistics
stats uri /
stats auth myuser:mypass
stats admin if TRUE
Статистика сервера может быть настроена как внутри конкретного слушателя, так
и внутри блоков frontend и backend, чтобы ограничить функцию только этой конфи
гурацией.
Липкие сессии
НТТР - это протокол без сохранения состояния, поэтому каждая транзакция явля
ется независимым сеансом. С точки зрения протокола запросы от одного и того же кли
ента не связаны между собой.
В то же время большинство неб-приложений нуждаются в возможности отслеживать
поведение пользователей с течением времени. Классическим примером состояния яв
ляется корзина для покупок. Пользователи просматривают магазин, добавляют товары
в корзину, и, когда они готовы оплатить покупки, отправляют свои платежные данные.
Чтобы решить эту проблему, НАРгоху может вставить собственный параметр cookie
в ответы, что называется липкими сессиями (sticky sessions). Любые будущие запросы
от одного и того же клиента будут содержать этот параметр cookie. HAProxy может ис
пользовать значение cookie для перенаправления запроса на один и тот же сервер.
Версия предыдущей конфигурации, модифицированная для поддержки липких
сессий, выглядит следующим образом. Обратите внимание на добавление директивы
cookie.
backend webservers
balance roundrobin
option httpchk GET /
cookie SERVERNAME insert httponly secure
server wеЫ 10.0.0.10:8080 cookie wеЫ check inter 30000
server web2 10.0.0.11:8080 cookie web2 check inter 30000
В этой конфигурации HAProxy поддерживает параметры cookie SERVERNAМE для от
слеживания сервера, с которым работает клиент. Ключевое слово secure указывает, •по
значение cookie следует отправлять только через ТLS-соединения, а ключевое слово
httponly сообщает браузерам использовать cookie только через протокол НТТР. Для
получения дополнительной информации об этих атрибутах обратитесь к специфика11ии
RFC6265.
# cat /etc/ssl/{private/admin.com.key,certs/admin.com.crt}>
/etc/ssl/private/admin.com.pem
# chmod 400 /etc/ssl/private/admin.com.pem
# ls -1 /etc/ssl/private/admin.com.pem
-r -------- 1 root root 3660 Jun 18 17:46 /etc/ssl/private/admin.com.pem
Поскольку закрытый ключ является частью составного файла, убедитесь, что файл
принадлежит пользователю root и не доступен для чтения другим пользователем. (Если
728 Часть 11. Работа в сетях
19.7. ЛИТЕРАТУРА
• ADRIAN, Dлvю, ЕТ AL. Weak Diffie-Hellman and the Logjam Attack. weakdh.org. На
этой странице описывается атака Logjam на протокол обмена ключами Диффи
Хеллмана и предлагаются способы обеспечения безопасности систем.
• CшuoFLARE, INc. Ыоg. cloudflare. com. Это корпоративный блог сети достав
ки содержимого CloudF\are. Некоторые сообщения - всего лишь маркетинговая
информация, но многие из них содержат информацию о последних тенденциях
и технологиях в Интернете.
• GRJGORJK, ILYA. Нigh Performance Browser Networking. O'Reil\y Media. 2013. Исклю
чительное руководство по протоколам, преимуществам, ограничениям и аспектам
• STENBERG, DлNJEL. daniel. haxx. se/Ьlog. Это блог Даниэля Стенберга, автора
утилиты curl и авторитетного эксперта по НТТР.
• vлN ELsт, REMY. Strong Ciphers for Apache, nginx, and Lighthttpd. cipherli. st.
Правильная и безопасная настройка шифрования для Apache httpd, NG INX и веб
серверов lighttpd, а также инструмента для тестирования конфигурации TLS.
ЧАСТЬ 111
Хранение данных
глава 20
дисковая память
диск в операционных системах Liпux или FreeBSD. Затем опишем технологии, лежащие
в основе современного аппаратного обеспечения для дисковой памяти, и рассмотрим
общую архитектуру программного обеспечения для дисковой памяти. Затем мы опишем
проблемы, связанные с дисковой памятью, начиная с низкоуровневого форматирования
и заканчивая файловой системой. По ходу изложения рассмотрим вопросы, связанные
с логическим разделением дисков, системами RAID и менедЖерами логических томов.
Несмотря на то что все производители используют стандартизованное дисковое обо
рудование, в области программного обеспечения наблюдается огромное разнообразие.
В главах 21 и 22 рассматриваются две широко распространенные файловые системы:
NFS для совместного использования файлов в системах UNIX и Linux, и SMB для взаи
модействия системах Windows и macOS.
Changes will remain in memory only, until you decide to write them.
Ве careful before using the write command.
• Выполните команду
Как только вы узнаете имя диска, вы можете создать на нем таблицу разделов и фай
ловую систему. В этом примере мы предполагаем, что имя диска adal и что мы хотим
подключить новую файловую систему как / spare.
$ sudo gpart create -s GPT adal # Создаем таблицу разделов GPT
adal created
Параметр -1 команды gpart add назначает текстовую метку к новому разделу. Метка
делает раздел доступным через путь /dev/gpt/spare независимо от имени устройства,
которое ядро назначает базовому дисководу. Опция -L команды newfs применяет ана
логичную (но другую) метку к новой файловой системе, чтобы сделать раздел доступ
ным как /dev/ufs/spare.
Смонтируйте файловые системы с помощью следующих команд.
Жесткие диски и SSD-устройства очень похожи в том смысле, что они могут заме
нять друг друга, по крайней мере на аппаратном уровне. Они используют те же аппарат
ные интерфейсы и интерфейсные протоколы. И все же они имеют очень разные силь
ные стороны, как видно из табл. 20.1.
W Дополнительную информацию о единицах IEC (гибибайтах и прочем) см. в разделе 1.6.
736 Часть 111. Хранение данных
Жесткие диски
Обычный жесткий диск состоит из нескольких вращающихся пластин, покрытых
магнитным слоем. Считывание и запись данных осуществляются с помощью маленьких
плавающих над поверхностью диска головок, смонтированных на металлическом рычаге,
скорость доступа, составляет 7 200 оборотов в минуту (revolutions per minute - RPM),
а лучшие диски достигают скорости 1О и 15 тысяч оборотов в минуту. Более высокая
скорость вращения уменьшает время ожидания и увеличивает пропускную способность
при передаче данных, но при этом диски сильнее нагреваются.
Глава 20. дисковая память 737
1Наш технический рецензент Джон Корбет (Jon Corbet) называет этот показатель "уровнем надеж
ности, достоверно не превышающим определенное значение".
738 Часть 111. Хранение данных
Типы накопителей
итоге принадлежат тем же двум компаниям, которые на протяжении десяти лет занима
• Диски ДJIЯ массовоrо рынка. Это продукты, предназначенные для конечных поль
зователей (часто компьютерных игроков), имеют более высокую скорость враще
ния шпинделя и большую кеш-память, чем те, которые имеют их эквиваленты.
В большинстве тестов они лучше, чем эксклюзивные диски. Как и в случае с экс
клюзивными дисками, настройка прошивки подчеркивает однопользовательские
шаблоны доступа, такие как большие последовательности операций чтения и за
писи. Эти диски часто работают в напряженном температурном режиме.
Гарантии и списание
Поскольку жесткие диски •1аще требуют гарантийного обслуживания, чем другие
типы аппаратного обеспечения, длительность гарантии ямяется важным фактором по
купки. Промышленный стандарт сократился до ничтожных двух лет, подозрительно
близко к длине среднегодового периода бесперебойной работы. Значительное преиму
щество имеет трехлетняя гарантия, предлагаемая на многие диски NAS.
Обмены жестких дисков по гарантии выполняются просто, если вы сможете проде
монстрировать, что диски не прошли диагностический тест, предоставленный произ
водителем. Тестовые программы обычно запускаются только в системе Windows и не
применимы в средах виртуализации и при использовании промежуточного аппаратного
обеспечения для подключения дисков, такого как USВ-переходники. Если ваши опе
рации влекут за собой частые обмены дисков, вы можете счесть необходимым поддер
живать выделенный компьютер с операционной системой Windows в качестве станции
для тестирования дисков.
неисправны, чтобы иметь право на обмен по гарантии. Даже, казалось бы, незначитель
ные признаки (например, странные шумы или ошибки дискового сектора во временных
файлах), вероятно, указывают на то, что диск скоро выйдет из строя.
Твердотельные диски
Твердотельные диски (SSD) распределяют операции считывания и записи по груп
пам ячеек памяти, каждая из которых по отдельности работает медленнее, чем совре
менные жесткие диски. Однако благодаря параллельной работе таких ячеек скорость
обмена данными дисков SSD в целом соответствуют скорости работы традиционных
жестких дисков и даже в несколько раз превосходит ее. Огромное преимущество SSD-
дисков состоит в том, что они сохраняют свою скорость работы даже тогда, когда про
исходит произвольное обращение к данным для чтения или записи. Эта особенность
является очень примекательной в реальных приложениях.
Производители жестких дисков любят приводить скорость последовательной пере
дачи данных для своей продукции, поскольку эти числа впечатляюще высоки. Однако
2 Компания Hitachi (HGSТ, часть компании W:stem Digital) заслуживает признания как особо высо
конадежная торrовая марка. В течение последнеrо десятилетия ее диски последовательно лидиро
вали на диаграммах надежности. Тем не менее диски HGST продаются значительно дороже своих
конкурентов.
740 Часть 111. Хранение данных
для традиционных жестких дисков этот показатель практически не имеет ничего обще
го с реальной скоростью его работы, наблюдаемой при чтении и записи произвольных
секторов диска. 3
Высокая скорость работы SSD-дисков не дается даром. Накопители SSD не толь
ко дороже в пересчете на один гигабайт хранимой информации, чем жесткие диски,
но и порождают новые сложности и неопределенности. В марте 2009 г. Ананд Шимпи
(Anand Shimpi) опубликовал статью о технологии SSD, которую мы рекомендуем как за
мечательное введение в эту тему. Ее можно найти на сайте tinyurl. com/dexnЬt.
·'Здесь нужно учитывать ваши реальные рабочие нагрузки. В обычных ситуациях, д11я которых на са
мом деле в значительной степени характерны последовательные операции чтения и записи, жесткие
диски все еще могуг конкурировать с твердотельными, особенно если учитывать затраты на обору
дование.
Глава 20. дисковая память 741
Перестроить буфер стертых страниц труднее, чем кажется, потому что файловые
системы, разработанные мя традиционных дисков, никак не помечают и не стирают
блоки данных, которые больше не нужны. Накопитель не знает, что файловая система
считает данный блок свободным; он знает только, что кто-то когда-то записал в него
данные мя хранения. Для того чтобы SSD-накопитель мог поддерживать работу кеша
предварительно стертых страниц (а значит, обеспечивать высокую скорость записи),
файловая система должна иметь возможность сообщать SSD-накопителю, что опреде
ленные страницы больше не нужны. Этой возможностью, которая называется операци
ей ТЮМ, в настоящий момент обладают практически все файловые системы. В рассма
триваемых в книге примерах операционных систем единственной файловой системой,
которая еще не поддерживает операцию TRIM, является файловая система ZFS в Linux.
Наиболее заметным из этих выводов является тот, что нечитаемые блоки появляются
часто и обычно возникают изолированно. При этом, как правило, диск SSD сообщает
об ошибке блока, но затем продолжает нормально функционировать.
Гибридные диски
Проведя много лет в категории "экзотики", жесткие диски SSHD со встроенной
флеш-памятью становятся все более востребованными. В настоящее время все их ис
пользуют все больше и больше потребителей.
Аббревиатура SSHD означает "solid state hybrid drive" ("твердотельный гибридный
диск" и является чем-то вроде триумфа маркетинга, спроектированным так, чтобы спо
собствовать путанице с дисками SSD. SSHD - это просто традиционные жесткие диски
с некоторыми дополнительными функциями на плате системной логики; в действитель
ности, они являются такими же твердотельными, как и обычная посудомоечная машина.
Тесты современных продуктов SSHD, как правило, бьmи не очень впечатляющими,
особенно когда эталонные тесты пытались воспроизвести реальные сценарии их работы.
Во многом это связано с тем, что в текущих устройствах обычно встроен только симво
лический объем кеша из флеш-памяти.
Несмотря на то что эффективность современной технологии SSHD невелика, основ
ная идея многоуровневого кеширования вполне обоснована и хорошо используется в та
ких системах, как ZFS и Apple Fusion Drive. Поскольку цена флеш-памяти продолжает
падать, мы ожидаем, что диски на основе традиционных вращающихся пластин будут
продолжать включать все больше и больше кеша. Эти продукты могут продаваться в ка
честве SSHD как явно, так и неявно.
Глава 20. дисковая память 743
• 512n, или реальные 512, - это старые устройства, которые фактически имеют
512-байтовые сектора. Эти устройства больше не производятся, но, конечно, они
все еще есть в реальном мире. Эти диски ничего не знают об расширенном формате.
Переход с устройств 512n на устройства 512е был завершен в 2011 г. Эти две систе
мы с точки зрения главного компьютера выглядят практически идентичными, поэтому
Единственное, что нужно знать об устройствах 512е, это то, что они чувствительны
к несогласованности между размером кластера страниц файловой системы и блоками
аппаратного диска. Поскольку диск может читать или записывать только страницы по
4 КиБ (несмотря на его эмуляцию традиционных 512-байтовых блоков), границы кла
стеров файловой системы и границы блоков жесткого диска должны совпадать. Крайне
нежелательно, чтобы логический кластер файловой системы размером в 4 КиБ фи.зи
чески располагался в половине одного дискового блока в 4 КиБ и половине другого.
В таком случае на диске потребуется выполнить в два раза больше операций чтения или
записи физических блоков, чем требуется для обслуживания определенного количества
логических кластеров.
744 Часть 111. Хранение данных
Интерфейс SATA
Последовательный интерфейс АТА, SATA, является основным аппаратным интер
фейсом для устройств хранения данных. Помимо поддержки высоких скоростей переда
чи (в настоящее время 6 Гбит/с), SATA имеет встроенную поддержку для "горячей" за
мены и (необязательно) поддержку очереди команд, две функции, которые в конечном
итоге делают АТА жизнеспособной альтернативой интерфейсу SAS в серверных средах.
Кабели SATA легко входят в свои соединительные разъемы, но они могут так же лег
ко выскользнуть отrуда. Доступны кабели с фиксаторами, но они имеют неоднозначную
репутацию. На материнских платах с шестью или восемью разъемами SATA, упакован
ными вместе, может быть трудно отсоединить блокирующие соединители без пары уз
коносых плоскогубцев.
Интерфейс SATA также ввел стандарт кабелей для подключения внешних устройств,
называемый eSATA. Эти кабели электрически идентичны стандартным SATA, но их
разъемы немного отличаются. Вы можете добавить порт eSATA в систему с внутренними
разъемами SATA, установив недорогой преобразователь на кронштейне.
Будьте внимательны при работе с внешними многодисковыми корпусами, которые
имеют только один порт eSATA, потому что некоторые из них содержат интеллектуаль
ные (RAID) контроллеры, для работы которых требуется собственный драйвер, а драй
веры таких устройств редко поддерживаются в UNIX или Linux. Существуют и обычные
корпуса, в которых встроен разветвитель портов SATA. Они потенциально могут ис
пользоваться в системах UNIX, но поскольку не все хост-адаптеры SATA поддерживают
разветвление портов, обратите пристальное внимание на информацию о совместимо
сти. Корпуса с несколькими портами eSATA - по одному на отсек для дисков - можно
всегда использовать без особых проблем.
По мере развития рынка SSD стало ясно, что скорость 6 Гбит/с работы интерфейса
SATA скоро станет узким местом при взаимодействии с самыми быстрыми устройства
ми хранения данных. Поэтому вместо традиционной формы 2,5-дюймового жесткого
диска для ноутбуков, передовые SSD стали принимать форму печатных плат, которые
подключаются непосредственно к шине PCle системы.
Интерфейс PCle был привлекательным благодаря своей гибкой архитектуре и бы
строй скорости передачи. Версия, которая теперь является основной, PCle 3.0, имеет
скорость передачи 8 гигатранзакций в секунду (Гт/с). Фактическая пропускная способ
ность зависит от того, сколько каналов передачи данных имеет устройство; их может
быть всего лишь один или целых 16. Устройства с самой широкой полосой пропускания
могут достигать пропускной способности более 15 Гб/с. 4 Ожидаемый в ближайшем буду
щем стандарт PCle 4.0 удвоит базовую скорость передачи данных до 16 Гт/с.
Сравнивая интерфейсы PCle и SATA имейте в виду, что скорость SATA, равная
6 Гбит/с указывается в гигабитах в секунду. Полноценная PCle на самом деле более чем
в 20 раз быстрее, чем
SATA.
Стандарт SATA подвергается давлению. К сожалению, экосистема SATA ограничена
прошлыми вариантами дизайна и необходимостью поддерживать существующие кабе
ли и разъемы. Маловероятно, что скорость интерфейсов SATA может быть значительно
улучшена в течение следующих нескольких лет.
U.2 - более новая версия М.2; она только начинает внедряться. Вместо USB. в до
полнение к интерфейсам SATA и PCle, через разъем U.2 можно подключать устройства
с интерфейсом SAS.
Интерфейс SAS
Аббревиатура SAS означает Serial Attached SCSI, в которой часть SCSI представляет
интерфейс Small Computer System lnterface, общий канал данных, который когда-то со
единял множество разных типов периферийных устройств. В наши дни рынок для пе
риферийных соединений захватил интерфейс USB, и интерфейс SCSI можно встретить
только в виде SAS, промышленного интерфейса, используемого для подключения боль
шого количества устройств хранения данных.
Теперь, когда названия SAS и SCSI в значительной степени являются синонимами,
обширная история раЗ11ичных технологий SCSI, относящихся к 1986 r., служит в основ
ном для создания путаницы. Операционные системы вносят дополнительную неодно
значность, фильтруя весь доступ к диску через "подсистему SCSI" независимо от того,
задействовано действительно устройство SCSI или нет. Наш совет - игнорировать всю
эту историю и рассматривать SAS как отдельную систему.
4 Эrа
скорость совсем немного не дотягивает до 16 Гб/с, потому что часть полосы пропускания за
нимают служебные сигналы. Однако объем накладных расходов настолько мал (около 1,5%), что
его можно безопасно игнорировать.
746 часть 111. Хранение данных
В настоящее время SAS работает со скоростью 12 Гбит/с, что вдвое превышает ско
рость SATA.
В прошлых изданиях этой книги SCSI был очевидным выбором интерфейса для сервер
ных приложений. Он предлагал самую широкую доступную полосу пропускания, выпол
нение команды вне очереди (прием, называемый очередью размеченных команд), более
экономное исполь:ювание центрального процессора, упрощение обработки большого ко
личества устройств хранения данных и доступ к самым передовым жестким дискам рынка.
Появление SATA нивелировало или минимизировало большинство из этих преиму
ществ, поэтому SAS просто не дает явных преимушеств, которыми пользовался SCSI. Диски
SATA конкурируют с эквивалентными дисками SAS почти в каждой категории (а в некото
рых случаях превосходят их). В то же время как устройства SATA, так и интерфейсы и кабе
ли, используемые для их подключения, дешевле и гораздо более широко доступны.
• SAS может обрабатывать многие устройства хранения (сотни или тысячи) на од
ном интерфейсе хоста. Но имейте в виду, что все эти устройства подключаются
к одному каналу; поэтому вы по-прежнему ограничены совокупной пропускной
способностью в
12 Гбит/с.
Обсуждение SAS и SATA может в конечном итоге быть спорным, поскольку стандарт
SAS включает поддержку дисков SATA. Соединители SAS и SATA настолько похожи, что
через одну объединительную панель SAS можно подключить диски любого типа. На ло
гическом уровне команды SATA просто туннелируются по шине SAS.
Эта конвергенция - удивительный технический подвиг, но его экономический
смысл неясен. Затраты на устанооку SAS в основном связаны с хост-адаптером, объеди
нительной панелью и инфраструктурой; диски SAS сами по себе не слишком дорогие.
Вложив средства в настройку SAS, вы можете придерживаться этой технологии SAS
до упора. (С другой стороны, возможно, скромные цены на диски SAS являются резуль
татом того, что вместо них можно легко установить диски SATA.)
Интерфейс USB
Универсальная последооательная шина (USB) является популярной альтернати
вой для подключения онешних жестких дисков. Текущая скорость составляет от 4 Гб/с
для USB 3.0 и до 10 Гб/с для USB 3.1. 5 Обе системы достаточно быстрые, чтобы обе
спечить максимальную скорость передачи всех данных, уступая только самым быстрым
5 Скорость USB 3.0 часто упоминается как 5 Гбит/с, но из-за накладных расходов, связанных с обя
зательной кодировкой, более вероятно, что фактическая скорость передачи составляет 4 Гбит/с.
Глава 20. дисковая память 747
дискам SSD. Однако избегайте использования интерфейса USB 2.0; его скорость дости
гает 480 Мбит/с, что мало даже для работы обычного жесткого диска.
У самих накопителей никогда не бывает встроенных интерфейсов USB. Внешние ди
ски, продаваемые с этими интерфейсами, - это, как правило, диски SATA с преобразо
вателем протокола (переходником), встроенным в корпус. Вы также можете приобрести
эти корпуса отдельно и поместить в них свой жесткий диск.
USВ-адаптеры также доступны в виде специальных корзин для подключения дисков
и кабельных адаптеров. Это особенно удобно, когда диски часто меняются: просто вы
таскиваете старый диск и вставляете новый.
USВ-флешки являются совершенно законными устройствами хранения данных. Они
представляют собой блочный интерфейс, аналогичный интерфейсу любого другого дис
ка, хотя их скорость работы обычно посредственная. Основополагающая технология по
хожа на технологию SSD, но без некоторых преимуществ, которые дают дискам SSD их
превосходную скорость и надежность.
также могут быть включены диски SAS, если материнская плата поддерживает их напря
мую. Если в системе имеется отдельная интерфейсная плата SAS, вам может потребовать
ся вызвать настройку BIOS для этой платы, чтобы просмотреть информацию о диске.
На облачных серверах и системах, поддерживающих горячее подключение дисков,
вам, возможно, придется немного поработать. Проверьте диагностический вывод ядра
после опроса устройства. Например, одна из наших тестовых систем вывела следующие
сообщения для устаревшего диска SCSI, подключенного к хост-адаптеру Buslogic SCSI.
scsiO: BusLogic ВТ-948
csi: 1 host.
vendor: SEAGATE Model: ST446452W Rev: 0001
Туре: Direct-Access ANSI SCSI revision: 02
Detected scsi disk sda at scsiO, channel О, id 3, lun 3
scsiO: Target 3: Queue Depth 28, Asynchronous
SCSI device sda: hdwr sector=512 bytes. Sectors=91923356 [44884 МВ]
[44.8 GB]
Эту информацию можно увидеть после завершения загрузки системы: просто загля
ните в файлы системного журнала. Для получения дополнительной информации об об
работке загрузочных сообщений из ядра обратитесь к разделу 10.3. Существуют несколько
команд, выводящих список дисков, о которых система знает. В системах Linux лучшим
вариантом обычно является команда lsЫk, которая является стандартной для всех дист
рибутивов. Для получения дополнительной информации запросите модель и серийные
номера:
lsЫk -о +MODEL,SERIAL
В системе FreeBSD используйте команду geom disk list.
ками SATA и SAS через общий уровень SCSI, поэтому не удивляйтесь, если SАТА-диски
маскируются как устройства SCSI. Названия драйверов также различаются в облачных
и виртуализованных системах; виртуальный диск SATA может иметь или не иметь то же
имя драйвера, что и фактический диск SATA.
В файлы устройств для разделов добавляется дополнительная информация, чтобы ука
зать номер раздела. Нумерация раЗделов обычно начинается с 1, а не О.
7С другой стороны, если накопитель емкостью 1 Тбайт стоит 80 долл., зачем беспокоиться?
Глава 20. дисковая память 751
альных программ.м Об этом всегда нужно помнить при избавлении от дисков, независи
мо от того, продаете ли вы их на аукционе еВау, или выбрасываете в мусорник.
Во-вторых, даже ручное перезаписывание каждого сектора на диске может оставлять
магнитные следы, которые злоумышленник может выявить и восстановить в лаборатории.
Безопасное стирание переписывает данные столько раз, сколько нужно для того, чтобы
уничтожить эти следы. Остаточные магнитные сигналы для большинства организаций не
составляют большой щюблемы, но всегда полезно знать, что вы защищены от разглашения
конфиденциальных данных организации. Некоторые организации выполняют безопасное
стирание по требованию регуляторных органов или исходя из своих бизнес-правил.
В заключение, безопасное стирание делает накопители SSD абсолютно пустыми. Это
позволяет повысить скорость их работы в ситуациях, когда нельзя использовать команду
TRIM стандарта АТА (команду для физического стирания блока) либо потому, что фай
ловая система, используемая в накопителе SSD, не способна ее выполнить, либо потому,
что накопитель SSD подключен через адаптер компьютера или контроллер RAID, кото
рые не поддерживают команду TRIM.
Команда безопасного удаления АТА защищена паролем на уровне диска, чтобы сни
зить риск ее непреднамеренного использования. Поэтому перед вызовом команды вы
должны задать свой пароль на диске. Однако не торопитесь записывать пароль; при же
лании вы можете его всегда сбросить. Опасности блокировки диска не существует.
Многие системы имеют утилиту shred, которая выполняет безопасное стирание от
дельных файлов. К сожалению, ее работа основана на предположении, что блоки фай
лов могут быть перезаписаны на том же месте. Однако во многих ситуациях это условие
не выполняется (в частности, это относится к любым файловым системам на любых на
копителях SSD, любым логическим томам, имеющим механизм мгновенных копий, и,
возможно, ко всей файловой системе ZFS), поэтому полезность универсальной утилиты
shred вызывает сомнения.
Для очистки всей дисковой системы на персональном компьютере существует про
грамма Дарика (Darik) Boot and Nuke (dban. org). Этот инструмент запускается со сво
его загрузочного диска, поэтому он не используется каждый день. Тем не менее он до
вольно удобен для вывода из эксплуатации старого аппаратного обеспечения.
~теперь, когда большинство файловых систем поддерживают команду TRIM дпя информирования
диска о блоках, которые больше не нужны системе, это утверждение стало не совсем точным.
SSD
Однако команда TRI М является необязательной; диск SSD не обязан стирать что-либо в ответ.
752 Часть 111. Хранение данных
Все эти значения должны быть равны нулю. Ненулевые значения этих параметров
повышают вероятность отказа в течение 60 дней в 39, 14, 21 и 16 раз соответственно.
Для того чтобы извлечь пользу из параметров стандарта SMARТ. необходимо иметь
специальное программное обеспечение, которое опрашивает накопители и прогнози
рует вероятность сбоя. К сожалению, стандарты отчетов варьируются в зависимости
от производителей накопителей, поэтому декодирование параметров не всегда является
простой задачей. Большинство мониторов SМART накапливают основные параметры,
а затем ищут внезапные изменения в неблагоприятном направлении, вместо того что
бы интерпретировать их абсолютные величины. (В соответствии с отчетом компании
Google учет этих "мягких" параметров стандарта SMART в дополнение к "большой чет
верке" позволяет предсказать 64% сбоев.)
Стандартным программным обеспечением стандарта SМART для контроля накопи
телей в системах UNIX и Linux является пакет smartmontools с сайта smartmontools.
org. В системах Red Hat, CentOS и FreeBSD он инсталлируется по умолчанию и обычно
входит в репозиторий пакетов в других системах.
Пакет smartmontools состоит из демона smartd, который постоянно следит за на
копителями, и команды smartctl, которую можно использовать для выполнения инте
рактивных запросов или сценариев. Демон имеет один конфигурационный файл, как
правило,/ etc/ smartd. conf, содержащий подробные комментарии и много примеров.
Накопители SCSI имеют собственную систему отчетов о нестандартном состоянии,
но, к сожалению, они менее подробные, чем отчеты системы SМART Разработчики па
кета smartmontools попытались включить накопители SCSI в свою схему, но прогно
зируемая значимость данных стандарта SCSI является менее ясной.
Как обычно, в этой книге нас интересуют промышленные системы хранения дан
ных: файловые системы, доступ к которым имеет множество пользователей (локаль
ных и удаленных) и которые в то же время должны быть надежными, высокопроиз
водительными, допускающими простое резервирование и обновление. Такие системы
требуют немного больше внимания, и системы UNIX и Linux дают для этого достаточ
но оснований.
Типичный набор компонентов программного обеспечения, осуществляющих взаимо
действие между накопителем и его пользователями, приведен на рис. 20.1. Архитектура,
показанная на рис. 20.1, относится к системе Linux, но и другие операционные системы
обладают аналогичными возможностями, хотя и не обязательно в точно таком же виде.
754 Часть 111. Хранение данных
Логические тома
Накопитель
Стрелки на рис. 20. \означают "могут быть созданы на основе' '. Например, файловая
система Linux может быть создана на основе раздела, массива RAI D или логического
тома . Создание стека модулей, соединяющих каждый накопитель с его окончательным
приложением , является одной из задач администратора .
Внимательный читатель заметит, что этот граф имеет цикл, а в реальных конфигу
раш1ях циклов не бывает. Система Linux допускает создание стеков из массивов RAI D
и логических томов в любом порядке , но ни один из компонентов не может использо
ваться больше одного раза (хотя с технической точки зрения это возможно) .
Рассмотрим фрагменты рис. 20. 1.
• Накопитель (storage device) - это все, что напоминает диск. Это может быть жест
кий диск, флеш-накопитель, диск SSD, внешний массив RAI D. реализованный
в виде аппаратного обеспечения, и даже сетевая служба, обеспечивающая доступ
к удаленному устройству на уровне блока . Конкретный вид оборудования значе
ния не имеет, поскольку устройство допускает прямой доступ, обрабатывает блоч
ный ввод-вывод и представлено файлом устройства .
жер LVM должен хранить как исходный образ, так и все модифицированные блоки,
поэтому в конце концов он исчерпает память, если мгновенные копии никогда не
удаляются.
Если вы считаете, что описанная выше система содержит слишком много маленьких
компонентов, которые просто реализуют один блочный накопитель на основе другого,
то вы совершенно правы. В последнее время наблюдается тенденция в сторону консо
лидации этих компонентов, чтобы повысить эффективность и устранить дублирование.
Хотя менеджеры логических томов изначально не функционировали как контроллеры
RAID, большинство из них воплотили некоторые функциональные возможности масси
вовRAID (в частности, чередование данных по дискам и зеркалирование).
В настоящее время на передовом крае находятся системы, объединяющие файло
вую систему, контроллер RAID и систему LVM в один интегрированный пакет. Первым
примером такого рода является файловая система ZFS, хотя файловая система Btrfs в
Linux предназначена для решения аналогичных задач. Системы ZFS и Btrfs описывают
ся в разделе 20.11. (Забегая наперед, скажем, что если у вас будет возможность исполь
зовать одну из этих систем, то обязательно попробуйте.)
Уровень файловой
/home /opt /spare
системы 11 1
1 11 1
1 1 1
Уровень 1
/dev/sda1 11 /dev/sda2 1 /dev/sdb1
разделов 11 1
)
Физический
Жесткий диск 1 ·1 1 Жесткий диск 2
уровень 1
Традиционное разбиение
Системы, допускающие разбиение, реализуют его, записывая "метку" в начало дис
ка, чтобы определить диапазон блоков, включенных в каждый раздел. nодробности этой
процедуры могут варьироваться; метка часто может существовать одновременно с другой
установочной информацией (например, загрузочным блоком) и часто содержит дополни
тельную информацию, например имя или уникальный идентификатор всего диска.
Драйвер устройства, представляющий диск, считывает эту метку и использует таблицу
разбиения диска для вычисления физического местоположения каждого раздела. Как пра
вило, каждому разделу соответствует один или два файла устройства (для блочного устрой
ства и для устройства посимвольного ввода-вывода; в системе Linux есть только блочные
устройства). Кроме того, отдельный набор файлов устройств представляет диск в целом.
Несмотря на всеобщую доступность менеджеров логических томов, в некоторых си
туациях необходимо или желательно традиционное разбиение.
• Инсталлирование таблиц MBR или GPT делает диск понятным для системы
Windows, даже если содержание его отдельных разделов остается недоступным.
Если у вас нет конкретных планов по взаимодействию с системой Windows, то все
же учтите повсеместную распространенность системы Windows, большую попу
лярность виртуальных машин и вероятность того, что ваш диск в один прекрас
• В системах RAID (см. раздел 20.8) используются диски или разделы сопостави
мого размера. Хотя в конкретной реализации системы RAID могут использовать
ся диски разных размеров, скорее всего при этом будут использоваться только те
диапазоны номеров блоков, которые являются общими для всех дисков. Чтобы не
терять избыточное дисковое пространство из него можно сделать отдельный раз
дел для редко используемых данных. Если же поместить в этот раздел часто ис
пользуемые данные, то такая схема разбиения снизит производительность работы
всего массива RAID.
Глава 20. дисковая память 759
Кроме того, каждый раздел имеет однобайтовый атрибут типа, который обозна
чает содержимое раздела. Как правило, эти коды предстааляют либо типы файловой
системы. либо операционные системы. Эти коды не присваиваются централизован
но, но со временем были приняты определенные соглашения. Они сформулированы
Андрисом Э. Брауэром (Andries Е. Brouwer) на сайте goo. gl/AТiЗ.
Команда MS DOS, осущесталяющая разбиение жесткого диска, называется fdisk.
Большинство операционных систем, поддерживающих разбиение в стиле MBR, унас
ледовали это имя мя обозначения своих собственных команд разбиения, но они очень
разнообразны. Сама система Windows от нее отказалась, ее современная версия инстру
мента мя разбиения диска называется diskpart. Кроме того, система Windows имеет
графический пользовательский интерфейс мя разбиения дисков, который доступен
благодаря утилите Управление дисками (Disk Management) из консоли упрааления mmc.
Не имеет значения, с помощью какой операционной системы вы разбили диск
на разделы - Windows или какой-то другой. Окончательный результат будет таким же.
Схема разделения EFI, известная как "таблица разделов GUID", или GРТ,, устраняет
очевидные недостатки метки MBR. Она определяет только один тип разбиения (больше
"Проект EFI недавно был переименован в UEFI. Буква U означает "unified" (универсальный). Этот
проект поддерживается многими производителями. Однако название EFI употребляется чаше. По
существу, названия UEFI и EFI являются синонимами.
760 Часть 111. Хранение данных
нет никаких логических разделов в расширенном разделе), а самих разделов может быть
сколько угодно. Каждый раздел имеет тип, определенный 16-байтовым идентификато
ром (глобально уникальным ID, или GUID), который не требует централизованного
управления.
gpart
это абстракция
устройств хранения FreeBSD. Не все объекты geom - это дисковые накопители, но все
Глава 20. дисковая память 761
дисковые накопители являются объектами geom, поэтому при вызове команды geom вы
можете использовать общее имя диска, такое как adaO.
В рецепте, посвященном добавлению диска в системе FreeBSD из раздела 20. l,
для настройки таблицы разделов на новом диске используется команда qpart.
Однако логические тома являются более гибкими и мощными, чем разделы дисков.
Перечислим ряд операций, которые можно выполнять с помощью менеджера тома.
Архитектура LVM верхнего уровня состоит в том, что отдельные диски и разделы
(физические тома) собираются в пулы устройств хранения данных, называемые группа
ми томов. Затем группы томов подразделяются на логические тома, которые являются
блочными устройствами, в которых хранятся файловые системы.
Физический том должен иметь метку LVM, задаваемую в команде pvcreate.
Применение такой метки sшляется первым шагом для доступа к устройству через менед
жер LVM. Помимо информации об использовании системных ресурсов, метка содержит
уникальный идентификатор мя идентификации устройства.
Физический том - несколько неточный термин, поскольку физические тома не обяза
ны иметь прямое соответствие физическим устройствам. Они могут быть дисками, но они
также могут быть дисковыми разделами или RAI О-массивами. Менеджеру LVM все равно.
Вы можете управлять менеджером LVM либо большой группой простых команд,
перечисленных в табл. 20.3, либо с помощью команды lvm и ее различных подкоманд.
Эти варианты по существу идентичны; отдельные команды - это просто ссылки на ко
манду lvm, которые созданы только для того, чтобы своим названием говорить вам, что
они делают. Хорошее введение в систему и ее инструменты можно найти на справочной
странице команды 1vm.
Процесс настройки менеджера логических томов в системе Linux состоит из не-
скольких этапов.
свежие изменения блоков данных. Это идеальный компромисс для мгновенных копий,
используемых в качестве источника для резервного копирования.
Для того чтобы проверить состояние мгновенных копий, следует выполнить команду
lvdisplay. Если она сообщает, что мгновенная копия "не активна", это значит, что для
нее уже не хватило места на диске, и ее следует удалить, поскольку с такой мгновенной
копией практически ничего сделать уже нельзя.
Глава 20. дисковая память 765
на
"Дырка при записи в RAID 5". Этот эффект описывается ниже. Однако будьте внима
тельны: многие широко распространенные недорогие RАID-контроллеры, используемые
в персональных компьютерах, вообще не имеют энергонезависимой памяти. На самом
деле они представляют собой старый добрый интерфейс SATA с элементами встроенного
программного обеспечения RAID. Реализации системы RAID на материнских платах пер
сональных компьютеров также относятся к этой категории. В таких случаях лучше вообще
отказаться от использования подобного RAID в системах Linux или FreeBSD. А лучше
всего используйте файловые системы ZFS или Btrfs.
Однажды на важном промышленном сервере произошел отказ контроллера диска.
Несмотря на то что данные бьuш распределены по нескольким физическим накопителям,
неисправный контроллер RAI О уничтожил данные на всех дисках. В результате пришлось
долго и нудно восстанавливать данные на сервере. Поэтому теперь для управления средой
RAID на восстановленном сервере используется встроенное в ядро программное обеспе
чение, что позволило исключить возможность нового сбоя контроллера RAID.
'°Аббревиатуру RAI D иногда расшифровывают как "redundant arrays of independent disks" ("избы
точные массивы независимых дисков"). Оба варианта с исторической точки зрения являются пра
вильными.
768 Часть 111. Хранение данных
• "Линейный режим", известный также как JBOD (just а bunch of disks - просто
группа дисков), нельзя даже назвать реальным уровнем системы RAID. Его реали
зует каждый контроллер RAID. В режиме JBOD сектора нескольких накопителей
объединяются в один большой виртуальный накопитель. Это не обеспечивает ни
избыточности данных, ни повышения производительности. В настоящее время
функциональная возможность JBOD лучше обеспечивается с помощью менеджера
логических томов, а не контроллера RAID.
• Уровень RAID О используется только для повышения производительности. Он
объединяет два или более накопителей одинакового размера, но вместо их объ
единения последовательно один за другим он распределяет данные между диска
RAID 1
RAIDO 1 1 RAIDO
1 1 1
-., -.,
1 r
"'-
1
=: r
"'-
1
~
r
"'-
1
~
~ la ~
...._ lb ...._ la ~
...._ lb ~
RAIDO+l :
2а 2Ь 2а 2Ь Зеркало
За ...._ зь ...._ За ...._ зь группы
'- ~ J J ~
4а 4Ь 4а 4Ь
RAIDO
RAID 1 1 1 RAID 1
1
_L
1 r
•1 ~
'- la J "'- la J
...._ lb J
...._ lb J RAID 1+0:
2а ...._ 2а ...._ 2Ь 2Ь ~
Группа
зеркал
'- За ~
"'- За J "'- зь ~
....._ зь ~
4а ..._ 4а ~
..._ 4Ь ~ 4Ь ~
...._ la J lb J lc ~
...._ lp J
2а 2Ь 2р 2с
..... За J '- Зр ~
...._ зь J ..... Зс J
4р 4а ~
..._ 4Ь 4с
RAIDб
la
2а
За 3 3 зь Зс
4 4 4а 4Ь 4с
• Файловая система
системе
Кстати, это одна из причин, по которой авторы назвали свою реализацию системы RAID
в ZFS именем RAID-Z, а не RAID 5, хотя на практике эти концепции похожи.
Еще одним потенциальным решением является "чистка" ("scrubblng") диска, кото
рая состоит из поочередной проверки блоков четности во время простоя дискового мас
сива. Многие реализации системы RAID имеют ту или иную функцию чистки. От вас
только требуется не забывать ее регулярно запускать, например через утилиту cron или
таймер systemd.
Создание массива
В следующем сценарии выполняется конфигурация массива RAID 5, состоящего
из трех идентичных жестких дисков объемом l Тбайт. Несмотря на то что драйвер md
может использовать в качестве компонентов неформатированные диски, мы предпо
читаем снабдить каждый диск таблицей разделов, поэтому начинаем с запуска утилиты
gparted, создающей таблицу разделов G РТ на каждом диске, и выделения всего дис
кового пространства одному разделу типа "Linux RAID". Совершенно не обязательно
задавать тип раздела, но это будет полезной информацией для тех, кто станет просма
тривать таблицу разделов позднее.
Следующая команда создает массив RAID 5 из наших трех разделов диска.
$ sudo mdadm --create /dev/md/extra --level=S --raid-devices=З
/dev/sdfl /dev/sdql /dev/sdhl
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/extra started.
Виртуальный файл /proc/mdstat всегда содержит краткое описание состоя
ния драйвера md, а также состояния всех массивов RAID, существующих в системе.
Особенно полезено проанализировать содержимое файла /proc/mdstat после добавле
ния нового диска или замены неисправного. Для этой цели рекомендуем использовать
команду cat /proc/mdstat.)
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raidOJ [raidl] [raidб] [raid5]
Глава 20. дисковая память 773
[raid4] [raidlOJ
mdl27 : active raid5 sdhl[3] sdgl[l] sdfl[OJ
2096886784 Ыocks super 1.2 level 5, 512k chunk, algo 2 (3/2) [UU_]
[> .................... ] recovery = 0.0% (945840/1048443392)
finish=535.2min speed=32615K/sec
bitmap: 0/8 pages [ОКВ], 65536КВ chunk
unused devices: <none>
Драйвер md не следит за тем, какой блок в массиве был использован, поэтому он
должен вручную синхронизировать все блоки четности с их соответствующими блоками
данных. Драйвер md запускает операцию "восстановления" ("recovery") данных, потому
что, по существу, она совпадает с той процедурой, которая выполняется после замены
неисправного диска. Для больших массивов она может выполняться довольно длитель
ное время (несколько часов, или даже дней).
В файлах /var/log/messages или /var/log/syslog также записаны полезные со
общения.
kernel: md: bind<sdfl>
kernel: md: bind<sdgl>
kernel: md: bind<sdhl>
kernel: md/raid:mdl27: device sdgl operational as raid disk 1
kernel: md/raid:mdl27: device sdfl operational as raid disk О
kernel: md/raid:mdl27: allocated 3316kB
kernel: md/raid:mdl27: raid level 5 active with 2 out of З devices,
algorithm 2
kernel: RAID conf printout:
kernel: --- level:5 rd:3 wd:2
kernel: disk О, o:l, dev:sdfl
kernel: disk 1, o:l, dev:sdgl
kernel: created bitmap (8 pages) for device md127
mdadm[ll74]: NewArray event detected on md device /dev/md127
mdadm[l174]: DegradedArray event detected on md device /dev/md127
kernel: md127: bitmap initialized from disk: read 1 pages, set 15998 of
15998 Ьits
kernel: mdl27: detected capacity change from О to 2147212066816
kernel: RAID conf printout:
kernel: --- level:5 rd:3 wd:2
kernel: disk О, o:l, dev:sdfl
kernel: disk 1, o:l, dev:sdgl
kernel: disk 2, o:l, dev:sdhl
kernel: md: recovery of RAID array mdl27
kernel: md: minimum _guaranteed_ speed: 1000 KB/sec/disk.
kernel: md: using maximum availaЫe idle IO bandwidth (but not more than
200000 KB/sec) for recovery.
kernel: md: using 128k window, over а total of 1048443392k.
mdadm[ll74]: RebuildStarted event detected on md device /dev/md127
Команда первоначального создания также предназначена для "активизации" массива
(т.е. для приведения его в состояние, пригодное для использования). При последующих
перезагрузках в большинстве дистрибутивов ОС, включая те, которые рассматриваются
в книге, поиск существующих массивов и их повторная активизация выполняются авто
матически.
Обратите внимание на то, что при выполнении команды mdadm -create указыва
ется путь к устройству для составного массива. Пути md-устройств старого стиля вы
глядели как /dev/mdO, но когда вы указываете путь в каталоге /dev/md, как это было
сделано в данном примере, mdadm записывает выбранное имя в суперблок массива. Эта
774 Часть 111. Хранение данных
мера гарантирует, что вы всегда можете найти массив по логическому пути, даже если
после перезагрузки массив активизирован автоматически и ему может быть присвоен
другой номер. Как видно из записей журнала, приведенных выше, массив также имеет
традиционное имя (здесь, /dev/md127), а /dev/md/extra - это просто символическая
ссылка на реальное устройство массива.
Теперь команда mdadm сможет прочитать файл mdadm. conf при загрузке или завер
шении работы системы, что намного упростит управление массивом. Например, дпя
того чтобы отключить массив, созданный выше, достаточно запустить следующую ко
манду.
Имитация сбоя
Что произойдет, если диск действительно выйдет из строя? Попробуем разобраться!
Команда mdadm предоставляет нам прекрасную возможность сымитировать сбойный диск.
$ sudo mdadm /dev/md/extra -f /dev/sdql
mdadm: set /dev/sdgl faulty in /dev/md/extra
$ cat /proc/mdstat
Personalities : [ linear] [multipath) [ raidO) [ raidl) [ raid6) [ raid5]
[raid4) [raidlO]
mdl27 : active raid5 sdhl [3) sdfl [0] sdgl [1] (F)
2096886784 Ыocks super 1.2 level 5, 512k chunk, algo 2 [3/2] [UU_]
1 'В большинстве случаев журналируются только изменения метаданных. Фактические данные, ко
торые нужно сохранить, записываются непосредственно в файловую систему. В некоторых фай
ловых системах также может использоваться журнал для фиксации данных, но это требует значи
тельных эксплуатационных расходов.
778 Часть 111. Хранение данных
ки, а целые экстенты (логические диапазоны дисковых блоков). Файловая система ext4
де-факто стала стандартной для операционных систем Deblaп и Ubuпtu.
Файловая система XFS была разработана компанией Silicon Gгaphics, lnc., позже
известной как SGI. Это была стандартная файловая система для IRIX, версии UNIX
от SGI. Она была одной из первых файловых систем, использовавших экстенты. Это
сделало ее особенно подходящей для приложений, обрабатывающих большие медиа
файлы, как это делали многие клиенты SGI. XFS является стандартной файловой систе
мой для операционных систем Red Hat иCentOS.
Параметр -L в обоих вариантах задает метку тома для файловой системы, например,
spare, home или extra. Это только один из многих параметров, но мы рекомендуем
его использовать во всех файловых системах. Он позволяет избавиться от ручного отсле
живания устройства, на котором расположена файловая система, при ее монтировании.
Это особенно удобно, если имя дискового устройства может изменяться.
Остальные опции, указываемые в другие_ параметры, зависит от конкретной фай
ловой системы, и используется редко.
14 8 некоторых системах для восстановления этого каталога после удаления используется команда
mklost+found.
глава 20. дисковая память 781
$ d.f -h /mnt/weЫ
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/DEMO-weЫ l97G бОМ l87G 1% /mnt/weЫ
Команды mount, umount, swapon и fsck читают содержимое файла fstab, поэтому
желательно, чтобы представленные в этом файле данные были правильными и полными.
Команды mount и umount используют этот файл, чтобы выяснить, что мы хотим, ука
зывая в командной строке только имя раздела или точку монтирования. Например, при
конфигурации файла fstaЬ в системе Linux, приведенной далее, команда
$ sudo mount /media/cdrornO
эквивалентна следующей команде.
# Device
/dev/gpt/rootfs
FreeBSD является
Mountpoint
/
FStype
uf s
наиболее традиционным из наших
примеров систем. Рассмотрим его записи для системы, имеющей только
одну файловую систему, смонтированной под корневой файловой системой
(/spare).
Options
rw
Dump
1
Pass#
1
/dev/gpt/swap-a none swap sw о о
/dev/gpt/swap-b none swap sw о о
fdesc /dev/fd fdescfs rw о о
proc /proc procf s rw о о
/dev/gpt/spare /spare ufs rw о о
Первое поле содержит имя устройства. Файл fstaЬ может содержать точки монтиро
вания, находящиеся в удаленных системах. В этом случае первое поле содержит путь N FS.
Обозначение server: /export означает каталог /export на машине с именем server.
Второе поле задает точку монтирования, а третье - тип файловой системы. Точное
название типа, идентифицирующего локальные файловые системы, зависит от конкрет
ной машины.
Четвертое поле задает опции команды mount, которые должны применяться по умол
чанию. Существует множество возможностей; опции, общие для всех типов файловых
систем, можно найти на справочной странице для команды mount. Отдельные файло
вые системы обычно имеют собственные опции.
Пятое и шестое поля являются рудиментарными. Предположительно они задавали
"частоту создания копии" и параметр управления параллельным выполнением команд
fsck.. Ни одна из этих возможностей в современных системах не актуальна.
Устройства, указанные для файловых систем /dev/fd и /proc, являются фиктивны
ми элементами. Эти виртуальные файловые системы зависят от конкретной операци
онной системы и не требуют дополнительной информации для монтирования. Другие
15 0пция noauto команды mount исключает указанную файловую систему из процесса автомати
ческого монтирования с помощью команды mount -а.
Глава 20. дисковая память 783
д11я вывода таблицы разделов соответствующего диска. Чтобы установить метку для раз
дела, используйте команду
Файловые системы UFS также имеют собственные метки, и они отображаются в ка
талоге /dev/ufs. Метки UFS и метки разделов являются разными, но им можно (и,
вероятно, следует) присвоить одинаковые значения. В этом примере файловая система
/dev/ufs/spare будет работать так же, как /dev/gpt/spare. Чтобы определить теку
щую метку файловой системы, выполните команду
tunefs -р устройство
16 Предупреждение: таблицы разделов иногда называются метками диска. Убедитесь. что при чте
нии документации вы различаете метку отдельного раздела и метку самого диска. Перезапись таб
лицы разделов диска потенциально катастрофична.
784 часть 111. Хранение данных
Монтирование USВ-накопителя
Применение устройств USB весьма разнообразно: например, персональные флешки,
цифровые фото и видеокамеры, большие внешние диски. Большинство из них поддер
живается в системах семейства UNIX в качестве накопителей данных.
В прошлом для управления USВ-накопителями приходилось прибегать к специ
альным трюкам. Однако в настоящее время, когда операционные системы реализуют
управление динамическими устройствами в качестве фундаментального требования,
USВ-накопители представляют собой просто еще один тип накопителей, которые по
являются и исчезают без предупреждения.
С точки зрения управления с USВ-накопителями связаны следующие проблемы.
Включение подкачки
Как правило, в качестве области подкачки используются разделы диска или логиче
ские тома, а не структурированные файловые системы. Вместо использования файловой
системы для слежения за содержимым области подкачки, ядро поддерживает собствен
ное упрощенное отображение блоков памяти в блоки области подкачки.
В некоторых системах можно выполнять подкачку с помощью файла, находящегося в
разделе файловой системы. В старых операционных системах эта конфигурация может ра
ботать мед.леннее, чем при использовании специального раздела подкачки, но в некоторых
случаях это бывает очень удобным. В любом случае с помощью менеджера логических то
мов можно решить большинство проблем, по которым вам может понадобиться использо
вать файл подкачки, а не том подкачки.
Чем больше область подкачки, которую вы используете, тем больше виртуальной памя
ти могут занимать ваши процессы. Максимальная производительность виртуальной памяти
достигается, когда область подкачки разделена между несколькими физическими накопите
лями. Разумеется, лучше всего вообще не использовать подкачку; если вам необходимо оп
тимизировать производительность подкачки, лучше подумайте об увеличении оперативной
памяти компьютера.
Конкретный размер области подкачки зависит о того, как используется компьютер. Нет
ничего плохого в том (кроме потери дисковой памяти), что будет соз~~ан большой раз~~ел для
подкачки. Но, как правило, размер области подкачки должен составлять половину размера
оперативной памяти компьютера и не быть меньше 2 Гбайт.
Если система может работать в спящем режиме (как правило, на персональных компью
терах), она должна иметь возможность сохранять все содержимое памяти в области под
качки, кроме сохранения страниц при обычной работе. На этих машинах следует увеличить
размер области подкачки, рекомендованный выше, на объем оперативной памяти.
Глава 20. дисковая память 785
больше памяти, вам нужен больший экземпляр сервера. С другой стороны, для неболь
ших экземпляров серверов обычно назначаются настолько скудные объемы оператив
ной памяти, что они могут только едва загрузиться без использования области подкачки.
Поэтому, как правило, следует вьщелять место для области подкачки для любых экзем
пляров серверов, если только вы не планируете его использовать для других целей, либо
вам не нужно за него платить. Кякой бы подход вы ни выбрали, проверьте свои базовые
образы, чтобы узнать, как они настроены. Некоторые из них поставляются с предвари
тельно настроенной подкачкой, а некоторые нет.
Некоторые экземпляры Amazon ЕС2 поставляются с локальным хранилищем экзем
пляров. Это, по сути, кусок локального жесткого диска на машине, на которой запущен
гипервизор. Содержимое хранилища экземпляров не сохраняется между сеансами ра
боты. Это пространство входит в цену экземпляра, поэтому вы можете использовать ее
для пространства подкачки, если нет ничего другого.
Обнаружение ошибок
Файловые системы ZFS и Btrfs также воспринимают целостность данных гораздо
более серьезно, чем традиционные файловые системы. В этих системах хранятся кон
трольные суммы для каждого дискового блока, и в них проверяются все прочитанные
блоки, чтобы убедиться, что получены корректные данные. В пулах хранения, которые
поддерживают зеркалирование или контроль по четности, испорченные данные автома
Производительность
Все традиционные файловые системы, которые по-прежнему широко используются,
имеют схожую производительность. Можно создать рабочие нагрузки, при которых одна
файловая система имеет преимущество, но тесты общего назначения редко показывают
большую разницу.
17 Интересно отметить, что одним из ключевых результатов этого исследования было то, что жест
кие диски корпоративного уровня на порядок меньше подвержены этим ошибкам.
18Связанная, а также недооцененная проблема - это риск случайных ошибок в оперативной па
мяти. Они нечастые, но они действительно происходят. Все производственные серверы должны
использовать (и контролировать!) память с коррекцией ошибок (error correction code - ЕСС).
Глава 20. дисковая память 787
Архитектура ZFS
На рис. 20.3 показаны основные объекты в системе ZFS и их отношения друг с другом.
Пул системы ZFS аналогичен группе томов в других системах с механизмами управле
ния логическими томами. Каждый пул состоит из виртуальных устройств, представляю
щих собой накопители (диски, разделы, устройства SAN и так далее), группы зеркал или
массивов RAID. Массив ZFS RAID по существу похож на массив RAID 5 тем, что в нем
используется одно или несколько устройств хранения четности для обеспечения избыточ
ности массива. Однако в системе ZFS эта схема называется RAID-Z и в ней используется
последовательность логических сегментов переменных размеров, чтобы исключить появ
ление "дырки при записи RAID 5''. Все операции записи в пул хранения распределяются
по виртуальным устройствам пула, поэтому пул, содержащий только отдельные накопите
ли, по существу представляет собой схему RAID О, хотя накопители в этой конфигурации
не обязаны иметь одинаковые объемы.
К сожалению, текущая версия массива ZFS RAID имеет недостатки. Например,
в ней невозможно ни добавить новые устройства в массив после того, как он был опре
делен, ни удалить устройство ZFS. Как и в большинстве реализаций массива RAID, на
копители в нем должны иметь одинаковые объемы; вы можете заставить систему ZFS
принять накопители переменных объемов, но общий размер массива будет определяться
по наименьшему объему накопителя. Для того чтобы эффективно использовать диски
переменных объемов в сочетании со схемой ZFS RAID, необходимо заранее разбить ди
ски на разделы и определить оставшиеся области в качестве отдельных устройств.
Большая часть работы по настройке системы ZFS и управлению ею выполняется по
средством двух команд: zpool и zfs. Команда zpool используется для создания пулов
хранения и управления ими, а команда zfs предназначена для создания сущностей,
возникших из пула, в основном файловых систем и томов, используемых в качестве об
ласти подкачки, хранилищ баз данных, и поддержки томов SAN.
19 История ZFS - интересный случай, когда лицензия GPL активно препятствует разработке паке
та программного обеспечения с открытым исходным кодом и блокирует его принятие пользовате
лями и дистрибьюторами. Если вас интересуют юридические данные, почитайте новости Ричарда
Фонтаны (Richard Fontana) за 2016 r. на сайте goo.gl/PC9i3t.
Глава 20. дисковая память 789
Виртуальные устройства
-.
Разделы
t
Накопители
$ ls -а /demo
Пример был бы еще более впечатляющим, если бы мы могли просто добанить но
вый диск в существующий пул хранения корневого диска, который по умолчанию на
зывается zroot. (Эта команда могла бы выглядеть так: sudo zpool add zroot adal.) К
сожалению, корневой пул может содержать только одно виртуальное устройство. Тем не
менее остальные пулы допускают безболезненное расширение.
20 Столбец REFER содержит объем данных в активной копии каждой файловой системы. Файловые
системы / demoи / demo/new_ fs имеют близкие значения REFER, поскольку обе они пустые, а не
потому что между ними существует какая-то связь.
21 Параметры reservation и quota учитывают весь объем дисковой памяти, занимаемый файловой
системой, включая пространство, занятое мгновенными копиями. Если вы хотите ограничить раз
мер только активной копии файловой системы, следует использовать параметры refreservation
и refquota. Префикс ref означает "объем данных, на которые ссьшается файловая система".
Именно это значение показано в столбце REFER в результатах работы команды zfs list.
Глава 20. дисковая память 791
С другой стороны, в реальной жизни существует очень мало причин для такой на
стройки файловой системы. Эти свойства следует использовать только для демонстра
ции возможностей системы учета памяти в ZFS и чтобы подчеркнуть, что система ZFS
при необходимости может быть совместимой с традиционной моделью.
Наследование свойств
Многие свойства естественным образом наследуются дочерними файловыми систе
мами. Например, если мы хотим смонтировать корень пула файловой системы demo
в каталоге
/opt/demo, а не /demo, можно просто задать соответствующий параметр
mountpoint.
$ sudo zfs set шountpoint=/mnt/demo dешо
$ zfs list -r demo
NAME USED AVAIL REFER MOUNTPOINT
demo l.OOG 944G 96К /mnt/demo
demo/new_fs 96К 1024М 96К /mnt/demo/new_fs
$ ls /mnt/deшo
new fs
Параметр mountpoint автоматически демонтирует файловые системы, а изменение
точки монтирования влияет на дочерние файловые системы предсказуемым и очевид
ным образом. Обычные правила, касающиеся файловой системы, тем не менее, остают
ся в силе (см. раздел 5.2).
Для того чтобы увидеть действительное значение конкретного свойства, использует
ся команда zfs get, а команда zfs get all выводит список значений всех параметров.
Столбец SOURCE содержит информацию, объясняющую, почему каждое свойство имеет
конкретное значение: слово local означает, что свойство было задано явно, а дефис -
что свойство предназначено только для чтения. Если значение свойства унаследовано
от родительской файловой системы, то в столбце SOURCE будут указаны детали того на
следования.
указать, какие именно свойства нас интересуют, их можно указать с помощью опции -о
команды zfs list.
Поскольку нет никакого смысла задавать явно значения свойств used и дру
гих свойств, связанных с объемом, эти свойства предназначаются только мя чтения.
Если конкретные правила вычисления значения свойства used вас по каким-то при
чинам не устраивают, возможно, следует использовать другие свойства, такие как
usedbychildren и usedbysnapshots, чтобы увидеть, как расходуется дисковая память.
Для собственного использования и создания локальных сценариев можно задавать
дополнительные, нестандартные свойства файловых систем. Процесс их задания ничем
не отличается от задания стандартных свойств. Имена пользовательских свойств долж
ны содержать двоеточие, чтобы отличать их от стандартных свойств.
~!. zfs. 22 Одно это сэкономит администратору много времени, поскольку пользова
тели смогут самостоятельно обслуживать свои потребности в восстановлении файлов.
22 Этот каталог по умолчанию является скрытым; он не появляется среди результатов работы ко
манды ls -а. Его можно сделать видимым с помощью команды zfs set snapdir=visiЫe
файловая_ система.
Глава 20. дисковая память 793
Для рекурсивного создания мгновенных копий используется команда zfs snapshot -r.
Ее эффект эквивалентен выполнению команды zfs snapshot ДllЯ каждого ООьекта по от
дельности. При этом ДllЯ каждого подкомпонента будет создана собственная мгновенная
копия. Все мгновенные копии имеют одинаковые имена, но с логической точки зрения они
отличаются друг от друга, поскольку их часть файловая_ система будет другой.
Мгновенные копии в системе ZFS предназначены только для чтения, несмотря
на определенные свойства, они все же не являются файловыми системами в подлинном
смысле. Однако вы можете инициировать мгновенную копию как полноценную и до
пускающую запись файловую систему, "клонировав" ее.
лю назад, в виде новой файловой системы, применение команды zfs rename к старой
файловой системе и команды zfs rename - к клону, заменяющему исходную файловую
систему.
Полезно также применить к клону команду zfs promote; эта операция инвертирует
отношения между клоном и оригиналом файловой системы. После активации основная
файловая система имеет доступ ко всем старым мгновенным копиям файловой системы,
а старая файловая система становится "клонированным" ответвлением.
аdаЗ ONLINE о о о
mirror-1 ONLINE о о о
ada4 ONLINE о о о
ada5 ONLINE о о о
23 8 данном примере диски имеют одинаковые размеры, а виртуальные устройства нет (2 Тбайт
против 1 Тбайт).
24 "Butter face" на сленге означает "девушка с красивой фигурой, но некрасивым лицом". - При
меч. ред.
Глава 20. дисковая память 797
• Файловая система Btrfs является явным победителем, когда дело доходит до изме
нения конфигурации вашего оборудования; ZFS даже не пытается соревноваться
в этом. Вы можете добавлять или удалять диски в любое время или даже изменять
тип RAID, а система Btrfs соответственно перераспределяет существующие дан
ные, оставаясь в режиме онлайн. В системе ZFS такие изменения, как правило,
невозможны без копирования данных на внешние носители и их повторной пере
записи.
на самом деле используются. Эrо не такая жесткая структура, как политика, которая бу
дет реализована на уровне групп блоков.
Это различие является ключом к пониманию того, как файловая система Btrfs может
адаптироваться к изменяющимся требованиям и замене оборудования. Вот что проис
ходит, когда мы храним некоторые файлы в новой файловой системе, а затем добавляем
третий диск.
$ mkdir /mnt/demo/usr
$ cd /usr; tar cf - . 1 (cd /mnt/demo/usr; sudo tar xfp -)
$ sudo btrfs device add /dev/sdd /mnt/demo
$ sudo btrfs filesystem usaqe /mnt/demo 25
Overall:
<пропущено для экономии места>
Unallocated:
/dev/sdb 973.99GiB
/dev/sdc 973.99GiB
/dev/sdd 978.00GiB
Новый диск / dev / sdd стал доступным для пула, но существующие группы бло
ков остались на своих местах, так как ни в одном из них не используется новый диск.
Будущие операции выделения памяти автоматически воспользуются новым диском.
При необходимости, мы можем заставить файловую систему Btrfs равномерно распреде
лить данные по всем дискам.
25 Подкоманды команды btrfs могут быть сокращены до любого уникального префикса. Напри
мер, вместо команды btrfs filesystem usaqe можно использовать ее сокращенный вариант:
btrfs f u. Для ясности мы используем полный вариант команды.
800 Часть 111. Хранение данных
Тома и подтома
Мгновенные снимки и квоты являются объектами уровня файловой системы Btrfs,
поэтому полезно иметь возможность определять части дерева файлов как разные объ
екты. Система Btrfs называет эти части "подтомами". Подтом очень похож на обычный
каталог файловой системы, и на самом деле он остается доступным как подкаталог его
родительского тома, как показано ниже.
сколько путей.
Снимки тома
Версия моментальных снимков Btrfs работает так же, как и команда ер, за исключе
нием того, что копии являются поверхностными и изначально сохраняются в хранили
ще родительского тома.
ваемыми копиями, как это делает система ZFS. (В ZFS записываемые копии являют
ся клонами. Чтобы создать такой клон, сначала создается снимок только для чтения,
а затем клон на основе этоrо моментального снимка.) Система Btrfs не применяет ка
кие-либо конкретные соrлашения об именах или местоположении, коrда дело доходит
до определения подтомов и моментальных снимков, поэтому вам решать, как эти сущ
$ ls /mnt/demo/suЬ
another - file file - in- а - subvolume
$ sudo mv /mnt/demo/suЬ /mnt/demo/suЬ.old
$ sudo btrfs suЬvolume snapshot /mnt/demo/suЬ snap /mnt/demo/suЬ
Create а snapshot of '/mnt/demo/sub_snap' in 7 /mnt/demo/sub'
$ ls /mnt/demo/suЬ
file in а subvolume
Обратите внимание на то, что это изменение мешает прямому монтированию под
тома. После этого его нужно будет перемонтировать.
Поверхностные копии
Аналогия между моментальными снимками Btrfs и командой ер больше, чем про
сто совпадение. Невозможно создавать моментальные снимки в чистом виде для фай
лов или каталогов, которые не являются корнями подтома. Но, что интересно, можно
создавать поверхностные копии произвольных файлов и каталогов с помощью команды
ер --reflink, даже пересекая границы подтома.
Эта опция активизирует специфичный для системы Btrfs механизм команды ер, ко
торая напрямую связывается с файловой системой, чтобы организовать дублирование
записи с копированием. Ее семантика идентична семантике обычной команды ер и так
же очень напоминает семантику моментального снимка.
Общая стратеrия
• Будут ли зашифрованы резервные копии? Если да, где будут храниться ключи
шифрования?
Хронологическая стратеmя
Персонал
• Кто будет иметь доступ к ключам шифрования, которые защищают данные ре
зервного копирования?
Использование и защита
20.15. ЛИТЕРАТУРА
• L11cдs, Мrсндн. W., AND ALLAN JuoE. FreeBSD Mastery: ZFS. lilted Windmill Press, 2015.
• JuDE, ALLAN, AND МrсндЕL W. Lucдs. FreeBSD Mastery: Advanced ZFS. lilted Windmill
Press, 2016.
Две упомянутые выше книги - современные справочники по ZFS. Хотя они
и ориентированы на специфику системы FreeBSD, большинство материалов от
носится также к ZFS в системе Linux. Книга Advanced ZFS особенно полезна осве
щением таких разнообразных тем, как механизм Jail, делегирование полномочий,
стратегии кеширования и анализ производительности.
• Lucдs, MrcHAEL W., AND ALLAN JuDE. FreeBSD Mastery: Storage Essentials. lilted Windmill
Press, 2015.
• McKtJsrcк, MдRSHALL KrRк, GEORGE У. №v1LLE-№1L, AND RoвERT N. М. WдтsoN.
The Design and lmplementation о/ the FreeBSD Operating System (2nd Edition). Upper
Saddle River, NJ: Addison-Wesley Professional, 2014. В этой книге рассматриваются
различные темы, связанные с ядром, но в них содержатся также полные главы
Протокол сетевой файловой системы (Network File System, или N FS)" позволяет
пользователям совместно работать с файлами, расположенными на разных компьютерах.
Протокол NFS почти прозрачен для пользователей, т.е. при сбое сервера, поддерживаю
щего протокол NFS, информация не пропадает. Клиенты просто ждут, когда сервер вновь
начнет функционировать, а затем продолжают работать так, будто ничего не произошло.
Протокол NFS разработала компания Sun Microsystems в 1984 году. Первоначально
протокол NFS был реализован как суррогат файловой системы для бездисковых клиентов,
однако предложенный протокол оказался столь удачным, что со временем стал универ
сальным решением проблемы совместного использования файлов. Все дистрибутивные
пакеты систем UNIX и Linux содержат версию протокола NFS; многие из них используют
лицензию компании Sun. В настоящее время протокол NFS является открытым стандар
том и описан в документах RFC (см. RFC 1094, RFC 1983 и особенно RFC 7530).
Конкуренция
NFS - не единственная система совместного использования файлов. Существует про
токол Server Message Block (SMB), встроенный в операционные системы Windows и macOS
и предназначенный для этой же цели. Однако протокол SMB также может использоваться
и в системах UNIX и Linux, если запустить дополнительный пакет Samba. Если вы запу
скаете гибридную сеть, которая включает в себя множество различных операционных си
стем, то можете обнаружить, что протокол SMB обеспечивает наилучшую совместимость.
Проблемы производительности
Пользовательский интерфейс сетевых файловых систем не должен отличаться
от пользовательского интерфейса локальных файловых систем. К сожалению, глобаль
ные сети имеют большое время ожидания, что приводит к неправильному выполнению
операций и падению скорости передачи данных. Все это в итоге приводит к снижению
производительности работы с большими файлами. В большинстве протоколов файло
вых служб, включая NFS, реализованы методы минимизации потерь в производитель
ности как в локальных, так и глобальных сетях.
В большинстве протоколов пытаются минимизировать количество запросов в сети.
Например, стратегия упреждающего кеширования предусматривает загрузку фрагмен
тов файла в локальный буфер памяти, чтобы избежать задержки при считывании нового
раздела файла. Часть полосы пропускания сети используется для того, чтобы избежать
задержки при двухстороннем обмене данными с сервером.
Кроме того, в некоторых системах операции записи данных кешируются в памяти, и
в пакетах посылаются только их обновления, уменьшая тем самым задержку, вызванную
необходимостью выполнить операции записи на сервере. Эти пакетные операции обыч
но называют объединением запросов (request coalescing).
Безопасность
Любая служба, предоставляющая удобный доступ к файлам в сети, является ис
точником серьезных угроз для безопасности. Локальные файловые системы реализуют
сложные алгоритмы управления доступом, наделяя пользователей разными правами.
В сети эти проблемы многократно усложняются, поскольку существуют требования,
предъявляемые к быстродействию машин, а также имеются различия между их конфи
гурациями, ошибки в программном обеспечении файловых систем и нерешенные во
просы, связанные с протоколами совместного использования файлов.
Развитие служб каталогов и централизованной аутентификации повысило безопас
ность сетевых файловых систем. По существу, ни один клиент не может аутентифици
ровать себя самостоятельно, поэтому необходима доверенная централизованная систе
ма, верифицирующая личности и предоставляющая им доступ к файлам. Большинство
служб совместного использования файлов могут быть интегрированы с разнообразными
провайдерами аутентификации.
Протоколы совместного использования файлов обычно не затраrивают проблемы
конфиденциальности и целостности - или по крайней мере они не делают этого на-
808 Часть 111. Хранение данных
цвета Sun, достигла состояния чернового стандарта RFC в начале 2015 r. Служба Elastic
File System от AWS, которая стала общедоступной в середине 2016 r., позволяет исполь
зовать файловые системы NFSv4.1 в экземплярах ЕС2.
Хотя версия 4 протокола NFS во многих отношениях и является значительным ша
гом вперед, в ней не сильно изменен процесс настройки и администрирования клиентов
и серверов. В некотором смысле это ее особенность; например, до сих пор используются
одни и те же файлы конфигурации и команды дпя администрирования всех версий про
токола N FS. С другой стороны, это проблема; некоторые аспекты процесса настройки
явно являются импровизацией (особенно в системе FreeBSD), а некоторые функции
оказались неоднозначными или перегруженными, с разным смыслом или форматами
файлов конфигурации в зависимости от того, какую версию N FS вы используете.
Транспортные протоколы
В версии NFS 2 применялся протокол UDP, поскольку он обеспечивал наилучшую
скорость работы в локальных сетях 80-х годов. Несмотря на то что протокол NFS сам
выполняет сборку пакетоо и осуществляет контроль ошибок, ни в UDP, ни в NFS не
реализованы алгоритмы упрамения перегрузкой, которые необходимы для достижения
хорошей производительности о крупных IР-сетях.
Для решения этих проблем о большинстве UNIХ-систем теперь разрешено использо
вать в качестве транспортного протокола в версии NFS 3 как UDP, так и ТСР, а в версии
NFS 4 - только ТСР. 2 Пероона•1ально эта возможность предназначалась для обеспечения
работы N FS в сетях с маршрутизаторами и в Интернете. По мере удешевления оператив
ной памяти и роста производительности центральных процессоров и сетевых контроме
ров первоначальное преимущество протокола UDP над протоколом ТСР испарилось.
Состояние
Прежде чем начать работать с файловой системой N FS, клиент должен ее смонтиро
вать, как если бы это была файловая система, находящаяся на локальном диске. Однако
в версиях N FS 2 и 3 не сохраняется состояние, поэтому сервер не "знает", какие клиен
ты смонтировали ту или иную файловую систему. Вместо этого сервер вручает клиенту
секретный ключ по факту успешного завершения операции монтирования. Этот ключ
идентифицирует каталог монтирования на сервере N FS и дает клиенту возможность
получить доступ к содержимому каталога. Ключ сохраняется при перезагрузке, чтобы
сервер после сбоя смог оернуться в предыдущее состояние. Клиент может просто подо
ждать, пока сервер перезагрузится, и повторить свой запрос.
С другой стороны, оерсия N FSv4 представляет собой протокол с сохранением состо
яния: и клиент, и сервер хранят информацию об открытых файлах и блокировках. При
сбое сервера клиент облегчает процесс восстановления, посылая на сервер информацию
о состоянии, предшествующем сбою. Восстанавливающийся сервер ожидает в течение за
данного периода отсрочки, пока бывшие клиенты отчитаются о своем предьщущем состо
янии, прежде чем приступить к оыполнению новых операций и блокирооок. Управления
ключами, которое существовало о оерсиях V2 и VЗ, в версии NSFv4 больше нет.
t domainl
domain2
Так это выглядит с точки зрения спецификации RFC. Однако на практике ситуация
несколько размыта. С одной стороны, реализация системы Solaris соответствовала этой
спецификации. С другой стороны, разработчики операционной системы Linux сделали
половинчатую попытку поддержки псевдофайловой системы в раннем коде NFSv4, но
позже переработали ее, чтобы полностью поддерживать схему; сегодняшняя версия, по
хоже, учитывает цели RFC. Система FreeBSD не реализует псевдофайловую систему, как
описано в спецификации RFC. Семантика экспорта FreeBSD по существу такая же, как и
в версии 3; все подкаталоги внутри экспортируемых доступны для клиентов.
Блокировка файлов
Блокировка файлов (реализуемая системными вызовами flock, lockf или fcntl)
в течение долгого времени была слабым звеном в системах UN IX. В локальных файло
вых системах этот механизм был воплощен далеко не идеально. В ранних версиях про
токола NFS серверы не сохраняли состояние: им не известно, какие компьютеры ра
ботают с конкретным файлом. Однако эта информация необходима для использования
блокировок. Что же делать'!
812 Часть 111. Хранение данных
Вопросы безопасности
Во многих аспектах версии 2 и 3 протокола N FS были типичными наследниками
всех недостатков, касающихся вопросов безопасности в системах UNIX и Linux. Этот
протокол изначально не предполагал никаких мер безопасности, и благодаря этому он
был удобным. Версия NFSv4 устранила дефекты системы безопасности, которые были
присущи предыдущим версиям, обеспечив сильную поддержку службам безопасности
и внедрив более совершенную идентификацию пользователей.
Все версии протокола NFS не зависят от механизма, обеспечивающего безопасность
работы в сети, и большинство серверов поддерживают разные режимы аутентификации.
Некоторые из этих режимов перечислены ниже.
1 Или его эквивалента в виде сетевой базы данных, такой как NIS или LDAP.
Глава 21. Сетевая файловая система NFS 813
ции, описанной выше. Кроме того, протокол Kerberos обеспечивает сильное шифрова
ние и гарантирует целостность файлов, передаваемых по сети. Все системы, поддержи
вающие протокол NFS версии 4, должны реализовать режим RPCSEC GSS, в то же время
в версии 3 это требование не является строгим.
[ben@nfs-client]$ id john
uid=lOlO{john) gid=lOlO{john) groups=lOlO(john)
Производительность версии 4
Протокол NFSv4 был разработан для того, чтобы обеспечить высокую производи
тельность в глобальных сетях. Большинство глобальных сетей имеет более высокую за
держку и меньшую скорость передачи данных, чем локальные сети. Протокол NFS дол
жен был решить эти проблемы с помощью следующих усовершенствований.
4 На сервере
NFS в системе Red Hat стандартное значение UID равно -2, тогда как в файле passwd
учетной заnиси nobody nрисвоен идентификатор 99. Можно оставить все как есть, но добавить в
файл passwd заnись с идентификатором -2 или задать nараметры anonuid и anong id равными 99.
Это действительно все равно! В некоторых системах nрисутстиует также учетная заnись nfsnobody.
816 Часть 111. Хранение данных
позволяет смонтировать каталог /home ДJIЯ чтения и записи на всех машинах в домене
users. adтin. сот, и только ДJIЯ чтения на всех машинах в сети 172.17.0.0/24 класса С.
Если система в домене users. adтin. сот находится в сети 172.17.0.0/24, ее клиент по
лучает доступ только ДJIЯ чтения. Действует правило наименьшей привилегии.
Файловые системы, перечисленные в файле exports без указания конкретных
хостов, монтируются на всех компьютерах, что является значительной брешью в си
стеме безопасности.
Такую же брешь можно создать, случайно неправильно расставив пробелы.
Например, строка
Опция Описание
ro Экспорт только для чтения
rw Экспорт для чтения и записи (по умолчанию)
rw=список Экспорт преимущественно для чтения; в списке перечисляются хосты, кото
рым разрешено монтировать файловую систему для записи; остальные долж
ны монтировать ее только для чтения
•Эта опция полезна для поддержки персональных компьютеров и других ненадежных однопользовательских хостов.
обратная
косая черта означает продолжение строки.
Вариант Описание
alldirs Позволяет монтировать разделы в любой точке файловой системы
ro Экспорт только для чтения (чтение-запись по умолчанию)
о Синоним для ro; экспортировать только для чтения
maproot=xxx Имя пользователя или идентификатор UID для отображения удаленного пользова
теля root
mapall=xxx Отображает всех пользователей клиента на указанного пользователя (например,
maproot)
sес=режим Задает допустимые режимы безопасности•
•Укажите несколько вариантов режимов безопасности в списке, разделенном запятыми, в порядке предпочтения.
Возможными значениями являются sys (аутентификация UNIX, значение по умолчанию), krb5 (аутентификация
Kerberos), krb5i (аутентификация и проверка целостности Kerberos), krb5p (аутентификация Kerber·os, проверка
целостности и обеспечение конфиденциальности) и none (анонимный доступ, не рекомендуется).
;демон nfsd всего лишь выполняет не предусматривающий возврата системный вызов сервера
N FS, код которого встроен в ядро.
Глава 21. Сетевая файловая система NFS 821
Тdблица 21.4. Системные файлы конфигурации р,ля настройки параметров демона nfsd
Система Файл конфигурации Параметр
FreeBSD
-maxthreads
обеспечивают автоматическое управление количеством потоков в указанных
команды
NFS
nfsd
откройте
и найдите описание па
822 Часть 111. Хранение данных
Для того чтобы сделать то же самое в версии 4 под управлением системы Linux, вы
полните следующую команду.
В данном случае указанные после опции -о флаги говорят о том, что файловая систе
ма монтируется в режиме чтения-записи (rw), файловые операции разрешается прерывать
(intr), а повторные попытки монтирования должны выполняться в фоновом режиме (Ьq).
Наиболее распространенные флаги команды mount в системе Linux приведены в табл. 21.5.
глава 21. сетевая файловая система NFS 823
hard Если сервер отключился, операции, которые пытаются получить к нему доступ,
блокируются до тех пор, пока сервер не включится вновь
soft Если сервер отключился, операции, которые пытаются получить к нему доступ,
завершаются выдачей сообщения об ошибке. Этот флаг полезно устанавливать
для того, чтобы предотвратить зависание процессов в случае неудачного
монтирования не очень важных файловых систем
intr Позволяет прерывать с клавиатуры заблокированные операции (будут выдаваться
сообщения об ошибке)
nointr Не позволяет прерывать с клавиатуры заблокированные операции
retrans=n Указывает, сколько раз нужно повторить запрос, прежде чем будет выдано
сообщение об ошибке (для файловых систем, смонтированных с флагом soft)
timeo=n Задает интервал тайм-аута для запросов (в десятых долях секунды)
rsize=n Задает размер буфера чтения равным п байт
wsize=n Задает размер буфера записи равным п байт
sес=режим Задает режим безопасности
nf svers=n Задает версию протокола NFS
рrоtо=протокол Выбирает транспортный протокол; им должен быть протокол tcp для версии NVS 4
''джефф Форис (JefТ Forys), один из наших рецензентов, заметил no этому поводу: "Большинство
сетевых файловых систем должно монтироваться с флагами hard, intr и bg, поскольку они шш
лучшим образом соответствуют исходной концепции NFS (надежность и отсутствие информ~шии
о состоянии). Флаг soft - это мерзкий сатанинский трюк! Если пользователь пожелает прервать
операцию монтирования, пусть он сделает это сам. В противном случае следует дождаться включе
ния сервера. и все в конце концов нормализуется без какой бы то ни было потери данных".
824 Часть 111. Хранение данных
вание флага intr позволяет сократить число проблем, связанных с NFS. Исправить не
которые недостатки монтирования позволяют средства автоматического монтирования,
$ df /nf s/ben
Filesystem lk-Ьlocks Used AvailaЫe Use% Mounted on
leopard:/home/ben 17212156 1694128 14643692 11% /nfs/ben
Разделы NFS размонтируются командой umount. Если сетевая файловая система
кем-то используется в момент размонтирования, будет выдано сообщение об ошибке,
показанное ниже.
Выполнив команду mount -а -t nfs, можно сделать так, чтобы изменения вступи
ли в силу немедленно (без перезагрузки).
Параметры монтирования файловой системы NFS задает поле flags в файле fstab;
это те же самые параметры, которые необходимо указывать в команде mount.
7 Устройство занято.
Глава 21. Сетевая файловая система NFS 825
$ nfsstat -с
Client rpc:
calls badcalls retrans badxid timeout wait newscred timers
64235 1595 о 3 1592 о о 886
Client nfs:
826 Часть 111. Хранение данных
В среде AWS служба Elastic File System является масштабируемым сервером NFSv4.1,
который экспортирует файловые системы в экземпляры ЕС2. Каждая файловая система
Глава 21. Сетевая файловая система NFS 827
users harp:/harp/users
devel -soft harp:/harp/devel
info -ro harp:/harp/info
В первом столбце указывается имя подкаталога, в котором будет смонтирована фай
ловая система. В следующих столбцах перечислены опции монтирования и приведен ис-
"Таблицы прямых назначений могут поддерживаться с помощью базы данных N IS или сервером
каталогов LDAP, но это сложно.
''С другой стороны, монтирование файловой системы занимает определенное время. Система от
вечает быстрее и плавнее, если файловые системы не монтируются непрерывно.
глава 21. Сетевая файловая система NFS 829
/usr/src harp:/usr/src
/cs/tools -ro monk:/cs/tools
Поскольку у этих файловых систем нет общего родительского каталога, их монтиро
вание должно реализовываться по отдельности. Эта конфигурация требует дополнитель
ных расходов, но ее преимуществом является то, что точка монтирования и структура
каталогов всегда остаются доступными таким командам, как ls. Применяя команду ls
к каталогу, содержащему таблицы косвенных назначений, пользователи могут запутать
ся, потому что программа automount не показывает подкаталоги, пока не получит до
ступ к их содержимому (команда ls не заглядывает внутрь каталогов, смонтированных
автоматически, поэтому она не может вызвать их монтирование).
Главные таблицы
Главный файл содержит список таблиц прямых и косвенных назначений, которые
должна учитывать программа automount. Для каждой таблицы косвенных назначений
указывается корневой каталог, используемый для монтирования, определенного в таблице.
Главная таблица, использующая таблицы прямых и косвенных назначений, упомяну
тых в предыдущих примерах, может выглядеть следующим образом.
# Directory Мар
/harp /etc/auto.harp -proto=tcp
/- /etc/auto.direct
В первом столбце указывается имя локального каталога для таблицы косвенных
назначений или специальный токен /- для таблицы прямых назначений. Во втором
столбце указывается файл, в котором должна храниться таблица. Может существовать
несколько таблиц разного типа. Если параметр монтирования указывается в конце стро
ки, то он по умолчанию применяется ко всем точкам монтирования, указанным в таб
лице. Администраторы системы Linux всегда должны указывать флаг монтирования
-fstype=nfs4 для серверов, использующих четвертую версию протокола NFS.
В большинстве систем параметры, заданные по умолчанию для элементов
главной таблицы, не смешиваются с параметрами, заданными для таблиц
прямых и косвенных назначений. Если элемент главной таблицы имеет свой
собственный список параметров, то значения, заданные по умолчанию, игно
рируются. Тем не менее в системе Linux эти наборы параметров смешивают
ся. Если один и тот же параметр встречается в двух местах, то значение эле
мента главной таблицы заменяет значение, заданное по умолчанию.
830 Часть 111. Хранение данных
Исполняемые таблицы
Если файл, содержащий таблицу косвенных назначений, является исполняемым, то
он считается сценарием (или программой), динамически генерирующим информацию
об автоматическом монтировании. Демон не читает таблицу в текстовом виде, а запу
скает файл на выполнение, передавая ему аргумент ("ключ"), где указывается, к какому
подкаталогу пользователь пытается получить доступ. Сценарий отвечает за вывод соот
ветствующей записи таблицы. Если переданный ключ неверен, сценарий завершается,
ничего не отображая на экране.
Такая методика очень удобна и позволяет компенсировать многочисленные недостат
ки довольно странной системы конфигурирования программы automounter. По сути,
она дает возможность создать единый для всей организации конфигурационный файл
произвольного формата. Можно написать несложный сценарий, декодирующий глобаль
ные конфигурационные параметры на каждом компьютере. В состав некоторых систем
входит удобный сценарий / etc/ auto. net, которому в качестве ключа передается имя
компьютера, а он монтирует все экспортируемые файловые системы этого компьютера.
Поскольку автоматические сценарии запускаются динамически по мере необходимо
сти, нет необходимости распространять главный файл конфигурации после каждого из
менения или предварительно преобразовывать его в формат automounter; Фактически
глобальный файл конфигурации может постоянно храниться на сервере N FS.
чески невозможно. Вместо этого команда ждет ссылки на имена конкретных подкатало
гов, а затем монтирует экспортированные системы с указанного хоста.
21.9. ЛИТЕРАТУРА
Различные спецификации RFC, касающиеся системы NFS, перечислены в табл. 21.7.
Таблица 21.7. Документы RFC, связанные с NFS
RFC Название Автор Дата
1094 Network File System Protocol Specification Sun Mircosystems Май 1989
1813 NFS Version 3 Protocol Specification В. Callaghan et al. Июнь 1995
2623 NFS Version 2 and Version 3 Security lssues M.Eisler Июнь 1999
2624 NFS Version 4 Design Considerations S.Shepler Июнь 1999
3530 NFS Version 4 Protocol S.Shepler et al. Апрель 2003
5661 NFS Version 4 Minor Version 1 Protocol S.Shepler et al. Январь 2010
7862 NFS Version 4 Minor Version 2 Protocol Т. Haynes Ноябрь 2016
глава 22
Файловая система sмв
1Компания Sun Microsystems также вступила в игру в 1996 г" предложив протокол ~bNFS, и ком
пания Microsoft увидела возможность продавать протокол SMB с более удобной реализацией и на
званием.
834 часть 111. Хранение данных
• аутентификацию и авторизацию;
• сетевую печать;
• преобразование имен;
Если вам по-прежнему интересно, зачем использовать SMB, а не, скажем, более ин
тегрированную в систему UNIX удаленную файловую систему, такую как NFS, то ответ
однозначен. Почти все операционные системы поддерживают SMB на определенном
уровне. В табл. 22.1 приведены некоторые основные различия меЖду SMB и NFS.
SMI NFS
Серверы и процессы пользовательского пространства Сервер ядра с потоками
Процессы для каждого пользователя Один сервер (один процесс) для всех клиентов
Использует базовую операционную систему для кон- Имеет собственную систему контроля доступа
троля доступа
[bookshare]
path = /storage/bookshare
read only = no
Здесь клиенты SMB видят монтируемый ресурс с именем \\sambaserver\
bookshare. Это дает доступ к дереву файлов, расположенному в каталоге /storage/
bookshare на сервере.
[homes]
comment Directories
= Ноте
browseaЫe no =
valid users = %S
read only = no
28 прошлом для интеграции Active Directory и пакета Samba использовался демон winЬind. В наши
дни предпочтительным является демон sssd.
1 Этот файл keytaЬ создается демоном sssd, если вы его настроили в соответствии с инструкция
ми из главы 17. Дополнительные сведения о файлах keytaЬ в протоколе Samba см. на сайте goo.
gl/ZxCUКA (глубокая ссылка внутри wiki. samЬa. org).
838 Часть 111. Хранение данных
Переменная %S, указанная как значение valid users в приведенном выше примере,
заменяется на имя пользователя, связанного с каЖдым общим ресурсом; таким образом.
она ограничивает доступ к владельцу домашнего каталога. Удалите эту строку, если такое
поведение сервера SMB для вас нежелательно.
Пакет Samba использует специальный раздел файла конфигурации [homes] в каче
стве последнего средства. Если в рабочем каталоге конкретного пользователя есть явно
определенный общий ресурс в файле конфигурации, параметры, установленные там,
переопределяют значения, установленные в разделе [homes].
4 Или, по крайней мере, он делает это в системе Linux. В системе FreeBSD не устанавливается бит
setgid для каталога; однако поведение no умолчанию заключается в унаследовании rpynnы д,1я
новых файлов, так же, как в Linux это делается с включенным битом setgid. Впрочем, устанонка
бита setgid в системе FreeBSD ничему не вредит.
840 Часть 111. Хранение данных
няются как правило для всей системы в целом. Серверы Windows обычно не допуска
ют, чтобы несколько разных пользователей могли получить доступ к смонтированному
общему ресурсу Windows.
С точки зрения клиента UNIX все файлы в смонтированном каталоге, принадлежат
пользователю, который его смонтировал. Если вы монтируете общий ресурс с права
ми администратора, то все файлы будут принадлежать пользователю root, а остальные
пользователи, возможно, не смогут записывать файлы на сервере Windows.
Параметры монтирования uid, gid, fmask и dmask позволяют настроить эти пара
метры так, чтобы права собственности и биты разрешений бьши более точно согласова
ны с предполагаемой политикой доступа для этого ресурса. Дополнительную информа
цию об этих параметрах можно найти на страницах справочника для команды mount.
cifs (Linux) или mount_smЬfs (FreeBSD).
• Явно указать, какие клиенты могут получить доступ к общим ресурсам SМВ
сервера. Эта часть конфигурации задается параметром hosts allow в файле smЬ.
conf. Убедитесь, что он содержит только необходимые IР-адреса, диапазоны адре
сов или имена хостов.
Глава 22. Файловая система sмв 841
В файл smЬ. conf можно также включить параметр настройки hosts deny, но уч
тите, что директива запрета на доступ к сетевым ресурсам имеет приоритет. Если
вы укажете имя хоста или его адрес как в параметре hosts deny, так и в hosts
allow, указанный хост не сможет получить доступ к ресурсу.
Locked files:
Pid Uid DenyMode R/W Oplock SharePath Name
6130 1035 DENY NONE RDONLY NONE /atrust/admin New Hire Proces ...
6130 1035 DENY ALL RDONLY NONE /home/clay
23006 1009 DENY NONE RDONLY NONE /atrust/clients Acme_Supply/Con ...
842 Часть 111. Хранение данных
Будьте внимательны, когда Windows заявляет, что файлы были заблокированы дру
гим приложением; это часто оказывается правильным предупреждением. Устраните
проблему на стороне клиента, закрыв приложение-нарушитель, а не пытайтесь грубо
снимать блокировки на сервере.
auth.c:292(auth_check_ntlm_password)
check_ntlm_password: РАМ Account for user [dan] succeeded
[2017/04/30 08:45:30.425864, 2, pid=87502, effective(O,
0), real(O, 0), class=auth] .. /source3/auth/
auth.c:305(auth_check_ntlm_password)
check_ntlm_password: authentication for user [dan] -> [dan] -> [dan]
succeeded
Команда smЬcontrol удобна для изменения уровня отладки работающего Samba-
cepвepa без внесения изменений в файл smЬ. conf. Например,
$ sudo sшЬcontrol sшЬd deЬuq "4 auth:lO"
Эта команда устанавливает для глобального уровня отладки значение 4 и устанавли
вает уровень отладки для связанных с аутентификацией вопросов до 10. Аргумент smЬd
указывает, что все демоны smЬd в системе должны иметь установленные уровни отладки.
При отладке конкретного установленного соединения используйте команду smЬstatus,
чтобы определить, какой демон smЬd обрабатывает соединение, а затем передайте его
идентификатор PID в smЬcontrol для отладки только одного соединения.
При уровнях журнала более 100 вы начнете видеть зашифрованные пароли в журналах.
22.7. ЛИТЕРАТУРА
• Rш Нлт. Red Наt Enterprise Linux System Administrator's Guide: File and Print Servers.
goo. gl/LPjNXa (глубокая ссьшка на сайте access. redhat. com/documentation).
• Sлмвл PROJECT. Samba Wiki Page. wiki. samba. org. Эта вики-система обновляет
ся относительно часто и является авторитетным источником информации, хотя ее
части несколько дезорганизованы.
~чтобы узнать, работает ли ваша система в режиме UTF-8, выполните команду echo $LANG.
ЧАСТЬ IV
Эксплуатация
глава 23
Управление конфигурацией
Операции и параметры
Мы уже рассматривали концепцию операций, которые представляют собой мелко
масштабные действия и проверки, используемые системой СМ для достижения опре
деленного состояния. Каждая система СМ содержит большой набор поддерживаемых
операций, который увеличивается с появлением каждой новой версии.
Вот несколько примеров операций, которые все системы СМ могут выполнять без
предварительной подготовки:
торы вручную обновляли хост, управляемый конфигурацией, и делали свои модификации неизме
няемыми, тем самым переопределяя ожидаемое состояние и не позволяя системе СМ применять
будущие модификации. Это приводит к большой путанице, потому что коллеги администратора не
смогут быстро понять, почему ожидаемая конфигурация не применяется к данному хосту. В одном
случае это вызвало большой перерыв в обслуживании.
850 частьlV.Эксплvатация
ции, такие как настройка конкретных баз данных, среды выполнения или даже части
оборудования.
Если операции кажутся подозрительно похожими на команды оболочки, ваша ин
туиция вас не подводит. Это сценарии, обычно написанные на языке реализации самой
системы СМ и использующие стандартные инструменты и библиотеки системы. Во
многих случаях они автоматически запускают стандартные команды оболочки как часть
их реализации.
Так же, как в командах UN[X можно указать ряд параметров, большинству операций
можно передать параметры. Например, операции упрааления пакетами передаются па
раметры, которые определяют имя пакета, версию и должен ли пакет быть установлен
или удален.
Переменные
Переменные - это именованные значения, которые влияют на то, как конфи
гурации применяются к отдельным машинам. Они обычно устанавливают значения
параметров и заполняют пробелы в шаблонах конфигурации.
Управление переменными в системах СМ часто предоставляет много возможностей.
Приведем несколько замечаний по этому поводу.
выше уровня отдельных операций. Например, элементы массива можно перебрать в цикле
для применения одной и той же операции более одного раза с разными параметрами.
Факты
Системы СМ исследуют каждый клиент конфигурации для определения описатель
ных фактов, таких как IР-адрес основного сетевого интерфейса и тип операционной си
стемы. Затем эта информация становится доступной из базы конфигурации через значе
ния переменных. Как и в любой другой переменной, эти значения могут использоваться
для определения значений параметров или для расширения шаблонов.
852 ЧастьlV.Эксплуатация
Обработчики изменений
Если вы изменили конфигурационный файл веб-сервера, вам лучше перезапустить
веб-сервер. Это основная концепция обработчиков, которые являются операциями, вы
полняющимися в ответ на какое-то событие или ситуацию, а не относятся к базовой
конфигурации.
В большинстве систем обработчик запускается, когда одна или несколько опера
ций из заданного набора операций сообщают, что они изменили целевую систему.
Обработчику ничего не говорится о точном характере изменения, но, поскольку связь
между операциями и их обработчиками довольно специфична, дополнительная инфор
мация не требуется.
Привязки
Привязки завершают базовую конфигурационную модель, связывая конкретные на
боры операций с конкретными хостами или группами хостов. Вы также можете связы
вать операции с динамическим набором клиентов, который определяется значением
факта или переменной. Системы СМ также могут определять группы хостов, просмат
ривая информацию в локальной системе управления ресурсами или вызывая удаленную
процедуру согласно интерфейсу API.
В дополнение к основной роли связывания, привязки в большинстве систем СМ так
же действуют как переменные области. Эта функция позволяет настраивать поведение на
значаемых операций, определяя или настраивая значения переменных для целевых кли
ентов. Данный хост может соответствовать критериям для множества разных привязок.
Например, хост может находиться в определенной подсети, управляться определенным
Глава 23. Управление конфигурацией 853
отделом или выполнять явно назначенную роль (например, веб-сервер Apache). Система
СМ учитывает все эти факторы и активирует операции, связанные с каждой привязкой.
После того как вы настроили привязки для хоста, вы можете вызвать механизм "на
строить все" системы верхнего уровня вашей системы СМ, чтобы система СМ иденти
фицировала все операции, которые должны выполняться на целевом хосте, и выпол
нить их по порядку.
Среды
Часто бывает полезно разделить клиенты, управляемые конфигурацией, на несколько
"миров", таких как традиционные категории разработки, тестирования и производства.
Крупные инсталляции могут создавать еще более тонкие различия для поддержки таких
процессов, как постепенное ("ступенчатое") внедрение нового кода в производство.
Эти разные миры, "среды", известны как внутри, так и вне контекста управления
конфигурацией. Кажется, это единственный термин, с которым согласны все системы
упрамения конфигурацией.
При правильной реализации среды - это не просто группы клиентов. Это дополни
тельная ось изменения, которая может помиять на несколько аспектов конфигурации.
Например, среды разработки и производства могут включать веб-серверы и серверы баз
данных, но детали того, как эти роли определены, могут различаться в разных средах.
Например, для базы данных и веб-сервера обычно используется один и тот же ком
пьютер в среде разработки. Однако производственная среда обычно имеет несколько
серверов каждого типа. Производственная среда также может определять типы серверов,
которых нет в среде разработки, например те серверы, которые выполняют балансиров
ку нагрузки или действуют как прокси-серверы в демилитаризованной зоне.
Система окружающей среды обычно рассматривается как своего рода конвейер
для кода конфигурации. В качестве мысленного эксперимента можно себе предста
вить, что фиксированные группы клиентов используют среды разработки, тестирования
и производства. Поскольку данная база конфигурации проверена, она распространяется
от одной среды к другой, обеспечивая должную проверку изменений до того, как они
достигнут важнейших производственных систем.
В большинстве систем СМ разные среды - это разные версии одной и той же кон
фигурации. Если вы являетесь пользователем Git, считайте их тегами в репозитории Git:
тег разработки указывает на самую последнюю версию базы конфигурации, а производ
ственный тег может указывать на фиксацию состояния, которая была сделана несколько
недель назад. Теги продвигаются вперед по мере того, как выпуски проходят через ста
дии тестирования и развертывания.
854 ЧастьlV.Эксnлvатация
Аrент СМ автоматмчшм
Первая заrррка Кямекr загружает аутекrмфицмруетСll
новоrо клиента
м мнстамирует агента и регмстрируеш на
role • 'lfltb
серв~СМ
env1r~t - proouctton
•ERB (embedded Ruby) является основным синтаксисом для встраивания кода Ruby в шаблоны.
Все эти пакеты относительно новые. Самый старый, Puppet, дебютировал в 2005 г.
Он по-прежнему претендует на самую большую долю на рынке, в значительной сте
пени из-за своего раннего старта. Пакет Chef был выпущен в 2009 r., Salt - в 2011 г.
и AnsiЫe - в 2012 r.
Общая категория программного обеспечения для управления конфигурацией была
впервые разработана в виде системы CFEngine Марка Берджесса (Mark Bergess) в 1993 r.
CFEngine по-прежнему существует и продолжает активно развиваться, но большая часть
ее пользовательской базы была завоевана более новыми системами. Для получения те
кущей информации см. cfeng ine. сот.
Компания Microsoft имеет собственное решение СМ в виде PowerSl1ell Desired State
Configuration. Хотя эта система относится к миру Windows и в первую очередь предна
значена для настройки клиентов Windows, Microsoft также опубликовала расширения
для настройки систем Linux. Стоит отметить, что все четыре системы, перечисленные
в табл. 23.1, также могут настраивать клиентов Windows.
В ряде проектов основное внимание уделяется конкретным подобластям управления
конфигурацией, в частности, внедрению новой системы (например, СоЬЫеr) и разверты
ванию программного обеспечения (например, Fabric и Capistrano). Общее предложение
этих систем заключается в том, что, более тщательно моделируя конкретную проблемную
область, они могут обеспечить более простой и целенаправленный набор функций.
В зависимости от своих потребностей вы можете обнаружить (или не обнаружить),
что эти специализированные системы обеспечивают разумную норму прибьти от ваших
инвестиций в обучение. Общие системы управления конфигурацией, подобные описан
ным в табл. 23.1, не вполне подходят для всех возможных действий.
Системы, приведенные в табл. 23.1, работают практически с любым типом современ
ных UNIХ-совместимых клиентских машин, хотя всегда есть граница поддержки. Пакет
Chef имеет скромное преимущество в совместимости и поддерживает даже операцион
ную систему AIX.
Ш Дополнительную информацию о контейнерах см. в главе 25.
Поддержка операционной системы на стороне сервера конфигурации (для тех си
стем, которые используют сервер конфигурации) более ограничена. Например, пакет
Chef требует для своего сервера инсталляции операционных систем RH EL или Ubuntu.
856 ЧастьlV.Эксплуатация
Терминология
В табл. 23.2 показаны термины, используемые в каждой из рассматриваемых нами
систем СМ для объектов, указанных в разделе "Элементы управления конфигурацией".
Бизнес-модели
Все продукты, которые мы обсуждаем, являются пакетами модели freemium. Это оз
начает, что базовые системы бесплатны и доступны по лицензии с открытым исходным
кодом. Однако каждая такая система поддерживается со стороны отдельной организа
ции, которая продает услуги по поддержке, консалтингу и дополнительные пакеты.
Архитектурные параметры
Теоретически системы СМ не требуют серверов. Программное обеспечение может
работать только на сконфигурированных компьютерах. Скопируйте базу конфигурации
Глава 23. Управление конфигурацией 857
на каждый целевой хост и просто запустите команду, чтобы сказать: "Я здесь, настройте
меня в соответствии с этими спецификациями".
На практике приятно не беспокоиться о деталях получения информации о конфи
rурации, выталкиваемой клиентам и выполняемой ими. Системы СМ всегда создают
некоторые условия для централизованного управления, даже если главный компьютер
определяется как "где бы вы ни вошли, вы имеете клон базы конфигурации".
Пакет AnsiЬ\e не использует демоны вообще (кроме sshd), чем он и привлекает своей
простотой. Выполнение конфигурации происходит, когда администратор (или задание
cron) на сервере запускает команду ansiЫe-playbook. Команда ansiЫe-playbook
выполняет соответствующие удаленные команды по протоколу SSH, не оставляя сле
дов своего присутствия на клиентской машине после завершения конфигурации.
Единственными требованиями для клиентских компьютеров являются их доступность
по протоколу SSH и установленная версия Python 2. 2
Пакеты Salt, Puppet и Chef включают в себя как серверные, так и клиентские демо
ны. В типичных сценариях развертывания демоны запускаются с обеих сторон отноше
ний, и это среда, которую вы увидите в большинстве документации. Можно запускать
каждый из этих пакетов без сервера, но эта конфигурация менее распространена.
Заманчиво предположить, что системы СМ с демонами должны быть более тяже
лыми и сложными, чем те, у кого их нет (т.е. AnsiЬ\e). Однако это не обязательно так.
В системах Salt и Puppet демоны являются стимуляторами и катализаторами. Они по
лезны, но необязательны, и они не изменяют фундаментальную архитектуру системы,
хотя и позволяют использовать некоторые дополнительные функции. Если хотите, вы
можете запускать эти системы без демонов и копировать базу конфигурации вручную.
У системы Salt даже есть SSН-режим, который работает аналогично AnsiЫe.
Учитывая это, зачем вам куча дополнительных демонов? По нескольким причинам.
• Эта схема работает быстрее. Разработчики пакета AnsiЬ\e упорно трудятся, чтобы
преодолеть ограничение производительности, налагаемое протоколом SSH и отсут
ствием на стороне клиента кеширования, но он по-прежнему заметно более мед
ленный, чем Salt. Когда вы читаете книrу о системном администрировании, десять
секунд кажутся незначительными. В разгар устранения сбоя эта задержка кажется
бесконечной, особенно когда ее испытывают десятки или сотни клиентов.
2 8 зависимости от системы вам может понадобиться один или два дополнительных модуля на язы
ке Python. Например, Fedora требует пакет python-dnf.
858 ЧастьlV.Эксплуатация
Параметры языка
Системы AnsiЫe и Salt написаны на языке Python. Системы Puppet и Chef написаны
на языке Ruby. Но, кроме системы Chef, эта информация, вероятно, не так актуальна,
чем может показаться на первый взгляд.
В типичной конфигурации систем AnsiЫe или Salt код Python нигде не появляется.
Обе эти системы в качестве основного языка конфигурации используют YAML (аль
тернативный синтаксис для выражения представления объектов JavaScript, или JSON).
YAML - это просто структурированные данные, а не код, поэтому они не имеют соб
ственного поведения, отличного от интерпретации данных, назначенных системой
управления конфигурацией.
Вот простой пример кода системы Salt, в котором подключается и запускается служ
баSSH.
ssh.server.run ssh:
service:
- name: sshd
- running
- еnаЫе: true
Чтобы сделать файлы УАМ L более динамически выразительными, системы AnsiЬle
и Salt дополняют их системой шаблонов Jinja2 в качестве препроцессора. 4 Система Jinja
имеет свои корни в языке Pytl1011, но это не просто оболочка Python. При использова
нии она ведет себя как система шаблонов, а не настоящий язык программирования.
'Можно было бы привести убедительный аргумент в пользу того, что система Salt является самой
простой системой среди всех, если не обращать внимания на ее передовые средства и несколько
своеобразную документацию.
4 Справедливости ради отметим, что система Salt на самом деле не зависит от формата и препро
цессора, а также автоматически поддерживает несколько конвейеров ввода (включая исходный
Pythoп). Однако отклонение от проторенного пути Jinja и YAML означает отказ от документации и
изоляцию от остального мира. Вероятно, это решение лучше всего отложить на будущее, пока вы
не освоите систему Salt.
Глава 23. Управление конфигурацией 859
Даже система Salt, которая в большей степени полагается на Jinja, чем AnsiЫe, предосте
регает от помещения излишней логики в код Jinja.
Суть в том, что, если вы не пишете собственные типы операций или не использу
ете явные вставки кода на Python, вы не столкнетесь с большим количеством кода на
Python в пакетах AnsiЫe и Salt. 5 (Расширение системы СМ с помощью вашего собствен
ного кода на самом деле может быть довольно легким и весьма полезным.)
В качестве своих основных систем конфигурации системы Puppet и Chef используют
предметно-ориентированные языки на основе Ruby. Версия языка в системе Chef очень по
хожа на аналог управления конфигурацией на языке Rails из мира веб-разработки. Иначе
говоря, он бьm расширен несколькими концепциями, предназначенными для упрощения
управления конфигурацией, но по-прежнему является узнаваемым Ruby. Например:
service 'sshd' do
supports :restart => true, :status => true
action [:еnаЫе, :start]
end
Большинство задач управления конфигурацией могут быть решены без углубления
в язык Ruby, но при необходимости вам доступна вся мощь этого языка. Вы оцените
эту скрытую глубину еще больше, когда станете лучше разбираться в языке Ruby и си
стеме Chef.
В отличие от этого, разработчики системы Puppet довольно много поработали
над концептуальной независимостью от языка Ruby и использовали его только как уро
вень реализации. Хотя язык системы Puppet "под капотом" остается языком Ruby и до
пускает вставку кода на языке Ruby, он имеет свою собственную структуру, которая бо
лее сродни декларативной системе, такой как YAML, чем языку программирования.
service {
"ssh":
ensure => "running",
еnаЫе => "true"
1 Джон Корбет (John CorЬet), один из наших технических рецензентов, согласен с тем, что эти си
стемы не демонстрируют много кода на языке Python ... пока ситуация не станет ужасной. "В этот
момент, - добавляет он, - знакомство с трассировкой Python и представлениями структуры дан
ных очень помогает".
860 ЧастьlV.Эксплvатация
www-user:
user.present:
- name: www
- gid: www
- createhome: false
- require:
- www-group
www-group:
group.present:
- name: www
Здесь для создания драматического эффекта мы инвертировали порядок операций.
Но из-за объявления require операции выполняются в правильном порядке незави
симо от того, как они отображаются в исходном файле. Следующая команда применяет
описанную выше конфигурацию:
$ sudo salt test-system state.apply order-test
test-system:
ID: www-group
Function: group.present
Name: www
Result: True
Comment: Group www is present and up to date
Started: 23:30:39.825839
Duration: 3.183 ms
Changes:
ID: www-user
Function: user.present
Name: www
Result: True
Comment: User www is present and up to date
Started: 23:30:39.829218
Duration: 27.435 ms
Changes:
Summary for test-system
Глава 23. Управление конфигурацией 861
Succeeded: 2
Failed: О
Нам нравится система Chef. Эта полная, надежная и масштабируемая система лучше,
чем ее конкуренты. Но в глубине души мы признаем, что это просто еще одна система
управления конфигурацией, которая выполняет те же основные функции, что и AnsiЬ\e,
862 ЧастьlV.Эксплуатация
нительных преимуществ.
ОдаУАМL
Как упоминалось ранее, формат YAML является просто альтернативным синтакси
сом для формата JSON. Например, формат YAML для системы AnsiЬle 6
- name: Install cpdf on cloud servers
hosts: cloud
become: yes
tasks:
- name: Install ОСАМL packages
package: name={{ item }} state=present
with items:
- gmake
- ocaml
- ocaml-opam
так отображается в формат JSON:
[{
"name": "Inst all cpdf оп cloud servers",
"hosts": 11 cloud 11 ,
"become": "yes",
"tasks": [{
"name": "Install ОСАМL packages",
"package": {
"name": "{{ item }}",
"state": "present",
} '
"with_items": [ "gmake", "ocaml", "ocaml-opam" ]
}]
}]
6 Теоретически документ в формате YAML должен начинаться с трех тире в первой строке, и доку
ментация AnsiЫe часто следует этому соглашению. Однако эта начальная строка документа YAML -
обычный рудимент. Насколько нам известно, ее можно безопасно исключить во всех случаях.
864 ЧастьlV.Эксплvатация
формате YAML, но YAML, помимо этого, понимает отступы для указания структуры, как
в языке Python. Синтаксис YAML отмечает элементы в списке префиксом в виде тире.
Найдите время, чтобы проверить, что вы действительно поняли, как приведенный
выше пример YAML отображается в формат JSON, потому что системы AnsiЫe и Salt
на самом деле основаны на формате JSON. YAML - это всего лишь сокращение. Далее
мы рассмотрим систему АпsiЫе, поскольку ее версия YAML более своеобразна, но боль
шинство общих утверждений относится и к системе Salt. 7
Очевидно, версия YAML более читабельна, чем версия JSON. Проблема заключается
не в формате YAML как таковом, а скорее в попытке выразить сложные системы управ
ления конфигурацией в форме JSON.
Формат YAML хорош для представления простых структур данных, но это не инстру
мент, который хорошо масштабируется до произвольной сложности. Когда в модели по
являются изъяны, они должны подвергаться множеству специальных исправлений.
В приведенном выше примере уже содержится такое исправление. Вы заметили это?
package:
name: ( ( item } }
state: present
Или нет? На самом деле нет, потому что система AnsiЫe не допускает хеш-значения,
которые начинаются с расширения Jinja. Это выражение Jinja теперь должно включать
в себя кавычки:
package:
name: " ( ( i tem } }"
state: present
А что если операция описывается в виде аргумента "свободной формы"?
- name: Cry for help
shell: echo "Please, sir, I just want the syntax to Ье consistent"
args:
warn: no
Визуально это выглядит не так уж плохо. Но подумайте о том, что на самом деле
происходит: shell - это тип операции, а warn - параметр операции типа shell, так
же как state - это параметр операции package в предыдущем примере. Итак, что там
делает дополнительный словарь args?
Дело в том, что операции типа shell обычно передается в качестве основного аргу
мента сложная строка (для запуска команды оболочки), поэтому она была сделана спе
циальным типом операции, которой передается именно строка, а не хеш. Словарь args
на самом деле является свойством оболочки объекта задачи, а не операцией типа shell.
'Опять же, приверженцы системы Salt будут возражать, что Salt нельзя критиковать за формат
YAML и язык потому что у нее нет реальных зависимостей от этих систем. Вы можете ис
Jinja,
пользовать любую из нескольких альтернатив. Все верно. В то же время это очень похоже на си
туацию, когда вы не хотите нести ответственность за правительство страны, потому что вы за него
не голосовали.
Глава 23. Управление конфигурацией 865
Его содержимое тайно загружается в операцию shell от вашего имени, чтобы выпол
нить всю работу.
Нет проблем; сохраняйте спокойствие и продолжайте. Но эта путаница проявляется
уже в относительно простом примере.
спецификация на самом деле довольно длинная. Фактически она длиннее спецификации всего
языка программирования Go.
;Программа pip - это менеджер пакетов для языка Python. Попробуйте выполнить команду
pip install ansiЫe, чтобы загрузить последнюю версию из репозитория PyPI (Python Package
lndex). Возможно, вам понадобится сначала установить программу pip с помощью вашей системы
управления дистрибутивами пакетов.
10 Любопытно, что в файле ansiЫe. cfg, а также в нескольких других файлах конфигурации
AnsiЫe, используется формат . ini, а неYAML. Мы не знаем причины этого явления.
866 частьlV.Эксплvатация
[ssh_connection]
pipelining = true
Эти строки включают конвейерную обработку - функцию SSH, которая значитель
но повышает производительность. Конвейерная обработка требует, чтобы команда sudo
на клиентах не настраивалась на использование интерактивных терминалов; такое по
Настройка клиента
Дпя упрааления конфигурацией каждого клиента необходимо иметь три вещи:
• доступ к протоколуSSH;
• разрешение на доступ к sudo 12 ;
• интерпретатор языка Python 2.
Если клиент яаляется облачным сервером Linux, он может быть доступен системе AnsiЬle
автоматически. Такие системы, как FreeBSD, в которых не }{:таноалены по умолчанию sudo
или интерпретатор Python, могут нуждаться в немного более тонкой настройке, но вы мо
жете выполнить часть работы в процессе начальной загрузки с помощью системы AnsiЬle
и операций raw, которая запускает команды удаленно, без привычной оболочки Python.
Кроме того, вы можете просто написать собственный сценарий начальной загрузки.
При настройке клиентов AnsiЬle необходимо сделать выбор из нескольких вариан
тов. Мы предлагаем разумный план выбора в разделе "Параметры доступа в системе
AnsiЫe", но пока давайте предположим, что вы создали на клиентской машине выде
ленного пользователя ansiЫe, что соответствующий SSН-ключ находится в вашем
стандартном наборе и что вы готовы ввести пароль sudo вручную.
Клиенты не представляют себя системе AnsiЬle, поэтому вам нужно добавить их
в список хостов AnsiЫe. По умолчанию этот список хранится в отдельном файле с име
нем /etc/ansiЫe/hosts. Одной из приятных особенностей системы AnsiЬle яаляется
то, что вы можете заменить любой текстовый конфигурационный файл каталогом с тем
же именем. Система AnsiЫe затем объединяет содержимое файлов, содержащихся в ка
талоге. Эта функция полезна для структурирования вашей базы конфигурации, но также
яаляется способом вхлючения динамической информации: если конкретный файл яаля-
12 Система АпsiЫе фактически не требует доступа к программе sudo. Это необходимо, только если
вы хотите выполнять привилегированные операции.
Глава 23. Управление конфигурацией 869
• В системе FreeBSD
freebsd.example.com
ansiЫe
интерпретатор Python устанавливается в необычное ме
сто, поэтому системе AnsiЫe необходимо сообщить следующую информацию.
ansiЫe_python_interpreter=/usr/local/bin/python
user=ansiЫe
Все это должно быть записано в одной строке файла hosts. (Ниже мы покажем луч
ший способ задать значения этих переменных, но данный метод является просто обоб
щением той же идеи.)
Чтобы проверить подключение к новому хосту, выполните операцию setup, которая
возвращает каталог фактов клиента.
$ ansiЬle new-client.example.com -m setup
new-client.example.com 1 SUCCESS => {
"ansiЫe_facts": {
"ansiЫe_all_ipv4_addresses":
"172.31.25.123"
] ,
<Более 200 строк пропущено>
Имя setup кажется нам неудачным, поскольку явная настройка не требуется. Если
хотите, можно перейти непосредственно к действительным операциям конфигурации.
Кроме того, вы можете запускать операцию setup столько раз, сколько будет необходи
мо для просмотра каталога фактов клиента.
Убедитесь, что эскалация привилегий с помощью программы sudo также работает
правильно.
1 'На самом деле система AnsiЫe делает еще больше. Она полностью игнорирует определенные
типы файлов, например файлы . ini. Таким образом, вы можете не только добавлять их в сцена
рии, но и создавать файлы конфигурации для сценариев.
870 ЧастьlV.Эксnлvатация
пароль sudo (это делается с помощью опции --ask-Ьecoшe-pass). причем это делается
независимо от того, запрашивает удаленная система пароль или нет.
Группы клиентов
Группы также можно определить в каталоге hosts, хотя синтаксис при этом может
стать неудобным.
client-four.example.com
[webservers]
client-one.example.com
client-two.example.com
[dbservers]
client-one.example.com
client-three.example.com
Если это выглядит не так уж плохо, то только потому, что мы обошли основные про
блемные области. Формат . ini является текстовым, поэтому необходимы некоторые
трюки, если вы хотите определить иерархические группы или добавить дополнения не
посредственно в файл hosts (например, присвоить переменные для группы).
Однако эти функции на самом деле не так важны на практике. Обратите внима
ние: нам пришлось указать хост client-four в верхней части файла, потому что он не
включен в какие-либо группы. Мы не можем просто добавить этот хост в конец файла
hosts, поскольку это сделает хост client-four членом группы dbservers, даже если
бы мы добавили пустую строку в качестве разделителя.
Эrо еще одна причина, почему каталоги конфигурации являются полезными. На прак
тике мы, вероятно, захотим поместить каждое определение группы в отдельный файл.
Система AnsiЫe позволяет свободно смешивать имена клиентов и групп в командных стро
ках и в базе конфигурации. Ни один из них никак специально не выделяется, и оба могут
быть подвергнуты подстановке. Совместимость с регулярным выражением также доступна
ШJЯ обеих категорий имен; просто укажите в начале шаблона префикс-. Существует также
набор алгебр нотации ШJЯ разных объединений когорт клиентов.
Например, в следующей команде используется выражение подстановки ШJЯ выбора
группы webservers. В ней применяется операция ping к каждому члену этой группы.
$ ansiЫe 'weh*' -m pinq
client-one.example.com 1 SUCCESS => {
"changed": false,
"ping": "pong"
Присваивание переменных
Как мы видели ранее, значения переменных можно присваивать в файлах инвента
ризации. Но это очень грубый прием; не делайте этого.
Каждый хост и группа могут иметь собственную коллекцию определений пере
менных в формате YAML. По умолчанию эти определения хранятся в каталогах /etc/
ansiЬle/host_vars и /etc/ansiЫe/group_vars в файлах, названных по имени хо-
Глава 23. Управление конфигурацией 871
ста или группы. Если хотите, вы можете использовать суффикс . yml: система AnsiЫe
найдет соответствующие файлы в любом случае.
Как и в других конфигурациях AnsiЫe, эти файлы могут быть преобразованы в ката
логи, если вы хотите добавить дополнительную структуру или сценарии. Система AnsiЫe
выполняет обычную процедуру игнорирования файлов конфигурации, запуска сценари
ев и объединения всех результатов в окончательный пакет.
Система AnsiЫe автоматически определяет группу all. Как и другие группы, гpynr1a
all может иметь собственные групповые переменные. Например, если вы стандартизи
руете использование учетных записей клиентов с именем ansiЫe для управления кон
фигурацией, это хороший повод, чтобы задать глобальную конфигурацию (например,
в каталоге group_vars/all/basics):
ansiЫe user: ansiЫe
Если для переменной существует несколько объявлений значения, система AnsiЫe вы
бирает окончательное значение в соответствии с правилами приоритета, а не по порядку
объяаления. В настоящее время система AnsiЫe имеет 14 различных категорий приоритетов,
но важным моментом в этом случае яаляется то, что переменные хоста перекрывают пере
менные группы.
Например, следующий набор инструкций гарантирует, что файл / etc/ rc. conf со
держит строку для настройки имени хоста на каждом клиенте системы FreeBSD.
- name: Set hostname at startup on FreeBSD systems
hosts: all
tasks:
- lineinfile:
dest: /etc/rc.conf
line: hostname="{{ hostname )}"
872 ЧастьlV.Эксплvатация
regexp: лhostname
when: ansiЫe_os_family == "FreeBSD"
(Если последняя строка выглядит так, как будто она нуждается в двойных фигурных
скобках, значит ваш инстинкт вас не подводит. На самом деле это всего лишь немного
синтаксического сахара AnsiЫe, позволяющего поддерживать конфигурацию в поряд
ке. Спецификации when всегда являются выражениями Jinja, поэтому система AnsiЫe
окружает их содержимое двойными фигурными скобками автоматически. Эта функция
полезна, но это всего лишь одно из довольно обширного списка отклонений в синтак
сическом анализе формата YAML в системе AnsiЬ\e.)
В этом примере к каждому хосту в инвентарном перечне применяется операция
lineinfile. Однако благодаря спецификации when на самом деле эту операцию вы
полняют только хосты под управлением системы FreeBSD. Этот подход работает отлич
но, но он не превращает хосты FreeBSD в настоящую группу. Например, они не могут
иметь нормальную запись group_ vars, хотя вы можете имитировать этот эффект с по
мощью некоторых трюков.
Списки задач
В системе AnsiЫe операции называются задачами, а набор задач, перечисленных
в отдельном файле, называется списком задач. Как и остальные части конфигурации
AnsiЫe, за небольшим исключением, списки задач имеют формат YAML, поэтому фай
лы имеют суффикс . yml.
Связывание списков задач с конкретными хостами выполняется на объектах более
высокого уровня, называемых файлами сценариев (playbooks), которые будут описаны
чуть ниже. Теперь давайте сосредоточимся на самих операциях и не будем беспокоиться
о том, как они применяются к конкретному хосту.
Глава 23. Управление конфигурацией 873
В этом примере каждая задача имеет поле name, которое описывает ее функцию
на английском языке. Названия с формальной точки зрения необязательны, но если вы
их не включите, то система AnsiЬ\e будет очень мало сообщать о том, что она делает при
запуске конфигурации (кроме вывода имен модулей: пакета, группы и т.д.).
Каждая задача должна иметь среди своих ключей имя точно одного операционного
модуля. Значение этого ключа само по себе является хешем, в котором указаны параме
тры операции. Параметрам, которым явно не заданы значения, назначаются значения
по умолчанию.
14 Файл задачи или состояния обычно должен иметь четко определенный домен и четкую цель, по
этому данный пример является разновидностью беспорядка. Мы выбрали эти операции, чтобы
проиллюстрировать некоторые общие моменты, а не как пример правильной базовой структуры
конфигурации.
874 ЧастьlV.Эксплvатация
Обозначение
- name: Install sudo package
package: name=sudo state=present
является расширением формата YAML в системе AnsiЬ\e, которое по существу эквива
лентно следующему коду:
Параметры состояния
В системе AnsiЫe операционные модули часто могут выполнять несколько различ
ных задач в зависимости от состояния, которое вы запрашиваете. Например, для модуля
package состояние state=present инсталлирует пакет, state=absent удаляет пакет,
а state=latest гарантирует, что пакет инсталлирован и обномен. Операции часто ищут
разные наборы параметров в :зависимости от вызываемого состояния.
В некоторых случаях (например, когда модуль s е rv i се с состоянием
state=restarted перезапускает демон) эта модель немного отклоняется от того, что
обычно понимают как "состояние", но в целом она работает хорошо. Состояние может
быть пропущено (как показано здесь при создании группы sudo), и в этом случае оно
принимает значение по умолчанию, обычно что-то положительное и расширяющее воз
можности, например present, configured или running.
Итерация
Ключевое слово wi th i tems - это итерационная конструкция, которая повторяет
задачу для каждого элемента, к которому она относится. Ниже приведена еще одна ко
пия двух задач в нашем примере, использующих ключевое слово wi th i tems.
- name: Create personal groups for admins
group: name={{ item.username })
with_items: 11 ( { admins }} 11
- name: Create admin accounts
user:
name: 11 { ( item.username 1}"
comment: 11 ( ( item. fullname } }•
group: "(( item.username })"
groups: wheel
with_items: 11 ( ( admins }} "
Глава 23. Управление конфигурацией 875
Взаимодействие с Jinja
Документация AnsiЫe не очень конкретна в отношении взаимодействия форма
та YAML и шаблоновJinja, но важно понять детали. Как показывают конструкции.
подобные wi th i tems, Jinja - это не просто препроцессор, который применяется
к файлу, прежде Чем он будет передан механизму YAML (как в случае с системой Salt).
Фактически система AnsiЫe выполняет синтаксический разбор формата YAML, остав
ляя нетронутыми выражениями Jinja. Затем препроцессор Jinja разворачивает каждое
строковое значение непосредственно перед его использованием. На каждой итерации
параметры повторных операций вычисляются заново.
Препроцессор Jinja имеет собственные структуры управления, включая циклы и ус
ловные выражения. Однако они по своей сути несовместимы с архитектурой отложен
ных вычислений в системе AnsiЫe и поэтому не разрешены в УАМL-файлах системы
AnsiЫe (хотя их можно использовать в шаблонах). Простые конструкции, такие как
when и wi th i tems, - это не только декорации для эквивалентных шаблонов Jinja. Они
представляют собой совершенно другой подход к структурированию конфигурации.
Визуализация шаблона
Система AnsiЫe использует язык шаблонов
Jinja2 как для добавления динамических
функций в файлы YAML, так и для создания шаблонов для файлов конфигурации, уста
новленных модулем template. В следующем примере мы используем шаблон для на
стройки файла sudoers. Ни.же снова приведены определения переменных для справки.
sudoers_path: /etc/sudoers
admins:
- { username: manny, fullname: Manny Calavera
- { username: moe, fullname: Мое Money )
Код задачи имеет следующий вид.
- name: Install sudoers file
template:
876 ЧастьlV.Эксплvатация
потому что это приведет к тому, что они появятся в выводе шаблона.
Расширенная версия выглядит так.
Defaults env_keep += "НОМЕ"
доступны практически везде, даже при выполнении операции include. Система AnsiЫe
может активировать один и тот же список задач или набор сценариев снова и снова
с различными наборами значений переменных. Это очень похоже на определение функ
ции (например, "создать учетную запись пользователя"), которая потом вызывается
с различными наборами аргументов.
Система AnsiЫe формализует эту систему с помощью реализации пакетов (называемых
"ролями"), которые мы обсуждаем далее. Роль - это мощный инструмент, но по существу
это всего лишь набор стандартизованных условностей, поэтому их легко понять.
Вот простой сценарий, демонстрирующий использование обработчиков.
После того как каждый хост завершит задачу, система АпsiЫе начинает следующую за
дачу. По умолчанию система АпsiЫе запускает задачи одновременно на пяти хостах, но
существует возможность установить другой предел с помощью флага -f.
При отладке часто бывает полезно включить аргумент -vvvv для увеличения объема
вывода отладочной информации. Вы увидите точные команды, которые выполняются
на удаленной системе, и реакцию системы на них.
Роли
Как мы писали в общих чертах, привязки (это наш термин) являются механизмом
упаковки, определенным системой СМ, который облегчает повторное и совместное ис
пользование фрагментов конфигурации.
В системе АпsiЫе пакеты названы ролями, и они на самом деле не что иное, как
структурированная система операций include и правил приоритета переменных. Они
позволяют легко помещать определения переменных, списки задач и шаблоны, связан
ные с конфигурацией, в один каталог, что делает их доступными для повторного и со
вместного использования.
Каждая роль - это подкаталог каталога roles, который обычно находится на верх
нем уровне базы конфигурации. Вы также можете добавить каталоги ролей для всей ор
ганизации, установив переменную role path в файле ansiЫe.cfg, как было показано
выше. Все известные каталоги ролей просматриваются всякий раз, когда вы включаете
роль в файл сценариев.
Каталоги ролей могут иметь подкаталоги, показанные в табл. 23.4.
Таблица 23.4. Подкаталоги ролей AnsiЫe
Подкаталог Содержание
- include: roles/cow-clicker/tasks/main.yml
handlers:
- include: roles/cow-clicker/handlers/main.yml
Однако значения переменных из папки defaul t не переопределяют значения, кото
рые уже были установлены. Кроме того, система AnsiЫe упрощает обращение к файлам
из каталогов files
templates, а также включает все роли, упомянутые в качестве за
и
висимостей в файлеmeta/main. yml.
Файлы, отличные от main. yml, игнорируются системой ролей, поэтому вы можете
разбить конфигурацию на любые части и просто включить эти части в файл main. yml.
Система AnsiЫe позволяет передавать набор значений переменных в конкретный эк
земпляр роли. При этом роль начинает действовать как своего рода параметризованная
функция. Например, вы можете определить пакет, который используется для разверты
вания приложения Rails. Вы можете вызвать этот пакет несколько раз в файле сценари
ев, при каждом вызове предоставляя параметры для нового приложения.
равнивает приоритеты всех задач. Кроме того, хорошим стилем является полный отказ
от самостоятельных списков задач и стандартизация ролей.
Иногда рекомендуется, чтобы один файл сценариев охватывал все задачи, относящи
еся к каждой логически определенной группе хостов. Например, все роли и задачи, от
носящиеся к веб-серверам, должны быть включены в один файл сценариев webserver.
yml. Такой подход позволяет избежать репликации групп хостов и обеспечивает четкий
фокус управления для каждой группы хостов.
С другой стороны, следование этому правилу означает, что у вас нет прямого способа
запуска части глобальной конфигурации даже для отладки. Система AnsiЫe может вы
полнять только файлы сценариев; в ней нет простой команды, которая запускает опре
деленный список задач на данном компьютере. Официальным решением этой проб
лемы является тегирование, которое отлично работает, но требует некоторой настройки.
Вы можете включить поле tags в любую задачу или перед любой задачей, чтобы класси
фицировать ее. Чтобы указать подмножество тегов, которые вы хотите запустить, в ко
мандной строке используйте опцию -t команды ansiЫe-playbook. В большинстве
сценариев отладки следует также использовать параметр -1, чтобы ограничить выполне
ние указанным тестовым хостом.
Присваивайте теги на как можно более высоком уровне иерархии конфигурации. При
нормальных обстоятельствах у вас не должно возникнуть соблазна назначать теги для от
дельных задач. (Если вы это сделаете, это может быть признаком того, что конкретный
список задач должен быть разделен на части.) Вместо этого добавьте теги в специфика
цию include или role, которые включают в себя определенный список задач или ролей
в конфигурации. После этого теги будут распространены на все включенные задачи.
Кроме того, вы можете просто с нуля создавать файлы сценариев, которые запускают
части базы конфигурации на тестовом хосте. Настройка этих файлов сценариев - не
сложная работа, как и назначение тегов в целом.
• Системе AnsiЫe требуется один мандат (пароль или закрытый ключ) для доступа
к удаленной системе и другой - для повышения привилегий с помощью програм
мы sudo. Правильные принципы безопасности предполагают, что это разные маи-
глава 23. Управление конфигурацией 881
• Учетные записи на удаленных машинах для системы AnsiЫe должны иметь слу
чайные пароли UNIX, которые указываются в базе конфигурации в зашифро
ванном виде. Все они зашифрованы одной и той же парольной фразой, но она
должна отличаться от парольной фразы, используемой для закрытых ключей SSH.
Вам нужно будет добавить код AnsiЫe, чтобы убедиться, что правильные пароли
используются правильными клиентскими хостами.
В этой схеме оба набора мандатов шифруются, что делает их устойчивыми к простым
нарушениям прав доступа к файлам. Этот слой косвенности также позволяет легко из
менять основные фразы, не изменяя основные ключи.
Администраторы должны помнить только две фразы: парольную фразу, которая пре
доставляет доступ к секретным ключам SSH, и пароль хранилища AnsiЫe, который по
зволяет системе расшифровывать пароли sudo, специфичные для хоста (а также любую
другую конфиденциальную информацию, включенную в вашу конфигурационную базу).
"В некоторых организациях создаются клиентские учетные записи для системы АпsiЫе с опцией
NOPASSWD в файле sudoers, так что Д11Я этой учетной записи Д11Я запуска программы sudo не тре
буется пароль. Это ужасно небезопасная конфигурация. Если вы не можете заставить себя ввести
пароль, то по крайней мере установите модуль агента РАМ SSH и потребуйте переадресованный
SSН-ключ ДllЯ доступа к sudo. Дополнительную информацию о РАМ см. в разделе 17.3.
882 ЧастьlV.Эксплуатация
Если вам нужны более специфичные права доступа администратора (что вполне ве
роятно), вы можете зашифровать несколько наборов мандатов с помощью разных па
рольных фраз. Если эти наборы имеют мноrо общего (в отличие от непересекающихся),
то каждому администратору не нужно будет помнить более двух парольных фраз.
В этой системе предполагается, что администраторы будут использовать команду
ssh-agent дпя управления доступом к закрытым ключам. Все ключи могут быть акти
вированы с помощью одной команды ssh-add, а пароль SSH необходимо вводить толь
ко один раз за сеанс. Для работы с системой, отличной от обычного мастера AnsiЫe,
администраторы могут использовать опцию SSH ForwardAgent дпя туннелирования
ключей до машины, на которой выполняется работа. Вся другая информация о безопас
ности включена в саму конфигурационную базу.
$ curl -L https://bootstrap.saltstack.com
$ sudo sh /tmp/saltЬoot -Р -м
-о /tmp/saltЬoot
рархий файлов конфигурации. Они обе по умолчанию находятся в каталоге /srv, чему
соответствуют следующие записи в файле /etc/salt/master:
file roots:
base:
- /srv/salt
pillar_roots:
base:
- /srv/pillar
Здесь base - это требуемая общая среда, поверх которой могут быть добавлены до
полнительные среды (например, development). Определения переменных находятся в
корне / srv /pillar, а все остальное находится в каталоге / srv / sal t.
884 частьlV.Эксплvатация
Обратите внимание на то, что сами пути являются элементами списка, так как они
имеют префикс в виде тире. Вы можете включить несколько каталогов, что позволяет
демону sal t-master передавать объединенное представление перечисленных каталогов
миньонам. Это полезная функция при создании большой базы конфигурации, так как
она позволяет вам добавлять структуру, которую система Salt не смогла бы понять само
стоятельно.
Как правило, база конфигурации управляется как единый репозиторий Git, который
включает в себя подкаталоги salt и pillar. Это не подходит мя стандартной схемы,
принятой по умолчанию, поскольку означает, что каталог /srv будет корнем репозито
рия; рассмотрите возможность перемещения всего уровня в каталог /srv/salt/salt
и /srv/salt/pillar.
Документация системы Salt не очень хорошо объясняет, почему базовые элементы
и состояния должны быть полностью разделены, но на самом деле это различие явля
ется центральным мя ее архитектуры. Демон sal t-master не обращает ни малейшего
внимания на файлы состояний; он просто делает их доступными мя миньонов, которые
несут ответственность за синтаксический разбор и выполнение этих файлов.
Базовые элементы - совсем другое дело. Они обрабатываются мастером и рас
пространяются среди миньонов в виде единой унифицированной иерархии в формате
JSON. Каждый миньон видит разные представления базовых элементов, но ни один из
них не может видеть механизм реализации этих предстамений.
Частично это мера безопасности: система Salt дает сильную гарантию, что миньоны
не могут получить доступ к базовым элементам друг друга. Это также обеспечивает раз
деление источников данных, так как динамическое содержание базовых элементов всег
да происходит от мастера. Это обеспечивает хорошую взаимодополняемость с зернами
(термин системы Salt мя фактов), которые происходят от миньонов.
W Дополнительную информацию о сетевых брандмауэрах см. в разделе 27. 7.
Коммуникационная шина системы Salt использует ТСР-порты 4505 и 4506 на сер
вере. Убедитесь, что эти порты доступны через любые брандмауэры или фильтры паке
тов, которые находятся между сервером и потенциальными клиентами. Сами клиенты
не принимают сетевые подключения, поэтому этот шаг необходимо выполнить только
один раз мя сервера.
Впервые исследуя систему Salt, вы можете обнаружить, что она будет более информа
тивной, если ее запустить с помощью команды salt-master -1 deЬug в окне терми
нала, а не в качестве системной службы. Это заставляет демон system-master работать
на переднем плане и выводить на экран информацию о действиях в коммуникационной
шине системы Salt по мере их появления.
Настройка миньонов
Как и на главной стороне, у вас есть выбор собственных пакетов из репозитория
SaltStack или универсального сценария начальной загрузки. Репозиторий вряд ли стоит
загружать данными о миньонах, поэтому мы рекомендуем следующее.
17 Разумеется, вы можете выполнить сопоставление на основе IР-адресов. Просто это должно быть
сделано явно. Подробности см. ниже.
886 ЧастьlV.Эксnлvатация
$ tree /srv/salt
/srv/salt
s~alt top.sls
hostname.sls
[ bootstrap.sls
sshd.sls
baseline.sls
pillar
~
top.sls
baseline.sls
webserver.sls
freebsd.sls
2 directories, 9 f iles
Чтобы привязать переменные, определенные в файлах pillar/baseline. sls
и pillar/freebsd. sls, к нашему клиенту, мы могли бы включить следующие строки
в файл pillar/top. sls.
base:
new-client.example.com:
- baseline
- freebsd
Как и в файле master, base - это обязательная общая среда, которая может быть
переопределена в более сложных настройках. Подробнее об этом см. ниже в разделе
"Среды".
Некоторые из тех же значений переменных можно определить в файлах baseline.
sls и freeЬsd. sls. Для скалярных значений и массивов действующим источником яв
ляется тот, который последним указан в файле top. sls.
Например, если миньон связывается с одним файлом переменных, который выгля
дит так:
admin-users:
manny:
uid: 724
moe:
uid: 740
и другим, который выглядит так:
admin-users:
jack:
uid: 1004
то система Salt объединяет две версии.
Глава 23. Управление конфигурацией 887
admin-users:
manny:
uid: 724
moe:
uid: 740
J ack:
uid: 1004
Сопоставление миньонов
В приведенном выше сценарии мы хотим применить файл baseline. sls ко всем
без исключения клиентам, а файл freebsd. sls - ко всем клиентам, на которых рабо
тает операционная система FreeBSD. Вот как мы можем это сделать с помощью шабло
нов выбора в файле pillar/top. sls.
base:
'*. example. сот' :
- baseline
'G@os: FreeBSD' :
- freebsd
Звездочка соответствует всем идентификаторам клиентов в домене example. сот.
Можно было просто использовать здесь обозначение '* ', но мы хотели подчеркнуть,
что это шаблон подстановки. Префикс G@ запрашивает совпадение значений зерен.
Проверяемое зерно называется os, а искомое значение - FreeBSD. Здесь также допу
скается использование шаблонов подстановки.
Было бы проще написать соответствующее выражение для FreeBSD так:
'os:FreeBSD':
- match: grain
- freebsd
Выбор зависит от вас, но символ @ явно расширяет сложные выражения, содержа
щие круглые скобки и логические операции. В табл. 23.5 перечислены наиболее распро
страненные виды сопоставления, хотя некоторые из них были опущены.
Если табл. 23.5 показалась вам сложной, не пере.живайте; это просто варианты.
Реальные селекторы гораздо больше похожи на наши простые примеры.
Если вам интересно, с какими значениями зерен или базовых элементов можно вы
полнять сопоставление, их легко узнать. Просто используйте команду
$ sudo salt миньон grains.items
или
- name: sudo
- refresh: true
create-sudo-group:
group.present:
- name: sudo
{% for admin in pillar.admins %)
{% endfor %)
install-sudoers-file:
file.managed:
- name: {{ pillar.sudoers_path )}
- source: salt://files/sudoers
- user: root
- group: wheel
- mode: '0600'
В этой версии показаны операции в их максимально канонической форме для более
простого сравнения с эквивалентным списком задач AnsiЬ\e, который был рассмотрен
ранее. Мы можем внести несколько дополнительных изменений для улучшения приме
ра, но сначала целесообразно рассмотреть эту более длинную версию.
С одной стороны, этот подход ясен. Там нет концептуальной двусмысленности в от
ношении того, что происходит, и легко просмотреть расширенный файл . sls, чтобы
убедиться, что он соответствует вашим целям. С другой стороны, это означает, что вы
будете использовать препроцессор Jinja для обеспечения любой логики, необходимой
для вашей конфигурации. Смешение кода шаблонов и формата YAML может стать за
труднительным. Это немного похоже на написание логики веб-приложения с использо
ванием только НТМL-шаблонов.
Несколько эмпирических правил могут помочь сохранить конфигурацию Salt. Во
первых, у системы Salt есть пригодные для использования и четко определенные меха
низмы для реализации замещения значений переменных. Используйте их, чтобы сохра
нить как можно больше конфигурации в области данных, а не в коде.
Во многих примерах в документации Sa\t используются условные конструкции пре
процессора Jinja, в то время как они не являются лучшим решением. 1 м Следующий файл
. sls позволяет установить веб-сервер Apache, который имеет разные имена пакетов
в разных дистрибутивах:
# apache-pkg.sls
apache:
pkg.installed:
{% if grains['os'] == 'RedHat' %)
- name: httpd
{% elif grains['os'] == 'Ubuntu' %)
- name: apache2
{% endif %)
Этот вариант можно было бы более элегантно описать с помощью базового элемента
(pillars):
# apache-pkg.sls
{ { pillar [ 'apache-pkg'] ) ) :
pkg. installed
# pillar/top.sls
base:
'*':
- defaults
'G@os:Ubuntu':
- ubuntu
# pillar/defaults.sls
apache-pkg: httpd
# pillar/ubuntu.sls
apache-pkg: apache2
Хотя замену одного файла четырьмя нельзя считать упрощением, теперь это расши
ряемая система без кода. В средах с несколькими операционными системами такие ва
рианты встречаются часто, и все они могут быть рассмотрены в одном месте.
Если значение должно быть вычислено динамически, подумайте, нельзя ли поме
стить код в верхнюю часть файла . sls и просто запомнить его для последующего ис
пользования в переменной. Например, другой способ записи установки пакета Apache
имел бы такой вид:
1 ксправеД11ивости ради укажем, что 'ЭТИ примеры, как правило, предназначены Дl!Я иллюстраuии
спеuифичных моментов и не стремятся к полной корректности.
Глава 23. Управление конфигурацией 891
{{ pkg_name )):
pkg. installed:
Это по крайней мере позволяет отделить логику Jinja от фактической конфигурации.
Если вы вынуждены смешивать логику препроцессора Jinja с форматом YAML, поду
майте, можете ли вы разбить некоторые сегменты YAML на отдельные файлы. Затем вы
можете интерполировать эти сегменты по мере необходимости. И снова идея состоит
в том, чтобы просто отделить код и YAML, а не чередовать их.
Для нетривиальных вычислений можно полностью отказаться от формата YAML
и заменить его чистым языком Python или применить один из предметной-ориентиро
ванных языков, основанных на языке Python, который по умолчанию использует систе
ма Salt. Для получения дополнительной информации см. документацию Salt о ренде
ринге (renderers).
install-sudo-package:
pkg.installed:
- name: sudo
- refresh: true
create-sudo-group:
group.present:
- name: sudo
Легко видеть, что отдельные состояния ямяются элементами не списка (как в систе
ме AnsiЬle), а хеша. Хеш-ключ для каждого состояния - это произвольная строка, на
зываемая идентификатором. Как обычно, идентификаторы должны быть уникальными.
иначе возникнут коллизии.
Для того чтобы зависимое состояние не запускалось, если его предшественники за
вершились неудачей, можете объявить это явно. Например, так.
892 ЧастьlV.Эксплуатация
create-sudo-group:
group.preseпt:
- пате: sudo
- require:
- iпstall-sudo-package
В этой конфигурации система Salt не будет пытаться создать группу sudo, если пакет
sudo не будет успешно установлен.
Реквизиты также вступают в действие при упорядочении состояний из нескольких
файлов. В отличие от системы AnsiЫe, система Salt не интерполирует содержимое фай
ла include в точке, где был обнаружен вызов. Она просто добавляет файл в список
для чтения. Если несколько файлов пытаются включить один и тот же источник, в по
следней сборке все еще будет только одна копия источника. а порядок состояний может
быть не таким, как вы ожидали. Выполнение по порядку гарантируется только в фай
ле; если какие-либо состояния зависят от внешне определенных операций, они должны
объявлять явные реквизиты.
Механизм реквизитов также используется для достижения эффекта, аналогичного
уведомлениям в системе AnsiЫe. Несколько альтернатив спецификации require явля
ются синтаксически взаимозаменяемыми, но подразумевают тонкие оттенки поведения.
Одна из них, watch, особенно полезна, потому что позволяет выполнять определенные
действия, когда другое состояние вносит изменения в систему.
Например, в следующей конфигурации устанавливается часовой пояс системы и ар
гументы, которые должны быть переданы демону ntpd при запуске. Эта конфигурация
всегда гарантирует, что демон ntpd будет запущен и настроен для запуска во время за
грузки. Кроме того, она перезапускает ntpd, если обновляется либо системный часовой
пояс, либо флаги ntpd.
set-tiтezoпe:
tiтezoпe.systeт:
- пате: America/Los_Aпgeles
set-пtpd-opts:
augeas. chaпge: 19
- coпtext: /files/etc/rc.coпf
- leпs: shellvars.lпs
- chaпges:
- set пtpd_flags '"-g" ' 20
пtpd:
service.ruппiпg:
- епаЫе: true
- watch:
- set-пtpd-opts
- set-tiтezoпe
Augeas -
19 это инструмент, который понимает множество разных форматов файлов и облегчает ав
томатические изменения.
2''Как видно из этой строки, использование кавычек в формате YAML может быть тонким делом.
Глава 23. Управление конфигурацией 893
В именах этих операций включены имя модуля и имя функции. Взятые вместе они
примерно аналогичны имени модуля в системе AnsiЬJe, дополненным значением состо
яния. Например, в системе AnsiЫe используется пакетный модуль со спецификацией
state = present для установки пакетов, тогда как в системе Salt используется специ
альная функция pkg. installed в модуле pkg.
В системе Salt сделано многое, чтобы отделить функции для целевых систем (''функ
ции выполнения") от тех, которые идемпотентно обеспечивают определенную конфи
гурацию ("функции состояния"). Функции состояния обычно вызывают связанные
с ними функции выполнения, когда им необходимо внести изменения.
Общая идея заключается в том, что в файлах . sls указываются только функции состоя
ния, а в командных строках должны указываться только функции выполнения. Система Salt
слишком примитивно применяет эти правила, что иногда приводит к путанице.
set-timezone:
module.run:
- name: timezone.set zone
- timezone: America/Los_Angeles
и
Параметры и имена
Еще раз приведем первые два состояния нашего примера.
install-sudo-package:
pkg. installed:
894 ЧастьlV.Эксплvатация
- name: sudo
- refresh: true
create-sudo-group:
group.present:
- name: sudo
После отступа под названием каждой операции (т.е. конструкцией модуль. функция)
указывается ее список параметров. В системе AnsiЫe параметры для операции образуют
один большой хеш. Система Salt хочет, чтобы они были списком, причем каждая запись
была предварена тире. Более конкретно, системе Sa\t нужен список хешей, хотя в каж
дом хеше обычно есть только один ключ.
Большинство списков параметров содержат параметр с именем name, который явля
ется стандартной меткой "того, что эта операция настраивает". В качестве альтернативы
вы можете указать список целей в параметре с именем names. Например:
create-groups:
group.present:
- names:
- sudo
- rvrn
Если вы задаете параметр names, то система Salt повторно запускает операцию не
сколько раз, подставляя один элемент из списка names вместо значения параметра name
на каждом проходе. Это механический процесс, и сама операция не знает об итерации.
Эта операция выполняется на этапе выполнения (а не синтаксического анализа) и напо
минает конструкцию wi th_ i tems в системе AnsiЫe. Но поскольку операция расшире
ния Jinja уже завершена, у системы нет возможности формировать значения других па
раметров на основе параметра name. Если вам нужно настроить несколько параметров,
игнорируйте параметр names и просто повторяйте цикл Jinja.
В некоторых операциях могут использоваться сразу несколько аргументов.
Например, операция pkg. installed может сразу передать несколько имен пакетов
в базовый диспетчер пакетов операционной системы, что может быть полезно для повы
шения эффективности или распознавания зависимости. Поскольку система Salt скры
вает итерацию на основе параметра names, в подобных операциях нужно использовать
отдельное имя параметра для выполнения пакетных операций. Например, состояния
install-packages:
pkg.installed:
- names: [ sudo, curl ]
и
install-packages:
pkg.installed:
- pkgs: [ sudo, curl ]
инсталлируют программы sudo и curl. Первая версия делает это в двух отдельных опе
рациях, а вторая - в одной.
Мы подчеркиваем этот, казалось бы, незначительный момент, потому что пара
метр names легко использовать ошибочно. Поскольку процесс механический, итерация
на основе параметра names работает даже для тех операций, в которых не используется
параметр name. При просмотре журнала системы Salt вы увидите, что несколько запу
сков были успешно выполнены, но целевая система почему-то по-прежнему не настро
ена должным образом, и нужно понять, что происходит.
Глава 23. Управление конфигурацией 895
Если вы не указываете явно параметр name для состояния, система Salt копирует
в его поле идентификатор состояния. Вы можете использовать это поведение для упро
щения определения состояний. Например,
create-sudo-group:
group.present:
- narne: sudo
становится
sudo:
group.present
и даже
sudo: group.present
Формат YAML не допускает использование хеш-ключей без значений, поэтому те
перь, когда функция group. present больше не имеет перечисленных параметров, хеш
ключ должен стать простой строкой, а не хеш-ключом со списком параметров в каче
стве значения. Это хорошо! Система Salt проверяет это явно.
Лаконичный стиль более четкий, чем длинный. Отдельное поле идентификатора
может теоретически служить комментарием или объяснением, но большинство иден
тификаторов, встречающихся в реальности, просто описывают поведение, которое уже
очевидно. Если вы хотите добавить комментарии, сделайте это. У лаконичной формы
есть потенциальная проблема: поскольку идентификаторы состояния должны быть гло
бально уникальными, короткие идентификаторы общих системных объектов становятся
более уязвимыми для коллизий. Система Salt обнаруживает и сообщает о конфликтах,
поэтому это скорее досадная, чем серьезная проблема. Но если вы пишете формулу Salt
с намерением повторно использовать ее в нескольких конфигурационных базах или со
бираетесь поделиться ею с сообществом Salt, придерживайтесь идентификаторов, кото
рые с меньшей вероятностью испытают коллизию.
Система Salt позволяет включать несколько операций в одно состояние. Поскольку
две приведенные выше операции содержат общее поле name, мы можем объединить
их в одно состояние без необходимости указывать в каких-либо состояниях поле name
явно. Тем не менее есть еще одна ловушка YAML:
sudo:
pkg.installed:
- refresh: true
group. present: []
Значение ключа sudo теперь должно быть хешем; причем к этому хешу не должна
добавляться строка group. present. Соответственно, теперь мы должны рассматривать
group. present как хеш-ключ и предоставлять явный список параметров в качестве
значения, хотя этот список пуст. Это утверждение остается справедливым, даже если мы
отбросим параметр refresh из pkg. installed:
sudo:
pkg.installed: [)
group.present: [)
Так же, как мы свернули эти два состояния, мы можем свернуть наши два состояния,
которые управляют учетными записями пользователей. Таким образом, более аккурат
ная версия списка состояний имеет следующий вид.
sudo:
pkg. installed: []
group.present: [)
896 ЧастьlV.Эксплуатация
Не указывайте суффикс . sls в имени файла состояния; система Salt добавит его само
стоятельно. Также имейте в виду, что путь к файлу состояния не имеет ничего общего с ва
шим текущим каталогом. Он всегда интерпретируется относительно корня состояния, как
определено в файле конфигурации миньона. В любом случае эта команда не переопределяет
состояние высокого уровня миньона; она просто запускает указанный файл состояния.
В команде sal t можно указать несколько флагов для ориентации на различные
группы миньонов, но проще всего запомнить флаг -с для типа compound и использо
вать одно из сокращений из табл. 23.5.
Например, чтобы перевести все миньоны Red Hat в состояние высокого уровня, вы
полните следующую команду:
Формулы Salt
В системе Salt пакеты (bundles) называются формулами. Подобно роли в системе
AnsiЬle, это всего лишь каталог файлов, хотя формулы Salt имеют внешнюю оболочку,
которая также содержит некоторые метаданные и информацию о версии. В реальном
использовании вам просто нужен внутренний каталог формул.
Каталоги формул входят в один из корней каталогов sal t, определенных в фай
ле master. При желании можно создать корень только для формул. Формулы иногда
включают в себя пример базовых элементов, но вы сами должны их инсталлировать.
Система Salt ничего не делает для поддержки формул, за исключением того, что если
вы указываете каталог в файле top. sls или используете операцию include, система Salt
ищет файл ini t. yml в этом каталоге и интерпретирует его. Это соглашение обеспечивает
понятный путь по умолчанию в формуле. Во многие формулы также включены автоном
ные состояния, на которые вы можете ссылаться, указав как каталог, так и имя файла.
898 ЧастьlV.Эксплvатация
Ничто в системе Salt не может быть включено в конфигурацию более одного раза,
это относится и к формулам. Вы можете сделать несколько запросов на включение, но
все они будут объединены. В результате формулы не могут быть созданы несколько раз
no образу и nодобию ролей в системе AnsiЫe.
В любом случае это не имеет значения, nоскольку в системе Salt не определен ни
какой другой сnособ передачи параметров в формулу, кроме как путем ввода значений
переменных в базовом элементе. (Выражения Jinja могут устанавливать значения пере
менных, но эти параметры существуют только в контексте текущего файла.) Чтобы смо
делировать эффект вызова формулы повторно, вы можете предоставить данные базового
элемента в виде списка или хеша, чтобы формула могла выполнять итерацию самосто
ятельно. Однако формула должна быть явно наnисана с учетом этой структуры. Вы не
можете навязать это постфактум.
Центральным репозиторием Salt для предложений, внесенных сообществом, в насто
ящее время является только GitHub. Ищите формулы Salt по имени salt-formulas.
Каждая формула nредставляет собой отдельный проект.
Среды
Ш Дополнительную информацию о средах см. в разделе 26.1.
Система Salt nредпринимает усилия в направлении явной поддержки сред (наnри
мер, разделение сред разработок, тестирования и производства). К сожалению, воз
можности ее сред несколько своеобразны, и они не сопоставляются nрямо с наиболее
расnространенными практическими случаями реального мира. Можно получить среду
и работать с небольшим количеством определений и шаблонами Jinja, а потом обнару
жить, что на практике многие организации просто вытаскивают и запускают отдельные
главные серверы для каждой среды. Это хорошо соответствует стандартам безопасности
и согласованности, которые требуют разделения сред на сетевом уровне.
Как мы видели ранее, в файле /etc/salt/master указываются различные места.
где может храниться информация о конфигурации. Он также связывает среду с каждым
набором путей.
file roots:
base:
- /srv/salt
pillar_roots:
base:
- /srv/pillar
Здесь /srv/salt и /srv/pillar - это корневые каталоги состояния и базового эле
мента с именем base. Для простоты мы не будем упоминать ниже о базовых элементах;
уnрамение окружающей средой работает одинаково для обеих ветвей базы конфигурации.
В сайтах с более чем одной средой обычно добавляется дополнительный слой в ие
рархию каталога конфигурации, чтобы отразить этот факт.
file roots:
base:
- /srv/base/salt
development:
- /srv/development/salt
production:
- /srv/production/salt
(Очевидно, что у этого примера нет тестовой среды. Не пытайтесь делать это дома!)
глава 23. Управление конфигурацией 899
В среде может быть указано несколько корневых каталогов. Если их несколько, сер
вер прозрачно объединяет их содержимое. Однако каждая среда выполняет отдельное
слияние, и конечные результаты остаются разделенными.
Внутри файлов top. sls (привязки, которые связывают миньоны с конкретными со
стояниями и файлами столбцов) ключи верхнего уровня всегда являются именами окру
жения. До сих пор мы видели только примеры, в которых использовалась базовая среда,
но, конечно, в этом месте может использоваться любая подходящая среда. Например, так.
base:
- global
development:
'*-dev':
- webserver
- database
production:
'*web*-prod':
- webserver
'*db*-prod' :
- database
Точный импорт внешнего вида среды в файл top. sls зависит от того, как вы на
строили систему Salt. Во всех случаях среды должны быть определены в основном фай
ле; файлы top не могут создавать новые среды. Кроме того, файлы состояний должны
исходить из контекста среды, в котором они упоминаются.
Также преимуществом является то, что по мере продвижения конкретной версии базы
конфигурации через цепочку окружения различные части файла top. sls автоматиче
ски применяются к клиентам.
development:
'*':
- global
'*-dev':
- webserver
- database
production:
'* 1 :
- global
Глава 23. Управление конфигурацией 901
'*web*-prod':
- webserver
'*db*-prod':
- database
Базовая среда сама по себе ямяется рудиментарной, поэтому мы исключили ее из
файла top. sls и скопировали прежнее содержимое этого ключа непосредственно
в среды разработки и производства.
Имейте в виду, что мы сейчас работаем в мире, где каждое дерево среды имеет свой
собственный файл top. sls. В этом примере мы предполагаем, что файл top. sls в обе
их средах ямяется одинаковым, поэтому одно и то же содержимое появится в обеих ко
пиях top. sls.
Конечно, ручное воспроизведение элементов общей конфигурации внутри каждой
среды подвержено ошибкам. Лучшим вариантом ямяется определение общей конфигу
рации как макроса Jinja, чтобы он мог повторяться автоматически.
{% macro baseline() %}
'* 1 :
- global
{% endmacro %}
development:
{ { baseline () } }
'*-dev':
- webserver
- database
production:
{ { baseline () } }
'*web*-prod':
- webserver
'*db*-prod':
- database
В этом сценарии мы предполагаем, что все миньоны привязаны к определенным
средам, поэтому теперь мы можем потенциально удалить индикаторы среды из иденти
24 Проблема заключается не в состоянии конфигурации, так как миньоны имеют свободный доступ
ко всем файлам состояния. Она связана с данными базовых элементов, которые собираются
на главной стороне и обычно должны быть защищены.
902 ЧастьlV.Эксплvатация
development:
- global
- webserver
- database
На выходе отображаются только те состояния, которые активны и выбраны для це
левого миньона. Другими словами, они являются состояниями, которые будут выnол
няться, если вы nрименяете функцию sta te. highsta te к этому миньону.
Обратите внимание на то, что все отображаемые состояния nостуnают из среды раз
работки. Поскольку миньон закреплен, это будет nроисходить всегда.
Документация
Документация системы Salt ( docs. salt s tac k. com), вероятно, заслуживает восхи
щения, но только nосле nериода разочарования. Основная проблема заключается в том,
что темы расположены на нескольких вложенных слоях, но заголовки в двух верхних
слоях не обязательно указывают на то, что вы найдете на третьем слое. Например, в раз
деле "Архитектура" нет информации об архитектуре Salt (на самом деле в нем речь идет
о многосерверных развертываниях).
Некоторые из наиболее полезных справочных материалов находятся в разделах, ко
торые организованы как сценарии или учебные пособия. Последовательное чтение ино
гда может вызывать у системных администраторов полное разочарование: темы под
Безопасность
Как указано в разделе '"Параметры доступа в системе AnsiЫe", ее можно сделать прак
тически сколь угодно безопасной. Единственный предел безопасности - ваша собствен
ная готовность заново набирать пароли и справляться с бюрократией безопасности.
Система хранения данных AnsiЫe позволяет хранить данные конфигурации в за
шифрованном формате. Это на самом деле довольно большое достижение, означающее,
что ни сервер AnsiЫe, ни база конфигурации не должны быть особенно безопасными.
(Модульная архитектура Salt, вероятно, позволяет легко добавить эту функцию, но она
не входит в первоначальный комплект поставки.)
Напротив, система Salt может быть лишь настолько же безопасной, насколько без
опасной является учетная запись root на главном сервере. Хотя сам главный демон
прост в настройке, сервер, на котором он запускается, должен получать самую сильную
защиту в вашей организации. В идеале мастер должен быть машиной или виртуальным
сервером, специально предназначенным мя этой задачи.
На практике администраторы ненавидят слишком навязчивые протоколы безопас
ности, также как и все остальные пользователи. Большинство реальных объектов AnsiЫe
имеют относительно слабую защиту. Подобно тому, как система AnsiЫe может быть
сколь угодно сильно защищенной, ее также можно сделать сколь угодно небезопас
ной. Даже если вы попытаетесь полностью защитить систему AnsiЫe, возможно, вам не
удастся сохранить этот подход, как только рост вашей организации достигнет того мо
мента, когда управление конфигурацией может выполняться путем ввода команд в окне
терминала администратором. Например, любое задание планировщика cron может тре
бовать от администратора ввода пароля. Работа над этим ограничением неизбежно при
водит к снижению безопасности до уровня учетной записи root.
Суть безопасности заключается в том, что система AnsiЫe дает вам больше как по
лезных, так и вредных возможностей. Она допускает более гибкое управление уровнями
безопасности, но это не обязательно означает, что она более безопасна. Любая система
подходит мя средней организации. Учитывайте ваши собственные потребности и огра
ничения при оценке этих систем.
Разное
Некоторые дополнительные сильные и слабые стороны систем AnsiЫe и Salt приве
дены в табл. 23.6 и 23.7.
Глава 23. Управление конфигурацией 905
Преимущества Недостатки
Операции могут использовать выходные данные друг Ясное и гибкое использование конфигурационных
друга каталогов.
Роли могут создаваться несколько раз Отсутствие демонов означает меньшее количество
возможностей
Более крупная база пользователей, чем у системы Salt Нет реальной поддержки сред
Преимущества Недостатки
Интегрированная поддержка облачных Формулы не могут быть включены более одного раза
серверов
23.8. РЕКОМЕНДАЦИИ
Если вы работаете над программным проектом, то можете обнаружить, что многие
проблемы, связанные с системами управления конфигурацией, характерны для раз
работки программ. Среда разработки имеет много схожих характеристик: несколько
платформ, несколько версий продукта, полученных из одной и той же кодовой базы,
несколько типов сборок и конфигураций и развертывание с помощью последовательных
этапов разработки, тестирования и производства.
Это сложные вопросы, а среды разработки - это всего лишь инструменты.
Разработчики используют множество дополнительных элементов управления - руко
водящие принципы разработки, принципы проектирования, стандарты кодирования,
внутреннюю документацию и четкие архитектурные границы, среди прочего - ограни
ние конфигурацией кажется обманчиво простым, как немного более общий и сложный
способ подходить к рутинным задачам сценариев. Поставщики систем управления кон
фиrурацией стараются усилить это впечатление. Их веб-сайты по леrкости и изяществу
можно сравнить с песнями сирен; на каждом из них есть учебное пособие, в котором
показано, как развернуть веб-сервер, выполнив всего десять строк кода конфиrурации.
На самом деле край пропасти может быть ближе, чем кажется, особенно коrда не
сколько администраторов вносят вклад в одну и ту же конфигурационную базу с течением
времени. Реальные характеристики даже для одноrо целевого сервера выполняются сотня
ми строк кода, разделенных на несколько разных функциональных ролей. Без координа
ции леrко превратить систему СМ в путаницу конфликтующего или параллельного кода.
Рекомендации зависят от системы управления конфигурацией и среды, но для боль
шинства ситуаций применяется несколько правил.
относятся к конкретным хостам. Кроме тоrо, вам, скорее всеrо, понадобится воз
можность в определенных случаях делать исключения. В зависимости от операций
вашей орrанизации вам также может потребоваться поддержка нескольких неза
висимых иерархий.
консультаций по этой теме, так как это одна из наиболее частых проблем, с кото
рой сталкиваются пользователи.
конфигурацией. 25
• Не позволяйте себе или вашей команде "временно отключать" систему СМ на хо
сте или использовать ручной метод переопределения системы СМ (например,
установку неизменяемого атрибута в файле конфигурации, который обычно на
ходится под контролем системы СМ). Эти изменения неизбежно забываются, воз
никают беспорядки или сбои.
23.9. ЛИТЕРАТУРА
• CowIE, JoN. Customizing Chef· Getting the Most Out о/ Your Infrastructure Automation.
Sebastopol, СА: O'Reilly Media, 2014.
• FRANK, FELIX, AND MARТJN ALFKE. Puppet 4 Essentials (2nd Edition). Birrningham, UK:
Packt PuЫishing, 2015.
• GEERLING, JEFF. Ansiьte for DevOps: Server and conflguration management for humans.
St. Louis, МО: Midwestem Мае, LLC, 2015. Эта книга ориентирована на основные
противоречивые споры, но она включает в себя также некоторые полезные ма
териалы об объединении системы AnsiЫe с конкретными системами, такими как
Y.igrant, Docker и Jenkins.
• HocнsтEIN, LoRJN. Ansiьte: Ир and Running (2nd Edition). Sebastopol, СА: O'Reilly
Media, 2017. Подобно книге Ansiьte for DevOps, эта книга охватывает как осно
вы AnsiЫe, так и взаимодействия с общими средами, такими как Vagrant и ЕС2.
Некоторые основные моменты включают в себя более крупную примерную кон
фигурацию, главу о написании собственных модулей AnsiЫe и советы по отладке.
• MoRRIS, KIEF. Infrastructure as Code: Managing Servers iп the Cloud. Sebastopol, СА:
O'Reilly Media, 2016. Эта книга содержит несколько специфических особенностей
управления конфигурацией как таковой, но она помогает понять, как управление
конфигурацией внедряется в более крупную схему DevOps и структурированное
администрирование.
• SEBENIK, CRAIG, AND Тномдs Ндтсн. Salt Essentials. Sebastopol, СА: O'Reilly Media,
2015. Это короткая и довольно схематичная книга, которая из.лагает основы систе
мы Salt. Это не стиль книги, который мы обычно рекомендуем, но, учитывая нео
бычность официальной документации, это потенциально полезная ссылка для тех,
кто ищет "альтернативное мнение".
• TAYLOR, М1sснА, AND SЕтн VARGo. Learning Chef" А Guide to Conflguration Management
and Automation. Sebastopol, СА: O'Reilly Media, 2013.
• UPНILL, Тномдs, AND JoнN ARUNDEL. Puppet Cookbook (Зrd Edition). Birmingham, UK:
Packt PuЫishing, 2015.
глава 24
Виртуализация
Гипервизоры
Гипервизор (также известный как монитор виртуальной машины) представляет собой
программный уровень, который посредничает между виртуальными машинами (VM)
и базовым оборудованием, на котором они работают. Гипервизоры отвечают за совмест
ное использование системных ресурсов среди гостевых операционных систем, которые
полная виртуализация
вых устройств, устройств управления прерываниями, материнских плат, BIOS и т.д. В этом
режиме, называемом полной виртуализацией, гостевые операционные системы запускают-
'Здесь приходит в голову закон Конвея (Conway): "Организации, которые проектируют системы,
вынуждены создавать проекты, которые являются копиями коммуникационных структур этих ор
ганизаций".
Глава 24. Виртуализация 911
ся без каких-либо изменений, что существенно снижает их скорость работы, потому что
гипервизор должен постоянно выполнять преобразование между реальным оборудовани
ем компьютера и виртуальным оборудованием гостевых операционных систем.
Имитация всего персонального компьютера - сложная задача. Большинство гиперви
зоров, которые предлагают полную виртуализацию, отделяют задачу поддержки несколь
Паравиртуализация
Паравиртуализация - это технология, используемая виртуальной платформой с от
крытым исходным кодом Xen, в которой модифицированная гостевая операционная си
стема распознает свое виртуальное состояние и активно взаимодеАствует с гипервизором
для организации доступа к аппаратному обеспечению. Этот подход значительно повыша
ет производительность, однако для этого гостевые операционные системы должны быть
сильно модифицированы, причем эти модификации зависят от конкретного гипервизора.
Аппаратная виртуализация
В 2004 и 2005 гг. компании lntel и AMD представили функции процессора (lntel VГ
и AMD-V), которые способствовали виртуализации на платформе х86. Эти расширения
позволяли реализовать "аппаратную виртуализацию", также известную как "ускоренная
виртуализация". В этой схеме процессор и контроллер памяти виртуализируются с помо
щью аппаратного обеспечения, хотя и под управлением гипервизора. Производительность
такой системы очень хорошая, и гостевые операционные системы не должны знать, что
они работают на виртуальном процессоре. В наши дни виртуализация с помощью аппа
ратного обеспечения является основным трендом.
Хотя центральный процессор является основной точкой соприкосновения между аппарат
ным обеспечением и гостевыми операционными системами, это всего лишь один из компо
нентов системы. Гипервизор все еще нужен в некотором роде для предстамения или эмуля
ции остальной части аппаратного обеспечения системы. Для этой задачи можно использовать
полную виртуализацию или паравиртуализацию. В некоторых случаях используется сочетание
подходов; это зависит от степени "осведомленности" гостевой системы о виртуализации.
Паравирmуализованные драйверы
Одно большое преимущество аппаратной виртуализации заключается в том, что она
в значительной степени ограничивает необходимость поддержки паравиртуализации
на уровне драйверов устройств. Все операционные системы позволяют добавлять допол
нительные драйверы, поэтому настройка гостевой системы с паравиртуализованными
дисками, видеокартами и сетевыми интерфейсами так же проста, как установка соот
ветствующих драйверов. Драйверы знают "секретный протокол", который позволяет им
использовать функции поддержки паравиртуализации гипернизора, а гостевая операци
онная система остается не в курсе дела.
Современная виртуализация
В самых последних версиях Xen и других гипервизоров более или менее устранена
необходимость в эмуляции устаревшего оборудования. Вместо этого они полагаются
на функции виртуализации на уровне процессора, паравиртуализованные драйверы го
стевой операционной системы и несколько дополнительных разделов паравиртуализо
ванного кода в гостевых ядрах. Xen называет этот режим РУН (ParaYirtualized Hardware),
и он считается близким к идеальной комбинации, которая дает оптимальную произво
дительность, но выдвигает минимально возможные требования к гостевым ядрам .
На практике или при чтении документации вы можете столкнуться с любым из ва
риантов виртуализации, описанных выше. Однако не стоит запоминать какую-либо
конкретную терминологию или слишком беспокоиться о виртуализационных режимах .
Границы между этими режимами являются нечеткими, и в гипервизоре обычно реализо
ваны лучшие варианты для данной гостевой операционной системы. Если вы обновите
свое программное обеспечение, то автоматически получите выгоду от последних улуч
шений. Единственной причиной выбора чего-либо, кроме режима работы по умолча
нию, является поддержка старого оборудования или устаревших гипервизоров.
Типыzипервизоров
Во многих справочных материалах сделаны несколько сомнительные различия между
гипервизорами "типа 1" и "типа 2". Гипервизор типа 1 работает непосредственно на аппа
ратном обеспечении без поддержки операционной системы, и по этой причине его иногда
называют аппаратным или машинно-зависимым гипервизором. Гипервизоры типа 2-
это приложения для пользовательского пространства, которые работают поверх другой
операционной системы общего назначения. Эти две модели показаны на рис . 24.1.
Тип 1 Тип 2
Гмпервкзортмпа 1 Гостевая ОС
Динамическая миграция
Виртуальные машины могут перемещаться между гипервизорами, работающими
на разных физических устройствах, в реальном времени, в некоторых случаях без пере
рывов в обслуживании или потери связи. Эта функция называется динамической мигра
цией. Ее секрет заключается в переносе памяти между исходными и целевыми хостами.
Гипервизор копирует изменения из источника в пункт назначения, и как только па
мять становится идентичной, миграция завершается. Динамическая миграция полезна
для балансировки нагрузки в системах высокой доступности, аварийного восстановле
ния, обслуживания серверов и общей гибкости системы.
Контейнеризация
Виртуализация на уровне операционной системы, или контейнеризация, - это дру
гой подход к изоляции, в котором не используется гипервизор. Вместо этого использу
ются функции ядра, которые позволяют изолировать процессы от остальной системы.
Каждый контейнер процесса (container, или jail) имеет персональную корневую файло
вую систему и пространство имен процессов. Процессы, содержащиеся в контейнере,
совместно используют ядро и другие службы хост-системы, но они не могут обращаться
к файлам или ресурсам за пределами своих контейнеров. Эта архитектура проиллюстри
рована на рис. 24.2.
Ш Дополнительную информацию о контейнерах см. в главе 25.
Поскольку для контейнеризации не требуется виртуализация, накладные расходы
на ресурсы для виртуализации на уровне операционной системы низки. Большинство
реализаций предлагают почти естественную производительность. Однако этот тип вир-
914 ЧастьlV.Эксплуатация
Имеет один или несколько виртуальных дисков , Образ файловой системы представляет собой много
выделенныхгипервизором уровневую структуру, определенную контейнером
·· ·--- ---- ---·- ----·--- -- ·--·- ·· --·· ·· ·•
Не больше нескольких десятков на каждый физи Большое количество на каждый виртуальный или фи
ческий хост зический хост
... .......... ........ .............•..... ....
Полная изоляция гостевых операционных систем Ядро операционной системы и службы совместно ис -
2 Это не совс ем так . Уровень эмул яuии Liпux о с истеме FгeeBSD допускает использование контей
неров Liпux на хостах FгeeBSD .
Глава 24. Виртуализация 915
Платформа Xen
Изначально Linuх-ориентированная платформа Xen была разработана Яном Праттом
(lan Pratt) как исследовательский проект Кембриджского университета (University of
Cambridge). Со временем она стала мощной платформой для виртуализации, которая
благодаря производительности, безопасности и дешевизне оказалась способной конку
рировать даже с коммерческими гигантами.
Вы увидите пустой экран и пройдете через все стандартные этапы инсталляции систе
мы Liпux в текстовом режиме, включая конфигурирование сети и выбор пакета. После
инсталляции гостевой домен перезагружается и готов к использованию. Для отсоединения
от гостевой консоли и возвращения в домен domO нажмите <Ctrl+ 1>.
Несмотря на то что в данном примере используется текстовая инсталляция, возмож
на также графическая поддержка этоrо процесса с помощью системы Virtual Network
Computing (VNC).
Конфигурация домена хранится в файле /etc/xen/chef. Этот файл выглядит сле
дующим образом.
name = "chef"
uuid = "a85e20f4-dllb-d4f7-1429-7339Ыd0d051"
maxmem = 512
memory = 512
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on reboot = "restart"
on crash = "restart"
vfb = [ ]
disk = [ "tap:aio:/vm/chef.dsk,xvda,w"
vif = [ "mac=00:16:3e:le:57:79,bridge=xenbr0"
Как видим, по умолчанию сетевой интерфейс настроен на мостовой режим. В нашем
случае устройство VBD представляет собой "блочный" файл, обеспечивающий более
высокую производительность, чем стандартный LoopBack файл. Файл образа диска, до
пускающий запись, предоставлен гостевой ОС под именем /dev/xvda.
Утилита xl удобна для ежедневного управления виртуальными машинами, напри
мер для их запуска и остановки, подключения к их консолям и исследования текущего
состояния. Ниже мы выводим список запущенных гостевых доменов, после чего под
ключаемся к консоли машины chef домена domU. Идентификаторы присваиваются
в порядке возрастания по мере создания гостевых доменов. При перезагрузке хоста их
нумерация сбрасывается.
$ sudo xl list
Name ID Mem(MiB) VCPUs State Time (s)
Domain-0 о 2502 2 r----- 397.2
chef 19 512 -ь---- 12.8
$ sudo xl console 19
Для того чтобы изменить конфигурацию гостевого домена (например, подключить
другой диск или перевести сеть из мостового режима в режим NAT), необходимо от
редактировать гостевой конфигурационный файл в каталоге /etc/xen и перезагрузить
гостевую систему.
Платформа KVM
КУМ (Kemel-based Virtual Machine) - это средство полной виртуализации, включа
емое по умолчанию в большинство дистрибутивов системы Linux. Необходимым усло
вием его применения является наличие расширений центрального процессора Intel УТ
и AMD-V для поддержки виртуализации. В типичных сценариях установки для реали
зации полностью виртуальной системы аппаратного обеспечения используется QEMU.
Хотя эта система изначально была предназначена для Li11ux, ее можно перенести в си
стему FreeBSD в виде загружаемого модуля ядра.
918 ЧастьlV.Эксплуатация
системы и управляющие ими, похожи друг на друга. Как и на платформе Xen, для созда
ния новых гостевых систем по технологии КУМ можно использовать программу virt-
install, а для управления ими - командуvirsh.
Флаги, передаваемые программе virt-install, могут немного отличаться от фла
гов, используемых при инсталляции платформы Xen. Например, флаг --hvm означа
ет, что для виртуализации гостевой системы должно использоваться аппаратное обе
спечение, а не паравиртуализация. Кроме того, аргумент --connect гарантирует, что
по умолчанию будет выбран правильный гипервизор, потому что утилита virt-install
поддерживает несколько гипервизоров. В заключение, чтобы получить выгоду от воз
можностей платформы КУМ, рекомендуется использовать аргумент --accelerate.
Следовательно, пример полной команды для инсталлирования гостевого сервера Ubuntu
с диска СО- ROM должен выглядеть следующим образом.
$ sudo virt-install --connect qemu:///system -n UЬuntuYakkety
-r 512 -f ~/uЬuntu-Yakkety.img -s 12 -с /dev/dvd --os-type linux
--accelerate --hvm --vnc
Would you like to еnаЫе graphics support? (yes or по)
Если дистрибутивный DУD-диск для системы Ubuntu вставлен в дисковод, эта ко
манда запускает процесс инсталляции и сохраняет гостевую систему в файле -/uЬuntu
Yaketty. img, позволяя увеличивать его размер до 12 Гбайт. Поскольку мы не указали
ни флаг --nographics, ни флаг --vnc, утилита virt-install спрашивает, включать ли
поддержку графики.
Утилита virsh запускает собственную оболочку, которая выполняет команды. Для
того чтобы открыть эту оболочку, наберите команду virsh --connect qemu: / / /
system. Следующая серия команд демонстрирует некоторые основные функциональ
ные возможности утилиты virsh. Для того чтобы увидеть полный список этих команд,
наберите команду help в оболочке или просмотрите справочную страницу.
3 UbuntuYakkety running
7 CentOS running
Windows2016Server shut off
virsh# start Windows2016Server
Domain WindowsServer started
virsh# shutdown CentOS
Domain CentOS is being shutdown
virsh# quit
1 Аббревиатура ESXi расшифровывается как "Elasic Sky Х, integrated". Даже не пытайтесь понять,
что это значит.
920 ЧастьlV.Эксплvатация
"builders": [ (
"type": "amazon-ebs",
"access key": "AKIAIOSFODNN7EXAМPLE" /
"secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAМPLEKEY",
''region'': ''us-west-2'',
"source ami": "ami-d440aбe7",
"instance_type": "t2 .medium",
"ssh username": "ubuntu",
"ssh_timeout": "Sm",
"subnet_id": "subnet-ef67938a",
"vpc_id": "vрс-51бЬ8934",
"associate_puЬlic_ip_address": true,
"ami_virtualization_type": "hvm",
"ami description": "ULSAH АМI",
"ami_name": "ULSAHSE",
"tags": (
"Name": "ULSAHSE Demo АМI"
}
}] /
"provisioners":
(
"type": "shell",
"source": "customize ami. sh"
Как любому инструменту командной строки нужны определенные параметры для за
пуска экземпляра, сборщику amazon-ebs нужны такие данные, как мандаты API, тип
экземпляра, исходный интерфейс AMI, на котором основывается новый образ, и под
сеть УРС, в которой должен располагаться экземпляр. Для выполнения этапа поставки
программа Packer использует службу SSH, поэтому мы должны убедиться, что экземпля
ру назначен общедоступный IР-адрес.
В этом примере сборщиком является сценарий оболочки под названием customize
ami. sh. Программа Packer копирует сценарий в удаленную систему с помощью команды
scp и запускает его. В этом сценарии нет ничего особенного; он может делать все, что вы
обычно делаете. Например, он может добавлять новых пользователей, загружать и настраи
вать программное обеспечение или выполнять шаги по укреплению системы безопасности.
Чтобы создать интерфейс AMI, выполните команду packer build:
$ packer build custom_ami.json
Команда packer build отмечает каждый шаг процесса сборки на консоли. Сборщик
amazon-ebs выполняет следующие этапы.
Если все работает правильно, программа Packer выводит идентификатор AMI, как
только он будет доступен для использования. Если во время сборки возникает пробле
ма, программа Packer выводит сообщение с ошибкой пурпурного цвета и выходит из си
стемы после очистки памяти.
При использовании арrумента -debug в команде packer build система будет при
останавливаться на каждом этапе, чтобы вы могли устранить проблемы. Вы также мо
жете использовать сборщик null для исправления любых ошибок, чтобы не запускать
экземпляр каждый раз при попытке запустить сборку.
24.8. ЛИТЕРАТУРА
• Веб-сайт virtualization. info является отличным источником текущих ново
стей, тенденций и сплетен в области виртуализации и облачных вычислений.
• интерпретатор (например, Python или Ruby) или среда выполнения (JRE) для вы
полнения кода, также связанные с конкретными версиями;
динация, потому что не всегда легко определить, кто несет ответственность за конкрет
Поддержка ядра
В контейнерном механизме используется несколько средств ядра, которые необходи
мы для изоляции процессов.
Образы
Образ контейнера похож на шаблон для контейнера. Образы используют точку мон
тирования объединенной файловой системы (union filesystem), обеспечивающую вы
сокую производительность и переносимость. Это позволяет использовать перекрытия
нескольких файловых систем для создания единой согласованной иерархии. 2 Образы
контейнеров представляют собой объединенные файловые системы, которые организо
ваны по образу и подобию корневой файловой системы типичного дистрибутива Linux.
Структура каталога и расположение бинарных файлов, библиотек и поддерживаю
щих файлов соответствуют стандартным спецификациям иерархии файловой системы
Linux. Для использования в качестве основы для образов контейнеров были разработа
ны специализированные дистрибутивы Linux.
Для создания контейнера на платформа Docker используется объединенная файловая
система UnionFS, предназначенная только для чтения и записанная в образе, к которой
добавляется уровень чтения-записи, обновляемый в контейнере. Когда контейнерные
процессы изменяют файловую систему, их изменения прозрачно сохраняются на уровне
1 Это аналогично системному вызову chroot, который необратимо устанавливает видимый про
цессу корневой каталог и тем самым отключает доступ к файлам и каталогам хоста, расположен
ным выше уровня chroot.
2 См. статью "А
brief l1istory of union mounts" на сайте LWN. net, а также, например, l wn. net /
Art i cles/3 9602 О.
926 ЧастьlV.Эксплуатация
Уровень2
Уровень 1 Только
для чтения
Уровень О
Базовый образ
Сеть
По умолчанию дЛЯ подключения контейнеров к сети используется сетевое про
странство имен и мост внутри хоста. В этой конфигурации контейнеры имеют частные
IР-адреса, недоступные за пределами хоста . При этом хост играет роль упрощенного
IР-маршрутизатора и проксирует трафик между внешним миром и контейнерами. Эта
архитектура позволяет администраторам контролировать. какие порты контейнера от
крыты для внешнего мира.
Для того чтобы противостоять своим недоброжелателям, компания Docker, lnc. стала
одним из основателей консорциума Open Container l11itiative, целью которого является
руководство развитием контейнерных технологий в здоро1юм конкурентном направ
лении, которое способствует стандартам и сотрудничеству. Вы можете об этом узнать
больше на сайте opencontainers. org. Для того чтобы облегчить развитие сообщества
среды выполнения Docker, в 2017 r. компания Dосkегосновала проект МоЬу и внедрила
в него основной репозиторий Docker Git (подробнее см. на сайте тobyproj ect. org).
Наше обсуждение платформы Docker основано на версии 1.13.1. Она поддерживает
исключительно быстрые темпы развития, а текущие функции постоянно изменяются.
Мы сосредоточимся на основах. но обязательно дополните наше описание справоч
ным материалом с сайта
docs . docker . сот. Вы также можете поработать с песочницей
на сайте
play-wi th-тoby. сот и лабораторной средой Docker на сайте labs. play-
with-docker. coт.
Базовая архитектура
Приложение docker - это запускаемая команда, которая обрабатывает все задачи
управления для системы Docker. Процесс dockerd - это резидентный процесс демона,
который реализует операции с контейнерами и образами . Команда docker может за
пускаться в той же системе, что и dockerd, и связыоаться с ним через сокеты домена
UNIX или взаимодействовать с dockerd с удаленного хоста с помощью протокола ТСР.
Эта архитектура изображена на рис . 25.2.
~
•
<
1
Экземпляры ф
~
<
1 Ubuпtu FreeBSD
Контейнеры Локальные образы
Т Управляет J Кешируе т
dockerd
или локального
е @' 8
сокета домена
Образ является шаблоном для контейнера. В него включены файлы, от которых зависят
процессы, выполняемые в экземпляре контейнера, такие как библиотеки, двоичные фай
лы операционной системы и приложения. В качестве удобных базовых образов можно ис
пользовать дистрибугивы Linux, поскольку они определяют полноценную рабочую среду.
Однако образ не обязательно должен основываться на дистрибугиве Linux. Исходным мо
жет быть пустой образ, предназначенный для создания других, более практичных образов.
Контейнер использует шаблон образа в качестве основы для выполнения. Когда
демон dockerd запускает контейнер, он создает уровень файловой системы с возмож
ностью записи, который отделен от исходного образа. Контейнер может читать любые
файлы и другие метаданные, хранящиеся в образе, но любые записи ограничиваются
собственным уровнем чтения-записи контейнера.
Реестр образов представляет собой централизованный набор образов. Демон dockerd
связывается с реестрами при выполнении команд docker pull и docker push.
Стандартным реестром, используемым по умолчанию, является Docker Hub, в котором
хранятся образы для многих популярных приложений. Большинство стандартных дист
рибуrивов Linux также опубликованы в виде образов Docker.
Вы можете запустить собственный реестр или добавить свои образы в частные ре
естры, размещенные на Docker Hub. Любая система, на которой запущена платформа
Docker, может извлекать образы из реестра, если сервер реестра доступен через сеть.
Инсталляция
Docker работает в операционных системах Linux, MacOS, Windows
Платформа
и FreeBSD, Linux является флагманской системой. Поддержка FreeBSD считается
но
экспериментальной. Посетите сайт docker. сот, чтобы выбрать способ инсталляции,
который наилучшим образом соответствует вашей среде.
Глава 25. Контейнеры 929
Настройка клиента
Если вы подключаетесь к локальному демону dockerd и принадпежите к груп
пе docker или имеете права sudo, то настройка клиента не требуется. Клиент docker
по умолчанию подключается к демону dockerd через локальный сокет. Вы можете из
менить стандартное поведение клиента через переменные среды.
$ export DOCКER_HOST=tcp://10.0.0.10:2376
Всеrда используйте TLS дЛЯ связи с удаленными демонами. Если вы используете от
крытый протокол НТГР, с тем же успехом вы можете свободно раздавать права пользо
вателя root всем, кто находится в вашей сети. Дополнительные сведения о конфигура
ции Docker TLS можно найти в разделе 25.3.
Мы также предпаrаем включить функцию Docker Content Trust:
$ export DOCКER_CONТENT_TRUST=l
Эта функция проверяет целостность и автора образов Docker. Включение этой функ
ции не позволяет клиентам извлекать образы, которым они не доверяют.
Если вы запускаете команду docker с помощью проrраммы sudo, то вы можете за
претить sudo очищать переменные среды с помощью флага -Е. Вы также можете ука
зать список сохраняемых переменных среды, установив значение переменной env_ keep
в файле /etc/sudoers. Например,
Defaults env_keep + = "DOCKER_CONTENT_TRUST"
JCo списком доступных образов можно ознакомиться на странице hub. docker. сот.
930 ЧастьlV.Эксплуатация
4 Это команда echo из проекта GNU. Не пуrайте ее с командой echo, встроенной в большинство
оболочек UN IX, хотя обе команды делают одно и то же.
Глава 25. Контейнеры 931
ляется общим.
Процессы в контейнерах не могут видеть другие nроцессы, заnущенные в системе,
из-за изолированного nространства PID. Тем не менее nроцессы на хосте могут видеть
контейнерные nроцессы. Идентификатор PID nроцесса, видимый из контейнера, отли
чается от PID, который виден из хоста.
Для реальной работы необходимы долговечные контейнеры, которые работают в фо
новом режиме и nринимают nодключения no сети. Следующая команда заnускает в фоно
вом режиме (-d) контейнер с именем ng inx, который соЗдается из официального образа
NGINX. Мы nрокладываем туннель с nорта 80 на хосте в тот же nорт в контейнере:
# docker run -р 80:80 --hostname nginx --name nginx -d nginx
UnaЫe to find image 'nginx:latest' locally
latest: Pulling from library/nginx
fdd5d7827f33: Already exists
a3ed95caeb02: Pull complete
e04488adab39: Pull complete
2af76486f8b8: Pull complete
Digest: sha256:a234ab64f6893b9al38llf2c8lb46cfac885cЫ41dcf4e275ed3
са18492аЬ4е4
Status: Downloaded newer image for nginx:latest
Occ36b0eбlb5a8211432acfl98c39f7Ыdf864a8132a2e696df55ed927d42cld
У нас не было локального образа nginx, nоэтому nлатформе Docker nришлось за
грузить его из реестра. Как только образ был загружен, nлатформа Docker заnустила
контейнер и вывела его идентификатор - уникальную шестнадцатеричную строку, со
стоящую ИЗ 65 СИМВОЛОВ.
Команда docker ps отображает краткий отчет о заnущенных контейнерах:
# docker ps
IМAGE COMМAND STATUS PORTS
nginx "nginx -g 'daemon off" Up 2 minutes 0.0.0.0:80->80/tcp
Мы не указали демону docker, что именно нужно заnускать в контейнере, nоэто
му он no умолчанию использовал команду, которая была указана при создании образа.
Вывод показывает, что этой командой является команда nginx -g 'daemon off' , ко
торая запускает nginx как процесс переднего плана, а не как фоновый демон. В кон
тейнере нет демона ini t для управления процессами, и если запустить сервер nginx
как демон, контейнер будет запущен, но сразу же завершен, когда процесс nginx будет
разветвлен и перейдет в фоновый режим.
Большинство демонов сервера поддерживают специальный флаг командной строки,
который заставляет их запускаться на переднем nлане. Если ваше программное обесnе
чение не может работать на nереднем nлане или если вам нужно заnустить несколько
nроцессов в контейнере, вы можете назначить систему уnравления процессами, такую
как supervisord, в качестве уnрощенной команды ini t для контейнера.
Если сервер NGINX работает в контейнере, а nорт 80 хоста был отображен на nорт
80 контейнера, то мы можем выnолнить НТТР-заnрос к контейнеру с nомощью npo-
932 ЧастьlV.Эксплvатация
Тома
Уровни файловой системы для большинства контейнеров состоят из статического кода
приложения, библиотек и других системных или вспомогательных файлов. Уровень фай
ловой системы чтения-записи позволяет контейнерам производить локальные модифика
ции. Однако большая зависимость от объединенной файловой системы не является луч
шим решением для приложений с интенсивным использованием данных, таких как базы
данных. Для таких приложений в платформе Docker используется понятие тома.
Том (volume) представляет собой независимый, доступный для записи каталог в кон
тейнере, который поддерживается отдельно от объединенной файловой системы. Если
контейнер удален, то данные в томе сохраняются и могут быть доступны из хоста. Тома
также могут быть распределены между несколькими контейнерами.
Мы добавляем том в контейнер с помощью аргумента -v команды docker:
# docker run -v /data --rm --hostname wеЬ --name wеЬ -d nginx
Если каталог /data уже существует в контейнере, все найденные там файлы копиру
ются в том. Найти том на хосте можно с помощью команды docker inspect.
# docker inspect -f '{{ json .Mounts }}' wеЬ
"Mounts": [
"Name": "8 f02 6ebb9c0cda27 44 lfЬ7 fd27 5с8е7 67 685f2 60 ... f5fdl 939823558",
"Source": "/var/liЬ/docker/volumes/8f026ebb9cOcda ... 93823558/_data",
"Destination": "/data",
''Driver'': ''local'',
"Mode": "",
"RW": true,
"Propagation":
Контейнеры данных
Одним из полезных проектных решений, которое возникло из реального опыта, яв
ляется контейнер, предназначенный только дпя данных. Его цель - сохранить конфи
гурацию тома для других контейнеров, чтобы эти контейнеры можно было легко пере
запустить и заменить.
Создайте контейнер данных, используя либо обычный том, либо том. смонтирован
ный с привязкой на хосте. Контейнер данных при этом никогда не запускается.
# docker create -v /шnt/data:/data --name nqinx-data nqinx
Теперь вы можете использовать том контейнера данных в контейнере, где запускает
ся сервер nginx:
# docker run --volUD1es-from nqinx-data -р 80:80 --name wеЬ -d nqinx
Контейнер web имеет доступ на чтение и запись к тому /data, который на самом
деле является контейнером данных с именем nginx-data. Контейнер web может быть
перезапущен, удален или заменен, но пока при его запуске указан параметр --volumes-
from, файлы в каталоге /data будут оставаться неизменными.
no правде говоря, идея объединения сохраняемых данных с контейнерами немного не
соответствует принятым стандартам. Контейнеры должны создаваться и удаляться неза
медпительно в ответ на внешние события. Идеальным решением является наличие парка
идентичных серверов, на которых запущен демон dockerd, причем контейнеры могут быть
размещены на любом из серверов. Однако, когда вы добавляете сохраняемые тома данных,
контейнер становится привязанным к определенному серверу. Как бы нам ни хотелось жить
в идеальном мире, многим приложениям периодически нужны сохраняемые данные.
Сети Docker
Как обсуждалось выше в разделе "Сеть", существует несколько способов подключе
ния контейнеров к сети. Во время установки система Docker создает три стандартных
сетевых опции. Вывести их можно с помощью команды docker network ls.
# docker network ls
NETWORK ID NАМЕ DRIVER
6514е7108508 bridge bridge
Глава 25. Контейнеры 935
Мост - это функция ядра Linux, соединяющая два сегмента сети. Во время инсталля
ции система Docker автоматически создает на хосте мост, называемый dockerO. Система
Docker выбирает пространство имен 1Р-адресов для дальней стороны моста, которое по ее
расчетам вряд ли войдет в конфликт с любыми другими сетями, доступными из хоста.
Каждому контейнеру предоставляется виртуальный сетевой интерфейс с пространство:v~
имен, который имеет IР-адрес в пределах мостового сетевого диапазона.
Алгоритм выбора адресов практичен, но не идеален. В вашей сети могут быть марш
руты, которые не видны с хоста. Если произойдет коллизия, хост больше не сможет по
лучить доступ к удаленной сети с перекрывающимся адресным пространством. но смо
жет получить доступ к локальным контейнерам. Если вы оказались в такой ситуашш
или вам нужно изменить адресное пространство моста по какой-либо другой причине,
используйте аргумент --fixed-cidr демона dockerd.
Пространства имен в сети зависят от виртуальных интерфейсов, странных конструк
ций, создаваемых парами. где одна сторона находится в пространстве имен хоста, а дру
гая - в контейнере. Таким образом, потоки данных, входящие на одном конце пары
и выходящие на другом, соединяют контейнер с хостом. В большинстве случаев контей
нер имеет только одну такую пару. Эту концепцию иллюстрирует рис. 25.3.
Контейнер #1
eth0:172.17.42.13
enpOsЗ
10.0.2.15
Контейнер #2
eth0:172.17.42.19 Внешняя
сеть
Одна половина каждой пары видна из сетевого стека хоста. Например, ниже пред
ставлены видимые интерфейсы на хосте CentOS с одним запущенным контейнером.
Оверлейные сети
Платформа Docker имеет много дополнительных функциональных возможностей,
предназначенных для сложных сценариев использования. Например, можно создавать
пользовательские частные сети, которые автоматически связывают контейнеры. С по
мощью программного обеспечения для оверлейных сетей контейнеры, работаюшие
Глава 25. контейнеры 937
на отдельных хостах, могут маршрутизировать трафик друr к другу через частное сетевое
адресное пространство. Технология Virtual eXtensiЫe LAN (VXLAN), описанная в спец
ификации RFC7348, представляет собой одну систему, которая может быть объединена
с контейнерами для реализации расширенных сетевых возможностей. За дополнитель
ной информацией обратитесь к документации по сетям Docker.
Драйверы хранилищ
Системы UNIX и Linux предлагают несколько способов реализации объединенной
файловой системы. Платформа Docker не зависит от этих способов реализации и про
пускает все операции с файловой системой через выбранный вами драйвер хранилища.
Драйвер хранилища настроен как часть параметров запуска демона докеров. Ваш
выбор механизма хранения имеет важные последствия для производительности и ста
бильности, особенно в производственных средах, поддерживающих многие контейнеры.
Текущий набор драйверов приведен в табл. 25.2.
Таблица 25.2. Драйверы хранилищ Docker
Драйвер Описание и комментарии
zfs Использует файловую систему с поддержкой копирования при записи ZFS (см. раздел 20.12)
По умолчанию предусмотрен для системы FreeBSD
Считается экспериментальным в системе Linux
контейнера. Однако эта реализация проста и надежна. Если ваш сценарий использова-
938 ЧастьlV.Эксплуатация
Сборка образа
Вы можете заключить собственные приложения в контейнеры, создавая образы, со
держащие код приложения. Процесс сборки начинается с базового образа. Добавьте
свое приложение, внося любые изменения в качестве новых уровней и сохраняя образ
в локальной базе образов. Затем вы можете создавать контейнеры из этого образа. Вы
также можете занести свой образ в реестр, чтобы сделать его доступным для других си
стем, работающих с платформой Docker.
Каждый слой образа идентифицируется криптоrрафическим хешем его содержимого.
Хеш служит системой проверки, которая позволяет платформе Docker подтвердить, что
никакое повреждение или злонамеренное вмешательство не изменило содержание образа.
'Источником может быть файл, каталог, архив tar или удаленный ресурс, заданный URL.
$ cat index.html
<!DOCTYPE html>
<title>ULSAH index.html file</title>
<р>А simple Docker image, brought to you Ьу ULSAH.</p>
$ cat Dockerfile
FROM nginx
# Add а new index.html to the document root
ADD index.html /usr/share/nginx/html/
942 ЧастьlV.Эксплуатация
Мы можем убедиться, что наш образ указан среди локальных образов, выполнив ко
манду docker images.
# docker iшaqes 1 qrep ulsah
REPOSITORY TAG IМAGE ID CREATED SIZE
nginx ulsah c0c25eaf7415 З minutes ago 134. 6 мв
Чтобы удалить образы, выполните команду docker rmi. Вы не можете удалить об
раз, пока не остановите и не удалите все контейнеры, которые его используют.
Реестры
Реестр - это индекс образов платформы Docker, к которому демон dockerd может
получить доступ через протокол НТТР. Когда запрашивается образ, не существующий
на локальном диске, демон dockerd извлекает его из реестра. Образы загружаются в ре
естр с помощью команды docker push. Хотя операции с образами инициируются ко
мандой docker, только демон dockerd фактически взаимодействует с реестрами.
Docker Hub - это общедоступная служба реестра, поддерживаемая компанией
Docker, Inc. Она содержит образы для многих дистрибутивов и проектов с открытым ис
ходным кодом, включая все рассматриваемые нами примеры Linux-cиcтeм. Целостность
этих официальных образов проверяется с помощью системы доверенного контента,
гарантируя тем самым, что загружаемый образ предоставляется поставщиком, чье имя
Глава 25. Контейнеры 943
'Тег registry: 2 отличает реестр последнего поколения от предыдущей версии, которая реализует
интерфейс API, несовместимый с текущими версиями платформы Docker.
944 ЧастьlV.Эксплуатация
Ведение журнала
Для вывода диаrностических сообщений в приложениях UNIX и Linux традиционно
используется система Syslog (теперь демон rsyslogd}. Система Syslog выполняет филь
трацию сообщений в журналах, а также их сортировку и маршрутизацию в удаленные
системы. В некоторых приложениях система Syslog не используется, и вместо этого со
общения записываются непосредственно в файлы журнала.
Система Syslog не запускается в контейнерах. Вместо этого система Docker собирает
диагностические сообщения с помощью специальных драйверов ведения журнала. Для
этого контейнерные процессы должны записывать сообщения только в поток STDOUT,
а ошибки - только в поток STDERR. Система Docker собирает эти сообщения и отправля
ет их в указанный пункт назначения.
Если ваше программное обеспечение поддерживает ведение журнала только с помо
щью файлов, примените тот же метод, что и в примере с сервером NGINX, приведен
ном выше: при сборке образа создайте символические ссылки из файлов журнала в по
токи /dev/stdout и /dev/stderr.
СистемаDocker пересылает журнальные записи, которые она получает, выбираемому
драйверу ведения журнала. В табл. 25.4 перечислены некоторые из наиболее распростра
ненных и полезных драйверов ведения журнала.
"Журнальные записи, хранящиеся таким образом, доступны для просмотра с помощью команды docker logs.
6 Поддерживает протоколы UDP, ТСР и ТСР+TLS.
Советы по безопасности
Безопасность контейнеров зависит от процессов, выполняемых внутри контейнеров,
которые не могут получить доступ к файлам, процессам и другим ресурсам вне их пе
сочницы. Уязвимости, позволяющие злоумышленникам вырваться из контейнеров, из
вестны как атаки на прорыв (breakout attack), - это серьезные, но редкие атаки. Код,
лежащий в основе изоляции контейнеров, был включен в ядро Linux по крайней мере
с 2008 г.; он зрелый и стабильный. Как и в случае с незащищенными или виртуализо
ванными системами, небезопасные конфигурации являются гораздо более вероятным
источником компрометации, чем уязвимости на изолирующем уровне.
$ id
uid=lOOl(ben) gid=lOOl(ben) groups=lOOl(ben) ,992(docker)
# docker run --rm -v /:/host -t -i deЬian bash
root@e5lae86c5f7b:/# cd /host
root@e51ae86c5f7b:/host# ls
bin dev home lib64 mnt proc run srv test usr
boot etc lib media opt root sЬin sys tmp var
Эти сообщения показывают, что любой пользователь в группе docker может под
ключить корневую файловую систему хоста к контейнеру и получить полный контроль
над ее содержимым. Это всего лишь один из многих возможных способов повышения
привилегий с помощью платформы Docker.
Если по умолчанию для связи с демоном вы используете сокет домена UNIX, добавь
те только доверенных пользователей в группу doc ke r, которая имеет доступ к со кету.
Еще лучше контролировать доступ с помощью программы sudo.
Используйте ТLS
Мы говорили об этом раньше и повторим еще раз: если демон dockerd должен быть
доступен удаленно по сети (запущен с параметром -Н), необходимо использовать про
токол TLS для шифрования сетевых сообщений и взаимной аутентификации клиента
и сервера.
Глава 25. контейнеры 947
Таблица 25.5. Арrументы TLS, общие для проrраммы docker и демона dockerd
Арrумент Значение ипи арrумент
--tlsverify Требуется аутентификация
•Необязательный аргумент. По умолчанию находится в каталоге ~ / . docker / {cert, key, са) . pem.
Успешное использование протокола TLS зависит от зрелости процессов управления
сертификатами. Выдача сертификатов, аннулирование и истечение срока их действия -
вот некоторые из вопросов, которые требуют внимания. В основном - это бремя адми
нистратора, ответственного за безопасность.
Ограничивайте во3можности
Вы также можете удалить все привилегии и добавить обратно те, которые вам нужны:
i docker run --cap-drop ALL --cap-add NET_RAW deЬian:jessie
948 ЧастьlV.Эксплуатация
Защищайте образы
Функция доверия в системе Docker позволяет проверять подr1инность и целостность
образов в реестре. Издатель образа подписывает его секретным ключом, а реестр прове
ряет его с помощью соответствующего открытого ключа. Этот процесс гарантирует, что
образ был создан ожидаемым автором. Вы можете использовать доверительное содер
жимое дr1я подписывания собственных образов или дr1я проверки образов в удаленном
реестре. Эта функция доступна в хранилище Docker Hub и в некоторых независимых
реестрах, таких как Artifactory.
К сожалению, большая часть содержимого в хранилище Dockeг Hub является не
подписанной и должна считаться ненадежной. На самом деле большинство образов
в Docker Hub никогда не исправляются, не обновляются и не проверяются каким-либо
образом.
Отсутствие надлежащей цепи доверия, ассоциированной со многими образами
Docker, является показателем жалкого состояния безопасности в Интернете в целом.
Обычно пакеты программного обеспечения зависят от сторонних библиотек, которые
мало или вообще не заботятся о достоверности заложенного в них содержимого. В неко
торых хранилищах программного обеспечения нет криптографических подписей вооб
ще. Также часто можно встретить статьи, авторы которых активно поощряют отключе
ние проверки. Ответственные системные администраторы должны очень подозрительно
относиться к неизвестным и ненадежным репозиториям программного обеспечения.
Административное управление
Агент Контейнер Планировщик контейнера
Механизм Контейнер
Управление
контейнера
Контейнер
Входящий запрос
Контейнер Сетка маршрутизации
Узnы
Kubernetes
Название Kubernetes иногда сокращается до "k8s", потому что между первой бук
вой k и последней буквой s стоят восемь букв. Так называется проект, который стал
лидером в области управления контейнерами. Он разработан компанией Google и был
запущен частью из тех же разработчиков, которые работали над проектом Borg, менед
жером внутреннего кластера Google. Kubernetes был выпущен в качестве проекта с от
крытым исходным кодом в 2014 г. и теперь имеет более тысячи активных участников.
Он имеет большинство функциональных возможностей и самый быстрый цикл разра
ботки любой системы, о которой мы знаем.
Программное обеспечение Kubernetes состоит из нескольких отдельных служб, кото
рые объединяются для формирования кластера. К его основным строительным блокам
относятся следующие компоненты.
Для обеспечения высокой доступности первые три элемента в этом списке выпол
няются на нескольких главных серверах (которые могут при необходимости выполнять
двойные обязанности как узлы кластера). Процессы Kubelet и cAdvisor запускаются
на каждом узле, обрабатывают запросы от менеджера контроллеров и сообщают стати
стику о состоянии своих задач.
Mesos и Marathon
Mesos - проект совершенно другоrо рода. Он был задуман в Калифорнийском уни
верситете в Беркли около 2009 г. как универсальный менеджер кластера. Он быстро
пробился в Twitter, где теперь работает на тысячах узлов. Сегодня Mesos ямяется при
оритетным проектом от организации Apache Foundation и может похвастаться большим
количеством корпоративных пользователей.
Основными концептуальными объектами в Mesos являются мастера, агенты и кар
касы. Мастер - это посредник между агентами и каркасами. Мастера ретранслируют
предложения системных ресурсов от агентов к каркасам. Если у каркаса есть задача
для выполнения, он выбирает предложение и отдает мастеру приказ выполнить задачу.
Мастер отпрамяет данные задачи агенту.
Marathon - это каркас системы Mesos, который развертывает контейнеры и управ
ляет ими. Он включает красивый пользовательский интерфейс для управления прило
жениями и простой интерфейс RESTful API. Чтобы запустить приложение, вы пишете
определение запроса в формате JSON и отправляете ero в Marathon через API или поль
зовательский интерфейс. Поскольку это внешний каркас структуры, его развертывание
является гибким. Для удобства Marathon может работать на том же узле, что и мастер,
или же запускаться извне.
'Строго говоря, это верно и для системы KuЬernetes и Mesos, но мы обнаружили, что обьlчной
практикой в конфигурациях с высокой доступностью является отделение мастеров от агентов.
954 ЧастьlV.Эксплуатация
Поскольку служба является "почти управляемой", порог д;1я входа низкий. Вы мо
жете начать работу с ECS всего за несколько минут. Служба хорошо масштабируется
по меньшей мере до сотен узлов и тысяч одновременных задач.
Служба ECS взаимодействует с другими службами AWS. Например, балансировка на
грузки между несколькими задачами вместе с обнаружением необходимых служб обра
батывается службой Application Load Balancer. Вы можете добавить ресурс в свой кластер
ECS, воспользовавшись автоматическим масштабированием службы ЕС2. Она также
интегрирована со службами ldentity и Access Manager инфраструктуры AWS, что поз
воляет предоставлять разрешения д;1я задач вашего контейнера с целью взаимодействия
с другими службами.
Одной из наиболее проработанных частей ECS является встроенный реестр образов
Docker. Вы можете загружать образы Docker в реестр ЕС2 Container Registry, где они хра
нятся и становятся доступными любому клиенту Docker, независимо от того, работает он
со службой ECS или нет. Если вы используете контейнеры в инфраструктуре AWS, ис
пользуйте реестр контейнеров в той же области, что и ваши экземпляры. Так вы достиг
нете ropa3110 большей надежности и производительности, чем с любым другим реестром.
ECS, хотя и функциональный, но ему присущи огра
Пользовательский интерфейс
ничения других интерфейсовAWS. Инструмент AWS CLI имеет полную поддержку API
ECS. Для управления приложениями в службе ECS мы рекомендуем обратиться к сто
ронним инструментам с открытым исходным кодом, таким как Empire (github. com/
remindlOl/empire) или Convox (convox. com).
25.5. ЛИТЕРАТУРА
• DocкER, INc. Ojficial Docker Documentation. docs. docker. com. Платформа Docker
имеет хорошую документацию. Она является исчерпывающей и, как правило, ак
туальной.
• Моuлт, ADRIAN. Using Docker: Developing and Deploying software with Containers.
Sebastopol, СА: O'Reilly Media, 2016. Эта книга охватывает темы от базового
до продвинутого и включает в себя множество примеров.
• TLJRNBULL, JлмЕs.
The Docker Book. www. dockerbook. сот.
• Блоr Container Solutions на сайте container-solutions. com/Ьlog содержит тех
нические советы, рекомендации и интервью с экспертами по контейнерам.
Глава 26
Непрерывная интеграция
и доставка
,/
Еще nримерно десять лет назад обновление nрограммного обеспечения было труд
ным и долгим делом. В nроцессе выnуска обычно исnользовались сnециальные, кустар
ные сценарии, которые вызывались в загадочном nорядке и соnровождались устаревшей
и неnолной документацией. Тестирование - если оно вообще существовало - вы
nолнялось груnnой контроля качества, которая была далека от цикла разработки и ча
сто становилась серьезным nреnятствием для nоставки кода конечному nотребителю.
Администраторы, разработчики и руководители nроектов были вынуждены nланировать
мительные nроцедуры на nоследних этаnах выnуска обновлений для текущих nользова
телей. Перебои в обслуживании часто nланировались за несколько недель.
Учитывая этот сомнительный контекст, неудивительно, что некоторые очень умные
люди усердно работали над улучшением ситуации. В конце концов там, где одни видят
только nроблемы, другие видят возможность.
Одним из наиболее мудрых сnециалистов в этой области является Мартин Фаулер
(Martin Fowler), оракул индустрии nрограммного обесnечения и главный научный со
трудник влиятельной консалтинговой комnании ThoughtW:>rks. В nроницательной статье
(goo. g l/Y2 li s I) Фаулер оnисывает неnрерывную интеграцию (Continuous Integration)
как "nрактику разработки nрограммного обесnечения, в которой члены команды часто
интегрируют свою работу", тем самым устраняя одну из главных nроблем в работе nро
граммноrо обесnечения: утомительную задачу согласования фрагментов кода, которые
отдалились друг от друга в течение длительного nериода независимой разработки. В на-
956 ЧастьlV.Эксплvатация
Принципы и практика
Гибкость бизнеса является одним из ключевых преимуществ подхода CI/CD.
Непрерывное развертывание облегчает выпуск проверенных функций на производстве
в течение нескольких минут или часов вместо недель или месяцев. Поскольку каждое
изменение собирается, тестируется и развертывается немедленно, разница между вер
сиями становится намного меньше. Это снижает риск развертывания и помогает сузить
круг причин возможных неполадок. Вместо того чтобы организовывать небольшое ко
личество развертываний в год после внесения большого количества изменений, вы мо
жете выпускать новый код несколько раз в неделю или даже в день.
Подход Cl/CD стимулирует выпускать новый функционал больше и чаще. Эта цель
достижима только тогда, когда разработчики пишут, отлаживают и фиксируют в общем
хранилище небольшие фрагменты кода. Чтобы реализовать непрерывную интеграцию,
разработчикам необходимо проводить фиксацию изменений кода не реже одного раза
в день после проведения локальных тестов.
Сквозная автоматизация
Сборка, тестирование и развертывание кода без ручного вмешательства является
ключом к надежным и воспроизводимым обновлениям. Даже если вы не планируете по
стоянно развертывать код на производстве, конечный шаг развертывания должен вы
полняться без вмешательства человека.
Разделяйте ответственность
Если что-то пойдет не так, конвейер необходимо исправить. Никакой новый код не
может быть внедрен до тех пор, пока предыдущая проблема не будет решена. Это экви
валентно остановке сборочной линии на производстве. Вся команда обязана исправить
сборку, прежде чем возобновить работу по разработке.
Подход CI/CD не должен быть таинственной системой, которая работает в фоновом
режиме и иногда отправляет электронную почту, если что-то идет не так, как ожидалось.
Каждый член команды должен иметь доступ к интерфейсу CI/CD для просмотра па
нелей мониторинга и журналов. В некоторых организациях создаются юмористические
виджеты, такие как светильники RGB, которые служат визуальным индикатором теку
щего состояния конвейера.
Аудит и проверка
Часть системы Cl/CD включает подробную историю каждого выпуска программного
обеспечения, включая его переход от разработки к производству. Эта возможность от
слеживания может быть полезна для обеспечения развертывания только авторизован
ных сборок. Параметры и временные рамки событий, связанные с каждой средой, могут
быть неопровержимо подтверждены.
Среды
Приложения не работают изолированно. Они зависят от внешних ресурсов, таких
как базы данных, прокси-серверы, сетевые файловые системы, записи DNS, удаленные
интерфейсы НТТР АР!, другие приложения и внешние сетевые службы. Среда выполне
ния включает все эти ресурсы и все остальное, что необходимо для приложения, чтобы
оно могло работать. Создание и поддержание такой среды является объектом значитель
ного административного внимания.
проверок безопасности.
Даже такой тип различий между средами может вызвать непредвиденные проблемы.
Неправильная конфигурация балансировки нагрузки, которая не имеет значения в сре
дах разработки и тестирования, может выявить дефект. Или запрос базы данных, кото
рый быстро запускается в средах разработки и тестирования, может оказаться намного
медленнее при применении к данным производственного масштаба.
Совместимость производственных мощностей в средах более низкого уровня - сложная
проблема. Стремитесь иметь хотя бы одну среду более низкого уровня, у которой есть избы
точность там же, где она есть в производственной среде (например, несколько неб-серверов,
Глава 26. Непрерывная интеграция и доставка 961
Флаги функций
Флаг функции включает или отключает функцию приложения в зависимости от зна
чения параметра конфигурации. Разработчики могут создавать поддержку флагов
функций в своем программном обеспечении. Вы можете использовать флаги функций
ДllЯ включения определенных функций в определенных средах.
Например, вы можете включить некоторую функцию в тестовой среде, оставив ее
отключенной в производственной среде до тех пор, пока она не будет полностью про
тестирована и готова ДllЯ широкого использования.
26.2. КОНВЕЙЕРЫ
Конвейер Cl/CD представляет собой последовательность шагов, называемых этапа
ми. Каждый этап - это по существу сценарий, который выполняет задачи, специфич
ные для вашего программного проекта.
На рис. 26. \ показаны этапы простого (но вполне зрелого) конвейера Cl/ CD.
Зрелость
Процесс сборки
Сборка - это моментальный снимок текущего состояния программного проекта.
Это, как правило, первый этап любого конвейера Cl/CD, возможно, после этапа ана
лиза кода, на котором происходит контролирование качества кода и поиск угроз без
опасности . Этап сборки преобразует код в инсталлируемую часть программного обеспе
чения . Сборка может быть инициирована фиксацией в ветке интеграции репозитория
кода либо выполняться по регулярному расписанию или по требованию.
Каждый запуск конвейера начинается со сборки, но не каждая сборка достигает
производства. После того как произойдет тестирование, сборка станет "кандидатом
на выпуск". Если кандидат на выпуск фактически развертывается для работы в произ
водственной среде, он становится "выпуском". Если вы выполняете непрерывное раз
вертывание, каждый кандидат на выпуск также является выпуском . Эти категории про
и.1люстрированы на рис. 26.2.
Кандидаты
Сборки
на выпуск
(
Каждый раз
)
После прохождения Развертывание
при изменении кода
всех тестов для производства
Тмn Предназначение
Файл . jar или . war Архив Java или архив веб-приложений Java
Статический двоичный файл Статически скомпилированные программы, обычно на языках С или Go
Файл . rpm или . dеЬ Пакеты программного обеспечения для операционных систем Red Hat или
Deblan
Пакет pip или пакет qem Упакованные приложения Python или Ruby
Образ контейнера Приложения, выполняемые на платформе Docker
Образ машины Виртуальные серверы, особенно для открытых или закрытых облаков
Файл .ехе Исполняемый файл Windows
Тестирование
На каждом этапе конвейера Cl/CD выполняются тесты, чтобы выявлять ошибочный
код и плохие сборки, чтобы код, который дошел до этапа производства, не имел дефек
тов (или по крайней мере был как можно более надежным). Основой этого процесса яв
ляется тестирование. Это порождает доверие к тому, что выпуск готов к развертыванию.
Если сборка не проходит какой-либо тест, оставшиеся этапы конвейера не имеют
смысла. Команда разработчиков должна определить, почему сборка не удалась, и ре
шить основную проблему. nоскольку сборки создаются для каждой фиксации кода, лег
ко изолировать проблему до последней фиксации. Чем меньше строк кода изменяется
между сборками, тем легче изолировать проблему.
Неудачи не всегда связаны с ошибками программного обеспечения. Они могут воз
никать из-за проблем с сетью или ошибок инфраструктуры, требующих административ
ного внимания. Если приложение зависит от внешних ресурсов, таких как сторонние
API, сбои могут возникать во внешнем ресурсе. Одни тесты могут выполняться изоли-.
рованно, но для других тестов требуется та же инфраструктура и данные, которые будут
присутствовать в производственной версии.
Рассмотрите возможность добавления каждого из следующих типов тестов в конвей
ер Cl/CD.
• Анализ статического кода позволяет выявить синтаксические ошибки, дублирова
ния, нарушения правил кодирования, проблемы с безопасностью или чрезмерной
сложностью. Эти проверки выполняются быстро и не требуют выполнения факти
ческого кода.
код. Цель состоит в проверке ввода и вывода каждого метода и функции (модуля)
в коде. "Покрытие кода" - это (иногда вводящий в заблуждение) показатель, кото
рый описывает, какая часть кода подвергается модульному тестированию. 1
• Тесты интеграции - это модульные тесты, которые выполняются после запуска
приложения в его предполагаемой среде исполнения. Эти тесты запускают прило
жение с его базовыми каркасами и внешними зависимостями, такими как внеш
ние API, базы данных, очереди и кеши.
1 Код, который трудно тестировать, скорее всего, имеет дефекты. У вашего кода может быть 85%
покрытия кода (что довольно много по отраслевым стандартам), но если самый сложный код не
протестирован, ошибки могут быть пропущены. Одно лишь покрытие кода не ямяется адекватной
мерой качества кода.
Глава 26. Непрерывная интеграция и доставка 965
Развертывание
Развертывание - это процесс установки программного обеспечения и подготов
ки его для использования в среде сервера. Специфика того, как это делается, зависит
от набора технологий. Система развертывания должна понимать, как извлечь артефакт
сборки (например, из репозитория пакетов или реестра образов контейнеров), как уста
новить его на сервере и какие шаги настройки необходимы, если таковые имеются.
Развертывание завершается, когда новая версия программного обеспечения запущена,
а старая версия отключена.
• Запустите базовый сценарий оболочки, который вызывает программу ssh для вхо
да в систему, загрузки и установки артефакта сборки, а затем перезапускает при
ложение. Эти типы сценариев обычно разрабатываются самостоятельно и не вы
ходят за рамки небольшого количества систем.
Эта стратегия работает особенно хорошо, когда трафик проксируется через баланси
ровщик нагрузки. Реальные системы обрабатывают все пользовательские соединения,
пока готовятся резервные системы. В подходящий момент можно добавить в баланси
ровщик нагрузки резервные системы и удалить предыдущие системы. Развертывание за
вершено, когда все старые системы находятся вне ротации и все транзакции, которые
Jenkins - это сервер автоматизации, написанный на языке Java. Это, безусловно, са
мое популярное программное обеспечение, используемое для реализации подхода CI/
CD. Благодаря широкому внедрению и обширной экосистеме подключаемых модулей
Jenkins хорошо подходит для различных вариантов использования.
Сервер Jenkins несложно запустить в контейнере Docker:
$ docker run -р 8080:8080 --name jenkins jenkinsci/jenkins
После запуска контейнера вы можете получить доступ к пользовательскому интер
фейсу Jenkins в веб-браузере через порт 8080. Начальный пароль администратора будет
указан в сообщениях, выводимых контейнером. На практике вам нужно немеш1енно из
менить этот пароль!
Для изучения основ подойдет конфигурация с одним контейнером, но в производ
ственных средах, скорее всего, потребуется более надежное решение. На странице загруз
ки сервера Jenkins (j enkins. io/ download) есть инструкции по инсталляции, которые мы
не будем здесь повторять. Обратитесь к этим документам для инсталляции сервера в опе
рационных системах Linux и FreeBSD. Компания CloudBees, создатель сервера Jenkins,
также предлагает версию с высокой доступностью под названием Jenkins Enterprise.
У сервера Jenkins есть подключаемые модули для каждой мыслимой задачи.
Используйте подключаемые модули для выполнения сборок в разных типах агентов, от
правки уведомлений, координации выпусков и выполнения запланированных заданий.
Подключаемые модули взаимодействуют с инструментами с открытым исходным ко
дом и со всеми основными облачными платформами и внешними поставщиками SaaS.
Именно подключаемые модули обеспечивают сверхспособности серверу Jenkins.
Большинство настроек Jenkins выполняются через неб-интерфейс, и, проявляя \Ш
лосердие к вашему вниманию, мы не пытаемся описать все нюансы пользовательского
ких как репозитории исходного кода, компиляторы, инструменты сборки, средств тес
тирования и систем развертывания.
Задание (job) для сервера Jenkins, или проект, - это коллекция связанных этапов.
Создание проекта - это задача первостепенной важности для новой инсталляции. Вы
можете связать этапы проекта, чтобы они выполнялись последовательно или параллель
но. Вы можете даже настроить условные этапы, которые делают разные вещи в зависи
мости от результатов предыдущих этапов.
Для проекта Cl/CD этапы сборки могут охватывать все этапы конвейера: создавать
код, запускать тесты, загружать артефакт в репозиторий и запускать развертывание.
Каждый этап конвейера является всего лишь этапом сборки в рамках проекта
Jenkins. Интерфейс Jenkins представляет собой обзор состояния каждого этапа. поэтому
легко увидеть, что происходит в конвейере.
Организации, в которых есть мноrо приложений, должны иметь отдельные проекты
Jenkins для каждого приложения. Каждый проект будет иметь отдельный репозиторий
кода и этапы сборки. Система Jenkins требует для запуска сборки в любом из своих про
ектов наличия всех инструментов и зависимостей. Например, если вы настроили проект
на языке Java и проект на языке С, ваша система Jenkins должна иметь доступ как к ин
струменту Maven, так и к команде make.
Проекты моrут зависеть от других проектов. Используйте это в своих интересах, струк
турируя проекты как общие, наследуемые шаблоны. Например, если у вас есть множество
приложений, которые построены по-разному, но развернуты одинаково (например, как
Глава 26. Непрерывная интеграция и доставка 969
Распределенные сборки
В тех средах, где поддерживаются десятки приложений, причем каждое со своими
зависимостями и этапами сборки, легко непреднамеренно создать конфликты зависи
мостей и узкие места, поскольку сразу запускается слишком много конвейеров. Чтобы
компенсировать это, сервер Jenkins позволяет вам перейти в распределенную архитек
туру сборки. В этом режиме работы используется "мастер сборки", центральная систе
ма, которая отслеживает все проекты и их текущее состояние, а также "агенты сборки",
которые выполняют фактические этапы сборки для проекта. Если вы часто используете
сервер Jenkins, то довольно быстро перейдете к этой конфигурации.
Аrенты сборки запускаются на хостах, которые отделены от мастера сборки. Мастер сер
вера Jenkins подключается к подчиненным системам (обычно через протокол SSH), чтобы
запустить процесс агента и добавить метки, которые документируют возможности подчи
ненных систем. Например, вы можете отличить своих агентов, поддерживающих язык Java,
от ваших же агентов с поддержкой языка С, применяя соответствующие метки. Для дости
жения наилучших результатов запускайте агенты в контейнерах, удаленных виртуальных
машинах или временных облачных средах, которые масштабируются и возвращаются в ис
ходное состояние по требованию. Если у вас есть кластер контейнеров, вы можете исполь
зовать подключаемые модули Jenkins для запуска агентов в кластере через систему упраRЛе
ния контейнерами.
pipeline {
agent any
stages {
stage ( 'Build')
steps {
sh 'make'
stage ( 'Test')
steps {
970 ЧастьlV.Эксплуатация
sh 'rnake test'
stage ( 'Deploy' )
steps {
sh 'deploy.sh'
2 Рабочая область - это синоним контекста сборки: место на локальном диске агента, в котором
содержатся все файлы, необходимые для сборки, включая исходный код и зависимости. Каждая
сборка имеет частное рабочее пространство.
Глава 26. Непрерывная интеграция и доставка 971
Реnозиторий
UlsahGo GitHub
Этапа сборки провален
Сборка
Сбор ка
Просмотр ~---+! Модульные 1---4~ двоичного ~---+! образа
фиксации Найденная тесты Модульные ~айла Сборка DigitalOcean Продолжение
- - - - фиксация тесты U sahGo прошла на этапе
Наше приложение имеет также специальную точку входа для проверки работоспо
собности. Проверка работоспособности - это простой способ для мониторинга систем,
чтобы спросить приложение : "Привет, все хорошо?"
$ curl ulsahgo.admin.com/healthy
{
972 ЧастьlV.Эксплvатация
"healthy": "true"
Этой функции в качестве входного параметра передается целое число, а она определя
ет соответствующее порядковое выражение. Например, если функции передан аргумент,
равный 1, то она возвращает строку "lst". Программа UlsahGo использует эту функцию
для форматирования текста в сообщении об ошибке для недопустимых номеров изданий
книг.
Модульные тесты пытаются доказать, что при произвольных входных данных функ
ция всегда возвращает ожидаемый результат. Вот модульный тест, который выполняет
эту функцию.
func TestOrdinal(t *testing.T)
ord := ordinal(l)
ехр := "lst"
i f ord != ехр {
t.Error("expected %s, got %s", ехр, ord)
ord = ordinal(lO)
ехр = "lOth"
i f ord != ехр {
t.Error("expected %s, got %s", ехр, ord)
$ go test
PASS
ok github.com/bwhaley/ulsahgo О.ООбs
$ tree ulsahgo
ulsa~.qo
pipeline
,Tenkinsfile
packer
~ prov1.· s~oпer. sh
L
ulsahgo. ё son
ulsaг.go.service
pr·oduction
f- tf proo. s:O
L ulsa!lgo.:::
testinq
[ tf_c:esting.s'°'
ulsahgo.t:
ulsahgo.go
ulsahgo_test.go
974 ЧастьlV.Эксплvатация
pipeline {
agent any
stages {
stage ( 'Checkout')
steps {
checkout scm
Строка checkout scm дает указание серверу Jenkins получить исходный код из си
стемы управления конфигурацией программного обеспечения (это общий отраслевой
термин для систем контроля версий).
После опроса репозитория GitHub сервером Jenkins и завершения этапа получения
исходного кода мы можем перейти к настройке этапов тестирования и сборки. Наш
проект Go не имеет внешних зависимостей. Единственным требованием для создания
и тестирования нашего кода является двоичный исполняемый файл go. Мы уже устано
вили систему Jenkins (с помощью команды apt-get -уinstall golang-go), поэтому
нам нужно только добавить этапы тестирования и сборки в файл Jenkinsfilse:
stage('Unit tests')
steps {
sh 'go test'
stage ( 'Build')
steps {
sh 'go build'
устранять сбои сборки. проверяя консольный вывод, который находится в деталях сбор
ки. Он представляет собой содержание потока STDOUT, которое выводится на экран лю
бой частью сборки.
Ниже приведен фрагмент результатов вывода команд go teвt и go build в ходе ра
боты конвейера.
[Pipeline) stage
[Pipeline) { (Unit Tests)
[Pipeline] sh
[UlsahGo) Running shell script
+ go test
PASS
ok _/var/jenkins home/workspace/UlsahGo О.ООбs
[Pipeline) }
[Pipeline) // stage
[Pipeline) stage
[Pipeline) { (Build)
[Pipeline) sh
[UlsahGo) Running shell script
+ go build
[Pipeline) )
[Pipeline) // stage
[Pipeline) }
[Pipeline) // node
[Pipeline) End of Pipeline
Finished: SUCCESS
Обычно определить причину неудачной сборки можно, просмотрев журнал. Ищите
сообщения об ошибках, которые идентифицируют неудавшийся шаг. Вы также можете
добавить собственные сообщения в журнал, чтобы предоставлять подсказки о состоянии
системы, такие как значения переменных или содержимое сценария в данной точке вы
полнения. Использование отладочной печати - это старая традиция программистов.
Результатом нашей сборки является один двоичный файл ulвahgo, который содержит
все наше приложение. (Это, кстати, одно из основных преимуществ программ на языке
Go, и одна из причин, почему язык Go популярен у системных администраторов: с его
помощью легко создавать статические двоичные файлы, которые выполняются в несколь
ких архитектурах и не имеют внешних зависимостей. Установка приложения на языке Go
часто бывает простой и сводится к его копированию в нужный каталог системы.)
"builders": [ {
"type": "digitalocean",
"api_token": "rj8FsrMI17vqTlB8qqBn9f7xQedJkkZJ7cqJcB105nm06ihz",
''region'': "sfo2'',
"size": "512mЬ",
"image": "ubuntu-16-04-x64",
"snapshot name": "ulsahgo-latest",
"ssh username": "root"
}]
"provisioners": [
{
"type": "file",
"source": "ulsahgo",
} .
{
"destination": "/tmp/ulsahgo"
"type": "file",
"source": "pipeline/packer/ulsahgo.service",
} .
{
"destination": "/etc/systemd/ system/ulsahgo. service"
"type": "shell",
"script": "pipeline/packer/provisioner.sh"
#!/usr/bin/env bash
app=ulsahgo
# Обновим ОС и добавим учетную запись пользователя
apt-get update && apt-get -у upgrade
/usr/sbin/useradd -s /usr/sbin/nologin $арр
# Создадим рабочий каталог и скопируем в него приложение
mkdir /opt/$app && chown $арр /opt/$app
ер /tmp/$app /opt/$app/$app
chown $арр /opt/$app/$app && chmod 700 /opt/$app/$app
# Разрешим работу модуля systemd
systemctl еnаЫе $арр
Создание
Тесты
дроплета Тесты
провалены
провалено провалены
Готовый
к запуску Создание Создание среды со Тестирование
образ :~ отдельного Тестирование
сбалансированной балансировщика
дроnлета дроnлета
нагрузкой нагрузки
DigitalOcean
variaЫe "do_token" 11
variaЫe "ssh_fingerprint" 11
variaЫe "do_image" 11
provider "digitalocean" 1
token = "$1var.do_token)"
Система Jeпkiпs может хранить такие секреты, как токен АР!, в своем "хранилище
у•1етных данных" - зашифрованной области, предназначенной именно для таких кон
фиденциальных данных. Конвейер может считывать значения из хранилища учетных
данных и сохранять их в виде переменных среды. Затем значения становятся доступны
ми по всему конвейеру без сохранения в системе контроля версий.
Вот как мы сделали это в файле Jenkinsfile.
pipeline 1
environment 1
DO TOKEN = credentials ( 'do-token')
SSH_FINGERPRINT = credentials('ssh-fingerprint')
Тестирование дроплета
Теперь у нас появилась уверенность в том, что код является работоспособным, потому
что он прошел этап модульного тестирования. Однако нам также необходимо убедиться, что
он успешно работает как часть дроплета DigitalOcean. Тестирование на этом уровне считает
ся формой теста интеграции. Мы хотим, чтобы тесты интеграции выполнялись каждый раз
при создании нового образа, поэтому мы добавляем новый этап в файл Jenkinsfile.
stage ( 'Test and destroy the droplet') {
steps {
sh '' '#!/Ьin/bash -1
curl -D - -v \$(<do ip.txt) :8000/?edition=S grep "НТТР/1.1 200"
curl -D - -v \$ (<do=ip.txt) :8000/?edition=б grep "НТТР/1.1 404"
terraform destroy -force
'''
healthcheck {
port = 8000
protocol = "http"
path = "/healthy"
droplet_ids = [
"${digitalocean droplet.ulsahgo-a.id)",
"${digitalocean=droplet.ulsahgo-b.id}"
stage { 1 Create LB 1 } {
steps 1
sh 1 bash pipeline/production/tf_prod.sh 1
Этап балансировки нагрузки более или менее идентичен стадии одиночного экзем
пляра. Даже внешний сценарий почти такой же, поэтому здесь мы опускаем его содер
жимое. Мы могли бы легко реорганизовать эти сценарии так, чтобы одна версия обраба
тывала обе среды, но на данный момент мы сохранили сценарии отдельно.
Мы также можем добавить этап тестирования, на этот раз работающий с IР-адресом
балансировщика нагрузки.
stage( 1 Test load balancer 1 }
steps 1
sh 11 '#!/bin/bash -1
curl -D - -v -s \$(<do_lb_ip.txt)/?edition=5 grep "НТТР/1.1 200"
curl -D - -v -s \$(<do_lb_ip.txt)/?edition=6 grep "НТТР/1.1 404"
111}
Команды curl аналогичны предыдущему набору команд, но они нацелены на порт 80,
который прослушивает балансировщик нагрузки.
26.6. ЛИТЕРАТУРА
• ВF.ск, KF.NT, ЕТ AL. Maпifesto for Agile Software Developтeпt. agilemanif esto. org.
• DtJVALL, PлuL М., SТEVE Млтvлs, AND ANDRl:W GLOVER. Сопtiпиоиs lпtegratioп: lтproviпg
Software Qиality апd Redиciпg Risk. Upper Saddle River, NJ: Addison-Wesley, 2007.
(Поль М. Дюваль, Стивен М. Матиас, Эндрю Гловер, Непрерывная интеграция:
улучшение качества программ11ого обеспечения и снижение риска, пер. с англ., Ид
"Вильяме", 2008 г.)
• FлRc1c, У1ктоR . The DevOps 2.0 Toolkit: Aиtoтatiпg the Сопtiпиоиs Dер/оутепt Pipe/iпe with
Coпtaiпerized Microservices. Seattle, WA: Amazon Digital Services LLC, 2016.
• MoRRIS, K1EF. lпfrastrиctиre as Code: Maпagiпg Servers iп the Cloиd. Sebastopol, СА:
O'Reilly Media, 2016.
• jenkinsci-docs@googlegroups.com. Jenkins User Handbook. jenkins.io/
doc/book.
Глава 27
• Примерно в 2013 году наметился новый тип атаки, известный как выкуп
(ransomware). Атакующие компрометируют целевую систему и шифруют ее дан
ные, удерживая их в залоге. Жертвы должны заплатить выкуп за лечение и вос
становление системы.
• В 2015 году было взломано Управление кадровой службы США (U.S. Office of
Personnel Management), что поставило под угрозу конфиденциальную и приватную
информацию о более чем 21 миллионе граждан США, многие из которых имели
допуск к секретным документам.
986 ЧастьlV.Эксплуатация
Ставки еще никогда не были так высоки. Мы думаем, что ситуация будет ухудшать
ся, а затем произойдет перелом к лучшему. Отчасти проблема заключается в том, что
проблемы безопасности не являются чисто техническими. Вы не можете решить их,
купив определенный продукт или услугу у третьей стороны. Достижение приемлемого
уровня безопасности требует терпения, бдительности, знаний и настойчивости - не
только от вас и других системных администраторов, но и от всего вашего сообщества
пользователей и руководства.
Как системный администратор вы несете тяжелое бремя. Вы должны проводить ме
роприятия, которые защищают системы и сети вашей организации, обеспечивают их
бдительный контроль и правильно обучают ваших пользователей и ваших сотрудников.
Изучайте существующие технологии безопасности и работайте с экспертами для выяв
ления и устранения уязвимостей в вашей организации. Вопросы безопасности должны
быть частью каждого решения.
Запомните такую формулу:
Безопасность = - - - -1 - - -
1,072 х Удобство
Чем безопаснее система, тем труднее пользователям работать в ней. Внедряйте меры
безопасности, предложенные в этой главе, только после тщательного изучения послед
ствий для пользователей.
Безопасна ли UNIX'? Конечно нет. UNIX и Linux не являются безопасными, как
и любая другая операционная система, которая обменивается данными в сети. Если вам
нужна абсолютная, тотальная, непробиваемая система безопасности, то вам нужен зна
чительный воздушный зазор между вашим компьютером и любым другим устройством. 1
Некоторые люди утверждают, что вам также необходимо разместить свой компью
тер в специальной комнате, которая блокирует электромагнитное излучение (найдите
в Интернете информацию о клетке Фарадея). Ну как, весело?
В этой главе рассматривается сложная область компьютерной безопасности: источ
ники атак, основные способы защиты систем, инструменты для работы и источники до
полнительной информации.
1Иногда даже воздушного зазора недостаточно. В статье 2014 года Генкин(Genkin), Шамир
(Shamir) и Тромер (Tromer) описали метод извлечения ключей шифрования RSA из ноутбуков на
основе анализа высоких частот, которые они излучают при расшифровке файла.
Глава 27. Безопасность 987
Доступность выражает мысль о том, что информация должна быть доступна авто
ризованным пользователям, когда они в ней нуждаются. В противном случае данные
не имеют значения. Сбои, не вызванные злоумышленниками (например, возникшие
вследствие ошибок системного администратора или перебоев в подаче электроэнергии),
также относятся к категории проблем доступности. К сожалению, вопросы доступности
часто игнорируются, пока не произойдет какая-нибудь неприятность.
Следуйте принципам CIA при проектировании, внедрении и обслуживании систем
и сетей. Как говорится в старой поговорке о безопасности, "безопасность - это процесс".
Социальная инженерия
Пользователи (и администраторы) системы часто являются ее слабым звеном в сис
теме безопасности. Даже сейчас, когда образованность людей в области безопасности
повысилась, беспечные пользователи легко распространяют конфиденциальную инфор
мацию. Никакая технология не может защитить сеть от неосторожных пользователей,
поэтому системный администратор обязан информировать пользователей о существую
щих угрозах, и это обстоятельство должно стать частью системы безопасности.
Данная проблема может проявляться в разных формах. Хакеры звонят своим жерт
вам и представляются легальными пользователями, попавшими в трудное положение,
Уязвимости в программах
За много лет в программном обеспечении (включая сторонние программы, как
коммерческие, так и бесплатные) было выявлено несметное число ошибок, связанных
с безопасностью. Используя незаметные программистские просчеты или контекстные
зависимости, хакерам удавалось манипулировать системой по своему усмотрению.
Основной программной ошибкой, одной из самых опасных по своим последствиям,
является переполнение буфера. Для хранения информации разработчики часто выделя
ют заранее определенный объем временной памяти, который называется буфером. Если
программа не следит за размерами данных и контейнера, в котором они должны хра
ниться, то память, смежная с выделенной областью, рискует оказаться перезаписанной.
Умелые хакеры могут ввести тщательно скомпонованные данные так, чтобы они приве
ли к краху программы или (в худшем случае) выполнили некий заданный код.
Переполнение буфера является частным случаем более широкого класса проблем,
связанных с безопасностью программного обеспечения, который называется уязвимо
стью проверки вводимых значений (input validation vulnerability). Почти все программы
принимают от пользователей вводимые данные (например, аргументы командной стро
ки или данные формы HTML). Если программа обрабатывает эти данные без строгой
проверки соответствующего формата и содержания, то могут возникнуть неприятности.
Рассмотрим следующий простой пример.
В некотором роде операционные системы с открытым исходным кодом имеют им
мунитет. Исходный код для Linux и FreeBSD доступен всем, и тысячи людей могут (и
должны) тщательно анализировать каждую строку кода с точки зрения возможных угроз
безопасности. Широко распространено мнение о том, что это соглашение обеспечивает
лучшую безопасность, чем безопасность закрытых операционных систем, где ограни
ченное число людей имеют возможность изучить код в поисках слабых мест.
Инсайдерская информация
Сотрудники, подрядчики и консультанты являются доверенными лицами органи
зации и получают особые привилегии. Иногда эти привилегии используются во вред.
Инсайдеры могут украсть или раскрыть данные, разрушить системы для финансовой
выгоды или создать хаос по политическим мотивам.
990 ЧастьlV.Эксплvатация
Этот тип атаки часто бывает самым сложным для обнаружения. Большинство мер
безопасности защищают от внешних угроз, поэтому они не эффективны против поль
зователей, которым был предоставлен доступ. Инсайдеры, как правило, не находятся
под подозрением; только самые строгие организации систематически контролируют
своих сотрудников.
безопасную эксплуатацию.
Когда к вам придет проверка, вы должны доказать, что следовали стандартной мето
дологии, особенно если эта методология соответствует общепринятым рекомендациям
и передовым достижениям в вашей области промышленности. Рекомендации по выбору
стандартной методологии см. в разделе 27.10.
На самом высоком уровне вы можете улучшить безопасность своей сети, имея в виду
несколько эмпирических правил.
Ненужные службы
Большинство систем поставляется с несколькими службами, которые запускаются
по умолчанию. Отключите (и по возможности удалите) все ненужные службы, особенно
если они реализованы в виде сетевых демонов. Для того чтобы обнаружить выполняе
мые службы, можно использовать команду netstat. Рассмотрим частичные результаты
работы этой команды в системе FreeBSD.
freebsd$ netstat -an 1 qrep LISTEN
tсрб о о *.22 * * LISTEN
tсрб о о *.2049 *.* LISTEN
tсрб о о *.989 *.* LISTEN
tсрб о о * .111 *.* LISTEN
В системе Linux для этой цели используется новая команда ss, но команда
netstat тоже хорошо справляется с этой задачей.
Для обнаружения служб, использующих конкретный порт, существует несколько
приемов. Например, эту задачу можно решить с помощью команды lsof.
freebsd$ sudo lsof -i:22
СОММАND PID USER FD ТУРЕ SIZE/OFF NODE NАМЕ
sshd 701 root 3u !Рvб OtO ТСР *:ssh (LISTEN)
sshd 701 root 4u IPv4 OtO ТСР *:ssh (LISTEN)
sshd 815 root 3u IPv4 OtO ТСР 10.0.2.15:ssh-10.0.2.2:54834
(ESTABLISHED)
sshd 817 vagrant 3u IPv4 OtO ТСР 10.0.2.15:ssh->10.0.2.2:54834
(ESTABLISHED)
Выяснив идентификатор PID, с помощью команды ps можно идентифицировать
конкретный процесс. Если данная служба не нужна, остановите ее и убедитесь, что она
не будет заново стартовать во время загрузки системы. Если утилита lsof недоступна,
используйте команды fuser или netstat -р.
Резервные копии
Регулярное резервное копирование является важной частью системы безопасности
любой сети. Оно входит в так называемую триаду CIA и относится к категории "доступ
ность". Убедитесь, что все части системы регулярно копируются и что эта информация
хранится в надежном месте (желательно за пределами сети организации). Если произой
дет серьезный инцидент, связанный с безопасностью сети, вы сможете воспользоваться
надежным источником информации и восстановить работу.
Резервное копирование само по себе также может создавать угрозу безопасности.
Защитите свои резервные копии, ограничив и поставив под контроль доступ к файлам
резервных копий, а также обеспечьте их шифрование.
Вирусы и черви
Системы UNIX и Linux имеют иммунитет от вирусов. Существует всего несколько
вирусов (большинство из них носит чисто академический характер), которые могут за
разить системы UNIX и Linux, но ни один из них не способен нанести серьезный урон,
в отличие от среды Windows, где это стало частым явлением. Тем не менее этот факт
не снижает озабоченности поставщиков антивирусных программ - разумеется, если вы
покупаете их продукт по специальной сниженной цене.
Точная причина отсутствия вредоносных программ неясна. Некоторые утверждают,
что система UNIX просто занимает слишком незначительную долю рынка настольных
систем и поэтому не интересует авторов вирусов. Другие настаивают на том, что среда
с контролем доступа, существующая в системе UN IX, ограничивает размер урона от са
мораспространяющихся червей или вирусов.
Последний аргумент заслуживает внимания. Поскольку в системе UNIX ограничен до
ступ по записи к исполняемым модулям на файловом уровне, непривилегированные поль
зователи не могут инфицировать остальную среду. Если код вируса был запущен не от име
ни суперпользователя, его вред будет существенно ограничен. Следовательно, не нужно
использовать учетную запись root для повседневной деятельности. Комментарии по этому
поводу см. в разделе 3.2.
W Дополнительную информацию о сканировании содержимого электронных сообщений
см. в главе 18.
Как ни странно, одна из причин внедрения антивирусного программного обеспече
ния на серверах UNIX - стремление защитить работающие под управлением Windows
компьютеры, существующие в вашей сети, от Windоws-ориентированных вирусов.
Почтовый сервер может сканировать входящую электронную почту на вирусы, а файло
вый сервер в поисках "инфекции" может сканировать общие файлы. Однако это реше
ние должно быть дополнительным по отношению к антивирусной защите настольных
систем, а не основным.
Руткиты
Умелые хакеры пытаются скрывать свои следы и избегать разоблачения. Часто они
рассчитывают продолжить использование вашей системы для нелеrального распростра
нения программного обеспечения, зондирования других сетей или запуска атаки против
других систем. Для того чтобы оставаться незамеченными, они часто используют так на
зываемые "руткиты" ("rootkits"). Печально известная фирма Sony включала элементы,
подобные руткиту, в программное обеспечение для защиты от копирования, помещае
мое на миллионы музыкальных компакт-дисков.
Фильтрация пакетов
Если вы подключаете систему к сети, имеющей доступ к Интернету, вы должны уста
новить между системой и внешним миром маршрутизатор с возможностью фильтрации
пакетов или межсетевой экран (брандмауэр). Фильтр пакетов должен передавать только
трафик, предназначенный для тех служб, которые вы специально хотите предоставить
пользователям из внешнего мира. Ограничение открытости ваших систем для внешнего
мира - это первая линия защиты. Многие системы не обязательно должны быть до
ступны из открытого сегмента Интернета.
Кроме специализированных средств, типа межсетевого экрана, работающих на ин
тернет-шлюзе, вы можете удвоить защиту с помощью пакетных фильтров, работающих
на конкретном хосте, таких как ipfw для системы FreeBSD и iptaЬles (или ufw) для
систем Linux. Определите, какие службы запускаются на хосте, и открывайте порты
только для этих служб. В некоторых случаях вы также можете определить, какие адреса
отправителя пакетов разрешены для подключения к каждому порту. Для большинства
систем требуется открыть всего несколько портов.
Глава 27. Безопасность 995
Бдительность
Для того чтобы быть уверенным в безопасности системы, следите за ее состоянием,
сетевыми соединениями, таблицей процессов. Делать это нужно регулярно (желательно
каждый день). Проблема всегда начинается с малого, а затем нарастает, как снежный
ком, так что, чем раньше будет обнаружена аномалия, тем меньшим окажется ущерб.
Возможно, вам будет полезно поработать с внешней фирмой для проведения всесто
роннего анализа уязвимостей. Эти проекты могут привлечь ваше внимание к вопросам,
которые вы ранее не рассматривали. Как минимум, они устанавливают базовое понима
ние областей, в которых вы наиболее уязвимы. Такие исследования часто обнаруживают,
что хакеры уже проникли в сеть клиента.
Изменение пароля
Изменение паролей суперпользователя root и администраторов должно происходить:
• каждый раз, когда кто-то, у кого есть доступ к ним, покидает вашу организацию;
В прошлом считалось, что пароли должны меняться часто, чтобы не допускать скры
той компрометации. Однако обновления паролей имеют собственные риски и услож
няют жизнь администраторов. Проникнув в сеть организации, компетентные хакеры
устанавливают механизмы резервного копирования, поэтому изменения пароля менее
Устаревание паролей
В большинстве систем, использующих теневые пароли, можно реализовать механизм
так называемого устаревания паролей, при котором пользователей заставляют перио-
Глава 27. Безопасность 999
дически менять пароли. На первый взгляд, это хорошая идея, однако ее практическая
реализация влечет за собой определенные проблемы. Не всякому пользователю по душе
периодически менять пароль, поскольку это сопряжено с запоминанием нового пароля.
Обычно для пароля выбирается простое слово, которое легко вводится и запоминается,
и, когда приходит время замены, многие пользователи, не желая себя утруждать, сно
ва выбирают предыдущий пароль. Таким образом, дискредитируется сама идея. Модули
РАМ могут помочь выбрать сильные пароли, чтобы избежать описанной выше ситуации
(см. раздел 17.3).
В системе Linux процессом устаревания паролей управляет программа chage.
С ее помощью администраторы могут задавать минимальное и максимальное
время, которое проходит до момента изменения пароля; дату истечения сро
2017-09-25
2017
-е
года.
90
pw.
90 дням,
При
и дату
Пользовательские оболочки
Теоретически можно установить в качестве оболочки для пользовательской учетной за
писи любую программу, включая пользовательский сценарий. На практике применение
оболочек, отличающихся от стандартных, таких как bash и tcsh, весьма опасно. Еще
опаснее беспарольные учетные записи, оболочкой которых является сценарий. Если у вас
возникнет соблазн создать такую учетную запись, примените вместо пароля ключи SSH.
Запуск команды nmap - отличный способ узнать, как выглядит система в глазах
того, кто пытается ее взломать. В качестве примера приведем отчет, выданный этой ко
мандой на самом обычном, относительно незащищенном компьютере.
тифицирует весь компьютер, а комбинация IР-адреса и номера порта определяет конкретный сер
вер или сетевое соединение.
3 Насамом деле по умолчанию проверяются только привилегированные (их номера меньше 1024) и
"известные" порты. С помощью опции -р можно явно задать диапазон сканирования.
Глава 27. Безопасность 1001
Эта возможность может оказаться весьма полезной при анализе состояния локаль
ной сети. К сожалению, она же является рабочим инструментом хакеров, которые могут
определить тип атаки на основании известных слабых мест конкретных операционных
систем или серверов.
соединения.
• Распознавание руткитов.
• Проверка целостности файловой системы.
New file
'/courtesy/httpd/barkingseal.com/html/wp-
content/uploads/2010/01/hbird.jpg'
added to the file system.
--END OF NOTIFICATION
Таким образом, система OSSEC работает круглосуточно, следя за операционной си
стемой. Мы рекомендуем запускать OSSEC на каждом производственном компьютере.
связь.