Знакомство с Linux. Часть 9. Общие проблемы безопасности Linux

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

Однако мы с вами живём в реальном мире, где компьютеры, с одной стороны, должны нести на себе и сохранять некую информацию, а с другой - они постоянно находятся под угрозой несанкционированного доступа. Дома ли, в офисе стоит компьютер - нельзя исключать появления перед его монитором лиц, которым вы вряд ли когда-либо собирались предоставлять доступ к содержимому своего винчестера. А уж подключение к Интернету делает машину потенциальной мишенью для сотен всевозможных атак - от вирусов и червей до начинающих хакеров-самоучек. У нас в России для домашних ПК пока практически безальтернативным является коммутируемый доступ - и поверьте, с точки зрения безопасности это прекрасно. Те, кто в состоянии позволить себе выделенную широкополосную линию, подвергаются гораздо большему риску, ведь на их машины могут польститься и серьёзные взломщики - чтобы включить затем взятую под свой контроль систему в виртуальную сеть для очередной DDoS-атаки.


Что же теперь делать - рыть для компьютера погреб и отправляться в магазин за помповым ружьём? Необязательно. Достаточно имеющимися к настоящему времени аппаратным и программными средствами поднять относительную безопасность системы на такой уровень, чтобы сделать её взлом (локальный или удалённый) невыгодным с точки зрения затрат времени и труда на него. Здесь срабатывает тот же ход мысли, что и в случае установки стальных входных дверей на квартиры. Взломать можно любой замок, выломать - любую дверь. Однако если никакого специфического интереса у взломщика именно к этой квартире не наблюдается, он, оценив сложность задачи, отправится на поиски не требующей серьёзных трудозатрат жертвы. Так что обезопасить свой компьютер от праздно любопытствующих - вполне реально. Давайте же этим и займёмся сегодня.

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

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

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

2. Постоянно следите за поведением своей системы по лог-файлам и отчётам программ-ловушек вроде tripwire.

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

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


Компьютер сам по себе - устройство достаточно хрупкое. Хороший пинок в корпус способен привести к необратимому выходу из строя винчестера, и тем самым - к потере размещённой на нём информации. Однако физический вандализм в среде компьютерных взломщиков всё-таки не в чести; добраться до компьютера, чтобы его уничтожить, способен разве что больной человек (или Киану Ривз в роли Нео). Бытовые "виртуальные вуайеристы", любители чужих секретов, как правило интересуются самой информацией, и ни в коем случае не добиваются уничтожения её носителей. Так что достаточно хорошенько позаботиться об ограничении физического доступа к ПК, чтобы оградить себя от этой напасти.

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

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

С физическим доступом покончено; переходим к защите BIOS. Тут всё понятно: абсолютно необходим как минимум пароль администратора (суперпользователя), защищающий настройки самого BIOS от изменения. Добравшись до специального джампера на материнской плате, можно всё-таки перевести эти настройки в исходное, заводское состояние, но если доступ в корпус блокирован, ничего у злоумышленника не получится. Можно, потакания собственной паранойе ради, завести в BIOS ещё и пользовательский пароль, но в домашних условиях эта мера представляется всё-таки излишней. Лучше сосредоточиться на опциях безопасности, предоставляемых самой ОС.


А наша ОС (если кто-то уже запамятовал), - Linux. При установке мы сперва разметили диск и проинсталлировали ОС от Microsoft (лично я её использую исключительно для современных игр), а затем уже привили на компьютер Linux. Это означает, что именно Linux-загрузчик (LILO или GRUB, или ещё какой-нибудь) размещается теперь в Master Boot Record машины и определяет после её включения, что за систему стартовать. Точнее, предоставляет нам этот выбор.

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


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


Тем не менее, обойти можно и пароль, установленный на загрузчик операционной системы. Для этого достаточно стартовать ОС, не обращаясь к жёсткому диску. Как это сделать? Правильно, загрузить её с другого носителя: компакт-диска или же дискеты. Вот вам и дополнительная опция, которую имеет смысл установить в BIOS, прежде чем защитить его паролем суперпользователя: запретите стартовый опрос какого-либо устройства, кроме первого жёсткого диска. Эта мера в сочетании с паролем на LILO отпугнёт подавляющее большинство любопытных от вашей системы.

Однако не всё же время компьютеру стоять выключенным. Однажды возникнет такая ситуация, что вам понадобится отойти куда-либо от работающего ПК, на экране которого в это время может демонстрироваться такое... А если даже и не на экране: внедриться в активно работающую систему с локального терминала есть гораздо больше способов, чем обойти защиту BIOS. Так что приготовьтесь к тому, чтобы защитить своё рабочее место при помощи команд xlock и vlock.

Xlock - простенькая утилита, запирающая графический экран X Window System с текущим сеансом запустившего её пользователя, и отказывающаяся его отпереть, пока не будет введён пароль этого пользователя. В современных оконных менеджерах KDE и Gnome логичнее использовать скринсейверы с паролем - действуют они точно так же, как и их Windows-аналоги. И аналогично применяется утилита vlock, вот только запирает она не графический экран, а текстовую консоль. Достаточно просто набрать vlock в командной строке, как на экране появится сообщение о том, что он заперт, и приглашение ввести пароль текущего пользователя.


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

В бытность мою помощником системного администратора одного НИИ случилось страшное: произошёл удалённый взлом системы с уничтожением всего, что находилось на сервере на тот момент. Ценная информация, к счастью, резервировалась на магнитных лентах, так что восстановить данные удалось достаточно быстро. Сложнее получилось с расследованием происшествия, так как системные журналы были стёрты вместе со всей остальной информацией. Наш сисадмин пошёл на коварный ход, установив на взломщика ловушку - так называемый honeypot, "горшочек с мёдом", куда непременно должны вернуться осы. Это был компьютер, из Интернета выглядевший в точности как наш прежний сервер, имевший то же сетевое имя и адрес, с той же самой ОС, теми же пользователями... Но надёжно изолированный ото всей остальной локальной сети. И осы вернулись: через некоторое время взлом повторился. На сей раз мониторинг системы вёлся в реальном времени; удалось установить способ проникновения и даже отследить взломщика вплоть до его провайдера. Информация эта моментально ушла в ФСБ (предприятие режимное, как-никак), и насколько мне известно, по крайней мере условный срок этот деятель получил: наш НИИ был в списке его достижений не первым. Но в данном случае главное то, как проник злоумышленник в систему. Очень просто: подобрав пароль одного из давным-давно не пользовавшихся своей учётной записью пользователя. "Мёртвой души". Ох, как жёстко у нас после этого затянули гайки на предмет актуализации паролей и самих записей!

С записями всё как раз просто. Согласно руководству по файлу /etc/shadow (команда man 5 shadow в командной строке), поля с третьего по восьмого для записи каждого пользователя хранят информацию об отведённом ему времени. Третье поле - это число дней с 1 января 1970 года, когда пароль последний раз был изменён: когда учётная запись только-только заведена, это - просто дата её создания. Четвёртое поле - это число дней до следующей смены пароля. Если оно задано, слишком частая смена паролей пользователями оказывается невозможной - что в некоторых ситуациях может осложнить работу взломщиков. Пятое поле содержит указание на число дней, по истечении которых пароль необходимо менять на новый. Сделать это можно при помощи команды passwd: каждый пользователь, исполняя её, в состоянии сменить себе пароль сам. Обычно два-три месяца (для систем с умеренным числом пользователей) считаются нормальным сроком действия одного пароля. В шестом поле указывается, за сколько дней до истечения срока действия пароля пользователя будут предупреждать об этом событии. Предупреждение появляется в первых строках каждой терминальной сессии пользователя. Если пароль не сменить, в заданный срок старый просто перестаёт действовать, и для его назначения требуется вмешательство администратора. Седьмое, очень важное, поле, позволяет задать срок (в днях), по истечении которого с момента устаревания пароля деактивируется сама учётная запись. И, наконец. восьмое поле задаёт абсолютный срок деактивации учётной записи. Для действующих пользователей эти параметры можно прописать в /etc/shadow вручную (осторожно! Не забудьте сперва создать резервную копию файла!), а для вновь заводимых - указать при помощи дополнительных параметров команды useradd, скажем (см. соответствующее руководство).


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

Позволю себе сформулировать несколько правил поведения root'а на базе рекомендаций, изложенных в Linux Security HOWTO (авторы Kevin Fenzi и Dave Wreski), а также собственного опыта.

1. Команды, предполагающие уничтожение, особенно если они относятся (или могут относиться) к большому числу файлов, лучше предварять информационными командами. К примеру, вам необходимо уничтожить директорию. Просмотрите сперва её содержимое при помощи ls, и лишь точно удостоверившись, что там нет ничего ценного, исполняйте rm -r.


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


3. Если некая важная функция требует регулярного исполнения от имени суперпользователя, воспользуйтесь командой sudo. Как именно, мы подробно разберём в следующий раз.

4. Повнимательнее с путями! В числе переменных окружения, действующих в командной оболочке root, имеются пути исполнения команд (PATH). Список путей задаёт перечень каталогов, в которых разыскиваются исполняемые файлы. Если вы задаёте команду не её полным именем (например, /bin/ls), а кратким (ls), будьте внимательны: так можно с лёгкостью исполнить НЕ ТУ команду. Допустим, первым в вашей переменной PATH записан путь . (точка, то есть текущий каталог), а вслед за ним - уже /bin. Тогда если в текущем каталоге размещён исполняемый файл с именем ls, на выполнение будет запущен именно он, а не /bin/ls. Если каким-либо образом взломщик получит доступ на запись к одному из каталогов, указанных в переменной PATH для пользователя root, то он вполне может разместить в этом каталоге вредоносный скрипт под невинным именем - и при малейшей неосторожности со стороны суперпользователя страшное свершится. Так что, во-первых, НИКОГДА не добавляйте к переменной PATH для root точку, а во-вторых - внимательно проверьте права доступа к указанным в этой переменной каталогам. Посмотреть её значение можно при помощи команды echo $PATH (знак доллара перед именем указывает, что отображаться будет значение переменной).


5. ЗАБУДЬТЕ (если вообще когда-нибудь слышали) об r-командах: rlogin, rsh, rexec... Это старый, неутомительный и чудовищно несекретный способ входа в удалённую систему, который давно уже выбросили бы из всех современных дистрибутивов, если бы не требования обратной совместимости с ранним ПО.

6. Даже не думайте (в случае домашнего ПК) модернизировать файл /etc/securetty, где перечислены терминалы, с которых в систему может входить root. По умолчанию там содержатся лишь наименования виртуальных консолей. Пусть так и будет.



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