Linux глазами хакера [Михаил Евгеньевич Флёнов] (pdf) читать онлайн

-  Linux глазами хакера  [6-е издание, переработанное и дополненное] 4.06 Мб, 417с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Михаил Евгеньевич Флёнов

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

Tlgm: @it_boooks

Tlgm: @it_boooks

Михаил Фленов

6-е издание

Санкт-Петербург
«БХВ-Петербург»
2021

Tlgm: @it_boooks

УДК 004.451
ББК 32.973.26-018.2
Ф71
Ф71

Фленов М. Е.

Linux глазами хакера. — 6-е изд., перераб. и доп. — СПб.:
БХВ-Петербург, 2021. — 416 с.: ил.
ISBN 978-5-9775-6699-5
Рассмотрены вопросы настройки ОС Linux на максимальную производительность и безопасность. Описаны базовое администрирование и управление доступом, настройка Firewall, файлообменный сервер, WEB-, FTP- и Proxy-сервера, программы для доставки электронной почты, службы DNS, а также политика мониторинга системы и архивирование данных. Приведены потенциальные уязвимости,
даны рекомендации по предотвращению возможных атак, и показано, как действовать при атаке или взломе системы, чтобы максимально быстро восстановить ее
работоспособность и предотвратить потерю данных. В шестом издании обновлена
информация с учетом последней версии Ubuntu и добавлено описание программ
для тестирования безопасности конфигурации ОС.
Для пользователей, администраторов
и специалистов по безопасности
УДК 004.451
ББК 32.973.26-018.2

Группа подготовки издания:
Руководитель проекта
Зав. редакцией
Компьютерная верстка
Дизайн серии
Оформление обложки

Евгений Рыбаков
Екатерина Сависте
Ольги Сергиенко
Марины Дамбиевой
Карины Соловьевой

"БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул., 20.

ISBN 978-5-9775-6699-5

© ООО "БХВ", 2021
© Оформление. ООО "БХВ-Петербург", 2021

Tlgm: @it_boooks

Оглавление

Предисловие ................................................................................................................... 11
QualitySource .................................................................................................................................. 16
Второе издание .............................................................................................................................. 17
Третье издание ............................................................................................................................... 17
Четвертое издание ......................................................................................................................... 18
Пятое издание ................................................................................................................................ 18
Шестое издание.............................................................................................................................. 19
Благодарности ................................................................................................................................ 19
Глава 1. Прежде чем начать... ..................................................................................... 21
1.1. Ядро ......................................................................................................................................... 22
1.2. Дистрибутивы ......................................................................................................................... 23
1.2.1. Red Hat Linux .................................................................................................................... 24
1.2.2. CentOS ............................................................................................................................... 25
1.2.3. SuSE Linux ........................................................................................................................ 25
1.2.4. Debian ................................................................................................................................ 25
1.2.5. Ubuntu ................................................................................................................................ 26
1.2.6. Raspbian ............................................................................................................................. 26
Глава 2. Установка и начальная настройка Linux ................................................. 27
2.1. Подготовка к установке.......................................................................................................... 27
2.2. Начало установки ................................................................................................................... 29
2.3. Разбивка диска ........................................................................................................................ 30
2.3.1. Файловые системы ........................................................................................................... 32
2.3.2. Ручное создание разделов................................................................................................ 35
2.4. Выбор пакетов для установки................................................................................................ 37
2.5. Завершение установки ............................................................................................................ 41
2.6. Пароль...................................................................................................................................... 41
2.7. Первый старт ........................................................................................................................... 44
2.8. Мы в системе .......................................................................................................................... 49
2.9. Подсказки ................................................................................................................................ 50
2.10. Основы конфигурирования .................................................................................................. 50
2.10.1. Запрещено то, что не разрешено ................................................................................... 51
2.10.2. Настройки по умолчанию .............................................................................................. 51

Tlgm: @it_boooks

4

Оглавление

2.10.3. Пароли по умолчанию....................................................................................................52
2.10.4. Безопасность против производительности................................................................... 52
2.10.5. Внимательность .............................................................................................................. 53
2.11. Обновление ........................................................................................................................... 54
2.12. Устройство Linux: ядро и модули ....................................................................................... 54
2.13. Установка дополнительных пакетов в Ubuntu ................................................................... 56
2.14. Установка дополнительных пакетов в CentOS................................................................... 58
2.15. Редактирование файлов........................................................................................................ 59

Глава 3. Добро пожаловать в Linux ........................................................................... 61
3.1. Файловая система ................................................................................................................... 62
3.1.1. Основные команды........................................................................................................... 64
pwd ........................................................................................................................................ 64
ls ............................................................................................................................................ 64
cat .......................................................................................................................................... 65
tac .......................................................................................................................................... 66
cd ........................................................................................................................................... 66
cp ........................................................................................................................................... 66
find ......................................................................................................................................... 67
grep........................................................................................................................................ 69
mkdir ...................................................................................................................................... 69
rm........................................................................................................................................... 70
df ............................................................................................................................................ 70
mount ..................................................................................................................................... 70
umount ................................................................................................................................... 73
tar .......................................................................................................................................... 74
rpm......................................................................................................................................... 74
which ..................................................................................................................................... 74
3.1.2. Безопасность файлов ........................................................................................................ 75
Дата и время изменения ...................................................................................................... 75
Контрольные суммы ............................................................................................................76
Что контролировать? ...........................................................................................................77
Замечания по работе с файлами ......................................................................................... 78
3.1.3. Ссылки............................................................................................................................... 79
Жесткие ссылки ................................................................................................................... 79
Символьные ссылки ............................................................................................................80
3.2. Загрузка системы .................................................................................................................... 82
3.2.1. Автозагрузка ..................................................................................................................... 82
3.2.2. GRUB2............................................................................................................................... 84
3.2.3. Интересные настройки загрузки ..................................................................................... 85
3.3. Регистрация в системе ............................................................................................................ 86
3.3.1. Теневые пароли ................................................................................................................ 86
3.3.2. Забытый пароль ................................................................................................................ 88
3.3.3. Модули аутентификации .................................................................................................89
3.3.4. Сложность паролей .......................................................................................................... 90
3.4. Процессы ................................................................................................................................. 91
3.4.1. Смена режима ................................................................................................................... 91
3.4.2. Остановка процессов........................................................................................................ 93

Tlgm: @it_boooks

Оглавление

5

3.4.3. Просмотр процессов ........................................................................................................ 93
3.4.4. «Зомби»: поиск и устранение .......................................................................................... 96
3.5. Планирование задач ............................................................................................................... 97
3.5.1. Формирование задания .................................................................................................... 98
3.5.2. Планировщик задач .......................................................................................................... 99
3.5.3. Безопасность запланированных работ .......................................................................... 101
3.6. Настройка сети ...................................................................................................................... 102
3.6.1. Адресация ....................................................................................................................... 102
3.6.2. Информация о сетевых подключениях ......................................................................... 104
3.6.3. Изменение параметров сетевого подключения ........................................................... 105
3.6.4. Утилита ip ....................................................................................................................... 106
3.6.5. Базовые настройки сети .................................................................................................107
3.6.6. Протокол IPv6................................................................................................................. 108
3.7. Работа с модулями ядра ....................................................................................................... 109
3.8. Переменная $PATH............................................................................................................... 110

Глава 4. Управление доступом ................................................................................. 113
4.1. Права доступа ....................................................................................................................... 113
4.1.1. Назначение прав ............................................................................................................. 115
4.1.2. Владелец файла .............................................................................................................. 117
4.1.3. Правила безопасности .................................................................................................... 117
4.1.4. Права по умолчанию ...................................................................................................... 118
4.1.5. Права доступа к ссылкам ...............................................................................................119
4.1.6. Права доступа к ссылкам ...............................................................................................120
4.2. Управление группами........................................................................................................... 122
4.2.1. Добавление группы ........................................................................................................ 122
4.2.2. Редактирование группы .................................................................................................124
4.2.3. Удаление групп............................................................................................................... 124
4.3. Управление пользователями ................................................................................................124
4.3.1. Файлы и папки нового пользователя ............................................................................ 127
4.3.2. Изменение настроек по умолчанию .............................................................................. 128
4.3.3. Редактирование пользователя ....................................................................................... 129
4.3.4. Удаление пользователя ..................................................................................................129
4.3.5. Настройка процедуры добавления пользователей....................................................... 130
4.3.6. Взлом паролей ................................................................................................................ 132
4.4. Типичные ошибки распределения прав .............................................................................. 133
4.5. Привилегированные программы ......................................................................................... 135
4.6. Дополнительные возможности защиты .............................................................................. 135
4.7. Защита служб ........................................................................................................................ 137
4.7.1. Принцип работы ............................................................................................................. 139
4.7.2. Установка Jail ................................................................................................................. 140
4.7.3. Работа с программой Jail ...............................................................................................141
4.8. Получение прав root ............................................................................................................. 143
4.9. Права приложений ................................................................................................................ 144
4.10. Сетевой экран...................................................................................................................... 145
4.10.1. Фильтрация пакетов ..................................................................................................... 147
4.10.2. Параметры фильтрации ............................................................................................... 148
Протоколы .......................................................................................................................... 150

Tlgm: @it_boooks

6

Оглавление

Фильтрация портов ............................................................................................................150
Фильтрация адресов .......................................................................................................... 151
Фильтрация нежелательных адресов ............................................................................... 152
Фильтрация неверных адресов ......................................................................................... 152
Фильтрация в Linux ...........................................................................................................153
4.10.3. Брандмауэр — не панацея ........................................................................................... 154
4.10.4. Брандмауэр как панацея...............................................................................................154
4.10.5. Конфигурирование брандмауэра ................................................................................ 155
4.10.6. Основные возможности iptables.................................................................................. 156
4.10.7. Переадресация .............................................................................................................. 159
4.10.8. Утилита firewalld .......................................................................................................... 160
4.10.9. Uncomplicated Firewall: упрощенное управление ...................................................... 160
4.11. Некоторые нюансы работы с брандмауэром .................................................................... 161
4.11.1. Обход сетевого экрана .................................................................................................162
4.11.2. Безопасный Интернет ..................................................................................................164
4.11.3. Дополнительная защита ............................................................................................... 165
4.12. Запрет и разрешение хостов ..............................................................................................166
4.13. Советы по конфигурированию брандмауэра ................................................................... 168
4.14. Повышение привилегий ..................................................................................................... 169

Глава 5. Администрирование ................................................................................... 175
5.1. Полезные команды для сетевых соединений ..................................................................... 175
5.1.1. ping .................................................................................................................................. 176
5.1.2. netstat ............................................................................................................................... 177
5.1.3. telnet ................................................................................................................................. 178
5.1.4. r-команды ........................................................................................................................ 180
5.2. Шифрование .......................................................................................................................... 181
5.2.1. Программа stunnel .......................................................................................................... 186
5.2.2. Дополнительные возможности OpenSSL ..................................................................... 187
5.2.3. Шифрование файлов ......................................................................................................188
5.2.4. Туннель глазами хакера .................................................................................................189
5.2.5. Шифрование домашнего каталога ................................................................................ 191
5.3. Протокол SSH ....................................................................................................................... 193
5.3.1. Конфигурационные файлы ............................................................................................ 193
5.3.2. Основные параметры конфигурации сервера SSH ...................................................... 194
5.3.3. Параметры доступа к серверу sshd ............................................................................... 197
5.3.4. Конфигурирование клиента SSH .................................................................................. 197
5.3.5. Пример работы клиента SSH ......................................................................................... 199
5.3.6. Вход по ключу ................................................................................................................ 199
5.3.7. Защищенная передача данных ...................................................................................... 201
5.4. Демон inetd/xinetd ................................................................................................................. 202
5.4.1. Конфигурирование xinetd .............................................................................................. 203
5.4.2. Безопасность ................................................................................................................... 205
5.5. Анализ безопасности дистрибутива .................................................................................... 207
Глава 6. В стиле Samba .............................................................................................. 211
6.1. Конфигурирование Samba.................................................................................................... 212
6.1.1. Основные настройки ...................................................................................................... 214
6.1.2. Безопасность ................................................................................................................... 215

Tlgm: @it_boooks

Оглавление

7

6.1.3. Сеть .................................................................................................................................. 217
6.1.4. Замена сервера Windows ................................................................................................218
6.1.5. Поддержка WINS и DNS ............................................................................................... 218
6.1.6. Отображение файлов...................................................................................................... 219
6.2. Описание объектов ............................................................................................................... 219
6.2.1. Пора домой ..................................................................................................................... 219
6.2.2. Доменный вход ............................................................................................................... 220
6.2.3. Распечатка ....................................................................................................................... 221
6.2.4. Общий доступ ................................................................................................................. 221
6.2.5. Личные каталоги ............................................................................................................ 222
6.2.6. CD-ROM .......................................................................................................................... 222
6.3. Управление пользователями ................................................................................................223
6.4. Использование Samba........................................................................................................... 225
6.5. Развитие Samba ..................................................................................................................... 226

Глава 7. Веб-cервер ..................................................................................................... 227
7.1. Основные настройки ............................................................................................................ 228
7.2. Модули .................................................................................................................................. 230
7.3. Права доступа ....................................................................................................................... 231
7.4. Создание виртуальных веб-серверов .................................................................................. 237
7.5. Еще несколько слов о безопасности ................................................................................... 239
7.5.1. Файлы .htaccess ............................................................................................................... 239
7.5.2. Файлы паролей ............................................................................................................... 241
7.5.3. Проблемы авторизации ..................................................................................................242
7.5.4. Обработка на сервере ..................................................................................................... 242
7.6. Проще, удобнее, быстрее ..................................................................................................... 243
7.7. Безопасность сценариев ....................................................................................................... 244
7.7.1. Основы безопасности сценариев................................................................................... 245
7.7.2. Модуль mod_security ...................................................................................................... 247
7.7.3. Секреты и советы ........................................................................................................... 249
Ограничение сценариев..................................................................................................... 249
Резервные копии ................................................................................................................ 249
7.8. Индексация веб-страниц ...................................................................................................... 250
7.9. Безопасность подключения.................................................................................................. 252
Глава 8. Электронная почта ..................................................................................... 255
8.1. Настройка sendmail ............................................................................................................... 257
8.2. Безопасность сообщений ..................................................................................................... 260
8.3. Полезные команды ............................................................................................................... 260
8.4. Безопасность sendmail .......................................................................................................... 261
8.4.1. Баннер-болтун................................................................................................................. 261
8.4.2. Только отправка почты ..................................................................................................261
8.4.3. Права доступа ................................................................................................................. 262
8.4.4. Лишние команды ............................................................................................................ 262
8.4.5. Выполнение внешних команд ....................................................................................... 263
8.4.6. Доверенные пользователи ............................................................................................. 263
8.4.7. Отказ от обслуживания ..................................................................................................263
8.5. Почтовая бомбардировка ..................................................................................................... 264

Tlgm: @it_boooks

8

Оглавление

8.6. Спам ....................................................................................................................................... 265
8.6.1. Блокировка приема спама .............................................................................................. 265
Фильтрация серверов ........................................................................................................ 265
Фильтрация сообщений..................................................................................................... 266
8.6.2. Блокировка пересылки спама ........................................................................................ 268
8.7. Сервер Postfix ........................................................................................................................ 270
8.7.1. Псевдонимы .................................................................................................................... 270
8.7.2. Ретрансляция .................................................................................................................. 271

Глава 9. Шлюз в Интернет ........................................................................................ 273
9.1. Работа прокси-сервера ......................................................................................................... 273
9.2. Кэширование ......................................................................................................................... 277
9.3. Прокси-сервер squid ............................................................................................................. 277
9.3.1. Директивы настройки HTTP ......................................................................................... 278
9.3.2. Директивы настройки FTP ............................................................................................ 279
9.3.3. Настройка кэша .............................................................................................................. 279
9.3.4. Журналы .......................................................................................................................... 282
9.3.5. Разделение кэша ............................................................................................................. 282
9.3.6. Дополнительные директивы .......................................................................................... 283
9.4. Права доступа к squid ........................................................................................................... 284
9.4.1. Список контроля доступа .............................................................................................. 284
9.4.2. Определение прав ........................................................................................................... 286
9.4.3. Аутентификация ............................................................................................................. 287
9.5. Некоторые нюансы работы со squid ................................................................................... 288
9.5.1. Безопасность сервиса ..................................................................................................... 288
9.5.2. Ускорение сайта ............................................................................................................. 289
9.5.3. Маленький секрет поля User Agent ............................................................................... 289
9.5.4. Защита сети ..................................................................................................................... 289
9.5.5. Борьба с баннерами и всплывающими окнами ............................................................ 290
9.5.6. Подмена баннера ............................................................................................................ 291
9.5.7. Борьба с запрещенными сайтами .................................................................................. 294
9.5.8. Ограничение канала ....................................................................................................... 295
9.6. Защита прокси-сервера: squidGuard .................................................................................... 298
9.6.1. Установка ........................................................................................................................ 298
9.6.2. Настройка ........................................................................................................................ 300
9.7. Шлюз в Интернет.................................................................................................................. 302
Глава 10. Передача файлов ....................................................................................... 305
10.1. Протокол FTP...................................................................................................................... 306
10.1.1. Команды протокола FTP.............................................................................................. 306
10.1.2. Сообщения сервера ...................................................................................................... 309
10.1.3. Передача файлов .......................................................................................................... 311
10.1.4. Режим канала данных ..................................................................................................312
10.2. Сервер ProFTPd ................................................................................................................... 313
10.3. Еще несколько слов о протоколе FTP............................................................................... 315
Глава 11. DNS-сервер .................................................................................................. 317
11.1. Введение в DNS .................................................................................................................. 318
11.2. Локальный файл hosts ........................................................................................................ 319

Tlgm: @it_boooks

Оглавление

9

11.3. Внешние DNS-серверы ...................................................................................................... 320
11.4. Настройка DNS-сервиса ..................................................................................................... 321
11.5. Файлы описания зон ........................................................................................................... 323
11.6. Обратная зона ..................................................................................................................... 325
11.7. Безопасность DNS .............................................................................................................. 326

Глава 12. Мониторинг системы ............................................................................... 329
12.1. Автоматизированная проверка безопасности .................................................................. 330
12.2. Закрываем SUID- и SGID-двери ........................................................................................ 333
12.3. Проверка конфигурации..................................................................................................... 334
12.4. Журналирование ................................................................................................................. 337
12.4.1. Основные команды.......................................................................................................337
who ...................................................................................................................................... 337
users..................................................................................................................................... 338
last ....................................................................................................................................... 338
history .................................................................................................................................. 338
lastlog .................................................................................................................................. 339
lsof ....................................................................................................................................... 340
12.4.2. Системные текстовые журналы .................................................................................. 340
12.4.3. Журнал FTP-сервера ....................................................................................................342
12.4.4. Журнал прокси-сервера squid ...................................................................................... 344
12.4.5. Журнал веб-сервера...................................................................................................... 345
12.4.6. Кто пишет? .................................................................................................................... 345
12.4.7. Утилита logrotate .......................................................................................................... 350
12.4.8. Пользовательские журналы ......................................................................................... 353
12.4.9. Обратите внимание! ..................................................................................................... 354
12.5. Работа с журналами ............................................................................................................ 356
12.5.1. Команда tail................................................................................................................... 357
12.5.2. Программа swatch ......................................................................................................... 358
12.5.3. Программа Logsurfer .................................................................................................... 358
12.5.4. Программа Logcheck/LogSentry .................................................................................. 358
12.6. Безопасность журналов ...................................................................................................... 359
12.7. Мониторинг ресурсов......................................................................................................... 361
Глава 13. Резервное копирование и восстановление ........................................... 363
13.1. Основы резервного копирования ...................................................................................... 363
13.2. Доступность на все 100 процентов ................................................................................... 365
13.3. Хранение резервных копий................................................................................................366
13.4. Политика резервирования .................................................................................................. 367
13.4.1. Редко, но метко... .......................................................................................................... 368
13.4.2. Зачастили... ................................................................................................................... 368
13.4.3. Часто, но не все... ......................................................................................................... 369
13.4.4. Периодично... ................................................................................................................ 369
13.4.5. Полная копия... ............................................................................................................. 370
13.5. Резервирование в Linux ...................................................................................................... 370
13.5.1. Копирование ................................................................................................................. 370
13.5.2. Утилита tar .................................................................................................................... 371
13.5.3. Утилита gzip.................................................................................................................. 373
13.5.4. Утилита dump ............................................................................................................... 374

Tlgm: @it_boooks

10

Оглавление

13.6. Защита резервных копий .................................................................................................... 375
13.7. Облака .................................................................................................................................. 376

Глава 14. Советы на прощанье................................................................................. 377
14.1. Пароли ................................................................................................................................. 377
14.2. rootkit: «набор администратора» ....................................................................................... 380
14.3. backdoor: «потайные двери» ..............................................................................................383
14.4. Небезопасный NFS ............................................................................................................. 384
14.5. Определение взлома ........................................................................................................... 386
14.5.1. Осведомлен — значит защищен ................................................................................. 386
14.5.2. Ловля на живца ............................................................................................................. 388
14.6. Тюнинг ОС Linux ................................................................................................................ 389
14.6.1. Параметры ядра ............................................................................................................ 390
14.6.2. Тюнинг HDD ................................................................................................................. 393
14.6.3. Автомонтирование ....................................................................................................... 394
14.7. Короткие советы ................................................................................................................. 396
14.7.1. Дефрагментация пакетов ............................................................................................. 396
14.7.2. Маршрутизация от источника ..................................................................................... 396
14.7.3. SNMP ............................................................................................................................. 397
14.7.4. Полный путь ................................................................................................................. 398
14.7.5. Доверенные хосты ........................................................................................................ 399
Заключение ................................................................................................................... 401
Приложение 1. Команды протокола FTP ............................................................... 403
Приложение 2. Полезные программы ..................................................................... 405
Приложение 3. Интернет-ресурсы ........................................................................... 407
Приложение 4. Работа в командной строке ........................................................... 409
Псевдонимы ................................................................................................................................. 409
Перенаправление ......................................................................................................................... 410
Запуск в фоне ............................................................................................................................... 410
Последовательность команд ....................................................................................................... 411
Предметный указатель .............................................................................................. 412

Tlgm: @it_boooks

Предисловие

Эта книга посвящена рассмотрению одной из самых популярных операционных
систем (ОС), устанавливаемых на серверы, — ОС Linux. А если учесть, что Андроид тоже построен на базе Linux, то и этой мобильной ОС, хотя мы остановимся
только на ее серверной версии.
Для домашнего использования ОС Linux за долгие годы своего существования пока
еще не получила такой популярности, как среди профессиональных администраторов. На мой взгляд, проблема кроется в графическом интерфейсе и отсутствии необходимых программ. Но это мое личное мнение.
Графические оболочки Linux выполнены в довольно спорном дизайне. Рабочую
среду GNOME и ее разработчиков раскритиковал даже сам создатель Linux —
Линус Торвальдс.
Я больше предпочитаю классические, простые и строгие цвета и, наверное, поэтому
последние два года больше всего времени провожу в macOS, которая является достаточно близким родственником Linux, потому что построена на компонентах BSD
(обе ОС имеют UNIX-корни). Ядро, которое используется в macOS, когда-то создавалось программистами BSD, хотя его присутствие в ее дистрибутивах никогда
официально не признавалось. Плюс очень много утилит в эту ОС от Apple также
пришли из мира UNIX.
Операционная система macOS и различные дистрибутивы Linux очень схожи —
много общего в работе консоли, а такие понятия, как конфигурация MySQL, PHP,
Apache, вообще идентичны.
Второй недостаток Linux — нехватка игр и бизнес-программ. Опять же, для Windows и macOS существуют MS Office и вся линейка продуктов Adobe, а бесплатные
офисные пакеты под Linux пока все еще очень сильно проигрывают MS Office. Да и
Adobe Photoshop до сих пор остается бесспорным лидером. Это снова мое личное
мнение — кому-то The GIMP может быть удобен и Google Docs достаточно.
Но вот что касается серверных приложений, где не нужно никаких красот, а требуются лишь производительность и надежность, и достаточно просто командной
строки или управления через удаленный терминал или браузер, — то тут все пре-

Tlgm: @it_boooks

12

Предисловие

имущества Linux выходят на первый план, и здесь она способна конкурировать
с другими ОС. Недаром большинство серверов строят именно на Linux, потому что
ее серверные компоненты вполне конкурентоспособны с аналогами из других
платформ и даже превосходят их.
Лично я использую Linux главным образом как серверную систему и в основном
в Сети. Она бесплатная, и это позволяет сэкономить пользователям и компаниям во
всем мире огромные суммы денег на лицензиях. По работе мне приходится иметь
дело с серверами как на Windows, так и на Linux, и вторые обходятся намного
дешевле, так что для своих проектов я всегда выбираю их.
Установка ОС Linux становится проще, а графический интерфейс и удобство работы в некоторых случаях не уступают самой распространенной на настольных системах операционной системе Windows. Самое главное, что ценят пользователи
Linux, — это возможность ее настраивать.
Когда-то Windows 9x и даже Windows XP можно было настраивать на любой вкус и
существовали программы, которые изменяли внешний вид рабочего стола до неузнаваемости. В Windows Vista возможности по настройке сильно сократились,
а с полным изменением рабочего стола в Windows 8/10 менять стало практически
нечего.
За долгие годы существования Linux осталась гибкой. На нее можно устанавливать
различные графические оболочки, можно даже сделать так, что рабочий стол станет выглядеть как Windows, как macOS или даже как нечто космическое. Именно за
эту гибкость Linux любят во всем мире.
Мы будем рассматривать в этой книге Ubuntu (ее корни — Debian) и немного затронем CentOS. Согласно статистике Интернета, Ubuntu является самой популярной сборкой Linux. Чтобы узнать эту статистику, достаточно зайти в рейтинг
mail.ru и посмотреть любой популярный открытый сайт. Статистика mail.ru показывает, с каких ОС и с каких браузеров заходят на сайт пользователи. Так вот, среди дистрибутивов Linux с огромным отрывом на первом месте находится Ubuntu,
поэтому имеет смысл выбрать именно ее.
CentOS сильно отличается от Ubuntu — у нее другой пакетный менеджер, и ее
больше сравнивают с Red Hat Linux. Очень часто можно услышать, что CentOS —
это бесплатная версия Red Hat Enterprise Linux. Не знаю, насколько верно это
утверждение. Этот дистрибутив я чаще вижу на веб-серверах, и мои сайты работают на выделенном хостинге именно под CentOS.
Я не смогу «покрыть» в этой книге обе ОС полностью и не планирую этого делать.
Но я постараюсь вас ими заинтересовать и дать такую основу, чтобы дальше вы
могли двигаться уже без меня.
В мире Linux — в различных ее дистрибутивах — используется значительное количество общих компонентов. Как я уже говорил ранее, macOS от компании Apple
основана на BSD (одном из вариантов UNIX-систем), и в ней также очень много
общего с Linux, — я могу без проблем копировать некоторые конфигурационные
файлы с macOS на Linux, и они будут работать без изменений.

Tlgm: @it_boooks

Предисловие

13

Почему так вызывающе называется книга? Это маркетинговый ход или просто какой-то трюк? Когда я написал первую книгу по программированию на Delphi, то
основой для нее послужили статьи из журнала «Хакер». Тогда редакция и предложила мне название: «Delphi глазами хакера». Нет, это не мои глаза имелись тут
в виду, имелся в виду стиль журнала, — ведь я тогда вплотную работал с ним и
очень много для него писал. На обложке той книги даже слово «хакер» было набрано в стиле оформления журнала.
Впоследствии эти «глаза» стали использоваться и для других моих книг, хотя вид
слова «хакер» на обложках пришлось изменить, — издательство «Gameland» запретило оформлять это слово их шрифтом.
В названии книги не имеется в виду, что хакер — в смысле взломщик — это я.
Я как раз к таким никогда себя не относил, и больше предпочитаю создавать и защищать. Но в книге все же будут присутствовать глаза некоего взломщика, который будет смотреть на вашу систему извне. А чтобы понять, как защищаться, нужно понять, как думает тот, от кого вы защищаетесь, и знать, как он может атаковать.
Эта книга посвящена безопасности, но не только ей. В основном мы будем говорить о самой Linux, и моя главная задача — погрузить вас в ее увлекательный и захватывающий мир. Я не стану пытаться описать всю систему, потому что для этого
книга должна быть в несколько раз толще, — мы рассмотрим только самое интересное на мой взгляд.
Я интересуюсь взломом и постоянно изучаю новые его методы, но только потому,
что хочу строить безопасные системы, и безопасность меня интересует намного
больше. Любой объект может быть рассмотрен с разных точек зрения. Простой
пример из жизни — нож, являясь столовым прибором, при определенных обстоятельствах становится орудием убийства или средством самообороны. Точно так же
программные инструменты, утилиты или даже просто знания могут быть восприняты и как советы для повседневного ухода за ОС, и как способы защиты ее от проникновения или же как средства взлома системы. Я надеюсь, что вы не станете использовать полученные знания в разрушительных целях. Это вас не украсит и славы не добавит. Да и зачем вам нужна «черная» популярность взломщика? Не лучше
ли посвятить себя более полезным и добрым вещам?
Причины, по которым люди идут темной дорогой, могут быть разными. Кто знает
человека, который разработал средства безопасности для какой-либо крупной компании или сайта? Хотя бы одного из людей, отвечающих за безопасность крупных
сайтов? Мало кто слышал о них... Но стоит взломать Facebook или любой другой
сайт, как о вас заговорят во всем мире. Стремление к такой дешевой популярности
понятно, но оно совершенно бессмысленно и не нужно.
Когда меня спрашивают, что я подразумеваю под словом «хакер», я привожу простейший пример — если вы как администратор установили и заставили работать ОС
и вам удалось настроить ее на максимальную производительность и безопасность, то
вы — хакер. Умения хакера позволяют создавать что-либо, превосходящее имею-

Tlgm: @it_boooks

14

Предисловие

щиеся аналоги (т. е. более быстрое, удобное и безопасное). Именно такой является
сама ОС Linux, созданная хакерами со всего мира.
Для меня слово «хакер» ассоциируется с людьми, которые создают что-то, а не
взламывают. И так считаю не только я. В Торонто уже не раз проходил Facebook
Hack, на котором люди не взламывали самую популярную пока социальную сеть,
а писали код, создавали приложения для Facebook и соревновались в умении программировать.
Наверное, пора более детально поговорить о том, что будет ожидать вас в самой
книге.
Для того чтобы установить ОС на домашний компьютер, не требуется много настроек. Большинство операционных систем устанавливаются с настройками по
умолчанию вполне безопасно. Простому домашнему компьютеру не нужно открывать никаких сервисов внешнему миру. И только вы сами инициируете большинство соединений с внешним миром, запрашивая у почтовых серверов свою почту или
у веб-серверов интересующие вас страницы, музыку и видео. Поэтому достаточно
запретить любые входящие соединения и разрешить только то, что пользователь
запросит сам. И если пользователь попросил систему соединить его с «не совсем
хорошим» сервером, то это уже будет ошибка пользователя, потому что ОС и программы мало что могут в этом случае сделать.
Единственное, что нужно в качестве дополнительной защиты домашним компьютерам, — антивирусы, которые будут проверять контент, который пользователь
получает/скачивает, на предмет возможного вредоносного кода. Пока что в Linux
не было серьезных вирусных эпидемий, которые уже не раз захлестывали мир
Windows, и большинство пользователей Linux не ставит антивирусов.
В случае с сервером все намного сложнее. Серверы для того и предназначены, чтобы предоставлять пользователям какой-то контент. К ним могут подключаться
совершенно разные пользователи со всего мира, которых вы никогда не видели и не
знали. Доверие к таким посетителям практически нулевое, потому что никогда не
знаешь, кто запрашивает ресурсы сервера, для чего и как он собирается их использовать.
Мне кажется, что большинство недочетов в программах происходит как раз из-за
недопонимания этого. Программисты просто не задумывались о потенциальных
угрозах и надеялись, что пользователи будут делать только то, что для них предусмотрено. Но хакеры — далеко не ординарные пользователи, и они обязательно
будут пытаться использовать то, что не должно быть доступно.
В результате настройка сервера превращается иногда в увлекательное приключение, где борются Инь и Янь: разрешить или запретить? Дать возможность или нет?
Для того чтобы правильно настроить сервер, необходимо знать множество параметров, которые большинству пользователей не нужны. Если же просто закрыть
глаза и оставить все значения по умолчанию, то об истинной безопасности Linux не
может быть и речи. Дело в том, что производитель программы заранее не знает, что

Tlgm: @it_boooks

Предисловие

15

именно нам понадобится, и делает все возможное, чтобы она работала на любой
системе, а для этого ему приходится включать в нее много дополнительных возможностей, что делает систему в целом избыточной.
В последнее время разработчики дистрибутивов и других серверных программ стали максимально урезать установки по умолчанию, т. е. разрешать только базовые
возможности, а все сетевые сервисы, которые могут позволить хакеру проникнуть
на компьютер, отключать. При этом чаще всего производитель предоставляет нам
простое и удобное средство для быстрого включения и конфигурирования нужного
сервиса.
Если в Windows все делается в визуальных окнах с большим количеством контекстных подсказок, то в Linuxбольшинство настроек осуществляется именно в конфигурационных файлах. Да, для нее тоже существуют утилиты, упрощающие
настройку, но функционал не всех их столь удобен и гибок, как простое прямое
конфигурирование файлов.
Я всегда рекомендую, изучая какую-либо тему, узнать мнение еще как минимум
двух-трех авторов. Так что обязательно возьмите еще несколько других книг. У каждого автора свой подход, и разные темы могут быть раскрыты по-разному. К тому же
в книгах часто можно встретить авторские описания собственного их опыта, а это
самое важное и дорогое.
Можно, например, почитать работы Дениса Колисниченко, который уже не первый
год специализируется в Linux. Я видел одну его книгу лет десять назад, и она мне
показалась очень даже интересной. Хотелось прочитать ее полностью, но я уехал
в Канаду, а отсюда у меня доступ к литературе на русском языке практически отсутствует. Онлайн-магазины не доставляют книги в Канаду, а качать нелегальные версии я не хочу. Впрочем, вроде бы сейчас издательства в России стали продавать
электронные версии книг, и я теперь могу легально покупать книги на русском через
Интернет, осталось только найти время на чтение.
Рассматривая Linux, я буду говорить о безопасности и производительности не
в отдельных заключительных главах, а практически все время. Из-за этого могут
иногда случаться повторы, но я считаю, что это необходимо. Когда человек уже
приобрел навыки неэффективной работы с системой, переучиваться ему сложно.
Именно поэтому мы будем разбирать последовательно (от азов до сложных вопросов) все аспекты каждой рассматриваемой темы, аккуратно раскладывая полученные знания по полочкам.
Кстати, популярная сейчас на мобильных устройствах ОС Android построена на
базе Linux, и появление под нее вредоносного кода показало, что и здесь вопросами
безопасности пренебрегать не стоит.
Итак, давайте знакомиться с Linux с точки зрения хакера. Я уверен, что вы посмотрите на нее совершенно другими глазами и найдете для себя много нового и интересного.

Tlgm: @it_boooks

16

Предисловие

QualitySource
Мой взгляд на Linux может вам понравиться, а может и шокировать. Дело в том,
что я не принадлежу к сторонникам или поклонникам Open Source, к которому относится Linux. Я отношу себя к сторонникам движения QualitySource (такого реально не существует, это я так его для себя называю), т. е. качественного кода. Мне все
равно, какой это код — открытый или закрытый, главное, чтобы он был качественный. Если бы код ОС Windows был открытым, вы бы полезли его смотреть или
изменять? Я бы нет, и большинство тоже.
Я даже против изменения исходных кодов. Изменив их под себя один раз, вам придется делать это каждый раз, когда выходит новая версия. Само собой, что в вышедшем завтра обновлении ОС не окажется ваших изменений. Придется снова и
снова изменять исходный код или создавать свою личную ветку кода и поддерживать ее самостоятельно. Но если каждый будет заниматься поддерживанием своих
веток, то когда найти время на собственную жизнь и семью?
Когда только появился Android, то для него все производители начали писать свои
оболочки, чтобы выделиться из общего фона. С выходом каждой новой версии этой
ОС приходилось ждать, когда оболочки обновят. Это как топтание на месте — постоянно приходится адаптировать и тестировать один и тот же код для новой версии ОС. Всем это явно надоело, и все чаще можно видеть «чистую» ОС Андроид.
Большинство из нас, устанавливая ОС или какую-то программу, хочет, чтобы она
стабильно работала и выполняла положенные действия. Какая нам разница, открыт
код или нет? Какая нам разница, на каком языке написана программа? Для меня эти
вопросы не существенны. Если программа стоит того, чтобы я отдал за нее запрашиваемые деньги, если она достаточно качественна, — то я отдам эти деньги, независимо от того, открыт ли ее код и на каком языке ее написали.
И ОС Linux, и Windows, на мой взгляд, являются качественными проектами, и я
использую их одновременно, но для разных задач. Устанавливать сложный, тяжеловесный и дорогой Windows Server ради банального файлового сервера — это
глупость, поэтому здесь я использую Linux. Но для сложных финансовых решений
я предпочитаю использовать великолепную связку MS Windows и MS SQL Server.
Это мое личное предпочтение, которому не обязательно следовать. Вы можете выбрать для управления базой данных связку Linux и MySQL.
C 2009 по 2017 год я работал над сайтами с высокой нагрузкой и в качестве бэкэнда1 использовал серверы Windows, на которых установлены база данных и вебсерверы (потому что для больших сайтов я все же предпочитаю использовать C#),
но на фронтенде2 у меня были установлены кэширующие серверы Linux, FTP-серверы на Linux, серверы деплоя (развертывания) и управления также на Linux.
1

Бэкэнд (от англ. Back-End, оборотная сторона) — программный код, отвечающий за работу с сервером (базой данных), данными (для их дальнейшей записи в БД или отправки клиенту) и т. п.
2
Фронтенд (от англ. Front-End, лицевая сторона) — публичная часть сайта, с которой непосредственно контактирует пользователь, и функционал, который обычно обыгрывается на клиентской стороне
(в браузере).

Tlgm: @it_boooks

Предисловие

17

К какому миру присоединиться — это личное решение каждого. Единственное,
о чем я прошу вас, — не делайте ничего бездумно. Не стоит устанавливать софт
только потому, что он относится к Open Source, как и не стоит считать, что коммерческий софт заведомо лучше. Выбирайте своим умом, пробуйте, тестируйте и
принимайте самостоятельное решение в зависимости от конкретной ситуации.
Программа не может быть лучше, надежнее или безопаснее других только потому,
что у нее открыт код, это бред полнейший. Яркий пример — sendmail. Не очень хороших программ с открытым кодом, как, кстати, и коммерческих, весьма много,
поэтому выбирайте за качество, а не за наличие или отсутствие исходных кодов,
которые большинству пользователей просто не нужны.
Почему и когда я выбираю Linux? Я программист, который любит Microsoft .NET и
PHP. Первый лучше выполнять на Windows-серверах, а второй на Linux. И если для
финансовых проектов я выберу .NET за его возможности и простоту разработки, то
для любых других проектов я остановлюсь на Linux+Apache+MySQL+PHP
(LAMP), как на более экономном варианте. Эта связка не требует дорогих лицензий, отчисляемых Microsoft, а ее серверы будут потреблять меньше памяти.
Сейчас на сервере, где находятся мои сайты, мне выделено всего 512 мегабайт памяти, но монитор показывает, что используются около 300 и есть еще незанятое
пространство. На виртуальную машину с таким количеством памяти поставить
полноценную Windows не выйдет, — придется ставить только версию Core, для
которой 512 Мбайт — минимум, и тут уже о комфортной работе говорить будет
сложно. А если нужна Windows с возможностью удаленного подключения по RDP1,
то потребуется минимум 4 гигабайта, а это уже намного дороже.

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

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

RDP (Remote Desktop Protocol) — протокол удаленных рабочих столов.

Tlgm: @it_boooks

18

Предисловие

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

Четвертое издание
Четвертое издание снова было полностью переписано. Я опять пробежался по каждой главе и каждому абзацу и переделал очень многое. Компьютерный мир меняется сильно и быстро. Информация из первого издания уже совершенно не актуальна,
и даже то, что я добавлял во втором издании, также сильно изменилось.
В Linux поменялись приоритеты при выборе файлового или почтового сервера по
умолчанию. Что остается до сих пор актуальным — так это связка LAMP (Linux,
Apache, MySQL, PHP). Она, кажется, будет жить вечно, потому что эти четыре продукта на самом деле весьма качественные и отлично поддерживаются их создателями.
Я даже немного изменил подход к описанию программ и самой ОС. Если раньше
я пытался описать как можно больше команд и параметров, то в этом издании я
выкинул очень много скучных и лишних описаний и добавил то, что, на мой
взгляд, было бы более интересно читателям.
Даже если у вас есть любое из предыдущих изданий, это издание вам так же будет
интересно прочесть практически полностью.
И еще одно изменение, произведенное для четвертого издания, — информация,
расширяющая и дополняющая материал бумажной книги, теперь не приклеивается
к ней в виде компакт-диска, а размещается на FTP-сервере издательства, и электронный архив с этой информацией можно скачать по ссылке ftp://ftp.bhv.ru/
9785977533331.zip или со страницы 4-го издания книги на сайте www.bhv.ru.

Пятое издание
Пока еще рано было переписывать всю книгу, потому что в предыдущем издании
была проделана большая работа.
Тем не менее в пятом издании я сократил количество вступительного материала и
общих слов о Linux, его истории и пр. Все это переехало на мой сайт в раздел статей по адресу: http://www.flenov.info/story/category/Linux. Взамен я добавил
больше практической информации о самой ОС Linux. Девиз этого издания: меньше
общих слов — больше дела!

Tlgm: @it_boooks

Предисловие

19

Обновлена информация по управлению сетевым экраном, добавлено немного новых примеров, включая Uncomplicated Firewall1, описано, как настроить шлюз
в Интернет. В главу о работе с почтой добавлен раздел по борьбе со спамом. Приведено больше информации по безопасности — этого много не бывает.
Все предыдущие издания описывали только Ubuntu, а в пятое я добавил информацию про CentOS, потому что это очень распространенный Linux-дистрибутив для
серверов.

Шестое издание
Linux очень динамичная система, и новая версия Ubuntu выходит каждые полгода
(октябрь и апрель), а каждые два года выходит версия LTS (Long Term Support),
которую компания поддерживает после выхода в течение пяти лет. Предыдущая LTS-версия Ubuntu была выпущена в апреле 2018 года, а в апреле 2020-го вышла и ее новая LTS-версия — 20.04. Это издание обновлено с учетом как раз
Ubuntu 20.04.
До сих пор я мало уделял внимания дополнительным программам, которые можно
использовать для аудита ОС, потому что они не являются частью самой ОС. Но
есть утилиты, которые помогают с настройкой ОС, проверяют ее надежность и
безопасность, поэтому я решил в этом издании добавить описание дополнительных
утилит, и самым ярким новшеством будет Lynis.

Благодарности
В каждой своей книге я стараюсь поблагодарить всех, кто помогал в ее создании
и выходе в свет. Без этих людей просто ничего бы не получилось.
Первым делом я хотел бы поблагодарить издательство «БХВ-Петербург», с которым сотрудничаю уже долгие годы. Спасибо руководству издательства, редакторам
и корректорам, которые работают со мной и помогают сделать книгу такой, какой
я ее задумывал. Ведь писать приходится в тяжелых по срокам условиях, но иначе
нельзя — информация может устареть раньше, чем книга попадет на прилавок.
Спасибо всем, кто помогает сделать текст лучше, обложку красивой и книгу доступной всем желающим.
Не устану благодарить родителей, жену и детей за их терпение. После основной работы я прихожу домой и тружусь над очередной книгой. Таким образом, семья может
видеть меня только за компьютером, а общаться со мной очень сложно, потому что все
мои мысли устремляются далеко в виртуальную реальность.
1

Uncomplicated Firewall (ufw) — в переводе c англ. «незамысловатый межсетевой экран», обертка для
брандмауэра iptables в Ubuntu.

Tlgm: @it_boooks

20

Предисловие

Большая благодарность моим друзьям и знакомым, которые что-то подсказывали,
помогали идеями и программами.
Так уж выходит, но в написании каждой книги участвуют и животные. Эта работа
тоже не стала исключением. Во время подготовки первого издания книги мой кот
Чекист с 23:00 до 1:00 ночи гулял по квартире и просто кричал от скуки. Я не мог
уснуть, а значит, больше времени уделял работе.
А самая большая благодарность: вам — за то, что купили книгу, и моим постоянным читателям, с которыми я регулярно общаюсь в моем блоге www.flenov.info.
Последние мои работы основываются на их вопросах и предложениях. Если у вас
появятся какие-либо проблемы, то милости прошу на сайт. Я постараюсь помочь по
мере возможности и жду любых комментариев по поводу этой книги. Ваши замечания помогут мне сделать ее лучше.
Все чаще люди предпочитают не покупать книги, а качать из Интернета их пиратские копии, что наносит ущерб и авторам, и издательствам. Доход от книг падает,
и многие хорошие авторы перестают писать, ибо настоящему специалисту легко
найти достойный источник дохода без лишних мучений. От этого количество
хороших книг уменьшается. Боюсь, эта тенденция сохранится.
Если вы нашли в книге какую-нибудь ошибку, просьба сообщить мне об этом через
обратную связь на моем сайте www.flenov.info. Ошибки могут быть везде, и не
только в программах или ОС, но и в текстах книг. Я также жду ваших отзывов
о книге и пожеланий, что вы хотите увидеть в ней в будущем, если появится новое
издание.
Со мной также можно связаться через Твиттер: @flenov или Телеграмм: @mflenov.
На этом мы завершаем вступительное слово и переходим к наиболее интересной
и главной части книги — знакомству с ОС Linux.
Приятного чтения!

Tlgm: @it_boooks

ГЛАВА

1

Прежде чем начать...

Много лет назад установка ОС Linux была очень сложной, и далеко не на каждый
компьютер систему удавалось установить, — постоянно возникали проблемы с совместимостью, отсутствием драйверов. Впрочем, такие проблемы были даже
у Windows 95, которая так же работала с минимальными функциями, пока на нее не
поставят необходимые драйверы.
У меня в 1990-х годах были не очень популярный монитор Philips и специфичная
видеокарта, которая отсутствовала в списке доступного оборудования, поэтому мне
приходилось подбирать подходящие драйверы из тех, что были в наличии для других систем, чтобы рабочий стол отображался на экране в приемлемом разрешении.
Сейчас установка Linux стала настолько простой, что в некоторых дистрибутивах
для полной установки надо всего-то несколько раз щелкнуть мышью — все имеющееся оборудование определяется без проблем и устанавливается без необходимости подбирать драйверы.
Если смотреть на ОС Linux с точки зрения пользователя, то после установки системы ничего настраивать не надо, — можно сразу же приступать к работе с любыми
офисными приложениями и пользовательскими утилитами. Дистрибутивы для домашних компьютеров очень часто уже включают и офисные пакеты, и все необходимое на все случаи жизни.
Но если речь идет о сетевых и серверных программах, то тут уже необходимы дополнительные действия. По умолчанию в системе должны быть запрещены практически все действия, которые могут привести к нежелательному результату или
вторжению по сети. Для изменения ограничений нужно настраивать конфигурационные файлы, редактировать которые крайне неудобно новичку или пользователю,
привыкшему работать с окнами, а также использовать специализированные утилиты, большинство из которых имеют интерфейс командной строки.
Из-за этих неудобств мой знакомый администратор Windows-систем сказал: «Linux
придумали администраторы, которым нечего делать на работе, для того, чтобы играться с конфигурационными файлами». Смешно... Но я с этим не согласен, поскольку заглядываю в конфигурационные файлы своих серверов очень редко.

Tlgm: @it_boooks

22

Глава 1

Корпорация Microsoft начинала делать свои ОС по принципу «лишь бы было удобно», поэтому когда-то оставалось лишь подключить к ним требуемые компоненты.
Но теперь Windows становится с каждым годом все сложнее и безопаснее, а большинство удобных функций, которые могут нарушить защиту, просто отключаются.
При необходимости их нужно включать. Начиная с 2008 года эта тенденция приняла совершенно новый и интересный оборот — в Windows Server появилась версия
без графического режима. Да, Windows запускается в текстовом режиме, в котором
можно полноценно управлять сервером! В Linux все было наоборот — эту ОС создавали с точки зрения «лишь бы было безопасно», а теперь двигаются в сторону
наращивания возможностей и упрощения сервисов. Эта тенденция радует не всегда: в некоторых дистрибутивах Linux если установить какой-либо сервис, то инсталлятор мало того, что устанавливает его в максимальной конфигурации, он еще
и запускает его автоматически при старте системы. Это очень плохо, и такие вещи
нужно пресекать.
Что ж, удобство и безопасность во многом противоречат друг другу, поэтому производителям приходится в чем-то лавировать.

1.1. Ядро
Ядро — это сердце ОС, в котором реализовано управление памятью и другими ресурсами компьютера. Помимо этого, оно позволяет получить доступ к различному
«железу». Например, ранние версии ядра обеспечивали работу только двух USBустройств: клавиатуры и мыши. Современное ядро поддерживает большинство
существующих устройств, а дистрибутивы включают драйверы для большинства
популярного оборудования.
Обновление ядра позволяет не только получить новые возможности по работе
с «железом» и повысить производительность системы, но и исправить некоторые
ошибки. Самое главное, что обновление ядра в Linux не влечет за собой переконфигурирования всей ОС, как это происходит в некоторых других системах. Я видел
компьютеры, ОС которых были установлены еще несколько лет назад и не перенастраивались с тех пор, — в них только обновлялось ядро и программное обеспечение.
Да что там далеко ходить, я долго пользовался услугами хостинговой компании
myhosting, и когда купил у них выделенный хостинг много лет назад, мне досталась
CentOS 6-й версии, которая вышла в 2011 году. Я ушел от них в прошлом году, потому что они продолжали использовать эту 6-ю версию. Сейчас снова проверил их
сайт — она до сих пор у них стоит, хотя полных обновлений для этой ОС нет
с 2017 года, а поддержка закончится в ноября 2020 года.
Как бы там ни было, но CentOS 2011 года все еще служит множеству клиентов этой
хостинговой компании, и пока она не попадала в новостные ленты о массовых
взломах сайтов из-за такого старого дистрибутива. А все потому, что ОС обновляет
свое ядро и продолжает ставить сама обновления пакетов. От администраторов
вмешательства в работу ОС не нужно. Мне только один раз пришлось чинить об-

Tlgm: @it_boooks

Прежде чем начать...

23

новление системы, когда что-то случилось, и автоматическое обновление пакетов
не сработало, но это отдельная история, которая не касается ядра.
Финальная версия Ubuntu 20.04 содержит ядро 5.4. При подготовке этой книги я
использовал бета-версию системы на этом ядре. Сейчас релиз Ubuntu 20.04 уже
вышел, и серьезных изменений в ней по сравнению с бета-версией не произошло, — только исправление багов.
Версия ядра Linux 5.4 принесла нам много интересных возможностей, все их описывать здесь смысла нет, но я выделю три самых ярких:
 поддержка файловой системы ExFAT на уровне ядра. Раньше так сделать было

нельзя, потому что патент на эту файловую систему принадлежит Майкрософт,
но недавно ее спецификация была открыта. ExFAT — это расширенная версия
файловой системы FAT, которая используется еще со времен MS-DOS и до сих
пор обеспечивает работу внешних носителей — карт памяти или флеш-дисков,
потому что этот формат поддерживается всеми ОС;
 Fs-verity — это система обеспечения целостности данных и защиты файлов

только для чтения, которая поддерживается файловыми системами ext4 и f2fs.
fs-verity подсчитывает хэш-сумму и хранит ее в метаданных и в случае обращения к файлу, сумма которого не совпадает со значением в метаданных, выдает
ошибку;
 поддерживается язык Python только третей версии. На этом языке пишут боль-

шое количество скриптов, но при переходе с Python 2 на Python 3 обратная совместимость потерялась, и скрипты 2-й версии могут не запуститься на 3-й.
Впрочем, если учесть, что Python 3 появился еще в 2008 году, то убийство его
предшественника в 2020-м вполне логично.
Кроме того, улучшена производительность системы и добавлена поддержка нового
оборудования.
Если вы собираетесь использовать Ubuntu на домашнем компьютере, то заметите и
визуальные изменения — такие как новые значки и даже темный стиль, который
сейчас становится популярным во всех ОС.

1.2. Дистрибутивы
В настоящее время существует множество различных дистрибутивов Linux, но между ними легко проглядывается сходство, т. к. большинство имеет общие корни.
Например, многие дистрибутивы построены на основе Red Hat Linux. Компаниипроизводители вносят некоторые коррективы в процедуру инсталляции (чаще всего
только графические), изменяют список включаемого программного обеспечения и
продают под своей маркой. При этом ядро системы и устанавливаемые программы
чаще всего поставляются абсолютно без изменений.
Даже если установочные версии имеют разных производителей, в качестве графической оболочки очень часто используются KDE или/и GNOME, а при отсутствии
их в поставке эти графические оболочки всегда можно установить дополнительно.

Tlgm: @it_boooks

24

Глава 1

Таким образом, вне зависимости от основного дистрибутива у всех будет одинаковый графический интерфейс.
Еще недавно в Ubuntu можно было встретить Unity — ее графическую оболочку по
умолчанию, но от разработки Unity отказались, и дистрибутив снова возвращается
к своим корням — к GNOME.
Я долго не мог решить, какой дистрибутив установить, но потом решил выбрать
Ubuntu. Предварительно я заглянул на пару сайтов, посвященных Linux, и посмотрел в статистике перечень операционных систем, с которых заходили на сайт пользователи (такую статистику предоставляет счетчик mail.ru). Наиболее популярной
оказалась Ubuntu. В принципе, зная один дистрибутив, очень легко перейти на другой, ведь каждый из них — та же Linux.
И все же, на мой взгляд, разнообразие дистрибутивов является самым слабым звеном Linux. Когда вы начнете работать с этой операционной системой, то увидите,
что большая часть операций не стандартизирована (что можно расценивать как
следствие открытости кода). Получается как в поговорке: «Кто в лес, кто по дрова».
Это серьезная проблема, которая усложняет восприятие.
На мой взгляд, неудобство от разнообразия дистрибутивов заключается еще и в
том, что производителям приходится много топтаться на месте и писать один и тот
же код. Лучше бы они объединились и начали быстрее двигаться вперед. Да, пострадает конкуренция и возможность выбора, но развитие станет намного эффективнее.
Какой дистрибутив выбрать? Их слишком много, чтобы упоминать все, и я остановлюсь только на самых популярных:
 Red Hat Enterprise Linux и SUSE — выбираем, если нужна хорошая корпоратив-

ная поддержка;
 CentOS или Debian — чаще выбирают для серверов, когда не нужна дорогая

поддержка со стороны производителя;
 Mint, Ubuntu — хороший выбор для домашнего компьютера, если не нужна под-

держка;
 Kali — прославился хорошим набором для хакеров и специалистов в области

безопасности.
А теперь о некоторых из них немного подробнее.

1.2.1. Red Hat Linux
Этот дистрибутив считается классическим и является законодателем моды в развитии ОС. Помимо всего прочего, Red Hat ведет разработку ОС Linux в двух направлениях: для серверных решений и для клиентских компьютеров. Серверный вариант —
платный, а клиентский вариант (Fedora) бесплатен и доступен для скачивания с сайта
fedoraproject.org. Шли разговоры о том, что Fedora будет независимым проектом, но
пока он остался под крылом Red Hat.

Tlgm: @it_boooks

Прежде чем начать...

25

Дистрибутивы Linux всегда ругают за сложность установки ядра и программ, которые чаще всего поставляются в исходных кодах и требуют компиляции. Компания
Red Hat уже давно упростила этот процесс, разработав менеджер пакетов RPM
(Redhat Package Manager). Такие пакеты для установки используют и большинство
других разработчиков.

1.2.2. CentOS
Этот дистрибутив очень популярен на серверах и у хостинговых компаний. Имя его
расшифровывается как Community ENTerprise Operating System. CentOS направлена
на корпоративного пользователя, как и ее родительская версия Red Hat Enterprise
Linux (RHEL). Оба дистрибутива совместимы между собой, но СentOS распространяется бесплатно.
Поскольку СentOS — бесплатная и очень популярная на серверах операционная
система, я буду указывать специфичные для этой ОС команды в случаях, когда они
отличаются от Ubuntu.

1.2.3. SuSE Linux
Мне приходилось работать с разными программами от немецких производителей,
но удобство работы с ними не просто хромало, а создавалось впечатление, что
эти программы — безногие калеки с детства. Однако разработка от SuSE
(www.suse.com) опровергает такое мнение. Этот дистрибутив отличается симпатичным интерфейсом и отличной поддержкой оборудования, потому что содержит
громадную базу драйверов. Кроме того, программисты SuSE добавили в дистрибутив набор утилит под названием YaST, которые значительно упрощают администрирование.
SuSE Linux — наверное, один из первых дистрибутивов, который стал дружественным к пользователю и применяет большое количество собственных наработок,
чтобы сделать жизнь домашнего пользователя проще. Но при этом он всегда был
платным, причем цена кусается. Мне кажется, что именно это помешало SuSE
занять верхнюю ступень пьедестала и обойти Ubuntu. Сейчас у SuSE Linux есть
бесплатная версия — openSUSE, но она пока не набирает популярности.

1.2.4. Debian
Несмотря на то что цель любого производителя — получение прибыли, существует
множество дистрибутивов, которые были и остаются некоммерческими. Основным
и самым крупным из них можно считать Debian (www.debian.org). Этот продукт
создают профессионалы для себя, но пользоваться им может каждый.
ОС Debian имеет больше всего отличий от классической Red Hat, и у вас могут возникнуть проблемы из-за разного расположения некоторых конфигурационных файлов. Но на этом проблемы не заканчиваются. Как и все некоммерческие проекты,

Tlgm: @it_boooks

26

Глава 1

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

1.2.5. Ubuntu
Это, наверное, один из самых простых дистрибутивов, его поддержку осуществляет
компания Canonical Ltd (сайт разработчиков: www.ubuntu.com). При создании дистрибутива Ubuntu основной целью была выбрана простота работы с ним.
Дистрибутив построен на базе Debian. Выбор компании Canonical Ltd ясен — в лице Debian они получили очень безопасную основу. Единственное, что меня настораживает, — большинство статистических обзоров показывает, что ежегодно
в Ubuntu находят больше уязвимостей, чем в ее конкурентах. И это притом что
в ОС Debian, на которой основана Ubuntu, уязвимостей находят очень мало.
Впрочем, доверять статистикам и аналитикам надо с осторожностью, особенно их
выводам по части безопасности, потому что безопасность измерить невозможно.
В дистрибутиве может быть найдена сотня уязвимостей, но он останется надежным, если все они незначительные. С другой стороны, достаточно одной уязвимости, но очень серьезной, которой злоумышленники смогут легко воспользоваться,
и которую залатают с большим опозданием, чтобы надежность опустилась до нуля.

1.2.6. Raspbian
Это еще одна ОС, построенная на Debian, но ее основное назначение — устройства
IoT (Internet of Things, или Интернет вещей). И основное место использования этой
ОС — на одноплатном компьютере Raspberry PI.

Tlgm: @it_boooks

ГЛАВА

2

Установка
и начальная настройка Linux
Установка когда-то была самой сложной процедурой для всех дистрибутивов
Linux. Вспоминаются времена, когда нужно было последовательно загружаться
с нескольких дискет, а потом следовать сложным инструкциям или самостоятельно
набирать команды Linux, которые уже надо было знать.
Еще одна непростая задача — разбиение дисков на разделы. Их нужно иметь как
минимум два: основной и раздел подкачки. Проблема в том, что многие боятся манипулировать с дисками, особенно с теми, на которых уже есть информация. И это
правильно, потому что известны примеры, связанные со случайной потерей
данных.
Во время инсталляции любая ОС должна определить установленное оборудование
и подготовить все необходимое для его нормальной работы. В 1990-х годах и в начале 2000-х перечень поддерживаемых дистрибутивом устройств можно было просмотреть за несколько минут, т. к. многие производители игнорировали Linux, не
писали необходимые драйверы и при этом не давали нужной информации. Сейчас
все намного проще, потому что работа с оборудованием уже лучше стандартизирована.

2.1. Подготовка к установке
Устанавливать желательно самый свежий стабильный дистрибутив, включающий
последнюю версию ядра и приложений. Не стоит брать какой-то пыльный диск
с полки и ставить систему с него. Во всех программах могут быть ошибки, просто
в новой версии о них еще никто не знает и не сможет вас с ходу взломать ☺. Кроме
того, надо помнить, что программные средства необходимо своевременно обновлять. Если воспользоваться старым дистрибутивом, то объем обновлений может
оказаться слишком большим и занять несколько дней. Не лучше ли установить сразу все новое и максимально быстро запустить сервер в эксплуатацию?
Кроме того, если установить старый дистрибутив и не обновить его до последней
версии, то в нем, скорее всего, будут иметься известные хакерам ошибки, а значит,

Tlgm: @it_boooks

28

Глава 2

останется потенциальная угроза взлома вашего сервера. Если этого не сделают сразу, то это может произойти в любой момент. Не стоит считать, что ваш сервер никому не нужен. Даже «пустышка» кому-то может оказаться нужной — например,
для рассылки спама или, может, даже для не вполне легальных действий.
Мастера установки для разных дистрибутивов могут различаться, но все они, как
правило, имеют схожие окна, и даже последовательность выполняемых действий
зачастую одинакова. Дело в том, что программ установки не так уж и много,
и большинство разработчиков используют одни и те же программы и не пишут ничего самостоятельно. Разве что оформление отличается.
Итак, приступим к рассмотрению процесса установки. Первое, что нужно сделать, — это определить место, где будет располагаться ОС. Если у вас новый компьютер, жесткий диск не разбит на части и вы будете использовать только Linux, то
при установке просто отведите под нее все доступное пространство. Доверьте разбиение системе, и она сделает это вполне оптимально.
Если у вас уже установлена Windows и вы хотите, чтобы на компьютере было сразу
две ОС, то придется сделать несколько «телодвижений». Для установки Linux требуется наличие на диске пустого пространства. Нет, это не свободное место на логическом диске С:, а пустота на винчестере, место, не занятое какими-либо разделами. В последних версиях инсталляторов присутствует возможность изменять
размер имеющихся на диске разделов прямо в программе установки, причем без
потери данных. Раньше при изменении разметки диска имеющаяся на нем информацию пропадала.
Итак, если у вас все пространство диска под разделы уже используется и вы хотите
«откусить» небольшую часть этого пространства для установки Linux, то это вполне реально. Данные на существующем диске просто сдвигаются, а в опустошенной
части диска может быть создан новый раздел для Linux.
Для повышения надежности процесса сдвига многие рекомендуют сначала произвести дефрагментацию диска. Эта операция вполне безопасна и заключается в том,
что разбросанные по всей поверхности диска данные собираются в одном его месте. В процессе работы с файлами данные каждого файла могут быть разбиты на
множество кусков и лежать в любых местах диска. После дефрагментации все файлы станут занимать лишь одну непрерывную область. Таким образом, при сокращении размера раздела не придется опустошать от данных его содержимое.
Я не знаю, насколько эта рекомендация еще действительна, — современные программы изменения разделов более качественны.
Прежде чем вставить в новый компьютер компакт-диск или DVD с дистрибутивом и
начать установку Linux, желательно определиться с другими системами, — а именно
будет ли на компьютере установлена также и Windows. Если да, то я бы порекомендовал сначала установить Windows, и только потом Linux. Дело в том, что установщик от Microsoft затирает загрузочную запись и уничтожает любое присутствие сторонних систем. То есть установленная ранее Linux станет недоступной.
Установщики Linux более доброжелательны к чужим разработкам, и если на компьютере были «окна» от Microsoft, то загрузчик Linux позволит загружать их без

Tlgm: @it_boooks

Установка и начальная настройка Linux

29

проблем. Впрочем, загрузчик Linux можно восстановить, даже если он был уничтожен установщиком Windows. Достаточно просто иметь загрузочный диск, с которого нужно загрузить Linux и выполнить команду:
grub-install /dev/hda

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

2.2. Начало установки
Несмотря на всю простоту установки, я уже не раз замечал, что установщики
слишком молчаливы и не сообщают об ошибках. Если вы вставили диск или флешку с дистрибутивом, перезагрузили компьютер, в открывшемся окне выбора действий выбрали установку или загрузку Linux, но установка не началась и все как бы
«замерзло», то, скорее всего, вы скачали неправильный дистрибутив.
Если попытаться устанавливать 64-битную версию ОС на 32-битный компьютер, то
сразу после попытки загрузить ОС компьютер просто остановится и не станет
загружаться. Никаких сообщений может и не появиться. То же самое произойдет,
если с дистрибутивом не совместим процессор компьютера, — и это в большинстве
современных дистрибутивов! Установка становится проще, но сообщать об ошибках программы почему-то не хотят.
У меня есть старый ноутбук, на котором долго работала Windows XP. Я решил заменить на нем эту ОС на Linux, и первый дистрибутив, который я выбрал, не стал
устанавливаться из-за несовместимости процессора — он оказался слишком старым.
Если же установка началась, то после этого проблем быть уже не должно. По крайней мере, у меня пока не было. Хотя я в последнее время чаще устанавливаю Linux
в виртуальной машине. И не только я. Большинство хостинговых компаний делает
так, и сейчас уже мало кто покупает выделенные серверы — в основном это виртуальные, установленные в виртуальной машине.
П РИМЕЧАНИЕ
Я покажу здесь установку серверной версии Ubuntu на виртуальную машину
VirtualBox. Небольшую вводную статью по VirtualBox я написал специально для этой
книги и опубликовал на своем сайте по адресу: http://www.flenov.info/story/show/
VirtualBox-dlya-raboty-s-Linux. А здесь мы сконцентрируемся собственно на установке Linux, потому что именно ей посвящена эта книга.

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

Tlgm: @it_boooks

30

Глава 2

мы рассмотрим критические моменты установки, когда неправильный выбор может
повлечь проблемы. И обычно первый из таких моментов — это распределение дискового пространства.
В случае установки серверной версии Ubuntu все шаги будут выполняться в текстовом режиме. Интересно, что в CentOS даже серверная версия устанавливается графической программой установки.
В некоторых дистрибутивах язык устанавливаемой системы придется определять
старым способом, т. е. нажимая разные клавиши на клавиатуре. Программа установки при этом определит, какой именно язык используется на компьютере. В графическом режиме обычно предоставляется выбор языка системы. Если пользователь выбрал русский язык, то для уточнения клавиатуры можно будет выбрать
какую-либо из разных русских раскладок. Окно выбора языка и раскладки клавиатуры показано на рис. 2.1.

Рис. 2.1. Ubuntu: выбор языка и раскладки клавиатуры

2.3. Разбивка диска
При установке серверной версии Ubuntu шестым шагом идет разбивка диска. Программы установки могут поддерживать три варианта использования дискового
пространства для размещения ОС:

Tlgm: @it_boooks

Установка и начальная настройка Linux

31

 Использовать весь диск — все существующие разделы будут уничтожены, а

значит, вся информация утрачена. Этот вариант удобен, если вы устанавливаете
единственную ОС на новый компьютер. Программа установки сама выберет,
сколько места и для чего отвести;
 Использовать свободное место — если на компьютере уже установлена ОС

и вы освобождали пустое пространство с помощью программы типа Paragon Hard
Disk Manager, то выбирайте этот пункт. Программа установки создаст диски для
Linux, исходя из свободного пространства на жестком диске;
 Указать разделы вручную — этот вариант дает возможность самостоятельно

выбрать параметры создаваемых дисков. Он наиболее сложен, но позволяет добиться нужного результата.
На рис. 2.2 показано окно программы установки Ubuntu серверной конфигурации,
где ОС предложила свои параметры разбиения диска.

Рис. 2.2. Ubuntu: ОС выбрала следующую конфигурацию дисков

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

Tlgm: @it_boooks

32

Глава 2

Если выбрать вариант Указать разделы вручную, вы сможете самостоятельно
создать разделы для Linux. В разд. 2.3.2 мы поговорим о том, какие разделы нужны
для работы Linux. В рассматриваемом же нами случае установка идет на пустой
диск виртуальной машины, поэтому на нем нет никаких разделов. Если же на вашем компьютере уже есть ОС, то на этом шаге вы можете подкорректировать диск,
выделить пустое место из существующего диска или разбить диск так, как вам необходимо.
В Linux диски нумеруются не так, как мы привыкли в Windows. Здесь нет дисков
А:, С: и т. д. Все диски имеют имена вида /dev/hdNX для дисков IDE и вида /dev/sdNX
для дисков SCSI. В обоих случаях буква N — это номер диска. Например, если
у вас два жестких диска типа IDE, то в системе они будут именоваться: /dev/hda и
/dev/hdb.
Что такое X в именовании диска? Это номер раздела. Каждый диск может быть разбит на разделы. Пользователи Windows любят создавать два раздела: C: и D:.
На первый устанавливается система, а на втором пользователь хранит данные.
При такой организации во время переустановки системы можно смело форматировать диск С:, не боясь потерять данные (хотя лучше все же проверить, не попало ли
что-то важное случайно на диск С:).
В Linux тоже могут быть разделы внутри одного диска. Например, первый раздел
на первом IDE-диске будет иметь имя /dev/hda1, второй — /dev/hda2 и т. д. Цифрой 1
именуется первичный раздел. Под цифрой 2 можно найти расширенный раздел. Логические разделы начинаются с цифры 5.
В выборе конфигурации дисков, показанном на рис. 2.2, есть интересный пункт —
Set up this disk as an LVM group, который позволяет создать диск в виде группы
LVM (Logical Volume Management, логическое управление диском). Работа логической группы чем-то похожа на облачные технологии, при использовании которых
вы можете получать ресурсы по требованию, увеличивать мощности при увеличении трафика и сокращать их, если нет надобности платить за лишнее. Точно так же
и с дисковым пространством — можно создать логическую группу, которая будет
объединять разные диски в одно целое. Самое интересное, что при выборе этой опции можно выбрать для нее шифрование и пароль.

2.3.1. Файловые системы
Теперь поговорим о файловых системах, с которыми работает Linux. От файловой
системы зависит качество хранения информации на жестком диске. Linux поддерживает множество систем, в том числе и используемые Windows файловые системы FAT, FAT32 и NTFS, но при установке ОС Linux желательно выбрать родную
ей систему: Ext2, Ext3, Ext41 или ReiserFS (это название часто сокращают до
Reiser). Система ReiserFS является диковиной, потому что используется нечасто,
1

Сокращение Ext в названии файловых систем расшифровывается как Extended File System (расширенная файловая система).

Tlgm: @it_boooks

Установка и начальная настройка Linux

33

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

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

кэшированием, после чего проверяется целостность данных и, если данные записаны верно, кэш очищается. В противном случае ОС при запуске с помощью
созданного журнала быстро найдет проблемные места и с минимальными потерями времени восстановит работоспособность диска.
У файловой системы ReiserFS есть и еще одно преимущество. Данные на жесткий диск всегда записываются блочно. Допустим, что блок занимает 1 Кбайт.
Если записать файл размером 100 байтов, то блок будет им занят, но в нем останется 90% пустого пространства, в которое уже ничего нельзя записать. Таким
образом, из-за столь нерационально используемого дискового пространства (так
называемой утечки памяти) на жестком диске будет храниться немного меньше
информации, чем вы ожидали. Файловая система RaiserFS позволяет заполнять
блоки более полно.
Утечку наглядно можно увидеть, если в ОС Windows открыть окно File Properties
(Свойства файла), показанное на рис. 2.3. Обратите внимание, что в окне есть два
параметра Size (Размер) и Size on disk (Размер на диске). Величина файла
4,95 Кбайт, а на диске он занимает целых 8 Кбайт. Арифметика простая — понятно, что один кластер на диске равен 4 килобайтам. Размер файла больше этого значения, поэтому ОС пришлось выделить два кластера, и второй заполнен
менее чем на 25%. Остальное дисковое пространство пропало и не может использоваться, по крайней мере, пока файл не будет стерт.
Если на диск поместить 1000 файлов по 100 байтов при размере блока 4 Кбайт,
то каждый из них будет записан в свой блок. При этом на диске будет израсходовано 4 Мбайт вместо положенных 100 Кбайт. Потери пространства составят
97,5%.
Файловая система ReiserFS позволяет записывать в один блок несколько файлов,
если их размер менее 100 байтов. Таким образом, на диске будет меньше дыр и
утечки памяти.

Tlgm: @it_boooks

34

Глава 2

Рис. 2.3. Windows: окно свойств файла

 Файловая система Ext3 также принадлежит к новому поколению журналируе-

мых систем и работает аналогично ReiserFS. До появления Ext4 она являлась
системой по умолчанию в большинстве современных дистрибутивов Linux.
Трудно сравнить по производительности ReiserFS и Ext3, но с точки зрения надежности советую использовать последнюю. Разные специалисты придерживаются различных мнений, но я думаю, что стоит согласиться с мнением разработчиков и выбрать Ext3 или ее логическое продолжение Ext4.
 Четвертое пришествие Extended File System (Ext4) принесло возможность созда-

вать диски размером в 1 эксбибайт (2 в 60-й степени) при размере блока в 4 килобайта. Но более интересным, на мой взгляд, является механизм, который позволяет заранее выделить место под файл и дописывать новые данные в конец
уже существующего. Таким образом уменьшается фрагментация данных и повышается производительность файловой системы.
Файловая система Ext4, как уже было отмечено, построена на базе своего предшественника Ext3 и не принесла никаких революционных новшеств, а только
улучшение и увеличение показателей предшественницы. Но и этого оказалось
достаточно, чтобы Ext4 начали применять по умолчанию в большом количестве
дистрибутивов. Мне кажется, это сейчас самая популярная файловая система.

Tlgm: @it_boooks

Установка и начальная настройка Linux

35

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

Описание

/

Основной раздел. Если в Windows при указании пути к файлу сначала указывается имя диска, а потом папки внутри него, то здесь началом является слэш

/bin

Основные исполняемые файлы системы

/boot

Файлы, необходимые для загрузки системы

/dev

Представления для подключенных устройств

/etc

Конфигурационные системные файлы

/home

Пользовательские папки и файлы

/lib

Библиотеки ядра ОС

/opt

Дополнительные программные пакеты

/proc

Раздел для монтирования виртуальной файловой системы

/sbin

Исполняемые файлы главного пользователя (root)

/tmp

Временные файлы

/usr

Системные файлы

/var

Журналы, буферные или заблокированные файлы

Swap

Раздел подкачки

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

Tlgm: @it_boooks

36

Глава 2

Создание раздела Swap при установке системы в последних дистрибутивах Linux
может и не быть предусмотрено, кроме того, вместо раздела подкачки может создаваться файл подкачки. Но если раздел Swap создать можно и вы хотите создать его
вручную, то он должен иметь размер не меньше объема доступной оперативной
памяти. Сейчас жесткие диски относительно дешевые, и я советую сделать раздел
Swap размером в три раза больше, чем установленный на компьютере объем ОЗУ,
потому что оперативной памяти может в ряде случаев не хватать, и, чтобы не иметь
проблем с разделом подкачки, лучше заранее иметь достаточный запас.
На первый взгляд все это сложно, особенно если вы до этого работали только
с Windows. Возможность создания многочисленных папок ОС в виде отдельных
разделов является действительно мощной возможностью. Двух разделов достаточно, когда у вас только один жесткий диск и компьютер используется в качестве
домашней системы. Если вы используете два винчестера, то лучше создать три раздела:
 / — на первом диске для всех системных файлов;
 Swap — на первом диске. Он будет использоваться при нехватке оперативной

памяти (современные дистрибутивы могут не требовать этого раздела);
 /home — на втором диске для хранения пользовательских файлов.

Диски желательно подключить к разным контроллерам (подсоединить на различные шлейфы), что позволит системе работать с устройствами практически параллельно. Это может значительно повысить производительность ОС, потому что
Linux сможет работать и с системными, и с пользовательскими файлами одновременно.
Если вы настраиваете сервер, то на отдельные (физические) жесткие диски имеет
смысл вынести папки файлов (раздел /home) и раздел /var. Логические диски/разделы в этом случае не дадут желаемого результата. Если же разделы /var и /home
вынесены на отдельные диски, то для корневого каталога будет достаточно 3 Гбайт,
но можно сделать его и больше.
На разделе /var тоже лучше не экономить и выделить ему 10 Гбайт. Здесь будут
храниться файлы журналов, WWW- и FTP-файлы, которые быстро увеличиваются,
и если они заполнят все доступное пространство, то система может выйти из строя
или просто станет недоступной. Именно на это иногда рассчитывают хакеры, когда
организуют атаку «Отказ от обслуживания» (DoS). К этому вопросу мы еще не раз
вернемся. Некоторые специалисты по безопасности рекомендуют располагать этот
раздел на самом большом диске (чаще всего там же содержится и раздел /home), но
это ударит по производительности. Когда журналы находятся на отдельном диске,
то это позволяет выполнять запись в них параллельно с обслуживанием остальных
разделов. Это значит, что пользователь работает со своими файлами в разделе /home
на одном жестком диске, а другой винчестер в это время сохраняет всю информацию об активности пользователя. Если обе папки будут на одном диске, то запись
не сможет быть параллельной.

Tlgm: @it_boooks

Установка и начальная настройка Linux

37

Ориентируйтесь на свои технические средства. При необходимости разделы /var и
/home действительно можно разместить на одном, но самом большом жестком диске. Только вот под раздел /home нужно отдавать все оставшееся пространство, потому что здесь пользователи будут хранить свои данные (которые достигают значительного объема!), и если пожадничать, то пользователи скоро начнут возмущаться по поводу нереальности сохранения на сервере результатов очередной
игры. Если есть такая возможность, то выделите каждому из разделов максимально
большой диск и забудьте про проблемы (ну хотя бы на время).
Для нашей тестовой системы можно выбрать простейший вариант с двумя разделами (корневой и подкачки) и продолжить установку.
Надо также иметь в виду, что большинство пользователей работают с Linux в виртуальных машинах и создают только один виртуальный диск, — естественно, что
в таком случае все только что сказанное про оптимизацию за счет разделения дискового пространства на разделы теряет смысл...
Итак, если вы создали новые разделы, то, вероятно, следующим этапом автоматически запустится процедура форматирования этих разделов. Если же установка
идет на существующие разделы, где уже могла стоять Linux, то программа установки запросит у вас необходимость их форматирования.

2.4. Выбор пакетов для установки
Выбор пакетов — весьма интересный момент, и именно здесь обычно допускают
первую и самую страшную ошибку начинающие пользователи Linux — указывают
все, что знают, и тем более что не знают (на всякий случай). Да, название и назначение многих пакетов непонятны и незнакомы большей части пользователей, поэтому начинающие не могут четко определить список того, что им нужно. Но это
не значит, что надо устанавливать все подряд.
Когда я только начинал свой путь в ИТ, то тоже ставил все в максимальной комплектации, поскольку боялся, что что-то необходимое не будет установлено. В наше время установка отсутствующих приложений или компонентов системы стала
настолько простой, что уже не стоит ничего бояться.
В этом отношении мне понравилась установка последней версии Ubuntu Server —
она не спрашивала о том, какие пакеты нужны, она просто поставила у меня минимальный набор ОС и перезагрузилась. Установка прошла невероятно быстро, а теперь я могу добавить необходимые пакеты сам, а это очень просто, и мы будем делать это много раз. К тому же если попытаться выполнить команду неустановленного сервиса, то система подскажет, как можно его установить.
У хостеров тоже есть дурная привычка ставить все. Я покупал выделенный хостинг
у двух разных компаний, и обе поставили мне образы Linux с большим количеством сервисов, которые мне не были нужны. Да и не только мне — в их число входили сервисы, которые веб-серверам не нужны вовсе.
Любой дистрибутив Linux включает в себя невероятное множество программ, особенно серверных. Тут и веб-сервер, и FTP, и многое другое. Установив их все, мы

Tlgm: @it_boooks

38

Глава 2

делаем свой компьютер «проходным двором». А если все это активизируется при
старте системы, то загрузка компьютера замедлится: в ОС будет открыто множество портов, и заработают разнообразные сервисы, в которых мы пока еще даже не
разбирались. А ведь нет идеальных программ — везде существуют ошибки, которые регулярно обнаруживаются и исправляются. И если хотя бы в одном демоне1
найдется погрешность, то какой-нибудь хакер сможет проникнуть в вашу систему.
Доустановить нужные компоненты после завершения установки ОС стало настолько просто, что я не вижу смысла пытаться ставить сразу все, — добавить недостающие компоненты можно будет в любой момент.
Сразу после выбора серверных компонентов, которые действительно необходимы,
программа установки может спросить пароль по умолчанию. Я все не проверял, но
знаю, что Ubuntu предлагает установить пароль администратора для MySQL — популярной базы данных уже во время установки. Раньше все компоненты ставились
с паролями по умолчанию или вообще без паролей, что тоже не является безопасным.
Старые установщики Linux не предоставляли возможности выбора того, что будет
запускаться при старте системы, а банально запускали все сервисы, предполагая,
что если мы что-то ставим, то это обязательно нужно запустить. Но в большинстве
случаев это не так, потому что мы часто устанавливаем что-то на будущее. Большинство современных дистрибутивов, которые я видел (хотя я видел их не так и
много, если учесть, сколько всего доступно), уже предоставляют возможность выбора или не запускают все установленное по умолчанию, и это правильно. Если вы
все же решили установить что-то не очень нужное, то стоит обдумать возможность
хотя бы запретить его автозапуск.
Вообще, после установки ОС следует проверить, что установлено в автозапуске.
Если вы установили что-то на будущее, но не будете сразу же это использовать, то
стоит сразу по завершении установки проверить, что запускается автоматом, и отключить запуск ненужного.
В целях упрощения дистрибутивов для домашних пользователей программы установки предоставляют предопределенные варианты установки. Они могут иметь такие
или схожие названия:
 Быстрая — использовать определенную производителем конфигурацию. Так

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

для разработки приложений, компиляции ядра ОС Linux и т. д.;
 Офис — установить типовые пакеты плюс офисные приложения;
 Клиент — включить в устанавливаемую версию ОС только клиентские про-

граммы;
1

Демон — серверная программа, которая обрабатывает запросы клиента.

Tlgm: @it_boooks

Установка и начальная настройка Linux

39

 Сервер — установить только серверные программы для выполнения определен-

ной роли в вашей сети;
 Выборочная — самостоятельно выбрать требуемые компоненты. Это наиболее

предпочтительный вариант для серверов и компьютеров, которые будут подключены к сети;
 Обновление существующей версии — сохранить многие установки системы,

что позволит потратить меньше времени на повторную настройку. Разумеется,
такой вариант может появиться в выборе, только если ОС Linux уже установлена.
Названия этих пунктов и их количество зависят от дистрибутива и могут очень
сильно различаться в каждой версии. Последний пользовательский дистрибутив
Ubuntu вообще ничего у меня не спросил, а сразу начал ставить заранее предопределенный разработчиками список программ.
В этот же момент иногда предлагается выбрать графическую оболочку: KDE,
GNOME или другую, если дистрибутив включает более одной графической оболочки.
Пока идет установка, поговорим еще немного об этом процессе. Допустим, что
в вашей сети должны работать три сервера: веб-, FTP- и сервер новостей. Все эти
функции может выполнять один компьютер, но безопасность в этом случае будет
далека от идеала. Я всегда разношу задачи по разным виртуальным компьютерам.
Содержать несколько физических серверов может оказаться весьма накладным для
домашнего пользователя, но для компаний дополнительные 30 долларов в месяц не
станут слишком большой проблемой. Я последние годы работал над высоконагруженными сайтами, и у нас использовалось не так уж и много физических серверов,
но очень много виртуальных. Например, такой сервис, как SFTP1, работает на отдельной виртуальной машине, где только он и установлен. Ему не нужно много
вычислительных ресурсов, а дисковое пространство стоит не сильно дорого.
Серверы сборки сайта, сервер обновления веб-сайтов, тестовые окружения и
т. д. — каждый из них работает в своем собственном виртуальном сервере. Каждый
из них изолирован, и если хакер все же проникнет на один из серверов, то дальше
этого сервиса пройти он не должен.
Каждый запущенный демон — это потенциальная дыра в безопасности. Допустим,
что ошибка найдена в сервере Apache. В последнее время это происходит довольно
редко, потому что его код уже очень хорошо отлажен, но представим себе эту ситуацию. Ошибка может быть не в самом сервере Apache, а в обслуживаемом им
веб-сайте или в интерпретаторе PHP/Perl. В любом случае хакер может воспользоваться этой брешью, с легкостью получить доступ к находящемуся на том же компьютере FTP-серверу и скачать все секретные данные.

1

SFTP (SSH File Transfer Protocol или Secure File Transfer Protocol) — безопасный протокол передачи
файлов.

Tlgm: @it_boooks

40

Глава 2

Если же на взломанном компьютере работает только веб-сервер, то доступ через
FTP к конфиденциальным данным хакер получить не сможет. Доступно будет
только то, что находится на веб-сервере, а я надеюсь, что там ничего конфиденциального не окажется. Максимум, что сможет сделать хакер, — дефейс (замена
главной страницы) или уничтожение сайта. Впрочем, хакер в ряде случаев может
получить доступ к базе данных, но это отдельная история.
Пример с веб-сервером не вполне нагляден, потому что этот сервис умеет делать
многое. Если хакер получит возможность закачивать свои файлы на сервер, то он
сможет загрузить для себя туда Web-shell1 и выполнять команды и закачивать/скачивать оттуда через сеть.
Чтобы злоумышленник не смог, взломав один компьютер, проникнуть на другой,
вы должны задавать для каждого из них разные пароли. Некоторые администраторы ленятся запоминать много сложных комбинаций, поэтому придумывают только
один пароль и потом устанавливают его везде, где только можно. О паролях мы
поговорим в разд. 2.6 и главе 3, но уже сейчас вы должны знать, что для каждой
системы должен быть свой код доступа, а пароли сетевых сервисов должны быть
максимально сложными.
Но не только демоны являются потенциальной проблемой. В состав Linux многие
программы включаются в исходных кодах и должны компилироваться в машинные
перед выполнением. Программы, использующие уязвимости Linux-систем, также
часто поставляются в исходниках. В самой же ОС Linux очень редко используются
инсталляторы программ, поэтому все настройки производятся во время компиляции исходного кода с помощью библиотек разработчика и компилятора gcc. Для
того чтобы ими воспользоваться, злоумышленник закачивает модуль в исходниках
на сервер, компилирует его и выполняет программу. Чтобы компиляция стала невозможной, я рекомендую не устанавливать библиотеки разработчика и компилятор gcc. Если надо, все можно загрузить уже в скомпилированном виде. Это
мелочь, но из мелочей строится вся наша жизнь.
И если gcc окажется взломщику недоступен, то у него возникнут проблемы с выполнением зловредного кода. Его ему нужно будет скомпилировать заранее под
процессор и ОС вашего сервера, и только потом закачать для выполнения. Не каждый хакер сможет это сделать, потому что большинство их — это скрипт-кидди2,
которые сидят в Windows.
В последнее время все большую популярность набирают программы на языке
Python. На нем пишут веб-сайты, скрипты автоматизации, а также и скрипты для
автоматизации взлома или эксплуатации уязвимостей. Однако из-за высокой популярности Python отказаться от его установки не всегда представляется возможным.
1

Web-shell — это небольшая программка, которую хакер заливает на взломанный веб-сервер, чтобы
иметь возможность его удаленно изучать и администрировать.
2
Скрипт-кидди (от англ. Script kiddie, скриптовые детки) — в хакерской культуре унизительный термин, используемый для описания тех, кто пользуется для атаки компьютерных систем и сетей скриптами или программами, разработанными другими, не понимая механизма их действия.

Tlgm: @it_boooks

Установка и начальная настройка Linux

41

2.5. Завершение установки
В Linux существует множество загрузчиков, а самым популярным сейчас является
GRUB2 (GRand Unified Bootloader, большой объединенный загрузчик, версия 2).
В последней версии Ubuntu для меня автоматически был создан отдельный раздел,
на который GRUB2 и был записан.
При наличии в компьютере сетевой карты вы увидите окно для ее выбора. Если
нужного для нее драйвера в списке не окажется, то можно оставить значение none.
Это не значит, что сетевая карта не станет работать, просто будет использоваться
универсальный драйвер. Некоторые дистрибутивы этот шаг пропускают, потому
что Plug&Play позволяет достаточно точно определить тип карты и выбрать драйвер наилучший из доступных.
Теперь поговорим о настройке сети. Если в вашей сети используется единственный
DHCP-сервер, то можно оставить все по умолчанию. Если же в сети несколько серверов или есть необходимость расставить адреса вручную, то уберите галочку
в пункте Настроить с помощью DHCP.
Если вы не знаете, как работает протокол TCP/IP, то в качестве адреса для примера
можете указать 192.168.1.1. Перейдите в поле Шлюз, и все остальные параметры
будут заполнены автоматически. В поле Маска должно быть указано значение
255.255.255.0. В разд. 3.6 мы поговорим о настройке сети, и вы узнаете, как можно
изменить параметры подключения. В поле Имя хоста укажите имя, которое вы
хотите задать своему компьютеру. Этой информации хватит для начальной настройки.

2.6. Пароль
Последнее, что нам нужно указать, — это имя компьютера, под которым он будет
появляться в сети, и пароль администратора системы (root). В Linux нельзя входить
без пароля, подобно тому как это было возможно в Windows 9х. Вы обязательно
должны указать имя пользователя, под которым будете работать, и его пароль,
и в зависимости от ваших прав вам будет предоставляться доступ к определенным
разделам и функциям ОС. Окно установки имени сервера и пароля в Ubuntu 20.04
показано на рис. 2.4.
В дистрибутиве может иметься возможность выбрать учетную запись, под которой
будет осуществляться автоматический вход в систему при загрузке компьютера.
В погоне за простотой кто-то придумал такую фишку, чтобы Linux была похожа на
Windows 95 или Windows XP Home, и пользователь не думал о пароле, но я бы не
советовал пользоваться этой возможностью. Не ленитесь вводить пароли!
У меня даже на моих личных домашних компьютерах установлен пароль. Он относительно простой, его все в доме знают, но он есть.
Программа установки моего дистрибутива Linux проверяет только длину пароля,
и для администратора эта величина должна быть не менее шести символов. По-

Tlgm: @it_boooks

42

Глава 2

Рис. 2.4. Ubuntu: установка пароля и имени сервера

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

Tlgm: @it_boooks

Установка и начальная настройка Linux

43

ных допустимых символов (например, дефиса или подчеркивания). Длина пароля
должна быть не менее 8 символов, а лучше — более 12. Тогда для подбора хакеру
потребуется очень много времени.
Так вот я, когда нужно сгенерировать пароль, запускаю какой-нибудь текстовый
редактор и случайным образом набираю на клавиатуре любые символы в разном
регистре. Как теперь запомнить такую комбинацию? Лучше потратить пару дней на
усвоение сложного пароля или хотя бы хранить его в каком-нибудь защищенном
хранилище.
Если не хочется запоминать что-то сверхсложное, то можно применить метод попроще, хотя и надежность полученного шифра будет ниже. Рассмотрим очень интересный способ генерации случайных паролей. Допустим, вы хотите использовать
слово generation. А что, оно достаточно длинное, но простое и может быть легко
взломано по словарю. Как усложнить пароль? Посмотрите на клавиатуру и набирайте вместо букв слова generation символы, находящиеся немного выше их. Например, прямо над g находится t, а над e — 3 и т. д. В результате получится пароль
t3h34q589h. Такой пароль запоминается легко, а по словарю подобрать его сложнее.
Вместо верхних можно взять буквы, находящиеся справа, и тогда пароль
generation превратится в hrmrtsypm. Тоже нелегкая задача для хакера.
А если еще набрать некоторые из этих букв в верхнем регистре, то пароль сразу
очень существенно усложнится. Например, вы можете установить в верхнем регистре третью и восьмую буквы и получить hrMrtsyPm.
На работе я примерно так и поступаю, только беру пару слов на русском и набираю
их в английской раскладке, добавляя как минимум один символ и как минимум две
цифры. Например, djn1’nj2-gfhjkm. Здесь на самом деле написано: вот1это2-пароль.
Конечно же, это только пример. В реальности я беру слова посложнее и длиннее.
Вот такими простыми способами можно соорудить легко запоминаемые, но сложные для подбора пароли. Конечно, эти пароли не сравнить с реально случайным
образом сгенерированным «мусором», но все же они достаточно сложны для взлома и в то же время запоминаемы их автором.
Помимо пароля администратора, вам может быть предложено завести новую учетную запись (добавить пользователя), под которой вы будете в дальнейшем работать
с системой. Конечно же, можно использовать и root, но это не рекомендуется. Даже
администраторы должны входить в систему как простые пользователи и только при
крайней надобности переключаться на учетную запись root, чтобы выполнить административную задачу.
В последней версии CentOS до сих пор программа установки просит пароль для
пользователя root и можно (даже желательно) создать еще одного пользователя.
В Ubuntu Server нужно создать только своего пользователя, а root будет отключен.
И это правильно.
Операционной системе можно разрешить автоматически входить в систему при
старте компьютера под вашей учетной записью простого пользователя. Если кто-то
получит физический доступ к компьютеру, то он сможет прочитать ваши личные

Tlgm: @it_boooks

44

Глава 2

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

Рис. 2.5. Ubuntu: идет установка системы

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

Tlgm: @it_boooks

Установка и начальная настройка Linux

45

Загрузчик системы может скрывать процесс старта, но где-то под графической оболочкой обязательно скрывается запуск сервисов. В старых десктопных или серверных дистрибутивах этот процесс может отображаться в виде текстовых строк, бегущих по экрану.
ОС Linux — система многопользовательская. Это значит, что с ней могут работать
несколько человек. Система должна знать, с кем она сейчас работает, поэтому после загрузки ОС вам предложат представиться, указав имя пользователя и пароль.
Первый параметр позволяет идентифицировать вас, а второй — обезопасить от нежелательного использования вашего имени другим пользователем. Идентификация
пользователя в текстовом режиме выглядит как строка с приглашением ввести имя:
localhost login:
Здесь слово localhost присутствует не случайно — оно указывает на то, что вход
осуществляется на текущем компьютере. Из терминала Linux можно входить и на
удаленные системы (например, с помощью SSH), и тогда в приглашении будет
присутствовать имя компьютера, на котором вам предлагают авторизоваться.
После ввода имени пользователя вы должны указать пароль, чтобы ОС смогла определить, что вы являетесь тем, за кого себя выдаете. Если вы выбрали во время
загрузки графический режим и правильно настроили видеокарту, то перед вами
появится графическое приглашение входа в систему. Современные дистрибутивы
устанавливают графический вход по умолчанию, поэтому текстовое приглашение
можно увидеть либо при неправильной настройке видеокарты (я с таким давно не
сталкивался), либо при установке серверной версии Linux без установки графических оболочек.
При подготовке этой книги я устанавливал последнюю версию Ubuntu Server, чтобы освежить в памяти этот процесс, потому что он меняется почти в каждой версии. Но с точки зрения входа в систему тут ничего не изменилось, потому что графическая оболочка с серверной версией не устанавливается. И я не вижу причин
ставить ее.
Прежде чем вводить имя, осмотритесь. Возможно, где-то есть какие-то кнопки или
меню. Например, у Mandriva 2008 внизу есть кнопочка Тип сеанса, нажатие которой позволяет сменить графическую оболочку, а оболочек для Linux несколько.
Самые распространенные из них — это GNOME и KDE. Наиболее популярный дистрибутив Ubuntu устанавливает только GNOME. Если вы предпочитаете KDE, то
следует устанавливать дистрибутив Kubuntu, который выпускается тем же производителем, а именно — Canonical Ltd.
Но под какой учетной записью работать? Во время установки вы могли задать пароль системного администратора (root) и добавили пользователя. В последней версии Ubuntu вы задаете только пароль для своего пользователя, так что у вас и выбор
лишь один — работать от имени созданного во время установки пользователя. Но
даже если вы задали пароль для пользователя root, по умолчанию уже запрещено
входить под именем root в графическом режиме. Да, это ограничение можно обойти, и возможно, что обход будет доступен и в будущем. Однако если раньше нас

Tlgm: @it_boooks

46

Глава 2

только предупреждали об опасности работы под root, то теперь прямо запрещают
вход.
Работа под учетной записью root может облегчить взлом компьютера через простые
на первый взгляд приложения и способствует вирусным эпидемиям. До сих пор
в UNIX-подобных системах почти не было вирусных эпидемий как раз из-за того,
что пользователи системы не обладают полными правами. Все программы, которые
запускаются пользователями, обладают только теми правами, которые есть у самого пользователя. И чем меньше у вас прав, тем лучше, как бы странно это ни звучало.
Вирусы не могут прописываться в системные файлы, потому что для этого выполняемой программе нужны повышенные привилегии, которые могут быть достигнуты, только если пользователь введет пароль администратора при запуске программы.
Допустим, что вы путешествуете по веб-сайтам. Запущенный вами браузер автоматически имеет те же права, что и вы. И если в нем найдется уязвимость, позволяющая получить доступ к жесткому диску, то злоумышленник сможет воспользоваться этой лазейкой и, например, стереть на нем всю информацию.
Если же работать под пользовательской учетной записью, то уничтожить он сможет только те файлы, которые доступны этому пользователю. Системные файлы
в таком случае будут в безопасности. При необходимости повышения прав вы всегда можете это сделать, зная пароль администратора. Для этого служит команда su,
а в качестве параметра (указывается через пробел после команды) передается имя
пользователя, статус которого вы хотите обрести.
Чтобы получить права администратора, наберите команду:
su root

или
su –

Вторая команда тоже позволяет приобрести права root, хотя вместо имени указан
дефис. В ответ на это система запросит пароль. Введите данные пользователя, права которого вы хотите получить, и после этого вы сможете выполнять команды,
доступные этой учетной записи. Например, получив статус администратора, вы
приобретете все права на систему.
П РИМЕЧАНИЕ
Необходимо заметить, что некоторые команды, которые будут описываться в книге,
могут оказаться недоступными от имени простого пользователя. Так как мы рассматриваем настройки системы, то некоторые действия могут оказаться опасными, поэтому
доступны они только администратору. Если при попытке выполнить что-либо произошла ошибка — например, получено сообщение Команда не найдена, попробуйте
переключиться на root, и, скорее всего, это поможет. Исключением может быть наличие у вас экзотической версии Linux или если вы не установили вызываемую программу.

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

Tlgm: @it_boooks

Установка и начальная настройка Linux

47

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

Эта команда позволяет выполнить указанную команду с правами администратора.
Например, выполнение следующей команды завершится сообщением об ошибке
Permission denied (Недостаточно прав доступа):
cat /etc/shadow

Но если выполнить команду:
sudo cat /etc/shadow

то система спросит пароль администратора и после этого выполнит команду.
Именно такой режим более предпочтителен, несмотря на то что, если выполнить
эту же команду еще раз, система уже не будет спрашивать пароль. Даже если вы
попробуете выполнить другую команду, используя sudo, пароль спрашиваться не
будет какое-то время.
Отличие команды sudo от команды su в том, что с ее помощью вы не открыли постоянную интерактивную сессию, в которой можете отправлять множество команд
от имени администратора и видеть результат.
Безопасна ли sudo? В принципе да. Проблема может возникнуть только в том случае, если кто-то физически воспользуется вашей клавиатурой для запуска команд
из-под вашей сессии или если в ОС найдется баг, который позволит злоумышленнику перехватить вашу сессию. Второе маловероятно, и, если такое произойдет,
обновлять систему все равно придется. Главное — это человеческий фактор. Не
оставляйте свой компьютер незаблокированным. Но даже в этом случае через некоторое время при попытке выполнить команду sudo придется вводить пароль администратора заново.
Как уже отмечалось, ОС Linux — многопользовательская система и поддерживает
несколько терминалов. По умолчанию вы входите в первый терминал. Для того
чтобы переключиться на другой, нужно нажать клавишу и одну из клавиш
–. В ответ на это перед вами появится чистый экран с приглашением ввести имя пользователя, которое может быть различным в каждом терминале.
Использование терминалов — очень удобная возможность. Например, в одном вы
запускаете программу, которая требует много времени для выполнения, после чего
переключаетесь на другой терминал и продолжаете работу с компьютером. В любой момент можно вернуться на первый терминал и посмотреть на ход исполнения
той программы.
При удаленной работе с сервером я часто открываю по три и более терминала и
в каждом из них открываю разные папки. В одном терминале это может быть папка
конфигурации веб-сервера, в другом — папка журналов ошибок, в третьем — «корень» моего сайта. Теперь с помощью двух клавиш + (где x — это цифра
от 1 до 6) можно быстро «перепрыгивать» с одной такой папки на другую.

Tlgm: @it_boooks

48

Глава 2

Прежде чем двигаться дальше и выполнять команды, нужно познакомиться с терминалом. Это командная строка, с помощью которой выполняется управление системой.
В серверных дистрибутивах нет графических оболочек (хотя их можно установить),
и там управление происходит только в командной строке. В домашних дистрибутивах
терминал открывается в виде окна с приглашением вводить команды.
В обоих случаях приглашение вводить команды выглядит следующим образом:
[root@Flenov:/etc]:
Что это значит? Сначала идет имя пользователя, под которым вы вошли в систему, — здесь это root. Нет, я реально не вошел под этим пользователем, я его просто
показал здесь в качестве примера. После знака @ следуют имя компьютера и пробел или двоеточие, за которым стоит имя текущей папки. Таким образом, вы всегда
знаете, где находитесь и где будут по умолчанию выполняться вводимые команды.
Зачем указывать в командной строке имя компьютера? — ведь мы знаем, за каким
компьютером сидим. Ответ на этот вопрос кроется в сетевых возможностях ОС. Вы
можете подключиться к удаленному компьютеру с помощью команды ssh, и тогда
ваша командная строка будет выглядеть совершенно идентично, но вместо локального имени компьютера вы увидите имя удаленного. То же самое я говорил немного hfytt в отношении авторизации.
Например, если я из программы терминала выполню команду:
ssh flenov@mywebsite.com

то откроется сессия с удаленной виртуальной машиной, на которой установлены
мои сайты, и я смогу управлять ими, выполняя команды в терминале. То есть,
выполняя команды в терминале на моем компьютере, я реально запускаю их на
сервере.
На рис. 2.6 показано, как я использую возможности открытия нескольких терминалов. Правда, делаю это здесь из macOS, терминал которого выглядит как окно
с вкладками.

Рис. 2.6. macOS: удаленная сессия ssh с виртуальной машиной Linux

Tlgm: @it_boooks

Установка и начальная настройка Linux

49

2.8. Мы в системе
Итак, мы вошли в систему, и ОС запускает для нас уникальное окружение, которое
определяется по имени пользователя. Среда включает пользовательские каталоги,
настройки и командную оболочку.
Пользовательские каталоги находятся в каталоге /home и по умолчанию имеют название, совпадающее с именем пользователя. Например, для пользователя root используется каталог /home/root. Если вы входите в систему под именем пользователя
michael, то вашим домашним каталогом будет /home/michael. В этом каталоге вы
можете хранить свои файлы. Домашний каталог пользователя root лучше не трогать.
Когда вы входите в систему, то текущим каталогом становится ваш домашний. Так,
для пользователя michael таковым станет /home/michael, и все команды будут выполняться в этом каталоге, пока вы не измените его.
В Linux существует несколько командных оболочек, и каждая из них наделена
своими возможностями. Чаще всего пользователи применяют оболочку под названием bash1 (находится она в каталоге /bin/bash). Мы будем рассматривать именно ее,
как наиболее популярную, и именно ее назначает пользователям Ubuntu. Другие
оболочки похожи, но немного отличаются возможностями. Для системных программ очень часто используется оболочка sh (находится в каталоге /bin/sh).
Когда я начинал осваивать Linux и установил ее в первый раз, то потом долго не мог
правильно выключить, потому что не знал, какая для этого используется команда.
Я взял у знакомого книгу по Linux, но в ней описание процесса выхода было где-то
в середине, и, пока я нашел нужную команду, пришлось месяц обходиться без корректного завершения работы ОС и просто выключать питание компьютера. Да, Интернета тогда не было (лихие 90-е), и нельзя было просто зайти в Google и попросить
его найти нужную команду.
В графическом интерфейсе выключить компьютер не проблема — там есть для этого меню, но если вы используете текстовый режим (напомню, вы настраиваете сервер), то без знания команды корректно выключить компьютер проблематично.
Итак, для выхода из системы служит команда shutdown. После нее указывается, что
именно нам нужно: –r (для перезагрузки) или –h (для выключения компьютера).
И в конце команды можно задать время, через которое должно начаться выполнение команды (в частности, now — сейчас).
Например, для немедленной перезагрузки системы наберите команду:
shutdown –r now

1

Название «bash» является акронимом от Bourne-again-shell («еще-одна-командная-оболочка-Борна»)
и представляет собой игру слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн, усовершенствованная Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся»,
отсюда: рожденная-вновь-командная оболочка.

Tlgm: @it_boooks

50

Глава 2

Для немедленного выключения компьютера следует ввести:
shutdown –h now

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

2.9. Подсказки
Некоторые операционные системы славятся своей простотой и хорошими подсказками. Но, как мы уже говорили, производительность, надежность и простота — не
всегда совместимые вещи. ОС Linux содержит множество команд, и у каждойиз
них большое количество параметров. Помнить их все невозможно, поэтому разработчики постарались и снабдили ОС обширной справкой.
Если вы хотите получить информацию о какой-либо команде или программе, то
попробуйте запустить ее с одним из ключей: -h, -help или -?. Разные программы
используют разные ключи, но один из этих, скорее всего, заставит вывести на экран
короткую подсказку по использованию программы.
Для получения более подробной информации нужно воспользоваться следующей
конструкцией:
man имя

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

Для выхода из программы помощи нужно нажать на клавиатуре клавиши
и . В ответ на это перед вами появится сообщение: Quit at end-of-file (press
RETURN). Нажмите клавишу , затем перейдите в конец просматриваемого
файла помощи, используя клавиши или , и программа man завершит работу.
Более простой способ завершения программы man — нажать клавишу . В этом
случае выход произойдет мгновенно.

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

Tlgm: @it_boooks

Установка и начальная настройка Linux

51

вы сможете построить действительно защищенную систему (сервер или даже сеть
из компьютеров и серверов).

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

целом, но и их составляющих. Например, если вам нужен веб-сервер, для этого
чаще всего устанавливается Apache. Эта программа включает в себя очень много
возможностей, среди которых поддержка интерпретируемых языков PHP и Perl,
но, как правило, программисты сайтов используют только один из них, поэтому
нет смысла разрешать оба. Если сайт проектируется с помощью PHP, то следует
удалить Perl, и наоборот;
 следует разрешать минимум необходимого. Многие администраторы не любят

заниматься какими-либо настройками, поэтому открывают полный доступ ко
всему, что только может пригодиться. Но слово «может» не совместимо
с безопасностью. Возможность, которую вы откроете пользователю, на самом
деле может ему не понадобиться, а вот злоумышленник благодаря лишней лазейке может натворить много бед. Например, на клиентских компьютерах часто
открывают какую-то папку для всеобщего доступа. Это мотивируется тем, что
пользователям может потребоваться обмен данными. А если нет?
Рассматривая конфигурирование ОС и ее сервисов, я буду часто напоминать об
этом правиле, и при разборе примеров мы будем отталкиваться именно от полного
запрета.

2.10.2. Настройки по умолчанию
Настройки по умолчанию предусмотрены только для обучения и, как правило, открывают возможности, которые не нужны, — чтобы вы оценили мощь программы
и могли приступить к работе сразу после ее установки. Это значит, что будет разрешено лишнее, что уже нарушает первый рассмотренный принцип. Даже если
установка по умолчанию не делает доступными все компоненты программы, чаще
всего настройки все равно оказываются небезопасными, потому что могут содержать опасные параметры или пароли по умолчанию.
Когда используется не так много команд и параметров, лучше заняться конфигурацией программы с чистого листа. Если процедура довольно сложная (ярким примером является sendmail), то проще всего отталкиваться от настроек по умолчанию,
добавляя, изменяя или удаляя ключи. Даже не пытайтесь в этом случае настраивать
систему с нуля. В процессе конфигурирования обязательно что-то забывается, и тем
самым повышается вероятность ошибки. Сложность конфигурационных файлов
в том, что они имеют текстовый формат, и все имена параметров нужно писать четко
и полностью. Если ошибиться хотя бы в одной букве, параметр станет восприниматься неверно и будет игнорироваться.

Tlgm: @it_boooks

52

Глава 2

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

2.10.3. Пароли по умолчанию
Многие сервисы во время установки прописывают пароли по умолчанию. Раньше
в ОС Linux эта проблема стояла очень даже серьезно, потому что установочные пакеты программ не общались с пользователем и не могли попросить его задать пароль. Если это программа, то пароль можно спросить при первом старте, потому
что тут возникнет хоть какой-то визуальный контакт с пользователем. А если это
сервис, который запускается системой и не имеет никакого способа запросить
у пользователя что-то ввести?
Например, база данных MySQL после установки использует для администратора
учетную запись без пароля и с именем root. Это имя может ввести в заблуждение,
но вы должны знать, что это имя (логин) никакого отношения к системной записи
root не имеет. Это внутренняя учетная запись базы данных, и пароли могут и должны быть разными. Сразу после установки MySQL необходимо сменить пароль доступа.
Конфигурированием обычно занимаются программисты, которые настраивают базы под себя и почему-то любят использовать пароли по умолчанию. Я сам программист, и при разработке баз данных тоже иногда так делаю в надежде, что за
паролями проследит администратор, а тот надеется на меня, и получается, что мы
оба не делаем важных изменений.
Пароли по умолчанию используются не только в программах и ОС, но и в сетевых
устройствах, таких как маршрутизаторы и управляемые коммутаторы. В эти устройства встроена система защиты и авторизации. Однако практически все они при
производстве снабжаются простыми именами и паролями — типа admin без пароля,
или имя и пароль в них устанавливаются одинаковыми.
В Интернете уже давно существуют списки паролей по умолчанию для различных
устройств, поэтому не забывайте их менять после установки оборудования.

2.10.4. Безопасность против производительности
Я уже говорил, что безопасность и производительность преследуют совершенно
разные цели, которые чаще всего конфликтуют между собой. Настраивая сервер на
максимальную безопасность, приходится включать такие сервисы, как журналирование и сетевые экраны, а они расходуют ресурсы процессора и занимают место на
диске. И чем больше дополнительных служб включено, тем больше лишних затрат.
Каждый сервис может быть настроен по-своему. Например, в режиме журналирования можно записывать в журналы только основную информацию, что позволит
уменьшить нагрузку, но увеличит вероятность того, что какая-то атака пройдет незамеченной.

Tlgm: @it_boooks

Установка и начальная настройка Linux

53

А можно сделать так, что в журнал будут попадать абсолютно все сообщения.
В этом случае повышается расход ресурсов и увеличивается поток информации,
в котором вы можете упустить важное. А у хакера появляется шанс удачно произвести атаку DoS, забив журнал мусором до пределов диска или съев все ресурсы
компьютера, заставив его только и делать, что писать в журнал. От переполнения
диска защититься можно, если реализовать цикличный журнал, но в этом случае
можно сделать возможной атаку, при которой хакер будет затирать данные журнала.
Различных вариантов нападения очень много, и защищающаяся сторона всегда
находится в немного более уязвимой позиции. Приходится выбирать золотую середину.
При конфигурировании сервера и его сервисов вы должны исходить из принципа
необходимой достаточности. Следует принимать все меры, чтобы сервер или компьютер чувствовали себя в безопасности, но при этом работали как можно производительнее. Чтобы убедиться в нормальном балансе этих параметров, после окончания конфигурирования необходимо заставить сервер работать при максимально
возможной загрузке (определяется планируемым количеством обрабатываемых запросов в минуту, умноженным на 2). Если сервер справится с поставленной задачей
и сможет обработать все запросы клиентов и при этом еще останется запас в производительности процессора, то можно вводить машину в эксплуатацию. Иначе необходимо изменять конфигурацию или наращивать мощность компьютера. У вас
всегда должен быть под рукой большой запас мощности, ибо иногда превышаются
даже самые пессимистические оценки нагрузки.
Мне приходится работать с сайтами e-commerce (сайтами интернет-магазинов) для
рынка США, и объемы трафика, который проходит перед Рождеством, пугающие.
Мне даже страшно представить, какие объемы трафика у социальных сетей или
у Google.

2.10.5. Внимательность
Одной из серьезнейших угроз для компьютерной системы является внимательность, а точнее, ее отсутствие. Как любят говорить, это человеческий фактор. Отсутствие внимательности присуще многим, и мне в том числе, и я, работая над книгой, регулярно что-то упускаю из виду и делаю ошибки. Конфигурация ОС Linux и
ее сервисов в этом отношении более чувствительна, особенно если для настройки
править непосредственно конфигурационные файлы. Одна маленькая ошибка может остаться незамеченной, но очень сильно повлиять на работу сервера.
Все серьезные изменения, которые мы проводим на серверах, следует делать только под присмотром другого человека. Программисты уже давно используют подход
Code Review (проверка кода другим человеком) — в случае с конфигурацией желательно делать то же самое.
Мне, как программисту, иногда приходится запускать SQL-команды на серверах,
чтобы изменить или обновить данные. Такое бывает нечасто, но все же случается.

Tlgm: @it_boooks

54

Глава 2

И в таких случаях я не доверяю своему опыту. Я пишу команды, которые нужно
выполнить, зову кого-нибудь из программистов, который будет стоять рядом и следить за отдаваемыми мной командами, и мы вдвоем выполняем все. Опыт — это
хорошо, но вот ошибку может совершить каждый.
Когда какой-либо сервер дал сбой и нужно конфигурировать его на ходу, то мы так
же работаем над конфигурированием по двое. В этом ничего страшного нет. Помощь никогда лишней не бывает, даже после 25-летнего стажа работы в ИТ.
Графические утилиты более безопасны, потому что каждое действие проверяется и
контролируется программой, чего не может сделать текстовая командная строка.
Графические программы могут быть удобнее и нагляднее (хотя и не всегда являются таковыми, потому что это зависит от их разработчика), но конфигурирование
файлов напрямую более эффективно, особенно при удаленной настройке, хотя, на
мой взгляд, при этом выше вероятность совершить ошибку.

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

2.12. Устройство Linux: ядро и модули
Я не буду здесь вдаваться в самые глубокие дебри устройства Linux, но о базовых
вещах мы поговорим, и я постараюсь затронуть лишь те вопросы, которые могут
вам пригодиться.
Сердце любой ОС — это ее ядро (Kernel). У Linux ядро расположено в каталоге
/boot и имеет имя файла vmlinuz-xxxx, где xxxx — номер версии. Версии именно ядра,
а не ОС. Если на последней Ubuntu 20.04 выполнить команду:
ls /boot

то она покажет содержимое этой папки, и среди ее файлов вы должны увидеть файл
vmlinuz-5.4.0-21-generic (как я уже отмечал ранее, новый дистрибутив включает в себя
ядро 5.4). Возможно, к тому моменту, как вы читаете эту книгу, вышло уже новое

Tlgm: @it_boooks

Установка и начальная настройка Linux

55

ядро и после установки оно обновилось на более свежее, но ниже 5.4 оно уж точно
не должно быть.
В каталоге /boot может находиться более одного файла ядра, и какой именно загружать из них при старте системы, определяется конфигурацией загрузчика.
Современные версии ядра Linux имеют модульную архитектуру. В упомянутом ранее файле ядра находится только необходимый функционал. Он является самым
важным, потому что если в ядре есть ошибки или какие-то проблемы совместимости, то проблемы будут у всей системы.
Модули ядра Linux позволяют легко добавлять необходимый системе функционал,
они имеют расширение ko и расположены в каталоге /lib/modules/xxxx, где xxxx —
также номер версии ядра. Если ядро Linux занимает всего несколько мегабайт, то
модулей сейчас устанавливается более 100 мегабайт. И далеко не все они загружаются автоматически при старте системы.
Почему так много модулей ядра? Большинство этих файлов представляют собой
драйверы различных устройств — и такое количество модулей позволяет Linux
поддерживать огромное количество различного оборудования прямо «из коробки».
В зависимости от установленного оборудования, может загружаться тот или иной
модуль, так что очень часто вам и не приходится искать драйвер в Интернете.
Для добавления в систему новых возможностей ее вовсе не требуется перегружать
полностью, достаточно только загрузить нужный модуль. Это и происходит, когда
вы подключаете какое-то новое устройство, например по USB.
С точки зрения безопасности и, возможно, даже производительности, ядро на сервере можно перекомпилировать и включить в него все необходимые модули. После
этого динамическую загрузку модулей следует отключить, потому что к серверам
не так часто подключают устройства по USB, да и оборудование меняют не столь
часто, чтобы понадобилась загрузка модулей.
Но даже если вы работаете не с серверной системой, лучше перекомпилировать
ядро и включить в него только необходимые вам модули. Производители дистрибутивов не делают этого, потому что опытный пользователь сможет сделать подобное сам, а включать в ядро вообще все модули не имеет смысла, потому что сложнее будет его обновлять; кроме того, возможно, при этом придется загружать в память лишние модули, которые на самом деле не нужны.
При монолитном ядре, когда все скомпилировано в один файл, обновлять его
в общем-то не так уж и сложно — просто требуется выполнение некоторых лишних
действий, не стоящих того, чтобы делать их на домашних системах, поэтому домашние Linux-компьютеры оставляют с модульной архитектурой. Есть проекты,
которые упрощают обновление, например Dinamic Kernel Module Support, позволяющий динамически перекомпилировать ядро при установке новой версии. Так
что количество лишних действий действительно очень мало.

Tlgm: @it_boooks

56

Глава 2

2.13. Установка дополнительных пакетов
в Ubuntu
Давным-давно, когда только-только развалился Советский Союз и сахар давали по
талонам, программы в Linux устанавливались с помощью их компилирования из
исходников. Это давало возможность ОС работать на разном «железе», а UNIXсистемы, к которым относится и Linux, тогда приходилось ставить не только на
процессоры от Intel, но и на процессоры IBM или Sun, которые не были совместимы с инструкциями Intel. В те времена имело смысл распространять программы
в исходных кодах на языке C и из этого исходного кода собирать программы под
разные платформы.
И даже компилируя систему под процессор от Intel, можно добиться максимальной
производительности, если компилировать ее под определенную его версию. Два
Intel-процессора разных поколений могут поддерживать разные инструкции. Если
скомпилировать систему под старый процессор, то программа будет работать на
большем количестве «железа». А если скомпилировать под более новый, то может
работать быстрее. Так что у распространения программ в исходных кодах есть свой
плюс.
Все меньше разнообразия и все больше пользователей компьютеров в мире. В такой ситуации не имеет смысла заставлять пользователей компилировать программы из исходных кодов, и разработчики Red Hat решили создать более простой метод установки — RPM. Это программа и формат файла в одном флаконе, которая
устанавливает уже заранее откомпилированные приложения. Такие пакеты достаточно легко найти в Интернете или в специальных репозиториях производителей
дистрибутивов.
Разработчики Debian (на нем основана Ubuntu) пошли другим путем. Они решили
создать более продвинутый инструмент, который сможет не только устанавливать
программу, но и следить за зависимостями. Дело в том, что для работы какой-либо
определенной программы может понадобиться определенная библиотека, и нужно,
чтобы программа установки могла самостоятельно находить такие зависимые библиотеки и устанавливать их в систему.
Зависимости в Linux были серьезной проблемой, особенно в начале ее пути, потому
что приложения могли не работать по непонятным причинам (в основном из-за отсутствия нужной библиотеки), и все это приходилось решать «руками». Это одна из
причин, по которой Linux в свое время завоевала славу сложного дистрибутива,
хотя уже давно таковой не является.
Итак, Debian создает свой инструмент и называет его APT (Advanced Packaging
Tool), и он до сих пор используется в дистрибутивах, ведущих свое происхождение
от Debian, включая Ubuntu.
Что ж, не успели мы установить систему, как тут же начинаем говорить о ее расширении с помощью установки дополнительных программ... В Ubuntu для этого
служит команда apt-get. Она потребует прав администратора, поэтому выполнять
ее необходимо из-под sudo.

Tlgm: @it_boooks

Установка и начальная настройка Linux

57

Сразу же лучше рассмотреть несколько команд, помогающих установить дополнительные пакеты. Для этого служит опция install:
sudo apt-get install mc

Здесь я использую команду sudo, потому что надеюсь, что вы работаете все же не
с правами администратора. В дальнейшем я не буду каждый раз указывать sudo,
хотя постараюсь делать это как можно чаще, чтобы показать, какие команды привилегированные и требуют повышенных прав. Установка новых системных программ — конечно же, привилегированная операция.
После параметра install указывается имя пакета. В нашем случае в качестве примера я выбрал программу Midnight Commander (команда mc), и выбрал ее не случайно, потому что о ней мы будем говорить уже в разд. 3.1. По умолчанию менеджер файлов mc не устанавливается в систему, но вот такой простой командой его
можно установить.
Если результат выполнения команды apt-get заканчивается сообщением об ошибке
(пакет не найден), то, скорее всего, локальная база данных в вашей системе не обновлена. В файле /etc/apt/sources.list содержится список адресов (URLs), по которым
apt-get может найти и установить пакеты программ. Чтобы обновить локальную
базу, нужно запустить программу с ключом update:
sudo apt-get update

Теперь можно попробовать еще раз запустить install mc, и на этот раз все должно
пройти успешно — уже на этапе установки будут проверены все зависимости и
установлены необходимые библиотеки.
Собрать зависимости можно и отдельной командой:
sudo apt-get build-dep имя_программы

Устанавливать можно сразу по несколько программ, указав их через пробел:
sudo apt-get install имя_программы1 имя_программы2

Если вы не хотите реально устанавливать пакеты, а только посмотреть, что будет
устанавливаться, то можно использовать ключ –s (simulate, симулировать установку):
sudo apt-get –s install mc

Для проверки зависимостей нужно выполнить команду:
sudo apt-get check

Если нужно исправить зависимости:
sudo apt-get -f install

Для удаления программы или пакета используем:
sudo apt remove имя_программы

Удаление ранее установленной программы происходит так же просто, как и установка:
sudo apt-get remove имя_программы

Tlgm: @it_boooks

58

Глава 2

Если какая-то программа была удалена, но остались зависимости, то можно автоматически удалить все лишнее:
sudo apt-get autoremove

Для установки обновлений уже установленных программ выполняем следующую
команду:
sudo apt-get upgrade

Чтобы обновить саму ОС, выполняем команду:
sudo apt-get dist-upgrade

Следующую тройку команд желательно выполнять регулярно для установки обновлений:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Все эти команды позволят вам содержать вашу копию релиза Ubuntu и установленных программ в обновленном состоянии, но на новый релиз автоматически вы так
не перейдете. Если вышел новый релиз, а не просто обновление существующего, то
на него можно перейти командой:
sudo do-release-upgrade

Чтобы узнать, какие вообще в системе уже установлены пакеты, можно выполнить
следующую команду
sudo apt list --installed

2.14. Установка дополнительных пакетов
в CentOS
В CentOS — другой менеджер пакетов, и хотя он работает примерно так же, различия все же есть. Чтобы установить уже упоминавшуюся в разд. 2.13 программу
Midnight Commander (команда mc), нужно выполнить следующую команду:
sudo yum install mc

Здесь mc — имя пакета, который мы хотим установить.
Обновление пакета mc:
sudo yum update mc

Если не указывать имя пакета, то команда yum обновит все установленные пакеты.
Проверить на наличие обновлений можно так:
sudo yum check-update

А удалить пакет так:
sudo yum remove mc

Tlgm: @it_boooks

Установка и начальная настройка Linux

59

2.15. Редактирование файлов
В Linux конфигурация хранится в текстовых файлах, и прежде чем двигаться дальше, необходимо рассмотреть, как можно редактировать файлы.
Опытные администраторы предпочитают использовать утилиту vi. Это довольно
сложный текстовый редактор, которому можно посвятить отдельную книгу. Чтобы
сэкономить место здесь, я рекомендую прочитать соответствующую статью на
моем сайте: http://www.flenov.info/story/show/Tekstovyy-redaktor-vim.
На втором месте по популярности идет редактор nano. Он намного проще, и я рекомендую его для начинающих. Правила работы с этим редактором я также представил на своем сайте: http://www.flenov.info/story/show/Nano-tekstovyy-redaktor.
Для редактирования файлов с помощью nano выполняем команду:
nano имя-файла

Очень часто конфигурационные файлы защищены от редактирования, поэтому
приходится выполнять их из-под sudo. Например, следующая команда запускает
редактирование файла hosts:
sudo nano /etc/hosts

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

Рис. 2.7. Ubuntu: редактор nano

Tlgm: @it_boooks

60

Глава 2

Tlgm: @it_boooks

ГЛАВА

3

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

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

Tlgm: @it_boooks

62

Глава 3

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

3.1. Файловая система
Прежде чем перейти к настройкам системы, нам нужно познакомиться поближе
с файловой системой Linux. О ее структуре мы уже немного поговорили в разд. 2.3,
когда занимались разбиением жесткого диска на разделы. В табл. 2.1 были представлены разделы, которые можно создать в Linux, а это не что иное, как основные
папки, находящиеся в корне файловой системы.
Теперь, наверное, нужно было бы рассмотреть команды, с помощью которых можно управлять каталогами и файлами, а также просматривать и редактировать их. Но
мы займемся этим чуть позже, а сейчас я хочу рассказать вам об одной очень полезной программе — Midnight Commander (MC). Это лучшее средство для решения
всех описанных ранее задач. Программа присутствует в большинстве дистрибутивов. Для ее запуска наберите в командной строке mc и нажмите клавишу .
Если программа на компьютере не обнаружится, то ее надо установить, и как это
сделать, было описано в разд. 2.13.
Файловый менеджер Midnight Commander является аналогом знаменитого файлового менеджера Norton Commander, работавшего в MS-DOS. Их функции и даже
внешний вид очень похожи. И если в MS-DOS такая утилита была необходимостью
из-за слабых возможностей командной строки, то в Linux это приятное и удобное
дополнение. Так что, если вы знакомы с той памятной утилитой, вам будет очень
приятно ностальгировать по старым добрым временам MS-DOS, сидя в современной Linux. Программа может работать как в текстовом режиме Linux, так и в окне
терминала оконного менеджера.
Почему я начинаю знакомство с файловой системой с этой программы? Она проста,
удобна и наглядна. Не нужно запоминать множество команд командной строки,
и с этой утилитой любят работать не только начинающие, но и опытные профессионалы.
На рис. 3.1 показано окно терминала, в котором запущена программа MC. Окно
состоит из двух независимых панелей, в каждой из которых вы можете видеть файлы и папки текущего каталога (имена папок начинаются со слэша — прямой наклонной черты /). Для перемещения между панелями служит клавиша .
На правой панели открыта корневая папка — это самый верхний уровень файловой
системы. Посмотрите на представленный там список папок — большинство названий нам знакомо из табл. 2.1. Каждая из этих папок может находиться в собственном разделе жесткого диска, если при установке вы его создали. Но в любом случае
в файловой системе вы будете видеть их все единым блоком в составе корневой
папки.
В разд. 2.3.2 мы говорили про корневой каталог, который в Linux обозначается
так: /. Именно он является вершиной пирамиды в иерархии всех папок. Пусть папки

Tlgm: @it_boooks

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

63

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

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

В списке папок и файлов самой первой всегда стоит папка с именем, состоящим из
двух точек (/..). В реальности каталога с таким именем не существует — это просто
указатель на родительский каталог, с помощью которого вы можете перейти по иерархии на уровень выше. Например, вы находитесь в подкаталоге /home/flenov. Если
войти в папку /.., то вы подниметесь на предыдущий уровень и окажетесь в каталоге
/home.
В нижней части окна MC (см. рис. 3.1) можно увидеть строку-приглашение для
ввода команд. Это та же строка, что мы видели в терминале, и она позволяет выполнять те же директивы. Еще ниже расположена строка меню с подсказками о назначении клавиш –:
 1 Help (Помощь) — отображение файла помощи по программе;
 2 Menu (Меню) — вызов меню основных команд MC;
 3 View (Просмотр) — просмотр выделенного файла;
 4 Edit (Правка) — редактирование выделенного файла во встроенном текстовом
редакторе;
 5 Copy (Копия) — копирование выделенного файла или папки. Если выделить
файл и нажать клавишу , то появится окно подтверждения копирования. По
умолчанию операция выполняется в текущий каталог противоположной панели
программы MC;

Tlgm: @it_boooks

64

Глава 3

 6 RenMov (Переместить) — переместить выделенные файлы или папки. По

умолчанию файл будет перенесен в каталог, являющийся текущим для противоположной панели программы MC;
 7 Mkdir (Новый каталог) — создать новый каталог в текущем;
 8 Delete (Удалить) — удалить выделенные файлы и папки;
 9 PullDn (Выпадающее меню) — вызвать меню программы MC, которое нахо-

дится в верхней части окна;
 10 Quit (Выход) — выход из программы.

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

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

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

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

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

Tlgm: @it_boooks

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

65

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

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

Выполнив команду ls —al, мы получим примерно такой вывод:
drwx-----drwxr-xr-x
-rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x

3
5
1
1
1
4

Flenov
root
Flenov
Flenov
Flenov
Flenov

FlenovG
root
FlenovG
FlenovG
FlenovG
FlenovG

4096
4096
124
2247
118
4096

Nov
Nov
Nov
Nov
Nov
Nov

26
26
26
26
26
26

16:10
16:21
16:10
16:10
16:10
16:10

.
..
.bashrc
.emacs
.gtkrc
.kde

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

А сейчас нам главное знать, что если первая буква d, то это каталог (directory);
 цифра 3 — указывает количество жестких ссылок;
 Flenov — имя пользователя, являющегося владельцем файла;
 FlenovG — группа, которой принадлежит файл;
 4096 — размер файла;
П РИМЕЧАНИЕ
На первый взгляд каталог — не файл и не имеет размера, но не стоит удивляться, что
размер каталога не равен нулю. Грубо говоря, каталоги — это файлы, в которых находится список файлов каталога. Размер тоже не случаен — четыре килобайта (4×1024),
что равно блоку памяти (странице), выделяемому для работы с данными. Это лирическое отступление, которое может и не пригодиться в реальной жизни.

 Nov 26 16:10 — дата и время последнего изменения файла;
 . — точка указывает на текущий каталог.

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

Tlgm: @it_boooks

66

Глава 3

Это сработает, если файл находится в текущем каталоге. А если нет? Тогда надо
указать полный путь:
cat /home/root/need.txt

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

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

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

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

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

Этот же символ можно использовать и в тех случаях, когда нужно просто обратиться к файлу в своем домашнем каталоге. Например, путь ~/readme.txt приведет к файлу readme.txt в домашней папке текущего пользователя.

cp
Это команда копирования файла. С ее помощью можно выполнять несколько различных действий:
 копировать содержимое файла в другой документ той же папки:
cp /home/root/need.txt /home/root/need22.txt

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

Tlgm: @it_boooks

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

67

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

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

файлы-источники и последним параметром — папку:
cp /home/root/need.txt

/home/root/need22.txt /home/new/

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

/home/flenov/need22.txt /home/new/

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

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

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

find
Для поиска информации в файловой системе используется команда find. Файловая
система сильно разветвлена, и найти нужный файл бывает непросто. В простейшем
варианте команда поиска пути к файлу (path) по его имени (filename) выглядит
следующим образом:
find path –name filename

После имени команды find, параметра path и ключа -name здесь указано имя искомого файла: filename.
После имени команды можно указать путь к каталогу, в котором нужно производить поиск. Поиск будет включать все подкаталоги. Вы можете указать несколько
каталогов подряд, например:
find /etc /home –name filename

Эта команда произведет поиск файла filename в каталогах /etc и /home.

Tlgm: @it_boooks

68

Глава 3

После ключа -name можно указать имя файла или шаблон, по которому нужно искать файлы. Например, следующая команда найдет на диске все файлы с именем
passwd:
find / –name passwd

А что, если вы не помните, какое точно имя у файла: passwd или password? В этом
случае можно указать следующий шаблон:
find / –name passw*d

Под этот шаблон попадают оба имени файла. Символ звездочки соответствует
любому набору любых символов и даже отсутствию символов.
Ключ –name, наверное, самый популярный ключ для команды поиска, но помимо
него команда поддерживает так же следующие ключи:
 -size число — позволяет указать размер файла, если вы его точно знаете. По

умолчанию размер указывается в блоках размером в 512 Кбайт. Если нужно указать размер в байтах, то после числа укажите букву c;
 -print — заставляет вывести содержимое файла в консоль;
 -mtime число — в качестве параметра число можно указать количество дней,

прошедших со дня последнего редактирования файла. Например, если вы вчера
редактировали файл с именем note, но не помните, куда его сохранили, то выполните следующую команду:
find / –name note –mtime 1

 -type тип — ключ позволяет указать тип файла. В качестве типа можно указы-

вать:
• d — каталог;
• f — обычный файл;
• p — именованный канал;
• l — символьную ссылку (о ссылках — символьных и жестких — рассказано
в разд. 3.1.3).
С помощью команды find можно искать не только имена файлов или каталогов, но
и осуществлять поиск по содержимому файлов. Вот вам интересная команда, которую нужно запомнить или записать:
find . –type f –name "*" –print | xargs grep "текст, который ищем"

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

Tlgm: @it_boooks

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

69

справа от нее. Команда xargs объединяет полученные на входе данные и выполняет
указанную команду. А вот команда grep ищет в тексте, который подается на вход,
строку, указанную в качестве параметра.

grep
Эта команда позволяет искать по данным, которые поступают на вход. На вход
данные можно направить с помощью магического символа вертикальной черты.
Например:
ls -al | grep bash

Здесь у нас две команды разделены вертикальной чертой. Команда слева выводит
на экран список файлов, и полученный результат передается на вход команде справа, которая ищет слово bash в входных данных. Коротко говоря, команда предписывает показать все файлы в текущем каталоге и найти среди них те, в которых
есть слово bash.
Еще один вариант:
cat .bashrc | grep alias

Команда слева выводит содержимое файла .bashrc (не имеет сейчас значения, что
это за файл), а правая команда ищет в результате строки, в которых есть слово
alias.
Если нужно просто искать информацию в файлах, то можно обойтись одной
командой grep без вертикальных линий и дополнительных команд. Формат команды следующий:
grep что где

Допустим, что вы хотите проверить, есть ли в файле /etc/hosts адрес сайта
flenov.info. Это можно сделать следующим образом:
grep flenov.info /etc/hosts

Если вы точно не знаете имя файла, но известен каталог, в котором он находится,
то можно искать во всех файлах этого каталога:
grep flenov.info /etc/*

Символ звездочки здесь указывает как раз на то, что искать нужно в любом файле.
Звездочка в Linux, как и в Windows, используется как шаблон — она соответствует
любому количеству символов. Если нужно искать в файлах, которые начинаются
с буквы h, то команда будет выглядеть так:
grep flenov.info /etc/h*

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

Tlgm: @it_boooks

70

Глава 3

rm
Команда позволяет удалить файл или каталог (который должен быть пуст):
rm /home/flenov/need22.txt

В качестве имен файлов можно использовать и маски, как в команде cp. Для удаления каталога может понадобиться указание следующих ключей:
 -d — удалить каталог;
 -r — рекурсивно удалять содержимое каталогов;
 -f — не запрашивать подтверждение на удаление файлов. Будьте внимательны

при использовании этого ключа, потому что файлы будут удаляться без каких
бы то ни было предупреждений. Вы должны быть уверены, что команда написана правильно, иначе можно удалить что-то нужное, особенно если вы работаете
под учетной записью root.
Пример удаления каталога рекурсивно и без запроса на подтверждение:
rm —rf /home/flenov/dir

df
Эта команда позволяет узнать объем свободного места на жестком диске или в разделе. Если устройство не указано, то на экран выводится информация о смонтированных файловых системах.
В результате выполнения команды может быть получен примерно такойвывод:
Filesystem
/dev/hda2
none

1k-blocks
16002200
127940

Used
Available Use% Mounted on
2275552 12913760 15% /
0
127940
0% /dev/shm

Результирующая таблица состоит из следующих колонок:
 Filesystem — диск, файловая система которого смонтирована;
 1k-blocks — количество логических блоков;
 Used — количество использованных блоков;
 Available — количество доступных блоков;
 Use% — процент использованного дискового пространства;
 Mounted on — как смонтирована файловая система.

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

Tlgm: @it_boooks

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

71

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

После этого содержимое компакт-диска можно посмотреть в каталоге /mnt/cdrom —
получается, что файлы и каталоги компакт-диска как бы сливаются с файловой
системой.
Почему именно в каталог /mnt/cdrom монтируется компакт-диск? Секрет заключается в том, что для подключения компакт-диска нужно намного больше сведений,
чем содержит команда mount /dev/cdrom. Эти сведения хранятся в двух файлах, уже
имеющихся в ОС и описывающих основные устройства и параметры по умолчанию: fstab и mtab. Давайте по очереди рассмотрим эти файлы.
Для начала взглянем на fstab:
# /etc/fstab: static file system information.
#
#
/dev/hda2 /
ext3 defaults,errors=remount-ro
0
1
/dev/hda1 none
swap sw
0
0
proc
/proc proc defaults
0
0
none
/dev/shm tmpfs defaults
0
0
none
/dev/pts/ devpts gid=5,mode=620
0
0
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro
0
0
/dev/fd0
/mnt/floppy auto noauto,owner,kudzu
0
0

Файл содержит строки для основных дисков. Каждая запись состоит из 6 колонок.
Обратите внимание на первую строку — здесь описывается подключение диска
hda2. В моей файловой системе hda2 — основной диск, поэтому второй параметр: /.
Это значит, что диск будет смонтирован как корневой. Третья колонка описывает
файловую систему — в моем случае это Ext3.
Предпоследняя строка в файле описывает устройство CD-ROM. Посмотрите внимательно на второй параметр: /mnt/cdrom — вот откуда берется путь к содержимому компакт-диска. Четвертая колонка содержит опции монтирования, в которых
можно описать параметры безопасности. Для компакт-диска здесь указано несколько опций: noauto,owner,kudzu,ro. Очень важным является параметр ro, который говорит о возможности только чтения CD-ROM. Вполне логично установить
этот параметр для всех внешних приводов и устройств, которые злоумышленник
может использовать для физического переписывания информации с сервера.
Файл mtab имеет примерно такое же содержимое:
#

/dev/hda2
/
ext3
rw,errors=remount-ro
proc
/proc
proc
rw
none
/dev/shm
tmpfs rw
none
/dev/pts
devpts rw,gid=5,mode=620
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
/dev/cdrom /mnt/cdrom iso9660 ro,nosuid,nodev 0 0


0 0
0 0
0 0
0 0

Tlgm: @it_boooks

72

Глава 3

Если вы создали какие-то разделы на отдельных дисках, то с помощью файла mtab
сможете настраивать и их. Ранее я вам рекомендовал выделить таким образом раздел /home с пользовательскими каталогами. Если вы так и сделали, то в файле mtab
может присутствовать еще одна строка примерно следующего вида:
/dev/hda3 /home ext3 rw,errors=remount-ro 0 0

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

должно быть исполняемых файлов, то можно указать эту опцию. Например, в некоторых системах каталог /home должен хранить только документы. Чтобы хакер
не смог записать в этот раздел свои программы, с помощью которых будет осуществлять взлом, добавьте эту опцию. Точнее сказать, программы записать он сможет, а запустить — нет;
 nosuid — запрещает использование программ с битами SUID и SGID. В разделе
/home их быть не должно, поэтому можно явно запретить применение привилегированных программ. О SUID- и SGID-программах мы будем говорить еще не
раз (например, в разд. 4.5), ибо это очень опасная вещь;

 nodev — запрещает использование файлов устройств;
 nosymfollow — запрещает использование мягких ссылок.

Опции nodev и nosymfollow не сильно влияют на безопасность, но могут пригодиться.
Вообще-то использование упомянутого ранее параметра noexec — бесполезное занятие и абсолютно не защищает систему от профессионального хакера, потому что
опытный взломщик сможет запустить программу, если для выполнения разрешен
хотя бы один раздел. Нет, параметр использовать можно, но не стоит считать его
панацеей.
Допустим, что ваш сайт разрабатывается с использованием языка Perl. Если его интерпретатор доступен для выполнения, то взломщик сможет запускать сценарии
программ Perl в любом разделе, в том числе и с установленным параметром noexec.
Так, при использовании для запуска сценария командной строки вы получите сообщение о нарушении прав доступа. Но программа выполнится, если отдать такую
команду:
perl file.pl

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

Tlgm: @it_boooks

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

73

и выполняет его в своем адресном пространстве. Ведь file.pl — это не программа, а
текст программы, который интерпретируется с помощью Perl. А возможностей Perl
достаточно, чтобы выполнять сложные манипуляции, как и у полноценных программ.
Вспомните описание файла mtab, где для CD-ROM стоит запрет на использование
SUID- и SGID-программ. То же самое необходимо сделать как минимум с разделами /home и /tmp — тогда пользователи не смогут создавать в своих каталогах привилегированные программы, что позволит предотвратить большое количество возможных атак. В пользовательских каталогах не должно быть никаких приложений,
работающих с высокими правами доступа.
Итак, давайте попробуем смонтировать CD-ROM в другой каталог. Для этого сначала создадим его:
mkdir /mnt/cd

Теперь выполним команду:
mount /dev/cdrom /mnt/cd

Если на вашем компьютере установлено две ОС: Windows и Linux, то диск, скорее
всего, содержит файловую систему FAT32 или NTFS. Следующие команды позволяют подключить FAT32 к Linux:
mkdir /mnt/vfat
mount -t vfat /dev/hda3 /mnt/vfat

Первая команда создает каталог /mnt/vfat, куда будет подключаться диск с FAT32.
Во второй команде происходит монтирование диска /dev/hda3. Будем считать, что
как раз этот диск принадлежит Windows (на моем компьютере именно так и есть, из
этого и будем исходить). Ключ -t позволяет указать тип подключаемой файловой
системы, что обязательно. Для CD-ROM мы этого не делали только потому, что вся
необходимая информация имеется в файле /etc/fstab. В ключе –t указана файловая
система vfat — это имя для FAT32, которое используется в Linux.
Более подробно о работе команды mount можно узнать на страницах ее документации (man mount).

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

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

Tlgm: @it_boooks

74

Глава 3

tar
В те времена, когда не было программ для установки пакетов — таких как apt-get,
программы устанавливались из архивов, распаковываемых с помощью команды
tar. Сейчас таким образом чаще всего распространяют программы в исходных кодах. Для развертывания файла архива tar нужно выполнить команду:
tar xzvf имяфайла.tar.gz

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

rpm
Эта команда устанавливает пакеты программ формата RPM, и ее смысл такой же,
как и у apt-get, только формат RPM был разработан в Red Hat и используется в дистрибутивах, построенных на его базе. Я же рассматриваю в этой книге Ubuntu —
потомок Debian. Но все же проведем совсем уж краткий экскурс по команде rpm.
Для установки нового пакета можно выполнить команду:
rpm -i пакет

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

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

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

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

Tlgm: @it_boooks

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

75

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

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

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

Теперь воспользуйтесь командой ls -l /etc/passwd, чтобы убедиться, что дата и
время изменения установлены верно.
С помощью команды touch можно и создавать файлы, сразу же указывая необходимую дату.
Как видите, даты создания и редактирования файлов легко меняются.
Итак, найти все файлы, дата изменения которых позже 11:40 21 января текущего
года, можно следующим образом:
touch 0121114010 /tmp/tempfile
find /etc \(-newer /tmp/tempfile \) -ls
find /etc \(-cnewer /tmp/tempfile \) -ls
find /etc \(-anewer /tmp/tempfile \) —ls

В первой строке мы создаем во временном каталоге /tmp файл с необходимой датой
изменения, по которой и будет происходить поиск.
Следующие три строки производят поиск файлов. Каждая из них имеет следующую
структуру:
find каталог \( -сравнение

файл \) -ls

Tlgm: @it_boooks

76

Глава 3

Рассмотрим по частям эту строку:
 find — программа поиска файлов;
 каталог — каталог, в котором нужно искать. В нашем случае указан системный

каталог /etc, в котором хранятся все настроечные файлы;
 параметр \( -сравнение файл \) состоит из файла для сопоставления и критерия

поиска файлов, который может принимать различные значения:
• -newer — дата изменения позже, чем у заданного файла в параметре файл;
• -cnewer — состояние изменено позже, чем у сопоставляемого файла в параметре файл;
• -anewer — дата последнего доступа превосходит аналогичный параметр
сравниваемого файла;
 параметр -ls — отображает на экране список файлов (как при выполнении

команды ls).

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

Утилита md5sum подсчитывает контрольную сумму указанных в качестве параметра файлов. На экране вы получите результат выполнения команды примерно такого
вида:
783fd8fc5250c439914e88d490090ae1
e2eb98e82a51806fe310bffdd23ca851
e1043de2310c8dd266eb0ce007ac9088
4543eebd0f473107e6e99ca3fc7b8d47
c09badb77749eecbeafd8cb21c562bd6
70aba16e0d529c3db01a20207fd66b1f
c3e3a40097daed5c27144f53f37de38e
3e5bb9f9e8616bd8a5a4d7247f4d858e
fe4aad090adcd03bf686103687d69f64
...

/etc/DIR_COLORS
/etc/Muttrc
/etc/a2ps-site.cfg
/etc/a2ps.cfg
/etc/adjtime
/etc/aliases
/etc/aliases.db
/etc/anacrontab
/etc/aspldr.conf

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

Tlgm: @it_boooks

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

77

ний. Следующая команда выполняет расчет контрольных сумм и сохраняет результат расчета в файл /home/flenov/md:
md5sum /etc/* >> /home/flenov/md

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

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

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

Теперь напротив файла /etc/group будет выведено сообщение об ошибке, поскольку
его контрольная сумма изменилась. Таким образом, даже если дата корректировки
файла осталась прежней, по контрольной сумме легко определить наличие вмешательства.
Программа md5sum входит в пакет ucommon-utils, который по умолчанию
в Ubuntu-сервер не устанавливается. Если у вас этот пакет отсутствует, то для его
установки следует выполнить команду:
sudo apt-get install ucommon-utils

Что контролировать?
Целью атаки может быть не только конфигурация, но и исполняемые файлы. То,
что Linux является продуктом с открытым кодом, имеет свои преимущества и свои
недостатки.
Дело в том, что профессиональные хакеры знают программирование. Им не составляет труда взять исходный код какой-либо утилиты и изменить его по своему усмотрению, добавив в него необходимые возможности. Таким образом, в системе
могут оказаться открытые потайные двери.
Конечно же, эти двери появляются не сразу после установки ОС. Но если взломщик
проник в систему, то он может подменить системные файлы своими, чтобы таким
образом в ней закрепиться.
Можно контролировать изменения как конфигурационных файлов, так и всех системных программ и библиотек. Я в своей сети не решаю, какие каталоги отслеживать, но я бы добавил мониторинг каталогов /etc и /bin.
Следить за пользовательскими файлами просто не имеет смысла, потому что эти
файлы изменяются часто, и в тысячах изменений найти что-либо существенное бу-

Tlgm: @it_boooks

78

Глава 3

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

Замечания по работе с файлами
ОС Linux достаточно демократично относится к именам создаваемых файлов, позволяя использовать абсолютно любые символы, кроме знака /, который является
разделителем каталогов, и символа с кодом 0, который определяет конец имени
файла. Все остальное применять допускается.
Самое страшное — это возможность использовать невидимые символы. Дело в том,
что на их основе можно создать программу, у которой в имени будут только нечитаемые знаки, и пользователь не увидит такого файла. Никто и никогда не вглядывается в имена файлов, да и администраторы не сидят в постоянном наблюдении за
системой, поэтому подобные вещи легко пропустить.
Рассмотрим пример с использованием перевода строки. Допустим, что хакер назвал
свой файл hacker\nhosts.allow. В этом случае под \n подразумевается перевод каретки,
а, значит, имя этого файла состоит из двух строк:
hacker
hosts.allow

Не все программы могут обработать такое имя правильно. Если ваш файловый менеджер работает неверно, то он отобразит только вторую строку: hosts.allow.
Еще один способ спрятать файл — в качестве имени указать точку и пробел: «. »
или две точки и пробел: «.. ». Файл с именем в виде точки всегда указывает на
текущий каталог. Администратор, выполнив команду ls, может не заметить, что
существуют два файла с одинаковыми именами, а пробела ему все равно не видно.
Пробелы можно вставлять в любые имена файлов — например, перед именем:
(« hosts.allow») или, наоборот, в конце имени, и при отсутствии должного внимания
вы ничего не заметите. Чтобы увидеть конечный пробел, можно при выводе добавлять к каждому имени символ косой черты (/). Для этого при вызове команды ls
используйте ключ -F.
Следующий вариант спрятать файл — заменять одни символы на другие, схожие по
начертанию. Например, посмотрим на имя файла hosts.a11ow. Ничего не замечаете
подозрительного? При беглом взгляде проблему можно пропустить, но если приглядеться повнимательнее, то станет видно, что вместо букв l (L) стоит цифра 1
(единица).
Может использоватся и такой прием — подмена буквы b на d. Здесь тоже трудно
что-либо заподозрить, потому что если человек каждый день видит одно и то же, то
чаще всего воспринимает желаемый текст за действительный. Получается банальный обман зрения.
Подобные трюки очень часто используются вирусописателями на платформе
Windows. Там опытные пользователи, которые работают с компьютерами с 1990-х го-

Tlgm: @it_boooks

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

79

дов, уже точно привыкли к подобным обманам. Я не знаю, зовут ли сейчас «чайники» друзей отремонтировать компьютер, а в конце 1990-х меня часто просили «починить» регулярно падавшую Windows 9x, и я насмотрелся на разные вирусы и
прочие злодейские программы с подобными простыми обманами.

3.1.3. Ссылки
В вашей системе могут появиться документы для совместного использования. Рассмотрим эту ситуацию на примере. Допустим, что файл отчетности /home/report
должен быть доступен нескольким пользователям. Им было бы удобно, чтобы копия этого файла находилась в их домашних каталогах. Однако создавать несколько
копий одного файла в разных местах нерационально, потому что затруднится синхронизация изменений — весьма сложно собрать в одно целое модификации из нескольких файлов, особенно если корректировался один и тот же кусок. И кто будет
оценивать, чьи изменения необходимо вносить в общий файл?
Проблема частично решается с помощью ссылок, которые бывают жесткими
(Hard link) и символьными (Symbolic link). Частично, потому что одновременная
работа над документом все равно останется невозможной.
Для постижения самой сути ссылок необходимо понимать, что такое файл и какое
место ему отводится операционной системой. При создании файла на диске выделяется пространство для хранения данных, а его имени сопоставляется ссылка из
каталога на участок диска, где физически находится файл. Получается, что можно
создать несколько ссылок на одни и те же данные, и ОС Linux позволяет делать это.
Когда мы выполняем команду ls -l, то на экране появляется подробная информация о файлах в текущем каталоге. Напомню ее вид:
-rw-r--r--

1 Flenov

FlenovG

118 Nov 26 16:10 1.txt

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

1 Flenov

FlenovG

118 Nov 26 16:10 1.txt

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

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

Tlgm: @it_boooks

80

Глава 3

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

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

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

2 root
2 root

root
root

0 Feb 22 12:19 1.txt
0 Feb 22 12:19 link.txt

Обратите внимание, что первая колонка, в которой находятся дескрипторы для
обоих файлов, содержит одинаковые значения. В третьей колонке стоит число 2,
что говорит о наличии двух ссылок на данные.
Теперь попробуем изменить содержимое любого из этих файлов. Для этого выполним следующие команды:
ls > link.txt
cat 1.txt

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

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

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

Tlgm: @it_boooks

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

81

создания символьной ссылки нужно использовать команду ln с ключом -s. Например:
ln -s link.txt symbol.txt

Посмотрим на результат с помощью команды ls -il:
913021 -rw-r--r-- 1 root
913193 lrwxrwxrwx 1 root

root 519 Feb 22 12:19 link.txt
root
8 Feb 22 12:40 symbol.txt -> link.txt

Теперь дескрипторы файлов разные, но для symbol.txt первый символ следующей
колонки представлен буквой l. Как раз она и указывает на то, что мы имеем дело
с символьной ссылкой. В третьей колонке стоит единица, а последняя колонка
после знака -> содержит имя файла, на который указывает ссылка.
Попробуем удалить основной файл и после этого просмотреть содержимое ссылки
symbol.txt:
rm link.txt
ls -il
cat symbol.txt

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

Строка, содержащая информацию о ссылке symbol.txt, должна быть красного цвета,
а текст — мигающий белый. Это говорит о том, что ссылка «битая», т. е. указывает
на несуществующий файл. Команда cat symbol.txt пытается отобразить содержимое ссылки. Так как файла нет, мы увидим сообщение об ошибке.
Самое интересное, что если попытаться записать какие-либо данные в файл
symbol.txt, то файл link.txt будет автоматически создан. Это огромный недостаток,
поэтому вы должны следить за символьными ссылками перед удалением файлов — ведь пользователь сможет создать файл, который был удален.
Второй недостаток символьных ссылок кроется в правах доступа, но мы их будем
рассматривать в главе 4.
Еще один минус таится в блокировках. Если открыть на редактирование файл, для
которого создана символьная или жесткая ссылка, то он блокируется. Представим
себе, что существует ссылка на файл /etc/passwd или /etc/shadow. При блокировке
одного из них вход в систему станет невозможным.
Чтобы взломщик не смог воспользоваться блокировками, его права на запись
в системные каталоги должны быть ограничены. А пользователь в большинстве
случаев должен иметь разрешение писать только в свой домашний каталог и
в каталог /tmp. Иногда при разделении файлов может потребоваться работа с чужими каталогами, но все равно доступ ограничивается каталогом /home, где расположены пользовательские каталоги.

Tlgm: @it_boooks

82

Глава 3

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

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

3.2.1. Автозагрузка
Когда включается компьютер, то первой загружается программа BIOS (Basic
Input/Output System, базовая система ввода/вывода), записанная в микросхеме ПЗУ
системы. Она читает главную загрузочную запись (MBR, Master Boot Record), занимающую 512 байтов на жестком диске. В них содержится информация о дисках и
код начального загрузчика ОС.
Поскольку уместить код всего загрузчика в MBR в наше время практически невозможно, там располагают только начальный загрузчик, который загружает с другого
места диска уже полноценный загрузчик.
В Linux сейчас самым популярным загрузчиком является GRUB2. Конфигурация
этой программы чаще всего содержится в файле /boot/grub/grub.cfg, но можно встретить дистрибутивы, где этот путь выглядит так: /boot/grub2/grub.cfg. В файле загрузчика записаны настройки, определяющие, нужно ли показывать меню выбора варианта загрузки, и каким должно быть это меню, а также указываются сами варианты
загрузки и предписывается, какую версию ядра следует загрузить (мы уже говорили, что в Linux может быть более одного ядра).
После этого может формироваться initrd — виртуальный диск в оперативной памяти (ramdisk) для временной файловой системы, используемой ядром Linux при начальной загрузке. Дело в том, что если ядро скомпилировано в минимальном варианте и все его возможности подключаются в дальнейшем с помощью модулей, то
в этот момент у ядра не будет возможности работать со специфичными жесткими
дисками, и оно не сможет загружать дальнейшие данные. Поэтому сначала грузится диск /boot/initrd.xxxx, который загружает критически важные модули, и, если я не
ошибаюсь, именно он и загружает красивую картинку, которую показывает ОС во
время старта системы.

Tlgm: @it_boooks

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

83

Теперь у ядра есть все необходимое для загрузки самой системы. Появляется красивая картинка, которая прячет выводимый в консоль лог дальнейшей загрузки,
и управление передается программе /sbin/init.
Программа init загружает файл /etc/inittab — конфигурационный файл, в котором
прописан процесс инициализации ОС Linux, и выполняет все предусмотренные
в нем операции.
В настоящее время в системе загрузки всех сервисов осуществляется смена лидера,
и, может быть, даже уместно сказать, что эта смена уже практически произошла.
Раньше загрузкой всех сервисов управляла SysVinit — программа init, которая
загружает все сервисы последовательно. Это надежно, но долго, потому что если
какой-то сервис загружается медленно, то все остальные вынуждены стоять и
ждать своей очереди. Такое часто происходит с сервисами, которые взаимодействуют с сетью.
У компании Red Hat свой взгляд на загрузку, и называется он systemd. Смысл примерно тот же — загружать по несколько сервисов параллельно для повышения скорости старта системы.
В Ubuntu какое-то время использовали собственную разработку Upstart, но потом
решили последовать общему тренду и перейти на systemd. Если даже попробовать
сейчас установить upstart, то команда его загрузки завершится ошибкой, потому
что этот пакет уже не доступен.
Управлять службами в консоли не так уж и сложно. Чтобы просмотреть установленные службы, надо взглянуть на установленные скрипты запуска служб в каталоге /etc/init.d/. Статус любого из них можно проверить, если выполнить с правами
администратора любой из этих скриптов с параметром status:
sudo /etc/init.d/apache2 status

Если служба (в нашем случае apache2) выполняется, то в консоли появится сообщение:
* apache2 is running
Чтобы остановить службу, нужно выполнить скрипт с параметром stop:
sudo /etc/init.d/apache2 stop

А для запуска делаем то же самое, только с параметром start:
sudo /etc/init.d/apache2 start

Состояние сервисов можно также просматривать с помощью команды status:
sudo status cups

В этом случае я запрашиваю состояние сервиса cups, который отвечает за печать.
А для управления сервисом можно использовать команду service:
sudo service cups start
sudo service cups stop
sudo service cups restart

Думаю, что какие-то дополнительные комментарии тут излишни.

Tlgm: @it_boooks

84

Глава 3

Чтобы просмотреть состояние всех установленных служб в тот или иной момент,
надо выполнить команду:
sudo service --status-all

Когда вы запускаете или останавливаете сервис с помощью подобных команд, то
это носит только временный характер. Если же вы хотите, чтобы изменение носило
постоянный характер и состояние службы сохранялось после перезапуска, то можно создать файл /etc/init/имя_сервиса.override, в котором будет содержаться только
слово manual. Из командной строки такое можно выполнить с помощью команды
echo и перенаправить результат команды в файл:
echo 'manual' > /etc/init/mysql.override

Команда echo 'manual' говорит о том, что нужно напечатать слово manual. В общем случае оно будет напечатано на стандартном выводе, которым по умолчанию
является окно терминала. Но имеющийся в строке символ > говорит, что вывод
команды слева нужно перенаправить в поток справа. А справа идет файл. Значит,
теперь слово будет напечатано не на экране, а записано в файл.
Папка /etc требует прав администратора для работы с ее файлами, а это значит, что
команда завершится ошибкой, если ее выполнять с правами простого пользователя.
Проблема решается использованием команды sudo:
sudo bash -c "echo 'manual' > /etc/init/mysql.override"

Фрагмент bash -c говорит о том, что нужно просто выполнить команду, которая
идет дальше в кавычках. Использование команды bash -c вызвано тем, что команда sudo не сможет работать с командой echo и перенаправить наш вывод в файл,
потому что echo — это команда не ОС, а bash.

3.2.2. GRUB2
Операционная система — когда вы включаете свой компьютер — сама по себе не
загружается. Ее запуск должен быть как-то инициализирован. Изначально самым
популярным инициализатором этой загрузки был загрузчик Linux под названием
LILO (Linux Loader), но в последнее время уже, кажется, все дистрибутивы перешли на GRUB2 (GRand Unified Bootloader, большой объединенный загрузчик, версия 2).
GRUB2 — один из самых стабильных и развитых проектов. 2-я его версия вышла
в 2012 году, а в 2019-м появилась версия 2.04, представляющая собой последнюю
стабильную версию этого загрузчика, и она включена в Ubuntu 20.04. Представьте
себе, что за 7 лет номер версии увеличился с 2.0 всего до 2.04. Это настолько развитый продукт, что новые изменения выходят очень редко.
Как уже отмечалось ранее, когда мы включаем компьютер, первым запускается
система BIOS. Ее загрузка сейчас может быть скрыта красивой картинкой с логотипом производителя, но раньше в этот момент мы обязательно видели логотип
BIOS, а по экрану бежали циферки тестирования оперативной памяти.

Tlgm: @it_boooks

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

85

Мощность GRUB2 заключается в том, что он поддерживает различные файловые
системы и даже позволяет работать с файлами без загрузки ОС. Например, для просмотра содержимого файла можно использовать команду cat, которая идентична
одноименной команде Linux.
Все, что касается программы загрузчика GRUB2, находится в каталоге /boot/grub/
или /boot/grub2/ — имя каталога зависит от дистрибутива. В последней версии
Ubuntu — это первый вариант имени. Если у вас несколько ОС, то содержимое меню, которое вы видите при старте системы, можно найти в файле /boot/grub/grub.cfg.
Конфигурационный файл /boot/grub/grub.cfg сгенерирован на основе нескольких
скриптов, и желательно его не редактировать напрямую. Если вы хотите создать
свои собственные пункты меню, то нужно обратиться к файлу /etc/grub.d/40_custom.
В папке /etc/grub.d/ вы можете редактировать любые конфигурационные файлы,
и эти изменения никуда не исчезнут. Более того, именно эти файлы являются
исходным материалом для формирования основного конфигурационного файла
grub.cfg.
Я полагаю, что по GRUB2 можно написать отдельную книгу с описанием его настроек, опасаюсь только, что она не станет популярной, потому что редактировать
файлы загрузчика приходится очень редко, а вся необходимая информация уже
есть в Интернете.
В общем, я убрал из этого издания примеры конфигурирования GRUB2 и решил
дать вам только несколько полезных ссылок:
 https://help.ubuntu.com/community/Grub2 — здесь вы найдете подробную базовую информацию о GRUB версии 2;
 https://help.ubuntu.com/community/Grub2/Passwords — здесь описывается, как
можно защитить с помощью паролей меню загрузки. Очень интересная тема,
потому что далеко не каждому пользователю можно доверить доступ к ОС прямо из загрузчика;
 http://rskl.ru/grub2/ — здесь можно увидеть реальный хороший пример настройки пароля на меню загрузчика.

3.2.3. Интересные настройки загрузки
Рассмотрим несколько файлов, которые хоть и незначительно, но влияют на загрузку:
 прежде чем появится приглашение ввести пароль, на экране отображается текстовая информация, пояснение. Чаще всего разработчик здесь пишет имя дистрибутива и его версию. Эта информация хранится в файле /etc/issue, и ее можно
изменить в любом текстовом редакторе;
 после входа в систему текстовое сообщение может выводиться тоже, но по
умолчанию оно почти всегда отсутствует. В последних версиях Ubuntu эту
функцию стали использовать достаточно оригинально и полезно — после входа
нам показывают количество свободного места на диске, свободную память
и т. д.;

Tlgm: @it_boooks

86

Глава 3

 информация, которая будет отображаться на экране после входа в систему, кон-

фигурируется через файлы из каталога /etc/update-motd.d. Здесь находится сразу
несколько файлов скриптов, и вы можете редактировать уже существующие или
создавать новые. Имена файлов имеют формат XX_filename, где XX — порядковый номер, который определяет, в каком порядке будут загружаться файлы. Потом просто следует имя. Такой же формат используется при конфигурации
GRUB2 и некоторых других программ.

3.3. Регистрация в системе
В процессе старта ОС загружает виртуальные консоли getty. Каждая из них для работы требует авторизации и запрашивает имя пользователя. Для этого на экран выводится окно приглашения. Введенное имя пользователя передается программе
login, а она, в свою очередь, запрашивает пароль.
Программа login сравнивает имя пользователя со списком имен в файле /etc/passwd,
а пароль — с соответствующей записью в файле /etc/shadow. Все пароли в этом файле хранятся только в зашифрованном виде. Поэтому для сопоставления введенный
пароль тоже шифруется и результат сравнивается с зашифрованным значением пароля в файле /etc/shadow для указанного имени пользователя.
Почему проверка происходит так сложно? Дело в том, что все пароли в файле
/etc/shadow зашифрованы необратимым алгоритмом. Это значит, что математическими методами из результата шифрования получить исходный пароль нельзя,
поэтому остается только подбор. Для подбора паролей существуют несколько
очень простых программ. Чем проще пароль и чем меньше его длина, тем быстрее
программа найдет нужный вариант. Когда пароль сложен и его длина более
8 символов, а лучше — свыше 16, то подбор отнимет достаточно много ресурсов.
Если идентификация пользователя состоялась, то программа login выполнит все
автоматически загружаемые сценарии и запустит оболочку (командную строку),
через которую и будет происходить ваша работа с системой. Если проверка прошла
неудачно, то система вернет управление консоли getty, которая снова запросит ввод
имени пользователя.
Таким образом, пока мы не пройдем авторизацию через программу login, запустить
оболочку (текстовую или графическую) невозможно — нам останется доступной
лишь консоль getty, которая умеет только запрашивать имя пользователя и передавать его программе login.
Теперь обсудим ряд проблем, которые могут возникнуть при входе в систему, и
посмотрим, как они решаются.

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

Tlgm: @it_boooks

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

87

имена пользователей требуются очень многим безобидным программам. Например,
команда ls (просмотр файлов текущего каталога) при выполнении обращается
к списку пользователей для получения имен владельцев файлов. Поскольку файл
легко прочитать любому пользователю, то и зашифрованные варианты паролей тоже оказываются всем доступны, а значит, любой хакер сможет запустить подбор
паролей и ждать заветного часа Х, когда будет найдена нужная комбинация.
Чтобы защитить пароли, во всех современных версиях Linux их прячут в файл
/etc/shadow, который доступен для чтения только администратору root. Файл
/etc/passwd остался открытым для всех, но теперь в нем уже нет паролей. Давайте
посмотрим, как выглядит файл /etc/passwd. Для примера я взял только верхние три

строки из своего файла:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

Каждая строка содержит информацию о пользователе — семь аргументов, разделенных двоеточиями. Рассмотрим каждый из них:
 имя пользователя — тот login, который вы вводите. В строке для пользователя

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

стоит бессмысленный символ х (или !!), а сам пароль в зашифрованном виде
находится в соответствующей записи файла /etc/shadow;
 следующие два параметра: уникальный идентификатор пользователя (UID) и

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

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

ся текущим после входа в систему и с которым он, войдя в систему, начинает
работать;
 последний параметр — это командный интерпретатор, который будет обрабатывать пользовательские запросы. Наиболее распространенным является интерпретатор /bin/bash. Если команды пользователя не должны выполняться, то в качестве
этого параметра устанавливается /sbin/nologin. Именно это значение введено
для записей bin, daemon и многих других, потому что под ними нельзя входить
в систему, и предназначены они только для внутреннего обеспечения безопасности определенных программ.
Теперь посмотрим на файл /etc/shadow, а точнее, только на первые его три строки —
для примера этого будет достаточно:

Tlgm: @it_boooks

88

Глава 3

root:$1$1emP$XMJ3/GrkltC4c4h/:12726:0:99999:7:::
bin:*:12726:0:99999:7:::
daemon:*:12726:0:99999:7:::

Здесь также имеется несколько параметров, разделенных двоеточиями. Нас будут
интересовать первые два: имя пользователя и пароль. По имени пользователя происходит связь записи из файла /etc/shadow с файлом /etc/password. А вот во втором
параметре уже находится настоящая зашифрованная версия пароля. Но если вместо
пароля в строке стоит звездочка, это запрещает соответствующему пользователю
интерактивную работу с системой. Например, для пользователей bin и daemon установлены именно звездочки — значит, под этими учетными записями нельзя входить на компьютер.
В последней версии Ubuntu пароль пользователя root не спрашивают, и если посмотреть на файл shadow, то здесь будет стоять вместо пароля звездочка — указатель на то, что этот аккаунт нельзя использовать для входа в систему. Можно установить пароль, и тогда вход снова будет возможен, но не стоит этого делать. Не зря
же разработчики пошли на такой шаг.

3.3.2. Забытый пароль
Что делать, если вы забыли пароль или хакер проник в систему и изменил его?
Действительно, ситуация не из приятных, но все решаемо. Если у вашей учетной
записи есть доступ к файлу /etc/shadow, то можно заняться его редактированием, а
если нет, то посмотрим, как получить к нему доступ с помощью загрузочной дискеты (или флешки, что сейчас более предпочтительно).
Загрузившись с флешки, вы должны войти в систему как root и подключить тот жесткий диск (или раздел диска), на котором находится папка /etc.Для этого нужно
выполнить команду:
/sbin/mount -w hda1 /mnt/restore

Теперь каталог /mnt/restore (желательно, чтобы он существовал до выполнения
команды) указывает на главный раздел вашего жесткого диска, а файл паролей находится в каталоге /mnt/restore/etc/shadow. Откройте этот файл в любом редакторе и
удалите пароль администратора root (просто сотрите весь текст между первым
и вторым знаками двоеточия). В моем случае получилось так:
root::12726:0:99999:7:::

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

Tlgm: @it_boooks

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

89

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

3.3.3. Модули аутентификации
Аутентификация на основе двух файлов: /etc/passwd и /etc/shadow — немного устарела и предоставляет нам слишком скудные возможности. Разработчики ядра ОС
Linux стараются исправить ситуацию с помощью добавления новых алгоритмов
шифрования, но все эти попытки чисто косметические, а нам необходимо кардинальное изменение.
Абсолютно новое решение для реализации аутентификации — PAM (Pluggable
Authentication Modules, подключаемые модули аутентификации) — предложила
компания Sun.
Преимущество модульной аутентификации заключается в том, что для ее использования не требуется перекомпиляции ядра. Существуют модули для основных методов аутентификации, таких как: Kerberos, SecureID, LDAP и др.
Конфигурационные файлы для каждого сервиса, который может использовать
PAM, находятся в каталоге /etc/pam.d. В большинстве случаев вам не придется создавать эти файлы вручную, потому что они устанавливаются во время инсталляции
программы из пакета. Но вы должны знать их структуру, чтобы можно было изменить какие-то параметры в случае необходимости.
Каждая строка в конфигурационном файле состоит из четырех полей, разделенных
пробелами:
 тип модуля, который может принимать одно из следующих значений:

• auth — модуль будет использоваться для аутентификации и проверки привилегий пользователей;
• account — модуль распределения ресурсов системы между пользователями;
• session — модуль поддержки сессии и регистрации действий пользователей;
• password — модуль проверки пароля;
 флаг, определяющий параметры модуля. Здесь можно использовать четыре зна-

чения:
• required — модуль обязателен;
• optional — необязательный;
• sufficient — достаточный;
• requisite — модуль обязателен, а в случае ошибки управление передается
приложению;
 полный путь к файлу модуля;
 аргументы модуля.

Tlgm: @it_boooks

90

Глава 3

Рассмотрим пример конфигурационного файла для FTP-сервиса, который находится в файле /etc/pam.d/ftp. Символом  здесь обозначен перенос длинной строки:
#%PAM-1.0
auth
required /lib/security/pam_listfile.so item=user sense=deny 
file=/etc/ftpusers onerr=succeed
auth
required /lib/security/pam_stack.so service=system-auth
auth
required /lib/security/pam_shells.so
account
required /lib/security/pam_stack.so service=system-auth
session
required /lib/security/pam_stack.so service=system-auth

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

3.3.4. Сложность паролей
Теперь перейдем к конфигурированию сложности самого пароля. Эта конфигурация находится в файле /etc/pam.d/common-password. В некоторых системах конфигурацию разбивают на несколько файлов — в зависимости от того, каким способом
авторизуется пользователь, и вы можете увидеть в каталоге /etc/pam.d/ сразу несколько файлов, имена которых имеют формат nnnnn-auth, где на месте nnnnn может
быть одно из следующих слов: syste, smartcard, fingerprint. То есть в зависимости от
того, каким способом авторизуется пользователь, подключается тот или иной файл
конфигурации.
У нас подопытная система Ubuntu, и у нее параметры конфигурирования сложности пароля находятся в файле /etc/pam.d/common-password. Откройте этот файл в текстовом редакторе и добавьте следующую строку:
password requisite pam_cracklib.so try_first_pass retry=3 type= ucredit=-2
lcredit=-4 dcredit=-3 ocredit=-1

Теперь разберемся, что тут написано. Для управления паролями нужно загрузить
модуль pam_cracklib.so. В качестве параметров указывается:
 ucredit — сколько букв в верхнем регистре должен содержать пароль. В моем

примере прописано 2, а, значит, в пароле как минимум должны быть две буквы
в верхнем регистре. Чтобы проще запомнить — первая буква u явно указывает
на слово upper (верх);
 lcredit — сколько строчных букв должен содержать пароль. В моем примере

прописано 3. Тут для простоты снова смотрим на первую букву l — она явно
указывает на слово lower (низ);
 dcredit — сколько цифр должен содержать пароль. Первая буква d явно проис-

ходит от слова digit;
 ocredit — сколько других символов (не букв и не цифр) должен содержать па-

роль. Я тут точно не уверен, но мне кажется, что первая буква может указывать
на слово other.

Tlgm: @it_boooks

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

91

Дефис (минус) после знака «равно» у параметров — не случайность, он действительно является частью конфигурации.
После изменения конфигурации попробуйте поменять свой пароль. Для этого просто наберите в терминале команду password. Без параметров она меняет пароль
текущего пользователя.
Если вы увидите ошибку: Module is unknown (неизвестный модуль), то ничего
страшного в этом нет, в Ubuntu по умолчанию действительно не установлен
pam_cracklib.so. Просто нужно установить его, и делается это следующей командой:
apt-get install libpam-cracklib

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

3.4. Процессы
Для того чтобы эффективно управлять своим компьютером, вы должны досконально изучить свой сервер и работающие на нем процессы. Это поможет быстро увидеть в системе какие-либо аномалии.
Процесс — это программа или ее потомок. При запуске программы создается новый процесс, в котором и работает код. Каждая программа функционирует с определенными правами. Сервисы, которые активизируются при старте системы, обладают правами root или nobody (без прав). Программы, которые выполняются из командной строки, наделены правами запустившего их пользователя, если не указан
SUID- или SGID-бит, при котором программа имеет права владельца.
Процессы могут работать в двух режимах: фоновом (background) и центральном
(foreground). Центральный режим для каждого терминала имеет только один процесс. Например, запустив по команде man ls программу для просмотра помощи, вы
не сможете выполнять другие команды, пока не выйдете из программы man. Если ни
один центральный процесс в терминале не запущен, то им является интерпретатор
команд.
У тех, кто знаком с программой Midnight Commander, может возникнуть вопрос:
а как же тогда работает mc — ведь в нем можно выполнять команды одновременно? Ответ прост — процессы могут порождать другие процессы. Это происходит и
в MC, но если его закрыть, то закроются и все порожденные процессы.

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

Tlgm: @it_boooks

92

Глава 3

В ответ на это вы не увидите файла помощи, а на экране появится только строка:
[1] 2802
После этого терминал снова готов работать, потому что центральный процесс
запустил команду man ls в фоновом режиме и свободен для выполнения новых директив.
А что же мы увидели в ответ на выполнение команды? В квадратных скобках показан порядковый номер фонового процесса, который мы запустили. Номера будут
последовательно увеличиваться. В нашем случае это первая команда, поэтому
в квадратных скобках стоит единица. Номер фонового процесса формируется для
каждого пользователя. Если войти в систему через второй терминал и запустить
какой-либо фоновый процесс, то вы увидите примерно следующее:
[1] 2805
В квадратных скобках опять число 1, а вот следующее значение отличается от выведенного на первом терминале. Это PID (Process ID, идентификатор процесса)
созданного процесса, который является уникальным для всех пользователей. Это
значит, что если вы запустили процесс с номером 2802, то другой пользователь никогда не сможет запустить процесс с таким же идентификатором, по крайней мере
до рестарта системы. Его PID будет другим.
Запомните идентификаторы, которые вы увидели, впоследствии они нам пригодятся.
Чтобы узнать, какие процессы у вас запущены, выполните команду jobs. В ответ на
это вы получите:
[1] + Stopped man ls
Здесь мы видим, что процесс с номером [1] загружен в память, и состояние команды man ls — Stopped (остановлен).
Какой смысл в том, что мы отправили просмотр файла помощи в фоновый режим?
Я не зря выбрал эту команду, потому что в этом есть резон. Вы в любой момент
можете сделать фоновый режим основным. Для этого необходимо ввести команду
fg %1, где число 1 указывает номер вашего процесса, который вы видели в квадратных скобках. Попробуйте сейчас выполнить эту команду, и перед вами откроется
запущенная программа man, отображающая файл помощи по использованию команды ls.
Раз процесс можно сделать центральным, значит, можно поступить и наоборот. Чтобы вернуть процесс в фоновый режим, нажмите комбинацию клавиш + —
перед вами снова появится командная строка. Выполните команду jobs, чтобы убедиться, что команда man ls все еще работает.
Если в программе есть возможность выполнять системные команды, то вместо сочетания клавиш + можно выполнить команду bg %1. Число 1 — это снова номер процесса.

Tlgm: @it_boooks

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

93

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

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

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

Затем сразу же запустите команду jobs. Вы должны увидеть на экране сообщение
типа:
[1] + Terminated man ls
После повторного вызова команды jobs программы man больше не будет.
Если вы хотите завершить работу процесса, который запущен не вами, но вы знаете
его PID, то нужно выполнить команду:
kill n

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

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

TIME CMD
00:00:00 bash
00:00:00 ps

Tlgm: @it_boooks

94

Глава 3

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

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

PID %CPU %MEM
1 0.0 0.1
2 0.0 0.0
3 0.0 0.0
5 0.0 0.0
6 0.0 0.0
7 0.0 0.0
530 0.0 0.1
550 0.0 0.2

VSZ
1376
0
0
0
0
0
1372
1516

RSS
452
0
0
0
0
0
436
540

TTY
?
?
?
?
?
?
?
?

STAT
S
SW
SW
SW
SW
SW
S
S

START
14:25
14:25
14:25
14:25
14:25
14:25
14:25
14:25

TIME
0:05
0:00
0:00
0:00
0:00
0:00
0:00
0:00

COMMAND
init
[keventd]
[kapmd]
[kswapd]
[bdflush]
[kupdated]
klogd -x
portmap

Колонка STAT показывает состояние процесса. Здесь можно встретить следующие
коды:
 S (Sleeping) — спящий, это нормальное состояние для сервисов, которые просы-

паются только на редкие запросы клиентов;
 R (Runnable) — исполняемый в текущий момент;
 T (Traced or Stopped) — в состоянии отладки или остановлен;
 Z (Zombied) — зависший. Такие процессы можно смело «убивать»;
 W — не имеет резидентных страниц;
 < — обладает высоким приоритетом;
 N — имеет низкий приоритет.

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

Tlgm: @it_boooks

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

95

Чтобы увидеть, чем в настоящий момент занимаются другие пользователи, можно
выполнить команду w. В результате вы получите на экране приблизительно такую
картину:
10:59am up 37
USER
TTY
root
tty1
flenov tty2

min,
FROM
-

2 users,

load average: 0.00, 0.00, 0.00
LOGIN@
IDLE
JCPU
PCPU WHAT
10:24am 0.00s 0.82s 0.05s w
10:39am 8:13
0.85s 0.03s grotty

Из этого примера понятно, что в системе находятся два пользователя. На первом
терминале работает пользователь root, а на втором — flenov. Очень удобно определять по списку, когда пользователь вошел в систему (колонка LOGIN@) и что он
делает в настоящее время (колонка WHAT).
Посмотрите на столбцы JCPU и PCPU — по ним можно оценить загрузку системы.
Если ваш компьютер начал работать слишком медленно, то эти столбцы покажут,
какой процесс отнимает много процессорного времени.
Команда ps выводит статическую информацию. Для наблюдения за нагрузкой системы удобнее использовать команду top. Она отображает список процессов, отсортированный по убыванию в зависимости от нагрузки (рис. 3.2). Здесь вы можете
увидеть, какой сервис или программа отнимают драгоценные ресурсы и не дают
нормально работать с компьютером.

Рис. 3.2. Результат работы команды top

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

Tlgm: @it_boooks

96

Глава 3

В верхней строке окна (см. рис. 3.2) выводится количество пользователей, общая
загрузка системы и статистика процессов: общее количество, спящие, выполняемые, зависшие и остановленные.
Помимо этого, там можно увидеть краткий отчет по использованию памяти: количество занятой и свободной оперативной памяти и размер раздела подкачки. В моем случае виртуальной машине выделен гигабайт памяти, и из них свободно чуть
более 300 мегабайт, а раздел подкачки пока не используется (см. первую и вторую
колонки строки KiB Mem). Почему так мало свободной памяти — ведь часто можно услышать, что Linux потребляет очень мало ресурсов? Дело в том, что реально
использовано только 113 460 байтов (примерно 100 мегабайт — это третья колонка). Все остальное — кэшированные данные для повышения производительности
системы (четвертая колонка).
Вторая строка цифр (KiB Swap) — это файл подкачки. Чем меньше компьютер использует swap-раздел/файл, тем быстрее он работает. Конечно, пока что этот раздел
практически не используется, но если перейти в графический режим и запустить
пару мощных приложений, то и swap-раздела не хватит. Но для этого виртуального
сервера я даже не устанавливал графической оболочки, поэтому выделенного гигабайта хватает.
Программа top будет обновлять информацию о загрузке процессора с определенным интервалом времени. Для выхода из программы нажмите комбинацию клавиш
+.

3.4.4. «Зомби»: поиск и устранение
В системе иногда появляются «умершие» процессы — «зомби». Я часто применяю
Linux для запуска различных задач, по расписанию используя команду cron или
просто скрипты, которые бесконечно работают в цикле и выполняют задачи в определенное время. ОС Linux в этом отношении удобна и достаточно надежна, но
далеко не всегда надежны ее приложения.
Из личного опыта — очень часто возникают проблемы с программой rsync. Она
синхронизирует файлы между двумя хранилищами, которые могут находиться на
разных компьютерах. С помощью rsync достаточно просто реализовать синхронизацию кода на серверах для веб-серверов. Это одна из задач, которую регулярно
для меня решает Linux. Однако rsync постоянно виснет. Решение — запускать его
в виде демона. Став демоном, он работает отлично и пока у меня ни разу не зависал, но это уже отдельная тема.
Но вернемся к «зомби». Итак, у меня скрипты работают в постоянном режиме и
создают новые процессы (дочерние), которые выполняют какие-то работы. Иногда
бывает так, что дочерний процесс завершил свою работу, а родительский не видит
этого и считает, что дочерний все еще работает. В системе образуются как бы
«зомби» — которые не видят, что «тело уже умерло», и продолжают «дышать» и
использовать ресурсы.

Tlgm: @it_boooks

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

97

У меня все родительские процессы записывают себя в журнал в основном скрипте.
Я знаю их ID, но не знаю, какой именно из дочерних завис или превратился в «зомби». Команда ps далеко не всегда показывает правильно такие проблемы.
В таких случаях я выполняю команду:
ps –al

Эта команда выводит подробную информацию о выполняющихся сейчас процессах:
UID
0
501
0

PID
702
703
8510

PPID
339
702
703

F
4106
4006
4106

CPU
0
0
0

PRI
33
31
31

NI
TTY
0 ttys000
0 ttys000
0 ttys000

TIME
0:00.05
0:00.08
0:00.01

CMD
login -bash
ps -al

Самыми важными здесь являются вторая и третья колонки: PID (process ID) и PPID
(parent process ID). Во второй строке в колонке PPID записано 702. Это значит, что
процесс в этой строке является дочерним для процесса с PID, равным 702. Этот
процесс можно увидеть в первой строке. Третья строка является дочерней для второй. То есть третий процесс — самый низший в иерархии.
Когда процессов много, то сразу так иерархию построить не получится. В этом
случае можно фильтровать вывод с помощью следующей команды:
ps –al | grep XXX

Здесь вы видите две команды, разделенные вертикальной чертой. Первая команда
слева:
ps -al

показывает подробную информацию о всех процессах. Вторая:
grep

фильтрует вывод. И при этом показывает на экране только те строки, в которых
есть текст XXX. В качестве этого XXX нужно указать ID родительского процесса.
Таким путем я иду от родительского процесса к дочерним и ищу самый последний
из них. Когда нахожу последний, его и «убиваю» командой kill. Если не помогает,
то «убиваю» предпоследний. Очень часто «убийство» последнего процесса не помогает, потому что он обычно уже реально не работает, а просто висит как фантом.
А вот когда я «убиваю» предпоследний, то это видит вся цепочка дерева иерархии
процессов.

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

Tlgm: @it_boooks

98

Глава 3

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

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

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

В ответ на это появится приглашение для ввода команд:
at>
Введите необходимые инструкции. Например, для удаления пользователя необходимо выполнить команду userdel и стереть соответствующий каталог:
userdel tempuser
rm —fr /home/tempuser

Подробнее об управлении пользователями мы узнаем в главе 4, а сейчас нужно довериться мне и просто использовать эти команды. Конечно же, в вашей системе
сейчас нет пользователя tempuser, и команда не отработает, но нас интересует сам
факт ее запуска в указанное время.
Наберите эти команды, в конце каждой из них нажимая клавишу . Для завершения ввода используйте комбинацию клавиш +. В ответ на это вы
должны увидеть текстовое сообщение, содержащее дату и время, в которое будет
выполнена команда, а также идентификатор задания. Сообщение будет выглядеть
примерно следующим образом:
Job 1 at 2005-03-03 12:50

Tlgm: @it_boooks

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

99

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

2005-01-28 12:40 a root
2005-01-28 01:00 a root
2005-01-30 12:55 a root

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

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

День недели указывается числом от 0 до 7. На воскресенье указывают 0 и 7. Это
сделано именно так, потому что в различных странах по-разному определяется начало недели: где-то с понедельника, а где-то с воскресенья. В первом случае удобно
выставлять значения от 1 до 7, в другом — от 0 до 6.
Если какой-либо параметр не имеет значения, то вместо него необходимо поставить звездочку.
Теперь рассмотрим несколько примеров:
00 5 * * * /home/flenov/backup1_script

Tlgm: @it_boooks

100

Глава 3

Здесь заполнены только часы и минуты. Так как остальные параметры не указаны,
то команда будет выполняться ежедневно в 5 утра, вне зависимости от дня недели,
числа или месяца.
00 20 * * 1 /home/flenov/backup2_script

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

Такая команда будет выполняться каждый час ровно в 00 минут.
В НИМАНИЕ !
Если вы запустите программу crontab и, не введя команд, нажмете комбинацию клавиш +, то все предыдущие задания сотрутся. Будьте внимательны — для
выхода из программы без сохранения используйте только комбинацию +.

Помимо этого, у сервиса cron есть несколько дополнительных каталогов, упрощающих создание расписаний. Можно распределить выполняемые сценарии по
каталогам:
 /etc/cron.hourly — ежечасно;
 /etc/cron.daily — ежедневно;
 /etc/cron.weekly — еженедельно;
 /etc/cron.monthly — ежемесячно.

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

*
4
4
4

*
*
*
1

*
*
*
*

*
*
0
*

root
root
root
root

run-parts
run-parts
run-parts
run-parts

/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

В начале строки указывается время выполнения. Вы можете изменить его так, что
сценарии из каталога /etc/cron.monthly начнут выполняться ежечасно. Так что названия чисто символические и только по умолчанию. Они легко меняются.
Обратите также внимание, что в этих каталогах уже есть сценарии, и все ненужные
можно убрать, чтобы излишне не нагружать систему, или запланировать их выполнение на другое время.
Чтобы просмотреть список существующих заданий, выполните команду crontab
с параметром -l. Для редактирования уже созданных записей выполните команду
crontab с параметром -e. В ответ на это запустится текстовый редактор, в котором
можно корректировать записи.
Кстати, если вы не работали с этим редактором, то могут возникнуть проблемы,
потому что он достаточно специфичный. Тогда нажмите клавишу и воспользуйтесь справкой. Команды тоже вводятся необычно. По выходе из этого редактора

Tlgm: @it_boooks

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

101

изменения вступают в силу мгновенно, а чтобы закончить работу без сохранения
изменений, наберите :q! и нажмите клавишу .
В принципе все задания cron хранятся в текстовом виде. Для каждого пользователя
формируется свой crontab-файл в каталоге /var/spool/cron. Имя созданного файла
совпадает с именем пользователя.
Вот пример содержимого crontab-файла:
#DO NOT EDIT THIS FILE - edit the master and reinstall.
#(- installed on Thu Jan 27 13:55:49 2005)
#(Cron version--$Id:crontab.c,v2.13 1994/01/17 03:20:37 vixie Exp $)
10 * * * * ls

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

3.5.3. Безопасность запланированных работ
Напоследок хочется добавить в бочку преимуществ команды at ложку дегтя. Эту
команду можно использовать и не в очень благих целях. Например, хакер может
завести учетную запись с максимальными правами. Затем настроить команду at
так, чтобы после выхода она удаляла запись и чистила следы его пребывания в системе.
В каталоге /etc имеются два файла, которые вы должны настроить:
 at.allow — по умолчанию этого файла может и не быть. Если он существует, то

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

доступ к команде at.
Подобные файлы есть и для сервиса cron:
 cron.allow — здесь описываются пользователи, которые могут работать с зада-

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

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

Tlgm: @it_boooks

102

Глава 3

Если вы не запускаете планировщики at и cron, то я рекомендую убрать сервис
crond из автозапуска, а лучше даже вовсе удалить его с сервера. Вы не сможете
контролировать то, чем не пользуетесь, потому что не будете обращать на это внимание.
В каталоге /etc имеется файл crontab, в котором находятся все настройки сервиса
cron. Я рекомендую внести в начало этого файла следующую директиву:
CRONLOG=YES

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

3.6. Настройка сети
В Linux сеть является одним из основных компонентов. Даже если у вас нет подключения к Интернету, будет установлено локальное сетевое окружение, и сетевые
функции станут использоваться некоторыми сервисами.
Графическая система Linux построена по клиент-серверной архитектуре. Журналирование также построено по сетевому принципу. Если запустить программу
ifconfig, то она покажет хотя бы одно работающее сетевое устройство с адресом
127.0.0.1. Этот интерфейс используется системой для общения с самой собой. Плохо, когда говорит сам с собой человек, а когда это делает компьютер — это нормально и даже хорошо.
Ubuntu серверной версии перестал включать эту утилиту в установку по умолчанию, потому что она устарела, поэтому ее придется поставить командой:
sudo apt installet-tools

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

3.6.1. Адресация
Основным для Linux является ставший стандартом для Интернета протокол TCP/IP
(Transmission Control Protocol / Internet Protocol, протокол управления передачей /

Tlgm: @it_boooks

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

103

протокол Интернет) версии 4, который уже установлен, и достаточно его только
настроить. Если вы еще не встречались с этим протоколом, то советую прочитать
соответствующую книгу по этой теме.
Несмотря на то что уже постепенно пытаются вводить TCP/IP версии 6, эта версия
до сих пор не получила достаточной популярности. Мы не сможем здесь затронуть
все нюансы TCP/IP, а остановимся только на базовых понятиях.
Для того чтобы сеть работала, нам необходимо как минимум настроить следующие
параметры:
 указать адрес — каждое устройство в сети должно иметь свой адрес. Без этого

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

называемый маской подсети, позволяющий разбить сеть на более мелкие сегменты (узлы). Из чего состоит ваш домашний адрес? Это город, улица и дом.
Сеть имеет только две характеристики: номер сети и номер компьютера внутри
нее. Маска определяет, какая часть в IP-адресе относится к сети, а что характеризует компьютер.
Для примера рассмотрим маску 255.255.255.0. Чтобы понять назначение маски,
необходимо каждое число перевести в двоичную систему. Маска 255.255.255.0
в бинарном виде выглядит так:
11111111.11111111.11111111.00000000

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

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

Tlgm: @it_boooks

104

Глава 3

А вот такая — ошибочной (справа от нулей не может быть единиц):
11111111.11111111.00000000.11111111

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


192.168.001.001 —

IP-адрес;



255.255.000.000 —

маска подсети.

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

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

Link encap:Ethernet HWaddr 00:03:FF:06:A4:6C
inet addr:192.168.77.1 Bcast:192.168.77.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:108 errors:0 dropped:0 overruns:0 frame:0
TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:7687 (7.5 Kb) TX bytes:14932 (14.5 Kb)
Interrupt:11 Base address:0x2000

lo

Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:122 errors:0 dropped:0 overruns:0 frame:0
TX packets:122 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9268 (9.0 Kb) TX bytes:9268 (9.0 Kb)

Tlgm: @it_boooks

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

105

Как видите, в листинге 3.1 показано два интерфейса: eth0 и lo:
 первый из них — это реальная сетевая карта, имя которой в общем виде имеет
вид ethX, где X — число, означающее номер устройства связи в системе. Нумерация начинается с нуля. Если у вас в компьютере две сетевые карты, то их имена будут eth0 и eth1;
 второй интерфейс имеет имя lo (loopback), IP-адрес 127.0.0.1 и маску 255.0.0.0.

Такой интерфейс существует в любой системе с сетевой картой и имеет именно
этот IP. В принципе этот адрес ни на что не указывает и не входит ни в какую
сеть. Его часто используют для тестирования и отладки сетевых приложений.
Две разные программы могут обмениваться информацией с помощью сетевого
протокола внутри одной ОС, не выходя за пределы компьютера, и это будет
происходить через интерфейс loopback. Этот интерфейс часто называют петлей,
потому что он замыкается на себя. Все пакеты, которые отправляются на этот
адрес, посылаются вашему компьютеру.
Помимо сведений о конфигурации сетевых интерфейсов, команда выдает еще много полезной информации — например, количество отправленных и полученных
пакетов (параметры RX и TX).
Есть еще один интересный адрес, который можно увидеть у сетевой карты eth0, —
параметр HWaddr (Hardware Address, аппаратный адрес). Его еще часто называют
MAC-адресом (Media Access Control, управление доступом к среде). Это 48-разрядный серийный номер сетевого адаптера, присваиваемый производителем. Он
уникален, потому что у каждого изготовителя свой диапазон адресов. Поскольку
интерфейс lo создан программно (реально не существует), у него не может быть
аппаратного адреса.

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

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

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

 up — включить интерфейс, если он был остановлен. Например, если вы хотите

восстановить работу сетевой карты eth0, выполните команду:
ifconfig eth0 up

Tlgm: @it_boooks

106

Глава 3

 IP-адрес — если вы хотите изменить IP-адрес, то укажите его новое значение

в качестве параметра. Например, если нужно поменять текущий адрес на
192.168.77.3, то выполните команду:
ifconfig eth0 192.168.77.3

Можно одновременно изменить и маску сети. Для этого выполняем директиву:
ifconfig eth0 192.168.77.3 netmask 255.255.0.0

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

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

3.6.4. Утилита ip
Подготавливая это издание, я уже задумался о том, чтобы удалить предыдущие два
раздела, но ограничился только написанием этого. Дело в том, что утилита ifconfig
устарела, и из некоторых дистрибутивов ее уже начали убирать. Убрали ее как раз
из CentOS и Ubuntu, так что информация о ifconfig в этом издании осталась только
на случай, если вы работаете со старой версией дистрибутива, и в следующем издании я, скорее всего, ее уберу совсем.
Для получения информации об IP-адресах используется утилита ip. Логично, не
правда ли? То же самое, что делает ifconfig, мы можем узнать, выполнив команду:
ip addr

Если выполнить эту команду с параметром link, можно увидеть состояние сетевых
интерфейсов:
ip link

В моем случае результат был получен такой:
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
mode DEFAULT group default qlen 1000
2: enp0s3 mtu 1500 qdisc fq_code1
state UP mode DEFAULT group default qlen 1000

Второй интерфейс — это сетевой интерфейс виртуальной машины, который работает как сетевая карта.
Добавить IP-адрес к сетевому интерфейсу можно с помощью параметров addr ad:
ip addr add 10.0.2.10/24 dev enp0s3

Команду эту нужно запускать с правами администратора. Параметр dev указывает
на то, к какому сетевому интерфейсу я хочу добавить IP-адрес (в моем случае это
enp0s3).

Tlgm: @it_boooks

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

107

Чтобы удалить адрес, просто заменяем add на del:
ip addr del 10.0.2.10/24 dev enp0s3

Сетевой интерфейс можно отключить и включить, и для этого используется команда link set up/down:
ip link set enp0s3 down
ip link set enp0s3 up

Команда в первой строке отключит сетевой интерфейс enp0s3, а во второй строке
я включаю его.
Этой же командой можно установить значение MTU (от него зависит производительность сетевого интерфейса):
ip link set enp0s3 mtu 1500

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

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

Эта команда меняет имя хоста, но такое изменение потеряет силу после перезагрузки компьютера.
Чтобы поменять имя хоста и сразу сохранить его в файле, можно использовать
команду hostnamectl. Если запустить эту команду без параметров, то можно будет
увидеть текущееимя и немного информации о самом компьютере:
Static hostname: mflubuntu
Icon name: computer-vm
Chassis: vm
Machine ID: e27e96237 . . .
Boot ID: a343234423222 . . .
Virtualization: kvm
Operation System: Ubuntu 18.04 LTS
Kernel: Linux 4.15.0-20-generic
Architecture: x86-64

Давайте попробуем поменять имя хоста:
hostnamectl set-hostname srv.flenov.info

Ключ set-hostname указывает на то, что мы хотим поменять имя компьютера на
srv.flenov.info. Эту команду не обязательно запускать из-под администратора.

Tlgm: @it_boooks

108

Глава 3

3.6.6. Протокол IPv6
О протоколе IPv6 заговорили очень давно. Просто текущая версия интернетпротокола IPv4 максимально поддерживает четыре миллиарда уникальных адресов,
но этого в действительности уже не хватает. На планете Земля сейчас живет более
семи миллиардов человек. Даже если у каждого человека будет по одному устройству, подключенному к Интернету, всем адресов не хватит.
Да, не у всех есть устройства, работающие с сетью, но много людей, имеюших
смартфон, планшет и еще хотя бы один компьютер. Веб-сайты в Интернете также
нуждаются в адресах. Если бы всем раздавали уникальные интернет-адреса, то их
уже давно не хватило бы на всех. Вместо этого целые сети и сайты делят один и тот
же IP-адрес между собой.
Работать над новой версией интернет-протокола начали уже очень давно. Сейчас
взглянул в Википедию, и там говорится, что первая версия нового IPv6 появилась
еще в 1998 году. Как быстро время летит... А стандартом этот новый протокол стал
только в 2017-м. И несмотря на наличие стандарта, переход на IPv6 происходит
слишком медленно, но он идет. И если он закончится, то всем хватит уникальных
адресов, даже каждому чайнику и кофеварке.
С технической точки зрения IPv4 использует 32-битный адрес, а 6-я версия — 128битный. Если в привычной нам системе IPv4 адрес состоит из 4 чисел от 0 до 255,
разделенных точками, то в новом стандарте — 8 групп шестнадцатеричных чисел,
разделенных двоеточиями. Взглянем на простой пример:
fe80:0db8:0000:0000:0000:ff00:0042:8329

Здесь аж три блока, в которых все четыре числа равны нулю, — в таком случае эту
группу блоков можно опустить и записать адрес так:
fe80:0db8::ff00:0042:8329

Обратите внимание, что все три нулевые группы удалены, и по такой записи можно
догадаться, что недостающие группы — как раз нулевые. А если у нас вот такой
адрес?
fe80::ff00::8329

Здесь дважды присутствует двойное двоеточие, и как узнать, сколько групп опущено в первом случае и сколько во втором? Из 8 полагающихся групп мы видим только три, значит, здесь было 5 нулевых. Все очень просто — в IPv6-адресе может
быть только одно сокращение в виде двойных кавычек, так что адрес с двумя сокращениями некорректный.
В старом стандарте IPv4 для указания локального компьютера используется адрес
127.0.0.1. В IPv6 ту же самую функцию выполняет адрес ::1. И так как вначале идут
два двоеточия, значит, перед 1 целых семь групп из нулей — ведь всего групп
должно быть 8. Вспоминаем команду ip addr, в результате выполнения которой
для loopback-интерфейса lo в выводе будут два адреса:
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host

Tlgm: @it_boooks

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

109

У 6-й версии тоже есть разделение адреса на сеть и хост в этой сети, и разделение
указывается так же — с помощью числа после слэша:
fe80:0db8::ff00:0042:8329/64

Число после слэша указывает на то, что первые 64 бита в этом адресе определяют
адрес сети. Оставшиеся — это адрес компьютера.
Если IPv6-адрес выдан провайдером, то первые четыре числа будут 2001. Если это
автоматически назначенный сетевой карте адрес, то он будет начинаться с fe80.
Для тестирования соединения по IPv6 нужно использовать версию ping6:
ping6 -I eth0 fe80:0db8::ff00:0042:8329

3.7. Работа с модулями ядра
Система должна загружаться только с теми модулями, которые применяются. Все
остальные следует подгружать по мере необходимости и отключать, когда они не
используются.
В разд. 3.2 мы уже рассматривали процесс загрузки сервисов, но модули ядра —
это немного другое. Они выполняются на более низком уровне, который в основном позволяет работать с устройствами, управлять памятью и т. п. При модульной
компиляции вы можете включать и выключать функции уровня ядра с помощью
следующих команд:
 lsmod — эта команда выведет список загруженных модулей. Результат ее вы-

полнения имеет примерно следующий вид:
Module
binfmt_misc
autofs
tulip
ipchains
ide-cd
cdrom
ext3
jbd

Size
7428
11812
42240
42216
30240
32000
62284
39804

Used by
Not tainted
1
0 (autoclean) (unused)
1
6
0 (autoclean)
0 (autoclean) [ide-cd]
1
1 [ext3]

 modinfo — очень трудно разобраться, какие модули нужны в системе, а какие

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

Tlgm: @it_boooks

110

Глава 3

В ответ на это мы увидим примерно следующее:
filename: /lib/modules/2.4.18-5asp/kernel/fs/ext3/ext3.o
description: "Second Extended Filesystem with journaling extensions"
author:
"Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger,
Theodore Ts'o and others"
license:
"GPL"
parm:
do_sync_supers int, description "Write superblocks
synchronously"

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

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

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

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

3.8. Переменная $PATH
В Linux имеется переменная $PATH, определяющая папки, в которых нужно искать
исполняемые программы. Чтобы просмотреть текущее значение этой переменной,
нужно выполнить команду:
echo $PATH

В результате вы должны увидеть список папок, разделенных двоеточиями:
/usr/local/bin:/bin:/usr/bin

Соответственно, когда мы отдаем в командной строке команду ls, то система находит ее исполняемый файл в каталоге /bin и запускает его.
При запуске программ из командной строки Linux нужно обязательно указывать ./
перед именем программы или скрипта. Например, допустим, что в текущем каталоге есть исполняемый файл publish — тогда для его запуска нужно в консоли выполнить следующую команду:
./publish

В Windows и в Linux точка указывает на текущий каталог, а, значит, приведенная
команда просит запустить publish именно из текущего каталога. Впрочем, в Win-

Tlgm: @it_boooks

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

111

dows при запуске программ из текущего каталога можно ничего не указывать, потому что эта ОС сначала ищет файлы в текущей папке, а потом уже в системных.
Но из-за этого у Windows были проблемы с безопасностью.
ОС Linux ведет себя немного иначе, и из текущего каталога по умолчанию ничего
не запускает, а ищет в папках, указанных в переменной $PATH.
Linux можно заставить «смотреть» и в текущую папку — просто для этого точку
нужно добавить в переменную $PATH:
PATH = $PATH:.

Не уверен, что в реальности делать что-то подобное — хорошая идея. Но я привел
этот пример, для того чтобы показать, как добавлять папку к переменной $PATH.
Если у вас есть программа /usr/local/myprogram/publish и вы не хотите при каждом
запуске писать этот полный путь, то можно добавить путь /usr/local/myprogram/
в переменную $PATH:
PATH=$PATH:/usr/local/myprogram/

Смысл этой команды в том, что мы присваиваем переменной новое значение, которое состоит из уже существующего, плюс двоеточие и новая папка. Если просто
написать:
PATH=/usr/local/myprogram/

то текущее значение $PATH будет потеряно, и теперь $PATH станет равна лишь
/usr/local/myprogram/.

Tlgm: @it_boooks

112

Глава 3

Tlgm: @it_boooks

ГЛАВА

4

Управление доступом

Каждый пользователь должен работать в системе под своей учетной записью. Это
позволит ему обезопасить свои файлы от чужого вмешательства, по системным
журналам определить, когда и кем были произведены некорректные действия,
и т. д.
Обычному пользователю вы должны выделять ограниченные права, которые позволят ему выполнять только необходимые действия. Кроме того, следует минимизировать количество пользователей с большими привилегиями. Некоторые считают, что в Linux только один администратор root, но это не так. Root — это лишь
имя, а администраторов может быть очень много.
Если вы являетесь администратором на предприятии, то должны следить за актуальностью записей. При увольнении сотрудника необходимо удалить его учетную
запись, чтобы — недовольный увольнением — он не уничтожил важные данные.
Я в своей недолгой работе администратора уже встречался с такими фактами.
Для работы с командами управления доступом вы должны обладать правами администратора, поэтому входить в систему вам надо как пользователю root или использовать команду su или sudo.
А теперь перейдем к сути проблемы.

4.1. Права доступа
Давайте вспомним команду ls -al. Она возвращает список файлов в следующем
виде:
drwx-----drwxr-xr-x
-rwxr-xr--

3 Flenov
5 root
1 Flenov

FlenovG
root
FlenovG

4096 Nov 26 16:10 .
4096 Nov 26 16:21 ..
24 Nov 26 16:10 test

Как мы уже знаем, первая колонка (занимает 10 символов) — это права доступа.
Давайте рассмотрим, из чего она состоит. Первый символ указывает на тип записи.
Здесь может находиться одно из следующих значений:

Tlgm: @it_boooks

114

Глава 4

 дефис (-) — обычный файл;
 буква d — каталог;
 буква l — символьная ссылка;
 буква s — сокет;
 буква p — файл FIFO (First In, First Out — первый вошел, первый вышел).

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

Каждая такая группа состоит из трех символов: r (чтение), w (запись) и x (выполнение). Наличие буквы говорит о разрешении соответствующего действия.
Вернемся к нашему примеру. Первая строка содержит права доступа: drwx------.
Первый символ d — значит, это каталог. Потом идут три символа rwx — т. е. хозяин
файла может читать, записывать и исполнять каталог. Вместо остальных шести
символов стоят знаки дефиса — значит, ни у пользователей группы FlenovG, ни
у всех остальных никаких прав нет.
Вторая строка: drwxr-xr-x. Это снова каталог. Далее следует тройка символов:
rwx — значит, владельцу разрешены все операции. Следующая тройка, соответствующая группе, равна: r-x, а стало быть, возможны чтение и исполнение, но не запись. Последняя тройка: r-x — показывает, что всем остальным пользователям
также доступны только чтение и исполнение.
Последняя строка в примере содержит права доступа -rwxr-xr-- для файла (первый
символ — дефис). Хозяин файла имеет к нему полный доступ (первая тройка: rwx).
Пользователи группы могут читать и выполнять файл, но не могут его изменять
(вторая тройка: r-x). Все остальные могут только читать файл (последняя тройка:
r--).
Права можно задавать и последовательностью нулей и единиц. Если в определенном месте стоит 1 (указан один из символов r, w или x), то операция разрешена, а
если 0 (указан дефис) — действие запрещено. Давайте попробуем записать права
rwxr-xr-- в виде нулей и единиц. Запишите вместо букв единицы, а вместо дефисов — нули. Должно получиться 111101100. Разобьем эту комбинацию на три части: 111, 101 и 100. Теперь каждую тройку переведем в восьмеричную систему по
следующей формуле:
Цифра1 * 4 + Цифра2 * 2 + Цифра3

У нас получатся три цифры: 7, 5 и 4, которые можно рассматривать как десятичное
число 754. Запомните его, оно нам пригодится при назначении прав на файлы и каталоги. Чтобы вам в дальнейшем было проще регламентировать доступ, предлагаю
все возможные варианты значений для отдельного разряда числа:

Tlgm: @it_boooks

Управление доступом

115

 0 — запрещено все;
 1 — разрешено выполнение;
 2 — разрешена запись;
 3 — разрешены запись и выполнение;
 4 — разрешено чтение;
 5 — разрешены чтение и выполнение;
 6 — разрешены чтение и запись;
 7 — разрешено все.

Попробуйте теперь с помощью этого списка определить возможности, которые
предоставляет число 754. Каждый разряд нужно рассматривать в отдельности.
Сравните полученный результат с символьным представлением rwxr-xr--, из которого мы получили с помощью перевода число 754. Должно выйти одно и то же.
Если все получилось, значит, мы можем поднять стакан компота за здравие тех
умных людей, которые придумали такую простую и удобную систему распределения прав. Да, она не идеальна, но вполне работоспособна.
В НИМАНИЕ !
Для того чтобы иметь право создавать или удалять файлы, необходимо иметь разрешение на запись в каталог. Это немного сбивает начинающих пользователей с толку,
поскольку им бывает непонятно, почему при наличии всех прав на файл его нельзя
удалить.

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

4.1.1. Назначение прав
Для изменения режима доступа к объектам файловой системы служит команда
chmod. С ее помощью можно устанавливать новые права на объект как в символьном (применяется для изменения относительно текущего состояния), так и в числовом виде (абсолютное задание). Для начала рассмотрим символьный режим:
chmod параметры права файл

Компонент параметры может включать комбинацию следующих значений:
 u — изменить права владельца;
 g — изменить права группы;
 o — изменить права остальных пользователей;
 a — изменить все права (то же самое, что передать значение: ugo).

Перед указанием прав можно задать режим их изменения относительно существующих:

Tlgm: @it_boooks

116

Глава 4

 + — добавить;
 - — удалить;
 = — заменить новыми (старые значения будут уничтожены).

После этого устанавливается режим доступа:
 r — чтение;
 w — запись;
 x — выполнение;
 X — выполнение, если файл является каталогом или уже имеет аналогичные

права для какого-либо пользователя;
 S — SUID- или SGID-бит (см. разд. 4.5);
 t — sticky-бит. В этом случае только владелец файла и каталога сможет удалить

его (см. разд. 4.4);

 u — всем пользователям, как и у владельца;
 g — всем пользователям, как и у группы;
 o — всем пользователям, как и у остальных пользователей.

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

Права передаются в виде восьмеричного числа из четырех разрядов:
 первый разряд определяет дополнительный бит и может принимать одно из значений:
• 1 — бит принадлежности;
• 2 — бит SGID;
• 4 — бит SUID.
Если дополнительные биты устанавливать не надо, этот разряд можно опустить;
 второй разряд определяет права пользователя — это может быть число от 0 до 7
включительно;
 третий разряд определяет права группы — это снова может быть число от 0 до 7;
 четвертый разряд определяет права остальных пользователей. Как вы думаете,
какие значения может принимать параметр? Ну конечно же, от 0 до 7.
Например, мы хотим, чтобы владелец и группа имели все права (число 7) на файл
text, а остальные пользователи могли его только выполнять (число 1).
Команда будет выглядеть следующим образом:
chmod 771 text

Число 771 в символьном виде соответствует правам: rwxrwx--x.
Следующая команда отменит возможность чтения файла у группы:
chmod g-r text

Tlgm: @it_boooks

Управление доступом

117

После этой команды права доступа на файл станут: rwx-wx--x.
Теперь давайте запретим для всех запуск файла. Для этого можно выполнить
команду:
chmod ugo-x text

или
chmod a-x text

После наших манипуляций права доступа на файл станут: rw--w----.

4.1.2. Владелец файла
Для изменения владельца файла существует команда chown:
chown имя файл

Через параметр имя определяется пользователь, которому нужно передать права на
указанный файл. Например, давайте сделаем владельцем файла test администратора
root. Для этого нужно выполнить следующую команду:
chown root test

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

Здесь задается имя группы, которой предоставляются права на указанный файл.
Например, для файла test укажите группу администратора root, отдав команду:
chgrp root test

С помощью команды chown можно убить сразу двух зайцев и изменить и пользователя, и группу одной командой — для этого группу нужно указать через двоеточие
после имени пользователя:
chown mflenov:web test

Мне по работе довольно часто приходится менять владельца сразу всех объектов в
каталоге, и для этого можно использовать ключ -R:
chown _www:staff /etc/www/website

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

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

Tlgm: @it_boooks

118

Глава 4

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

4.1.4. Права по умолчанию
Когда пользователь создает новый файл или каталог, то им назначаются права по
умолчанию. Давайте рассмотрим это на примере. Для создания файла выполним
команду ls и перенаправим вывод в файл:
ls -al >> testfile

Теперь проверим права на этот файл с помощью команды ls —al. Должно получиться: -rw-r--r--, т. е. владелец может читать и изменять файл, а пользователи его
группы и все остальные — только просматривать. В старых системах и в некоторых
дистрибутивах права могут оказаться и такими: -rw-rw-r--, т. е. пользователи группы тоже смогут корректировать файл. Но в любом случае все получают возможность читать файл — это разрешено. Такие права нарушают главное правило безопасности.
В этом отношении политика назначения прав по умолчанию может быть не совсем
эффективна — если вы создадите файл, который хранит конфиденциальные данные, информация из него будет доступна для всеобщего обозрения. И если вы забудете понизить права, то любой сможет увидеть и прочитать этот файл.
Ситуацию можно изменить, если понимать, как создаются права для нового файла.
Они рассчитываются на основе маски, текущее значение которой определяется
командой umask. Если выполнить ее после установки системы, будет получено значение 0022 или 002.
Посмотрим, как маска влияет на регламентацию доступа. По умолчанию права для
файлов устанавливаются в значение 666 минус маска, а для каталогов — 777 минус
маска.
Теперь ясно, что если маска равна 002, то для нового файла будут установлены
права 666 − 002 = 664, а это соответствует: -rw-rw-r--. При значении маски 0022
формула изменится на 666 − 0022 = 644, что будет означать: -rw-r--r--.
Для каталогов расчет аналогичный, и при маске, равной 002, по умолчанию будут
устанавливаться права 777 − 002 = 775 (drwxrwxr-x). В случае с маской 0022 значение определяется как 777 − 0022 = 755, а это соответствует правам: drwxr-xr-x, т. е.

Tlgm: @it_boooks

Управление доступом

119

все пользователи смогут просматривать каталоги и увидят содержащиеся в ней
файлы.
Все это не есть хорошо. Только владелец должен иметь доступ, достаточный для
полноценной работы с файлами и каталогами, а остальные вообще не должны
иметь никаких прав. Эту ситуацию можно исправить изменением маски. Я рекомендую установить ее в 077. В этом случае для каталогов права будут определены
так: 777 − 077 = 700 (или: drwx------), а для файлов: 666 − 077 = 600 (или: -rw-------).
Тогда доступ к файлу имеет только владелец. Все остальные — отдыхают.
При расчете прав на файл можно подумать, что я ошибся, ведь 666 − 077 не равно 600. Почему же так получилось? Просто вычитание происходит поразрядно, т. е.
из первой цифры 6 в числе вычитается первая цифра 0 в маске, затем операция
производится со вторыми цифрами (6 − 7), и т. д. Если какой-либо результат получается отрицательным, то он заменяется нулем.
Вот такое положение дел нас уже устраивает. Чтобы установить новую маску, выполните команду:
umask маска

В нашем случае это будет:
umask 077

Изменение маски по умолчанию затронет только текущий сеанс. Если перезапустить терминал, то маска сбросится на значение по умолчанию. Чтобы значение маски было постоянным, его нужно прописать в файлы /etc/bashrc и /etc/profile.
Тогда значение маски будет устанавливаться автоматически при старте консоли.

4.1.5. Права доступа к ссылкам
В разд. 3.1.3 мы говорили о жестких и символьных ссылках на файлы. Для начала
проверим права на жесткие ссылки:
913021 -rw-r--r-913021 -rw-r--r--

2 root
2 root

root
root

0 Feb 22 12:19 1.txt
0 Feb 22 12:19 link.txt

Как видите, права абсолютно идентичны. Я надеюсь, что вы другого и не ожидали,
ведь у жестких ссылок одинаковые дескрипторы.
С символьными ссылками дело обстоит куда хуже. Вот пример основного файла и
символьной ссылки на него из того же разд. 3.1.3:
913021 -rw-r--r-- 1 root
913193 lrwxrwxrwx 1 root

root 519 Feb 22 12:19 link.txt
root
8 Feb 22 12:40 symbol.txt -> link.txt

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

Tlgm: @it_boooks

120

Глава 4

В НИМАНИЕ !
Если вы решили использовать символьные ссылки, то всегда помните особенность
формирования прав доступа на файлы. Можете даже выбить на мониторе надпись:
«Ссылки на файлы создаются с полными правами!!!»

4.1.6. Права доступа к ссылкам
В Linux изначально была реализована слишком простая система прав доступа,
унаследованная у UNIX-систем. Обеспечить эффективное управление правами доступа с помощью всего трех наборов прав весьма проблематично. С точки зрения
безопасности подход на основе ACL (Access Control List, список управления доступом), который реализован в Windows, намного эффективнее.
В Linux списки доступа появились относительно недавно. Долгое время для этой
ОС имелись нестандартные решения, которые были сложными в управлении,
и требовалось накладывать специальные патчи на ядро, чтобы реализовать поддержку списков. Теперь все работает «из коробки».
Давайте создадим какой-нибудь файл, на котором будем пробовать управление
правами доступа с помощью списков:
echo Hello > test.txt

Эта команда выводит просто слово Hello, а с помощью символа > этот вывод перенаправляется в файл test.txt. Теперь у нас есть файл, в котором просто одна строка
с одним словом: Hello.
Посмотрим на списки доступа к этому файлу, для чего выполним команду getfacl:
getfacl test.txt

В результате вы должны увидеть что-то типа:
# file test.txt
# owner mflenov
# group mflenov
user::rwgroup::rwother::r--

Это все очень похоже на то, что мы уже видели в этой главе ранее. Здесь нам
в форме комментариев ко второй и к третьей строкам сообщают, какой пользователь является владельцем и какая группа имеет доступ.
Два двоеточия, разделяющие имя параметра и права, не случайны. Пустота между
ними указывает на то, что это права владельца. Другими словами, эти же права
можно было бы записать так:
user:mflenov:rwgroup:mflenov:rw-

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

Tlgm: @it_boooks

Управление доступом

121

Допустим, что у нас есть пользователь Миша (misha), который хочет получить доступ к этому файлу, и он не входит в группу mflenov. С той информацией, что мы
уже имеем, мы можем решить эту задачу только установкой полных прав для всех
пользователей. Но это не то, что нам нужно, — для всех остальных пользователей
права должны так и остаться только для чтения.
И тут приходит на помощь ACL и команда setfacl:
setfacl -m u:misha:7 test.txt

Самое важное здесь находится в трех параметрах, разделенных двоеточием:
u:misha:7. Буква u указывает на то, что мы добавляем права для пользователя, а не
для группы. misha — это имя пользователя, а последнее число 7 — это права доступа. Число 7 имеет такое же значение, как и при выполнении команды chmod, которую мы рассматривали в разд. 4.1.1.
Попробуйте выполнить снова команду getfacl, и теперь результат должен быть
таким:
# file test.txt
# owner mflenov
# group mflenov
user::rwuser:misha:rwx
group::rwmask::rwx
other::r--

Обратите внимание на появление магической строки mask, которую мы не добавляли, но она почему-то появилась сама. Если список доступа модифицирован, то mask
показывает максимальные права доступа для файла. Мы видим, что в нашем случае
это rwx, потому что это максимальные права, которые мы дали Мише.
Маска обновляется после каждого изменения списка. Давайте попробуем понизить
права Миши — дадим ему только право на чтение и запись. Это же текстовый
файл, и его выполнять смысла нет:
setfacl -m u:misha:6 test.txt

Если теперь проверить список доступа на файл, то маска изменится на rw-, потому
что теперь это максимальный доступ для файла.
Теперь добавим права доступа группе economic:
setfacl -m g:economic:6 test.txt

Обратите внимание, что буква u в команде изменилась на g, потому что мы работаем с группой. Права доступа 6 — это чтение и запись.
Если проверить список доступа к файлу теперь, то он будет выглядеть так:
# file test.txt
# owner mflenov
# group mflenov

Tlgm: @it_boooks

122

Глава 4

user::rwuser:misha:rwx
group::rwgroup:economic:rwmask::rwx
other::r--

Чтобы отменить права доступа для пользователя, меняем ключ -m на -x и просто
указываем имя пользователя:
setfacl -x misha test.txt

Чтобы сбросить список доступа к параметрам по умолчанию, выполняем команду
с ключом -b:
setfacl -b misha test.txt

4.2. Управление группами
Что такое группы? Допустим, что в вашей сети 1000 пользователей, 500 из которых
должны иметь доступ к файлам бухгалтерской отчетности. Как поступить? Можно
каждому из 500 пользователей назначить права на нужный файл и забыть об этом
до определенного времени. А теперь представим, что нужно отменить это разрешение. Опять выполнять 500 команд для каждого файла? А может быть, писать собственную программу, выполняющую такую отмену? Оба способа неудобны и требуют больших усилий.
В Linux нельзя просто так дать пользователю право на файл — это можно только
в Windows с использованием списков ACL. Что-то похожее пытаются реализовать
в Linux (см. разд. 4.1.6), но пока подобные реализации не получили популярности.
Вместо этого можно объединить многих пользователей в группу, а уже ей дать право на использование определенного файла. Впоследствии, если нужно будет запретить доступ, достаточно одной команды, чтобы отключить разрешение для группы,
и все 500 пользователей больше не смогут работать с файлом. Удобно? Даже очень.
Но тут возникает другая проблема — а если пользователю нужно быть сразу в двух
группах? Снова натыкаемся на барьер старой системы прав Linux.
П РИМЕЧАНИЕ
В ОС Red Hat Linux все пользователи приписываются к какой-либо группе. Если при
введении новой учетной записи группа не указана, то она будет создана по умолчанию
под именем пользователя.

4.2.1. Добавление группы
Для создания новой группы служит команда groupadd, синтаксис ее такой:
groupadd [-g gid [-o]] [-r] [-f] имя

Tlgm: @it_boooks

Управление доступом

123

После имени команды можно указывать следующие параметры:
 -g gid — идентификатор группы. Это неотрицательное число, которое должно

быть уникально. Если вы ввели значение, которое уже используется в системе,
то для нормальной отработки команды нужно добавить еще и ключ -o. В большинстве случаев идентификатор вообще не нужно указывать. Тогда система
возьмет первое свободное значение, начиная с 500;
 -r — этот ключ указывает на необходимость создания системной группы. Иден-

тификаторы таких групп находятся в диапазоне от 0 до 499. Если в явном виде
не указано значение параметра -g, то будет выбрано первое свободное число,
меньшее 500;
 -f — блокирует создание групп с одинаковыми именами. Если указать этот
ключ, то команда отработает, но новая группа не сформируется, а уже существующая не будет обновляться.
Если какие-либо параметры не указаны, то будут использоваться значения по
умолчанию. Рассмотрим примеры создания групп (после знака # идет комментарий,
поясняющий работу команды):
#Создать группу testgroup1 с ID по умолчанию
groupadd testgroup1
#Создать группу testgroup2 с ID 506
groupadd -g 506 testgroup2
#Создать группу testgroup3 с системным ID по умолчанию
groupadd -r testgroup3

Вся информация о группах добавляется в файл /etc/group. Откройте его содержимое,
например, в MC или наберите в командной строке:
cat /etc/group

Вы увидите содержимое файла, в самом конце которого находятся три строки с информацией о добавленных нами группах:
testgroup1:x:500:
testgroup2:x:506:
testgroup3:x:11:

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

чение по умолчанию;
 во второй — в явном виде задан номер группы;
 в последней строке идентификатор равен 11, потому что был запрошен номер по
умолчанию из системного диапазона (использовался ключ -r);
 последняя колонка (после третьего двоеточия) ничего не содержит. Здесь должен быть список пользователей группы, но он пуст, потому что мы еще его не
формировали.

Tlgm: @it_boooks

124

Глава 4

4.2.2. Редактирование группы
Для редактирования параметров группы можно напрямую изменять файл /etc/group,
но я рекомендую использовать команду groupmod. У этой команды такие же ключи,
что и у groupadd, но она не добавляет группу, а изменяет параметры уже существующей.

4.2.3. Удаление групп
Для удаления группы служит команда groupdel:
groupdel имя

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

4.3. Управление пользователями
Для добавления пользователя служит команда useradd. С ее помощью также можно
изменить значения по умолчанию, которые будут присваиваться учетной записи.
Команда useradd выглядит следующим образом:
useradd параметры имя

Параметров очень много, большинство из них вам знакомо по файлу /etc/passwd,
который мы рассматривали в главе 3. Вот наиболее часто используемые аргументы:
 -c комментарий — простое текстовое описание, которое может быть любым;
 -d каталог — домашний каталог пользователя;
 -e дата — дата отключения учетной записи, после которой пользователь станет

неактивным, вводится в формате ГГГГ-ММ-ДД;
 -f число — количество дней до отключения записи навсегда. Если указать 0, то

учетная запись будет считаться некорректной сразу после устаревания пароля;
 -g группа — основная группа, которой будет принадлежать пользователь. Мож-

но указывать как имя, так и идентификатор (напомню, что в Red Hat каждый
пользователь принадлежит какой-либо группе);
 -G группа[,...] — дополнительные группы, в которые будет включен пользова-

тель. Имена групп указываются через запятую;
 -m — ключ для создания домашнего каталога пользователя. В созданный каталог

будут скопированы все файлы из каталога /etc/skel;

Tlgm: @it_boooks

Управление доступом

125

 -M — не создавать домашний каталог;
 -r — если указать этот параметр, то в качестве идентификатора будет выбрано

число из системной области;
 -p пароль — зашифрованный пароль, который можно получить с помощью

команды crypt;
 -s программа — командный интерпретатор, который будет обрабатывать дирек-

тивы пользователя;
 -u идентификатор — идентификатор, который должен быть уникальным. Если

его не устанавливать, то система выберет свободное значение.
Самый последний параметр — имя создаваемой учетной записи. Давайте рассмотрим, как можно добавить нового пользователя по имени Роберт (robert), для которого все значения будут установлены по умолчанию:
useradd robert
cat /etc/passwd

В первой строке мы создаем нового пользователя по имени robert. Вторая строка
выводит на экран содержимое файла /etc/passwd, где хранится информация обо всех
учетных записях. Заключительная строка в нем будет выглядеть следующим образом:
robert:x:501:501::/home/robert:/bin/bash

Вспомните формат этого файла, который мы рассматривали в разд. 3.3.1. Первый
параметр — это имя. Затем идет пароль, который спрятан в теневом файле, поэтому
здесь указано x. Далее следуют идентификаторы пользователя и группы. Так получилось, что в обоих случаях свободными оказались номера, равные 501, поэтому
идентификаторы одинаковы, но это далеко не всегда так. Потом идет домашний
каталог пользователя. По умолчанию все каталоги создаются в папке /home и соответствуют имени пользователя.
Давайте посмотрим файл /etc/shadow. Обратите внимание, что в строке пользователя
robert стоят два восклицательных знака, — мы не указывали пароль, и войти в систему не можем. Я и не советую задавать пароль при создании пользователя. Это
лишние мучения, потому что нужно шифровать его функцией crypt, при этом нет
гарантии сложности пароля. Лучше изменить его после создания пользователя
с помощью команды passwd:
passwd robert

В ответ на это вы увидите приглашение ввести пароль и пояснения о необходимости делать его сложным. Сообщение, которое выдает программа, выглядит следующим образом:
Changing password for user robert.
You can now choose the new password or passphrase.
A valid password should be a mix of upper and lower case letters, digits and other
characters. You can use an 8 character long password with characters from at least

Tlgm: @it_boooks

126

Глава 4

3 of these 4 classes, or a 7 character long password containing characters from all
the classes. Characters that form a common pattern are discarded by the check.
A passphrase should be of at least 3 words, 12 to 40 characters long and contain
enough different characters.
Alternatively, if noone else can see your terminal now, you can pick this as your
password: "trial&bullet_scare".
Что по-русски звучит примерно так:
Изменяется пароль для пользователя robert.
Сейчас вы можете выбрать новый пароль или идентификационную фразу.
Хороший пароль должен состоять из заглавных и строчных букв, цифр и других
знаков. Вы можете ввести пароль длиной в 8 символов с использованием значений
как минимум 3 из 4 указанных классов или пароль из 7 символов, сочетающий знаки
из всех классов. Пароли, содержащие часто используемые шаблоны, будут
отвергнуты.
Идентификационная фраза должна состоять из 3 слов общей длиной от 12
до 40 символов и содержать разнообразные знаки.
В качестве альтернативы, если в данный момент никто, кроме вас, не смотрит
на ваш терминал, можно использовать пароль trial&bullet_scare.

Как видите, команда passwd знакомит нас с основными правилами создания сложных паролей и даже предлагает пример, который достаточно длинный и содержит
различные символы. Но я не стал бы его использовать, потому что он состоит из
вполне читаемых слов. Можно запустить подбор паролей по словарю, где различные слова объединяются, как это делает passwd. Такая процедура займет значительно больше времени, чем подбор пароля из одного слова, но все же намного меньше,
чем подбор шифра вроде OLhslu_9&Z435drf. Для нахождения этого пароля словарь
не поможет, а полный перебор всех возможных вариантов займет весьма много
времени.
А давайте-ка посмотрим, что сейчас находится в домашнем каталоге нового пользователя. Вы думаете, что там ничего нет? Проверим. Перейдите в каталог /home/
robert или выполните команду:
ls -al /home/robert

Ключ -a заставляет отображать все файлы (в том числе и системные), а ключ -l
выводит подробную информацию. Результат выполнения такой команды должен
выглядеть примерно следующим образом:
drwx-----drwxr-xr-x
-rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x

3
5
1
1
1
1
1
4

robert
root
robert
robert
robert
robert
robert
robert

robert
root
robert
robert
robert
robert
robert
robert

4096
4096
24
191
124
2247
118
4096

Nov
Nov
Nov
Nov
Nov
Nov
Nov
Nov

26
26
26
26
26
26
26
26

16:10
16:21
16:10
16:10
16:10
16:10
16:10
16:10

.
..
.bash_logout
.bash_profile
.bashrc
.emacs
.gtkrc
.kde

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

Tlgm: @it_boooks

Управление доступом

127

имя и группа владельца файла соответственно. В обоих столбцах почти везде указано имя robert. Если пользователя с таким именем мы только что создали, то
группу — вроде бы не создавали. Но вспомните: в разд. 4.2 мы говорили, что если
при создании пользователя не указывается группа, то автоматически формируется
группа с таким же именем, что и учетная запись, и туда сразу же помещается все
необходимое для нового пользователя.
Еще один нюанс. Папка с именем из двух точек (..), указывающая на родительский
каталог, принадлежит root. Почему? Пользователь robert — владелец текущего каталога /home/robert (он здесь хозяин), но каталог выше, /home, вне его прав — он
принадлежит пользователю root, так что папка .. также имеет владельца root.
Все файлы и папки, которые принадлежат учетной записи robert, доступны для чтения и записи. Пользователи группы robert и все остальные могут только просматривать информацию, а разрешения на изменение у них нет.

4.3.1. Файлы и папки нового пользователя
Откуда берутся файлы в папке нового пользователя? При формировании учетной
записи в соответствующую домашнюю папку копируются все файлы и подкаталоги
из каталога /etc/skel. Давайте создадим свой файл в этом каталоге и посмотрим, попадет ли он в папку нового пользователя. Чтобы ничего не выдумывать, выполним
следующую директиву:
ls >> /etc/skel/text

Здесь задается команда ls для просмотра содержимого текущего каталога. Потом
идут два символа >> и имя файла text в папке /etc/skel. Такая запись означает, что
результат выполнения команды должен быть помещен в указанный файл. Если
файл не существует, то он будет создан. Таким образом, мы подготовили в нужном
каталоге новый файл, содержимое которого нас не особо волнует.
Теперь добавляем нового пользователя (Denver) и просматриваем содержимое его
папки:
useradd
ls -al /home/Denver

В результате вы увидите, что созданный нами в каталоге /etc/skel файл был скопирован в папку нового пользователя. Но в каталогах уже существующих пользователей этот файл не появится.
Эту полезную особенность я использую достаточно часто — чтобы сразу наделить
нового пользователя правилами нахождения в системе, а также необходимыми ему
файлами и документацией. Например, когда я работал в торговой фирме, то в каталоги пользователей автоматом помещался файл с правилами пользования компьютером, куда я собрал наиболее часто задаваемые пользователями вопросы и ответы
на них.
Среди файлов, копируемых в каталог нового пользователя, есть и такой: .bash_
profile. Это профиль командного интерпретатора /bin/bash. В нем можно настраивать

Tlgm: @it_boooks

128

Глава 4

некоторые параметры, в том числе и маску. В разд. 4.1 мы говорили об излишних
правах, которые назначаются всем новым файлам пользователя, и научились понижать их с помощью команды umask.
Зайдите под учетной записью robert и посмотрите ее маску с помощью команды
umask. Обратите внимание — она равна 0002. То есть мы в разд. 4.1 изменили свою
маску, но robert при создании получил другую, которую надо изменить. Если вы
забудете это сделать, то могут возникнуть проблемы. Чтобы этого не произошло,
я рекомендую добавить в конец файла .bash_profile строку:
umask 0077

Лучше всего это сделать в файле /etc/skel/.bash_profile, потому что он копируется во
все папки новых пользователей, и можно быть уверенным, что все они получат
нужную маску.
Для повышения безопасности я не рекомендую присваивать каталогам имена учетных записей. При добавлении пользователя robert по умолчанию для него будет
создан каталог /home/robert. Такое соответствие может сыграть злую шутку. Если
злоумышленник узнает имя каталога, то он легко сможет определить имя пользователя, которому он принадлежит, и наоборот. Впрочем, я бы не назвал эту проблему
большим упущением в плане безопасности, но все же любая предсказуемость ее
ухудшает.
Поэтому при создании пользовательских каталогов достаточно даже просто добавить к имени какой-либо префикс, и это уже может усложнить задачу злоумышленнику.

4.3.2. Изменение настроек по умолчанию
Давайте теперь посмотрим, откуда берутся значения по умолчанию. Все это хранится в файле /etc/default/useradd. Взглянем на содержимое этого файла:
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel

Номер 100 присваивается пользовательской группе, у которой по умолчанию очень
мало прав. Это как гостевой пароль, который позволяет только просматривать файлы.
Файл /etc/default/useradd можно редактировать вручную или воспользоваться командой useradd для изменения значений по умолчанию. Чтобы внести изменения с ее
помощью, нужно сразу после имени команды указать ключ -D. После этого могут
идти следующие опции:
 -g — изменить группу;
 -b — установить домашний каталог;

Tlgm: @it_boooks

Управление доступом

129

 -f — время до отключения;
 -e — дата отключения;
 -s — оболочка (интерпретатор команд).

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

4.3.3. Редактированиепользователя
Для редактирования параметров учетной записи можно напрямую корректировать
файл /etc/passwd, но я советую использовать команду usermod. У нее такие же ключи, что и у useradd, но она не создает пользователя, а изменяет параметры уже существующего.
С помощью usermod вы можете добавлять уже имеющегося пользователя в ранее
созданную группу. Давайте проделаем такую процедуру с учетной записью robert и
определим ее в группу root. Это позволит пользователю robert выполнять некоторые административные функции:
usermod -G root robert

Здесь мы выполняем команду с ключом -G. Этот ключ позволяет указать, членом
каких групп должен быть пользователь. Можно указать несколько групп, разделенных запятыми. В нашем случае мы добавляем пользователя только в одну группу
root. Для получения более подробной информации о команде usermod выполните
команду:
man usermod

4.3.4. Удаление пользователя
Для удаления пользователя служит команда userdel. В качестве параметра ей передается только имя учетной записи, которую надо удалить, и можно распрощаться
с ней навсегда. Например:
userdel Denver

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

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

Tlgm: @it_boooks

130

Глава 4

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

4.3.5. Настройка
процедуры добавления пользователей
Для полного понимания процесса создания учетных записей нам нужно познакомиться еще с файлом /etc/login.defs. В нем хранятся настройки, которые будут использоваться при добавлении пользователей. Содержимое файла можно увидеть
в листинге 4.1.
Листинг 4.1. Файл /etc/login.defs
# *REQUIRED*
#
Directory where mailboxes reside, _or_ name of file, relative to the
#
home directory. If you _do_ define both, MAIL_DIR takes precedence.
#
QMAIL_DIR is for Qmail
#
#QMAIL_DIR
Maildir
MAIL_DIR
/var/spool/mail
#MAIL_FILE
.mail
# Password aging controls:
#
#PASS_MAX_DAYS Maximum number of days a password may be used.
#PASS_MIN_DAYS Minimum number of days allowed between password changes.
#PASS_MIN_LEN
Minimum acceptable password length.
#PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS
99999
PASS_MIN_DAYS
0
PASS_MIN_LEN
5
PASS_WARN_AGE
7
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN
500
UID_MAX
60000
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN
500
GID_MAX
60000

Tlgm: @it_boooks

Управление доступом

131

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD
/usr/sbin/userdel_local
#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is ORed with the -m flag on
# useradd command line.
#
CREATE_HOME
yes

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

установлено аж 99999. Если разделить это число на 365, то получится более
270 лет. Пока люди живут намного меньше, и со значениями по умолчанию,
скорее всего, никто пароль никогда не поменяет. Рекомендуется ставить
90 дней;
 PASS_MIN_DAYS — минимальное количество дней между сменами пароля;
 PASS_WARN_AGE — за сколько дней до устаревания пароля показывать предупре-

ждение;
 PASS_MIN_LEN — минимальная длина пароля (используется только в команде
passwd и игнорируется в useradd). В большинстве дистрибутивов здесь будет
стоять 5, но я рекомендую поставить 8. В этом случае нельзя будет установить
любимый большинством пользователей пароль типа qwerty;

 UID_MAX — максимальный идентификатор пользовательских учетных записей;
 GID_MIN — минимальный идентификатор пользовательских групп;
 GID_MAX — максимальный идентификатор пользовательских групп;
 CREATE_HOME — признак создания пользовательского каталога (значение парамет-

ра YES используется по умолчанию).
Никто не хочет помнить сложные пароли, и мы не можем заставить пользователей
выбирать что-либо сложное. Любой специалист по безопасности скажет, что пароли нужно менять каждые три месяца, но надеяться на пользователей нельзя — никто из них не станет запоминать, когда последний раз менялся пароль.
Для того чтобы заставить пользователя менять пароль каждые 90 дней, нужно
сконфигурировать опцию PASS_MAX_DAYS. Не помешает еще и установить
PASS_MIN_LEN — минимальную длину пароля. По умолчанию стоит 7, что по современным меркам далеко не самый безопасный вариант.

Tlgm: @it_boooks

132

Глава 4

К сожалению, изменение этих параметров не влияет на уже существующих пользователей.
Чтобы просмотреть или изменить политику паролей для существующего пользователя, нам понадобится утилита chage. Для просмотра текущих параметров пользователя выполняем эту команду с ключом -l и указываем имя интересующего нас
пользователя:
chage -l mflenov

Результатом выполнения команды будет таблица вида:
Last password change
Password expires
Password inactive
Account expires
Minimum number of days between password change
Maximum number of days between password change
Number of days of warning before password expires.

:
:
:
:
:
:
:

never
never
never
never
0
99999
7

Давайте поменяем эти значения на более рациональные:
chage -m 0 -M 90 -W 10 mflenov

А теперь поподробнее:
 ключ -m — меняет минимальное значение дней — я оставил 0;
 ключ –M — максимальное количество дней устанавливаем в рекомендован-

ные 90;
 ключ -W — количество дней до истечения пароля, после чего система начнет по-

казывать предупреждение. Просто для примера решил поменять на 10, хотя
недели вполне достаточно.
Еще раз вызовите команду с параметром –l — чтобы убедиться, что изменения отразились на пользователе.
Более подробно о команде chage мы будем говорить в разд. 14.1.

4.3.6. Взлом паролей
Я еще раз хочу напомнить о недопустимости использования простых паролей не
только администратором, но и всеми пользователями системы. К уязвимостям,
которые находят в Linux-системах, относятся, в частности, эксплоиты, которые позволяют повысить права хакера от простого пользователя до root. Но если взломщик не сможет получить доступ даже в качестве простого пользователя, то и воспользоваться таким эксплоитом ему будет невозможно.
Сложные пароли должны быть абсолютно у всех пользователей. Вспомните, как
хранятся пароли. Они зашифрованы необратимым образом. Это значит, что при
простом переборе каждый возможный вариант тоже шифруется, а потом сравнивается с зашифрованным паролем из файла /etc/shadow. Поскольку такое шифрование

Tlgm: @it_boooks

Управление доступом

133

и сравнение занимают весьма много процессорного времени, перебор становится
слишком продолжительным.
Если же хакер получит доступ к файлу /etc/shadow с 1000 записей, то подбор паролей упрощается. Подбирать сложно, если вы сравниваете свой зашифрованный вариант только с одной записью. А если в системе 1000 пользователей, то достаточно
один раз зашифровать возможный вариант пароля и потом соотнести его
с 1000 записей в файле паролей. Вероятность попадания увеличивается в 1000 раз,
что и облегчает подбор.
Хакер может также заранее создать зашифрованные версии различных паролей и
просто сравнить их с записями в файле /etc/shadow — тогда подбор произойдет
практически в мгновение ока.
Чтобы заранее рассчитанные таблицы не давали нужного результата, пароли хранят
со специальным дополнением — солью: к паролю добавляют что-нибудь случайное
и потом уже шифруют.

4.4. Типичные ошибки распределения прав
Один мой начальник в банальном файле Excel вел на сервере план работ, в котором
указывалось, что, кто и когда должен сделать. Этот файл был доступен для чтения
всем, но его нельзя было изменять. Права изменения были только на каталог, но не
на нужный файл. Как изменить информацию в файле? Остановитесь и подумайте.
Буквально через абзац я приведу способ решения этой проблемы.
Давайте рассмотрим классический пример с файлами и каталогами. Допустим, что
у вас на каталог поставлены максимальные права: drwxrwxrwx (или 777), а на все
файлы в нем: -rw-------. По идее при таком наборе прав только владелец файла
может его модифицировать, но сейчас вы увидите, что это не совсем так. Да, никто
без прав не может изменить сам файл, но список файлов в каталоге доступен всем:
разрешены и чтение, и корректировка. Благодаря этому взломщик просто удалит
нужный файл и создаст другой с новыми правами без каких-либо преград.
Теперь ясно, как можно изменить файл, недоступный для записи? Достаточно прочитать файл и сохранить его содержимое в другом файле — например, выполнив
команду:
cat имязапрещенногофайла >> имянашегофайла

Эта команда скопирует содержимое файла в новый. Если файл не существовал, то
он будет создан из-под вашей учетной записи. Значит, вы будете его владельцем
и сможете делать с ним все что угодно. Теперь можно удалить файл, созданный
начальником, и заменить его своей копией. Поскольку вы владелец, вы можете изменить этот файл, подправив нужную информацию, а потом просто изменить владельца и дату изменения, чтобы никто ничего не заподозрил.
Хитро? Ничего хитрого, но почему-то мало кто обращает на такую мелочь внимание, хотя это, собственно, не мелочь, а целая дыра в безопасности. Бессмысленно
запрещать изменение файла, если предоставлены полные права на каталог.

Tlgm: @it_boooks

134

Глава 4

Попробуйте выполнить следующие команды:
su
ls
ls
su
rm

root
-al >> /home/flenov/1.txt
-al /home/flenov/1.txt
flenov
/home/flenov/1.txt

В первой строке переключаемся под пользователя root, чтобы от его имени выполнять команды. Вторая команда отображает файлы из текущего каталога, а результат
сохраняет в файл /home/flenov/1.txt. Каталог выбран не случайно — это домашний
каталог пользователя flenov, в котором он может делать все что хочет.
Следующая строка применяет команду ls -al к только что созданному файлу, чтобы просмотреть о нем подробную информацию. Убедитесь, что владелец root и
права доступа равны: -rwxr--r--. Если это не так, то запретите изменение файла
для группы и для всех. В принципе достаточно запретить изменение для всех, потому что пользователь flenov в группу root не входит, а значит, не сможет изменять
файл.
Теперь переключаемся на пользователя flenov и удаляем файл. Прикол в том, что
файл удалится. Единственное, что вы увидите, — предупреждение, что удаляется
файл, защищенный от изменений.
И чтобы этого не произошло, вы должны ограничивать доступ не только к файлам,
но и каталогам.
Бывают случаи, когда каталог должен иметь все права. Как правило, это открытые
папки, через которые пользователи могут обмениваться файлами. Но при этом
нужно защититься таким образом, чтобы только администратор или владелец файла могли его удалить. Все остальные пользователи не должны иметь прав на уничтожение уже существующих чужих файлов. Как же решить эту проблему, когда
каталог необходимо сделать доступным всем, а его содержимым должны управлять
только хозяева?
Допустим, у вас есть каталог shared. Для того чтобы в нем могли удалять файлы
только владельцы, нужно установить для него sticky-бит. Это делается командой
chmod с параметром +t:
chmod +t shared

Попробуйте выполнить команду ls -al и посмотреть права доступа к каталогу. Вы
должны увидеть: drwxrwxrwt. Обратите внимание, что на месте символа x в области
прав для всех пользователей стоит t. Это и указывает на установленный sticky-бит.
Теперь попробуйте удалить из этого каталога файл, принадлежащий другому пользователю. Вы увидите сообщение: rm: cannot unlink ‘имя файла’: Operation not
permitted.
В Linux есть каталог /tmp, для которого как раз установлены права drwxrwxrwx и в котором сохраняются временные данные всех пользователей. В современных дистрибутивах на этот каталог уже выставлен sticky-бит.

Tlgm: @it_boooks

Управление доступом

135

4.5. Привилегированные программы
В главе 3 я упомянул о существовании еще двух битов доступа: SUID и SGID, и теперь пора с ними познакомиться поближе. Допустим, что пользователя необходимо
ограничить в правах, чтобы он не натворил бед, но при этом дать ему возможность
запускать какую-либо программу, установив для нее признак специального доступа — SUID-бит. В этом случае и программа сможет работать (от имени владельца),
и у пользователя не будет лишних привилегий.
Бит SUID можно установить командой chmod с параметром u+s:
chmod u+s progname

Если теперь просмотреть права доступа к файлу progname, то они окажутся равными: -rwsr-xr-x. Как видите, появилась буква s на том месте, где должно быть разрешение на запуск (символ x) для владельца файла.
Бит SGID похож на SUID, но он позволяет запускать программу с правами группы
владельца файла. Этот бит устанавливается подобным же образом командой chmod
с параметром g+s:
chmod g+s progname

В этом случае права доступа к файлу будут: -rwxr-sr-x — во второй группе вместо
символа x (право на запуск для группы владельца файла) появилась буква s.
Привилегии SUID и GUID достаточно удобны и полезны, но, с другой стороны, они
таят в себе очень много проблем. Например, гость, обладающий минимальными
правами, запускает программу с установленным битом SUID, владельцем которой
является пользователь root. Это значит, что программа будет работать с правами
root, а не гостевыми параметрами пользователя. Если в ней окажется ошибка, через
которую можно выполнять команды на сервере, то эти директивы будут реализовываться от имени владельца программы, т. е. от пользователя root. Таким образом,
даже если взломщик сам не имеет возможности претворять в жизнь команды, то
через привилегированную программу сможет получить доступ к запрещенной области.
Биты SUID и GUID нужно использовать аккуратно, и в любом случае владельцем
программ не должен быть root или другой привилегированный пользователь. Лучше, если это будет специально заведенная для этой программы учетная запись.

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

Tlgm: @it_boooks

136

Глава 4

Просмотреть текущие атрибуты можно с помощью команды lsattr:
lsattr filename.txt

-------------- filename.txt
Первая строка демонстрирует использование команды, а во второй — отображается
результат ее работы. Как видите, мы получили набор дефисов вместо атрибутов, а
значит, ни один из них не определен.
Для установки атрибута применяется команда chattr:
chattr атрибуты файл

Если требуется рекурсивное изменение доступа к каталогу и ко всем содержащимся в нем файлам и подкаталогам, можно использовать ключ -R. В этом случае вместо имени файла укажите в команде chattr каталог.
Вот перечень основных атрибутов, применяемых в команде chattr:
 A — не создавать метку atime записи времени последнего обращения к файлу.

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

существующие данные изменить или удалить будет нельзя;
 d — заставляет игнорировать файл при копировании. Этот флаг позволяет

уменьшить размер резервной копии, но устанавливать его нужно только на файлы, не имеющие ценности и важности, — например, временные;
 i — запрещает выполнение с файлом каких-либо действий по корректировке

(изменение, удаление, переименование, создание ссылок);
 s — делает невозможным восстановление файла после удаления. При удалении

файла все пространство на диске, где он был записан, будет заполнено нулями;
 S — во время изменения файла все действия будут фиксироваться на жестком

диске.
Для установки атрибута перед ним нужно поставить знак «плюс», для снятия —
знак «минус». Рассмотрим несколько примеров:
chattr +i test
chattr +s test
lsattr test
s--i---------- test

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

Tlgm: @it_boooks

Управление доступом

137

запрашивает текущие атрибуты, а в последней строке вы можете увидеть, что в перечне атрибутов первый символ равен s, а четвертый — i.
Итак, в четвертой строке у нашего файла стоят два взаимоисключающих атрибута:
один запрещает изменения, другой требует полного стирания с диска. Что произойдет, если мы попытаемся удалить файл? Посмотрим?
rm test

rm: remove write-protected file “test”?
В первой строке мы выполняем команду удаления файла. На это ОС просит подтвердить операцию над защищенным от записи файлом (сообщение показано во
второй строке). Как видите, ОС определила наш атрибут i. Попробуйте ввести букву Y, чтобы подтвердить действие. Вы увидите сообщение об ошибке, и файл останется на месте.
Давайте снимем атрибут i:
chattr -i test
lsattr test

s------------- test
После отмены атрибута я выполнил команду lsattr, чтобы убедиться в правильности выполнения команды. Вот теперь файл легко удалить с помощью команды rm.

4.7. Защита служб
В этой книге будет рассматриваться множество серверных служб. Безопасность их
работы для системы в целом зависит не только от правильной настройки самой
службы, но и от прав, которые вы ей дадите.
Во время подготовки первого издания этой книги на мой сайт было произведено
несколько удачных атак, потому что из-за занятости я просто не обновлял этот
сайт, который располагался на сервере известной хостинговой компании. За два
дня на сайте дважды меняли главную страницу, а потом злоумышленники захватили форум. Мне пришлось его убирать в недоступное место, чтобы восстановить
свои права администратора, напрямую редактируя базу данных MySQL.
Как произошел взлом? На сайте стоял форум phpBB. Это один из популярных
движков, который абсолютно бесплатен, поэтому владельцы сайтов его часто выбирают. Многие хакеры стремятся найти ошибки в наиболее известных разработках, и иногда им это удается. Только своевременное обновление форума позволяет
защититься от нападения.
После атаки я обновил форум, но это не помогло. Разработчики не устранили в последней его версии одну критическую ошибку, а лишь дали инструкции по ее исправлению на форуме своего сайта. Конечно же, я не увидел этих предписаний и
в итоге мог потерять всю базу данных, если бы один из посетителей сайта не дал
мне ссылку на описание ошибки и способов ее устранения.

Tlgm: @it_boooks

138

Глава 4

Давайте на примере абстрактного сайта www.sitename.com посмотрим, как происходило вторжение. При входе на форуме в просмотр какой-нибудь темы в адресной
строке браузера появляется ссылка:
http://www.sitename.com/forum/viewtopic.php?p=5583
Если к этой ссылке добавить в конец следующий текст:
&highlight=%2527.$poster=%60команда Linux%60.%2527

то указанная команда Linux выполнится на сервере.
Вот так, например, можно было просмотреть на сервере файлы каталога /etc:
&highlight=%2527.$poster=%60ls%09/etc%09-la%60.%2527

А вот эта команда могла удалить главную страницу сайта:
&highlight=%2527.$poster=%60rm%09index.php%60.%2527

Как видите, благодаря ошибке в одной строке скрипта форума под угрозой оказалось существование всего сервера.
В коде форума phpBB после этого находили не одну критическую уязвимость, но я
уже с тех пор никогда его не использовал, т. к. пришел к выводу, что лучше написать свой собственный код сайта с минимальными возможностями, но зато безопасный для использования.
А ведь опасность можно уменьшить, ограничив права веб-сервера в ОС. Для этого
администраторы должны создать виртуальную среду для выполнения веб-сервиса,
сделав при этом все остальные разделы сервера недоступными для злоумышленника. Тогда и каталог /etc окажется недосягаемым, и максимальный вред, который
сможет нанести злоумышленник, — это уничтожить сайт и нарушить работу вебсервиса, но все остальные будут трудиться в штатном режиме. Восстановить один
сервис проще, чем налаживать абсолютно все.
После случая с форумом phpBB я целый день бродил по Интернету в поисках уязвимых форумов, и таких оказалось много, потому что администраторы сайтов явно
не следили за обновлениями. Я думаю, что в скором времени эти администраторы
пройдут через все круги ада. Рано или поздно взломщик найдет их форумы, и администраторам нужно будет молиться, чтобы он не уничтожил всю базу, а только
пошалил. Хочется еще раз напомнить о необходимости обновления всех программ,
сервисов и самой ОС. Если вы сможете исправить ошибку ранее, чем хакер ее найдет, то обезопасите свою жизнь.
Во время поисков уязвимых форумов я просматривал возможность получения доступа к каталогу /etc, чтобы увидеть не только количество неопытных владельцев
сайтов, но и некомпетентных администраторов. Вы не поверите, но доступ был открыт, наверное, на 90% серверов. Это безграмотность администраторов или их
лень? Точно сказать трудно. Защищены были только крупные серверы.
Этот случай произошел очень давно, и я надеюсь, что сейчас ситуация с безопасностью намного лучше.

Tlgm: @it_boooks

Управление доступом

139

4.7.1. Принцип работы
Итак, чтобы увеличить безопасность служб, следует создать каталог, который станет
для программы корневым. В Linux для этого существует команда chroot, создающая
окружение chroot (рис. 4.1).
В этом окружении и создается каталог, который играет роль корневого. Выше этого
каталога программа, работающая в окружении chroot, попасть не может. Получается как бы корневая файловая система внутри существующей корневой системы. На
рис. 4.1 показана часть файловой системы Linux. Во главе всего стоит корневой
каталог /. В нем находятся каталоги (папки) /bin, /usr, /var, /home. В папке /home расположены каталоги пользователей системы. Мы создаем здесь новый каталог, для
примера назовем его chroot, — он и станет корневым для службы. В нем будут размещаться свои каталоги /bin, /usr и т. д., и сервис будет работать с ними, а все, что
выше /home/chroot, окажется ему недоступно.
На рис. 4.1 в рамку обведены папки, которые будут видны службе. Именно в этом
пространстве станет работать сервис, считая, что это и есть реальная файловая система сервера.
/

bin

usr

home

var

bin

usr

user2

user1

chroot

home

var

user1

user2

Рис. 4.1. Схема работы окружения chroot

Если хакер проникнет в систему через защищенную службу и захочет просмотреть
каталог /etc, то он увидит каталог /home/chroot/etc, но никак не системный /etc. Чтобы
взломщик ничего не заподозрил, в папке /home/chroot/etc можно расположить все традиционно находящиеся в системной папке /etc файлы, но здесь содержащие некорректную информацию. И злоумышленник, запросив файл /etc/passwd через уязвимый сервис, получит доступ лишь к файлу /home/chroot/etc/passwd, потому что служба видит его системным.
При этом файл /home/chroot/etc/passwd может содержать ложную информацию. На
работу системы в целом это не повлияет, потому что ОС будет брать пароли из
файла /etc/passwd, службе же реальные коды доступа в систему не нужны, так что
в файл /home/chroot/etc/passwd можно засунуть все что угодно.

Tlgm: @it_boooks

140

Глава 4

4.7.2. Установка Jail
Встроенная в Linux-систему программа chroot, создающая на сервере виртуальные
пространства, сложна для применения и не очень удобна — приходится выполнять
слишком много операций. Именно поэтому администраторы больше любят программу Jail, которую можно найти в Интернете по адресу: http://www.
jmcresearch.com/projects/jail/. Скачайте ее и поместите архив в свой каталог. Для
того чтобы его разархивировать, выполните следующую команду:
tar xzvf jail.tar.gz

В текущем каталоге появится новый каталог jail с исходным кодом программы. Да,
именно с исходным, потому что код открыт, и программа поставляется в таком
виде.
Теперь нужно перейти в каталог jail/src (командой cd jail/src) и отредактировать
файл Makefile (например, встроенным редактором MC). В самом начале файла идет
множество комментариев, и их мы опустим. После этого вы сможете увидеть следующие параметры:
ARCH=__LINUX__
#ARCH=__FREEBSD__
#ARCH=__IRIX__
#ARCH=__SOLARIS__
DEBUG = 0
INSTALL_DIR = /tmp/jail
PERL = /usr/bin/perl
ROOTUSER = root
ROOTGROUP = root

Вначале задается тип ОС — по умолчанию установлена LINUX, а следующие три
строки для FreeBSD, IRIX и Solaris закомментированы. Оставим это как есть. Что
нужно изменить, так это каталог для установки (параметр INSTALL_DIR). В последней версии (на момент подготовки этого издания книги) по умолчанию указывается
каталог /tmp/jail. Не знаю, зачем было так сделано, ведь этот каталог предназначен
для временных файлов и должен быть доступен для чтения абсолютно всем. Раньше по умолчанию был прописан каталог /usr/local, и именно его я советую здесь указать. Больше ничего менять не надо.
Для выполнения следующих директив вам понадобятся права root, поэтому войдите
в систему как администратор или получите нужные права, запустив команду su
root.
Перед компиляцией и установкой убедитесь, что у файла preinstall.sh есть права на
выполнение. Если нет, воспользуйтесь следующей командой:
chmod 755 preinstall.sh

Теперь все готово к установке. Находясь в каталоге jail/src, выполните команды:
make
make install

Tlgm: @it_boooks

Управление доступом

141

Если все прошло успешно, то в каталоге /usr/local/bin должны появиться программы
addjailsw, addjailuser, jail и mkjailenv.

4.7.3. Работа с программой Jail
Прежде всего создадим каталог /home/chroot, который станет корневым для программы, на которой мы будем испытывать систему. Для этого выполним команду:
mkdir /home/chroot

Теперь нужно подготовить окружение для нормальной работы будущего сервиса.
Для этого выполняем команду:
/usr/local/bin/mkjailenv /home/chroot

Посмотрите, что произошло с каталогом /home/chroot. Здесь появились два каталога:
dev и etc. Как мы знаем, в каталоге dev должны находиться описания устройств.
В нашем случае программа не стала делать полную копию системного каталога
/dev, а ограничилась созданием трех основных устройств: null, urandom и zero.
В каталоге etc можно также увидеть три файла: group, passwd и shadow. Это неполные копии системных файлов. Например, если взглянуть на файл passwd, то он будет содержать только следующие строки:
root:x:0:0:Flenov,Admin:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

Больше ничего там не будет, и, в частности, не будет пользователя robert, которого
мы создавали раньше (см. разд. 4.3).
Однако один недостаток по части безопасности здесь присутствует — в файле
/home/chroot/etc/shadow, где содержатся теневые пароли, находится реальный зашифрованный пароль из /etc/shadow. Лучше удалите его, иначе злоумышленник, узнав
пароль на сервис, сможет проникнуть на сервер через «другую дверь», которая не
защищена виртуальным каталогом. Кроме того, проверьте права на этот файл, чтобы они были не более 600 (rw-------).
Продолжаем настройку виртуального корневого каталога. Теперь нам нужно выполнить следующую команду:
/usr/local/bin/addjailsw /home/chroot

Во время ее работы по экрану побежит множество информационных строчек о выполняемых действиях, которые заключаются в том, что в каталог /home/chroot копируются основные каталоги и программы. Например, в папку /home/chroot/bin будут
скопированы такие программы, как cat, cp, ls, rm и т. д., и сервис будет использовать именно их, а не те, что расположены в основном каталоге /bin.
Программа копирует то, что считает нужным, но далеко не все из этого потребуется будущему сервису, который станет работать в виртуальном корневом каталоге.

Tlgm: @it_boooks

142

Глава 4

Лишнее следует удалить, но лучше это делать после того, как вы убедитесь, что все
работает.
Итак, необходимые программы перенесены, и окружение готово. Теперь сюда
можно установить сервис:
/usr/local/bin/addjailsw /home/chroot -P httpd

В этом примере в новое окружение устанавливается программа httpd и все необходимые ей библиотеки. Программа jail сама определит, что будет нужно.
Теперь в новое окружение можно добавлять пользователя. Это выполняется командой:
/usr/local/bin/addjailuser chroot home sh name

Здесь chroot — виртуальный корневой каталог, в нашем случае должно быть указано /home/chroot. Параметр home — домашний каталог пользователя относительно
виртуального каталога. Аргумент sh — командный интерпретатор, а name — имя
пользователя, которое мы хотим добавить (оно должно уже существовать в основном окружении ОС).
Посмотрим, как можно добавить пользователя robert (он у нас уже есть) в виртуальную систему:
/usr/local/bin/addjailuser /home/chroot \
/home/robert /bin/bash robert

П РИМЕЧАНИЕ
У меня здесь команда не уместилась в одну строку, поэтому я сделал перенос с помощью символа «\», который обозначает, что директива не закончилась, и ее продолжение в следующей строке.

Если параметры указаны верно, то вы должны увидеть уведомление Done, в противном случае будет выведено сообщение об ошибке.
Для запуска сервера httpd (в Linux это сервер Apache) в виртуальном окружении
должен существовать пользователь apache. В реальной оболочке он уже есть. Давайте посмотрим его параметры и создадим такого же:
/usr/local/bin/addjailuser /home/chroot \
/var/www /bin/false apache

Как теперь попасть в новое окружение? Выполните команду:
chroot /home/chroot

и вы окажетесь в новом окружении. Только учтите, что большинство команд здесь
не работает. Так, например, мы не установили программу MC, поэтому вы не сможете ею воспользоваться.
Чтобы убедиться, что вы находитесь в виртуальном окружении, выполните команду:
ls -al /etc

Вы увидите всего несколько файлов, которые составляют малую часть того, что
доступно в реальном каталоге /etc. Можете просмотреть файл /etc/passwd — в нем

Tlgm: @it_boooks

Управление доступом

143

вы найдете только пользователей виртуального окружения. Если хакер взломает
его, то он получит только эти данные и сможет уничтожить лишь содержимое каталога /home/chroot. Вся остальная файловая система останется целой и невредимой.
Для запуска сервиса httpd нужно выполнить в виртуальном окружении команду:
/usr/sbin/httpd.

4.8. Получение прав root
Теперь, когда у нас есть достаточно информации о разграничении доступа, мы можем рассмотреть типичный метод взломщика для получения прав root и способы
его маскировки в системе.
Допустим, что злоумышленник приобрел возможность выполнять какие-либо системные команды от имени (с правами) root. Сидеть под этой учетной записью будет
слишком опасно и вызывающе. К тому же изменять пароль root нельзя.
Как же тогда входить под другим именем и в то же время использовать максимальные права? Давайте вспомним, как Linux работает с правами. В файле /etc/passwd
хранятся записи пользователей в следующем виде:
robert:x:501:501::/home/robert:/bin/bash

Третий и четвертый параметры — это идентификаторы пользователя и группы соответственно. Когда на объекты выделяются права, то система сохраняет только
идентификаторы. Что это значит? Допустим, что у вас есть пользователь robert
с идентификатором 501. Вы создали еще одного пользователя Dan и дали ему такой
же идентификатор. Теперь обе учетные записи с одинаковыми ID будут разделять
владение одними и теми же объектами.
Что это нам дает? Посмотрите на идентификатор пользователя root — он равен нулю. Именно нулевой ID, а не имя root указывает на максимальные права. Давайте
попробуем учетной записи robert, которую мы создали ранее, вручную присвоить
идентификаторы пользователя и группы, равные 0. В файле /etc/passwd должна получиться строка:
robert:x:0:0::/home/robert:/bin/bash

Теперь войдите в систему под этой учетной записью и попробуйте снова открыть
файл /etc/passwd и внести изменения или просто добавить пользователя. Все пройдет успешно, хотя файл /etc/passwd может изменять только root. Получается, что
система проверяет наши права по идентификатору, который в нашем случае нулевой и соответствует максимальным правам.
Поскольку имя пользователя ничего не значит, я рекомендую переименовать пользователя root в файлах /etc/passwd и /etc/shadow во что-то более интересное. Злоумышленники, которые попытаются взломать ваш сервер, будут подбирать пароль
для администратора root, но так как пользователя с этим именем нет, то их действия окажутся безуспешными.

Tlgm: @it_boooks

144

Глава 4

Впрочем, пользователя root можно оставить, но установить ему идентификатор
больше нуля. Я иногда создаю учетную запись root с UID=501 или выше и устанавливаю мониторинг за этой записью — вдруг кто-то попытается подобрать пароль
или, не дай бог, войти в систему под этим именем. Получив доступ под именем
пользователя root, взломщик думает, что он обладает всеми правами, но в реальности оказывается простым пользователем.
Итак, злоумышленник, проникнув в систему, может не пользоваться учетной записью root, а отредактировать любую другую или добавить еще одну с нулевым идентификатором пользователя и получить максимальные права в системе. Если вы
являетесь администратором сервера, то должны отслеживать подобные трансформации и останавливать любые попытки изменения идентификаторов.
Команда id позволяет узнать идентификаторы пользователя. Если она вызывается
без параметров, то на экран будут выведены идентификаторы текущего пользователя. Чтобы получить информацию о конкретной учетной записи, нужно выполнить команду:
id имя

Например, давайте посмотрим параметры пользователя robert. Для этого выполним
команду:
id robert

Результатом будет строка:
uid=501(robert) gid=501(robert) group=501(robert)
Таким способом можно в любой момент определить идентификатор пользователя
и узнать, какими правами он реально обладает.

4.9. Права приложений
Права доступа могут быть не только у пользователей, но и у приложений. Для
управления такими правами в Linux сейчас существует две конкурирующие технологии: SELinux (используется в CentOS) и AppArmor (используется в Ubuntu). Обе
технологии включены в состав ядра Linux и выполняют примерно одинаковые
функции, но по-разному.
AppArmor определяет файлы и конфигурацию доступа по полному пути. Если создать жесткую ссылку на какой-либо файл, то защита на ссылку уже не сработает.
При этом SELinux доступ через жесткую ссылку запретит.
Существуют разные мнения, но большинство все же соглашается, что с точки зрения управления AppArmor проще. Два основных дистрибутива, которые его поддерживают, — это SUSE и Ubuntu.
Начнем знакомство с AppArmor с простой команды apparmor_status, которая возвращает статус. В результате выполнения команды вы должны увидеть сообщение,
что модуль загружен, и увидеть профили, которые используются. Можно установить свежие профили, выполнив команду:
apt-get install apparmor-profiles

Tlgm: @it_boooks

Управление доступом

145

Профили на самом деле представляют собой текстовые конфигурационные файлы
(как и почти все в Linux) и расположены в каталоге: /etc/apparmor.d/.
Изменять текстовые файлы профилей для полного эффекта недостаточно. Чтобы
изменения вступили в силу, их нужно загрузить в ядро с помощью команды:
cat /etc/apparmor.d/имя профиля | sudo apparmor_parser -a

Команда apparmor_parser разбирает полученный на входе текст и загружает его
в ядро в качестве профиля AppArmor. Ключ -a означает добавление нового профиля. Если профиль уже был загружен ранее, то его можно обновить, заменив этот
ключ на -r.
Если посмотреть на имена конфигурационных файлов и заменить в них точки на
слэши, то мы получим полный путь к файлам. Например, для программы /bin/ping
конфигурационным файлом будет /etc/apparmor.d/bin.ping.
Содержимое конфигурационных файлов профилей я рассматривать не стану. Мы
здесь ограничимся только пониманием, как все это работает. Лично мне ни разу не
приходилось настраивать эти файлы — в основном я просто использую уже установленные профили.
Более подробную информацию о конфигурировании AppArmor можно найти в русской версии документации по Ubuntu: http://help.ubuntu.ru/wiki/руководство_
по_ubuntu_server/безопасность/apparmor.
Мне никогда еще не приходилось писать скрипты для AppArmor, потому что я просто не использую Ubuntu на рабочих серверах. Там у меня в основном трудится
CentOS, а у этой ОС немного другая реализация защиты приложений — SELinux.

4.10. Сетевой экран
Для защиты компьютера от вторжения по сети используется сетевой экран
(Firewall, брандмауэр). Некоторые службы Linux также имеют свои настройки прав,
но их мы будем рассматривать отдельно, когда дойдем до соответствующего сервиса. И все же я не советую сильно доверять управлению на уровне сервисов. Не забывайте, что ошибки есть практически во всех программах, и если сетевой экран
станет дублировать права, прописанные в сервисе, от этого хуже не будет — только
лучше.
Сетевой экран является основой безопасности и первым редутом защиты. Хакеру
необходимо сначала получить доступ к компьютеру, и, только если это удалось, он
попытается двигаться дальше и пробираться до уровня файлов. Там уже действует
вторая линия обороны — права доступа к файлам и каталогам.
Сетевой экран позволяет ограничить доступ к компьютеру в целом или к отдельным портам, на которых работают сервисы, но не является 100-процентной защитой от вторжения. Это всего лишь проверка пакетов на соответствие правилам, которая не может гарантировать, что пользователь является реальным отправителем.

Tlgm: @it_boooks

146

Глава 4

Простейший способ обхода сетевого экрана — подделка IP-адреса. Например, мне
приходилось работать в сети, где простым пользователям запрещалось использовать почтовые протоколы SMTP и POP3 (подключение на 25-й и 110-й порты соответственно). Я относился к этой категории и не мог ни получать, ни отправлять
почту, однако у моего начальника такой доступ был. Использование веб-интерфейса для работы с почтовыми сервисами также блокировалось на уровне проксисервера. И вот однажды мне очень нужно было срочно отправить письмо. Для этого
я выполнил следующее:
1. Дождался, когда начальник выйдет из кабинета.
2. Выключил его компьютер.
3. Сменил свой IP-адрес на установленный на его компьютере.
4. Спокойно отправил почту и вернул свой старый IP-адрес.
Когда начальник вернулся, он решил, что компьютер просто завис (это было еще во
времена Windows 98), и ничего не заподозрил, а я без проблем смог воспользоваться сервисом, который был мне запрещен.
Однако такой метод можно реализовать только в локальной сети, а в Интернете подобное уже не пройдет. Поэтому сетевой экран все же является очень хорошим методом защиты от сетевых атак.
В ОС Linux в качестве брандмауэра выступает программа, фильтрующая информацию на основе определенных правил, в которых должно быть четко прописано, какие пакеты могут обрабатываться или отправляться в сеть, а какие нет. Благодаря
этому большинство атак захлебнутся уже на входе в компьютер, потому что сетевой экран не позволит сервисам даже увидеть потенциально опасные пакеты.
Сетевой экран может быть установлен на каждом компьютере сети в отдельности
(защищать его в зависимости от выполняемых задач) и на входе в сеть (рис. 4.2). Во
втором случае компьютер Firewall реализует общие настройки безопасности для
всех компьютеров в сети.
Если в вашей сети очень много компьютеров, то управлять ими по отдельности и
обновлять политику безопасности каждого становится затруднительным. Установка единого сервера с сетевым экраном позволяет упростить эти процедуры. Лучше
всего, если компьютер с сетевым экраном выступает как шлюз или как анонимный
прокси-сервер для доступа в Интернет остальных участников сети. В таком случае
хакер изначально будет видеть только этот компьютер, а остальные окажутся для
него как бы спрятанными за занавеской. Чтобы проникнуть на любую машину
в сети, злоумышленник должен будет сначала получить доступ к компьютеру
с Firewall. Таким образом, защита целой сети немного упрощается. Подробней
о прокси-серверах вы можете узнать в главе 9.
Сейчас большинство пользователей подключается к Интернету через домашние
сети Wi-Fi, и даже в их домашних роутерах может работать свой собственный
брандмауэр. Доступа к его настройкам, возможно, и не будет — задачей такого сетевого экрана является предоставление базовой безопасности.

Tlgm: @it_boooks

Управление доступом

147
Internet

Firewall

Рис. 4.2. Firewall для защиты сети

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

4.10.1. Фильтрация пакетов
Итак, основной, но не единственной задачей сетевого экрана является фильтрация
пакетов с целью обеспечения безопасности. В Linux уже встроен брандмауэр, и вам
его не придется устанавливать отдельно. Раньше их было два: iptables и ipchains.
Второй немного устарел и стал достоянием истории, но первый — живой и невредимый. Меняются только способы управления им.
Сетевые экраны позволяют контролировать трафик, который проходит через компьютер по протоколам TCP (Transmission Control Protocol, протокол управления
передачей), UDP (User Datagram Protocol, пользовательский протокол датаграмм) и
ICMP (Internet Control Message Protocol, протокол управляющих сообщений в сети
Интернет). Поскольку TCP является транспортом для всех основных протоколов
Интернета: FTP (File Transfer Protocol, протокол передачи файлов), HTTP (HyperText
Transfer Protocol, протокол передачи гипертекста), POP3 (Post Office Protocol, почтовый протокол) и др., то фильтрация TCP позволяет защищать все эти сервисы.
Все запросы, которые поступают из Интернета или направляются туда, проходят
через сетевой экран, который проверяет их по своим внутренним правилам. И если
соответствие установлено, то пакет пропускается. Если какой-либо параметр нарушает хотя бы одно правило, то пакет может быть удален:

Tlgm: @it_boooks

148

Глава 4

 без предупреждений (deny, запрет);
 с посылкой на компьютер отправителя сообщения об ошибке (reject, откло-

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

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

4.10.2. Параметры фильтрации
Основными параметрами пакета, по которым производится фильтрация, являются
номер порта источника или приемника, адрес отправителя или назначения и протокол. Как мы уже знаем, сетевым экраном поддерживаются три базовых протокола:
TCP, UDP и ICMP, на основе которых строится все остальное (FTP, HTTP, POP3
и пр.).
Обращаю ваше внимание, что фильтровать нужно пакеты, идущие в обе стороны.
Проверка пакетов, приходящих извне, позволяет на самом раннем этапе отсеять
любые попытки взломать систему или вывести ее из строя.
А зачем фильтровать то, что уходит из сети? На первый взгляд это бессмысленно,
но резон есть, и он достаточно велик. Исходящий трафик могут инициировать и
злоумышленники, например:
 троянские программы, которые могут отправлять в сеть конфиденциальную ин-

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

ли доступ к определенному порту извне. Хакер может разместить на сервере
программу, которая будет перенаправлять трафик с разрешенного порта на запрещенный — наподобие туннелирования OpenSSL (Open Secure Sockets Layer,
открытый протокол защищенных сокетов). Профессионалу написать такую утилиту — дело пяти минут;

Tlgm: @it_boooks

Управление доступом

149

 хакер может попытаться заставить ваш компьютер инициировать соединение

со своим — если компьютерам извне запрещено инициировать соединения с вашими.
Таким образом, под контролем должен быть трафик в обоих направлениях.
Когда я работал с сайтом электронной коммерции (от англ. e-commerce), где в базе
данных содержалась информация о кредитных картах, то на большинстве серверов
по умолчанию было запрещено любое соединение: как во внешний мир, так и во
внутренний. Во внешний мир можно было подключаться лишь на определенные
IP-адреса, то же самое и при подключении извне — только компьютеры с определенными IP-адресами имели доступ к серверам. Любое входящее соединение, кроме 80-го порта, открывать было запрещено и даже не представлялось возможным.
Чтобы открыть исходящее соединение, нужно было пройти многодневную процедуру проверки, пока несколько отделов безопасности не подтвердят, что это действительно нужно и безопасно.
Вы спросите, как же я тогда подключался к компьютеру, чтобы управлять им? Логичный вопрос... Для доступа в сеть было одно исключение — имелся в сети один
сервер, к которому можно было подключаться с помощью удаленного десктопа
(Remote Desktop) и с которого можно было открывать безопасное соединение с вебсерверами, с базой данных, с кэширующими серверами. И на всех этих серверах
была определена простая политика для входящих соединений:
 80-й порт на веб-серверах разрешен всем. На остальных серверах даже он запрещен;
 на Windows-серверах порт удаленного управления открыт только с определенного IP- адреса;
 на Linux-серверах порт 22 (используется для управления) был открыт только для
определенного IP-адреса.
То есть имелся определенный компьютер, с которого можно было получить доступ
к важным данным, и задача защиты всего окружения сводилась к тому, чтобы защитить эту точку доступа, которую называют Jump Box, — ящик, с которого «прыгают» на рабочие серверы.
На Jump Box так же стоял сетевой экран, который запрещал все, кроме соединения
с определенных IP-адресов. Таких разрешенных адресов было всего два: один —
для программистов и один — для администраторов. Достаточно просто поддерживать такой простой список. Исходящие соединения так же были запрещены по
умолчанию. Да, по умолчанию все запрещено. Чтобы получить разрешение на соединение с серверами, нужно было подключиться к Jump Box, запустить определенную программу, сгенерировать одноразовый код (как это делают многие программы двухфакторной аутентификации), ввести этот код в программу, и сетевой
экран открывал соединение между Jump Box и рабочими серверами на два часа.
После этого нужно было генерировать новый код и вводить его для продления сессии.
Выглядит это сложно, но достаточно безопасно и несложно с точки зрения управления. Применяемые политики очень простые, потому что запрещают доступ всем,

Tlgm: @it_boooks

150

Глава 4

кроме определенных адресов. Единственный Jump Box-сервер содержит списки
доступа по публичным IP-адресам, но этих адресов там не много, и их легко обновлять в случае необходимости.

Протоколы
Протокол TCP используется как базовый для передачи данных по таким протоколам, как HTTP, FTP и др. Запрещать его не имеет смысла, потому что это основа,
без которой вы лишитесь всех удобств, предоставляемых нам Всемирной сетью.
Для передачи данных по протоколу TCP сначала устанавливается соединение
с удаленным хостом, и только потом происходит обмен информацией. Благодаря
этому подделка IP-адреса любого участника соединения усложняется, а иногда и
становится невозможной.
Протокол UDP находится на одном уровне с TCP, но передает данные без установки соединения. Это значит, что пакет просто посылается в сеть на определенный
адрес, и нет гарантии, что он дошел до адресата. Здесь нет никакой защиты от подделки IP-адреса, поэтому в качестве отправителя злоумышленник может указать
кого угодно, и наш сервер не увидит подвоха. Если нет особой надобности (ни одна
установленная у меня программа не использует UDP), то я запрещаю прохождение
таких пакетов в обе стороны.
Протокол ICMP служит для обмена управляющими сообщениями. Через него команда ping проверяет соединение с компьютером, а оборудование или программы
сообщают друг другу об ошибках. Если этот протокол использовать только по назначению, то он очень удобен. Но в нашей жизни все далеко от идеала, и ICMP уже
не раз становился объектом для DoS-атак. Если обмен управляющими сообщениями необходим используемой вами программе, попробуйте найти другую, но избавьтесь от использования ICMP, который также не требует соединения, потому
что использует UDP-запросы.

Фильтрация портов
Первое, на что надо обратить внимание, — это, конечно же, порты. Допустим, что
у вас есть веб-сервер, к которому имеют доступ все пользователи. Предположим,
что на нем работают абсолютно безопасные сценарии или статические документы
HTML. Помимо этого, все программы содержат самые последние обновления и не
имеют уязвимостей. Получается, что сервер безопасен? Да, но до поры до времени.
Для обновления содержимого необходим какой-то доступ для закачки файлов —
ведь бегать с дисками к веб-серверу никто не будет. Чаще всего для работы с файлами открывают FTP-сервис, а вот это уже дополнительная головная боль.
Для доступа по FTP можно установить наиболее защищенные программы и самые
сложные пароли, но хакер рано или поздно может найти вход на этот сервис. Пароль можно подобрать, украсть с компьютера пользователя или выведать пароль
у него самого средствами социальной инженерии. Существуют и другие методы.
Любой канал, через который хакер может проникнуть в систему, становится уязвимым, потому что именно его будет взламывать злоумышленник, и как раз на это

Tlgm: @it_boooks

Управление доступом

151

будут потрачены все его усилия. Да, у одного не получится, у второго, а сотый случайно войдет с первого раза.
Таким образом, необходимо следовать на сервере политике, при которой на порт 80
будут приниматься все подключения, а FTP-сервис (порт 21), а лучше — SFTP
(Secure File Transfer Protocol, безопасный протокол передачи файлов) — будет запрещен для всех IP-адресов, кроме определенного IP-адреса. После этого злоумышленник может хоть годами подбирать пароль — любой его трафик будет обрезаться, если он не знает заветного IP-адреса и не может его подделать, взломав
компьютер с нужным IP.
Вы должны запретить все порты и после этого открыть только те, что необходимы.
На сервере, который охраняет целую сеть, это сделать сложно, потому что разные
компьютеры требуют различных сервисов. Открыть их все — значит, разрешить
работать со всеми портами на любой машине. Конечно же, можно помимо портов
задействовать в правилах IP-адреса, но дополнительным вариантом защиты будет
все же использование сетевого экрана на каждом компьютере внутри сети. В этом
случае каждый из них будет охраняться в зависимости от выполняемых задач. Если
это веб-сервер, то из Интернета будет виден только порт 80, если FTP — то порт 21,
и т. д.

Фильтрация адресов
Из предыдущих соображений видно, что для фильтрации можно использовать и
IP-адрес, хотя максимальный эффект достигается именно в сочетании параметров:
порт и адрес.
Допустим, что в вашей сети находятся два веб-сервера. Такое бывает очень часто.
Один сервер делают доступным для всех посетителей из Интернета, а второй —
только для своих пользователей (внутрикорпоративный сайт). Вполне логичным
будет разделение информации — тогда на закрытый сервер можно пускать трафик
только из локальной сети, независимо от порта. Хакеры из Интернета вообще не
должны иметь доступа к внутрикорпоративному серверу.
Разделение по сетям выглядит красиво, но не всегда эффективно. Нет, я не говорю
о подделке адресов и о том, что хакер может выдать себя за другого. Он сам может
стать другим. Что я этим хочу сказать? Хакер может захватить один из компьютеров доверенной сети, установить на него троянскую программу и использовать ее
для проникновения на запрещенный сервер.
Компании, работающие в сфере безопасности, приводя различные данные, пугают
нас тем, что очень много компьютеров в Интернете находятся под контролем хакеров. Это действительно было так, но очень давно. В настоящее время эти цифры по
разным источникам не превышают и 10%, хотя некоторые аналитики считают, что
они намного больше.
Мне же кажется, что даже 10% — слишком много, ведь это каждый 10-й компьютер!

Tlgm: @it_boooks

152

Глава 4

Фильтрация нежелательных адресов
Несколько лет назад сервис www.regnow.com (который выступает посредником
для производителей Shareware-программ, получая деньги от клиентов и обеспечивая безопасность платежей) попытался ограничить доступ с сомнительных IP-адресов. Это вполне логично. Некоторые страны кишат хакерами, и при этом число
добропорядочных пользователей программ в них стремится к нулю. К таким государствам отнесли страны Африки и некоторых регионов Восточной Европы, включая развивающуюся Россию.
Ограничительный шаг сервиса оправдывался тем, что в ряде этих стран была
весьма сильно развита технология кардинга, когда товар в Интернете заказывается по ворованным кредитным картам. Чтобы исключить кардинг, сервис запретил
доступ по целым группам IP-адресов. Впоследствии выяснилось, что обойти эту
систему очень просто, — хакеру достаточно было воспользоваться анонимным
прокси-сервером в США или Канаде, чтобы проскочить преграду. А вот у добропорядочных пользователей возникли серьезные проблемы, и они лишились возможности использовать сервис для оплаты необходимых услуг.
Из-за столь серьезных недостатков фильтр был снят, и разработчики regnow.com
больше не пытаются его использовать. Просеивать все возможные прокси-серверы
слишком затруднительно, и это дает малый эффект, а репутацию можно потерять
навсегда. Так что иногда приходится выбирать между безопасностью и удобством
пользования.
Еще пример — я живу в Канаде, и некоторые сервисы из России для нас блокируются. Например, онлайн-телевидение Первого канала блокирует некоторые передачи и фильмы, потому что они получают лицензию для трансляции контента только
на территории России. Но у меня есть VPN-подключение (Virtual Private Network),
и через серверы в России я могу смотреть любые передачи. Таким же образом люди
здесь смотрят фильмы с американского Netflix, в котором больше хороших фильмов, чем в Канаде.

Фильтрация неверных адресов
Очень важно правильно настроить обработку IP-адресов получателя. Пусть сервер
настроен таким образом, чтобы в случае прихода неверного пакета отвечать отправителю сообщением о некорректности данных. Проблема заключается в том, что
злоумышленник может послать на сервер такой пакет, в котором в качестве отправителя стоит адрес получателя, — т. е. и в том и в другом случае используется IPадрес сервера. Конечно же, сервис пытался отослать сообщение об ошибке, и отправлял его сам себе, и снова видел ошибочный пакет. Таким образом процесс зацикливался. Если злоумышленник направит тысячи таких пакетов, то сервер только
и будет сам себе посылать сообщения об ошибках.
О подобных погрешностях я уже давно ничего не слышал, но нет гарантии, что они
не появятся снова. Люди иногда ошибаются, ведь они не роботы, чтобы работать
без ошибок, хотя и роботы тоже иногда делают ошибки.

Tlgm: @it_boooks

Управление доступом

153

Есть IP-адреса, которые зарезервированы или не могут использоваться в Интернете.
Рассмотрим диапазоны этих адресов:
 в качестве отправителя стоит адрес 127.0.0.1. Из Интернета пакет с таким адресом прийти не может, потому что он всегда используется для указания на локальную машину (localhost);
 от 10.0.0.0 до 10.255.255.255 — зарезервирован для частных сетей;
 от 172.16.0.0 до 172.31.255.255 — зарезервирован для частных сетей;
 от 192.168.0.0 до 192.168.255.255 — зарезервирован для частных сетей;
 от 224.0.0.0 до 239.255.255.255 — зарезервирован для широковещательных адресов, которые не назначаются компьютерам, поэтому с них не могут приходить
пакеты;
 от 240.0.0.0 до 247.255.255.255 — зарезервирован для будущего использования
в Интернете.

Фильтрация в Linux
Для фильтрации пакетов по определенным вами правилам в ядро Linux уже встроены все необходимые функции. Но это только основа, а нужен еще инструмент, который в удобной форме позволит управлять этими правилами.
В ОС Linux в качестве сетевого экрана (брандмауэра) используется программа
iptables, а в Ubuntu есть более простая утилита UFW (Uncomplicated Firewall, что
можно перевести как «упрощенный сетевой экран»). Обе программы — это всего
лишь утилиты, которые позволяют управлять правилами фильтрации, сами они
фильтрацией не занимаются. Саму фильтрацию же выполняют модули ядра
Netfilter.
В ядре Linux определены три основные цепочки правил:
 Input — для входящих пакетов;
 Output — для исходящих пакетов;
 Forward — для пакетов, предназначенных другой системе.
Вы можете создавать свои цепочки, которые будут привязаны к определенной политике, но мы эту тему рассматривать здесь не станем.
ОС Linux проверяет все правила из цепочки, которая выбирается в зависимости от
направления передачи. Пакет последовательно обследуется на соответствие каждому правилу из цепочки. Если найдено хотя бы одно совпадение с описанием, то
выполняются действия, указанные в этому правиле: DENY, REJECT или ACCEPT, т. е.
система решает, пропускать пакет дальше или нет.
Цепочки несут в себе одну очень неприятную для новичков особенность. Допустим, что на вашем сервере вы хотите открыть 21-й порт только для себя. Для этого
можно создать два правила:
1. Запретить все входящие пакеты на 21-й порт сервера.
2. Разрешить пакеты на 21-й порт с компьютера с адресом 192.168.1.1.

Tlgm: @it_boooks

154

Глава 4

На первый взгляд все верно — доступ запрещен для всех, а открыт только для одного
IP-адреса. Проблема кроется в том, что если посылка будет с адреса 192.168.1.1, то
проверка первого правила для параметров пакета даст положительный результат,
поэтому будет произведен запрет, пакет удалится, и второе правило не сработает
никогда.
Чтобы наша политика действовала верно, строки надо поменять местами. При этом
сначала будет проверена запись «Разрешить пакеты на 21-й порт с компьютера
с адресом 192.168.1.1» — контроль пройдет успешно, а значит, пакет будет пропущен. Для остальных IP-адресов это правило не подойдет, и проверка продолжится.
И вот тогда сработает запрет доступа на 21-й порт для всех пакетов.
Пакеты, направленные на другие порты, не будут соответствовать правилам, значит, над ними будут выполняться действия по умолчанию.

4.10.3. Брандмауэр — не панацея
Брандмауэр (Firewall) — это всего лишь замок на двери парадного входа. Злоумышленник редко пользуется парадным входом, он будет проникать в систему
через черный или полезет в окно.
Сетевые экраны могут работать на компьютере с ОС (программные) или на какомнибудь физическом устройстве (аппаратные). В любом случае — это программа, а
ее пишут люди, которым свойственно ошибаться. Как и ОС, так и программу сетевого экрана нужно регулярно обновлять и исправлять погрешности.
Рассмотрим защиту по портам. Допустим, что у вас есть веб-сервер, который защищен сетевым экраном и в нем разрешен только порт 80. А хакеру больше и не
надо!!! Ведь это не значит, что нельзя будет использовать другие протоколы. Можно создать туннель, через который данные одного протокола передаются внутри
другого. Так появилась знаменитая атака Loki, которая санкционирует передачу
команды для выполнения на сервере через ICMP-сообщения Echo Request (эхозапрос) и Echo Reply (эхо-ответ), подобно команде ping.
Ну и еще один аргумент — наличие сетевого экрана ничего еще не означает, если
его не настроить.

4.10.4. Брандмауэр как панацея
Может сложиться впечатление, что брандмауэр — это пустое развлечение и трата
денег. Это не так. Если он хорошо настроен и постоянно контролируется, а в системе используются защищенные пароли, то сетевой экран может предотвратить
большинство проблем.
Хороший экран имеет множество уровней проверки прав доступа, и нельзя использовать только один из них. Если вы ограничиваете доступ к Интернету исключительно по IP-адресу, то приготовьтесь оплачивать большой трафик. Но если
при проверке прав доступа используется IP-адрес в сочетании с MAC-адресом и
паролем, то такую систему взломать уже намного сложнее.

Tlgm: @it_boooks

Управление доступом

155

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

4.10.5. Конфигурирование брандмауэра
Сетевая система ядра Linux называется Netfilter и предоставляет нам фильтрацию
пакетов с сохранением состояния и без него, а также NAT и IP Masquerading (об
этих опциях подробно рассказано в разд. 4.10.7). Для управления сетевым ядром
используется утилита командной строки iptables, а для управления IP 6-й версии —
утилита ip6tables. Утилита iptables схожа по синтаксису с ipchains (использовалась
для конфигурирования сетевого экрана до iptables), но предоставляет нам больше
возможностей.
Сама команда имеет в простейшем варианте такой вид:
iptables команда [ключи]

Команда, как правило, включает в себя указание цепочки, т. е. набора правил, применяемых в определенных случаях. В систему встроены несколько цепочек, которые постоянны и не могут быть удалены. Вот основные из них:
 INPUT — входные данные;
 OUTPUT — выходные данные;
 FORWARD — перенаправление.

Давайте посмотрим на пример, который разрешает любой трафик на локальном интерфейсе loopback. Этот интерфейс есть на каждом компьютере и указывает на него
самого. Он безопасен, ибо по сети этот интерфейс никто не видит, поэтому на нем
можно разрешить все. Итак, команда выглядит следующим образом:
iptables -I INPUT 1 -i lo -p all -j ACCEPT

Tlgm: @it_boooks

156

Глава 4

Ничего не понятно? Страшно, аж жуть? Если вы впервые видите команды управления сетевым экраном Linux, то только такие чувства могут вызывать на первых порах параметры утилиты iptables. Но ничего, хороший мануал и немного практики, и
вы не будете бояться этих правил. Я надеюсь, что моя книга станет для вас хорошим мануалом, а практика придет со временем.
Давайте сделаем паузу, скушаем «твикс» и пока не будем рассматривать команды,
а погрузимся в теорию и изучим, какие параметры может принимать команда
iptables.

4.10.6. Основные возможности iptables
Вот список основных параметров, которые можно передавать команде iptables:
 -A цепочка правило — добавить правило в конец цепочки. В качестве парамет-

ров указывается имя цепочки (INPUT, OUTPUT или FORWARD) и правило;
 -D цепочка номер — удалить правило с указанным номером из заданной цепочки;
 -R цепочка номер правило — заменить правило с указанным номером в цепочке;
 -I цепочка номер правило — вставить правило в указанную первым аргументом

цепочку, под номером, заданным во втором параметре. Если номер равен 1, то
правило станет первым в цепочке;
 -L цепочка — просмотреть содержимое указанной цепочки;
 -F цепочка — удалить все правила из цепочки;
 -p протокол — определяет протокол, на который воздействует правило;
 -i интерфейс — определяет сетевой интерфейс, с которого данные были получе-

ны. Этот параметр можно использовать только с цепочками INPUT, FORWARD или
PREROUTING;

 -o интерфейс — задает интерфейс, на который направляется пакет. Этот пара-

метр можно использовать только с цепочками OUTPUT, FORWARD или POSTROUTING;
 -j действие — операция, которая должна быть выполнена над пакетом. В каче-

стве аргументов можно указать следующие значения (рассмотрим только основные):
• LOG — поместить в журнал запись о получении пакета;
• REJECT — отправителю будет направлено сообщение об ошибке;
• DROP — удалить пакет без информирования отправителя;
• BLOCK — блокировать пакеты;
 -s адрес — IP-адрес отправителя пакета. После адреса можно задавать маску

через косую черту (/), а перед адресом — знак отрицания !, что будет соответствовать любым адресам, кроме указанных;
 -d адрес — адрес назначения пакета.

Tlgm: @it_boooks

Управление доступом

157

Если вы знакомы с ipchains, то должны заметить невероятное сходство. Но есть и
очень существенные различия. Например, с помощью ключей -o и -i очень просто
указывать, с какого и на какой интерфейс направляется пакет.
Сразу же необходимо заметить, что для сохранения цепочек iptables нужно выполнить команду:
service iptables save

Если не сохранить правила, то они будут действовать только до первой перезагрузки, после которой настройки будут сброшены, и все придется настраивать заново.
А оно вам нужно?
Теперь пора переходить к практическим примерам конфигурирования сетевого
экрана. Ключ -P служит для указания значения по умолчанию. А что должно быть
по умолчанию для максимальной защиты? Конечно же, запрет. Чтобы запретить
любые входящие, исходящие и переадресуемые пакеты, выполняем команды:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Рассмотрим эти команды подробнее. После имени команды идет ключ, который
указывает, что мы делаем. Ключ -P говорит, что мы задаем значение по умолчанию.
После этого должно идти имя цепочки, куда добавляется правило. В первом случае
это цепочка INPUT, а значит, правило будет действовать на входящие данные. Во
втором — OUTPUT, т. е. на исходящие данные, а в третьем случае — FORWARD. Последний параметр цепочек — DROP — говорит о том, что нужно делать с пакетами,
удовлетворяющими условиям, которые мы указали. А говорит он о необходимости
их удаления.
Давайте сделаем небольшое лирическое отступление, чтобы понять разницу между
REJECT и DROP. В качестве последнего параметра (действия) можно указать вместо DROP
значение REJECT, что тоже будет являться запретом. Разница в том, что в случае REJECT
отправитель запроса получит уведомление о том, что запрошенный доступ для него
запрещен. Что не есть хорошо — ведь это лишняя информация, которую хакеру не
нужно знать. При ключе DROP полученный запрещенный пакет будет просто удален без
каких-либо уведомлений и предупреждений.
Если стоит выбор между REJECT и DROP, а вы не знаете, что выбрать, я рекомендую
выбирать DROP.
Некоторые специалисты по безопасности рекомендуют журналировать обращения,
добавив в сетевой экран фильтр:
iptables —A INPUT —j LOG

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

Tlgm: @it_boooks

158

Глава 4

выйдет из строя. Соответственно, хакер может просто направить бесконечные обращения на запрещенный порт и через некоторое время добиться удачно завершенной DoS-атаки.
Чтобы лучше понять работу фильтрации, желательно увидеть как можно больше
примеров, поэтому дальше мы будем много практиковаться. Для начала посмотрим
классический пример указания прав доступа, необходимых любому веб-серверу,
т. е. разрешение обращений к 80-му порту нашего компьютера и возврат данных от
нашего компьютера:
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT

В первой строке мы добавляем новое правило в цепочку INPUT. Правило действует
на протокол TCP, о чем говорит значение tcp ключа -m. Веб-сервер использует как
раз этот протокол для передачи данных. С помощью ключа --dport указываем порт
назначения данных: 80. И наконец, последний параметр –j ACCEPT указывает, что
если пакет соответствует всем правилам, то нужно его пропустить и обработать.
Сложно? Попробую другими словами: первая строка разрешает любые входящие
пакеты по протоколу TCP, в которых происходит подключение на порт 80. Вторая
строка разрешает передавать ответы от сервера.
Для того чтобы разрешить подключения по HTTPS, нужно добавить следующие
две строки:
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 443 -j ACCEPT

Здесь делается то же самое, только разрешается работа с портом 443.
Следующий пример разрешает подключения по SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT

Следующая команда создает фильтр, по которому запрещается принимать Echoзапросы от любых компьютеров:
iptables -A INPUT -s 0/0 -d localhost \
–p icmp --icmp-type echo-request -j DROP

Здесь параметр –s 0/0 определяет, что правило относится ко всем адресам отправителя. Как и всегда в таких случаях, символ \ указывает на то, что следующая строка
является продолжением предыдущей. Вы можете убрать этот символ и записать все
в одну строку.
Следующая команда запрещает доступ к FTP-порту:
iptables -A INPUT -s 0/0 -d localhost -p tcp --dport 21 -j DROP

Чтобы запретить доступ с определенного интерфейса, добавим ключ -i и укажем
интерфейс eth0:
iptables —A INPUT —i eth0 —s 0/0 —d localhost –p tcp --dport 21 —j DROP

Tlgm: @it_boooks

Управление доступом

159

Теперь запретим исходящие пакеты с порта 21. Для этого используем команду:
iptables —A OUTPUT —i eth0 —s localhost —d 0/0 –p tcp --dport 21 —j DROP

Очень мощной особенностью iptables является возможность проверки содержимого пакетов. Это очень удобно, например, для фильтрации веб-запросов. Можно разрешить доступ к порту 80, но контролировать, чтобы пакеты содержали только
допустимые параметры. К безопасности веб-сервера мы вернемся в главе 7 и познакомимся с разными способами защиты. А сейчас рассмотрим простой, но универсальный способ.
Допустим, что мы хотим разрешить доступ к FTP-серверу, но при этом быть уверенными, что пользователь не сможет обратиться к файлам /etc/passwd и /etc/shadow.
Для этого можно запретить пакеты, в которых есть этот текст. Если хакер попытается послать запрос, содержащий ссылки на эти файлы, то такой пакет будет отклонен. Следующие команды запрещают доступ к этим файлам по протоколам FTP
и WWW:
iptables -A INPUT -m string --string "/etc/passwd"
–s 0/0 -d localhost -p tcp --dport 21 -j DROP
iptables -A INPUT -m string --string "/etc/shadow"
–s 0/0 -d localhost -p tcp --dport 21 -j DROP
iptables -A INPUT -m string --string "/etc/passwd"
–s 0/0 -d localhost -p tcp --dport 80 -j DROP
iptables -A INPUT -m string --string "/etc/shadow"
–s 0/0 -d localhost -p tcp --dport 80 -j DROP

\
\
\
\

Надо также учесть аспект защиты информации. Допустим, что у вас есть сервер,
который принимает закодированный трафик с помощью stunnel (Security Tunnel,
безопасный туннель)1, расшифровывает и передает его на другую машину. В этом
случае во входящих пакетах сетевой экран не сможет найти такие строки. А вот
исходящие пакеты идут уже декодированными и содержат открытый текст команд.
В такой конфигурации необходимо контролировать оба потока.
Даже если у вас stunnel передает расшифрованный трафик на другой порт внутри
одного компьютера, можно включить контроль любых пакетов на всех интерфейсах, чтобы они проверялись после расшифровки.

4.10.7. Переадресация
Для разрешения переадресации с помощью iptables нужно выполнить следующую
команду:
iptables -A FORWARD -o ppp0 -j MASQUERADE

В этой строке позволяется переадресация на интерфейс ppp0. С помощью параметра
-j мы требуем прятать IP-адрес отправителя, т. е. включаем маскарадинг.
1

Создание шифрованного канала между двумя машинами мы будем рассматривать в разд. 5.2.

Tlgm: @it_boooks

160

Глава 4

Кроме того, можно использовать NAT (Network Address Translation, трансляция сетевых адресов). Для чего нужна трансляция? Сетевых IP-адресов на всех не хватает, поэтому локальные сети используют адреса из зарезервированного диапазона
(10.x.x.x или 192.168.x.x). Эти адреса не маршрутизируются и не могут использоваться в Интернете. Но как же тогда использовать в таких сетях Интернет? Все пакеты, направляемые на адреса в Интернете, перенаправляются на шлюз, на котором
работает NAT. С помощью NAT адрес компьютера из локальной сети подменяется
интернет-адресом, и пакет продолжает свой путь из локальной сети во Всемирную.
Таким образом, достаточно иметь только один интернет-адрес, который присваивается шлюзу, и вся локальная сеть сможет работать с ресурсами Всемирной сети.
Для настройки NAT команда может выглядеть следующим образом:
iptables -t nat -A FORWARD -o ppp0 -j MASQUERADE

Ключ -t nat указывает на необходимость загрузить модуль iptable_nat. Если он не
загружен, то это легко сделать вручную с помощью следующей команды:
modprobe iptable_nat

Здесь iptable_nat — модуль ядра, который позволяет сетевому экрану работать
с NAT.

4.10.8. Утилита firewalld
Чуть более простой утилитой для управления сетевым экраном является firewalld,
которая используется в CentOS и Red Hat. Она работает поверх iptables и предоставляет дополнительные функции сетевого экрана.
В Ubuntu по умолчанию firewalld не устанавливается, поэтому для ее установки
выполняем следующую команду:
apt install filrewalld

На главной странице проекта по адресу: https://www.firewalld.org вы можете
узнать, что пакет firewalld отлично подходит для построения доверенных сетей и
шлюзов в Интернет. Это тема отдельного разговора, и мы разовьем ее в разд. 9.7.

4.10.9. Uncomplicated Firewall:
упрощенное управление
Столь сложное и интересное управление сетевым экраном, как представленное
в предыдущих разделах, может пригодиться только сетевым администраторам. Домашние пользователи не захотят знать ничего про порты и протоколы, у них может
быть одна задача — разрешить доступ программе, и они хотят ее выполнить как
можно проще. И Ubuntu предоставляет им такую возможность с помощью уже
упомянутой в разд. «Фильтрация в Linux» утилиты Uncomplicated Firewall (UFW).
Допустим, что вам нужно разрешить программе SSH подключаться к вашему серверу. Для этого просто выполняем команду:
ufw allow ssh

Tlgm: @it_boooks

Управление доступом

161

Конечно же, эту команду нужно выполнить с правами администратора. Согласитесь, она читается достаточно просто: простой сетевой экран, разрешить SSH. Не
нужно задумываться о том, какой протокол используется, и какой порт нужно открыть, программа сама добавит нужные правила.
Разумеется, утилита UFW не может знать абсолютно все возможные программы
и открывать для них доступ. Но управление с ее помощью доступом по протоколу
и порту так же очень просто — следующая команда разрешит SSH, который работает по протоколу TCP и использует по умолчанию порт 22:
ufw allow 22/tcp

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

4.11. Некоторые нюансы работы
с брандмауэром
Как вы помните, у нас есть по три записи для цепочек INPUT и OUTPUT. Если вам уже
не нужен больше доступ по FTP, вы захотите его убрать. Отключив FTP-сервер, не
забудьте удалить разрешающие правила из этих цепочек.
Очень тяжело, если IP-адреса распределяются динамически и могут регулярно меняться. Если в вашей сети используется сервер DHCP (Dynamic Host Configuration
Protocol, протокол динамической конфигурации хоста), то нужно позаботиться
о том, чтобы компьютеры, которым необходим особый доступ и правила (например, основной шлюз), все же имели жестко закрепленные адреса.
То есть, чтобы четко контролировать IP-адреса, желательно использовать DHCPсервер, но жестко фиксировать адреса тем, кто нуждается в привилегированном
доступе и имеет фильтры в цепочках.
Некоторые сервисы (такие, как FTP) могут требовать для своей работы более одного порта. И если вы не откроете им все нужные порты, то можете не получить необходимого результата. Хотя как раз для FTP эта проблема уже давно решена введением пассивного режима.
Тестируйте все используемые соединения после каждого изменения конфигурации
сетевого экрана. После внесения нескольких модификаций найти ошибку очень
тяжело.
Регулярно делайте резервную копию цепочек. Для этого можно сохранять их содержимое в отдельном месте (желательно на другом компьютере или на сменном
носителе). Тогда в случае возникновения проблем можно быстро восстановить
работающие цепочки, а тестирование сетевого экрана с новыми параметрами перенести на внерабочее время.
Сейчас некоторые скажут, что я капитан-очевидность и обожаю бюрократию. Это
не так — я как раз ненавижу бюрократию и сам иногда нарушаю простейшие правила безопасности, но не в тех случаях, когда это касается безопасности особо важных данных.

Tlgm: @it_boooks

162

Глава 4

4.11.1. Обход сетевого экрана
Сетевой экран не может обеспечить абсолютной безопасности, потому что алгоритм его работы несовершенен. В нашем мире нет ничего безупречного, стопроцентно надежного, иначе жизнь стала бы скучной и неинтересной.
Как брандмауэр защищает ваш компьютер или сервер? Все базируется на определенных правилах, по которым экран проверяет весь проходящий через сетевой
интерфейс трафик и выносит решение о возможности его пропуска. Но не существует такого фильтра, кроме абсолютного запрета, который может обеспечить
полную безопасность.
На большинстве сетевых экранов возможно реализовать атаку DoS. Эта атака легко
организуется в двух случаях:
 мощность канала злоумышленника больше, чем у вас;
 на сервере есть задача, требующая больших ресурсов компьютера, и есть возможность ее выполнить.
Сетевой экран — это сложная программная система, которой необходим значительный технический потенциал для анализа всего проходящего трафика, бо́льшая
часть которого тратится на пакеты с установленным флагом syn, т. е. на запрос соединения. Параметры каждого такого пакета должны сравниваться со всеми установленными правилами.
В то же время для отправки syn-пакетов больших ресурсов и мощного канала не
надо. Хакер без проблем может забросать разрешенный порт сервера syn-пакетами,
в которых адрес отправителя подставляется случайным образом. Процессоры атакуемой машины могут не справиться с большим потоком запросов, которые надо
сверять с фильтрами, и выстроится очередь, которая не позволит обрабатывать
подключения добропорядочных пользователей.
Очень часто для совершения атаки нужно намного меньше ресурсов, чем для защиты. Если атака идет только с одного хоста, то его IP можно блокировать, но что,
если атака идет сразу с многих IP-адресов (DDoS)? В таких случаях иногда блокируют целые сети. Например, есть такая компания Prolexic, которая защищает от
DDoS-атак. Их мониторы следят за активностью и, судя по моему опыту работы
с их системой, в случае атаки с одного адреса они его блокируют, а если с нескольких адресов одной сети, то они могут отключить всю сеть.
У меня один из сайтов клиента защищается этой компанией. Весь его трафик идет
через ее центры данных, где интернет-каналы очень широкие и оборудование мощное. Но иногда случается так, что все пользователи крупнейшего провайдера Канады в Торонто не могут соединиться с каким-либо сайтом. Начинаем выяснять, а
оказывается, что Prolexic просто заблокировал всю сеть.
Атака не может длиться вечно, и блокирование целыми сетями приносит свои плоды. Тем более что этот сайт — для американцев, канадцам там пользоваться нечем,
поэтому чуть что, и их отключают.
Если клиент посылает слишком много данных, которые не могут быть помещены
в один пакет, то информация разбивается на несколько блоков. Этот процесс назы-

Tlgm: @it_boooks

Управление доступом

163

вается фрагментацией пакетов. Некоторые старые сетевые экраны анализировали
только первые блоки в сессии, а все остальные считали правильными. Логика такого поведения понятна — если первый пакет верен, то зачем проверять их все и тратить на это драгоценные ресурсы сервера? В противном случае первый пакет окажется отвергнутым, а от остальных не будет толку, потому что соединение сбросится из-за нарушения целостности информации.
Чтобы сетевой экран пропустил данные хакера, пакеты могут быть фрагментированы специальным образом. От подобной атаки можно защититься, только если
брандмауэр осуществляет автоматическую сборку фрагментированных пакетов и
просматривает их в собранном виде. Этой уязвимости были ранее подвержены
даже некоторые экраны, используемые в Linux, но ошибка уже давно исправлена,
и сейчас так обойти брандмауэр невозможно. Если в будущем разработчики не
совершат ошибки при обновлении кода, то подобная атака будет исключена.
Сетевой экран очень часто становится объектом атаки, и не факт, что попытка не
окажется успешной. Если злоумышленнику удастся захватить брандмауэр, то сеть
станет для него открытой как на ладони. В этом случае вас смогут спасти от тотального разгрома только персональные сетевые экраны на каждом компьютере. На
практике политика безопасности на персональном компьютере не такая жесткая, но
может быть вполне достаточной для предотвращения дальнейшего проникновения
в сеть.
Атака на сетевой экран не зависит от его реализации. Ошибки бывают как в ОС
Linux, так и в маршрутизирующих устройствах с возможностями фильтрации.
Основная задача, которую решает сетевой экран, — запрет доступа к заведомо закрытым ресурсам. Но существуют открытые ресурсы. Например, если необходимо,
чтобы веб-сервер был доступен пользователям Интернета, то сетевой экран не
сможет защитить от взлома через ошибки в сценариях на веб-сервере.
Обычно сетевые экраны разрешают любые подключения из сети во внешний мир,
но запрещают соединения из внешнего мира во внутренний. Это значит, что стучаться в дверь бесполезно. Но если внутрь забросить троян, то он сможет установить соединение с внешним миром. От этого уже никуда не денешься, потому что
хоть что-то, но должно быть разрешено, иначе сеть становится изолированной.
Таким образом действуют ботнеты — они как вирусы заражают компьютеры и
подключаются к внешнему миру для получения команд.
В крупных компаниях в одной сети может быть несколько серверов. Я только в одной фирме и в кино видел, как администраторы для управления каждым из них
работают за несколькими мониторами и клавиатурами одновременно. В реальной
жизни специалисты слишком ленивы, да и однообразный труд утомляет, поэтому
они сидят только за одним компьютером, а для подключения к серверам используют удаленное соединение.
Правда, у меня в офисе два системных блока. Один из них я использую для работы,
а на другом открыты удаленные соединения с серверами. Можно было бы обойтись
и одним, но мне удобнее держать два. Но это так, отступление от реальности...

Tlgm: @it_boooks

164

Глава 4

4.11.2. Безопасный Интернет
Интернет не будет безопасным, пока нельзя четко установить принадлежность пакета. Любое поле IP-пакета можно подделать, и сервер никогда не сможет определить подлинность данных. Мы не в состоянии гарантировать спокойную жизнь,
пока не можем четко знать источник и конкретного человека. С другой стороны,
изменение ситуации может повлиять на нашу свободу.
В особо важных сетях должны пресекаться любые разведывательные действия —
например, использование сканеров портов, трассировка сети и др., чтобы злоумышленник знал о сети как можно меньше.
Что такое трассировка? В сети каждый пакет проходит по определенному пути.
При необходимости перенаправления такой пакет обязательно проходит через
маршрутизаторы, которые доставляют его в нужные сети. Но если в устройство,
обеспечивающее межсетевую совместимость, закралась ошибка, то пакет может
навечно заблудиться. Чтобы этого не произошло, в заголовке IP-пакета есть поле
TTL (Time To Live, время жизни). Отправитель пакета устанавливает в это поле
определенное число, а каждый маршрутизатор уменьшает счетчик ретрансляций.
Если значение TTL становится равным нулю, то пакет считается потерявшимся и
уничтожается, а отправителю посылается сообщение о недостижимости хоста.
Эту особенность стали использовать для диагностики сети, чтобы узнать маршрут,
по которому проходит пакет. Как этоработает? В большинстве случаев каждый
запрос идет до адресата одним и тем же путем. На пакет, отправленный со значением TTL, равным 1, первый же маршрутизатор ответит ошибкой, и по полученному
отклику можно узнать его адрес. Следующая посылка идет с TTL, равным 2. В ответ на это ошибку вернет второй маршрутизатор. Таким образом можно узнать, через какие узлы проходят запросы к адресату.
Сетевой экран должен уничтожать любые пакеты с TTL, равным 1. Это защищает
сеть, но явно указывает на наличие брандмауэра. Пакет с реальным значением TTL
дойдет до адресата, а если команда traceroute выдала ошибку, то это значит, что на
пути следования пакета есть брандмауэр, который запрещает трассировку.
Для выполнения трассировки в ОС Linux нужно выполнить команду traceroute
с ключом -I, указав имя хоста. Например:
traceroute -I redhat.com

В ОС Windows есть аналогичная команда tracert, и в ней достаточно задать имя
узла или IP-адрес, который нужно трассировать, без использования дополнительных ключей.
При выполнении команды на экране начнут появляться адреса промежуточных
маршрутизаторов, через которые проходит пакет. Например, результат может быть
следующим:
traceroute to redhat.com (xxx.xxx.xxx.xxx)? 30 hops max, 38 byte packets
1
218 ms 501 ms 219 ms RDN11-f200.101.transtelecom.net [217.150.37.34]
2
312 ms 259 ms 259 ms sl-gw10-sto-5-2.sprintlink.net [80.77.97.93]
...
...

Tlgm: @it_boooks

Управление доступом
17
18

638 ms 839 ms 479 ms
*
*
*

165
216.140.3.38
Request timed out.

Если сетевой экран пропускает ICMP-пакеты, то сканирование можно провести
с помощью traceroute. Возможно, появится сообщение об ошибке. В нашем случае
строка 18 сообщает о превышении времени ожидания ответа. Это означает, что пакет отправлен, но сервер отбросил запрос, а значит, вероятнее всего, пакет с TTL,
равным 18, был уничтожен без предупреждения и информирования отправителя,
и мы не можем узнать IP-адрес этого хоста.
Для сканирования этой сети за пределами брандмауэра достаточно выполнить
команду соединения с компьютерами внутри сети с TTL, равным 19. Во время
трассировки мы увидим первые 17 ответов, 18-й пропадет, а 19-й пройдет дальше
в сеть, потому что на сетевом экране такой пакет появится с TTL, равным 2, и не
будет удален, а вот в локальной сети первый же маршрутизатор вернет ошибку.
Протокол ICMP очень удобен, потому что если он разрешен и работает, то вы
в любой момент можете узнать, работает ли сейчас ваш сервер, просто отправив
такой запрос. Если ответ вернулся, значит, сервер доступен. Но хакеры могут использовать этот протокол и для сканирования. Достаточно просто отправить сотни
пакетов на разные IP-адреса и посмотреть, какие вернутся. По ответам можно будет
узнать, какие IP реальные и в текущий момент работающие, и уже в зависимости от
этого предпринимать какие-то действия.
Внутреннюю сеть можно просканировать и через DNS-сервер, если он находится
внутри нее и доступен для всеобщего использования. Но это уже отдельная история, не касающаяся сетевого экрана.

4.11.3. Дополнительная защита
Помимо фильтров на основе определенных администратором правил в сетевом экране может быть реализовано несколько дополнительных защитных механизмов,
которые работают вне зависимости от вашей конфигурации или могут включаться
специальными опциями.
Одним из популярных методов обхода брандмауэра и проведения атаки является
фальсификация IP-адреса отправителя. Например, у хакера может быть адрес
100.1.1.1, но с него запрещено подключаться к сервису FTP. Чтобы получить доступ, хакер может послать пакеты, в которых в качестве отправителя указан, например, 100.2.2.2, с которого доступ разрешен.
Внимание, тут говорится именно об IP, а не о TCP/IP. Второй — это протокол, требующий установки соединения, и до начала обмена данными должно быть отправлено и получено несколько пакетов. Вариант IP без установки соединения — это,
например, UDP.
Но это еще не все. Просто воспользовавшись чужим именем, хакер ничего не добьется — он не увидит отклика сервера (рис. 4.3). Чтобы хакер смог получить ответ
на свой запрос, в IP-пакет должна быть добавлена специальная информация, по ко-

Tlgm: @it_boooks

166

Глава 4

Hacker
Query
IP: 100.1.1.1

Server

IP: 100.1.1.100
Answer

User

IP: 100.2.2.2

Рис. 4.3. Подмена IP-адреса

торой сервер найдет реальный адрес хакера 100.1.1.1. Поэтому в случае с TCP не
так просто подделать адрес.
Современные сетевые экраны (в том числе и поставляемые с Linux) легко определяют подделку и блокируют такие пакеты.

4.12. Запрет и разрешение хостов
Работа с iptables может показаться сложной, потому что требует знания необходимых портов, но этот способ наиболее надежный, и для построения реальной защиты рекомендуется использовать именно его. А вот для решения простых задач есть
другой метод — использование файлов /etc/hosts.allow и /etc/hosts.deny. Первый файл
содержит записи хостов, которым разрешен доступ в систему, а во втором прописаны запреты.
При подключении к серверу файлы проверяются следующим образом:
1. Если соответствие обнаружено в файле hosts.allow, то доступ разрешен, и файл
hosts.deny не проверяется.
2. Если в файле hosts.deny найдена запись, то доступ запрещен.
3. Если нет ни одной подходящей записи в обоих файлах, то доступ по умолчанию
разрешен.

Tlgm: @it_boooks

Управление доступом

167

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

Строка состоит из двух параметров, разделенных двоеточием. Первым указывается
имя сервиса (или их список, разделенный запятыми), доступ к которому нужно
ограничить. Второй — это адреса (для файла /etc/hosts.allow — разрешенные, а для
/etc/hosts.deny — запрещенные), разделенные запятыми. В качестве параметров
можно использовать ключевое слово ALL, которое соответствует любому адресу или
сервису.
Рассмотрим пример конфигурирования файла. Для начала закроем любой доступ.
Для этого в файле /etc/hosts.deny нужно прописать запрет для всех пользователей на
любые сервисы. Для этого добавляем строку ALL: ALL. В результате ваш файл будет
выглядеть следующим образом:
#
#
#
#
#
#
#

hosts.deny

This file describes the names of the hosts which are
*not* allowed to use the local INET services, as decided
by the '/usr/sbin/tcpd' server.

The portmap line is redundant, but it is left to remind you that
the new secure portmap uses hosts.deny and hosts.allow. In particular
you should know that NFS uses portmap!

ALL: ALL

Теперь в файле hosts.allow санкционируем только следующий доступ:
 компьютеру с адресом 192.168.1.1 разрешено подключение ко всем сервисам;
 с ftpd-сервисом могут работать только компьютеры с адресами 192.168.1.2

и 192.168.1.3.
# hosts.allow This file describes the names of the hosts
#
which are allowed to use the local INET services,
#
as decided by the '/usr/sbin/tcpd' server.
#
ALL: 192.168.1.1
ftpd: 192.168.1.2, 192.168.1.3

Если вам нужно позволить доступ к какому-либо сервису целой сети, то можно
указать неполный адрес:
ftpd: 192.168.1.

Эта строка разрешает доступ к ftpd-сервису всем компьютерам сети 192.168.1.x (последнее число адреса не указано, значит, оно может быть любым).
Как видите, использовать файлы /etc/hosts.allow и /etc/hosts.deny намного проще, потому что не требуется прописывать правила для входящих и исходящих пакетов.

Tlgm: @it_boooks

168

Глава 4

Но возможности этих файлов слишком ограничены, и любой сетевой экран позволяет осуществлять куда более тонкие настройки.
Я рекомендую использовать файлы /etc/hosts.allow и /etc/hosts.deny для решения временных проблем безопасности. Если в каком-либо сервисе найдена уязвимость, то
его легко обойти через установки в файле /etc/hosts.deny. Если вы заметили попытку
атаки с какого-нибудь IP-адреса, запретите на пару часов любые подключения
с него, но, опять же, используя файл /etc/hosts.deny.
Почему нежелательно играть с цепочками сетевого экрана? Случайное удаление
или добавление ошибочной записи может нарушить работу сервера или понизить
его безопасность. Именно поэтому я не рекомендую устанавливать в сетевом экране временные правила.

4.13. Советы по конфигурированию
брандмауэра
Конфигурирование сетевого экрана достаточно индивидуально и зависит от конкретных задач, решаемых сервером. Но я все же дам ряд рекомендаций, которым
надо следовать во время настройки:
 изначально необходимо все запретить. К хорошему быстро привыкаешь, и если
открыть что-то лишнее, то потом отучить пользователей будет трудно, и процесс
закрытия сервиса станет проходить с большими сложностями;
 если есть возможность, необходимо запретить все типы ICMP-сообщений. Мы
еще не раз будем говорить об опасности сканирования сети с помощью ICMPпакетов;
 запретить доступ к порту 111. На нем работает portmapper, который необходим
для удаленного вызова процедур (RPC, Remote Procedure Call) на сервере и получения результата. С помощью утилиты rpcinfo хакер может узнать, какие
RPC-сервисы работают на вашем сервере. Например, выполните следующую
команду:
rpcinfo -p localhost

Результатом будет примерно следующее:
Program vers proto port
100000
2
tcp
111
100000
2
udp
111
100024
1
udp 32768
100024
1
tcp 32768
391002
2
tcp 32769

portmapper
portmapper
status
status
sgi_fam

Как видите, одна команда может сообщить весьма большое количество информации, поэтому 111-й порт необходимо закрыть;
 для облегчения управления доступом к портам разделите открытые ресурсы на

две категории:

Tlgm: @it_boooks

Управление доступом

169

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

4.14. Повышение привилегий
В заключение рассмотрения темы безопасности необходимо подробно познакомиться с командой sudo, которая позволяет выполнять программы от имени другого
пользователя.
Мы уже говорили в разд. 2.7, что нельзя работать в системе под учетной записью
администратора. Это опасно по следующим причинам:
 программы, запущенные вами таким образом, работают с правами администра-

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

лошности бывают часто, потому что в ОС Linux поддерживаются достаточно
мощные возможности.
Если у вас в системе нет пользователя, не обладающего правами администратора,
то добавьте его сейчас (см. разд. 4.3). Теперь войдите в систему под его учетной
записью и попробуйте просмотреть файл /etc/shadow, например, с помощью следующей команды:
cat /etc/shadow

В ответ на это вы должны получить сообщение о недостатке прав доступа. Теперь
выполните ту же команду через sudo:
sudo cat /etc/shadow

Вы увидите сообщение, что ваша учетная запись отсутствует в файле /etc/sudoers,
в котором прописываются разрешения на использование команды sudo. Этот файл
можно просматривать, но не желательно впрямую редактировать, чтобы избежать
проблемы конкурентного доступа. Дело в том, что вы с правами sudo должны модифицировать файл конфигурации прав выполнения sudo, т. е. вы модифицируете
права доступа в файле, который вам предоставляет эти права. Даже звучит запутанно, и система тоже может запутаться. Но главная проблема может возникнуть,
если еще и допустить ошибку.
Чтобы избежать проблем, для редактирования нужно использовать команду visudo.
Она запустит текстовый редактор nano (это поведение по умолчанию в Ubuntu).
Какой редактор запускать — можно настроить, и в CentOS, кажется, по умолчанию
запускается vi. После редактирования произойдет проверка синтаксиса, и таким

Tlgm: @it_boooks

170

Глава 4

образом мы сможем обезопасить себя от возможных проблем. Пример содержимого этого конфигурационного файла приведен в листинге 4.2.
Листинг 4.2. Содержимое конфигурационного файла /etc/sudoers
# User privilege specification
root
ALL=(ALL) ALL
# Uncomment to allow people in group wheel to run all commands
# %wheel
ALL=(ALL)
ALL
# Same thing without a password
# %wheel
ALL=(ALL)
NOPASSWD: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now

В этом файле только одна строка без комментария:
root

ALL=(ALL)

ALL

Она состоит из трех параметров:
 имя — пользователь (или группа), которому разрешено выполнять определенную команду. Я рекомендую указывать конкретных пользователей. Хакер может
стать участником группы и, не обладая при этом частными привилегиями, получит доступ к выполнению опасных команд;
 компьютер — имя машины, на которой можно выполнять команду от лица
администратора;
 команды, которые разрешено выполнять указанному пользователю (указываются после знака «равно»).
Итак, чтобы пользователь смог просмотреть файл /etc/shadow, необходимо прописать соответствующее право. В моей системе есть простой пользователь с именем
robert. Для него я добавляю в файл /etc/sudoers следующую запись:
robert

ALL=ALL

Теперь пользователь robert сможет выполнять с помощью sudo любые администраторские задачи. Проверьте это, повторив выполнение команды:
sudo cat /etc/shadow

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

Tlgm: @it_boooks

Управление доступом

171

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

ALL=/bin/cat /etc/shadow

Обратите внимание, что я указываю полный путь к программе cat (напоминаю, его
можно узнать с помощью команды which), — это необходимо, иначе вместо результата, полученного по разрешенной команде, пользователь robert увидит сообщение
об ошибке в конфигурации.
Допустим, вы хотите расширить права пользователя и позволить ему не только
просматривать файл паролей, но и монтировать компакт-диск (CD-ROM). Для этого изменяем строку, добавляя разрешение на выполнение команды mount:
robert

ALL=/bin/cat /etc/shadow, /bin/mount

Обратите внимание, что в случае с доступом к файлу /etc/shadow мы дали добро
только на его просмотр, явно указав утилиту cat с параметром в виде пути к файлу
с паролями. Это логично, ведь нет смысла изменять его, когда для этого существует
команда passwd. Можно задать просто разрешение на выполнение команды cat:
robert

ALL=/bin/cat, /bin/mount

Но в этом случае пользователь robert сможет от имени root просматривать любые
файлы в системе, включая те, которые не должны быть ему видны.
Для команды mount мы не указываем ничего, кроме нее самой. Таким образом,
пользователь сам может варьировать ее параметры. Если явно указать в качестве
аргумента CD-ROM, то пользователь сможет монтировать именно это устройство:
robert ALL=/bin/cat /etc/shadow, /bin/mount /dev/cdrom

В рассмотренных примерах вместо имени компьютера я всегда применял ключевое
слово ALL, что соответствует любой машине. Тем не менее тут желательно указывать конкретный компьютер, к которому относится та или иная запись. Чаще всего
это локальный сервер.
С помощью утилиты sudo можно выполнять команды от лица различных пользователей. Для этого применяется ключ -u. Например, следующая команда пытается
просмотреть файл паролей от имени пользователя flenov:
sudo —u flenov cat /etc/shadow

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

Tlgm: @it_boooks

172

Глава 4

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

ALL=NOPASSWD:/bin/cat /etc/shadow, /bin/mount /dev/cdrom

Теперь при выполнении команды sudo пароль вообще запрашиваться не будет. Это
не совсем безопасно, если вы не указываете необходимые команды, а лишь ключевое слово ALL:
robert

ALL=NOPASSWD:ALL

И если хакер получит доступ к учетной записи robert, то сможет с помощью команды sudo выполнять в системе любые команды. Если же вы указываете возможные
директивы, то опасность взлома системы уменьшается в зависимости от того, насколько опасные команды вы разрешаете выполнять пользователю robert и в какой
мере защищена эта учетная запись (длина и сложность пароля, прилежность владельца и т. д.).
С помощью утилиты sudo можно предоставить доступ для корректировки файлов, но
я никогда не делегирую возможность корректировки конфигурационных файлов
с помощью редакторов.
К потенциально опасным командам, которые нежелательно предоставлять для выполнения с правами root другим пользователям, относятся:
 редактирование файлов — позволяет злоумышленнику изменить любой конфи-

гурационный файл, а не тот, что вы задали;
 chmod — дает возможность хакеру понизить права доступа на конфигурацион-

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

равным нулю, то он получит полные права в системе;
 mount — позволяет монтировать устройства. Прописывайте в конфигурационном

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

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

Tlgm: @it_boooks

Управление доступом

173

Версии sudo от 1.5.7 до 1.6.5.p2 содержали ошибку выделения памяти. Хакер мог
воспользоваться этим для выполнения атаки переполнения стека. Проверьте вашу
версию, вызвав команду sudo с ключом -V. Если вы являетесь администратором, то
увидите на экране подробную информацию о программе, вроде приведенной в листинге 4.3.
Листинг 4.3. Информация о программе sudo
Sudo version 1.6.5p2
Authentication methods: 'pam'
Syslog facility if syslog is being used for logging: authpriv
Syslog priority to use when user authenticates successfully: notice
Syslog priority to use when user authenticates unsuccessfully: alert
Ignore '.' in $PATH
Send mail if the user is not in sudoers
Use a separate timestamp for each user/tty combo
Lecture user the first time they run sudo
Require users to authenticate by default
Root may run sudo
Allow some information gathering to give useful error messages
Visudo will honor the EDITOR environment variable
Set the LOGNAME and USER environment variables
Length at which to wrap log file lines (0 for no wrap): 80
Authentication timestamp timeout: 5 minutes
Password prompt timeout: 5 minutes
Number of tries to enter a password: 3
Umask to use or 0777 to use user's: 022
Path to mail program: /usr/sbin/sendmail
Flags for mail program: -t
Address to send mail to: root
Subject line for mail messages: *** SECURITY information for %h ***
Incorrect password message: Sorry, try again.
Path to authentication timestamp dir: /var/run/sudo
Default password prompt: Password:
Default user to run commands as: root
Path to the editor for use by visudo: /bin/vi
Environment variables to check for sanity:
LANGUAGE
LANG
LC_*
Environment variables to remove:
BASH_ENV
ENV
TERMCAP
...
...

Tlgm: @it_boooks

174

Глава 4

When to require a password for 'list' pseudocommand: any
When to require a password for 'verify' pseudocommand: all
Local IP address and netmask pairs:
192.168.77.1 / 0xffffff00
Default table of environment variables to clear
BASH_ENV
ENV
TERMCAP
...
...
Default table of environment variables to sanity check
LANGUAGE
LANG
LC_*

Я не стал приводить результат выполнения команды полностью, но основную
информацию здесь можно увидеть. Вначале нам сообщается версия программы
sudo — в нашем случае это 1.6.5.p2. Наиболее интересными в этом листинге являются следующие три строки:
Authentication timestamp timeout: 5 minutes
Password prompt timeout: 5 minutes
Number of tries to enter a password: 3

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

Tlgm: @it_boooks

ГЛАВА

5

Администрирование

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

5.1. Полезные команды
для сетевых соединений
Для начала познакомимся с некоторыми программами и командами, которые позволят вам упростить администрирование и сделать его эффективнее. И начнем мы
с команд, необходимых для понимания последующего материала.
Я только однажды работал чисто системным администратором, а все остальное
время занимаюсь программированием, и очень часто мне приходится поддерживать
и сайты. Когда я занимался разработкой сайтов Sony, то в случае проблем все бежали ко мне, а не к администраторам, потому что я могу диагностировать проблему
не только с точки зрения администратора, но и программиста.
И когда что-то происходит с сервером, то очень часто приходится проверять первым делом сетевое соединение: нет ли проблем связи с серверами приложений,
доступна ли база данных и т. д. Команды работы с сетью, наверное, самые популярные.

Tlgm: @it_boooks

176

Глава 5

5.1.1. ping
Одна из часто используемых администраторами команд — ping. Она посылает
ICMP-пакеты в виде эхо-запросов на указанную систему для определения пропускной способности сети. О таких запросах мы уже говорили, когда рассматривали
сетевой экран (см. разд. 4.10).
Например, выполните команду: ping 195.18.1.41, и в ответ вы получите информацию примерно такого вида:
PING 195.18.1.41 (195.18.1.41) from 195.18.1.41 : 56(84) bytes of data.
64 bytes from 195.18.1.41: icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from 195.18.1.41: icmp_seq=2 ttl=64 time=0.094 ms
64 bytes from 195.18.1.41: icmp_seq=3 ttl=64 time=0.094 ms
64 bytes from 195.18.1.41: icmp_seq=4 ttl=64 time=0.095 ms
--- 195.18.1.41 ping statistics --4 packets transmitted, 4 received, 0% loss, time 3013ms
rtt min/avg/max/mdev = 0.094/0.096/0.102/0.007 ms

В этой команде IP-адрес можно заменить любым адресом в вашей сети или в Интернете, например:
ping microsoft.com

Первая строка — информационная, в ней отображается IP-адрес компьютера, с которым будет происходить обмен сообщениями (если вы указали символьное имя
хоста, то простой командой ping можно узнать его IP-адрес). В конце строки указан
размер пакетов данных, которые будут отправляться.
Следом на экране начнут появляться строки вида:
64 bytes from 195.18.1.41: icmp_seq=1 ttl=64 time=0.102 ms

Отсюда мы узнаем, что с адреса 195.18.1.41 было получено 64 байта. После двоеточия отображаются следующие параметры:
 icmp_seq — номер пакета. Это значение должно последовательно увеличиваться

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

время жизни, которое задается целым числом. По умолчанию в большинстве
версий ttl равен 64, но это значение может быть изменено. Каждый маршрутизатор при передаче пакета уменьшает значение ttl на единицу. Когда оно становится равным нулю, пакет считается заблудившимся и уничтожается. Таким
образом, по этому значению можно приблизительно сказать, сколько маршрутизаторов встретилось на пути;
 time — время, затраченное на ожидание ответа. По этому параметру можно

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

Tlgm: @it_boooks

Администрирование

177

изменяется от пакета к пакету. Но учитывайте, что время, затраченное на отправку и получение первого пакета, почти всегда выше, особенно при указании
имени, а не IP. Это связано с затратами на поиск в базе DNS. Все остальные пакеты должны идти равномерно.
Если ответ на какой-нибудь запрос не был получен, то вы увидите сообщение о его
потере. Дождитесь, пока программа не отправит 7–10 пакетов, чтобы по их параметрам оценить качество связи, после чего можно прервать сеанс нажатием комбинации
клавиш +. В результате вы увидите краткую статистику обмена сообщениями: количество отправленных, полученных и потерянных пакетов, а также минимальное, среднее и максимальное время обмена пакетами.
Вот основные параметры, которые можно использовать в команде ping:
 -c n — завершение работы после отправки (и приема) n пакетов. Например, вы
хотите послать пять запросов, тогда команда будет выглядеть следующим образом:
ping –c 5 195.10.14.18

 -f — форсированная передача. Например, вам нужно быстро отправить 50 за-

просов, тогда команда будет выглядеть так:
ping -f -c 50 195.10.14.18

Имейте при этом в виду, что ключ -f в сочетании с большим количеством пакетов значительного размера может сильно загрузить сеть и компьютер получателя, а в некоторых системах даже привести к временному отказу от обслуживания;
 -s n — размер пакета. Например, если вы хотите отправить пакет размером

в 1000 байтов, команда должна выглядеть так:
ping –s 1000 195.10.14.18

В некоторых старых версиях ОС были ошибки, и при получении слишком
большого пакета система зависала. В настоящее время погрешности такого рода
отсутствуют, и встретить подобную систему в Интернете сложно.
Это наиболее часто используемые параметры. Дополнительную информацию по
команде можно получить в справочной системе, выполнив команду: man ping.
В НИМАНИЕ !
Не каждый сервер отзывается на эхо-запросы. В некоторых системах сетевой экран
может быть настроен так, чтобы не пропускать ICMP-трафик, и тогда ответа не будет,
хотя реально сервер работает в нормальном режиме и пакеты другого типа может
воспринимать без проблем.

5.1.2. netstat
Эта команда показывает текущие подключения к компьютеру. Результат ее выполнения имеет примерно следующий вид:
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address
Foreign Address

State

Tlgm: @it_boooks

178
tcp
tcp

Глава 5
0
0

0 FlenovM:ftp
192.168.77.10:3962
0 FlenovM:ftp-data 192.168.77.10:3964

ESTABLISHED
TIME_WAIT

Информация представлена в виде таблицы. Давайте рассмотрим ее колонки:
 Proto — базовый протокол, который использовался для соединения. Чаще всего

здесь можно видеть unix или tcp;
 Recv-Q — количество байтов, не скопированных пользовательской программой

из очереди;
 Send-Q — количество байтов в очереди на отправку удаленному компьютеру;
 Local Address — локальный адрес формата компьютер:порт. В качестве порта

может использоваться как символьное имя, так и число. В приведенном примере
в первой строке показан порт ftp, что соответствует числу 21;
 Foreign Address — удаленный адрес в формате IP:порт;
 State — состояние соединения.

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

5.1.3. telnet
Мощность Linux и ее текстовой консоли заключается в том, что вы можете выполнять все действия не только сидя непосредственно за терминалом, но и удаленно, за
тысячи километров. Нужно лишь подключиться к компьютеру на порт Telnetсервера с помощью Telnet-клиента, и можно считать, что вы в системе и к вашим
услугам мощности производительной техники, которая может быть недоступна домашнему пользователю.
В Windows очень мало утилит, способных работать в командной строке, поэтому
в этой ОС необходим и широко используется графический режим. Да и сама командная строка в Windows стала более или менее продвинутой совсем недавно (с появлением PowerShell). Для решения этой проблемы был создан терминальный доступ,
который позволяет на клиентской машине видеть экран сервера и работать с ним
так, как будто вы сидите непосредственно перед ним. Но этот метод отнимает
слишком много трафика и очень неудобен на медленных каналах связи.
Командная строка Linux по сравнению с графическим режимом практически не
расходует трафик и может приемлемо работать даже по самым медленным каналам — например, по соединениям GPRS сотового телефона или с домашнего модема, где скорость довольно мала.

Tlgm: @it_boooks

Администрирование

179

Как вы уже поняли, программное обеспечение Telnet состоит из серверной и клиентской частей. При запуске Telnet-сервера открывается порт 23, к которому можно
подключиться с клиентского компьютера и выполнять любые команды, которые
позволяет удаленный сервер.
Но это еще не все — с помощью Telnet-клиента можно подсоединяться и к любому
сервису, протокол которого является текстовым (т. е. команды читаемы и представляют собой текст). Например, можно подключиться на порт 25 и прямо из командной строки отправить E-mail-сообщение, подавая команды SMTP-сервера.
Если у вас есть установленный FTP-сервер, то уже сейчас вы можете выполнить
команду:
telnet localhost 21

Первый параметр здесь — это localhost, потому что я подразумеваю, что вы подключаетесь к локальному FTP-серверу. Если вы хотите работать с удаленным компьютером, то укажите его адрес. В качестве второго параметра указывается номер
порта. Сервер FTP принимает управляющие команды на порту 21, поэтому я указал
это число.
Точно так же я проверяю и веб-сайты. Если сайт не загружается, то можно проверить, отвечает ли хотя бы веб-сервер, и для этого можно попытаться подключиться
к 80-му порту:
telnet flenov.info 80

Если соединение установлено, то веб-сервер работает, и можно уже проверять
дальше, что именно недоступно.
Я рекомендую применять Telnet-клиент только для отладки различных сервисов, но
не для управления реальным компьютером. Поэтому на всех «боевых» серверах
отключайте сервер Telnet. Он небезопасен, потому что данные при Telnetуправлении передаются в открытом виде и могут быть перехвачены. Все попытки
сделать Telnet защищенным заканчивались неудачно и не приводили к желаемому
результату. Один из относительно безопасных вариантов использования Telnet —
это подключение через канал шифрования OpenSSL (от Secure Socket Layer, протокол защищенных сокетов). Но наибольшую популярность получило управление
сервером через протокол SSH (OpenSSH, Open Secure Shell), который мы рассмотрим позже, в разд. 5.3.
Таким образом, Telnet-клиент в системе необходим, а Telnet-сервер, если он у вас
установлен, следует срочно удалить и забыть как страшный сон.
Если вы все же решили использовать Telnet-сервер, то это необходимо делать только через протокол для безопасной связи по сети с применением открытых и секретных ключей (см. разд. 5.2). Тогда весь трафик будет шифроваться.
Если у вас установлен Telnet-сервер, то попробуйте сейчас подключиться к нему,
используя команду: telnet localhost. Если сервер запущен, и подключение разрешено сетевым экраном, то перед вами появятся сообщения примерно такого вида:

Tlgm: @it_boooks

180

Глава 5

Trying 127.0.0.1
Connected to localhost
Escape character is '^]'.
ASPLinux release 7.3 (Vostok)
Kernel 2.4.18-15asp on an i686
Login:

Очень плохо, что мы видим подробную информацию о дистрибутиве и ядре. И все
это становится известным еще до регистрации любому посетителю. Если хакер
увидит открытый порт 23, то ему уже не надо будет мучиться для выяснения, какая
у вас ОС и версия ядра, — достаточно подключиться к Telnet, и проблема решена.
Излишняя болтливость Telnet — большая дыра, с которой надо бороться в первую
очередь. Приветствие, которое вы можете видеть при подключении, находится
в файлах: /etc/issue и /etc/issue.net. Измените текст сообщения, например, следующим
образом:
echo Текст > /etc/issue
echo Текст > /etc/issue.net

Здесь Текст — это новое приветствие. Можно прописать и ложную версию ядра:
echo Debian Linux > /etc/issue
echo Kernel 2.4.4 on an i686 > /etc/issue.net

Не думаю, что так можно кого-то сильно запутать, и на реальную безопасность подобный обман не влияет, поэтому большинство специалистов просто рекомендуют
не показывать лишнего о своей ОС.
Проблема в том, что после перезагрузки содержимое файлов восстановится,
и Telnet в приветствии снова покажет всю информацию о системе. Чтобы этого не
произошло, после изменения текста приветствия можно установить на файлы
с приветствием атрибут +i, который запрещает любые изменения:
chattr +i /etc/issue
chattr +i /etc/issue.net

Но главная проблема Telnet — не болтливость, а отсутствие безопасности. Утилита
передает все команды в открытом виде, без шифрования. Если хакеру удастся каким-либо образом перехватить ваши пакеты, то он сможет увидеть не только выполняемые вами команды, но и пароли доступа.

5.1.4. r-команды
В Linux есть так называемые r-команды: rlogin, rsh, rcp, rsync, rdist. Мы не будем
их рассматривать, потому что все они создают большие проблемы в безопасности.
Если Telnet-клиент полезен для тестирования сервисов, то эти команды я включил
в обзор только для того, чтобы вы удалили их из системы, исключив тем самым
соблазн их использовать и возможность их применения хакером.

Tlgm: @it_boooks

Администрирование

181

Все r-команды устарели и небезопасны, потому что позволяют подключаться
к системе удаленно и при этом передают данные без шифрования.

5.2. Шифрование
Во времена рождения Интернета и первых сетевых протоколов еще не задумывались о безопасности. О ней стали думать только тогда, когда начали происходить
реальные взломы и целые вирусные эпидемии. Одним из самых больших упущений
было то, что в большинстве протоколов данные по сети передаются в открытом
виде, а сетевое оборудование позволяет прослушивать сетевой трафик.
В локальной сети есть свои особенности, потому что соединения могут осуществляться различными способами. При объединении компьютеров через центральное
устройство — хаб (hub) или коммутатор (switch) — все устройства в сети подключаются к центральному устройству (рис. 5.1). В наше время все больше испольузется беспроводное соединение, но идея остается та же — по Wi-Fi множество компьютеров могут подключаться к одному центральному устройству (маршрутизатору).

HUB
SWITCH

Рис. 5.1. Схема соединения компьютеров «звезда»

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

Tlgm: @it_boooks

182

Глава 5

Даже в домашних сетях сейчас в большинстве случаев используются умные коммутаторы, или маршрутизаторы (роутеры), которые поддерживают как проводное, так
и беспроводное Wi-Fi соединение, а они уже умнее и направляют пакеты только
получателям, а не всем подряд.
При работе через коммутаторы пакеты будет видеть только получатель, потому что
это устройство имеет встроенные возможности маршрутизации, которые для локальных сетей могут реализовываться через MAC-адреса (Media Access Control
Address, адрес управления доступом к среде), которые называют физическими
адресами, или через IP-адреса.
Физический адрес — это 48-разрядный серийный номер сетевого адаптера, присваиваемый ему производителем. Он уникален, потому что у каждого изготовителя свой
диапазон адресов (однако не стоит думать, что его невозможно изменить). К каждому порту коммутатора подключен компьютер с определенным MAC-адресом.
Пакет направляется только на порт адресата, и другие участники сети его не увидят.
Существуют коммутаторы, которые умеют управлять передачей на уровне IP-адреса (логический адрес), как это делают маршрутизаторы (router). При этом пакеты
отправляются исходя из логических, а не физических адресов, и коммутатор может
объединять целые сети.
Но даже в случае использования коммутатора есть возможность прослушать трафик на сервере. Такое положение дел никого не устраивает, особенно при работе
с конфиденциальными данными.
Переделывать существующие протоколы нереально, поскольку это накладно и
в некоторых случаях просто невыполнимо, потому что потребует изменения всех
существующих программ. С введением IPv6 разработчики учли некоторые недочеты старой версии IP, только вот 6-я его версия завоевывает популярность слишком
медленно.
Уже найдено более удобное и универсальное решение — туннелирование (tunneling), которое позволяет программам удаленного доступа различных разработчиков
взаимодействовать друг с другом, а также поддерживает несколько методов проверки подлинности, сжатия и шифрования данных. В общих чертах туннелирование выглядит следующим образом (на примере FTP):
 на клиентском компьютере на определенном порту (Порт 1) вы должны запустить программу для шифрования трафика. Теперь, вместо того чтобы передавать
данные на удаленный компьютер, вам следует с помощью FTP-клиента соединиться с Портом 1 своего компьютера и направлять данные на него. Полученные
данные будут шифроваться и передаваться по сети в закрытом программой
шифрования виде;
 на удаленном компьютере на определенном порту запускается такая же программа — она принимает зашифрованные данные, дешифрует их и передает
в открытом виде на порт FTP-сервера.
С помощью туннеля можно зашифровать протокол или работу программы, в которой шифрование изначально не реализовано. Для наиболее популярного протокола

Tlgm: @it_boooks

Администрирование

183

HTTP уже давно реализовали версию с шифрованием — HTTPS, для которой не
нужно открывать отдельный тунель.
На рис. 5.2 показано, как происходит шифрование данных, — все пакеты передаются через шифрующего их посредника. В настоящее время наиболее распространенным протоколом шифрования является SSL (Secure Sockets Layer, протокол защищенных сокетов). Он зарекомендовал себя как надежное средство обмена данными и уже многие годы защищает транзакции в Интернете.
̱͒͏͔͙͌
̵͙͙͇͔͔͑͗͌͋͌͢͢͢
̶͕͇͓͓͇͗͊͗͟͏͕͉͇͔͛͗͏ͦ
̮͇͟͏͕͉͇͔͔͇͔͔͛͗͌͋͌͢͢
Интернет
̮͇͟͏͕͉͇͔͔͇͔͔͛͗͌͋͌͢͢
Дешифрование
Открытые данные
Сервер
Рис. 5.2. Шифрование канала

Очень часто можно услышать сочетание SSL/TLS. Вторая часть — TLS — расшифровывается как Transport Layer Security. TLS-протокол основан на спецификации
протокола SSL версии 3.0, который был выпущен в 1996 году. После этого он уже
развивается TLS.
Были случаи, когда находили уязвимости и в TLS-протоколе, но их всегда очень
быстро исправляли и оставалось только обновить софт.
Рассмотрим шифрование в сети. Когда вы покупаете в электронном магазине какой-либо товар, то в этот момент организуется безопасное соединение с шифрованием, чтобы ни один злоумышленник не смог подсмотреть информацию о вашей
банковской карте. В момент подключения к серверу по HTTPS браузер автоматически запускает на компьютере клиента шифрование, в зашифрованном виде передает на сервер данные и в зашифрованном же виде получает ответы.
Выходит, что шифрование не изменяет протокол, он остается тем же самым
TCP/IP, просто на сторонах клиента и сервера появляются посредники, которые
шифруют и дешифруют данные. Использование такого метода очень удобно тем,
что позволяет шифровать трафик любого протокола. И даже если в криптографическом алгоритме будет найдена ошибка или в него будут внесены изменения для
более качественного шифрования (например, с использованием более длинного

Tlgm: @it_boooks

184

Глава 5

ключа), то не придется вносить изменения в протокол. Достаточно обновить программу шифрования, и все новые возможности станут доступными.
Рассмотрим пример с веб-сервисом, который работает на порту 80. На сервере
можно запустить программу шифрования — например, на порту 1443, и все данные, которые будут приходить на него, станут дешифровываться и передаваться на
порт 80. Если вы хотите предоставлять доступ к сети только по протоколу SSL, то
к порту 80 можно закрыть доступ извне при помощи сетевого экрана (о работе сетевого экрана мы подробно говорили в главе 4), а разрешить лишь подключения
с сервера шифрования.
Адреса сайтов, которые защищены специальными ключами, начинаются с префикса https://. Буква s как раз и говорит о том, что соединение безопасно. Помимо этого, при подключении через браузер с включенным SSL где-либо в его окне —
в строке состояния или в адресной — появляется значок с изображением висячего
замка. Например, в популярном среди пользователей Windows браузере Internet
Explorer (рис. 5.3) этот замок расположен в конце адресной строки, а в популярном
браузере Chrome он находится в ее начале. В последней версии браузера от Microsoft — Edge — он также перенесен в начало адресной строки.

Рис. 5.3. Безопасное соединение в браузере Internet Explorer

Tlgm: @it_boooks

Администрирование

185

Более точно определитьтип используемого соединения можно по свойствам документа. Большинство браузеров имеют команду просмотра свойств загруженной
страницы, вызвав которую можно увидеть и применяемое шифрование. Например,
в окне Internet Explorer необходимо нажать правую кнопку мыши и выбрать из появившегося контекстного меню опцию Свойства (Properties).
Перед вами откроется окно, как на рис. 5.4. Обратите внимание на поле Подключение (Connection). Информация в нем свидетельствует, что используется протокол
TLS 1.2, 256-разрядное шифрование AES и RSA с 2048-разрядным обменом.

Рис. 5.4. Свойства документа в Internet Explorer

Для шифрования интернет-трафика нужен сертификат, который стоит денег. У таких сайтов, как Microsoft, Google, и других сайтов с высокой нагрузкой обработку
запросов клиентов осуществляют весьма много серверов. Обычно серверы, которые
обрабатывают запросы, находятся уже в защищенной сети, и к ним невозможно
подключиться извне. Только определенный компьютер, который выполняет роль
шлюза, может подключаться к ним. Он передает трафик извне и распределяет его
по серверам. Эта достаточно простая схема, и она позволяет установить сертификат
только на один-единственный сервер-шлюз. Он расшифровывает трафик и направляет его дальше уже не защищенным на определенный порт. А по номеру порта
можно решить, является трафик защищенным или нет.

Tlgm: @it_boooks

186

Глава 5

5.2.1. Программа stunnel
В ОС Linux для шифрования и дешифрования трафика чаще всего используется
программа stunnel. Однако она лишь организует канал и выступает посредником, а
для самого шифрования задействуется пакет OpenSSL, доступный в большинстве
дистрибутивов Linux. Вероятно, он у вас уже установлен, а если нет, то его легко
установить с помощью соответствующего пакета с инсталляционного диска. Более
подробную информацию по OpenSSL и его последние обновления можно найти на
сайте: www.openssl.org.
В основу OpenSSL положено применение пары ключей: открытого и закрытого.
С помощью открытого ключа можно только зашифровать данные, и он посылается
клиентом на сервер по открытому каналу (отсюда и его название). Сервер использует его для шифрования, но для расшифровки необходим закрытый ключ, который
известен только клиенту.
У программ OpenSSL и stunnel очень много параметров, и рассматривать все их
здесь бессмысленно, потому что запомнить весь их набор проблематично, да и
обычно не нужно. Лучше мы разберем реальный пример и познакомимся с наиболее часто используемыми параметрами этих программ.
Итак, давайте для начала запустим на сервере программу stunnel, которая будет
расшифровывать входящий трафик и передавать его на какой-нибудь порт — например, 25 (здесь работает SMTP-сервер sendmail). Для этого выполните следующую команду:
stunnel –p /usr/share/ssl/cert.pem –d 9002 –r 25

Здесь используются три параметра:
 -p — ключ, после которого указывается SSL-сертификат авторизации, по умол-

чанию уже созданный во время установки ОС или программы stunnel и находящийся в файле /usr/share/ssl/cert.pem;
 -d — показывает, что туннель должен работать как домен. После этого ключа

ставится IP-адрес (необязательный параметр) и порт, на котором нужно ожидать
подключения. Если адрес не указан, как в нашем примере, то прослушиваться
будут все интерфейсы локального компьютера. В качестве порта был выбран
номер 9002. Все пришедшие на него данные считаются зашифрованными, и они
будут дешифровываться для передачи на другой порт локального компьютера;
 -r — после этого ключа указывается имя компьютера (необязательный пара-

метр) и порт, куда нужно передавать расшифрованные данные. Если хост не
указан, то данные будут пересылаться на порт локального компьютера — в нашем случае на порт 25, где должен работать SMTP-сервер. Если данные предназначены другому компьютеру, то в качестве параметра укажите 192.169.77.1:25,
где 192.169.77.1 — это IP-адрес компьютера. Однако помните, что при этом незашифрованные данные будут пересылаться по сети, чего мы как раз пытались
избежать.

Tlgm: @it_boooks

Администрирование

187

Теперь рассмотрим запуск клиента. Тут все намного проще:
stunnel –с -d 1000 –r 192.168.77.1:9002

Здесь у нас появился еще один ключ: -c — он означает, что туннель создается для
клиента (по умолчанию программа stunnel запускается в серверном режиме).
Помимо этого в примере запуска клиента присутствуют и уже известные параметры: –d — с указанием порта, на котором необходимо ждать подключения (значение 1000), и -r, в котором указывается адрес и порт для передачи зашифрованных
данных.
Теперь достаточно настроить свою клиентскую программу так, чтобы при отправке
почты она направлялась на порт (в нашем случае 1000) компьютера, где запущен
stunnel-клиент, который будет шифровать данные и пересылать их на порт 9002
сервера с адресом 192.168.77.1. Там зашифрованные данные будет принимать
stunnel-сервер, расшифровывать их и передавать на 25-й порт сервера.
Если на вашей системе включен сетевой экран и запрещены подключения по указанным портам, то описанные соединения сетевым экраном будут отклонены.

5.2.2. Дополнительные возможности OpenSSL
При запуске программы stunnel на сервере мы задали использование сертификата
авторизации, но не сказали, как проверять его подлинность. Для указания уровня
проверки подлинности сертификата авторизации служит ключ -v, после которого
идет число:
 0 — нет никакой проверки;
 1 — если сертификат присутствует, то он проверяется на подлинность. Если по-

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

ся подлинным, соединение не может быть установлено;
 3 — наличие сертификата обязательно, и помимо этого он должен присутство-

вать в локальном хранилище (специальный список). В этом случае с помощью
опции –a нужно указать каталог, в котором находятся сертификаты.
Сервер SSL может расшифровывать трафик и передавать его на порт принимающей
программы не только локального, но и другого компьютера. Таким образом, сервер
SSL и сервер-получатель трафика могут находиться на разных компьютерах. Неплохо, чтобы сервер после расшифровки данных прятал IP-адрес клиента, с которого были отправлены данные, и это возможно, если указать опцию –T.
Во время установки пакета OpenSSL на вашем диске создаются сертификаты и пары ключей, которые используются для шифрования. Все это расположено в каталоге /usr/share/ssl/.
С помощью опции –n можно непосредственно указать протокол, с которым будет
происходить работа. В настоящий момент поддерживаются POP3 (Post Office

Tlgm: @it_boooks

188

Глава 5

Protocol, протокол обработки входящих сообщений), SMTP (Simple Mail Transfer
Protocol, простой протокол электронной почты) или NNTP (Network News Transfer
Protocol, сетевой протокол передачи новостей).
Для большинства основных протоколов существуют номера портов, уже ставшие
стандартом. Есть даже названия защищенных вариантов протоколов, которые, как
правило, получаются за счет добавления к наименованию основного буквы s, как
раз и указывающей на безопасное соединение через SSL. Эта информация приведена в табл. 5.1.
Таблица 5.1. Список протоколов с номерами портов
Порт TCP при обычном
соединении

Название SSL-варианта
протокола

Порт TCP
при SSL-соединении

HTTP

80

HTTPS

443

SMTP

25

SMTPS

465

LDAP

329

LDAPS

636

TELNET

23

TELNETS

992

SHELL

514

SSH

22

FTP

21

FTPS

990

FTP-DATA

20

FTPS-DATA

989

IMAP

143

IMAPS

993

POP3

110

POP3S

995

IRC

194

IRCS

994

Протокол

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

5.2.3. Шифрование файлов
Некоторые серверы могут использоваться для хранения архивных данных, которые,
несмотря на такой статус, должны быть скрыты от постороннего взгляда. Наилучший вариант защиты — шифровать файлы, чтобы никто не смог увидеть их содержимое, и пакет OpenSSL предоставляет нам такую возможность.
Шифрование необходимо не только для резервных копий файлов или архивных
данных, но и для файлов с секретной информацией, которые необходимо передать
по незащищенным каналам связи — например, через электронную почту или публичный FTP-сервер.
Для шифрования необходимо выполнить команду: /usr/bin/openssl, которая имеет
следующий синтаксис:
/usr/bin/openssl алгоритм –in файл1 –out файл2

Tlgm: @it_boooks

Администрирование

189

Количество используемых алгоритмов исчисляется десятками. Наиболее распространенным является DES (Data Encryption Standard, стандарт шифрования данных). Я тоже отдаю предпочтение именно ему. О поддерживаемых алгоритмах
можно узнать на сайте разработчиков или по команде: man openssl.
Параметр –in задает входной файл, который необходимо
–out указывается имя файла, куда сохраняется результат.

шифровать, а после ключа

При дешифровании в команду необходимо добавить ключ –d. Соответственно, аргументом параметра –in задается зашифрованный файл, а параметра –out — имя
файла для сохранения результата:
/usr/bin/openssl алгоритм –d –in файл2 –out файл1

В качестве примера зашифруем список паролей /etc/passwd в файл /home/passwd по
алгоритму DES. Для этого выполним команду:
/usr/bin/openssl des –in /etc/passwd –out /home/passwd

В ответ на эту директиву программа попросит вас указать пароль и затем повторить
его ввод, чтобы исключить возможные ошибки.
Выполните команду: cat /home/passwd и убедитесь в том, что содержимое этого
файла нечитаемо.
Для расшифровки файла выполните команду:
/usr/bin/openssl des –d –in /home/passwd –out /etc/passwd

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

5.2.4. Туннель глазами хакера
Хакеры могут использовать туннели для своих целей. Например, несколько лет назад мой компьютер был подключен к Интернету по технологии ADSL (Asymmetric
Digital Subscriber, асимметричная цифровая абонентская линия). Это сейчас легко
найти тарифы с безлимитным трафиком, а в начале 2000-х с этим были проблемы.
В абонентскую плату входило всего 400 Мбайт трафика. Ну что такое 400 Мбайт?
Для меня это день работы в экономном режиме, потому что общаться приходилось
много, а из почтового ящика я иногда выкачиваю до 20 Мбайт в день. Превышение
же лимита обходилось весьма дорого.
Как обойти ограничение и получить бесплатный трафик? Подобно большинству
провайдеров, мой также предоставлял абсолютно бесплатный трафик со своих серверов, к которым можно было обращаться сколько угодно. Жаль, что на этих серверах ничего полезного для меня не было, но полезным оказался сам такой подход.
В мою абонентскую плату входило 10 Мбайт серверного пространства для создания визитной карточки в Интернете. Максимум, что получалось там разместить, —
домашнюю страничку. Но мне было нужно не это. Главное, что трафик с этого сай-

Tlgm: @it_boooks

190

Глава 5

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

Hacker
stunnel

Server

Proxy

Рис. 5.5. Подключение к Интернету через веб-сервер

Таким образом, можно было скачивать не 400 Мбайт трафика, а целые гигабайты,
и все бесплатно. Не знаю, остались еще где-то лимитированные тарифы, но в Канаде (где я живу) они до сих пор еще есть.
Еще один способ нестандартного использования туннелирования — расширение
возможностей сетевого доступа. Например, в некоторых локальных сетях может
быть запрещен какой-либо протокол доступа в Интернет. Мне довелось работать
в организации, где было разрешено обращение к веб-сайтам только по протоколу
HTTP. Все остальное было запрещено. Руководство мотивировало это тем, что
пользователи не должны иметь возможность передачи файлов в Интернет, чтобы
нельзя было отправить куда-либо секретную информацию.
Как обойти такое ограничение? Снова ставим туннель на веб-сервере, и можно использовать любой другой протокол, пряча весь трафик в HTTP, откуда туннель уже
направляет данные на нужные порты с нужным протоколом.
Например, нам нужен доступ к FTP. На каком-нибудь сервере в Интернете на порту
80 (доступ к которому разрешен, потому что это стандартный порт для веб-сервера)

Tlgm: @it_boooks

Администрирование

191

ставим сервер туннеля и настраиваем его на подключение к нужному FTP-серверу.
А на своем компьютере устанавливаем клиент. С помощью клиента соединяемся
с портом 80 своего сервера и можем передавать данные, которые будут перенаправляться на нужный FTP-сервер.
Такие туннели уже не нуждаются в шифровании и могут быть реализованы с помощью несложных программ — например, сценариев на языке Perl. Для передачи
пакетов не обязательно использовать HTTP. Подойдет практически любой протокол на основе TCP.
Как видите, абсолютно безопасная на первый взгляд и даже предназначенная для
защиты технология превращается в средство взлома ограничений, которыми «наградил» вас администратор.
Если вы обладаете хорошими знаниями программирования на PHP или Perl, то можете написать веб-сценарии, которые на сервере будут обращаться к нужным вам
ресурсам, чтобы работать с необходимым сервером через веб-браузер. Получится
что-то похожее на работу с почтой через сеть. Эта возможность есть на большинстве почтовых сервисов, и вам она должна быть знакома на практике.

5.2.5. Шифрование домашнего каталога
Я давно уже не использовал Linux в качестве десктопной системы, а только в качестве серверной. Когда ОС установлена на сервере, то обычно этот сервер находится
в яйце, яйцо в курице, курица в ларце... Ой, это не та книга, но смысл тот же самый.
Серверы — это обычно стационарные компьютеры, которые чаще всего сейчас
размещены в специальных стойках, стойки собраны в специальных помещениях
с надлежащим охлаждением, помещения находятся в специальных центрах данных,
которые обычно под хорошей защитой. Я не знаю, имеет ли смысл шифровать диски на серверах и делает ли это кто-то? Я никогда не шифрую диски на серверах,
потому что уверен в средствах защиты центров данных и уверен, что к стойкам
с серверами доступ получат только те, кто реально имеет на это право.
А вот для ноутбуков с десктопной ОС шифрование очень даже необходимо. Как мы
уже увидели ранее, восстановить пароль в ОС Linux не так уж и сложно при наличии физического доступа, если подключить диск к другому компьютеру. От подключения к другому компьютеру может спасти шифрование диска. Десктопные
компьютеры иногда воруют, у меня на моей первой работе был случай в 1996 году,
когда из офиса на 6-м этаже (самый верхний) украли новенький компьютер на процессоре Intel Pentium. Как же жалко было его.
Ну а в случае с ноутбуками шифрование дисков — это просто обязательная функция. Ноутбуки воруют, забывают в публичных местах, и данные на них спасти может только шифрование.
Хотя на протяжении всей книги я описываю серверную ОС и при этом считаю, что
шифрование принесет больше пользы ноутбукам, мы все же рассмотрим здесь
шифрование, потому что это все же относится к безопасности, которая является
центральной темой этой книги.

Tlgm: @it_boooks

192

Глава 5

Я рекомендую полное шифрование всего диска, но есть способ проще — зашифровать только пользовательские файлы из каталога home. Дело в том, что шифровать
исполняемые файлы нет смысла, а очень часто самое важное хранится именно
в пользовательских данных.
Для шифрования всего домашнего каталога пользователя можно использовать программу ecryptfs. Допустим, что у вас в системе есть пользователь username, тогда
его домашний каталог можно зашифровать следующей командой:
sudo ecryptfs-migrate-home -u username

Если программа ecryptfs у вас не установлена, то ее можно установить так:
sudo apt-get install ecryptfs-utils cryptsetup

Отсутствие на компьютере программы ecryptfs — не единственная причина, почему
команда ее запуска может не выполниться: файлы в домашнем каталоге пользователя в этот момент использоваться не должны. Лучше всего, если пользователь
полностью выйдет из системы.
Если команда миграции выполнилась успешно, то вы должны увидеть инструкцию,
согласно которой пользователь должен войти в систему, и это нужно сделать до ее
перезагрузки. Если он сможет это сделать и сможет работать с файлами, то все
прошло успешно.
Чтобы сделать все наиболее безопасно, сам пользователь должен выполнить
команду:
ecryptfs-unwrap-passphrase

Команду эту также нужно выполнить сразу после миграции и не затягивать с ней.
Она не требует прав sudo, что вполне логично, — ведь простые пользователи не
могут и не должны иметь права повышать свои привелегии. Смысл команды —
создать фразу для шифрования.
Шифрование пользовательских файлов делает их практически защищенными. Осталась одна возможность, которая может стать причиной утечки зашифрованной
информации, — файл подкачки. Если какая-либо пользовательская информация
попала в память и ОС сбросила эту страницу памяти на диск в файл подкачки,
а хакер смог прочитать этот файл, то это станет для вас серьезной проблемой.
Поэтому рекомендуется зашифровать и файл подкачки, для чего администратор
системы должен выполнить команду:
ecryptfs-setup-swap

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

Tlgm: @it_boooks

Администрирование

193

5.3. Протокол SSH
Мы уже говорили о том, что Telnet не подходит для удаленного управления сервером, потому что далеко не безопасен. А желание и потребность в таком управлении
есть. В больших сетях, как правило, задействованы несколько серверов, и бегать от
одного монитора к другому накладно и неудобно. Любой администратор хочет сидеть за одним компьютером и удаленно управлять всем комплексом, используя при
этом безопасные каналы связи.
Во время сеансов удаленного управления администратор передает по сети много
конфиденциальной информации (например, пароли root), которая ни в коем случае не должна быть видна прослушивающим утилитам. Для обеспечения безопасной связи создано множество различных программ, но самой популярной стала
SSH, которая сейчас поставляется в большинстве дистрибутивов Linux.
На Windows-серверах я часто использую утилиту Cygwin, в которой у меня работают различные скрипты. Cygwin — это аналог командной строки Linux под
Windows, в которой есть практически все Linux-команды. Не знаю, как сейчас, но
раньше в Cygwin, кажется, не было команды sudo, и чтобы получить права администратора, достаточно было просто соединиться по SSH-протоколу с локальной машиной. Открываем Cygwin, соединяемся с локальной машиной от пользователя root
и выполняем команды уже от его имени.
Преимущество протокола SSH заключается в том, что он позволяет удаленно выполнять команды, но при этом требует аутентификации и шифрует канал связи.
Важным моментом является и то, что даже пароли при проверке подлинности пользователя передаются в зашифрованном виде.
В настоящее время существуют две версии протокола SSH — с номерами 1 и 2.
Вторая версия использует более стойкий алгоритм шифрования и исправляет некоторые ошибки предыдущей версии. В Linux сейчас поддерживаются обе версии.
Любопытно, что в ОС Linux за протокол SSH отвечает OpenSSH, для которого родной платформой можно считать другую UNIX-систему — OpenBSD — и который
клонировался во все UNIX-платформы, в том числе и в Linux. Но даже сейчас в
конфигурационных файлах можно иногда увидеть в комментариях имя OpenBSD.
Протокол SSH требует для работы настройки сервера и клиента. Сервер ожидает
подключения и выполняет директивы пользователя, а с помощью клиента вы осуществляете соединение с сервером и посылаете запросы на выполнение команд.
Таким образом, для нормальной работы вы должны правильно сконфигурировать
обе части протокола.

5.3.1. Конфигурационные файлы
Все настроечные файлы протокола SSH находятся в каталоге /etc/ssh. Если конфигурационного файла нет, значит, соответствующий пакет не установлен, и следует
выполнить команду:
sudo apt-get install ssh

Tlgm: @it_boooks

194

Глава 5

В каталоге /etc/ssh можно увидеть следующий набор файлов:
 файл конфигурации SSH-сервера — sshd_config;
 файл конфигурации SSH-клиента — ssh_config;
 файлы ключей для различных алгоритмов:

• ssh_host_dsa_key;
• ssh_host_dsa_key.pub;
• ssh_host_key;
• ssh_host_key.pub;
• ssh_host_rsa_key;
• ssh_host_rsa_key.pub.
Почему так много файлов с ключами? Просто SSH работает с разными алгоритмами шифрования и поддерживает два наиболее популярных и криптостойких алгоритма: DSA (ssh_host_dsa_key, ssh_host_dsa_key.pub) и RSA (ssh_host_rsa_key и ssh_
host_rsa_key.pub).
Замечу, что первое сокращение — DSA — означает Digital Signature Algorithm (алгоритм цифровой подписи), тогда как второе — RSA, несмотря на схожесть написания, состоит из первых букв имен основателей этого алгоритма шифрования:
Ronald Rivest, Adi Shamir и Leonard Adleman.
Оставшиеся два файла: ssh_host_key и ssh_host_key.pub — хранят ключи для первой
версии SSH. Для каждого алгоритма требуется по два файла: с расширением pub —
хранит публичный (открытый) ключ, без расширения — содержит приватный (закрытый) ключ.
С помощью открытого ключа можно зашифровать данные и отправить их на сервер, но для расшифровки нужен только закрытый ключ, который не может быть
подобран простыми алгоритмами. Он должен иметься только у вас, его необходимо
беречь и никому не показывать.

5.3.2. Основные параметры
конфигурации сервера SSH
Давайте теперь рассмотрим содержимое файла конфигурации SSH-сервера (sshd).
Файл достаточно большой, и для экономии места я привел только небольшую его
часть (листинг 5.1).
Листинг 5.1. Файл конфигурации sshd
#Port 22
#Protocol 2,1
#ListenAddress 0.0.0.0
#ListenAddress ::

Tlgm: @it_boooks

Администрирование

195

# HostKey for protocol version 1
# Ключ для первой версии протокола
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
# Ключи для второй версии протокола
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
# Lifetime and size of ephemeral version 1 server key
# Время жизни и размер регенерируемого серверного ключа версии 1
#KeyRegenerationInterval 3600
#ServerKeyBits 768
# Logging
# Ведение логов
#obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO

Рассмотрим основные параметры, которые вам могут пригодиться:
 Port — порт, на котором ожидаются подключения. По умолчанию — 22. Неко-

торые администраторы любят изменять значение по умолчанию, перенося сервер на другой порт. В какой-то степени это оправданно. Например, если у вас
нет веб-сервера, то можно поместить SSH на порт 80. Хакеры будут думать, что
это веб-сервер, и не станут его ломать;
 Protocol — поддерживаемые протоколы. Обратите внимание, что первым идет

число 2, а затем 1. Это значит, что сервер будет сначала пытаться подключиться
по второй версии протокола, и только затем по первой. Я рекомендую убрать
знак комментария с этой строки и удалить число 1, чтобы использовалась только
последняя версия. Уже давно пора обновить клиентское программное обеспечение и перейти на более безопасные технологии. Зацикливание на старых программах приносит только убытки;
 ListenAddress — адрес для прослушивания подключения. У вашего сервера мо-

жет быть несколько сетевых карт. По умолчанию идет прослушивание всех интерфейсов. Вы должны указать только те, с которых будете подключаться по
SSH. Например, очень часто одна сетевая карта смотрит во внутреннюю сеть, а
другая — в Интернет. Если вы будете подключаться по SSH-протоколу лишь из
внутренней сети, то следует прослушивать только этот адрес (задается в формате
адрес:порт). Разрешается включать несколько таких записей, чтобы указать требуемые интерфейсы;
 HostKey — путь к файлам, содержащим ключи шифрования. Нужно прописывать

только закрытые ключи, которые использует сервер для расшифровки пакетов;
 KeyRegenerationInterval — интервал времени, через который сервер обновляет

ключи. В версии 1 во время сессии ключи могут регенерироваться. Это позволя-

Tlgm: @it_boooks

196

Глава 5

ет сделать невозможным раскрытие пакетов за счет смены ключей, которые по
умолчанию меняются каждые 3600 секунд. Если установить 0, то регенерации
не будет. Так как мы отказались от первой версии протокола (см. параметр
Protocol), то этот атрибут не влияет на работу;
 ServerKeyBits — длина серверного ключа. По умолчанию установлено 768, мини-

мальное значение — 512;
 SyslogFacility — тип сообщений, которые будут сохраняться в журнале;
 LogLevel — уровень событий, которые будут попадать в журнал. Возможные

уровни соответствуют системным, которые мы будем рассматривать в разд. 12.5;

 LoginGraceTime — интервал времени, в течение которого пользователь должен

ввести правильный пароль, иначе соединение будет разорвано;
 PermitRootLogin — флаг, определяющий, разрешено (yes) или запрещено (no)

входить в систему по протоколу SSH под пользователем root. Мы уже говорили,
что root — это бог в системе, и его возможности нужно использовать аккуратно.
Если в систему нельзя входить с такими правами, то и по SSH тем более. Срочно
меняйте этот параметр на no;
 StrictModes — флаг, регламентирующий необходимость проверки состояния

файлов и их владельцев, пользовательских файлов и домашнего каталога до ввода
пароля. Желательно установить yes, потому что многие начинающие пользователи делают все свои файлы доступными для записи;
 RSAAuthentication — разрешена ли аутентификация по алгоритму RSA. Пара-

метр действует для первой версии протокола;
 PubkeyAuthentication — дозволена ли аутентификация по публичному ключу.

Параметр действует для второй версии протокола;
 AuthorizedKeysFile — файл с публичным ключом, который может использовать-

ся для аутентификации;
 RhostsAuthentication — флаг, разрешающий аутентификацию по файлам $HOME/
.rhosts и /etc/hosts.equiv. По умолчанию стоит no, и без особой надобности менять
этот параметр не стоит, потому что это небезопасно;

 IgnoreRhosts — флаг, запрещающий читать файлы ~/.rhosts и ~/.shosts. Без необ-

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

пользователь входит в систему с имеющимся в этом файле ключом, то его пустят автоматически без ввода дополнительных паролей;
 RhostsRSAAuthentication — флаг, регламентирующий использование при аутен-

тификации ключа хоста из каталога /etc/ssh/ssh_known_hosts. Параметр применяется в первой версии SSH;
 IgnoreUserKnownHosts — параметр, указывающий на необходимость игнориро-

вания пользовательских списков доверенных компьютеров. Если он равен no, то

Tlgm: @it_boooks

Администрирование

197

необходимо доверять компьютерам из списка ~/.ssh/known_hosts при аутентификации RhostsRSAAuthentication. Не верьте никому, поэтому параметр лучше всего
изменить на yes;
 PasswordAuthentication — требование пароля. Если значение равно yes, то будет

требоваться пароль. При использовании авторизации через ключи параметр
можно отключить;
 PermitEmptyPasswords — разрешение пустых паролей. По умолчанию установле-

но no, что запрещает использование пустых паролей, и изменять это значение не
стоит;
 KerberosAuthentication — использование проверки подлинности по протоколу

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

проверка локального файла паролей из файла /etc/shadow;
 KerberosTicketCleanup — удаление билета Kerberos из кэша при выходе из сис-

темы;
 Banner — позволяет указать файл, в котором находится текст приветствия, ото-

бражаемого пользователям.

5.3.3. Параметры доступа к серверу sshd
Кроме директив, приведенных в листинге 5.1, можно использовать следующие:
 AllowGroups — позволить вход в систему только пользователям указанных групп

(указываются через пробел в одной строке);
 AllowUsers — разрешить вход в систему пользователям, имена которых указаны

через пробел;
 DenyGroups — запретить вход в систему пользователям указанных через пробел

групп;
 DenyUsers — запретить вход в систему пользователям, имена которых указаны

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

5.3.4. Конфигурирование клиента SSH
Настройки SSH-клиента содержат еще меньше параметров. В файле /etc/ssh/ssh_
config находятся глобальные настройки для всех пользователей в системе. Но вы
можете для любого из них переопределить произвольный параметр в файле
.ssh_config из каталога пользователя. В листинге 5.2 приведено содержимое глобального файла настроек без комментариев.

Tlgm: @it_boooks

198

Глава 5

Листинг 5.2. Конфигурационный файл /etc/ssh/ssh_config
# Site-wide defaults for various options
# Значения некоторых параметров для всех пользователей по умолчанию
# Host *
#
ForwardAgent no
#
ForwardX11 no
#
RhostsAuthentication yes
#
RhostsRSAAuthentication yes
#
RSAAuthentication yes
#
PasswordAuthentication yes
#
FallBackToRsh no
#
UseRsh no
#
BatchMode no
#
CheckHostIP yes
#
StrictHostKeyChecking ask
#
IdentityFile ~/.ssh/identity
#
IdentityFile ~/.ssh/id_rsa
#
IdentityFile ~/.ssh/id_dsa
#
Port 22
#
Protocol 2,1
#
Cipher 3des
#
Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour
#
EscapeChar ~
Host *
Protocol 2,1

Некоторые из этих параметров мы уже видели при рассмотрении серверного конфигурационного файла. Здесь также можно увидеть параметр Protocol, в котором
указываются используемые версии SSH. В рассматриваемом случае не стоит запрещать версию 1. На безопасность клиента это не повлияет, зато не будет проблем
при подключении к серверу, который работает только на такой версии. Я надеюсь,
что это будет не ваш сервер ☺.
Вот характерные для клиента команды:
 Host — сервер, к которому относятся следующие настройки;
 CheckHostIP — разрешение проверки IP-адреса с указанными в файле known_hosts

адресами;
 Compression — разрешение (yes) или запрет (no) использования сжатия данных;
 KerberosAuthentication — разрешение (yes) или запрет (no) использования аутен-

тификации по протоколу Kerberos;
 NumberOfPasswordPrompts — количество попыток ввода пароля. Если пароль не

введен верно, то соединение разрывается;

Tlgm: @it_boooks

Администрирование

199

 IdentityFile — имя файла, содержащего закрытые ключи пользователя;
 PasswordAutentication — режим аутентификации по паролю.

5.3.5. Пример работы клиента SSH
Теперь рассмотрим на примере, как можно подключиться к удаленному серверу.
Для этого служит команда:
ssh пользователь@сервер

Например, чтобы подсоединиться к серверу flenovm под именем flenov, нужно выполнить следующую команду:
ssh flenov@flenovm

В ответ на это вы можете увидеть сообщение:
The authenticity of host ‘localhost(127.0.0.1)’ can’t be established
RSA1 key fingerprint is f2:a1:6b:d6:fc:d0:f2:a1:6b:d6:fc:d0.
Are you sure you want to continue connection (yes/no)?
Этим сообщением программа информирует вас, что подлинность хоста не была
установлена, и отображает снимок RSA-ключа. Для продолжения соединения необходимо набрать на клавиатуре yes. На экране появится уведомление:
Permanently added ‘localhost’ (RSA1) to the list of known hosts.
Здесь сообщается, что ключ добавлен в список известных хостов. Это значит, что
в каталоге .ssh/ вашего домашнего каталога появился (или обновился) файл known_
hosts с ключом удаленной системы.
Затем предлагается ввести пароль пользователя. Если аутентификация прошла
успешно, вы оказываетесь в системе и можете выполнять команды на удаленном
компьютере, как будто бы сидите за его клавиатурой.
Подключаться к SSH-порту Linux вы можете и из Windows. Для этого существует
множество различных клиентов.

5.3.6. Вход по ключу
Намного удобнее и безопаснее способ авторизации по ключу, а вход по паролю
может быть даже и вовсе заблокирован. Обращение к системе по SSH с помощью
пароля не вполне безопасно. Злоумышленник может подсмотреть пароль, когда вы
будете вводить его в другой программе. Тогда зачем шифровать SSH-соединение,
если секретное слово может быть выявлено при работе с другими программами?
Каждое подключение должно иметь свои пароли. Но помнить их все очень сложно,
поэтому лучше для авторизации использовать ключи, которые и так защищены
дальше некуда. Нужно сделать только небольшие изменения в конфигурации.
Для начала надо создать новый ключ. Для этого служит команда ssh-keygen. У нее
есть такие параметры:

Tlgm: @it_boooks

200

Глава 5

 -t — тип ключа. Здесь можно указывать rsa или dsa для второй версии SSH или
rsa1 —

для первой. Для примера мы чуть далее создадим ключ rsa;

 -f — файл, в котором будет сохранен закрытый ключ. Открытый ключ получит

такое же имя, но с расширением pub;
 –b — длина ключа, которая не должна быть меньше 512. По умолчанию установ-

лено значение 1024, оставим его и не будем указывать этот параметр.
Итак, для генерации ключа выполним команду:
ssh-keygen –t rsa –f ~/.ssh/myrsakey

Обратите внимание, что я указал сохранение ключа в подкаталоге .ssh своего домашнего каталога (об этом свидетельствует знак ~). Это каталог, в котором SSH
будет искать все настройки. Если вы еще не подключались к серверу, то этот путь
и ключ отсутствуют. Для исправления ситуации нужно перейти в свой домашний
каталог и создать в нем каталог .ssh:
cd /home/flenov
mkdir .ssh

Если при генерации ключа не указывать файл для его сохранения, то по умолчанию
он будет создан в каталоге ~/.ssh/ с именем id_rsa для RSA-шифрования. Для DSAшифрования файл будет располагаться там же, но его имя будет id_dsa. Я специально задал имя, чтобы показать, как с ним работать.
Если программа запустилась успешно, то на экране вы должны увидеть следующее
приглашение:
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Здесь говорится, что начат процесс генерации публичного и закрытого RSAключей. Вам предлагается ввести кодовую фразу или оставить ее пустой. Я рекомендую лучше указать достаточно длинную фразу (не менее 10 символов, а лучше — целое предложение). После нажатия клавиши вам предложат подтвердить комбинацию, чтобы исключить ошибки при вводе.
Если все прошло успешно, то вы должны увидеть следующее сообщение:
Your identification has been saved in ~/.ssh/myrsakey.
Your public key has been saved in ~/.ssh/myrsakey.pub.
В его первой строке нас проинформировали о том, что закрытый ключ сохранен
в файле ~/.ssh/myrsakey, а во второй — что открытый ключ сохранен в файле
~/.ssh/myrsakey.pub.
Получив ключи, вы должны отправить файл ~/.ssh/myrsakey.pub на удаленный компьютер, чтобы SSH-сервер мог использовать его для аутентификации. Передачу
можно смело осуществлять через открытые каналы связи, потому что публичный
ключ ничего не стоит без фразы (пароля), которую вы ввели, и без секретного ключа. Даже если хакер сможет получить файл myrsakey.pub, пользы от этого ему не
будет никакой.

Tlgm: @it_boooks

Администрирование

201

Администратор сервера должен добавить содержимое публичного ключа в файл
.ssh/authorized_keys. Для этого можно выполнить на сервере следующую команду:
cat myrsakey.pub >> .ssh/authorized_keys

Теперь можно подключаться к серверу, используя публичный ключ для подтверждения личности. Но перед этим убедитесь, что в конфигурационном файле сервера включены следующие директивы:
RSAAuthentication yes
PubkeyAuthentication yes

Для подключения к серверу выполните команду:
ssh –i ~/.ssh/myrsakey

С помощью параметра –i мы указываем файл публичного ключа. Если этого не
сделать, то будет использоваться id_rsa — файл по умолчанию, его имя задает
директива IdentityFile в конфигурационном файле SSH-клиента.
Теперь сервер будет запрашивать у вас не пароль, а слово (фразу), которое вы указали при генерации публичного ключа:
Enter passphrase for key

Если в конфигурационном файле SSH-сервера изменить параметр PasswordAuthentication на no, то пароль проверяться не будет, а связь станет устанавливаться
только на основании ключей. Для обеспечения безопасной связи этого достаточно.

5.3.7. Защищенная передача данных
В состав пакета SSH входят еще две полезные программы: SFTP-server (FTP-сервер
с поддержкой шифрования передаваемых данных) и SFTP-клиент (FTP-клиент для
подключения к SFTP-серверу). Давайте посмотрим на последнюю строку файла
конфигурации SSH-сервера: /etc/ssh/sshd_config:
Subsystem

sftp

/usr/libexec/openssh/sftp-server

Директива Subsystem определяет дополнительные сервисы. В приведенной строке
как раз и запускается SFTP-server из пакета OpenSSH.
Работа с клиентом SFTP практически не отличается от работы с SSH-клиентом.
Выполните команду: sftp localhost, и перед вами появится приглашение авторизации, которую мы рассматривали в разд. 5.3.5. Введя правильный пароль, вы оказываетесь в командной строке FTP-клиента и можете передавать или принимать
файлы, используя команды протокола FTP. Этот протокол мы будем подробно рассматривать в главе 10, а сейчас вам достаточно знать, что большинство команд
схожи с директивами Linux для управления файлами. Основные команды протокола FTP приведены в приложении 1.
Попытайтесь сейчас воспользоваться клиентом SFTP для подключения к своей системе. Авторизовавшись, можно попробовать выполнить команду ls или cd, чтобы

Tlgm: @it_boooks

202

Глава 5

убедиться в работоспособности программы. Для выхода из SFTP наберите команду
exit.
Если вам необходимо передать на сервер или скачать с него секретную информацию (например, документы или файл паролей), то используйте для этого безопасное соединение по SFTP. Простые FTP-клиенты передают файлы в открытом виде
(без шифрования), поэтому любой хакер сможет прослушать трафик и узнать информацию, которая поможет взломать ваш сервер.
В командной строке SFTP в основном приходится работать со следующими командами:
 pwd — показать путь к текущему каталогу;
 ls — показать файлы в текущем каталоге;
 mkdir NAME — создать папку с именем NAME;
 cd PATH — перейти в папку. В качестве PATH можно указывать полный путь

к папке на удаленном сервере или только имя каталога, который является дочерним к текущему;
 put FILE — загрузить FILE с локального компьютера на удаленный;
 get FILE — скачать FILE с сервера. По умолчанию он будет скачиваться в ту

папку, которая была активной перед активацией соединения.
Вы должны учитывать, что далеко не все FTP-клиенты поддерживают шифрование
SSH, поэтому убедитесь в поддержке этого протокола со стороны вашего программного обеспечения. Например, если вы работаете в Windows и хотите организовать
безопасное соединение с Linux для обновления файлов, можете воспользоваться
программой WinSCP (www.winscp.net). Она обладает простым и удобным графическим интерфейсом, а любители движения Open Source смогут даже найти исходные коды программы.

5.4. Демон inetd/xinetd
Для того чтобы сервер смог обрабатывать запросы клиентов, программа должна
быть постоянно загружена и связана с определенным портом. В этом нет ничего
сложного, но иногда бывает невыгодно постоянно держать программу в памяти,
если она большая, а работает очень редко. Если перед нами рабочий веб-сервер, то,
конечно же, Apache должен работать на нем постоянно. А если это какая-то тестовая машина, то держать все запущенным нет смысла.
В ряде случаев лучше, когда один сервис в системе будет следить за портами и запускать необходимый сервис при обращении к определенному каналу. В ОС Linux
такая возможность есть, и ее реализует демон inetd или его более новая версия —
xinetd.
Как определить, что запускать? Для этого служит файл /etc/services, в котором находится список сервисов и их портов в следующем формате:
имя порт/протокол псевдоним

Tlgm: @it_boooks

Администрирование

203

Здесь:
 Имя — название сервиса, который необходимо запускать;
 Порт — номер канала, который должен прослушиваться;
 Протокол — сервис inetd умеет работать с протоколами TCP и UDP, порты кото-

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

Например, в файле /etc/services вы найдете следующие строки:
tcpmux 1/tcp
# TCP port
tcpmux 1/udp
# TCP port
rje
5/tcp
# Remote Job
rje
5/udp
# Remote Job
echo
7/tcp
...
...
ftp
21/tcp
ftp
21/udp
fsp fspd

service multiplexer
service multiplexer
Entry
Entry

Я специально выбрал эти строки, чтобы вы увидели варианты описания различных
сервисов.
Если вы используете старый дистрибутив ОС Linux, то в нем, скорее всего, еще работает inetd. Но мы уже говорили, что устаревший дистрибутив не может быть безопасным, и с ним что-либо делать бесполезно. Лучшая защита — обновление, и
тогда основным сервисом будет xinetd, который становится, если еще не стал, стандартом для всех.
Я рекомендую переход на xinetd, потому что в нем появилось много дополнительных возможностей, которые повышают удобство администрирования и безопасность. Например, в этот сервис встроены проверка всех удачных и неудачных соединений, возможность контроля доступа и даже предоставление его строго
в определенное время.
По умолчанию xinetd может быть не установлен. Это довольно легко проверить.
Выполните в командной строке: xinetd. Если команда завершится ошибкой, то требуется установка:
sudo apt-get install xinetd

5.4.1. Конфигурирование xinetd
Основной конфигурационный файл для xinetd — это /etc/xinetd.conf. В нем описываются настройки по умолчанию для запускаемых сервисов, а также каталог, в котором будут находиться конфигурационные файлы, влияющие на работу конкретных
сервисов. Рассмотрим приведенное в листинге 5.3 содержимое этого файла.

Tlgm: @it_boooks

204

Глава 5

Листинг 5.3. Файл конфигурации /etc/xinetd.conf
#
# Simple configuration file for xinetd
# Пример конфигурационного файла для xinetd
#
# Some defaults, and include /etc/xinetd.d/
# Некоторые параметры по умолчанию
# и подключение каталога /etc/xinetd.d/
defaults
{
instances
= 60
log_type
= SYSLOG authpriv
log_on_success
= HOST PID
log_on_failure
= HOST
cps
= 25 30
}
includedir /etc/xinetd.d

После ключевого слова defaults в фигурных скобках описываются настройки по
умолчанию для всех сервисов. Любое из этих значений можно изменить для каждого отдельного сервиса.
Последняя строка подключает каталог /etc/xinet.d. В этом каталоге для каждой службы есть собственный конфигурационный файл, где можно изменить параметры.
Имена файлов соответствуют названиям сервисов, а содержимое похожена
/etc/xinetd.conf. В листинге 5.4 приведено содержимое конфигурационного файла
/etc/xinet.d/telnet для сервиса Telnet.
Листинг 5.4. Конфигурационный файл для сервиса Telnet
# default: on
# По умолчанию включен
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
# Описание: telnet-сервис обслуживает сессии telnet. Он использует
# незашифрованные имя пользователя и пароль для аутентификации
service telnet
{
disable
= no
flags
= REUSE
socket_type = stream
wait
= no
user
= root
server
= /usr/sbin/in.telnetd
log_on_failure += USERID
}

Tlgm: @it_boooks

Администрирование

205

Рассмотрим основные параметры, которые можно изменять:
 disable — параметр, установка которого в yes запрещает исполнение сервиса.

Как уже говорилось, сервис Telnet небезопасен, и поэтому имеет смысл его запретить;
 flags — атрибуты выполнения сервиса;
 socket_type — тип используемого сокета. Для протокола TCP здесь должно

быть значение streem, а для протокола UDP — dgram;
 protocol — используемый для передачи данных протокол (TCP или UDP);
 server — полный путь к запускаемой программе;
 user — права доступа. В большинстве случаев можно увидеть имя пользователя

root. Это нормально, потому что в ОС Linux для работы с номерами портов менее
1024 необходимы права администратора. В настоящее время большинство сервисов понижают свои права в соответствии с установками;
 instances — максимальное количество одновременно работающих экземпляров

программы;
 log_type — файл или системный журнал для записи событий;
 log_on_success и log_on_failure — информация, которая будет сохраняться

в журнале при удачном и неудачном входе в систему соответственно. Здесь
можно указывать значения: PID, HOST или USER;
 per_source — максимальное количество соединений от одного пользователя. Их

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

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

5.4.2. Безопасность
Мы уже знаем, что программа xinetd позволяет определять права и время доступа
к сервисам. Для этого в конфигурационном файле можно использовать три директивы: no_access, only_from и access_time.

Tlgm: @it_boooks

206

Глава 5

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

Если необходимо запретить доступ целой сети, то достаточно указать только ее
номер. Например, если нужно закрыть вход всем компьютерам с адресами
192.168.1.x, где x может быть любым числом, надо использовать следующую строку:
no_access 192.168.1.

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

Теперь посмотрим, как можно предоставлять доступ с помощью директивы
only_from. Она удобна тем, что изначально запрещает все, кроме указанных в качестве параметра адресов. Получается, что мы действуем от запрета. Указав эту
команду без параметра, мы вообще запретим доступ:
only_from =

Я рекомендую включить эту строку в основной конфигурационный файл
/etc/xinetd.conf, а потом для каждого отдельного сервиса в его собственном конфигурационном файле прописать разрешения. Например, давайте откроем доступ с адресов 192.168.1.2 и 192.168.1.19. Для этого добавляем в конфигурационный файл
следующую строку:
only_from = 192.168.1.2 192.168.1.19

Можно разрешать доступ целым сетям:
only_from = 192.168.1.

А что, если всей сети разрешен доступ, а компьютеру с номером 1 запрещен?
В этом случае можно прописать следующие две строки:
no_access = 192.168.1.1
only_from = 192.168.1.

Запрет имеет больший приоритет, и даже несмотря на то, что у сети есть разрешение, компьютер с номером 192.168.1.1 из этой сети подключиться не сможет.
Теперь рассмотрим, как можно задать время доступа. Если вы настраиваете сервер,
который будет работать в офисе компании, то вполне логичным будет разрешить
подключение к нему только в рабочее время. Например, следующая строка делает
сервисы доступными только с 8:00 до 18:00:
access_time = 8:00-18:00

Tlgm: @it_boooks

Администрирование

207

В этом случае я бы увеличил второе значение до 19:00, потому что сотрудники
часто задерживаются на работе, и не хочется, чтобы они дергали меня каждый день
из-за доступа.
Функции обеспечения безопасности, встроенные в сервис xinetd, удобны и обладают
достаточно мощными возможностями, хотя и дублируют права доступа, которые
можно настраивать из файлов /etc/hosts.allow и /etc/hosts.deny. Мне больше нравится
заниматься настройкой безопасности с помощью конфигурационных файлов сервиса
xinetd, потому что параметры доступа хранятся в тех файлах, на которые они влияют.

5.5. Анализ безопасности дистрибутива
Мы уже говорили, что установка дистрибутива с параметрами по умолчанию далеко не всегда безопасна, потому что в ней могут быть проблемы с настройками, заданными прямо «из коробки». Такие настройки также могут привести к ошибке
в конфигурировании.
Почему бы не автоматизировать анализ конфигурации настроек? Наверное, самой
популярной утилитой такого плана является Lynis. Эта утилита поддерживает огромное количество ОС и разных дистрибутивов, среди которых, конечно же, есть Ubuntu
и CentOS. Программа поддерживается не только на Linux, но и на macOS.
Установка выполняется, как обычно для Ubuntu, одной командой:
sudo apt-get install lynis

В CentOS соответственно используем команду:
yum install linus

Чтобы проверить систему на базовые проблемы конфигурации, выполняем команду:
sudo lynis audit system

Эта команда запускает базовый аудит. Чтобы выполнить все возможные проверки,
то в конце команды нужно добавить ключ -с, что означает сheck all.
Я забыл выполнить команду на только что установленной системе, где у меня уже
были добавлены Apache и Samba, но их я установил с настройками по умолчанию.
В этих настройках я ничего не менял, и поэтому интересно посмотреть, что найдет
система аудита в свеженькой Ubuntu 20.04. Результат работы только что приведенной команды аудита на моей системе показан на рис. 5.6.
В самом верху на экране можно увидеть надпись Hardening index. Я не уверен
в точном переводе этой надписи, но в Интернете нашел, что ее переводят как
Индекс Безопасности. Это именно индекс, а не процент, потому что, несмотря на
возможные проблемы, которые нашла система аудита, не факт, что они эксплуатируемые, т. е. могут реально использоваться для взлома системы.
Во время работы программы информации на экран выводится много, и сразу ее всю
проанализировать невозможно, поэтому все сохраняется в два файла:

Tlgm: @it_boooks

208

Глава 5

Рис. 5.6. Результат выполнения на моей системе команды: sudo lynis audit system

 /var/log/lynis.log — здесь находится журнал проверки;
 /var/log/lynis-report.dat — здесь можно увидеть результат в виде отчета.

Результат проверки системы утилитой Lynis — достаточно субъективная вещь, потому что она выдает очень много рекомендаций по улучшению безопасности, которые могут быть на самом деле полезными для боевого сервера, и они действительно заслуживают внимания даже для домашних пользователей, да и для любого
компьютера, подключенного к Интернету. Например:
 Install fail2ban to automatically ban hosts that commit multiple authentication

errors — установите fail2ban, чтобы автоматически блокировать компьютеры,
с которых было несколько ошибок авторизации. Полезная функция, особенно
для некоторых типов серверов;
 Install debsums for the verification of installed package files against MD5 check-

sums — установите debsums, чтобы проверять установленные пакеты на изменение суммы MD5.
Среди проблемных моментов есть и такие, как политика паролей. По умолчанию
в системе не были установлены сроки устаревания паролей. По умолчанию в ней
также был установлен сетевой экран, но не установлены для него правила по умолчанию. Все это можно увидеть в отчете Lynis.

Tlgm: @it_boooks

Администрирование

209

Она выдала много предупреждений, указывающих на необходимость зашифровать
домашние каталоги различных пользователей, в том числе и пользователя root, который отключен. Это проблема для серверов, которые могут хранить пользовательские файлы. Если же рассматривается веб-сервер, то у него в домашних каталогах
ничего не должно быть, а значит, шифровать что-то нет смысла.
Описывать все результаты аудита смысла нет, система выдала очень много информации, и по каждой проблеме дано короткое, но вполне понятное описание. При
знании базового технического английского с ними легко справиться.
Первая часть отчета системы — это короткие результаты проверки, а во второй ее
части есть раздел Lynis 2.6.2 Results, в котором каждая найденная проблема описана в следующем формате:
Короткое описание
Ссылка на подробную информацию

Например:
Enable auditd to collect audit information [ACCT-9628]
https://cisofy.com/controls/ACCT-9628/

Очень часто уже по короткой информации можно понять, что исправить, но если
этого недостаточно, то можно открыть сайт по ссылке во второй строке и прочитать уже более подробно все доводы и причины для исправления найденной проблемы.
К сожалению, информация на сайте http://cisofy.com/ приведена только на английском языке.

Tlgm: @it_boooks

210

Глава 5

Tlgm: @it_boooks

ГЛАВА

6

В стиле Samba

Изначально для обмена файлами между компьютерами служил протокол FTP
(о нем мы подробно поговорим в главе 10). Но он неудобен, т. к. основан на технологии «клиент-сервер». Чтобы вы могли получить с чьего-то компьютера файл, на
нем должен быть запущен FTP-сервер, а вам с помощью специальной программы,
называемой FTP-клиентом, надо подключиться к этому серверу и скачать нужный
файл. Сложность заключается не только в необходимости установки и настройки
различных программ, но и в контроле доступа.
Чтобы не утруждать себя настройками FTP-сервера, многие стали организовывать
в своих локальных сетях специализированные обменники. Для этого выделялся
FTP-сервер с открытым доступом, который быстро превращался в мусорную корзину.
В Windows появился более удобный способ публиковать свои файлы — «Сетевое
окружение», с помощью которого удаленный пользователь может зайти на любой
компьютер и использовать его открытые ресурсы. Это действительно хорошая возможность, и пользователи привыкли к ней, несмотря на то что работа с открытыми
ресурсами в первой реализации системы была небезопасной.
Чтобы пользователи Windows могли видеть сервер Linux в своем сетевом окружении и работать с ним как с Windows-машиной, был разработан пакет Samba (часто
можно встретить сокращение smb), который состоит из двух программ: сервер позволяет публиковать локальные папки для всеобщего просмотра, а с помощью клиента вы можете подключаться к другим компьютерам и работать с их открытыми
ресурсами.
Таким образом, с помощью Samba можно сделать легкодоступный и удобный в использовании файловый сервер. Раньше у меня на работе для этих целей использовался сервер Windows 2000, который параллельно работал как сервер баз данных.
Но файловый архив занимает слишком много места, отнимает ресурсы сети и сервера. К тому же использовать дорогостоящую ОС Windows как файловое хранилище просто глупо — это то же самое, что вывозить мусор из дома на расстояние
в 20 метров на «мерседесе». Поэтому было принято решение перенести файловый
архив на отдельный физический сервер с бесплатной ОС.

Tlgm: @it_boooks

212

Глава 6

Одно из мощнейших преимуществ Samba — возможность удаленного управления
через SSH или SWAT (Samba WEB-based Administrative Tool, набор администратора через веб для Samba).

6.1. Конфигурирование Samba
В последней версии Ubuntu «самбу» убрали из установки по умолчанию серверной
версии ОС, поэтому ее нужно установить:
sudo apt-get install samba

У меня сначала эта команда выполнилась с ошибкой — возможно, потому, что я
использовал бета-версию Ubuntu, которая почти кандидат на релиз, и странно, что
база данных пакетов оказалась в свежем дистрибутиве некорректна. Проблема решилась обновлением:
sudo apt-get update

Основным конфигурационным файлом для Samba является smb.conf, который можно найти в каталоге /etc/samba/ (в некоторых дистрибутивах это может быть каталог
/etc). Кроме него, в этом каталоге находится файл lmhosts, с помощью которого происходит сопоставление IP-адресов и имен компьютеров, — аналогично файлам
/etc/hosts в Linux и [Диск:]\Windows\System32\drivers\etc\lmhosts.sam в Windows.
Дополнительно в этом же каталоге можно создать следующие файлы (некоторые из
них могут существовать):
 smbusers — список пользователей, которым разрешено подключаться к серверу

Samba;
 smbpasswd — пароли пользователей из файла smbusers.

Как видите, у Samba — свои конфигурационные файлы для хранения списка
пользователей. Если вы создаете их вручную, то убедитесь, что права на чтение и
запись установлены правильно. Файл должен быть доступен только администратору, т. е. владельцем может быть лишь root и никто иной.
Конфигурационный файл smb.conf содержит не так много директив, поэтому для
удобства восприятия я привел в листинге 6.1 небольшой пример, который поможет вам увидеть общую структуру такого файла. В дальнейшем нам предстоит
рассматривать другие серверы Linux, где настроек намного больше.
Листинг 6.1. Фрагмент конфигурационного файла smb.conf
[global]
# Основные директивы
workgroup = MYGROUP
server string = Samba Server
;

hosts allow = 192.168.1. 192.168.2. 127.
load printers = yes

Tlgm: @it_boooks

В стиле Samba

;

213

printing = lprng
guest account = pcguest

# Директивы журнала
log file = /var/log/samba/%m.log
max log size = 0
syslog only = no
# Директивы безопасности
security = user
;
password server =
;
password level = 8
;
username level = 8
encrypt passwords = yes
smb passwd file = /etc/samba/smbpasswd
;
usershare max shares = 100

;
;

unix password sync = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*password* %n\n *Retype*new*password* %n\n
*passwd:*all*authentication*tokens*updated*successfully*
pam password change = yes
username map = /etc/samba/smbusers
include = /etc/samba/smb.conf.%m
obey pam restrictions = yes

# Настройка сокета
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
;
interfaces = 192.168.12.2/24 192.168.13.2/24
;
bind interfaces only = yes
# Настройка просмотра
;
remote browse sync = 192.168.3.25 192.168.5.255
;
remote announce = 192.168.1.255 192.168.2.44
;
local master = no
;
os level = 33
;
domain master = yes
;
preferred master = yes
# Работа с сервером
;
domain logons = yes
;
logon script = %m.bat
;
logon script = %U.bat
;
logon path = \\%L\Profiles\%U
;
wins support = yes
# WINS-сервер
wins support = no
wins server = w.x.y.z

Tlgm: @it_boooks

214

Глава 6

dns proxy = no
name resolve order = lmhosts host wins bcast
# Отображение файлов
;
preserve case = no
;
short preserve case = no
;
default case = lower
;
case sensitive = no

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

Имя директивы в этом случае должно состоять из одного слова и не может содержать пробелы. После имени ставится пробел, за которым идет значение директивы.
В Samba-сервере применяется несколько иной формат, приближенный к файлам настроек Windows:
ИмяДирективы=Значение

Значение директивы ставится после знака равенства. Таким образом, имя директивы может состоять из нескольких слов, содержать пробелы и различные символы
(кроме знака равенства). Строки, начинающиеся с точки с запятой (;) или с решетки (#), рассматриваются как комментарии.

6.1.1. Основные настройки
Конфигурационный файл разбит на секции. Самой первой идет секция [global],
в которой описываются глобальные настройки сервера. В ней можно увидеть следующие директивы:
 workgroup = имя — имя группы, в которую входит сервер. Когда в Windows вы

входите в сетевое окружение, то можете увидеть все доступные ресурсы, разбитые на категории. В каждой группе могут быть свои компьютеры или серверы;
 netbios name = имя — имя, которое пользователи будут видеть в сетевом окру-

жении для этого сервера, оно не должно совпадать с именем рабочей группы;
 server string = описание — свободный текст, который можно будет увидеть в

поле Description (Комментарий) свойств сервера или окне сетевого окружения
в режиме Details (Таблица). В этом поле вы можете поместить комментарий,
описывающий содержимое сервера, — например: Файловый архив Сергея;

 hosts allow = адреса — указание (через пробел) IP-адресов или сетей, которым

разрешен доступ к Samba-серверу. Например, чтобы открыть доступ всем ком-

Tlgm: @it_boooks

В стиле Samba

215

пьютерам сети 192.168.1.x и одному компьютеру с адресом 192.168.2.2 из другой
сети, надо написать следующую строку:
hosts allow = 192.168.1. 192.168.2.2

 printcap name = файл — файл описания принтеров, подключенных к системе. По

умолчанию это /etc/printcap;
 load printers = yes — установка режима (yes) автоматического включения

принтеров в список открытых ресурсов. Если в этом нет надобности, то укажите no;
 printing = система — тип системы печати. Здесь можно использовать одно из

следующих значений: bsd, sysv, plp, lprng, aix, hpux или qnx.

6.1.2. Безопасность
В этом разделе мы рассмотрим директивы, которые напрямую или косвенно влияют на безопасность:
 guest account = имя — определяет учетную запись, с правами которой пользо-

ватель сможет входить в систему. Если ваш сервер не содержит секретной информации и используется для открытого обмена файлами, то можно завести гостевую учетную запись, иначе такой вход небезопасен;
 log file = файл — задает название файла-журнала. Например, можно написать:
/var/log/samba/%m.log. Обратите внимание, что в имени присутствует символ
процента, за которым следует буква m. Эта комбинация во время работы будет
заменена именем пользователя, активность которого сохраняется. Так, например, для пользователя robert будет создан журнал /var/log/samba/robert.log;

 max log size = n — определяет максимальный размер журнала в килобайтах.

Укажите значение 0, если ограничения не должно быть;
 syslog only — предписывает использовать для журналирования только syslog;
 security = уровень — определяет степень доступа. Параметр уровень может

принимать одно из следующих значений:
• user — доступ на уровне пользователя;
• share — аутентификация на основе имени и пароля;
• server — проверка пароля производится сторонним smb-сервером. Имя сервера, на котором хранятся пароли, задается с помощью директивы:
password server = ИмяСервера

что позволяет держать пароли на другом smb-сервере, который и будет осуществлять проверку пароля;
• domain — включает сервер в домен Windows NT, а пароль для доступа указывается в файле, определенном с помощью директивы:
smb passwd file = ИмяФайла

Tlgm: @it_boooks

216

Глава 6

 encrypt passwords = yes — позволяет шифровать пароли, передаваемые по сети.

Эта опция требует пояснений, потому что могут возникнуть проблемы при авторизации с компьютеров с системой Windows. Суть в том, что Windows 95 вообще не шифровала пароли, и они передавались в открытом виде. Начиная
с Windows 98, по умолчанию система стала шифровать пароли. Зашифрованный
пароль передается по сети, и на сервере происходит его дешифровка. Если система ожидает зашифрованного пароля, а клиент посылает незашифрованный, то
с соединением возникают серьезные проблемы.
Современные версии Windows шифруют пароль, но вы можете отключить
эту возможность. Для этого в реестре нужно изменить параметр
EnablePlainTextPassword, установив в нем значение 1. В Windows 9x этот параметр находится в реестре по адресу:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VxD\ VNETSUP

Для Windows NT это:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rdr\ Parameters

В Windows 2000 и более поздних версиях:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
LanmanWorkstation\Parameters

Если соответствующего параметра не существует, его следует создать. Он должен иметь тип Dword.
Если возникли проблемы с входом в систему, то переключите систему в режим
работы с незашифрованными паролями. В этом случае Samba использует для авторизации файлы /etc/passwd и /etc/shadow. Полученный открытый пароль шифруется по алгоритму MD5 и сравнивается со значениями из этого файла.
Если вы работаете в режиме с шифрованными паролями, то при авторизации
будет использоваться файл /etc/samba/smbpasswd (это можно изменить с помощью
директивы: smb passwd file). Такой файл необходим из-за различий в шифровании Windows и Linux;
С ОВЕТ
Не применяйте открытые пароли без особой надобности. Не забывайте о существовании программ-снифферов, которые анализируют сетевой трафик и позволяют найти
пароли, передаваемые по сети. Если они не зашифрованы, то злоумышленник сможет
проникнуть в вашу систему.

 smb passwd file = файл — указывает на расположение файла с паролями. По

умолчанию он находится в том же каталоге, где расположены конфигурационные файлы Samba;
 ssl CA certFile = файл — задает файл сертификата, необходимый для работы

протокола SSL, гарантирующего безопасность передачи данных;
 unix password sync = yes — разрешает пользователям Windows менять пароль

Samba, одновременно обновляя системные пароли в Linux. Если в этом нет не-

Tlgm: @it_boooks

В стиле Samba

217

обходимости, установите значение параметра no. Для работы этой директивы
нужно указать программы, которые будут изменять пароли (параметр: passwd
program) и сообщения, появляющиеся перед пользователем (параметр: passwd
chat). Приведу пример использования:
unix password sync = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*password* %n\n *Retype*new*password* %n\n
*passwd:*all*authentication*tokens*updated*successfully*

Помимо этого, необходимо использовать директивы: encrypt passwords и smb
passwd file;
 username map = файл — указание на файл, где хранится список пользователей

сервера Samba для клиентов Windows 9x (о нем подробнее мы поговорим в
разд. 6.3);
 usershare max shares — максимальное количество пользовательских каталогов,

которые могут быть открыты для общего доступа;
 usershare allow guests = yes — если этот параметр включен, то гости системы

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

6.1.3. Сеть
В этом разделе мы изучим директивы настройки сетевого протокола:
 include = файл — позволяет подключить дополнительный конфигурационный

файл, например, с другого компьютера или содержащий настройки для конкретного подключающегося компьютера. В последнем случае имя файла обычно
задается в формате: путь.%m. Здесь путь — это начало полного имени файла, а
%m — NetBIOS-имя компьютера. Например: /etc/samba/smb.conf.robert;
 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 — задает парамет-

ры протокола и размер входного и выходного буферов. Здесь:
• TCP_NODELAY — позволяет быстрее (без задержек) передавать данные;
• SO_RCVBUF — размер принимающего буфера;
• SO_SNDBUF — размер передающего буфера;
 interfaces = интерфейсы — если у вас установлены две сетевые карты, которые

направлены на разные сети, то с помощью этой директивы можно позволить
работать с Samba пользователям из какой-то конкретной или из обеих сетей;
 bind interfaces only — позволяет привязаться только к именованным интер-

фейсам или сетям, указанным в параметре interfaces. Если ваша сеть не защищена сетевым экраном, то настоятельно рекомендуется использовать этот пара-

Tlgm: @it_boooks

218

Глава 6

метр, чтобы доступ к серверу Samba имели только компьютеры из вашей сети, а
не любой удаленный пользователь из Интернета.

6.1.4. Замена сервера Windows
Если посмотреть на параметры, описанные в этом разделе, можно увидеть, что
Samba способна полностью заменить Windows-сервер, и рабочие станции на базе
Windows не заметят неудобств:
 local master = yes — позволяет сделать Samba-сервер основным браузером сети;
 domain master = yes — дает возможность сделать Samba-сервер главным брау-

зером домена. Не устанавливайте значение yes, если в вашей сети уже есть контроллер домена Windows NT;
 logon script = файл — если директива domain logons включена, то в этом па-

раметре можно указать файл bat-сценария, который будет выполняться на компьютере клиента при входе в систему. Сценарий может, например, задаваться
в виде %m.bat (заменяется именем компьютера) или %u.bat (подменяется на имя
пользователя);
 logon path = путь — определяет место хранения пользовательских профилей.

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

6.1.5. Поддержка WINS и DNS
WINS (Windows Internet Naming Service, служба имен Интернета для Windows) — это
сервис для сопоставления имен компьютеров и IP-адресов. База данных WINS чем-то
напоминает DNS (Domain Name Service), только в ней хранятся NetBIOS-имена компьютеров, а DNS обслуживает доменные имена.
Для настройки работы через WINS служат следующие директивы:
 wins support = yes — разрешить использование WINS-сервера;
 wins server = w.x.y.z — IP-адрес WINS-сервера;
 DNS Proxy = yes — если эта опция разрешена, то нераспознанные NetBIOS-

имена можно попытаться определить через DNS-сервер;
 name resolve order — последовательность, в которой будет производиться по-

иск адреса хоста по его имени. В конфигурационном файле можно найти следующий пример:
name resolve order = lmhosts host wins bcast

Если использовать это значение, то при поиске адреса система сначала будет искать имя хоста в файле lmhosts, затем в hosts, потом будет задействован файл wins
и последним — bcast (broadcast, или широковещательный запрос).

Tlgm: @it_boooks

В стиле Samba

219

6.1.6. Отображение файлов
В Linux и Windows применяются разные правила именования файлов. Например,
в Linux названия чувствительны к регистру, а в Windows — нет. Это значит, что
файлы DATA.TXT и data.txt в Windows будут восприняты как один и тот же файл,
чего не скажешь о Linux.
Для решения этой проблемы есть несколько команд:
 case sensitive = no — не принимать во внимание различие в регистре;
 default case = lower — отображать все файлы в нижнем регистре;
 preserve case = no и short preserve case = no — запретить сохранение имен

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

6.2. Описание объектов
После определения основных параметров Samba-сервера можно описывать объекты, к которым может получать доступ пользователь. Это делается в отдельных секциях, которые идут после секции [Global], рассмотренной в разд. 6.1.

6.2.1. Пора домой
Конечно же, любой пользователь захочет работать со своим каталогом. Для этого
он должен иметь учетную запись в Linux, с которой и будет связан его каталог. Обращение к такому каталогу будет выглядеть так: \\сервер\имя, где сервер — это имя
сервера или его IP-адрес, а имя — это имя пользователя, домашний каталог которого необходимо увидеть.
Чтобы разрешить пользователям работать с собственными каталогами, нужно описать раздел [homes]. Рассмотрим пример такой секции:
[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S ; %S - строка с перечислением пользователей
create mode = 0750
directory mode = 0775

В этой секции могут присутствовать следующие директивы:
 comment — текстовый комментарий, который не влияет на работу;
 browseable = no — режим отображения ресурса в списке просмотра. Если ука-

зать yes, то в сетевом окружении будут видны папки пользователей;

Tlgm: @it_boooks

220

Глава 6

 writable = yes — предикат записи в домашний каталог. При значении no созда-

ние и изменение файлов станет невозможным;
 create mode = 0750 — права доступа для создаваемых файлов. В этом случае

владелец файла имеет полные права, пользователи группы могут читать и выполнять его, а остальные — бесправные. Иногда следует понизить значение параметра
до 740, чтобы пользователи группы могли только читать;
 directory mode = 0775 — права доступа для создаваемых каталогов. В этом слу-

чае у пользователей группы тоже слишком высокие права, и я бы понизил их
до 755, чтобы запретить им создавать файлы в новом каталоге. Остальные могут только просматривать каталог, но и это может оказаться лишним, и для большей безопасности лучшим решением будет значение 750;
 valid users = пользователи — список пользователей, которым разрешен доступ

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

6.2.2. Доменный вход
Если вы настроили сервер Linux так, чтобы пользователи Windows могли входить
в систему через smb, используя его как сервер домена, то необходимо убрать комментарии с секции [netlogon]:
; [netlogon]
; comment = Network Logon Service
; path = /usr/local/samba/lib/netlogon
; guest ok = yes
; writable = no

В этой секции также присутствуют комментарий и директива writable. Пользователи не должны иметь право записи в этот каталог, потому что здесь хранятся сценарии, которые выполняются при входе в систему. Файлы из этого каталога должен
изменять только администратор.
Помимо этого, есть еще две команды:
 path = путь — полный путь к каталогу netlogon;
 guest ok = yes — разрешение гостевого входа.

Также нужно убрать комментарии в секции [Profiles], которая выглядит следующим образом:
;[Profiles]
; path = /usr/local/samba/profiles
; browseable = no
; guest ok = yes

Tlgm: @it_boooks

В стиле Samba

221

В этом каталоге хранятся профили пользователей, и он не должен быть виден в сетевом окружении Windows, поэтому директива browseable = no запрещает отображение.

6.2.3. Распечатка
Чтобы пользователям стали доступны принтеры, подключенные к Linux-серверу,
нужно настроить следующую секцию:
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes

Обратите внимание, что по умолчанию секция открыта, и зарегистрированные
пользователи уже имеют доступ к принтерам. Если вы хотите, чтобы и «гости»
смогли использовать принтер, то добавьте строку public = yes. Однако я не рекомендую это делать, потому что такая добавка предоставит пользователям лишнюю
возможность для подшучивания. Например, в моей сети был случай, когда сотрудник рассылал на все принтеры с общим доступом разные картинки. Вроде безобидно, а работу тормозит, и бесполезно расходуются картриджи.

6.2.4. Общий доступ
Чаще всего на сервере необходим каталог, через который любой пользователь сможет обмениваться файлами с другими участниками сети. Для настройки такого каталога служит секция [tmp]:
;[tmp]
; comment = Temporary file space
; path = /tmp
; read only = no
; public = yes

По умолчанию секция закрыта, и для разрешения доступа к ней необходимо убрать
комментарии. Обратите внимание на путь к открытому каталогу. Это /tmp — каталог для хранения временных файлов пользователей. С помощью директив read
only (значение no) и public (значение yes) мы указываем серверу Samba, что каталог открыт, и в него могут записывать и из него читать файлы все пользователи.
Несмотря на удобства, которые предоставляет этот каталог, я рекомендую использовать его только в закрытых сетях. Если у вас есть выход в Интернет, то с помощью сетевого экрана необходимо ограничить доступ к Samba. Так как в каталог
разрешено записывать любым пользователям, злоумышленник может записать
в него свои файлы, которые помогут ему получить на сервере права администратора.

Tlgm: @it_boooks

222

Глава 6

6.2.5. Личные каталоги
Все рассмотренные ранее разделы (секции) конфигурационного файла имеют устоявшиеся имена и предназначены для решения определенных задач. Но в некоторых
случаях вы можете изменить имя раздела, и на работе сервера это не скажется.
Однако я не рекомендую это делать, потому что в одной версии Samba все будет
работать хорошо, а при обновлении программ сервера ситуация может измениться,
и потом трудно будет найти ошибку, из-за которой Samba станет работать неверно.
Тем не менее вы можете создавать собственные разделы, в которых будете описывать некоторые права. Например, вам понадобится организовать общий каталог,
в котором файлы будут доступны всем пользователям, но записывать туда смогут
только пользователи определенной группы. Допустим, что в этом каталоге должны
храниться какие-то картинки. Для решения такой задачи можно создать раздел
[shareimages] следующим образом:
[shareimages]
comment = Share Images
path = /home/samba/images
public = yes
writable = yes
write list = @staff
printable = no

Для этого раздела задаются следующие директивы:
 path = /home/samba/images — каталог, который мы хотим открыть;
 public = yes — признак доступности;
 writable = yes — запись в каталог разрешена;
 write list = @staff — определяет группу staff, которая может записывать

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

6.2.6. CD-ROM
Отдельным разделом в файле конфигурации идут настройки прав доступа к CD-ROM.
Вот пример этих настроек:
;[cdrom]
; comment = Samba server's CD-ROM
; read only = yes
; path = /cdrom
; guest ok = yes

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

Tlgm: @it_boooks

В стиле Samba

223

символов нет, то срочно подумайте о том, чтобы прошерстить всю систему очень
подробно, — мало ли что еще ваш производитель разрешил по умолчанию.
Итак, все отключено, а значит, компакт-диск не будет виден по сети. Если нужно
открыть к нему доступ, настройте следующие параметры:
 comment = Samba server's CD-ROM — комментарий;
 read only = yes — файлы доступны только для чтения;
 path = /cdrom — путь к диску. Если у вас два и более дисководов, нужно ука-

зать, какой из них вы хотите «расшарить», если же только один, то все равно
нужно указать путь, куда он смонтирован;
 guest ok = yes — разрешить ли доступ к диску для «гостей» (неавторизованных

в системе пользователей).

6.3. Управление пользователями
Для начала разберемся с именами пользователей. По умолчанию для доступа к серверу Samba применяются имена из системного файла /etc/passwd. Но вы можете завести отдельные записи Samba-сервера, которые будут соответствовать реальным,
однако их можно будет использовать только для подключения к Samba, а не к системе.
Имена Samba описываются в файле /etc/samba/smbusers, расположение и название
которого могут быть изменены директивой username map файла smb.conf. Содержимое файла /etc/samba/smbusers может быть, например, таким:
# Unix_name = SMB_name1 SMB_name2
root = administrator admin
nobody = guest pcguest smbguest

У списка имен несколько предназначений. Во-первых, с его помощью вы можете
отразить имена, привычные для пользователей DOS и Windows, на учетные записи
Linux. Например, в Windows максимальные права принадлежат пользователю
Administrator, а в Linux это root. И во второй строке приведенного примера устанавливается соответствие имен administrator и admin пользователю root.
Во-вторых, использование этого файла позволяет аккумулировать несколько имен
на одной учетной записи. Например, у вас есть группа пользователей, которым
должны быть назначены одинаковые права. Для этого заводим в Linux только одну
учетную запись nobody (под ней будут работать пользователи), а в Samba прописываем для нее нескольких пользователей: guest, pcguest и smbguest — под этими
именами они будут входить в систему.
Несмотря на то что мы отразили имена пользователей administrator и admin, и это
разные учетные записи, для них будет использоваться один пароль — назначенный
пользователю root.
Информация о пользователях, которым разрешен доступ, хранится в файле
/etc/samba/smbpasswd. Его расположение и имя могут быть изменены с помощью директивы smb passwd file файла smb.conf. \

Tlgm: @it_boooks

224

Глава 6

Рассмотрим пример содержимого файла:
flenov:0:813D6593C11F1173ED98178CA975D79:[UX
robert:500:813D6593C11F1173ED98178CA975D79:[UX

]:LCT-41FA818F
]:LCT-41FA818F

Сразу видно, что файл чем-то похож на /etc/passwd. Он также разделен двоеточиями
на несколько колонок. Наиболее интересны из них первые три: имя пользователя,
его UID в системе Linux и пароль.
Но добавлять пользователей вручную не очень удобно, потому что требуется зашифровать и прописать пароль, что не так уж и просто. Чтобы облегчить задачу,
в пакет Samba включена утилита smbpasswd, которая принимает следующие параметры:
 -a — добавить пользователя в систему. Учетная запись должна уже существо-

вать в файле /etc/passwd. Например, давайте пропишем Роберта, с которым мы
уже не раз работали:
smbpasswd –a robert

В ответ на это программа попросит вас дважды ввести пароль. Указанная вами
комбинация никак не влияет на системный пароль и используется только для
доступа к Samba. Таким образом, пароли могут отличаться друг от друга. Я даже
рекомендую сделать их различными. ОС Windows умеет запоминать пароли и
хранить в своей системе, и версии Windows 9x делают это небезопасным способом. Если злоумышленник сможет украсть пароль на Samba, то он проникнет и
в систему;
 -x — удалить пользователя. Чтобы исключить Роберта из системы, выполните

команду: smbpasswd –x robert;
 -d — деактивировать пользователя. Если необходимо временно отключить дос-

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

–d robert.

robert:500:813D6593C11F1173ED98178CA975D79:[DUX

]:LCT-41FA818F

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

деактивированного ранее пользователя: smbpasswd –e robert.
Если запустить smbpasswd без параметров, то вы сможете поменять свой пароль,
и это можно будет сделать с текущими правами. Выполнение всех остальных
команд требует прав администратора, поэтому их придется выполнять с использованием sudo.
Напоминаю, что файл /etc/samba/smbpasswd используется, если пароли передаются
по сети в зашифрованном виде. В этом случае, чтобы предоставить доступ к Samba
всем пользователям системы, необходимо для каждого выполнить команду:
smdpasswd. Есть сценарии, которые автоматизируют работу, но их использование не

Tlgm: @it_boooks

В стиле Samba

225

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

6.4. Использование Samba
Сервис Samba в основном создавался для пользователей Windows, но и поклонники
Linux тоже оценили все преимущества этой технологии, тем более что ОС Linux
управляет совместным доступом к файлам по сети не хуже Windows, а в чем-то даже лучше. Для работы с Samba из ОС Linux служит команда: smbclient.
Чтобы подключиться к серверу, необходимо указать как минимум два ключа: -L
(адрес сервера) и -U (имя пользователя). В ответ на это программа запросит ввести
пароль. Если вы не используете шифрование, то необходимо ввести системный пароль, в противном случае воспользуйтесь тем, который вы указали при переносе
пользователя в файл /etc/samba/smbpasswd (при запуске команды smbpasswd).
Итак, выполните следующую команду для тестирования сервера:
smbclient –L localhost –U root

После ввода пароля пользователя root вы должны увидеть все открытые ресурсы
сервера. Результат выглядит примерно так:
Domain=[MYGROUP]
Sharename
--------IPC$
ADMIN$

OS=[Unix] Server=[Samba 2.2.3a]
Type
Comment
------------IPC
IPC Service (Samba Server)
Disk
IPC Service (Samba Server)

Server
--------FLENOVM

Comment
---------Samba Server

Workgroup
--------MYGROUP

Master
---------FLENOVM

Вы должны учитывать, что в этом списке находятся не все каталоги. Если, например, у домашних каталогов из раздела [homes] файла конфигурации директива
browseable установлена в значение no (см. разд. 6.2.1), таких каталогов видно не
будет. Это вполне логично, потому что злоумышленнику нельзя давать возможность лицезреть имена каталогов, особенно если они соответствуют именам пользователей или содержат конфиденциальные данные. Никогда не изменяйте этот
параметр, чтобы хакер не знал, что он должен сломать.
Для подключения к открытому ресурсу сервера нужно подать команду: smbclient,
передав ей имя ресурса, которое задается в формате UNC (Universal Naming
Convention, универсальное именование объектов) с применением следующего синтаксиса:
\\ИмяСервера\ресурс

Tlgm: @it_boooks

226

Глава 6

Например, вы хотите подключить домашний каталог пользователя flenov. Его адресом будет:
\\192.168.1.1\flenov

Но здесь надо сделать одно замечание: в Linux обратная косая черта (\) является
служебным символом, поэтому каждый такой знак должен заменяться двумя символами \\ (т. е. каждый знак \ экранируется еще одним знаком \). Поскольку в начале UNC-имени идут два знака \\, то они заменяются на четыре обратных косых
черты, и приведенный здесь адрес должен быть введен так:
\\\\192.168.1.1\\flenov.

Итак, для подключения к ресурсу выполняем команду:
smbclient \\\\192.168.1.1\\flenov

Если вы обращаетесь к ресурсу, который требует авторизации, необходимо указать
имя пользователя, обладающего правами:
smbclient \\\\192.168.1.1\\flenov –U flenov

При удачном подключении к открытому ресурсу вы увидите такое приглашение:
Smb: \>
Теперь можно выполнять различные операции над файлами. Чтобы узнать, какие
команды доступны, введите директиву help или знак вопроса (?). Команды, которые вы увидите, очень похожи на команды FTP (более подробно с FTP мы познакомимся в главе 10, см. также приложение 1). Для отключения от ресурса необходимо выполнить команду exit.
Большинство дистрибутивов Linux включают стандартный пакет Samba и ничего
больше. А ведь в Интернете можно найти сторонние разработки, которые позволяют монтировать открытые в Samba ресурсы в файловую систему Linux так же, как
дискету (флешку) или CD-ROM, или работать с общими ресурсами в графическом
режиме, как это делается в Windows. Однако имейте в виду, что это не всегда безопасно.

6.5. Развитие Samba
Хотя сервис Samba имеет давнюю историю и вполне устойчивый код, он продолжает развиваться. В настоящий момент последняя стабильная версия программы
имеет номер 3.5. Все версии, начиная с 3.0, способны подключаться к домену
Active Directory, т. е. к службе каталогов, продвигаемой и развиваемой фирмой
Microsoft со времени выпуска Windows 2000 Server. Однако в качествеконтроллера
домена Active Directory сервер Samba пока выступать не может. Сейчас разрабатывается версия 4.0 сервера Samba, которая будет лишена этого недостатка, и тогда
можно будет полностью доверить Linux серверную часть сети, клиентские компьютеры которой работают под Windows.
Текущее состояние разработки Samba можно узнать на сайте проекта: www.samba.org.

Tlgm: @it_boooks

ГЛАВА

7

Веб-cервер

Несмотря на то что изначально сеть создавалась для обмена файлами, с появлением
первого браузера популярность WWW-страниц начала расти не по дням, а по часам. Сейчас уже трудно себе представить не только жизнь без Интернета, но и Интернет без веб-страниц.
Для того чтобы пользователь смог просматривать с вашего узла хотя бы простейшие веб-странички, необходим веб- или HTTP-сервер. Уже долгое время самым
распространенным из них является Apache. Трудно точно сказать, какая доля серверов работает на Apache, но можно с уверенностью утверждать, что их больше
половины. Хотя для Linux существуют и другие веб-серверы (например, TUX),
когда говорят о веб-сервере под Linux, подразумевают именно Apache. Да и
в Windows можно очень часто встретить именно Apache, хотя в последнее время
большую популярность стал получать Microsoft IIS.
Apache — абсолютно бесплатный сервер и доступен не только для UNIX-систем,
но и для ОС Windows. Я для разработки использую macOS и Apache, и когда я публикую сайт на серверах CentOS, мне абсолютно ничего менять не приходится.
Официальный сайт разработчиков — www.apache.org, где, помимо HTTP-сервера,
можно найти еще ряд других проектов. Почему этот сервер стал так популярен?
Неужели так повлиял фактор нулевой цены? Бесплатность, конечно, соблазнительна, но качество превыше всего. Это не единственный бесплатный сервер, но Apache
располагает громадным количеством возможностей и при этом обладает следующими немаловажными особенностями:
 безопасность — многие профессионалы относят его к разряду самых защищен-

ных;
 надежность — в сочетании с ОС Linux этот веб-сервер может работать без пере-

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

особых ресурсов);

Tlgm: @it_boooks

228

Глава 7

 производительность — высокая скорость отклика и обработки запросов пользо-

вателей. Возможно, не самая высокая, но достаточная, чтобы справляться
с большими потоками трафика.
На основе Apache строят серверы, которые доступны 99,9% времени в год. Многие
корпорации вверяют ему свои важные данные. Да что там говорить, мои веб-сайты
работают у хостера на серверах с Apache.
Единственный недостаток, который отмечают пользователи, — это сложность конфигурирования. Приходится редактировать текстовый файл, а так как настроечных
параметров огромное количество, то это может стать утомительным занятием. При
этом очень сложно гарантировать, что все настройки будут сделаны оптимальными
и безопасными, — ведь очень легко упустить что-либо или банально опечататься.
Да, в некоторых случаях конфигурационные файлы не так наглядны, как графические утилиты, но это дело привычки. Очень многие администраторы, наоборот,
предпочитают именно текстовый формат настроек.
В этой книге мы не сможем рассмотреть все возможные параметры настроек
Apache, потому что их слишком много. Мы коснемся только основных и сосредоточимся на том, что может сказаться на производительности и безопасности сервера. Рассматриваемого материала хватит в большинстве случаев, и лично мне никогда не приходилось изменять ничего из того, что мы опустим.

7.1. Основные настройки
Основные настройки сервера Apache располагаются в файле /etc/httpd/conf/httpd.conf
(для некоторых дистрибутивов — в /etc/httpd.conf). С выходом Apache2 конфигурация переместилась в /etc/apache2/. Если раньше все настройки находились в одном
файле httpd.conf, то сейчас они разделены на несколько файлов, что достаточно
удобно, просто немного непривычно. В принципе можно так же обойтись и одним
файлом, как и раньше.
Если вы не видите конфигурационных файлов, то, возможно, Apache у вас просто
не установлен. Чтобы установить его в Ubuntu, выполняем:
sudo apt-get install apache2

А в CentOS:
yum install httpd

Теперь попробуйте проверить, доступны ли конфигурационные файлы:
ls /etc/apache2

Они должны быть доступны.
Начнем рассмотрение с основного конфигурационного файла: /etc/apache2/apache2.conf:
 ServerRoot — корневой каталог, в котором находятся файлы конфигурации и

журналы;
 Timeout — предельное время ожидания в секундах для получения и отправки

пакетов;

Tlgm: @it_boooks

Веб-cервер

229

 HostnameLookups — флаг, отвечающий за проведение преобразования IP-адресов

в доменные имена для логов и CGI-программ. Если установлено значение on, то
IP-адрес клиента, запросившего данные с сервера, будет преобразован в доменное имя, иначе будет использоваться IP-адрес. Если в этом нет необходимости,
для повышения быстродействия можно установить значение off;
 User и Group — имя пользователя и группа, с правами которых будет работать

сервис. По умолчанию в Linux используется имя и группа www-data. Этот пользователь и группа должны обладать в системе минимальными правами, которые
только необходимы для работы веб-сервера и его модулей. Ничего лишнего разрешать им нельзя.
В файле apache.conf вы не увидите имен, здесь будут только переменные вида:
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

После знака доллара в фигурных скобках идут имена переменных. Реальные же
значения этих переменных находятся в файле /etc/apache2/envvars (Environment
Variables, переменные окружения). В этом файле переменные объявлены следующим образом:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Не думаю, что вам придется когда-либо менять эти параметры, так что эта информация просто к сведению. Ни один веб-сервер не должен работать с повышенными правами. Пользователь и группа www-data не обладают в системе
ничем сверхъестественным и являются простыми пользователями, каковыми и
должны оставаться;
 ErrorLog и CustomLog — местоположение журналов. Опять же, здесь вы увидите

переменную ${APACHE_LOG_DIR}, которую также можно задать в файле переменных окружения;
 LogLevel — степень подробности составления журнала. Можно указать одно из

следующих значений: emerg, alert, crit, error, warn, notice, info, debug;
 KeepAlive — разрешение обрабатывать несколько запросов за одно соединение.

По умолчанию этот параметр выключен (off), и для получения каждого файла
требуется отдельное соединение. Это неэффективно и приводит к лишнему расходу ресурсов. Допустим, что пользователь запросил страницу с 10 картинками.
В ответ на это браузер клиента откроет 11 соединений с веб-сервером (одно для
получения документа HTML и 10 — для картинок документа). Если включить
этот параметр, то за одно подключение может быть обработано несколько запросов.
Однако при включении параметра on сервер будет открывать соединения на долгий срок. Если злоумышленник откроет большое количество соединений с сервером и не закроет их, то тем самым сможет исчерпать все его ресурсы, и новые
пользователи подключаться не смогут. Есть специальные программы, которые

Tlgm: @it_boooks

230

Глава 7

позволяют открывать соединения и с небольшой скоростью скачивать данные1.
Медленная активность заставляет сервер не закрывать соединение, и таким образом с использованием лишь одного компьютера хакер может сделать недоступным даже мощный сервер. Так что параметр KeepAlive хоть и не является
причиной атаки, но он ее упрощает.
О том, как защититься от этого вида атак, можно прочитать в отличной заметке:
https://community.qualys.com/blogs/securitylabs/2011/11/02/how-to-protectagainst-slow-http-attacks от Sergey Shekyan;
 MaxKeepAliveRequests — максимальное число запросов, которое может быть вы-

полнено в течение одного соединения;
 KeepAliveTimeout — время ожидания очередного запроса от одного и того же

клиента (в секундах). Если за указанный период запрос не поступит, то соединение завершается.
Рассмотрим теперь конфигурационный файл /etc/apache2/conf-enabled/security.conf:
 ServerTokens — характер информации об установленном программном обеспечении, возвращаемый сервером. По умолчанию при любом обращении к серверу
он возвращает заголовок с подробной информацией о системе, которая включает версии Apache, ОС Linux и всех имеющихся модулей. Если хакер узнает, что
на сервере установлена старая версия интерпретатора PHP (или любой другой
программы), то на взлом уйдет намного меньше времени. Болтливые параметры
необходимо отключать, а информацию о сервере прятать. ServerTokens может
принимать одно из следующих значений:
• Full — отображать полную информацию о сервере и установленных модулях, включая их версии. Самое опасное для сервиса — это использование
именно этого параметра;
• Min — показать минимум сведений (только название сервера и установленные
модули). Иногда даже такой простой список без версий может сказать хакеру
слишком много;
• ProductOnly — только название сервера, в нашем случае Apache вернет свое
имя (apache) без указания версий. Вот это как раз то, что нам нужно;
 ServerSignature — если этот параметр установлен в on, то сервер будет добавлять к сгенерированным страницам текстовую информацию, которая будет
содержать имя сервера и виртуального хоста. В рабочих системах лучше отключать это, установив параметр в off.

7.2. Модули
При настройке сервиса Apache очень важным звеном являются модули. Раньше их
нужно было описывать в конфигурационном файле /etc/httpd/conf/httpd.conf следующим образом:
1

Для Linux можно скачать программу slowhttptest с сайта: code.google.com/p/slowhttptest/.

Tlgm: @it_boooks

Веб-cервер

LoadModule perl_module


231

modules/libperl.so

Сейчас все стало намного проще. Уже установленные и активированные модули
можно увидеть в каталоге /etc/apache2/mods-enabled. Достаточно просто просмотреть,
какие файлы там имеются:
ls /etc/apache2/mods-enabled

По умолчанию загружаются все установленные модули или те, которые вы видите
в этом каталоге. У меня по умолчанию грузится PHP5, который стал очень популярным в связке LAMP. Я бы посоветовал загружать только то, что вам действительно нужно. Например, воспользовавшись ошибкой в сценарии PHP, злоумышленник может выполнять на сервере какие-либо команды. Хорошие сайты используют какой-то один язык веб-программирования: Perl, PHP или Python, и вы
должны оставить только тот модуль, который необходим, а остальные неиспользуемые модули отключить — это значительно сузит возможности злоумышленника. Ничего не напоминает вам такая рекомендация? Да, это снова самое важное
правило: лишняя программа — враг администратора и дополнительная «дверь» для
хакера.
Я обратил внимание, что модуль rewrite не загружается. Давайте исправим это и
заодно посмотрим, как можно включить новые модули. Для этого выполняем
команду:
sudo a2enmod rewrite

Здесь a2enmod — это программа, которая помогает включать новые модули, а
rewrite — это имя модуля. Проверьте еще раз каталог /etc/apache2/mods-enabled
и убедитесь, что вы видите там файл rewrite.load.
Все установленные в системе модули (и активированные, и неактивированные)
можно увидеть в каталоге /etc/apache2/mods-avalable.
Мы включили модуль, но изменения не вступят в силу, пока мы не перезагрузим
Apache. Для этого выполняем команду:
sudo /etc/init.d/apache2 restart

7.3. Права доступа
Снова возвращаемся в основной файл конфигурации /etc/apache2/apache2.conf, но
теперь поговорим о правах доступа к каталогам. Они описываются следующим
образом:

Order allow,deny
Allow from all


Tlgm: @it_boooks

232

Глава 7

или, например, так:

SetHandler server-status
Order deny,allow
Deny from all
Allow from .your-domain.com


Первое объявление разрешает доступ к определенному каталогу на диске (в нашем
случае к /var/www/html), а второе — ограничивает доступ к виртуальному каталогу
(в приведенном примере: http://servername/server-status), разрешая его только
клиентам из домена your-domain.com.
Если вы знакомы с HTML (HyperText Markup Language, язык разметки гипертекста)
или XML (Extensible Markup Language, расширенный язык разметки), то такое объявление будет вам знакомо и более или менее понятно без дополнительных пояснений. Для тех, кто не в курсе, я сделаю несколько пояснений на примере каталогов.
Итак, объявление начинается со следующей строки:


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


Параметры доступа к каталогу могут быть описаны не только в основном конфигурационном файле, но и в файле .htaccess, который может находиться непосредственно в самом каталоге.
П РИМЕЧАНИЕ
Что я имею в виду под основным файлом? В зависимости от дистрибутива, это может
быть /etc/apache2/apache2.conf или /usr/local/apache2/conf/httpd.conf (какие конфигурационные файлы используются в каких дистрибутивах, можно увидеть на странице:
https://wiki.apache.org/httpd/DistrosDefaultLayout). Далее я в основном буду ссылаться на httpd.conf, который является конфигурационным файлом по умолчанию (в том
числе у меня на macOS), хотя в Ubuntu это файл apache2.conf.

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

Tlgm: @it_boooks

Веб-cервер

233

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

Order deny,allow
Deny from all


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

к указанному каталогу. В качестве параметр можно использовать одно из следующих значений:
• all — разрешает доступ к каталогу всем;
• доменное имя — определяет домен, с которого можно получить доступ к каталогу. Например, можно указать domain.com. В этом случае только пользователи этого домена смогут получить доступ к каталогу через сеть. Если какаялибо папка содержит опасные файлы, с которыми должны работать только вы,
то лучше ограничить доступ своим доменом или только локальной машиной,
указав Allow from localhost;
• IP адрес — сужает доступ к каталогу до определенного IP-адреса. Это очень
удобно, когда у вашего компьютера есть выделенный адрес и вы хотите обеспечить доступ к каталогу, содержащему администраторские сценарии, только для
себя. Адрес может быть как полным, так и неполным, что позволяет ограничить
доступ к каталогу определенной сетью;
• env=ИмяПеременной — разрешает доступ, если определена указанная переменная окружения. Полный формат директивы:
Allow from env= ИмяПеременной

 Deny from параметр — запрещение доступа к указанному каталогу. Параметры

такие же, как у команды Allow from, только в данном случае закрывается доступ
для указанных адресов, доменов и т. д.;
 Order параметр — очередность, в которой применяются директивы allow и deny.

Могут быть два варианта:
• Order deny,allow — изначально все разрешено, потом проверяются запреты,
но они могут быть обойдены при помощи разрешений. Рекомендуется это
использовать только на общих каталогах, в которые пользователи могут
самостоятельно закачивать файлы, — например, свои изображения;

Tlgm: @it_boooks

234

Глава 7

• Order allow,deny — сначала все запрещено, вслед за этим проверяются разрешения, но и они могут быть обойдены запретами. Рекомендуется применять для всех каталогов со сценариями или для всех каталогов, где находятся
файлы, используемые определенным кругом лиц, — например, администраторские сценарии;
 Require параметр — позволяет задать пользователей, которым разрешен доступ

к каталогу. В качестве параметра можно указывать:
• user — имена пользователей (или их ID), которым разрешен доступ к каталогу. Например: Require user robert FlenovM;
• group — названия групп, пользователям которых позволен доступ к каталогу.
Директива работает так же, как и user;
• valid-user — доступ к каталогу разрешен любому аутентифицированному
пользователю;
 Satisfy параметр — если указать значение any, то для ограничения доступа ис-

пользуется или логин/пароль, или IP-адрес. Для идентификации пользователя по
двум условиям одновременно надо задать all;
 AllowOverride параметр — определяет, какие директивы из файла .htaccess в ука-

занном каталоге могут перекрывать конфигурацию сервера. В качестве параметр
можно указать одно из следующих значений: None, All, AuthConfig, FileInfo,
Indexes, Limit и Options;
 AuthName — домен авторизации, который должен использовать клиент при опре-

делении имени и пароля;
 Options параметры — определяет возможности веб-сервера, которые доступны

в указанном каталоге. Если у вас есть каталог, в который пользователям разрешено закачивать картинки, то вполне логичным является запрет на выполнение
в нем любых сценариев. Не надо надеяться, что вы сумеете программно запретить загрузку любых файлов, кроме изображений. С помощью опций можно
сделать так, чтобы сценарий веб-сервером не выполнился.
В качестве аргумента параметры указывается All — означает разрешение всех
опций, кроме MultiViews, None — запрещает все опции, или комбинация из следующих значений:
• ExecCGI — разрешено выполнение CGI-сценариев. Чаще всего для этого используется отдельный каталог /cgi-bin, но и в нем можно определить отдельные подкаталоги, в которых запрещено выполнение;
• FollowSymLinks — позволяет использовать символьные ссылки. Убедитесь,
что в каталоге нет опасных ссылок и их права не избыточны. Мы уже говорили в разд. 3.1.3, что ссылки сами по себе опасны, поэтому с ними нужно обращаться аккуратно, где бы они ни находились;
• SymLinksIfOwnerMatch — следовать по символьным ссылкам, только если владельцы целевого файла и ссылки совпадают. При использовании символьных

Tlgm: @it_boooks

Веб-cервер

235

ссылок в том или ином каталоге лучше указать этот параметр вместо
FollowSymLinks. Если хакер сможет создать ссылку на каталог /etc и проследует по ней из веб-браузера, то это вызовет серьезные проблемы в безопасности;
• Includes — использовать SSI (Server Side Includes, включения на стороне сервера);
• IncludesNOEXEC — использовать SSI, кроме команд exec и include. Если вы не
используете в сценариях CGI такие команды, то эта опция предпочтительнее
предыдущей;
• Indexes — отобразить список содержимого каталога, если отсутствует файл
по умолчанию. Чаще всего пользователи набирают адреса в укороченном
формате — например: www.cydsoft.com. Здесь не указан файл, который нужно загрузить. Полный URL выглядит так: www.cydsoft.com/index.htm, но если указан только домен, сервер сам ищет файл по умолчанию и открывает
его. Это могут быть файлы index.htm, index.html, index.asp или index.php,
default.htm и т. д. Если ни один из таких файлов по указанному пути не найден,
то при включенной опции Indexes будет выведен список содержимого каталога, а иначе — страница ошибки. Я рекомендую отключать эту опцию, потому что злоумышленник может получить слишком много информации
о структуре каталога и его содержимом;
• MultiViews — представление зависит от предпочтений клиента.
Перед каждой из этих опций можно ставить знаки «плюс» или «минус», что
соответствует разрешению или запрещению опции. Если знак не указан, то это
соответствует разрешению.
Все описанные здесь директивы могут находиться не только в основном файле, но
и в файлах .htaccess, располагаемых в отдельных каталогах для определения прав
этих каталогов.
Права доступа можно определять не только для каталогов, но и для отдельных файлов. Это описание делается между двумя следующими строками:



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

Order allow,deny
Allow from all