Наш коллега, инженер Rackspace, Major Hayden, также известный, как человек с самым прекрасным в мире резюме, объявил в своем блоге о выходе статьи, в которой он попытался просуммировать существующие подходы к обеспечению безопасности в контейнерах. Автор понимает, что три десятка страниц, это не тот объем, с которым можно претендовать на всеобъемлющее научное исследование, но как старт для более дотошных исследователей - вполне пойдет.

Читайте, присылайте критику.

Все больше и больше появляется материалов по systemd! Вот, на днях на известном ресурсе Хабрахабр появилась обучалочка по управлению журналированием в systemd:

Управление логгированием в systemd tutorial
Системное администрирование*, Блог компании Селектел
Systemd Journal

Демон инициализации systemd де-факто уже стал стандартом в современных Linux-системах. На него перешли многие популярные дистрибутивы: Debian, RHEL/CentOS, Ubuntu (начиная с версии 15.04). В systemd используется принципиально иной (по сравнению с традиционным инструментом syslog) подход к логгированию.
В его основе лежит централизация: специализированный компонент journal cобирает все системные сообщения (сообщения ядра, различных служб и приложений). При этом специально настраивать отправку логов не нужно: приложения могут просто писать в stdout и stderr, a journal сохранит эти сообщения автоматически. Работа в таком режиме возможна и с Upstart, но он сохраняет все логи в отдельный файл, тогда как systemd сохраняет их в бинарной базе, что существенно упрощает  систематизацию и поиск.

Хранение логов в бинарных файлах также позволяет избежать сложностей с использованием парсеров для разных видов логов. При необходимости логи можно без проблем переконвертировать в другие форматы (более подробно об этом будет рассказано ниже).
Journal может работать как совместно с syslog, так и полностью заменить его.
Для просмотра логов используется утилита journalctl. Об особенностях и тонкостях работы с ней мы расскажем в этой статье.


Установка времени



Одним из существенных недостатков syslog является сохранение записей без учёта часового пояса. В journal этот недостаток устранён: для логгируемых событий можно указывать как местное время, так и универсальное координированное время (UTC). Установка времени осуществляется с помощью утилиты timedatectl.
Просмотреть список часовых поясов можно при помощи команды:

$ timedatectl list-timezones


Установка нужного часового пояса осуществляется так:

$ timedatectl set-timezone <часовой пояс>

По завершении установки будет нелишним убедиться в том, что всё сделано правильно:

$ timedatectl status
Local time: Thu 2015-07-30 11:24:15 MSK
Universal time: Thu 2015-07-30 08:24:15 UTC
RTC time: Thu 2015-07-30 08:24:15
Time zone: Europe/Moscow (MSK, +0300)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a


В самой первой строке (Local time) должны быть показаны точное текущее время и дата.

Journalctl: просмотр логов



Для просмотра логов используется утилита journalctl.
Если ввести команду journalсtl без каких-либо аргументов, на консоль будет выведен огромный список:

-- Logs begin at Wed 2015-07-29 17:12:48 MSK, end at Thu 2015-07-30 11:24:15 MSK. --
Jul 29 17:12:48 host-10-13-37-10 systemd-journal[181]: Runtime journal is using 4.0M (max allowed 20.0M, trying to leave 30.0M free of 195.9M available → current limit 20.0M).
Jul 29 17:12:48 host-10-13-37-10 systemd-journal[181]: Runtime journal is using 4.0M (max allowed 20.0M, trying to leave 30.0M free of 195.9M available → current limit 20.0M).
Jul 29 17:12:48 host-10-13-37-10 kernel: Initializing cgroup subsys cpuset
Jul 29 17:12:48 host-10-13-37-10 kernel: Initializing cgroup subsys cpu
Jul 29 17:12:48 host-10-13-37-10 kernel: Initializing cgroup subsys cpuacct
Jul 29 17:12:48 host-10-13-37-10 kernel: Linux version 3.16.0-4-amd64 ([email protected]) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt11-1+deb8u2 (2015-07-17)
Jul 29 17:12:48 host-10-13-37-10 kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=b67ea972-1877-4c5b-a328-29fc0d6c7bc4 ro console=tty1 console=ttyS0 video=640x480 consoleblank=0 panic=15 c


