AppArmor

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:32, 17 января 2019.
AppArmor
AppArmor logo.png
Создатели: Immunix
Разработчики: SUSE
Выпущена: 1998; 21 years ago (1998)
Постоянный выпуск: 2.13.0 / 15 April 2018 года; 16 months ago (2018-04-15)
Предыдущий выпуск: 2.12.0
Написана на: C, Perl, C++
Операционная система: Linux
Тип ПО: Системное ПО
Лицензия: GNU General Public Licence
Веб-сайт gitlab.com/apparmor

AppArmor ("Application Armor") — это модуль безопасности ядра Linux, который позволяет ограничивать возможности программ с помощью их индивидуальных профилей. Профили могут предоставлять или запрещать программам доступ к сети, к "сырым" сокетам, разрешение на чтение, запись или исполнение файлов по конкретным путям. AppArmor дополняет традиционную модель дискреционного доступа Unix (англ. discretionary access control, DAC), предоставляя мандатное управление доступом (англ. mandatory access control, MAC). Включен в ядро Linux с версии 2.6.36.

Обзор

AppArmor - это система безопасности Linux, основанная на мандатном управлении доступом. AppArmor ограничивает отдельные программы набором файлов, возможностями, доступом к сети. Такие ограничения называются политикой AppArmor для программы или просто профилем. AppArmor дополняет дискреционную модель доступа Unix: если доступ был разрешен системой, окончательное решение остается за AppArmor, который сверяет разрешения со своей политикой управления и доступа. AppArmor поддерживает режим обучения профиля, который помогает пользователям писать и обновлять политики безопасности. Режим обучения позволяет создать и настроить профиль на примере запущенной программы. После полного обучения происходит переход в режим принудительного исполнения. Хотя результат создания такого профиля может быть более "мякгим", чем полностью ручная настройка для конкретного окружения и приложения, режим обучения требует значительно меньше усилий и знаний, необходимых для использования AppArmor.

История

  • Первоначально разработкой AppArmor занималась компания Immunix. Затем Immunix была приобретена компанией Novell, и AppArmor был открыт под лицензией GNU GPL, а также включен в openSUSE.[Источник 1]
  • Выпущен AppArmor 2.0.1, основанный на коде SubDomain 2.0.
  • Выпущен AppArmor 2.1.
  • В октябре 2007 года Novell уволил большую часть команды разработчиков, работавшей над AppArmor, и переназначил остальных разработчиков, переведя AppArmor в режим разработки.
  • В июне 2008 Novell выпускает AppArmor 2.3 с использованием другой итерации патчей vfs и расширения к соответствующему движку.
  • В мае 2009 Canonical Inc. берет на себя обслуживание и разработку AppArmor.
  • Выпущен AppArmor 2.4, основанный на большом обновлении ядра в AppArmor 2.3.
  • В июле 2010 г. модуль безопасности AppArmor слился с деревом security-next. Основные функции появились в официальном ядре Linux 2.6.36. Для работы с текущим пользовательским пространством требуется несколько небольших исправлений совместимости.[Источник 2]
  • В мае 2013 года поддержка инструмента была внедрена в Debian 7 Wheezy.[Источник 3]

Дистрибутивы с AppArmor

Список дистрибутивов, в которые уже включен модуль AppArmor[Источник 4]:

Установка AppArmor

AppArmor состоит из нескольких частей:

binutils/ - источник основных утилит, написанных на компилируемых языках

changehat/ - источник для использования changehat для Apache, PAM и Tomcat

common/ - общие правила makefile

desktop/ - пустой

kernel-patches/ - патчи совместимости для различных версий ядра

libraries/ - источник libapparmor

parser/ - источник для парсера/загрузчика и соответствующей документации

profiles/ - файлы конфигурации, справочные профили и абстракции

tests/ - откат и стресс-тесты

utils/ - высокоуровневые утилиты для работы с AppArmor

Для завершения сборки некоторым системам может потребоваться экспортировать различные переменные среды python. Например, прежде чем собрать что-либо на этих системах, используйте что-то вроде:

