Руководство FreeBSD
Пред. | Глава 16. Принудительный контроль доступа (MAC) | След.

# 16.14. Реализация защищенной среды с MAC

Нижеследующая демонстрация реализует защищенную среду с использованием различных MAC модулей с соответственно настроенными политиками. Используйте этот пример только для тестирования, он не предназначен для удовлетворения всех требований к защите. Реализация этих политик без понимания принципа их работы неприменима в реальных задачах.

Перед началом процесса настройки, на каждую файловую систему необходимо установить параметр `multilabel`, который упоминался в начале этой главы. Невыполнение этого требования приведет к ошибкам.

## 16.14.1. Создание insecure класса пользователя

Начните процедуру добавлением следующего класса пользователя к файлу `/etc/login.conf`:

    insecure:\
    :copyright=/etc/COPYRIGHT:\
    :welcome=/etc/motd:\
    :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
    :path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
    :manpath=/usr/share/man /usr/local/man:\
    :nologin=/usr/sbin/nologin:\
    :cputime=1h30m:\
    :datasize=8M:\
    :vmemoryuse=100M:\
    :stacksize=2M:\
    :memorylocked=4M:\
    :memoryuse=8M:\
    :filesize=8M:\
    :coredumpsize=8M:\
    :openfiles=24:\
    :maxproc=32:\
    :priority=0:\
    :requirehome:\
    :passwordtime=91d:\
    :umask=022:\
    :ignoretime@:\
    :label=partition/13,mls/5:

и добавлением следующей строки к default классу пользователя:

    :label=mls/equal,biba/equal,partition/equal:

После завершения этих действий, для пересборки базы данных должна быть выполнена следующая команда:

    # cap_mkdb /etc/login.conf

## 16.14.2. Загрузка с необходимыми модулями

Добавьте к `/boot/loader.conf` следующие строки, чтобы необходимые модули были загружены при старте системы:

    mac_biba_load="YES"
    mac_mls_load="YES"
    mac_seeotheruids_load="YES"
    mac_partition_load="YES"

## 16.14.3. Установка всех пользователей в insecure