Здесь мы привели лишь небольшой его фрагмент; на самом деле он включает гигантское количество записей.

Фильтрация логов



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

Просмотр логов с момента текущей загрузки



С помощью опции -b можно просмотреть все логи, собранные с момента последней загрузки системы:

$ journalctl -b


Просмотр логов предыдущих сессий



С помощью journalctl можно просматривать информацию о предыдущих сессиях работы в системе — в некоторых случаях это бывает полезным.
Следует, однако, учитывать, что сохранение информации о предыдущих сессиях поддерживается по умолчанию не во всех дистрибутивах Linux. Иногда его требуется активировать

Для этого нужно открыть конфигурационный файл journald.conf, найти в нём раздел [Journal] и изменить значение параметра storage на persistent:

$ sudo nano /etc/systemd/journald.conf
...
[Journal]
Storage=persistent


Просмотреть список предыдущих загрузок можно с помощью команды:

$ journalctl --list-boots

0 9346310348bc4edea250555dc046b30c Thu 2015-07-30 12:39:49 MSK—Thu 2015-07-30 12:39:59 MSK


Её вывод состоит из четырёх колонок. В первой из них указывается порядковый номер загрузки, во второй — её ID, в третьей — дата и время. Чтобы просмотреть лог для конкретной загрузки, можно использовать идентификаторы как из первой, так и из второй колонки:

$ journalctl -b 0


или

$ journalctl -b 9346310348bc4edea250555dc046b30c


Фильтрация по дате и времени



В journalctl имеется также возможность просмотра логов за определённые периоды времени. Для этого используются опции —since и —until. Предположим, нам нужно просмотреть логи начиная с 17 часов 15 минут 20 июля 2015 года. Для этого потребуется будет выполнить команду:
$ journalctl --since "2015-07-20 17:15:00"


Если с опцией since не будет указано никакой даты, на консоль будут выведены логи начиная с текущей даты. Если дата указана, но при этом не указано время, будет применено значений времени по умолчанию — «00:00:00». Секунды также указывать не обязательно (в этом случае применяется значение по умолчанию — 00).

Можно воспользоваться и вот такими человекопонятными конструкциями:

$ journalctl ---since yesterday
$ journalctl --since 09:00 --until now
$ journalctl --since 10:00 --until "1 hour ago"


Фильтрация по приложениям и службам



Для просмотра логов конкретного приложения или службы используется опция -u, например:

$ journalctl -u nginx.service


Приведённая команда выведет на консоль логи веб-сервера nginx.
Нередко возникает необходимость просмотреть логи какой-либо службы за определённый период времени. Это можно сделать при помощи команды вида:

$ journalctl -u nginx.service --since yesterday


C опцией -u также используется фильтрация по дате и времени, например:

$ journalctl -u nginx.service -u php-fpm.service —since today


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

Фильтрация по процессам, пользователям и группам



Просмотреть логи для какого-либо процесса можно, указав в команде journalctl его идентификационный номер (PID), например:
$ journalctl _PID=381


Для просмотра логов процессов, запущенных от имени определённого пользователя или группы, используются фильтры _UID и _GID соответственно. Предположим, у нас имеется веб-сервер, запущенный от имени пользователя www-data. Определим сначала ID этого пользователя:
$id -u www-data

33

Теперь можно просмотреть логи всех процессов, запущенных от имени этого пользователя:

$ journalctl _UID=33


Вывести на консоль список пользователей, о которых имеются записи в логах, можно так:

$ journalctl -F _UID


Для просмотра аналогичного списка пользовательских групп используется команда:

$ journalctl -F _GUID


С командной journalctl можно использовать и другие фильтры. Просмотреть список всех доступных фильтров можно, выполнив команду
$ man systemd.journal-fields


Фильтрация по пути



Просмотреть логи для какого-либо процесса также можно, указав путь к нему, например:

$ journalctl /usr/bin/docker


Иногда таким способом можно получить более подробную информацию (например, просмотреть записи для всех дочерних процессов).

Просмотр сообщений ядра



Для просмотра сообщений ядра используется опция -k или −−dmesg:

$ journalctl -k