$ export PYTHONPATH=$(realpath libraries/libapparmor/swig/python)
$ export PYTHON=/usr/bin/python3
$ export PYTHON_VERSION=3
$ export PYTHON_VERSIONS=python3

Для сборки и установки пространства пользователя AppArmor в систему необходимо произвести действия в следующем порядке.

Установка libapparmor:

$ cd ./libraries/libapparmor
$ sh ./autogen.sh
$ sh ./configure --prefix=/usr --with-perl --with-python # see below
$ make
$ make check
$ make install

--with-ruby - дополнительный аргумент при настройке libapparmor. Используется для привязки Ruby к libapparmor.

Бинарные утилиты:

$ cd binutils
$ make
$ make check
$ make install

Парсер:

$ cd parser
$ make		# depends on libapparmor having been built first
$ make check
$ make install

Утилиты:

$ cd utils
$ make
$ make check
$ make install

Apache mod_apparmor:

$ cd changehat/mod_apparmor
$ make		# зависит от libapparmor, установленной в начале
$ make install

PAM AppArmor:

$ cd changehat/pam_apparmor
$ make		# зависит от libapparmor, установленной в начале
$ make install

Профили:

$ cd profiles
$ make
$ make check	# depends on the parser having been built first
$ make install

Профили

Профили AppArmor - это простые текстовые файлы, которые расположены в /etc/apparmor.d/. Файлы профиля называются соответственно полному пути до исполняемого файла, которым они управляют, с заменой символа «/» на «.». Например /etc/apparmor.d/bin.ping - это профиль AppArmor для команды /bin/ping.

Профили AppArmor имеют два режима выполнения[Источник 5]:

  1. Жалоб/Обучения (Complaining/Learning): нарушения профиля разрешаются и сохраняются в журнале. Полезно для тестирования и разработки новых профилей.
  2. Принудительный/Ограниченный (Enforced/Confined): принуждает следовать политике профиля, при этом также записывает нарушения в журнал.

Существует два основных типа правил, используемых в профиле:

  1. Записи путей (Path entries): которые описывают к каким файлам приложение имеет доступ в файловой системе.
  2. Записи разрешений (Capability entries): определяют какие права ограничиваемый процесс имеет право использовать.

В качестве примера можно рассмотреть /etc/apparmor.d/bin.ping:

 1  #include <tunables/global>
 2  /bin/ping flags=(complain) {
 3    #include <abstractions/base>
 4    #include <abstractions/consoles>
 5    #include <abstractions/nameservice>
 6 
 7    capability net_raw,
 8    capability setuid,
 9    network inet raw,
10  
11    /bin/ping mixr,
12    /etc/modules.conf r,
13 }
  1. #include <tunables/global>: включает операторы из других файлов. Это позволяет операторам, относящимся к нескольким приложениям находится в одном общем файле.
  2. /bin/ping flags=(complain): путь к программе, управляемой профилем, также устанавливающий режим обучения.
  3. capability net_raw,: разрешает приложению доступ к возможностям CAP_NET_RAW Posix.1e.
  4. /bin/ping mixr,: разрешает приложению доступ на чтение и выполнение файла.

После редактирования профиля он должен быть перезагружен.

Создание профиля

  1. Разработка плана тестирования. План тестирования стоит разделить на маленькие тестовые блоки. Каждый тестовый блок должен иметь краткое описание и перечень шагов выполнения. Некоторые стандартные тестовые блоки:
    1. Запуск программы.
    2. Остановка программы.
    3. Перезагрузка программы.
    4. Тестирование всех команд, поддерживаемых сценарием инициализации.
  2. Создание нового профиля: Используйте aa-genprof для создания нового профиля. Команда в терминале:
    $ sudo aa-genprof executable 
  3. Чтобы получить ваш новый профиль в составе пакета apparmor-profiles, зарегистрируйте проблему в Launchpad для пакета AppArmor.
    1. Включите ваш план тестирования и тестовые блоки.
    2. Присоедините ваш новый профиль к зарегистрированной проблеме.

