2.1. Определить уровень безопасности системы

Описание:  Системы BSD предоставляют несколько предопределённых настроек безопасности, известных как уровни безопасности (securelevels). Кандидат должен знать на каком он уровне безопасности, можно ли поднять или опустить уровень безопасности и как.

Практика: init(8), sysctl(8), rc.conf(5)

Комментарий

[Замечание]Замечание
Данный текст прислан Дмитрием Орловым, но подвергся моей редактуре. Е.М.

Функциональность securelevel можно рассматривать как метод защиты ядра, сырых устройств (raw devices), и файловой системы от атак злоумышленника, которому удалось взломать учётную запись суперпользователя. Защита ядра в общем случае включает в себя невозможность загрузки собственных модулей ядра и прослушивания проходящего через систему трафика. Функциональность securelevel/security присуствует во всех BSD системах с небольшими отличиями.

2.1.1. Установка уровня безопасности системы

Уровни безопасности служат для ограничения возможностей системы до такой степени, которая соответствует её рабочему окружению (среде работы). В OpenBSD он устанавливается скриптом rc.securelevel(8):

#  $OpenBSD: rc.securelevel,v 1.16 2004/07/06 04:05:03 deraadt Exp $
#
# в этом скрипте определяются действия, которые можно осуществить ДО
# того, как система перейдёт в безопасный режим. Действия, которые можно
# совершить ПОСЛЕ того, как будет определён уровень безопасности
# системы, должны помещаться в скрипт /etc/rc.local

# Здесь определяется желаемый уровень безопасности
# XXX
# XXX it is not really acceptable to put this value in a configuration
# XXX file, because locking it down requires immutability on about
# XXX 5 files instead of 2 (the kernel and init)
# XXX
securelevel=1

echo -n 'starting pre-securelevel daemons:'

#
# Сюда следует поместить ваши команды
#

echo '.'
  

В FreeBSD значение уровня безопасности выставляется в файле /etc/rc.conf:

kern_securelevel_enable="YES"
kern_securelevel=1
  

В DragonFly BSD уровень безопасности выставляется так же как в FreeBSD, за исключением того, что переменной kern_securelevel_enable выставлять не надо.

В NetBSD уровень безопасности так же выставляется через файл /etc/rc.conf:

securelevel=1
  

Уровень безопасности может быть прочитан или установлен с помощью утиллиты sysctl(8) через переменную kern.securelevel. По окончании процесса загрузки системы вы можете узнать текущий уровень безопасности системы набрав в командной строке:

$ sysctl kern.securelevel
kern.securelevel: -1
  

Вы можете повысить уровень безопасности командой:

# sysctl -w kern.securelevel=2
  

В процессе работы уровень безопасности системы может только повышаться. Уменьшение значения переменной ядра kern.securelevel запрещено.

2.1.2. Допустимые значения переменной securelevel

Ядра OpenBSD и NetBSD предоставляют 4 уровня системной безопаности, а FreeBSD и DragonFly BSD — 5. Последний уровень в них разбит на два подуровня.

-1 — полностью небезопасный уровень
Данный уровень, это уровень по умолчанию. Фактически он означает, что механизм securelevel вообще не включён. Документация по FreeBSD не рекомендует использовать данный уровень. В качестве небезопасного уровня документация FreeBSD рекумендует 0-й уровень.
0 — небезопасный уровень

  • используется во время загрузки и/или нахождения системы в однопользовательстком режиме
  • чтение файлов устройств и запись в них осуществляется согласно выставленным пермиссиям (на более старших уровнях на работу некоторых файлов устройств налагаются более строгие ограничения, см. ниже).
  • любые системные флаги файлов могут быть сброшены

На NetBSD, в дополнении к сказанному, запрещена трассировка процесса init(8).

1 — безопасный уровень

  • режим по умолчанию для многопользовательской системы
  • уровень безопасности не может быть понижен, кроме как при помощи init(8)
  • запрещена запись в устройства /dev/mem, /dev/kmem и /dev/io.
  • устройства сырых дисков (такие как /dev/ad0 и т.п.) в смонтированных файловых системах доступны только для чтения
  • системные файловые флаги immutable и append-only не могут быть сброшены (но не пользовательские, т.е. флаг schg и sappnd снять нельзя, а uchg и uappnd можно).
  • модули ядра не могут быть загружены или выгружены

На OpenBSD, в дополнении к сказанному, действуют следующие ограничения на изменения переменных ядра:

  • переменная fs.posix.setuid не может быть изменена
  • переменная net.inet.ip.sourceroute не может быть изменена
  • переменная machdep.kbdreset не может быть изменена
  • значения переменных ddb.console и ddb.panic не могут повышены
  • значение переменной machdep.allowaperture не может быть повышено

На NetBSD, в дополнении к сказанному, действуют следующие ограничения:

  • Запрещено изменение переменной ядра net.inet.ip.sourceroute.
  • Запрещено добавление и удаление переменных ядра.
  • Запрещено изменение времени (в OpenBSD и FreeBSD это сделано на 2-м уровне).
  • Нельзя изменить переменные ядра влияющие на то, будет ли изготавливаться coredump файл из програм с SUID-битом.

2 — наивысший уровень безопасности

идентичен уровню 1, кроме:

  • дисковые устройства всегда доступны только на чтение, не зависимо от того, смонтированы они или нет
  • settimeofday(2) и clock_settime(2) не могут установить время, меньше текущего
  • pf(4) фильтр и правила NAT не могут быть изменены

Наивысший уровень безопасности во FreeBSD и DragonFly BSD разбит на два уровня. Невозможность изменения правил pf(8) и NAT вынесены на уровень 3.

Режим повышенной безопасности может показаться драконовским, но он задумывался как последняя линия обороны в случае если учётная запись суперпользователя вскрыта.

Эти эффекты предотвращают обход файловых флагов путем прямой модификации сырых дисковых устройств или стирание файловой системы при помощи команды newfs(8). Далее, они могут ограничить потенциальное разрушающее действие (потенциальный вред от) вскрытого файрвола, путем запрещения модификации правил пакетного фильтра pf(8). Предотвращение перевода системного времени назад помогает при послеаварийном анализе и прибавляет уверенности в корректности журнальных файлов. При этом несколько страдает точность вычисления времени, так как блокировка времени осуществляется немгновенно.

Так как уровень безопасности может быть изменён при помощи отладчика ddb(4), вполне логично заблокировать его работу, как представлено уровнями 1 и 2 (и 3 во FreeBSD и DragonFly BSD). Это обеспечивается установкой переменных ядра ddb.console и ddb.panic в 0.

Не лишним будет упомянуть, что установку переменных на этапе загрузки можно выполнить в конфигурационном файле /etc/sysctl.conf. Например:

ddb.console=0
ddb.panic=0 
  

2.1.3. Ссылки

В разных системах семейства BSD придаётся различный смысл различным уровням безопасности. Чтобы получить конкретную информацию по вашей операционной системе, используйте следующие ссылки:


Обновлено: 12.03.2015