Из чего строится крепость

“Самая безопасная система — это система, лишенная устройств ввода и вывода, отключенная от питания,
помещенная в железобетонный бункер с полуметровыми стенами и прикованная цепями;
но даже в этом случае сомнения не оставляют меня…”

В статье “Мифический пингвин” (см. «МБ» №49’2005) я упомянул о том, что обеспечение безопасности в Linux имеет свои нюансы. Сегодня я хочу рассказать об основах безопасности этой ОС. Я не буду говорить о работе конкретных утилит, а лишь опишу общие принципы. Все нижесказанное прекрасно отражает эпиграф — безопасность, как и совершенство, пределов не имеет, но стремиться к идеалу нужно всегда…

Внимание! Автор и редакция не несут ответственности за возможную потерю вами контроля над системой в результате необдуманных действий! Во избежание нанесения вреда информации никогда не работайте под аккаунтом суперпользователя (root)!

Часть 1. О крепком пароле замолвим мы слово…
Теория
При установке Linux указываются пароли для пользователя root и для вашей учетной записи. Если для личной учетной записи пароль можно не указывать (ну, доверяете вы своим родственникам/девушке), то для пользователя root пароль необходим как воздух, и здесь следует проявить некоторую изобретательность и хитрость. Никогда не следует указывать простой пароль, так как его можно подобрать по словарю (для чего существуют специализированные программы). Для “генерации” идеального пароля можно просто постучать по кла­виатуре и запомнить полученную комбинацию, но для рядового пользователя это нецелесообразно (если, конечно, на вашем домашнем компьютере не хранятся коды запуска ракет).
Можно поступить следующим образом: выбирается кодовое слово, например, password. Далее вместо букв этого слова ставятся символы, стоящие выше (левее, правее) на клавиатуре. В результате имеем что-то вроде 0qww294e. А если символы еще и будут записаны в разных регистрах, то подбор такого пароля становится трудновыполнимой (хотя и отнюдь не невыполнимой) задачей.

Авторизация
Пароль нужен для доступа к учетной записи, это понятно. Но тут возникает резонный вопрос: “А как хранится столь важная информация?!”
В Linux (и Unix вообще) пароль шифрует­ся по необратимому алгоритму MD5, то есть ключом к шифру является само кодовое слово и расшифровать такой код невозможно. Как следствие, авторизация проходит следующим образом: запрашивается пароль пользователя, шифруется и результат сравнивается с тем, что получено при создании пользователя.

Все пароли хранятся в каталоге /etc/shadow, а имена пользователей — в /etc/passwd. Может возникнуть вопрос: “А зачем так сложно — два файла?..” В старых версиях Linux все пароли хранились в /etc/passwd, но этот файл открыт для чтения всем пользователям, а значит, и доступ к паролям имеет любой, что не очень-то хорошо. Файл /etc/shadow доступен только администратору (root), поэтому кто угодно пароли не посмотрит.
Для пользователя root запись в файле /etc/passwd будет выглядеть следующим образом:

root:x:0:0:root:/root:/bin/bash.

В строке указаны следующие пара­метры:
root — имя пользователя (логин);
x — пароль, если “затенен”, то ставится х;
0:0 — уникальные идентификаторы пользователя и группы;
root — информация о пользователе (имя, адрес, etc);
/root — домашний каталог;
/bin/bash — оболочка, которая будет выполнять команды пользователя.

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

Внешний вид
Выполним в консоли команду ls –la для просмотра списка файлов в какой-либо директории. На экране появится несколько записей, в моем случае — одна:

drwx------ 21 DeadLord DeadLord 4096 Фев 5 11:43 DeadLord

Эта строка содержит следующую информацию:
Первые 10 символов сообщают, что это директория (символ d), в которой разрешены чтение (символ r), запись (символ w) и выполнение (символ x) только для ее владельца. Для группы владельца и остальных пользователей доступ к папке закрыт (последние 6 символов “-”).
Последующие записи содержат информацию о файле:
21 — количество жестких ссылок;
DeadLord — владелец файла;
DeadLord — группа, к которой принадлежит владелец файла;
4096 — размер файла (для папок не вычисляется);
Далее идет время последнего редактирования директории или файла и имя объекта.

К раздаче
Для назначения прав доступа существует программа chmod, аргументами которой будет числовое представление выставляемых прав и имя файла, к которому эти правила доступа относятся.
Для того, чтобы получить представление прав пользователей в числовом виде, следует каждый из 9 знаков символьного представления (в нашем случае — rwx------) заменить последовательностью нолей и единиц: если стоит прочерк — ставится 0, иначе — 1. Для рассматриваемого случая запись примет следующий вид: 111000000. Теперь каждую тройку цифр переведем в десятичную систему счисления и получим 700.
Предположим, что в системе имеется файл testfile, права доступа к которому выглядят следующим образом: rw-rw-r-x. Мы хотим, чтобы владелец файла и его группа имели все права на файл (цифра 7, rwx), а остальные пользователи не могли ничего (цифра 0, ---). Для этого выполняем команду chmod 770 testfile. Теперь при помощи команды ls -la проверим результат:

-rwx--x--х 1 DeadLord root 0 Фев 5 11:41 testfile

Передача файла
В системе могут быть файлы, доступ к которым я иметь не хочу по субъективным причинам. Что делать в этом случае? Я просто передаю этот файл другому пользователю (например, пользователю root). Сам я при этом буду обладать теми правами, которые полагаются по существующей политике, или которые назначит новый владелец. Для этих целей выполняем команду chown <имя> <файл>. Например: chown root testfile — и все, я больше не владею этим секретнейшим файлом, так как не являюсь суперпользователем. Аналогично можно передать файл во владение группы, только команда будет несколько иная: chgrp root testfile.
По умолчанию владельцем системных файлов (в частности — файлов конфигурации) является root и пользователям вне его группы редактирование их не разрешается.
Результат работы команд chown и chmod показан на скриншоте.

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

Двое из ларца
В стандартный комплект дистрибутива могут входить сразу два брандмауера: ipchains и iptables. Я буду рассматривать настройку программы ipchains, но если хотите, то можете самостоятельно рассмотреть и второй вариант. Разобраться можно; тем более, что многое там очень сходно.
При установке политик можно руководствоваться двумя правилами: “Что не разрешено, то запрещено” и “Что не запрещено, то разрешено”. Правильным вариантом будет работа по первому правилу, потому как всегда проще создать еще одну разрешающую политику, чем разбираться в том, кто лезет и куда, а потом запрещать. Это, конечно, мое личное мнение и к соблюдению оно не обязательно.

Свой-чужой трафик
Программа-защитник будет фильтровать три протокола (TCP, UDP, ICMP), на базе которых строятся остальные. Фильтры можно настроить на слежение за определенными портами, протоколами, адресами и направлениями. Я не буду рассматривать безопасность того или иного протокола — это тема отдельной книги и хлеб других людей. Я перейду собственно к настройке.
Для начала установим политики по умолчанию. Помните, что я сказал выше: что не разрешено, то запрещено, поэтому делаем следующее: обнуляем начальные настройки файрвола командой ipchains -F и пишем свои:

ipchains -P input DENY
ipchains -P output DENY
ipchains -P forward DENY

Как видите, все соединения по умолчанию запрещены.
Все мы пользуемся интернет-браузерами, поэтому открыть 80-й порт для протокола TCP — святое дело:

ipchains -I input 1 -p tcp -d 217.255.015.015 80 -j ACCEPT
ipchains -I output 1 -p tcp -s 217.255.015.015 80 -j ACCEPT

Первая строка помещает правило в цепочку input под номером 1. Разрешается (подстрока -j ACCEPT) входящий трафик по протоколу TCP (флаг -p) для получателя (флаг -d) 217.255.015.015 на 80-м порту.
Аналогично расшифровывается вторая строка, только она добавляет правило для исходящего трафика от отправителя под флагом –s.
Если необходимо работать с FTP-сервером, то следует дописать следующие разрешения:

ipchains -I input 1 -p tcp -d 217.255.015.015 21 \ -s 217.255.015.016 -j ACCEPT
ipchains -I output 1 -p tcp -s 217.255.015.015 21 \ -d 217.255.015.016 -j ACCEPT
ipchains -I input 1 -p tcp -d 217.255.015.015 20 \ -s 217.255.015.016 -j ACCEPT
ipchains -I output 1 -p tcp -s 217.255.015.015 20 \ -d 217.255.015.016 -j ACCEPT

Такими правилами я разрешил доступ с любого порта машины 217.255.015.016 к ftp-серверу. Нет, я не ошибся, вставив четыре строки: порт 21 в ftp-протоколе используется лишь для передачи команд, а для работы с файлами используется порт 20.

Чистим за собой
Очень часто бывает, что добавляется лишнее правило, или существующее становится неактуальным. Что делать в этом случае?
Для начала пропишем следующую команду ipchains -L и посмотрим список правил. Исходя из увиденного, можно писать ipchains -D input 1 для удаления первого правила из цепочки input или ipchains -D input 1 -p tcp -d 217.255.015.015 20 \ -s 217.255.015.016 -j ACCEPT. Второй метод длиннее, но надежнее. Его надежность заключается в том, что никогда не удалишь нужное правило только потому, что перепутал номер.

Часть 4. Я вижу все!
Не стоит забывать, что даже система, в которой произведены все необходимые настройки, нуждается в постоянном контроле.
Если возникают сомнения в безопасности машины со стороны сети, можно воспользоваться командой netstat, которая отображает все текущие подключения. На экран выводится информация о протоколах, удаленных адресах и статусе соединения.
При помощи команды lsof можно посмотреть список открытых файлов и портов (при указании ключа -i). Утилита эта довольно мощная и имеет много ключей. Кратко описать ее функции очень сложно, поэтому советую посмотреть справку по ней при помощи утилиты man.

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


Рекомендуем почитать: