Профиль Apparmor с Postgresql, супервизором и Docker - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь настроить профиль Apparmor для контейнера Docker, в котором Supervisord управляет Postgres и службами Cron.

Мой профиль Apparmor выглядит следующим образом:

# Author: Felix Geyer <debfx@ubuntu.com>
# Source: https://gitlab.com/apparmor/apparmor-profiles/blob/master/ubuntu/18.04/usr.lib.postgresql.bin.postgres

#include <tunables/global>

profile docker-postgres flags=(attach_disconnected,mediate_deleted) {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/ssl_keys>

  /etc/postgresql/** r,
  /usr/share/postgresql/** r,
  /var/lib/postgresql/** rwl,
  /var/log/cron/** rwl,
  /tmp/** rwl,
  /supervisord.pid rwl,
  /supervisord.log rwl,
  /backups rwl,
  /{,var/}run/postgresql/** rw,

  owner @{PROC}/[0-9]*/oom_adj rw,
}

У меня много томов, потому что я сделал файловую систему root только для чтения. Таким образом, мой docker -компонентный файл выглядит так:

db:
    restart: always
    container_name: db
    build: ./postgres
    env_file:
      - database.env

    ports:
      - "127.0.0.1:5432:5432"
    volumes:
      - ./logs/postgres:/var/lib/postgresql/data/log
      - ./logs/cron:/var/log/cron
      - pgdata:/var/lib/postgresql/data
      - ./postgres/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf
      - ./postgres/postgresql.conf:/var/lib/postgresql/data/postgresql.conf
      - ./postgres/tmp:/tmp
      - ./postgres/run:/run/postgresql
      - ./postgres/var/run:/var/run/postgresql
      - ./postgres/supervisord/supervisord.pid:/supervisord.pid
      - ./postgres/supervisord/supervisord.log:/supervisord.log
      - ./backups:/backups

    [Some resources limitations, e.g., cpushares, mem_limit, etc...]
    read_only: true

    security_opt:
      - apparmor=docker-postgres

Файл Docker postgres выглядит следующим образом:

FROM postgres:alpine

LABEL version="1.7.1"

RUN apk update
RUN apk upgrade
RUN apk add --no-cache logrotate
RUN apk add --no-cache supervisor
RUN mkdir /etc/supervisor.d

COPY supervisord.conf /etc/supervisord.conf

COPY db_backup.sh /

COPY crontab.conf /

RUN chown postgres:postgres /db_backup.sh
RUN chown postgres:postgres /crontab.conf
RUN chmod 0755 /db_backup.sh
RUN chmod 0755 /crontab.conf

RUN chmod +x /db_backup.sh

RUN crontab /crontab.conf

USER postgres

RUN chmod 0700 /var/lib/postgresql/data

ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

Когда я запускаю контейнер, Apparmor сообщает что некоторые файлы в именованном томе с именем pgdata не могут быть открыты из-за отклоненного разрешения:

[  480.603052] audit: type=1400 audit(1583923769.274:96): apparmor="DENIED" operation="open" profile="docker-postgres" name="/var/lib/docker/overlay2/62c3068f214a9f5e7681eb663bfa7542c8571143e21ae8b8f4b2117e9b7db2d3/diff/usr/lib/python3.8/lib-dynload/" pid=6671 comm="supervisord" requested_mask="r" denied_mask="r" fsuid=0 ouid=0

Docker -compose сообщает о следующей ошибке:

db exited with code 1
db                | Python path configuration:
db                |   PYTHONHOME = (not set)
db                |   PYTHONPATH = (not set)
db                |   program name = '/usr/bin/python3'
db                |   isolated = 0
db                |   environment = 1
db                |   user site = 1
db                |   import site = 1
db                |   sys._base_executable = '/usr/bin/python3'
db                |   sys.base_prefix = '/usr'
db                |   sys.base_exec_prefix = '/usr'
db                |   sys.executable = '/usr/bin/python3'
db                |   sys.prefix = '/usr'
db                |   sys.exec_prefix = '/usr'
db                |   sys.path = [
db                |     '/usr/lib/python38.zip',
db                |     '/usr/lib/python3.8',
db                |     '/usr/lib/python3.8/lib-dynload',
db                |   ]
db                | Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
db                | Python runtime state: core initialized
db                | ModuleNotFoundError: No module named 'encodings'
db                | 
db                | Current thread 0x00007f35c9fcdd48 (most recent call first):
db                | <no Python frame>

Если я Я не ошибаюсь, операция запрещена - это открытие библиотеки Python, которая находится в моем именованном томе pgdata. Как я могу разрешить своему контейнеру получать доступ к файлам в этом каталоге через профиль apparmor? Я пытался использовать том хоста, но он не работает.

Я уже пытался сделать следующее:

allow /usr/lib/python[0-9.]* rwl,
allow /usr/bin/python[0-9.]* rwl,
allow /usr/lib/python[0-9.]*/** rwl,
allow /usr/bin/python[0-9.]*/** rwl

, но это не работает .. .

1 Ответ

0 голосов
/ 23 марта 2020

Наконец, я исправил проблему, добавив это в свой профиль apparmor для контейнера:

/var/lib/docker/overlay2/[a-zA-Z0-9]*/diff/usr/lib/python3.8/ r,

...