Приведённая команда покажет все сообщения ядра для текущей загрузки. Чтобы просмотреть сообщения ядра для предыдущих сессий, нужно воспользоваться опцией -b и указать один из идентификаторов сессии (порядковый номер в списке или ID):

$ journalctl -k -b -2


Фильтрация сообщений по уровню ошибки



Во время диагностики и исправления неполадок в системе нередко требуется просмотреть логи и выяснить, есть ли в них сообщения о критических ошибках. Специально для этого в journalctl предусмотрена возможность фильтрации по уровню ошибки. Просмотреть сообщения обо всех ошибках, имевших место в системе, можно с помощью опции -p:

$ journalctl -p err -b


Приведённая команда покажет все сообщения об ошибках, имевших место в системе.

Эти сообщения можно фильтровать по уровню. В journal используется такая же классификация уровней ошибок, как и в syslog:

  • 0 — EMERG (система неработоспособна);
  • 1 — ALERT (требуется немедленное вмешательство);
  • 2 — CRIT (критическое состояние);
  • 3 — ERR (ошибка);
  • 4 — WARNING (предупреждение);
  • 5 — NOTICE (всё нормально, но следует обратить внимание);
  • 6 — INFO (информационное сообщение);
  • 7 —DEBUG (отложенная печать).


Коды уровней ошибок указываются после опции -p.

Запись логов в стандартный вывод



По умолчанию journalctl использует для вывода сообщений логов внешнюю утилиту less. В этом случае к ним невозможно применять стандартные утилиты для обработки текстовых данных (например, grep). Эта проблема легко решается: достаточно воспользоваться опцией −−no-pager, и все сообщения будут записываться в стандартный вывод:

$ journalctl --no-pager


После этого их можно будет передать другим утилитам для дальнейшей обработки или сохранить в текстовом файле.

Выбор формата вывода



C помощью опции -o можно преобразовывать данные логов в различные форматы, что облегчает их парсинг и дальнейшую обработку, например:

$ journalctl  -u nginx.service -o json

{ "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading", "SYSLOG_IDENTIFIER" : "systemd", "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5", "_TRANSPORT" : "journal", "_PID" : "1", "_COMM" : "systemd", "_EXE" : "/usr/lib/systemd/systemd", "_CMDLINE" : "/usr/lib/systemd/systemd", "_SYSTEMD_CGROUP" : "/", "UNIT" : "nginx.service", "MESSAGE" : "Starting A high performance web server and a reverse proxy server...", "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973" }


Объект json можно представить в более структурированном и человекочитаемом виде, указав формат json-pretty или json-sse:

$ journalctl -u nginx.service -o json-pretty

{
    "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635",
    "__REALTIME_TIMESTAMP" : "1422990364739502",
    "__MONOTONIC_TIMESTAMP" : "27200938",
    "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d",
    "PRIORITY" : "6",
    "_UID" : "0",
    "_GID" : "0",
    "_CAP_EFFECTIVE" : "3fffffffff",
    "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee",
    "_HOSTNAME" : "desktop",
    "SYSLOG_FACILITY" : "3",
    "CODE_FILE" : "src/core/unit.c",
    "CODE_LINE" : "1402",
    "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
    "SYSLOG_IDENTIFIER" : "systemd",
    "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5",
    "_TRANSPORT" : "journal",
    "_PID" : "1",
    "_COMM" : "systemd",
    "_EXE" : "/usr/lib/systemd/systemd",
    "_CMDLINE" : "/usr/lib/systemd/systemd",
    "_SYSTEMD_CGROUP" : "/",
    "UNIT" : "nginx.service",
    "MESSAGE" : "Starting A high performance web server and a reverse proxy server...",
    "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973"
}


Помимо JSON данные логов могут быть преобразованы в следующие форматы:

  • cat — только сообщения из логов без служебных полей;
  • export — бинарный формат, подходит для экспорта или резервного копирования логов;
  • short — формат вывода syslog;
  • short-iso — формат вывода syslog с метками времени в формате ISO 8601;
  • short-monotonic — формат вывода syslog c метками монотонного времени (monotonic timestamp);
  • short-precise — формат вывода syslog с метками точного времени (время событий указывается с точностью до микросекунд);
  • verbose — максимально подробный формат представления данных (включает даже те поля, которые в других форматах не отображаются).


