Загрузка настроек приложения Django в профиль apparmor

Итак, у нас есть приложение django, которому требуется профиль apparmor (клиентский мандат). Он работает в виртуальной среде Python, расположенной в /opt/fact-virtual-environment. Само приложение устанавливается в /usr/share/fact

Ниже приведен мой профиль (построенный в основном с помощью инструмента aa-genprof):

# Last Modified: Tue Jan 20 09:25:09 2015
#include <tunables/global>

/usr/bin/fact flags=(audit) {
  #include <abstractions/apache2-common>
  #include <abstractions/base>
  #include <abstractions/bash>


  capability setgid,
  capability sys_resource,

  /usr/local/lib/python2.7/dist-packages/**/ rm,
  /usr/local/lib/python2.7/dist-packages/** rm,
  /usr/local/lib/python2.7/site-packages/**/ rm,
  /usr/local/lib/python2.7/site-packages/** rm,
  /etc/apparmor.d/** r,
  #/usr/lib/python2.7/**[^/] r,

  /usr/bin/sudo Ux,

  #/usr/bin/strace ux,
  /bin/bash rix,
  /bin/dash rix,
  /bin/uname rix,
  /dev/tty rw,
  /etc/default/locale r,
  #/etc/nsswitch.conf r,
  #/etc/group r,
  #/etc/passwd r,
  /etc/environment r,
  /etc/login.defs r,
  /etc/lsb-release r,
  /etc/fact/fact.ini r,
  /etc/python2.7/sitecustomize.py r,
  /etc/security/pam_env.conf r,
  /lib{,32,64}/** mr,
  /opt/fact-virtual-environment/**/ mr,
  /opt/fact-virtual-environment/lib/python2.7/**/ mr,
  /opt/fact-virtual-environment/lib/python2.7/** mr,
  /opt/fact-virtual-environment/bin/python rix,
  /run/utmp rk,
  /sbin/ldconfig rix,
  /sbin/ldconfig.real rix,
  /usr/bin/fact rix,
  /usr/lib{,32,64}/** mr,
  /usr/share/fact/**/ r,
  /usr/share/fact/** r,
  /usr/share/pyshared/** r,
  /usr/share/pyshared/**/ r,
}

... а команда /usr/bin/fact представляет собой простую оболочку:

#!/bin/bash

## This script is for running the 'fact' command on staging/prod, it sudos to
## the 'fact' user before executing /opt/fact/bin/fact

## It is installed as '/usr/bin/fact'

PYTHONPATH=/usr/share/fact
PYTHON_BIN=/opt/fact-virtual-environment/bin/python
DJANGO_SETTINGS_MODULE=fact.settings.staging

if [ "$USER" != "fact" ];
then
  sudo -u fact $0 $*;
else
  PYTHONPATH=${PYTHONPATH} DJANGO_SETTINGS_MODULE=${DJANGO_SETTINGS_MODULE}  ${PYTHON_BIN} -m fact.managecommand $*;
fi

Я включил много разрешений на чтение, которые, как я знаю, мне не нужны, например, весь набор /usr/local/lib/* при попытке отладки. Что-то, что меня очень не устраивает во всем этом, это то, что мои профили, кажется, не перезагружаются, когда я запускаю service apparmor reload (или перезапускаю). Кажется, я получаю разные результаты, если перезапускаю службу по сравнению с aa-complain usr.bin.fact, за которой следует aa-enforce usr.bin.fact.

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

Feb 11 15:08:48 spiffy kernel: [1228245.774660] type=1400 audit(1423620528.359:14142): apparmor="DENIED" operation="open" parent=12884 profile="/usr/bin/fact" name="/usr/local/lib/python2.7/site-packages/" pid=12885 comm="python" requested_mask="r" denied_mask="r" fsuid=111 ouid=0
Feb 11 15:08:48 spiffy kernel: [1228245.774855] type=1400 audit(1423620528.359:14143): apparmor="DENIED" operation="open" parent=12884 profile="/usr/bin/fact" name="/usr/local/lib/python2.7/dist-packages/" pid=12885 comm="python" requested_mask="r" denied_mask="r" fsuid=111 ouid=0
Feb 11 15:08:48 spiffy kernel: [1228245.775829] type=1400 audit(1423620528.359:14144): apparmor="DENIED" operation="open" parent=12884 profile="/usr/bin/fact" name="/usr/local/lib/python2.7/dist-packages/" pid=12885 comm="python" requested_mask="r" denied_mask="r" fsuid=111 ouid=0

..и мое приложение python barfs:

$ fact
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/share/fact/fact/managecommand.py", line 6, in <module>
    execute_from_command_line(sys.argv)
  File "/opt/fact-virtual-environment/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/opt/fact-virtual-environment/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
    settings.INSTALLED_APPS
  File "/opt/fact-virtual-environment/local/lib/python2.7/site-packages/django/conf/__init__.py", line 46, in __getattr__
    self._setup(name)
  File "/opt/fact-virtual-environment/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
    self._wrapped = Settings(settings_module)
  File "/opt/fact-virtual-environment/local/lib/python2.7/site-packages/django/conf/__init__.py", line 98, in __init__
    % (self.SETTINGS_MODULE, e)
ImportError: Could not import settings 'fact.settings.staging' (Is it on sys.path? Is there an import error in the settings file?): cannot import name current_app

Этот файл настроек, который он ищет, находится по адресу /usr/share/fact/fact/settings/staging.py.

Я совершенно не понимаю, почему я не могу заставить это приложение работать под своим профилем apparmor. Настройки в конфигурационном файле должны это разрешать. В чем дело?


person djsumdog    schedule 11.02.2015    source источник


Ответы (2)


Все отказы ищут этот конкретный каталог: /usr/local/lib/python2.7/dist-packages/

В вашем профиле есть несколько дочерних элементов этого каталога:

/usr/local/lib/python2.7/dist-packages/**/ rm,
/usr/local/lib/python2.7/dist-packages/** rm,
/usr/local/lib/python2.7/site-packages/**/ rm,
/usr/local/lib/python2.7/site-packages/** rm,

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

/usr/local/lib/python2.7/dist-packages/ r,

AppArmor использует конечный /, чтобы определить, намеревался ли администратор разрешить получение списков каталогов или разрешить чтение файла.

Спасибо

person sarnold    schedule 11.02.2015

в вашем профиле отсутствуют права на чтение каталога /usr/local/lib/python2.7/site-packages/

вам нужно будет добавить /usr/local/lib/python2.7/site-packages/r,

разрешения вашего текущего профиля разрешают доступ ко всему в /usr/local/lib/python2.7/site-packages/, но не к самому каталогу

person John Johansen    schedule 11.02.2015