Обновление профилей

Когда программа ведет себя неправильно, проанализируйте сообщения, отправленные в файлы журналов. Программа aa-logprof может быть использована для сканирования файлов журнала AppArmor для проверки сообщений, их рассмотрения (анализа) и обновления профилей. Команда в терминале:

$ sudo aa-logprof 

AppArmor руководствуется принципом "запрещено все, что не разрешено", поэтому, когда в профиле нет никакого соответствующего правила, действие не разрешается.

Язык AppArmor

Язык написания профилей

Код профиля начинается с его названия, затем идет опциональный флаг, потом открывается фигурная скобка {, внутри которой записаны правила данного профиля, в конце фигурная скобка закрывается }. Если название правила начинается не с /, то перед ним должно находиться ключевое слово profile.[Источник 6] Например:

 1  /usr/bin/firefox {
 2     # содержание профиля
 3  }
 4 
 5  /usr/bin/firefox flags=(complain) {
 6     # содержание профиля
 7  }
 8 
 9  profile /usr/bin/ {
10     # содержание профиля
11  }
12 
13  profile user1 {
14     # содержание профиля
15  }

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

Комментарии

Комментарии пишутся в одну строчку и начинаются со знака решетки #. После символа # текст игнорируется до конца строки (кроме директивы #include). Например:

1  #  Комментарий 1
2  #  Комментарий 2
3 
4  profile example {  # комментарий 3
5     # комментарий 4
6     /home/foo rw,  # комментарий в конце правила
7  }

Включение профилей

Файлы политик могут включать в себя другие файлы для использования их правил. AppArmor использует стиль языка C. Строка включения одного файла в другой начинается с директивы #include, затем следует название файла либо в " ", если включаемый файл находится в одном каталоге с текущим, либо в < > в остальных случаях.

Возможен конфликт директивы #include с комментариями в коде. # и слово include не должны быть разделены, иначе строка будет считаться комментарием и будет проигнорирована.

1  # include - это комментарий
2  #include <file>

Подпрофили