Просмотр информации о недавних событиях



Опция -n используется для просмотра информации о недавних событиях в системе:

$ journalctl -n


По умолчанию на консоль выводится информация о последних 10 событиях. С опцией -n можно указать необходимое число событий:

$ journalctl -n 20


Просмотр логов в режиме реального времени



Сообщения из логов можно просматривать не только в виде сохранённых файлов, но и в режиме реального времени. Для этого используется опция -f:

$ journalctl -f 


Управление логгированием



Определение текущего объёма логов



Со временем объём логов растёт, и они занимают всё больше места на жёстком диске. Узнать объём имеющихся на текущий момент логов можно с помощью команды:

$ journalctl --disk-usage
Journals take up 16.0M on disk.


Ротация логов



Настройка ротации логов осуществляется с помощью опций −−vacuum-size и −−vacuum-time.
Первая из них устанавливает предельно допустимый размер для хранимых на диске логов (в нашем примере — 1 ГБ):

$ sudo journalctl --vacuum-size=1G


Как только объём логов превысит указанную цифру, лишние файлы будут автоматические удалены.
Аналогичным образом работает опция −−vacuum-time. Она устанавливает для логов срок хранения, по истечении которого они будут автоматически удалены:

$ sudo journalctl --vacuum-time=1years


Настройка ротации логов в конфигурационном файле



Настройки ротации логов можно также прописать в конфигурационном файле /еtc/systemd/journald.conf, который включает в числе прочих следующие параметры:

  • SystemMaxUse= максимальный объём, который логи могут занимать на диске;
  • SystemKeepFree= объём свободного места, которое должно оставаться на диске после сохранения логов;
  • SystemMaxFileSize= объём файла лога, по достижении которого он должен быть удален с диска;
  • RuntimeMaxUse= максимальный объём, который логи могут занимать в файловой системе /run;
  • RuntimeKeepFree= объём свободного места, которое должно оставаться в файловой системе /run после сохранения логов;
  • RuntimeMaxFileSize= объём файла лога, по достижении которого он должен быть удален из файловой системы /run.


Централизованное хранение логов



Одной из самых распространённых задач в работе системного администратора является настройка сбора логов с нескольких машин с последующим помещением в централизованное хранилище.
В systemd предусмотрены специальные компоненты для решения этой задачи: systemd-journal-remote, systemd-journal-upload и systemd-journal-gatewayd.

С помощью команды systemd-journal-remote можно принимать логи с удалённых хостов и сохранять их (на каждом их этих хостов должен быть запущен демон systemd-journal-gatewayd), например:

$ systemd-journal-remote −−url https://some.host:19531/


В результате выполнения приведённой команды логи с хоста some.host будут сохранены в директории var/log/journal/some.host/remote-some~host.journal.

С помощью команды systemd-journal-remote можно также складывать имеющиеся на локальной машине логи в отдельную директорию, например:

$ journalctl -o export | systemd-journal-remote -o /tmp/dir -


Команда systemd-journal-upload используется для загрузки логов с локальной машины в удалённое хранилище:

$ systemd-journal-upload --url https://some.host:19531/


Как видно из приведённых примеров, «родные» утилиты systemd для поддержки централизованного логгирования просты и удобны в работе. Но они, к сожалению, пока что включены далеко не во все дистрибутивы, а только в Fedora и ArchLinux.

Пользователи других дистрибутивов пока что приходится передавать логи в syslog или rsyslog, которые затем пересылают их по сети. Ещё одно решение проблемы централизованного логгирования было предложено разработчиками утилиты journal2gelf, включённой в официальный репозиторий systemd: вывод journalсtl в формате JSON конвертируется в формат GELF, а затем передаётся приложению для сбора и анализа логов Graylog. Решение не очень удобное, но ничего лучше в текущей ситуации придумать нельзя. Остаётся только ждать, когда «родные» компоненты будут добавлены во все дистрибутивы.

Заключение



Как видно из проделанного рассмотрения, systemd journal представляет собой гибкий и удобный инструмент для сбора системных данных и данных приложений. Высокого уровня гибкости и удобства удалось добиться, во-первых, благодаря централизованному подходу к логгированию, а во-вторых — благодаря автоматической записи в логи подробных метаданных. С помощью journalctl можно просматривать логи, получая необходимую информацию для анализа работы и отладки различных системных компонентов.
Если у вас есть вопросы и дополнения — добро пожаловать в комментарии. Разговор о systemd и его компонентах будет продолжен в следующих публикациях.

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

