Хакер - Спецвыпуск журнала «Хакер» #47, октябрь 2004 г.
Пропиши скачивание свежей базы в crontab(5) (корректнее: установи daily_status_security_portaudit_enable="YES» в /etc/periodic.conf) и любуйся ежедневными отчетами.
Нетрадиционные методыЕсли ты заметил, BSD больше подходит для организации защищенной системы в рамках классической модели безопасности UNIX. Тому способствуют как защитные механизмы системы (kernel securelevel, jail, systrace), так и средства аудита (accounting, periodic), доступные, что называется, «из коробки». Но можно пойти дальше и радикально поменять саму модель защиты, вместо традиционной дискреционной модели доступа применив одну из мандатных моделей. Это уже серьезно и требует хотя бы поверхностного знакомства с моделями безопасности. И здесь выигрывает Linux, для которого существуют такие проекты, как RSBAC (www.rsbac.org) и SELinux (www.nsa.gov/selinux). Они делают из Linux мощную систему с поддержкой Role Based Access Control (RBAC), Domain Type Enforcement (DTE) и кучей другого. Во FreeBSD 5, правда, тоже появилась возможность контроля доступа по расширенным атрибутам файлов (Mandatory Access Control), но это капля в море. Мандатные модели доступа – отдельная, серьезная тема, сложная в реализации применительно к конкретному production серверу и требующая внимательной эксплуатации.
Напоследок процитирую известную фразу: «If you fuck up OpenBSD it gets unsecure. Linux must be fucked up to be secure. Windows must be secure erased to be secure». Доля правды в ней есть, но помни, что главное для безопасности системы – не операционка, а тот, кто ей управляет.
Бойся жестких ссылокТакая с виду безобидная вещь, как хардлинк, может стать причиной компрометации системы. Представь, что в системе есть некая суидная программа. Права на нее, как на любой исполняемый файл, 755. Затем в программе нашли дыру, позволяющую с ее помощью получить локального рута. Ты вовремя обновился, но через пару дней тебя все равно хакнули. Как?
Посмотри полный вывод команды ls:
ЛИСТИНГ
[(3:47)(85.32%)(p3):~ ] ls -al rfc2818.txt
–rw-r-r– 1 toxa toxa 15170 15 июл 19:54 rfc2818.txt
Второе поле, сразу после прав доступа, – количество жестких ссылок на файл. В данном случае ссылка одна – сам файл, и, если я его удалю, он исчезнет. Но если ссылок больше, при удалении файла (командой rm) он не удалится, а лишь уменьшит счетчик ссылок на единицу, оставив свою жесткую копию. Полное стирание файла возможно только при обнулении счетчика хардлинков.
Взломщик создал жесткую ссылку программы в свой каталог, затем в ней была обнаружена уязвимость, ты, как тебе казалось, удалил дырявую версию программы, заменив ее новой, но на самом деле в каталоге взломщика осталась первоначальная версия программы, которая никуда с диска не делась. После чего он и поэксплуатировал уязвимость.
Почему же просто не скопировать программу себе в каталог? А потому, что потеряются первоначальные права на файл и владельцем вместо рута станет хакер, после чего наличие на ней suid-бита станет бессмысленным.
Следи за паролямиЕсли заглянуть в /etc/shadow (/etc/master.passwd в BSD), то можно увидеть массу системных учетных записей, но все они залочены – в поле пароля вместо хэша у них символ «*» или «!!», а вместо шелла – что-то вроде /sbin/nologin или /bin/false. Если у системного пользователя (не реального юзера) ты увидишь прописанный реальный шелл и хэш пароля, бей тревогу.
Безопасность – это не продукт, а процесс.
При желании ядро можно убрать в ящик в прямом смысле слова :).
Еще одно веяние времени эпохи параноиков – отслеживание системных вызовов, совершаемых программой, и дальнейшее их ограничение.
Изначальный подсчет контрольных сумм (MD5-хэшей) системных утилит и файлов и дальнейшая их проверка с помощью утилит типа tripwire или aide может избавить от сильной головной боли в дальнейшем. В случае изменения файла утилита найдет расхождение в MD5-отпечатке и поднимет тревогу.
Хардлинки работают только в пределах одной файловой системы (одной партиции).
Найти все suid/sgid бинарники в системе можно следующей командой:
# find / -type f ( -perm -4000 -o -perm -2000 ) -ls
цифра 4 в маске означает suid, 2 – sgid.
Выжми все из фаервола! / Возможности iptables
Докучаев Дмитрий aka Forb ( [email protected])
Фаервол – неотъемлемая часть *nix-системы. Но, как любой программный продукт, он нуждается в тщательной настройке. Сейчас я расскажу о том, как грамотно защитить свой сервер с помощью сетевого экрана iptables. Этот фаервол является самым простым и надежным, поэтому рекомендую ознакомиться с этим материалом.
Грамотный админ никогда не забудет установить фаервол на свою машину. Ведь брандмауэр позволяет решать множество важных задач. В первую очередь, он «заботится» о сетевой безопасности, фильтруя хакерские пакеты. При желании можно замутить и локальную безопасность, запретив юзерам выкачивать порнофильмы и варезные программы. Также с помощью сетевого экрана реально поднять NAT (Network Address Translation), позволяющий локальным машинам полноценно юзать ресурсы интернета.
Закроемся от внешних враговЕсли ты работал с iptables, то знаешь принцип действия этого фаервола. Он содержит несколько таблиц, в каждой из которых могут находиться так называемые цепочки. Дефолтовая таблица filter содержит три цепи – INPUT, OUTPUT и FORWARD. Первая отвечает за входящие пакеты, вторая – за исходящие. Последняя служит для управления обменом данных между соседними узлами. Наиболее популярный метод настройки iptables заключается в добавлении разрешающих правил в цепь INPUT с последующим изменением ее политики. У каждой цепочки есть своя политика: ACCEPT, REJECT и DROP. По умолчанию все пакеты проходят без ограничений. Но стоит лишь изменить политику на REJECT (запрещение соединения с взведением флага RST в ответном пакете) или DROP (простое игнорирование пакета), как данные будут нещадно отфильтровываться. Естественно, что администратор заранее пропишет правила, по которым нужные пакеты будут без проблем проходить на сервер.
Давай проведем подобную настройку фаервола. В первую очередь, позаботимся, чтобы пакеты беспрепятственно проходили через петлевой интерфейс (нам незачем запрещать локальные соединения). Выполним несложную команду:
iptables –A INPUT –i lo –j ACCEPT.
Как видно, команда iptables понимает различные параметры. Первый из них передает цепь, в которую будут занесены данные. Второй указывает на интерфейс. Последний определяет политику правила. Дословно команда означает следующее: «анести в цепь INPUT правило, разрешающее прием пакетов с интерфейса lo. Просто? Еще бы :).
Дальше чуть сложнее. Любой пакет может иметь 4 различных состояния. NEW представляет собой обычный пакет, инициирующий новое соединение. ESTABLISHED – пакет от уже установленного соединения. RELATED – новый пакет данных, который был создан старым соединением. И, наконец, INVALID – неизвестный пакет. Тебе необходимо разрешить только два вида – RELATED и ESTABLISHED, потому как они являются доверенными. Без дополнительных средств iptables не умеет различать состояния. В этом ему помогает специальный модуль state.
iptables –A INPUT –p tcp –m state –state RELATED,ESTABLISHED –j ACCEPT.
Правило усложнилось тремя новыми опциями. Параметр –p показывает, что рулес применяется к TCP-протоколу (без этого флажка нельзя заюзать модуль state). Опция –m позволяет подключать дополнительные модули. Третий параметр state относится к одноименному модулю. Он показывает, что правило обрабатывает пакеты определенного вида.
Следующий шаг направлен на настройку соединения с сервисами. Допустим, на сервере установлен proftpd, postfix и popa3d. На самом деле, сервисов может быть и больше, суть в том, чтобы не забыть о каждом из них. Итак, предположим, что postfix должен принимать данные от узла 192.168.1.1. К proftpd имеют право подключаться только клиенты сегмента 192.168.0.0/24, а снимать почту могут все. Давай оформим такую политику в виде трех несложных правил. Для удобства рекомендую создать дополнительную цепь services и подключить ее к основной INPUT.
Листинг
iptables –N services
iptables –A INPUT –j services
iptables –A services –p tcp –dport 25 –s 192.168.1.1 –j ACCEPT
iptables –A services –p tcp –dport 21 –s 192.168.0.0/24 –j ACCEPT
iptables –A services –p tcp –dport 110 –j ACCEPT
Флаг –s отвечает за IP-адрес отправителя. Он может принимать значение как отдельной станции, так и целого сегмента. Теперь, когда цепь INPUT полностью настроена, можно менять ее политику и тестировать созданные правила. Последний штрих достигается следующей командой:
iptables –P INPUT DROP
Можно сказать, что теперь твой сервер защищен от посторонних глаз. Однако существует много способов обхода фаерволов, один из которых заключается в написании connback-сценария. Последний сам соединяется с хакерской машиной. Чтобы пресечь подобные действия, необходимо фильтровать исходящий трафик. Менять политику цепи не стоит, нужно просто добавить несколько ограничивающих правил с участием модуля owner.