Всем учетным записям, кроме `root` или системных пользователей теперь потребуется присвоить класс (login class). При отсутствии класса пользователи не смогут получить доступа к обычным командам, таким как vi(1). Следующий скрипт `sh` сделает все необходимое:

    # for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \
    	/etc/passwd`; do pw usermod $x -L insecure; done;

После этого изменения необходимо запустить команду `cap_mkdb` на файле `/etc/master.passwd`.

## 16.14.4. Завершение настройки

Должен быть создан файл контекста; следующий пример взят из примера политики от Robert Watson, он может быть помещен в `/etc/policy.contexts`:

    # This is the default BIBA/MLS policy for this system.

    .*                              biba/high,mls/high
    /sbin/dhclient                  biba/high(low),mls/high(low)
    /dev(/.*)?                      biba/equal,mls/equal
    # This is not an exhaustive list of all "privileged" devices.
    /dev/mdctl                      biba/high,mls/high
    /dev/pci                        biba/high,mls/high
    /dev/k?mem                      biba/high,mls/high
    /dev/io                         biba/high,mls/high
    /dev/agp.*                      biba/high,mls/high
    (/var)?/tmp(/.*)?               biba/equal,mls/equal
    /tmp/\.X11-unix                 biba/high(equal),mls/high(equal)
    /tmp/\.X11-unix/.*              biba/equal,mls/equal
    /proc(/.*)?                     biba/equal,mls/equal
    /mnt.*                          biba/low,mls/low
    (/usr)?/home                    biba/high(low),mls/high(low)
    (/usr)?/home/.*                 biba/low,mls/low
    /var/mail(/.*)?                 biba/low,mls/low
    /var/spool/mqueue(/.*)?         biba/low,mls/low
    (/mnt)?/cdrom(/.*)?             biba/high,mls/high
    (/usr)?/home/(ftp|samba)(/.*)?  biba/high,mls/high
    /var/log/sendmail\.st           biba/low,mls/low
    /var/run/utmp                   biba/equal,mls/equal
    /var/log/(lastlog|wtmp)         biba/equal,mls/equal

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

Он может быть внесен в систему следующими командами:

    # setfsmac -ef /etc/policy.contexts /
    # setfsmac -ef /etc/policy.contexts /usr

> Замечание: Раскладка вышеприведенной файловой системы может быть различной для разных систем.

Файл `/etc/mac.conf` требует следующих изменений в основном разделе:

    default_labels file ?biba,?mls
    default_labels ifnet ?biba,?mls
    default_labels process ?biba,?mls,?partition
    default_labels socket ?biba,?mls

## 16.14.5. Тестирование настройки

Добавьте пользователя с помощью команды `adduser` и поместите его в класс `insecure` для этих тестов.

В примерах ниже тестирование `root` и обычных пользователей будет смешиваться; форма приглашения поможет различить этих пользователей.

### 16.14.5.1. Основное тестирование меток

    % getpmac
    biba/15(15-15),mls/15(15-15),partition/15
    # setpmac partition/15,mls/equal top

> Замечание: Процесс top будет уничтожен перед тем, как мы запустим другой процесс top.

### 16.14.5.2. Тестирование MAC seeotheruids

    % ps Zax
    biba/15(15-15),mls/15(15-15),partition/15  1096 #C:  S      0:00.03 -su (bash)
    biba/15(15-15),mls/15(15-15),partition/15  1101 #C:  R+     0:00.01 ps Zax

Просмотр процессов всех других пользователей должен быть запрещен.

### 16.14.5.3. Тестирование MAC partition

Отключите политику MAC `seeotheruids` для остальных тестов:

    # sysctl security.mac.seeotheruids.enabled=0
    % ps Zax
    LABEL                                                   PID  TT  STAT      TIME COMMAND
      biba/equal(low-high),mls/equal(low-high),partition/15  1122 #C:  S+     0:00.02 top
      biba/15(15-15),mls/15(15-15),partition/15              1096 #C:  S      0:00.05 -su (bash)
      biba/15(15-15),mls/15(15-15),partition/15              1123 #C:  R+     0:00.01 ps Zax

Все пользователи должны видеть каждый процесс в своем разделе (partition).

### 16.14.5.4. Тестирование меток Biba и MLS

    # setpmac partition/15,mls/equal,biba/high\(high-high\) top
    % ps Zax
    LABEL                                                   PID  TT  STAT    TIME   COMMAND
      biba/high(high-high),mls/equal(low-high),partition/15   1251 #C:  S+     0:00.02 top
      biba/15(15-15),mls/15(15-15),partition/15               1096 #C:  S      0:00.06 -su (bash)
      biba/15(15-15),mls/15(15-15),partition/15               1157 #C:  R+     0:00.00 ps Zax

Политика Biba позволяет чтение объектов с более высокими метками.

    # setpmac partition/15,mls/equal,biba/low top
    % ps Zax
    LABEL                                       PID  TT  STAT      TIME COMMAND
      biba/15(15-15),mls/15(15-15),partition/15  1096 #C:  S      0:00.07 -su (bash)
      biba/15(15-15),mls/15(15-15),partition/15  1226 #C:  R+     0:00.01 ps Zax

Политика Biba не позволяет чтение объектов с более низкими метками; тем не менее, MLS разрешает это.

    % ifconfig bge0 | grep maclabel
    maclabel biba/low(low-low),mls/low(low-low)
    % ping -c 1 192.0.34.166
    PING 192.0.34.166 (192.0.34.166): 56 data bytes
    ping: sendto: Permission denied

Пользователи не могут выполнить ping на `example.com`, или на любой домен по этой причине.

Для устранения этой ошибки, запустите следующую команду:

    # sysctl security.mac.biba.trust_all_interfaces=1

Она устанавливает метку интерфейса по умолчанию в незащищенный режим, так что политика Biba по умолчанию не будет применена.

    # ifconfig bge0 maclabel biba/equal\(low-high\),mls/equal\(low-high\)
    % ping -c 1 192.0.34.166
    PING 192.0.34.166 (192.0.34.166): 56 data bytes
    64 bytes from 192.0.34.166: icmp_seq=0 ttl=50 time=204.455 ms
    --- 192.0.34.166 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 204.455/204.455/204.455/0.000 ms

Установив более корректную метку, мы можем использовать `ping`.

Теперь создадим файлы для процедуры тестирования чтения и записи:

    # touch test1 test2 test3 test4 test5
    # getfmac test1
    test1: biba/equal,mls/equal
    # setfmac biba/low test1 test2; setfmac biba/high test4 test5; \
      setfmac mls/low test1 test3; setfmac mls/high test2 test4
    # setfmac mls/equal,biba/equal test3 && getfmac test?
    test1: biba/low,mls/low
    test2: biba/low,mls/high
    test3: biba/equal,mls/equal
    test4: biba/high,mls/high
    test5: biba/high,mls/equal
    # chown testuser:testuser test?

Все эти файлы должны принадлежать пользователю `testuser`. Тесты на чтение:

    % ls
    test1   test2   test3   test4   test5
    % ls test?
    ls: test1: Permission denied
    ls: test2: Permission denied
    ls: test4: Permission denied
    test3   test5

Доступ на чтение не должен быть разрешен для пар: `(biba/low,mls/low)`, `(biba/low,mls/high)` и `(biba/high,mls/high)`. Теперь несколько тестов на запись:

    % for i in `echo test*`; do echo 1 > $i; done
    -su: test1: Permission denied
    -su: test4: Permission denied
    -su: test5: Permission denied

Подобно тестам на чтение, доступ на запись должен быть запрещен для пар: `(biba/low,mls/high)` и `(biba/equal,mls/equal)`.

    % cat test?
    cat: test1: Permission denied
    cat: test2: Permission denied
    1
    cat: test4: Permission denied

А теперь от `root`:

    # cat test2
    1

Пред. | Начало | След.
Модуль MAC LOMAC | Уровень выше | Другой пример: Использование MAC для защиты веб сервера

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.