Профили могут содержать подпрофили. Они могут быть использованы для того, чтобы ограничить программу особым образом, или для того, чтобы дочерний профиль в общем случае не был ограничен в системе, но ограничивался при вызове из родительского профиля. Например:

 1  /parent/profile {
 2      /path/to/child1 cx -> child1,
 3      /path/to/child2 cx,
 4      /path/to/* cx,           # for * matching child3 will transition to child3,
 5                               # child4, child5, ... will transition to /path/to/child*
 6                               # if matching child profile does not exist will fail
 7      /another/path/to/* cx -> child1,        # send all matching execs to child1
 8      profile child1 {
 9      }
10      profile /path/to/child2 {
11      }
12      profile /path/to/child3 {
13      }
14      # generic fall back profile
15      profile /path/to/child* {
16      }
17  }

Сетевые правила

AppArmor в настоящий момент поддерживает доступ к сети через сетевые правила. Например, сетевой службе может понадобиться:

1  /profile {
2    network inet dgram,
3    network inet stream,
4  }

Или анализатору пакетов:

1  /profile {
2    network raw,
3    network packet,
4  }

Файловые правила

Файловые правила контролируют доступ к файлам и появляются только в профилях. Они состоят из имени файла, набора разрешений и оканчиваются запятой. В начале может быть написано как разрешение, так и имя файла. Допустимое имя файла всегда начинается с /. Например:

1  /profile {
2     /path/to/file  rw,   # файловое правило, начинающееся с пути к файлу
3     rw /path/to/file2,   # файловое правило, начинающееся с права доступа
4     /path/to/file3       # файловое правило разделено на несколько строк
5          rw,
6  }

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

Выбор нескольких файлов

AppArmor используется специальный синтaксис, похожий на тот, что используется в командной строке bash. Он не полностью совпадает с синтаксисом регулярных выражений, вместо них используются специальные символы, называемые подстановочными. Подстановочные символы AppArmor выглядят немного не так, как в bash.

  • * - соответствует нулю или большему количеству любых символов на уровне каталога, за исключением символа /.
  • ** - соответствует нулю или большему количеству любых символов на нескольких уровнях каталогов.
  •  ? - соответствует единичному символу, кроме /
  • {} - список альтернативных строк, которые также могут подойти. Допустима пустая строка, и в таком случае это значит, что она является допустимой альтернативой.
  • [] - класс символов
  • [^] - инвертированный класс символов

Пример выбора нескольких файлов:

/dir/file - выбрать конкретный файл

/dir/* - выбрать любой файл в каталоге, в том числе из тех, что начинаются с точки

/dir/a* - выбрать любой в каталоге, начинающийся с 'a'

/dir/*.png - выбрать любой файл в каталоге, оканчивающийся '.png'

/dir/[^.]* - выбрать любой файл в каталоге, исключая те, что начинаются с точки

/dir/ - выбрать каталог

/dir/*/ - выбрать любой каталог внутри /dir/

/dir/a*/ - выбрать любой каталог внутри /dir/ начинающийся с 'a'

/dir/*a/ - выбрать любой каталог внутри /dir/ оканчивающийся на 'a'

/dir/** - выбрать любой файл или каталог в или в подкаталоге /dir/

/dir/**/ - выбрать любой каталог в или в подкаталоге /dir/

/dir/**[^/] - выбрать любой файл в или в подкаталоге /dir/

/dir{,1,2}/** - выбрать любой файл или каталог в или в подкаталогах /dir/, /dir1/, and /dir2/

Права доступа

Доступны следующие права:

  • r - чтение
  • w - запись
  • a - добавление
  • x - выполнение
  • m - отображение файла в память
  • k - блокировка (требуется право чтения или записи, AppArmor 2.1 или более поздний)
  • l - ссылка

Ключевое слово owner может использоваться в качестве квалификатора разрешения при условии владения файлом.

1  owner /foo rw,

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

  • создание (предусмотренное в праве записи)
  • удаление (предусмотренное в праве записи)
  • chown - изменить владение (предусмотренное в праве записи)
  • chmod - изменить режим (предусмотренное в праве записи)

Права на выполнение

Основные права на выполнение:

  • ix - новый процесс должен быть запущен под текущим профилем
  • cx - новый процесс должен быть запущен под дочерним профилем, который совпадает с именем исполняемого файла
  • px - новый процесс должен быть запущен под другим профилем, который совпадает с именем исполняемого файла
  • ux - новый процесс должен быть запущен без ограничений

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

Разрешения Px, Cx и Ux, написанные с заглавных букв, вызовут безопасное выполнение libc. При разработке профилей в основном должны использоваться варианты безопасного выполнения для того, чтобы запускать программы в чистой среде.

Права px и cx (а также их безопасные варианты) также могут иметь окончания ix или ux, то есть выглядеть как pix, pux, cix или cux. Такие права означают, что процесс должен выполняться под соответствующим профилем, если он существует. Часто используют право доступа PUx вместо Ux, чтобы не изменять профиль для исполняемого файла в случае, если профиль для соответствующей программы будет добавлен позже.

Например, если разрешенная программа должна выполнить "evidence", то разрешение в профиле может выглядеть следующим образом:

1  /usr/bin/evince PUx,

Правила px и cx (и все их варианты) также могут быть изменены для указания профиля по имени вместо использования профиля, соответствующего имени исполняемого файла. Это делается путем предоставления -> ("стрелки перехода") и имени профиля.

1  /foo px -> profile1,

Использование AppArmor

Пакет apparmor-utils содержит утилиты командной строки, которые можно использовать для изменения режима выполнения AppArmor, поиска статуса профиля, создания новых профилей и т.п.[Источник 7]

  1. apparmor_status используется для просмотра текущего статуса профиля AppArmor:
    $ sudo apparmor_status 
  2. aa-complain переводит профиль в режим обучения (complain):
    $ sudo aa-complain /path/to/bin 
  3. aa-enforce переводит профиль в режим ограничений (enforce):
    $ sudo aa-enforce /path/to/bin 
  4. Профили AppArmor расположены в каталоге /etc/apparmor.d. Его можно использовать для управления режимом всех профилей. Введите следующую команду для перевода всех профилей в режим обучения:
    $ sudo aa-complain /etc/apparmor.d/* 
    Перевод всех профилей в режим ограничений:
    $ sudo aa-enforce /etc/apparmor.d/* 
  5. Команда apparmor_parser используется для загрузки профиля в ядро. Она также может использоваться для повторной загрузки загруженного профиля при использовании опции '-r'. Для загрузки введите:
    $ cat /etc/apparmor.d/profile.name | sudo apparmor_parser -a 
    Для перезагрузки:
    $ cat /etc/apparmor.d/profile.name | sudo apparmor_parser -r 
  6. /etc/init.d/apparmor служит для перезагрузки всех профилей:
    $ sudo /etc/init.d/apparmor reload 
  7. Директория /etc/apparmor.d/disable может использоваться совместно с опцией apparmor_parser -R для отключения профиля:
    $ sudo ln -s /etc/apparmor.d/profile.name /etc/apparmor.d/disable/ 
    $ sudo apparmor_parser -R /etc/apparmor.d/profile.name 
  8. Для активации отключенного профиля удалите символическую ссылку на профиль в /etc/apparmor.d/disable/. Затем загрузите профиль используя опцию '-a':
    $ sudo rm /etc/apparmor.d/disable/profile.name 
    $ cat /etc/apparmor.d/profile.name | sudo apparmor_parser -a 
  9. AppArmor можно отключить, а модуль ядра выгрузить следующей командой:
    $ sudo /etc/init.d/apparmor stop 
    $ sudo update-rc.d -f apparmor remove 
  10. Для повторной активации AppArmor введите:
    $ sudo /etc/init.d/apparmor start 
    $ sudo update-rc.d apparmor defaults 

Высокоуровневое представление

Утилита aa-status дает высокоуровневое представление о статусе AppArmor и приложений, для которых имеются профили:[Источник 8]

# aa-status 
apparmor module is loaded.
11 profiles are loaded.
11 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /usr/share/gdm/guest-session/Xsession
   /usr/bin/googleearth
   /usr/bin/evince-previewer
   /usr/sbin/tcpdump
   /usr/lib/cups/backend/cups-pdf
   /usr/bin/evince-thumbnailer
   /sbin/dhclient3
   /usr/bin/evince
   /usr/sbin/cupsd
   /usr/lib/NetworkManager/nm-dhcp-client.action
0 profiles are in complain mode.
2 processes have profiles defined.
2 processes are in enforce mode :
   /usr/sbin/cupsd (1192) 
   /sbin/dhclient3 (22378) 
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.

Информация о запущенных процессах

Чтобы узнать, на какие процессы наложены ограничения, можно использовать утилиту aa-status, как написано выше, или использовать команду ps (под root):

# ps aux -Z | grep -v unconfined
LABEL              USER   PID %CPU %MEM    VSZ   RSS TTY STAT START   TIME COMMAND
/usr/sbin/cupsd    root  1192  0.0  0.0  75148  1260 ?   Ss   Jan15   0:00 /usr/sbin/c...
/sbin/dhclient3    root 22378  0.0  0.0   6464  1088 ?   S    Jan23   0:00 /sbin/dhcli...

Исходные данные также доступны через /proc (под root):

# grep -L unconfined /proc/*/attr/current
/proc/1192/attr/current
/proc/22378/attr/current

Утилита aa-unconfined может также указать, какие сетевые сервисы ограничены или неограничены (под root):

# aa-unconfined 
883 /usr/sbin/avahi-daemon not confined
883 /usr/sbin/avahi-daemon not confined
1192 /usr/sbin/cupsd confined by '/usr/sbin/cupsd (enforce)'
12375 /usr/sbin/pdns_recursor not confined
12375 /usr/sbin/pdns_recursor not confined
22378 /sbin/dhclient3 (/sbin/dhclient) confined by '/sbin/dhclient3 (enforce)'
27260 /usr/sbin/dictd (dictd 1.11.1: 1/275) not confined

Информация из модуля ядра

AppArmor поддерживает стандартный для ядра механизм securityfs. Он обычно смонтирован в /sys/kernel/security, и модуль apparmor помещает в /sys/kernel/security/apparmor несколько контролирующих и информационных файлов. Информационные файлы:

$ ls -1 /sys/kernel/security/apparmor/
features
matching
profiles

'features' и 'matching' предоставляют информацию о функциях и версиях, которая используется apparmior_parser для компиляции профилей для работающего ядра. 'profiles' предоставляет список профилей, загруженных в ядро, а также информацию о каждом профиле в enabled/complain/audit.

Информация из постоянных файлов конфигурации

Для того, чтобы проверить содержание профиля, можно сделать следующее:

# apparmor_parser -Q --debug /etc/apparmor.d/usr.bin.firefox | head -10
----- Debugging built structures -----
Name:       /usr/lib/firefox-4.0b7/firefox{,*[^s][^h]}
Profile Mode:   Enforce
Capabilities: net_bind_service
--- Entries ---
Mode:   r:r Name:   (/)
Mode:   r:r Name:   (/**/)
Mode:   rx:rx   Name:   (/bin/bash)
Mode:   rx:rx   Name:   (/bin/dash)
Mode:   rx:rx   Name:   (/bin/grep)

Этот список показывает разрешения для ресурса.

Помимо этого можно полностью посмотреть профиль со всеми включенными абстракциями с помощью:

# apparmor_parser -p /etc/apparmor.d/usr.bin.firefox
...
##included <abstractions/audio>
/dev/admmidi*   rw,
/dev/adsp*      rw,
/dev/aload*     rw,
/dev/amidi*     rw,
/dev/audio*     rw,
/dev/dmfm*      rw,
...

Литература

Источники

  1. SDB:AppArmor — openSUSE Wiki // openSUSE. [2001—2019]. Дата обновления: 16.01.2011. URL: https://ru.opensuse.org/SDB:AppArmor (дата обращения 25.09.2018).
  2. AppArmor_History // GitLab [2011—2019]. Дата обновления: 04.08.2018. URL: https://gitlab.com/apparmor/apparmor/wikis/AppArmor_History (дата обращения: 17.01.2019).
  3. Компания SPI выпустила Debian 7 Wheezy // OSZone [2001—2019]. Дата обновления: 06.05.2013. URL: http://www.oszone.net/20860/Kompaniya_SPI_vipustila_Debian_Wheezy (дата обращения 25.09.2018).
  4. AppArmor Home Wiki // GitLab. [2011—2019]. Дата обновления: 21.12.2018. URL: https://gitlab.com/apparmor/apparmor/wikis/home/ (дата обращения: 17.01.2019).
  5. AppArmor // ubuntu documentation. Дата обновления: 26.02.2018. URL: https://help.ubuntu.com/lts/serverguide/apparmor.html.en (дата обращения 16.11.2018).
  6. AppArmor Profile Language // GitLab. [2011—2019]. Дата обновления: 04.11.2017. URL: https://gitlab.com/apparmor/apparmor/wikis/QuickProfileLanguage (дата обращения: 15.11.2018).
  7. AppArmor // ubuntu.ru. Дата обновления: 22.06.2012. URL: https://help.ubuntu.ru/wiki/руководство_по_ubuntu_server/безопасность/apparmor (дата обращения: 04.10.2018).
  8. AppArmor Monitoring // GitLab. [2011—2019]. Дата обновления: 04.11.2017. URL: https://gitlab.com/apparmor/apparmor/wikis/AppArmorMonitoring (дата обращения: 15.11.2018).