Введение в Osquery от Facebook

Предисловие


Данная публикация — относительно вольный перевод опубликованоой в блоге Facebook статьи «Introducing osquery».

Введение в osquery


Мониторинг состояния вашей системы в реальном времени очень важен. В Facebook мы разработали фреймворк под названием osquery, который позволяет взглянуть на низкоуровневый мониторинг операционной системы по-новому.

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

  • запущенных процессах;
  • загруженных модулях ядра;
  • открытых стевых соединениях.


SQL таблицы создаются через легко расширяемый API. Несколько таблиц уже существуют и еще множество разрабатывается. Лучше понять легкость и выразительность, которую предоставляет osquery, помогут следующие примеры.

Примеры запросов


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

SELECT name, path, pid 
      FROM processes 
      WHERE on_disk = 0;

Взаимодействие с ОС с помощью SQL — простое и занимательное занятие. Одно из преимуществ, которые дает нам SQL — это возможность объединять (join) разные таблицы вместе для анализа системы. Следующий пример как раз показывает нам, как можно одновременно использовать информацию из двух «таблиц» — listening_ports и processes. Этот запрос ищет все процессы, которые слушают сетевые порты. Таким образом, используя «таблицу» процессов из предыдущего примера, мы можем объединить ее с другой «таблицей» — таблицей сетевых портов. И там, и там используется PID процесса, по которому и происходит объединение.

SELECT DISTINCT process.name, listening.port, listening.address, process.pid 
      FROM processes AS process 
      JOIN listening_ports AS listening 
          ON process.pid = listening.pid;

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

Features


Osquery — это фреймворк, который мы используем для создания новых продуктов и инструментов. Модульный исходный код osquery дает нам преимущество перед существующими концепциями. Мы выпускаем несколько инструментов как часть одного open source релиза и в планах у нас еще много чего. Мы также с нетерпением ждем момента, когда наше коммьюнити представит свои инструменты, основанные на osquery.

Интерактивная консоль

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

Больше информации по использованию osquery — в нашей вики.

Мониторинг кластеров

Для мониторинга крупных систем существуем демон — osqueryd. Он позволяет планировть запросы для исполнения их во всей вашей инфраструктуре. Демон самостоятельно заботится об аггрегировании результатов запросов по времени и генерирует логи, отображающие состояние изменений в инфраструктуре. Вы можете использовать его для актуализации информации о безопасности, производительности, конфигурации и состояния целостности вашей инфраструктуры. Демон osqueryd также может интегрировать ваши внутренние логи с помощью robust plugin architecture.

Если вы заинтересовались использованием osqueryd в вашей инфраструктуре — вновь приглашаем вас в вики, а также в internal deployment guide.

Кросплатформенность

Osquery — кросплатформенный. И хотя osquery имеет преимущество в низкоуровневых операционных системах, вы можете собрать и использовать его в Ubuntu, CentOS и MacOS. Это даже даст определенное преимущество, т.к. позволит мониторить корпоративные маки на том же уровне, что и корпоративные Linux сервера.

Нативные сборки и документация

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

Подробнее здесь.

Модульный исходный код

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

Open source

После общения с несколькими внешними компаниями пришло понимание, что подобный мониторинг низкоуровневого поведения операционных систем это не уникальная проблема Facebook'a. Через несколько месяцев мы выпустили osquery в виде бинарных файлов для ограниченного количества компаний. Они с успехом внедрили и протестировали osquery на своем оборудовании и мы получили от них отличнейший фидбек.
И сейчас мы рады сообщить, что настало время open source osquery. Вы можете найти весь код и документацию на GitHub.

Мы с нетерпением ждем отзывов от коммьюнити. Мы будем вести всю работу с osquery на GitHub. Это облегчит работу сторонних разработчиков. Мы надеемся, вы увидите потенциал в osquery и сотворите прекрасные вещи вместе с нами.
  • +25
  • 7.6k
  • 6
Share post

Comments 6

    0
    Походу, кросс-платформенный WMI.
      0
      А с учётом того, что WMI и так построен на открытых стандартах…
      0
      Извините за занудство, но подобные куски в тексте
      SELECT DISTINCT process.name, listening.port, listening.address, process.pid FROM processes AS process JOIN listening_ports AS listening ON process.pid = listening.pid;

      более читабельны, если при помощи ENTER'а разделять код на строчки. При добавлении пары джоинов (или условий) желание понимать написанное может пропасть. На Гите у вас все же читабельным выглядит.
        0
        Согласен, надо было так сразу сделать.
        0
        А есть ли возможность выполнять sql запросы не только stdin/stdout, а общаться через сокет?
          0
          Тоже интересует этот момент. Чето както мало инфы об этом…

        Only users with full accounts can post comments. Log in, please.