Наконец-то в Docker внедрили верификацию образов. Не так много и понадобилось времени, кстати. Ни на что не намекая, предположим, что на подходе зависимости между образами докера, как в RPM.

Помимо этого, в версии 1.8 появилась фича "копировать файл из хоста в контейнер". Не то, чтобы нас, пользователей контейнеров, управляемых systemd, и виртуалок, к которым есть libguestfs, это сильно удивило. Нас больше заинтересовало то, что все эти "новинки" всерьез называются новинками.

Вообще, пользователи Docker зачастую не очень понимают, что такое "контейнеры", что такое "докер" и многие другие вещи. Для них порекомендуем ознакомиться с короткой тематической хаутушкой, которая может помочь расставить все на свои места. Docker, сам по себе, это такой "mc" для контейнеров, и некоторые считают, что как и mc, так и в Docker ничего, кроме лишней сущности, нет. Есть даже шуточная (или не очень?) попытка реализовать Docker в менее 1000 строчек на Bash. Конечно, одним systemd-nspawn вместо Docker обойтись не получится - нужно управление сетью, нужны средства развертывания образов, нужен хотя-бы простейший менеджер задач в кластере, но и для Docker необходимы дополнительные средства. Например, послушайте любопытное выступление Александра Тарасова, инженера Альфа-банка:



Какое у вас сложилось впечатление о развитости и интегрированности компонентов инфраструктуры для Docker?

Вообще, про Docker сейчас интереснее читать не статьи, а читательские комментарии к ним, вот тут, например. Похоже, что мы проходим первый пик известной кривой, и пользователи уже сформировали список желаний. При всем уважении к мнению и опыту команды Iron.io с их колоссальными числами реально работающих контейнеров, у Docker есть хорошо видимые проблемы - особенно обратите внимание на файловую систему, журналирование и безопасность. Мы уверены, что эти проблемы преодолимы, и не факт что в каких-то реальных конфигурациях они обязательно вылезут, но в других решениях эти проблемы уже устранены, и это просто надо знать, прежде чем делать выбор.

К счастью, все контейнерные технологии на самом деле базируются на одних и тех же существующих механизмах ядра, и унификация инструментов гораздо выше, чем считают некоторые. Например, развернув контейнер с помощью Docker вы сможете управлять им из systemd, который давно уже умеет напрямую импортировать образы Docker. Но прогресс прогрессирует прогрессирующе, и Open Container Format, о котором вы уже слышали, скоро сделает ненужным и экспортирование - все контейнеры будут одинаковыми. Пока утрясаются управленческие моменты, но уже есть инициативы по стандартизации все больших и больших областей, например, сети для контейнеров (но это пока секрет!).

Само собой, мы тоже используем Docker сами и помогаем другим. Пару-тройку недель назад наш коллега, Dan Horák, наконец-то собрал Docker для архитектуры s390x. Использовался gcc-go, т.к. референсный golang почти никакие нестандартные архитектуры не поддерживает. Напомним, первые эксперименты по сборке чего-то реального с gcc-go начались в апреле 2015го.

Мы только-только собираемся устроить Fedora 22 Release Picnic, а уже начались тестовые дни для Fedora 23. Одним из первых будет тестовый день NetworkManager, запланированный на 20 августа.

Вы уже знаете, что с Fedora 22 мы перешли на NetworkManager 1.x.x. В версии 1.0.0 он стал тоньше (меньше зависимостей), его DHCP-клиент стал быстрее (код, взятый из systemd и connman), он стал лучше сосуществовать с уже сконфигурированными устройствами, статическими интерфейсами, и предустановленными маршрутами. К счастью, особо крупных проблем не нашлось. Тем не менее, последовало уже два багфикс-релиза. Сначала вышел NetworkManager 1.0.2, в котором среди прочих исправлена ошибка, с которой только что столкнулись разработчики systemd-networkd - если на устройстве исчезает питание (выдернули и воткнули кабель, или глюк ядра), то не стоит сразу же сбрасывать настройки и запускать DHCPклиент по новой). Затем вышел NetworkManager 1.0.4. Сейчас на подходе уже версия 1.0.6, и вот ее-то и будем проверять.

