Несомненно, одна из важнейших задач системного администратора - обеспечивать безопасность системы. Многопользовательские системы, такие как BSD Unix, имеют некоторый базовый набор средств безопасности, однако обычно этого бывает недостаточно, и, чтобы построить и поддерживать безопасность системы на должном уровне, администратору приходится прикладывать некоторые усилия. Безопасность системы целиком и полностью находится в руках системного администратора. Unix системы способны выполнять огромное число процессов одновременно, и многие из них являются серверами, то есть к ним можно обращаться извне. Сегодня уже никого не удивишь компьютером на рабочем столе, а с распространением и повсеместным внедрением в нашу жизнь сетевых технологий проблемы безопасности становятся первоочередными.
Лучше всего строить модель безопасности, основываясь на "уровневом" подходе. В двух словах, это означает создание неких "эшелонов", "колец" защиты, и бдительное наблюдение за состоянием каждого уровня. Имейте в виду, что слишком "перегруженная" система безопасности может скорее помещать, нежели помочь предотвращению атаки. Например, не стоит устанавливать schg-флаги (см. chflags(1)) на каждый выполняемый системный файл, так как это, возможно, и предотвратит несанкционированные модификации Ваших файлов, но, в то же время, может лишить Вас легко обнаруживаемых следов пребывания хакера, что ему только на руку.
Перечислим ключевые действия, которые имеют непосредственное отношение к безопасности любой компьютерной системы:
Атаки типа "отказ от обслуживания" (DoS).
Получение пользовательского аккаунта.
Получение прав суперпользователя (root) с использованием доступных сервисов.
Получение прав суперпользователя (root) с использованием пользовательских аккаунтов.
Создание "закладок" или "черных ходов" (backdoors)
При атаке на отказ от обслуживания машина лишается необходимых ресурсов для выполнения требуемых запросов. Наиболее типичными атаками этого типа являются механизмы так называемой "грубой силы" (brute-force), которые направлены на выведение из строя отдельных серверов или сети в целом. Иногда для достижения цели используются обнаруженные ошибки в сетевом стеке, когда даже одного специальным образом составленного пакета достаточно, чтобы вывести машину из строя. Обычно ошибки такого рода исправляются путем прикладывания соответствующих "заплаток" (patches) к ядру. Разумно также тщательно подбирать сетевые опции, чтобы не допустить перегрузки серверов при работе с очень высоким потоком данных (например, каким-либо образом ограничивать этот поток). Если же Вашу систему атакуют методом "грубой силы", бороться с этим сложнее. Например, если машину "забрасывают" специальным образом сгенерированными пакетами, то часто бывает, что практически невозможно остановить атакующего, кроме как полностью отключив компьютер от сети. Даже в этом случае, хотя Ваша машина не будет затронута, сетевой трафик будет сильно нарушен.
Атаки, нацеленные на аккаунты рядовых пользователей распространены еще больше, чем атаки на отказ от обслуживания. Многие системные администраторы все еще достаточно часто используют стандартные сервисы, такие как telnetd, rlogind, rshd и ftpd. Эти демоны, по умолчанию, не используют шифрование передаваемых по сети данных при своей работе. В результате, если у Вас достаточно большое число пользователей системы, весьма вероятно, что кто-нибудь из них рано или поздно "засветит" свой пароль. Поэтому внимательный администратор всегда должен анализировать файлы системных журналов на предмет попыток зайти на машину с необычных адресов, и тем более в случае успеха таких попыток.
Всегда важно помнить, что если атакующий имеет доступ к пользовательскому аккаунту, то потенциально он может получить и права суперпользователя. Однако, на самом деле, на правильно и умело сконфигурированной и регулярно проверяемой машине, наличие пользовательского аккаунта вовсе не означает, что атакующий сможет "сломать" ее. Разница между типичным пользовательским аккаунтом и аккаунтом суперпользователя в том, что во втором случае атакующий может сделать с системой что угодно, в то же время, без привилегий суперпользователя, можно лишь модифицировать или удалить файлы, принадлежащие данному пользователю, или в худшем случае "завесить" машину. Случаи, когда атакующий получает (неавторизованно) пользовательские права, весьма нередки, так как обычно рядовые пользователи не принимают всех необходимых мер предосторожности, и часто в задачу системного администратора входит принятие этих мер.
Системный администратор всегда должен иметь ввиду, что существует множество потенциальных путей, которыми атакующих может проникнуть в систему. Например, он может знать пароль суперпользователя, воспользоваться ошибкой в программном обеспечении, выполняющимся с повышенными привилегиями, сетевом или локальном. Если атакующий нашел способ проникнуть в систему (получить привилегии суперпользователя), то чаще всего он попытается оставить так называемую "закладку", чтобы в следующий раз ему не пришлось проделывать всю грязную работу заново (и затем убирать за собой). Это дает Вам удобную возможность обнаружить взломщика (так как ему придется произвести кое-какие изменения в системе). Если же хакер смог установить "закладку", это может губительно сказаться на безопасности Вашей системы, так как сильно снижаются шансы, что кто-нибудь еще попытается взломать ее тем же способом, что и в первый раз, и, таким образом, дырка в системе останется открытой.
Как уже было сказано ранее, лучше всего строить модель безопасности, основываясь на "уровневом" подходе. Перечислим основные моменты:
Обеспечение безопасности служебных аккаунтов и аккаунта суперпользователя.
Безопасность серверов, выполняющихся с повышенными привилегиями, и исполнимых файлов, использующих SUID/SGID механизм.
Обеспечение безопасности пользовательских аккаунтов.
Защита файлов, содержащих пароли.
Защита ядра операционной системы, raw устройств и файловых систем.
Быстрое обнаружение подозрительных изменений в системе.
Паранойя.
В следующей секции все перечисленные пункты будут рассмотрены в подробностях.