Интернет и безопасность
В настоящее время компьютерные сети незаменимы — как телефон или радио. Сейчас сети представляют собой не просто интересную разработку и не являются исключительной принадлежностью крупных компаний и государственных учреждений. Сети стали частью нашей жизни как на работе, так и дома. Вследствие этого постоянно возникает множество новых проблем и вопросов, которые необходимо решать. В нашем случае это вопросы, связанные с компьютерными сетями, с управлением отдельно взятыми возможностями, с построением сетей и работой отдельных компонентов сети, с защитой информации и т.д. Естественно, столь широкий круг проблем осветить в одной статье или даже в целом номере журнала невозможно, но рассказать о чем-либо конкретном кажется посильной задачей. В данном выпуске мы остановимся на некоторых вопросах безопасности Интернет-серверов.
Все нижеследующее изложение предполагает, что всем читателям уже давно известно об Интернете и они более-менее представляют себе принцип его работы. Также не будут даны объяснения наиболее часто встречающихся в сетевой работе терминов и сокращений.
Итак, рассматривается следующая модельная ситуация, отражающая очень широкий спектр конкретно реализованных решений. Имеется сеть, в которой находится некоторое количество компьютеров, а также есть выделенный компьютер, который является шлюзом между этой сетью и внешним миром, под которым мы подразумеваем Интернет. Этот компьютер является Интернет-сервером, который стоит первым на пути всей входящей информации и последним на пути всей исходящей. Очевидно, что именно он должен использоваться как средство защиты от вторжений в сеть и похищения конфиденциальной информации. Обычно обслуживанием такого компьютера занимается один или несколько конкретных людей, которых мы будем далее именовать администраторами. Такого типа сеть является типичной для офисов, госучреждений, домашних сетей. Основная идея состоит в следующем: есть компьютер, который в силу своего физического расположения в сети может взять на себя большее количество работы, чем остальные, то есть нет необходимости каждому из компьютеров подсети брать на себя все без исключения функции сетевой работы и защиты. Это разумно и эффективно. Теперь полностью абстрагируемся от конкретной сети и выясним, что должен делать системный администратор для эффективной работы шлюза.
Первоочередная задача — правильный и эффективный выбор компьютера для работы в качестве шлюза. Здесь имеется в виду как железо, так и операционная система. Но предварительно нужно четко усвоить следующее. Сервер, отвечающий за безопасность сети, ни в коем случае не должен использоваться пользователями сети. Не следует перегружать сервер лишними заданиями, если это не является крайне необходимым. При наличии большой внутренней сети разумно применять сервер исключительно как firewall-машину. Если сеть небольшая, то возможно использование шлюза, например для приема электронной почты пользователей подсети, как Web-сервера и т.п. Чего не должно быть на шлюзе никогда — это работы пользователей непосредственно на консоли. Что касается железа, то это не связано непосредственно с безопасностью сетевой работы, но нужно отметить несколько моментов, полезных при администрировании. Если вы используете старый компьютер на базе Intel, то имейте в виду, что у BIOS есть универсальный пароль. BIOS должен быть с паролем — это несомненно. Настройки железа, которые в нем делаются, не должны быть доступны пользователям. Необходимо запретить загрузку с дискеты и CD-ROM, чтобы гарантировать загрузку определенной системы. Лучше всего поставить пароль на загрузчик, чтобы невозможно было изменить загружаемую систему при старте компьютера. И еще — обеспечьте возможность делать резервные копии. Если это просто шлюз и firewall, то вы можете позволить себе просто сохранять системные файлы. Если же это еще и почтовый сервер, и, скажем, WWW, то необходимо сохранять информацию пользователей, чтобы потери были минимальными. Выбор операционной системы для сервера — вопрос ключевой. Оставим в стороне ситуацию, когда выбор железа однозначно диктует выбор системы, и рассмотрим более реалистичный вариант. Принципиально выбор при железе на базе Intel невелик: UNIX или Windows, но однако даже для Intel UNIX довольно много. Для начала приведу всем известные аргументы в пользу UNIX по сравнению с Windows: скорость и эффективность работы, надежность, многозадачность, реально многопользовательская система, гибкость в настройках. Но не следует думать, что Windows делали дилетанты. На мой взгляд, основная беда Windows в необходимости сохранять совместимость со старыми программами, написанными еще для DOS. Вы, конечно, помните, что DOS — это однозадачная, однопользовательская система. Изначально спланированная таким образом, она реализовывала, может быть, и более удобные для такого подхода, но при переходе к «много-» абсолютно неуместные методы работы с памятью и с дисками. В результате мы имеем систему Windows, которая сейчас уже является многопользовательской и даже многозадачной, но все это сделано довольно неуклюже по сравнению с UNIX. Поэтому, оставив спор о UNIX и Windows, поговорим о UNIX. Одной из наиболее популярных разновидностей UNIX в последнее время стала система Linux. Именно на этом примере далее будет рассказано о безопасности, но для начала скажем немного о самой системе. Это система типа UNIX, большинство вариантов которой написаны для Intel и ядро которой является официально бесплатным. Имеются различные варианты Linux, что отражается в наборе компонентов системы. Сейчас Linux представляет собой полноценную систему как для рабочей станции, так и для Интернет-сервера. Linux включает в себя все необходимые компоненты для работы с сетью, в том числе firewall, а также удобную графическую среду. Среди других очевидных преимуществ — удобная техническая поддержка и частые обновления системы, в том числе и связанные с защитой. Далее, как уже было сказано, мы представим вам примеры настроек из Linux, причем опять же будет подразумеваться, что читатель имеет представление о ядре, LILO и т.д.
Прежде всего поговорим о физической безопасности сервера. Вообще сервер в большинстве случаев представляет собой компьютер, который работает непрерывно и без перезагрузок. Во-первых, это повышает надежность работы железа, так как любые включения-выключения всегда вредны. Во-вторых, обеспечивается непрерывный прием почты пользователей подсети. В-третьих, появляется возможность непрерывного доступа к общим ресурсам сети. Иными словами, вы должны обеспечить максимальную защиту компьютера от ручной перезагрузки, например кнопкой выключения питания или Reset. Разумно также установить источник бесперебойного питания для поддержания работы системного блока сервера и основных концентраторов, маршрутизаторов и т.п. С этим же связаны и другие меры: предупреждения об отключении дисковода, загрузка только с одного диска и установка пароля в загрузчике Linux. Конкретно в Linux, например, вы можете передавать загрузчику аргументы; одним из них является single, который грузит Linux в режиме работы одного пользователя. Существует риск, что в случае перезагрузки системы кто-то (скорее всего умышленно) захочет перезагрузить систему в этом режиме. Вот пример файла lilo.conf, позволяющего снизить вероятность такой нежелательной загрузки:
boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=100 default=linux image=/boot/vmlinuz-2.2.5 label=linux root=/dev/hda1 read-only restricted password=LuCkYBOOTpwd
Кратко поясним написанное. Prompt заставляет вводить некоторую опцию загрузчика, в то время как timeout, задаваемый в десятых долях секунды (в данном случае 10 секунд), ограничивает время возможного ввода. По истечении этого времени загружается вариант default. Однако вы имеете возможность ввести нечто отличное от linux. Если вы введете упомянутую выше опцию linux single, то загрузчик обнаружит, что это не совпадает с default и начнет обрабатывать раздел restricted. Там он встретит директиву password и будет ожидать ввода этого пароля. К тому же весь ввод, то есть linux single и пароль, должен уложиться в указанные 10 секунд. Нужно, правда, иметь в виду, что пароль задается открытым текстом. Чтобы он был недоступен, нужно быть полностью уверенным, что остальные пользователи, кроме root, не могут читать файл lilo.conf. Будет разумно поставить атрибут immutable на этот файл командой:
chattr +i /sbin/lilo.conf
Этот атрибут запрещает любое изменение файла. Прежде чем такой файл редактировать, необходимо снять атрибут immutable командой:
chattr -i /sbin/lilo.conf
Право устанавливать или снимать такой атрибут имеет только пользователь root.
Теперь поговорим о паролях. Пароль, особенно пароль пользователя root, дает доступ к компьютеру. Очевидно, что если известен хотя бы чей-нибудь пароль, то возможен взлом системы изнутри. Прежде пароли хранились прямо в файле /etc/passwd в виде hash-кодов. Это довольно эффективно, особенно если используется эффективный алгоритм кодирования, например MD5. Другой способ — создать «теневой»файл паролей /etc/shadow, где они тоже хранятся в зашифрованном виде, но в отличие от файла /etc/passwd, к которому должны иметь доступ все пользователи, к файлу /etc/shadow имеет доступ только root, что делает пароль более защищенным. Проблема в том, что второй метод поддерживается не всеми системами, однако, например, RedHat позволяет уже при установке выбрать метод хранения паролей. Так как же хранить пароли пользователям и администраторам? Хорошо, если пароль можно запомнить. Это лучший метод, но он не всегда работает, если, скажем, вы должны помнить пароли на нескольких компьютерах. В любом случае есть два правила, которым нужно следовать всегда, даже если вы не системный администратор: никогда не записывайте пароли физически; никогда не используйте одинаковые пароли на разных компьютерах или для разных пользователей одного компьютера. Но что делать, если вам все же необходимо использовать несколько паролей и вы не уверены, что сможете их запомнить? Один из эффективных вариантов — хранить их в файле в зашифрованном виде и помнить только пароль для обратной расшифровки. Это удобно и достаточно надежно. Вообще же, нужно отдавать себе отчет в том, что пароли, методы кодирования и хранения придумывали люди, а потому стопроцентно защитить ничего от других людей нельзя. Можно значительно снизить риск, но совсем исключить его не удастся.
Следующим важным моментом защиты системы является доступ к системным файлам. Вот те файлы, которые должны быть защищены любой ценой:
/etc/passwd /etc/shadow /etc/groups /etc/gshadow /etc/login.defs /etc/shells /etc/securetty
О первых двух файлах мы уже сказали выше. Файлы групп отвечают за безопасность информации о группах пользователей, что является эффективным инструментом при работе с атрибутами файлов. Файл /login/defs хранит параметры работы некоторых программ, связанных с администрированием пользователей и паролей. Файл /etc/shells содержит список допустимых оболочек. Файл /etc/securetty содержит список tty, с которого может входить пользователь root. Разумно, если в этом файле будет только tty1 (первая консоль). Еще лучше запретить вход пользователя root, а использовать программу sodo. Что же касается хранения файлов вообще, то нужно иметь в виду следующее. Очень плохо, если переполняются файловые системы. Это может привести к тому, что пользователь вообще не сможет войти в систему. Поэтому целесообразно, чтобы домашняя директория пользователя root находилась не в /home, а в /root. Также плохо, когда переполняется директория /tmp, где программы хранят временные файлы.
Еще один момент, связанный с сохранностью файлов, — это их удаление. Данная процедура не удаляет файл физически, оставляя возможность восстановить его впоследствии. Иногда это удобно, иногда нежелательно, особенно если в файле хранится некоторая секретная информация. В подобном случае можно воспользоваться программой wipe, которая физически затирает место хранения удаленного файла.
Посмотрим, какие возможности предоставляет Linux для администрирования системы и ограничения возможностей пользователей (в целях более эффективной работы, конечно).
Программа YaST (Yet Another Setup Tool) — система локального администрирования, позволяющая работать с системой в целом. Сама программа довольно удобна, но не позволяет, например, создавать квоты для пользователей при пользовании диском или управлять другими системами по сети.
Программа sudo наиболее удобна, чтобы не входить в систему как root. Она дает вам привилегии пользователя root, однако не все. Почему во всех руководствах настоятельно требуют не входить как root? Ответ прост: root может все. Поэтому вы подвергаете систему большому риску не только тем, что вводите пароль. Пароль можно ввести и в программе sodo, но если вы имеете все привилегии root, то вы можете стереть или изменить любой файл, запустить любую программу. Одна-единственная ошибка при этом может стоить многих часов работы. Конечно, никто не утверждает, что вообще нельзя входить как root, но во всех руководствах, созданных опытными системными администраторами, говорится, что делать это нужно только в том случае, если иного выхода просто нет. Исходя из собственного опыта могу утверждать, что такое бывает редко: лично у меня это случилось два разадважды года за полтора, причем один раз я переставлял систему на новые винчестеры. Программу sudo можно достать как дополнение, например, с Интернет-адреса http://www.courtesan.com/sudo. У этой программы есть файл настройки /etc/sudoers. Вот один из примеров настройки:
#Give the user ‘seifried’ full access seifried ALL=(ALL) ALL #Create a group of users, a group of hosts, and allow then to shutdown the server as root Host_Alias WORKSTATIONS=localhost, machine1, machine2 User_Alias SHUTDOWNUSERS=user1, user2 Cmnd_Alias REBOOT=halt, reboot, sync Runas_Alias REBOOTUSER=admin SHUTDOWNUSERS WORKSTATIONS=(REBOOTUSER) REBOOT
Программа Super позволяет управлять доступом пользователей к администрированию системы. Адрес в Интернете: ftp://ftp.ucolick.org/pub/users/will.
Программа runas, по своему принципу аналогична sudo и Super. Адрес в Интернете: http://www.mindspring.com/~carpinello/runas/index.html.
А теперь перейдем к программам, основанные основанным на Web-интерфейсе, которые позволяют администрировать удаленные системы.
Программа Webmin позволяет управлять системой удаленно, причем внутри нее создаются ее внутренние пользователи. Имеется возможность очень гибкой настройки: например, вы можете дать доступ конкретному внутреннему пользователю только к одной функции. Еще одно преимущество этой программы в том, что она написана на Perl, что делает ее переносимой. Интернет Интернет-адрес, где ее можно взять: http://www.webmin.com/webmin. По умолчанию программа работает на 10000-м порту. Будет разумно сделать некоторые правила для firewall на уровне ipfwadm:
ipfwadm -I -a accept -P tcp -S 10.0.0.0/8 -D 0.0.0.0/0 10000 ipfwadm -I -a accept -P tcp -S some.trusted.host -D 0.0.0.0/0 10000 ipfwadm -I -a deny -P tcp -S 0.0.0.0/0 -D 0.0.0.0/0 10000
или ipchains:
ipchains -A input -p all -j ACCEPT -s 10.0.0.0/8 -d 0.0.0.0/0 10000 ipchains -A input -p all -j ACCEPT -s some.trusted.host -d 0.0.0.0/0 10000 ipchains -A input -p all -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0 10000
Программа Linuxconf может запускаться из командной строки, из Xwindows или через Web-сервер. Нужно иметь в виду, что эта программа не поддерживает кодирования кодирование информации, поэтому ее не следует использовать вне пределов администрируемой сети. Иначе необходимо использовать алгоритмы шифрованной передачи IP-пакетов. Интернет-адрес: http://www.solucorp.qc.ca/linuxconf.
Еще две программы с возможностями удаленного управления системой: программа COAS (Caldera Open Administration System) http://www.coas.org и программа WebART http://hq.hellug.gr/~webrat.
Стоит упомянуть также программу Pikt, Эта программа позволяет позволяющую совершать полезные действия, которые вв других системах администрирования редко переведены на автоматизированный уровень, например «убивать» долго живущие или зависшие процессы, устанавливать размер почтового ящика, следить за использованием системы, например в нестандартное время. Сама программа построена на скриптах, которые необходимо выучить как некий внутренний язык. Преимущества программы проявляются в случаях, если приходится администрировать несколько систем. Сейчас эта программа реализована для Solaris, Linux и FreeBSD. Интернет Интернет-адрес: http://www.pikt.uchicago.edu/pikt.
А сейчас мы выясним, зачем и каким образом нужно ограничивать доступ пользователей к системе. Очевидно, что пользователей много, а компьютер один. Поэтому необходимо в разумных пределах ограничивать как число процессов, выполняемых одним пользователем, так и место на диске. К тому же в целях безопасности, следует ограничить возможные места входа пользователей в систему. Мы уже говорили, что нужно запретить вход пользователей с консоли. Кроме того, целесообразно запретить вход по модему, за исключением тех пользователей, кому это действительно необходимо. Если таковых много, то для общего удобства следует ограничить время работы на модемном входе и так т.далее. В Linux вы можете управлять ограничениями для пользователей, редактируя файл /etc/security/limits.conf, например:
* hard core 0 user soft nproc 100 user2 hard nproc 150
Что это означает? Здесь написано, что для всех запрещены core dumps, для пользователя user установлен предел в 100 процессов, а для пользователя user2 — предел в 150 процессов. Для первого пользователя предел мягкий, то есть он может быть превзойден и тогда последует предупреждение, а для второго пользователя — жесткий, то есть 151-й процесс просто не будет запущен.
Оболочка Bash имеет свои собственные возможности по ограничениям для пользователей, которые можно записать в profile. Следующий пример аналогичен выше написанному выше:
ulimit -Sc 0 ulimit -Su 100 ulimit -Hu 150
При этом нужно иметь в виду, что данные установки не будут действовать ни в какой другой оболочке, а также в том случае, если пользователь их изменит. Поэтому следует позаботиться, чтобы пользователь не изменял свой profile, что иногда а это не всегда неудобно. Можно, конечно, вписать все в файл /etc/profile, но тогда установки будут универсальными.
Программа Quota позволяет ограничивать объем диска, занимаемый пользователями. Это способствует тому, чтобы среди пользователей не возникало споров о том, кому дано больше места. Эта программа есть в большинстве Linux, и к ней прилагается подробное описание в man.
Теперь перейдем непосредственно к сетевой защите компьютера. Основной сервис, который запускается при старте машины, — это inetd, читающий файл inetd.conf. В указанном файле прописано, какие программы и демоны и должны быть запущены и как это должно быть сделано; — постоянно или по требованию. Постоянно лучше запускать то, что должно работать часто и быстро, например DNS или почту. Любые изменения в файле inted.conf могут быть активированы перезапуском самого inetd, для чего достаточно дать команду
killall -1 inetd.
Следующий файл, который содержит информацию о сетевых сервисах по портам, — services. Он устроен следующим образом:
Имя_сервиса порт/протокол название # комментарий
Приведем несколько строк из этого файла, которые запускают довольно старые, редко используемые сервисы и которые в большинстве случаев можно безболезненно закомментировать:
echo stream tcp nowait root internal echo dgram udp wait root internal discard stream tcp nowait root internal discard dgram udp wait root internal daytime stream tcp nowait root internal daytime dgram udp wait root internal chargen stream tcp nowait root internal chargen dgram udp wait root internal gopher stream tcp nowait root /usr/sbin/tcpd gn shell stream tcp nowait root /usr/sbin/tcpd in.rshd login stream tcp nowait root /usr/sbin/tcpd in.rlogind exec stream tcp nowait root /usr/sbin/tcpd in.rexecd talk dgram udp wait nobody.tty /usr/sbin/tcpd in.talkd ntalk dgram udp wait nobody.tty /usr/sbin/tcpd in.ntalkd uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/sbin/uucico -l
Простой способ разрешения или блокирования входа в систему — файлы hosts.allow и hosts.deny. Нужно запомнить, что по умолчанию система вначале разрешает, а потом запрещает. В этих файлах находятся правила, указывающие на адреса и домены. Правила просматриваются в следующем порядке: файл hosts.allow от начала до подходящего правила или до конца, а затем hosts.deny от начала и до подходящего правила или до конца. Просмотр останавливается на первом найденном подходящем правиле, причем, если это правило в файле hosts.allow, то hosts.deny просматриваться уже не будет. Если же подходящих правил нет вообще, то система разрешает вход. Этого можно легко избежать, если последней строкой hosts.deny вписать следующее:
ALL: 0.0.0.0/0.0.0.0
Это запретит использование любого сервиса с любого компьютера. Вот некоторые примеры строк из файлов описания доступа:
hosts.allow: in.telnetd: 10.0.0.0/255.255.255.0 # доступ из внутренней подсети 10.0.0.* in.ftpd: 0.0.0.0/0.0.0.0 # доступ с любого адреса hosts.deny: in.telnetd: 0.0.0.0/0.0.0.0 # запрет telnet отовсюду ipop3d: 0.0.0.0/0.0.0.0
Обратите внимание, что доступ по telnet из внутренней сети возможен, хотя в файле hosts.deny он запрещен отовсюду, поскольку вначале обрабатывается файл hosts.allow.
Существуют также программы, которые позволяют смотреть запущенные процессы, статистику работы сети и открытые программами файлы. Среди наиболее часто используемых:
ps netstat lsof
Программа ps отображает информацию о работающих процессах, их номера, владельца, а также имя самой программы вместе с аргументами. Вот какой вывод может быть, если дать команду ps -xau:
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND bin 320 0.0 0.6 760 380 ? S Feb 12 0:00 portmap daemon 377 0.0 0.6 784 404 ? S Feb 12 0:00 /usr/sbin/atd named 2865 0.0 2.1 2120 1368 ? S 01:14 0:01 /usr/sbin/named -u named -g named -t /home/named nobody 346 0.0 18.6 12728 11796 ? S Feb 12 3:12 squid nobody 379 0.0 0.8 1012 544 ? S Feb 12 0:00 (dnsserver) nobody 380 0.0 0.8 1012 540 ? S Feb 12 0:00 (dnsserver) nobody 383 0.0 0.6 916 416 ? S Feb 12 0:00 (dnsserver) nobody 385 0.0 0.8 1192 568 ? S Feb 12 0:00 /usr/bin/ftpget -S 1030 nobody 392 0.0 0.3 716 240 ? S Feb 12 0:00 (unlinkd) nobody 1553 0.0 1.8 1932 1200 ? S Feb 14 0:00 httpd nobody 1703 0.0 1.8 1932 1200 ? S Feb 14 0:00 httpd root 1 0.0 0.6 776 404 ? S Feb 12 0:04 init [3] root 2 0.0 0.0 0 0 ? SW Feb 12 0:00 (kflushd) root 3 0.0 0.0 0 0 ? SW Feb 12 0:00 (kswapd) root 4 0.0 0.0 0 0 ? SW Feb 12 0:00 (md_thread) root 64 0.0 0.5 736 348 ? S Feb 12 0:00 kerneld root 357 0.0 0.6 800 432 ? S Feb 12 0:05 syslogd root 366 0.0 1.0 1056 684 ? S Feb 12 0:01 klogd root 393 0.0 0.7 852 472 ? S Feb 12 0:00 crond root 427 0.0 0.9 1272 592 ? S Feb 12 0:19 /usr/sbin/sshd root 438 0.0 1.0 1184 672 ? S Feb 12 0:00 rpc.mountd root 447 0.0 1.0 1180 644 ? S Feb 12 0:00 rpc.nfsd root 458 0.0 1.0 1072 680 ? S Feb 12 0:00 /usr/sbin/dhcpd root 489 0.0 1.7 1884 1096 ? S Feb 12 0:00 httpd root 503 0.0 0.4 724 296 2 S Feb 12 0:00 /sbin/mingetty tty2 root 505 0.0 0.3 720 228 ? S Feb 12 0:02 update (bdflush) root 541 0.0 0.4 724 296 1 S Feb 12 0:00 /sbin/mingetty tty1 root 1372 0.0 0.6 772 396 ? S Feb 13 0:00 inetd root 1473 0.0 1.5 1492 1000 ? S Feb 13 0:00 sendmail: accepting connections on port 25 root 2862 0.0 0.0 188 44 ? S 01:14 0:00 /usr/sbin/holelogd.named /home/named/dev/log root 3090 0.0 1.9 1864 1232 ? S 12:16 0:02 /usr/sbin/sshd root 3103 0.0 1.1 1448 728 p1 S 12:16 0:00 su -root 3104 0.0 1.3 1268 864 p1 S 12:16 0:00 -bash root 3136 0.0 1.9 1836 1212 ? S 12:21 0:04 /usr/sbin/sshd
Представленный способ наиболее эффективен для проверки того, нет ли в памяти лишних или неожиданных программ. Конечно, если вы имеете дело с профессиональным взломщиком, то, скорее всего, столь банальным способом его не поймать, но если вы обнаруживаете, что какая-то программа занимает нехарактерное необычное количество памяти или запущена со странными аргументами, то это послужит для вас предупреждением.
Вторая программа — netstat, позволяющая смотреть на активные порты и их работу. Вот типичный вывод команды netstat -vat:
Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 158.250.4.23:80 205.253.183.122:3661 ESTABLISHED tcp 0 0 0.0.0.0:1036 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 10.0.0.10:53 0.0.0.0:* LISTEN tcp 0 0 158.250.4.200:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:635 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN udp 0 0 127.0.0.1:1031 0.0.0.0:* udp 0 0 0.0.0.0:1029 0.0.0.0:* udp 0 0 0.0.0.0:800 0.0.0.0:* udp 0 0 0.0.0.0:1028 0.0.0.0:* udp 0 0 10.0.0.10:53 0.0.0.0:* udp 0 0 158.250.4.200:53 0.0.0.0:* udp 0 0 127.0.0.1:53 0.0.0.0:* udp 0 0 10.1.0.1:138 0.0.0.0:* udp 0 0 10.1.0.1:137 0.0.0.0:* udp 0 0 10.0.0.10:138 0.0.0.0:* udp 0 0 10.0.0.10:137 0.0.0.0:* udp 0 0 0.0.0.0:138 0.0.0.0:* udp 0 0 0.0.0.0:137 0.0.0.0:* udp 0 0 0.0.0.0:2049 0.0.0.0:* udp 0 0 0.0.0.0:635 0.0.0.0:* udp 0 0 0.0.0.0:514 0.0.0.0:* udp 0 0 0.0.0.0:111 0.0.0.0:* raw 0 0 0.0.0.0:1 0.0.0.0:* raw 0 0 0.0.0.0:6 0.0.0.0:*
Дадим краткое пояснение. Первая строка –— общение удаленного клиента с Web-сервером на нашей машине. Ниже мы видим, что порты 80 (WWW), 139 (Samba), 25 (mail), 2049 (NFS), 21 (ftp) и другие прослушиваются соответствующими серверами на нашей машине.
Третья программа — lsof — дает возможность посмотреть на работу программ, на открытые ими соединения, используемые порты и файлы.
Для управления движением пакетов существуют существует несколько программ: routed, gated, MRT и zebra. Первая —– это наиболее старая стандартная программа для управления пакетами, gated — более гибкая: есть поддержка RIP версий 1 и 2, DCN HELLO, OSPF версии 2, EGP версии 2 и BGP версий 2, 3 и 4. Преимущество MRT состоит в поддержке IPv6.
Все вышесказанное касается управления сетью и наблюдений за используемыми ресурсами системы. А сейчас я более подробно расскажу про firewall в Linux. Вообще, Firewallfirewall, — это, как известно, способ фильтрации передаваемой информации. В зависимости от своей сложности firewall может работать с пакетами, с законченными порциями данных (цепями IP IP-пакетов) или выполнять функции proxy на программном уровне. Основное назначение — отсекать передачу нежелательной информации по тем или иным признакам. Ясно, что на самом низком уровне возможно только блокировать какую-либо передачу по адресу или порту, на следующем уровне появляется возможность смотреть данные, на более высоком уровне возможна имитация действия реальной программы, которая должна обрабатывать эту информацию, чтобы понять потенциальные последствия использования принятых данных. В Linux изначально имеются базовые средства для обеспечения некоторых функций firewall: ipfwadm и ipchains (ipfwadm не поддерживается в последних версиях Linux и полностью заменяется ipchains).
Программа ipfwadm обеспечивает функции firewall уровня сетевых пакетов, поддерживая правила accept, deny, reject. Вот как мог бы выглядеть файл конфигурации для этой программы:
#!/bin/bash # # Очистка стека правил # ipfwadm -f -I ipfwadm -f -O ipfwadm -f -F # # Перенаправление пакетов по 24-му порту между двумя сетями # ipfwadm -F -a accept -P all -S 10.0.0.0/24 -i eth0 -D 192.168.0.0/24 ipfwadm -F -a accept -P all -S 192.168.0.0/24 -i eth1 -D 10.0.0.0/24 ipfwadm -F -p deny # # Разрешение на вход пакетов по 24-му порту извне # ipfwadm -I -a accept -P tcp -S 10.0.0.0/24 -i eth0 -D 192.168.0.0/24 ipfwadm -I -a accept -P tcp -S 192.168.0.0/24 -i eth1 -D 10.0.0.0/24 # # Доступ к mail серверу и ни к чему больше # ipfwadm -I -a accept -P tcp -S 10.0.0.0/24 -i eth0 -D 10.0.0.1 25 ipfwadm -I -a accept -P tcp -S 192.168.0.0/24 -i eth0 -D 192.168.0.1 25 ipfwadm -I -p deny
В программе ipchains существуют возможности применения правил masq, redirect, return, а также перенаправления портов (То то есть, данные, пришедшие на некоторый локальный порт, могут быть перенаправлены на другой.). Вот пример конфигурации ipchains, заимствованный мною из описания Linux. Здесь задается работа шлюза с двумя установленными сетевыми интерфейсами:
#!/bin/bash # # This script sets up firewall rules appropriate for a server with 2 interfaces # running as a gateway # This script needs to be edited if you plan to use it. # We assume the internal machines call all talk to the gateway, so no rules block # internal traffic # # A couple of variables # # ETH0 is the IP address on ETH0 (the external interface) # ETH0NET is the network # ETH0NETMASK is the network mask # TRUSTEDHOST1 is a trusted host (for webmin/ssh) # TRUSTEDHOST2 is a trusted host (for webmin/ssh) # ETH1IP is the IP address on ETH1 (internal interface) # ETH1NET is the network # ETH1NETMASK is the network mask # ETH0IP=1.1.1.1 ETH0NET=1.1.1.0 ETH0NETMASK=24 TRUSTEDHOST1=1.5.1.1 TRUSTEDHOST2=1.5.1.2 ETH1IP=10.0.0.1 ETH1NET=10.0.0.0 ETH1NETMASK=24 # PATH=/sbin # FLUSH ALL RULES ipchains -F input ipchains -F output ipchains -F forward # ANTI-SPOOFING ipchains -A input -p all -j DENY -s 10.0.0.0/8 -i eth0 -d 0.0.0.0/0 ipchains -A input -p all -j DENY -s 127.0.0.0/8 -i eth0 -d 0.0.0.0/0 ipchains -A input -p all -j DENY -s 192.168.0.0/16 -i eth0 -d 0.0.0.0/0 ipchains -A input -p all -j DENY -s 172.16.0.0/16 -i eth0 -d 0.0.0.0/0 ipchains -A input -p all -j DENY -s $ETH0IP -i eth0 -d 0.0.0.0/0 # ICMP FIRST ipchains -A input -p icmp -j ACCEPT -s $ETH0NET/$ETH0NETMASK -i eth0 -d 0.0.0.0/0 ipchains -A input -p icmp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 # SSH ipchains -A input -p tcp -j ACCEPT -s $TRUSTEDHOST1 -i eth0 -d 0.0.0.0/0 22 ipchains -A input -p tcp -j ACCEPT -s $TRUSTEDHOST2 -i eth0 -d 0.0.0.0/0 22 # BLOCKING 1:1023 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1:1023 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1:1023 # BLOCKING OTHER THINGS ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1109 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1524 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1600 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 2003 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 2049 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 2105 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3001 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3001 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3128:3130 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3128:3130 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3306 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3306 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 4444 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 6000:6100 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 6000:6100 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 6667 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 7000 # WEBMIN ipchains -A input -p tcp -j ACCEPT -s $TRUSTEDHOST1 -i eth0 -d 0.0.0.0/0 10000 ipchains -A input -p tcp -j ACCEPT -s $TRUSTEDHOST2 -i eth0 -d 0.0.0.0/0 10000 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 10000 # FORWARD RULES ipchains -P forward DENY ipchains -A forward -p all -j MASQ -s $ETH1NET/$ETH1NETMASK -d 0.0.0.0/0
В качестве firewall для Linux применяют и такие программы, как netfilter, IPF (IP Firewall), Sinus Firewall, FirePlug Edge, FWTK (FireWall ToolKit).
Подводя некоторые итоги, замечу, что мы рассмотрели весьма широкий круг вопросов. Вашему вниманию были предложены реальные действия администратора для увеличения безопасности системы и сетевого трафика, возможные методы ограничения пользователей в целях их же безопасности. Но, естественно, есть еще много моментов, которые интересно рассмотреть. Например, мы не затронули тему сетевых атак и взломов системы и поэтому ничего не сказали о методах их предупреждения. За рамками статьи остались вопросы IP security и виртуальных частных сетей. Также не были освещены вопросы работы серверных приложений. Полагаю, что в дальнейшем мы продолжим развивать эти темы в следующих номерах журнала.
Caldera OpenLinux
Bugs: bugs@caldera.com
Security: http://www.calderasystems.com/support/security/
Support: support@caldera.com
Debian GNU/Linux
Bugs: bugs@debian.org
Security: http://www.debian.org/security/
Support: http://www.debian.org/support/
Red Hat Linux
Bugs: http://developer.redhat.com/bugzilla/
Security: http://www.redhat.com/support/
Support: support@redhat.com
SuSE
Bugs: bugs@suse.com
Security: http://www.suse.de/de/support/security/index.html
Support: support@suse.com
TurboLinux
Bugs: jht@turbolinux.com
Security: jht@turbolinux.com
Support: support@turbolinux.com
http://www.turbolinux.com/support/
Mandrake
Bugs: http://www.linux-mandrake.com/bugs
Security: http://www.linux-mandrake.com/ru/security.php3
Support: http://www.linux-mandrake.com/ru/freesup.php3
Black Cat
Support: http://www.blackcatlinux.com/support.shtml
КомпьютерПресс 2'2001