Почти два года прошло с тех пор, как в Fedora вновь отключили шифрование на базе эллиптической кривой secp256k1, и вот, наконец-то ситуация сдвинулась с мертвой точки. Ждем активизацию работы по включению ПО для работы с Bitcoin!

Когда Dave Jones объявил в декабре 2014, что он уходит из Red Hat, многие гадали, кому это так повезло? Оказалось, что это был Akamai. К сожалению, по сравнению с невероятной открытостью рабочего процесса в Red Hat, и его полной ориентацией на открытые инструменты, стандарты, и код, в Akamai оказалось все совсем не так. Например, Dave пишет, что в Akamai используется peforce! Не, ну это как вообще?

Помучавшишь несколько месяцев в Akamai, Dave решил уйти в Facebook. Желаем удачи на новом месте!

Наконец-то вышел Qemu 2.4. В большом списке изменений хотелось бы выделить поддержку VirtIO GPU, разработанного нашим коллегой David Airlie, горячее удаление памяти, улучшение в зеркалировании блочных устройств. Одновременно выпустили багфикс-релиз Qemu 2.3.1.

Вообще, несмотря на взрывной рост интереса к контейнерам, отметим, что старый конь борозды не испортит. Учитывая пока что нерешенные проблемы с безопасностью контейнеров, особенно в маргинальных дистрибутивах, без SELinux, у виртуализации будет своя ниша. Конечно, конкуренция решений тут лишь обостряется. Большие игроки медленно решаются что-то менять, но если решаются, то бесповоротно. Вы уже могли слышать, что пару месяцев назад Linode решил уйти с Xen на KVM (причем, отметьте, они утверждают, что KVM-виртуалки заметно быстрее Xen-виртуалок), но впереди еще миграция еще больших размеров, которую мы пока что ждем.

Итак, виртуализация не собирается уходить, и уже понятно, что завоевала некую стабильную долю среди всех решений. Де-факто стандартом для новинок становится Qemu, на котором смело экспериментируют. Например, Intel уже несколько месяцев, как анонсировала проект Clear Containers, в рамках которого ведется научно-исследовательская работа по оптимизации виртуальной машины с Linux-системой для запуска контейнеров. Они обнаружили неисследованное поле для оптимизации - загрузка и инициализация виртуальной машины. Т.к. Qemu декларирует поддержку операционных систем в общем случае, то по умолчанию загрузка виртуалки не сильно отличается от загрузки персоналки с Windows 95. Тот же 16-битный BIOS вместо UEFI, те же процедуры инициализации. А почему бы не изменить эту часть, выбросив поддержку операционных систем из 1980х и 1990х годов? После экспериментов с пересборкой Qemu и разработкой специального firmware, Paolo Bonzini официально объявил о выходе qboot, специальном firmware и инструкции для пересборки Qemu, позволявшим запустить исполнение виртуальной машины через 40 миллисекунд, вместо обычных 500-700. Дальше, конечно, время тратится на запуск ядра, initrd, init-процесс, но полсекунды сэкономить получилось!

Анонс qboot вызвал оживленное обсуждение. Понятно, что кое-чего при таких результатах еще нет, да и Paolo признался, что разработал прототип за 24 часа, и понятно, что SeaBIOS можно тоже подсушить, но 200 миллисекунд в SeaBIOS против 20 в qboot, это заметная разница. Можно ожидать, что qboot как таковый, использоваться будет незначительно - уж слишком это изменение инвазивно со своим требованием пересборки Qemu, но определенно стоит ожидать оптимизаций в SeaBIOS и возможно в Coreboot.

Dan решил объяснить, почему SELinux не смог бы предотвратить недавнюю уязвимость в Firefox. К сожалению, как пишет в своем блоге Dan, проблема гораздо серьезней.

Для начала, Firefox пока вынужден общаться с устаревшей и небезопасной системой X11, и, например, хотя возможность заблокировать извне процесс от получения информации о нажатых клавишах (т.е. от работы кейлоггером) есть, но применив ее Dan обнаружил, что очень много ПО перестало работать. Также любое ПО может снимать скриншоты экрана, или обладать доступом к буферу обмена (в Wayland, спроектированном с учетом современных требований, это будет исправлено).

Еще одна проблема, это доступ к файлам в домашней директории. В ряде случаев бывает, что пользователь, например, переопределяет папки для сохранения загруженных файлов, и поэтому белый список ввести не получится. Ввести не белые, а ченые списки (например, запретить Firefox доступ к ~/.ssh) тоже не сработает, т.к. есть варианты работы с аутентификацией по ssh-ключу.

Проблемой безопасности является и доступ к D-Bus, к камере, к микрофону, к GPS и т.п. - запрещать это на уровне SELinux нельзя. Непросто и написать правила для приложений-хелперов. Например, если Firefox запустит LibreOffice для открытия документа, то в каком пространстве SELinux нужно запустить LO? В пространстве Firefox или в своем?

Самым простым было ограничение возможностей у дополнений Firefox. Конечно, пришлось ввести дополнительные флаги SELinux для полного отключения ограничений для ряда популярных приложений - на случай, если им потребуется дополнительные права. Хотя, конечно, лучше проприетарные плагины вовсе не использовать.

В ближайшем будущем, благодаря Alex Larsson, который разрабатывает новый стандарт распространения и работы с десктопными приложениями, эти проблемы будут решены. Каждое приложение будет работать в своем контейнере, с ограничениями SELinux, и под Wayland. Почти все проблемы, благодаря этой связке, будут решены. Примерно так и работают приложения в Android, благодаря SEAndroid, о котором мы вам рассказывали.

Кстати, если вы почему-то не используете Fedora, то требуйте от мэйнтейнеров вашего дистрибутива включать SELinux - на его использование будет завязано все больше и больше ПО.

Раз уж заговорили о безопасности, то стоит отметить, что в Fedora наши коллеги относятся к ней очень тщательно. Ну, по крайней мере, мы стараемся. Например, много вопросов было от переключавшихся с других дистрибутивов, почему у нас не работает добавление пользователя в группу "docker". В ряде других дистрибутивов после добавления пользователя в эту группу, ему позволяется запускать контейнеры, а у нас ему нужно поднять свои привилегии до суперпользователя с помощью su или sudo. Проблема в том, что если разрешить пользователю запускать произвольные контейнеры, он сумеет получить полный доступ к файловой системе от суперпользователя. Т.е. добавив его в группу docker мы фактически даем ему право выполнять sudo без пароля. И т.к. в Docker журналирование событий крайне убогое (как и много чего еще), то это рассматривается, как дыра в безопасности. Dan Walsh решил завести специальный тикет с объяснением на GitHub, чтобы не повторяться вновь и вновь. Конечно, лучше бы вам вообще не использовать Docker для контейнеров, т.к. systemd и сопутствующее ПО предоставляют гораздо больше возможностей для этого.

В рамках проекта CentOS объявили о создании рабочей группы по сборке для неосновных архитектур. Уже собрали CentOS для AArch64 и более-менее идет работа по сборке для POWER BE, так что есть что показать!

А вот в Fedora обсуждают диаметрально противоположную инициативу - не перевести ли 32-битный x86 в категорию вторичных платформ (это первый шаг на скорое выкидывание за ненадобностью). Нет, ну а правда - у всех уже давно 64-битные компьютеры, и если 32-битные ARM-машинки еще есть, то какой смысл в сборке для 32-битных Intel-совместимых машин?

Обсуждение пока ни к чему не привело, но идея уже посеяна. Интересно, что одновременно с упрощением букета поддерживаемых систем, не так давно появилась инициатива по упрощению сборки Fedora для неподдерживаемых систем. Ну мало ли - вдруг кто-нибудь захочет собрать Fedora для Эльбруса или Байкала.

К команде Red Hat и к проекту Fedora присоединился еще один широко известный в узких кругах разработчик - Oded Gabbay. Раньше он работал в AMD над драйвером для архитектуры HSA. Он объявил, что будет работать над улучшением графического стека для POWER-архитектуры. Помимо этого он еще и действующий разработчик и release manager библиотеки pixman, мэйнтейнером которой он будет в Fedora.

Страницы