Как следить за безопасностью вашей системы с помощью osquery в Ubuntu 16.04

Вступление

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

Это кроссплатформенное приложение с поддержкой последних версий macOS, Windows 10, CentOS и Ubuntu. Официально он описан как среда инструментария, мониторинга и аналитики операционной системы на основе SQL и создан на Facebook.

С помощью osquery вы можете запускать такие команды, как + select * from logged_in_users; + для вашего сервера, и получать такой результат:

Output+-----------+----------+-------+------------------+------------+------+
| type      | user     | tty   | host             | time       | pid  |
+-----------+----------+-------+------------------+------------+------+
| login     | LOGIN    | ttyS0 |                  | 1483580429 | 1546 |
| login     | LOGIN    | tty1  |                  | 1483580429 | 1549 |
| user      | root     | pts/0 | 24.27.68.82      | 1483580584 | 1752 |
| user      | sammy    | pts/1 | 11.11.11.11      | 1483580770 | 4057 |
| boot_time | reboot   | ~     | 4.4.0-57-generic | 1483580419 | 0    |
| runlevel  | runlevel | ~     | 4.4.0-57-generic | 1483580426 | 53   |
+-----------+----------+-------+------------------+------------+------+

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

Установка osquery дает вам доступ к следующим компонентам:

  • + osqueryi +: интерактивная оболочка osquery для выполнения специальных запросов.

  • + osqueryd +: демон для планирования и выполнения запросов в фоновом режиме.

  • + osqueryctl +: вспомогательный скрипт для тестирования развертывания или настройки osquery. Его также можно использовать вместо диспетчера служб операционной системы для запуска / остановки / перезапуска + osqueryd +.

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

В этом уроке вы будете:

  • Установите osquery.

  • Сконфигурируйте аспекты операционной системы, такие как Rsyslog, которые должны работать должным образом.

  • Настройте файл конфигурации, который может использоваться как + osqueryi +, так и + osqueryd +.

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

  • Выполните специальные запросы, используя + osqueryi + для поиска проблем безопасности.

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

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

Предпосылки

Чтобы завершить этот урок, вам понадобится следующее:

  • Сервер Ubuntu 16.04, сконфигурированный с пользователем без полномочий root с привилегиями sudo и брандмауэром. Следуйте инструкциям по установке Initial для Ubuntu 16.04.

Вы также должны иметь базовые знания по SQL и иметь базовые знания по безопасности системы Linux на https://www.digitalocean.com/community/tutorials/an-introduction-to-securing-your-linux-vps.

Шаг 1 - Установка osquery на сервере

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

Сначала добавьте открытый ключ хранилища:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B

Затем добавьте хранилище:

sudo add-apt-repository "deb [arch=amd64] https://osquery-packages.s3.amazonaws.com/xenial xenial main"

Обновите базу данных пакетов:

sudo apt-get update

Наконец, установите osquery:

sudo apt-get install osquery

Из коробки, osquery не невероятно полезен; это не подключи и играй приложение. Независимо от того, собираетесь ли вы использовать интерактивную оболочку или демон, вы должны передать некоторые флаги и параметры либо из командной строки, либо через файл конфигурации. Чтобы просмотреть флаги и параметры, доступные для демона, введите:

osqueryd --help

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

Outputosquery 2.1.2, your OS as a high-performance relational database
Usage: osqueryd [OPTION]...

osquery command line flags:

   --flagfile PATH                           Line-delimited file of additional flags
   --config_check                            Check the format of an osquery config and exit
   --config_dump                             Dump the contents of the configuration
   --config_path VALUE                       Path to JSON config file
   --config_plugin VALUE                     Config plugin name
   --config_tls_endpoint VALUE               TLS/HTTPS endpoint for config retrieval
   --config_tls_max_attempts VALUE           Number of attempts to retry a TLS config/enroll request
   --config_tls_refresh VALUE                Optional interval in seconds to re-read configuration
   --daemonize                               Run as daemon (osqueryd only)

...

...

osquery configuration options (set by config or CLI flags):

   --audit_allow_config                      Allow the audit publisher to change auditing configuration
   --audit_allow_sockets                     Allow the audit publisher to install socket-related rules
   --audit_persist                           Attempt to retain control of audit
   --aws_access_key_id VALUE                 AWS access key ID
   --aws_firehose_period VALUE               Seconds between flushing logs to Firehose (default 10)
   --aws_firehose_stream VALUE               Name of Firehose stream for logging
   --aws_kinesis_period VALUE                Seconds between flushing logs to Kinesis (default 10)
   --aws_kinesis_random_partition_key        Enable random kinesis partition keys
   --aws_kinesis_stream VALUE                Name of Kinesis stream for logging
   --aws_profile_name VALUE                  AWS profile for authentication and region configuration
   --aws_region VALUE                        AWS region

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

osqueryi --help

Запуск + osqueryi + - это самый простой метод для вывода списка и запросов к таблицам osquery, доступных из коробки. Например, запустите его с помощью следующей команды:

osqueryi --verbose

Это поместит вас в интерактивную оболочку, и вы увидите вывод, похожий на этот:

OutputI0105 01:52:54.987584  4761 init.cpp:364] osquery initialized [version=2.1.2]
I0105 01:52:54.987808  4761 extensions.cpp:351] Could not autoload extensions: Failed reading: /etc/osquery/extensions.load
I0105 01:52:54.987944  4761 extensions.cpp:364] Could not autoload modules: Failed reading: /etc/osquery/modules.load
I0105 01:52:54.988209  4761 init.cpp:606] Error reading config: config file does not exist: /etc/osquery/osquery.conf
I0105 01:52:54.988334  4761 events.cpp:886] Error registering subscriber: socket_events: Subscriber disabled via configuration
I0105 01:52:54.993973  4763 interface.cpp:307] Extension manager service starting: /home/sammy/.osquery/shell.em
Using a virtual database. Need help, type '.help'
osquery>

Из-за сообщений об ошибках и информационных сообщений в выводе очевидно, что все части osquery не работают правильно. Некоторые запросы, такие как + select * from yara; + не будут возвращать ничего, показывая, что таблица не была заполнена данными.

Другие запросы, такие как + выберите время, серьезность, сообщение из системного журнала; + вернут сообщение, подобное следующему, что указывает на то, что нам нужно проделать еще больше работы:

OutputW1202 15:44:48.600539  1720 virtual_table.cpp:492] Table syslog is event-based but events are disabled
W1202 15:44:48.600587  1720 virtual_table.cpp:499] Please see the table documentation: https://osquery.io/docs/#syslog

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

Выйдите из консоли, набрав:

.exit

В следующем разделе мы изменим аспекты операционной системы, которые нужны для нормальной работы osquery.

Шаг 2 - Предоставление osquery доступа к системному журналу

На этом этапе мы изменим приложение системного журнала операционной системы, чтобы позволить osquery использовать и запрашивать системный журнал. В Ubuntu 16.04 это означает изменение файла конфигурации Rsyslog. И единственное изменение, которое вам нужно сделать, это добавить несколько строк кода в файл конфигурации.

Для начала откройте файл + / etc / rsyslog.conf +:

sudo nano /etc/rsyslog.conf

Нам нужно добавить несколько строк конфигурации, которые сообщают Rsyslog, в какой канал записывать и какие параметры системного журнала записывать в этот канал. По умолчанию канал представляет собой + / var / osquery / syslog_pipe +. Затем osquery заполняет свою таблицу + syslog + информацией, записанной в этот канал.

Добавьте следующие строки в файл:

/etc/rsyslog.conftemplate(
 name="OsqueryCsvFormat"
 type="string"
 string="%timestamp:::date-rfc3339,csv%,%hostname:::csv%,%syslogseverity:::csv%,%syslogfacility-text:::csv%,%syslogtag:::csv%,%msg:::csv%\n"
)
*.* action(type="ompipe" Pipe="/var/osquery/syslog_pipe" template="OsqueryCsvFormat")

Сохраните и закройте файл. Чтобы применить изменения, перезапустите демон syslog:

sudo systemctl restart rsyslog

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

Шаг 3 - Создание файла конфигурации osquery

Создание файла конфигурации облегчает запуск + osqueryi +. Вместо того, чтобы передавать много параметров командной строки, + osqueryi + может читать эти параметры из файла конфигурации, расположенного в + / etc / osquery / osquery.conf +. И, конечно, файл конфигурации также будет доступен для демона.

Файл конфигурации также содержит запросы, которые должны быть выполнены по расписанию. Однако большинство запросов, которые вы можете запускать по расписанию, отправляются как так называемые packs. Пакеты - это файлы, расположенные в каталоге + / usr / share / osquery / packs +.

osquery не поставляется с файлом конфигурации, но есть пример файла конфигурации, который вы можете скопировать в + / etc / osquery + и изменить. Однако этот файл не имеет всех параметров, необходимых для его запуска в дистрибутиве Linux, например Ubuntu, поэтому мы создадим свой собственный.

В файле конфигурации есть три раздела:

  • Список параметров демона и настроек функций. Их также можно прочитать с помощью + osqueryi +.

  • Список запланированных запросов для запуска и когда они должны выполняться.

  • Список пакетов, которые будут использоваться для выполнения более конкретных запланированных запросов.

Ниже приведен список параметров, которые мы будем использовать для нашего файла конфигурации, их значения и значения, для которых мы будем их устанавливать. Этот список параметров достаточен для запуска + osquery и` + osquery` в Ubuntu 16.04 и других дистрибутивах Linux.

  • * config_plugin *: Где хотите, чтобы osquery считывал его конфигурации. По умолчанию они читаются из файла на диске, поэтому значение для этого равно + filesystem +.

  • * logger_plugin *: Указывает, куда osquery должен записывать результаты запланированных запросов. Еще раз, мы будем использовать + filesystem +.

  • * logger_path *: это путь к каталогу журнала, где вы найдете файлы, содержащие информацию, предупреждения, ошибки и результаты запланированных запросов. По умолчанию это + / var / log / osquery +.

  • * disable_logging *: устанавливая значение этого параметра в + false +, мы включаем ведение журнала.

  • * log_result_events *: если для этого параметра установлено значение + true +, каждая строка в журналах результатов будет представлять изменение состояния.

  • * schedule_splay_percent *: Это говорит osquery, что, когда большое количество запросов запланировано на один и тот же интервал, их выполнение распределяется, чтобы ограничить любое влияние на производительность сервера. Значением по умолчанию является «+ 10 +», что является процентом.

  • * pidfile *: Где записать идентификатор процесса демона osquery. По умолчанию это + / var / osquery / osquery.pidfile +.

  • * events_expiry *: в секундах, как долго удерживать подписчика приводит к хранению в покере. Из коробки установлено значение «+ 3600 +».

  • * database_path *: путь к базе данных osquery. Мы будем использовать значение по умолчанию, которое равно + / var / osquery / osquery.db +.

  • * verbose *: при включенном ведении журнала это используется для включения или отключения подробных информационных сообщений. Мы установим это в + false.

  • * worker_threads *: количество потоков рабочей рассылки, используемых для обработки запросов. По умолчанию это значение равно «+ 2 +», поэтому мы остановимся на этом.

  • * enable_monitor *: Используется для включения или отключения монитора расписания. Мы включим его, поэтому значение будет + true +.

  • * disable_events *: Используется для регулирования системы публикации / подписки в osquery. Нам нужно это включить, поэтому значение здесь будет + false +.

  • * disable_audit *: используется для отключения приема событий от подсистемы аудита операционной системы. Нам нужно, чтобы он был включен, поэтому используемое здесь значение будет + false +.

  • * audit_allow_config *: разрешить издателю аудита изменять конфигурацию аудита. По умолчанию + true +.

  • * audit_allow_sockets *: Это позволяет издателю аудита устанавливать правила, связанные с сокетами. Значение будет + true +.

  • * host_identifier *: используется для идентификации хоста, на котором запущен osquery. При объединении результатов с нескольких серверов, это помогает легко определить, с какого сервера поступает конкретная запись журнала. Значение может быть + hostname + или + uuid +. Из коробки установлено значение + hostname +, поэтому мы будем использовать это значение.

  • * enable_syslog *: для того, чтобы osquery использовал информацию из системного журнала, он должен быть установлен в + true +.

  • * schedule_default_interval *: если интервал запланированного запроса не установлен, используйте это значение. Это в секундах, и мы установим его на + 3600 +.

Вы уже видели, как просмотреть все флаги командной строки и параметры конфигурации, доступные для + osqueryi + и + osqueryd +, но приведенных выше параметров будет достаточно для запуска osquery на этом сервере.

Создайте и откройте файл конфигурации с помощью следующей команды:

sudo nano /etc/osquery/osquery.conf

Файл конфигурации использует формат JSON. Скопируйте следующее содержимое в файл:

/etc/osquery/osquery.conf

{
 "options": {
   "config_plugin": "filesystem",
   "logger_plugin": "filesystem",
   "logger_path": "/var/log/osquery",
   "disable_logging": "false",
   "log_result_events": "true",
   "schedule_splay_percent": "10",
   "pidfile": "/var/osquery/osquery.pidfile",
   "events_expiry": "3600",
   "database_path": "/var/osquery/osquery.db",
   "verbose": "false",
   "worker_threads": "2",
   "enable_monitor": "true",
   "disable_events": "false",
   "disable_audit": "false",
   "audit_allow_config": "true",
   "host_identifier": "hostname",
   "enable_syslog": "true",
   "audit_allow_sockets": "true",
   "schedule_default_interval": "3600"
 },

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

Добавьте эти строки в файл конфигурации:

/etc/osquery/osquery.conf

 "schedule": {
   "crontab": {
     "query": "SELECT * FROM crontab;",
     "interval": 300
   }
 },

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

/etc/osquery/osquery.conf

 "schedule": {
   "crontab": {
     "query": "SELECT * FROM crontab;",
     "interval": 300
   }







 },

После запланированных запросов вы можете добавить специальные запросы, называемые * decorators *, которые представляют собой запросы, добавляющие данные к другим запланированным запросам. Показанные здесь запросы декоратора будут добавлять к каждому запланированному запросу UUID хоста, на котором запущен osquery, и имя пользователя.

Добавьте эти строки в файл:

/etc/osquery/osquery.conf

 "decorators": {
   "load": [
     "SELECT uuid AS host_uuid FROM system_info;",
     "SELECT user AS username FROM logged_in_users ORDER BY time DESC LIMIT 1;"
   ]
 },

Наконец, мы можем указать osquery на список пакетов, которые содержат более конкретные запросы. Каждая установка osquery поставляется с набором пакетов по умолчанию, которые находятся в каталоге + / usr / share / osquery / packs +. Один из пакетов предназначен для macOS, а остальные - для систем Linux. Хотя вы можете использовать пакеты из их расположения по умолчанию, вы также можете скопировать их в каталог + / etc / osquery +.

Добавьте эти строки в файл, чтобы завершить файл.

/etc/osquery/osquery.conf

 "packs": {
    "osquery-monitoring": "/usr/share/osquery/packs/osquery-monitoring.conf",
    "incident-response": "/usr/share/osquery/packs/incident-response.conf",
    "it-compliance": "/usr/share/osquery/packs/it-compliance.conf",
    "vuln-management": "/usr/share/osquery/packs/vuln-management.conf"
 }
}

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

/etc/osquery/osquery.conf

{
 "options": {
   "config_plugin": "filesystem",
   "logger_plugin": "filesystem",
   "logger_path": "/var/log/osquery",
   "disable_logging": "false",
   "log_result_events": "true",
   "schedule_splay_percent": "10",
   "pidfile": "/var/osquery/osquery.pidfile",
   "events_expiry": "3600",
   "database_path": "/var/osquery/osquery.db",
   "verbose": "false",
   "worker_threads": "2",
   "enable_monitor": "true",
   "disable_events": "false",
   "disable_audit": "false",
   "audit_allow_config": "true",
   "host_identifier": "hostname",
   "enable_syslog": "true",
   "audit_allow_sockets": "true",
   "schedule_default_interval": "3600"
 },
 "schedule": {
   "crontab": {
     "query": "SELECT * FROM crontab;",
     "interval": 300
   },
   "system_profile": {
     "query": "SELECT * FROM osquery_schedule;"
   },
   "system_info": {
     "query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;",
     "interval": 3600
   }
 },
 "decorators": {
   "load": [
     "SELECT uuid AS host_uuid FROM system_info;",
     "SELECT user AS username FROM logged_in_users ORDER BY time DESC LIMIT 1;"
   ]
 },
 "packs": {
    "osquery-monitoring": "/usr/share/osquery/packs/osquery-monitoring.conf",
    "incident-response": "/usr/share/osquery/packs/incident-response.conf",
    "it-compliance": "/usr/share/osquery/packs/it-compliance.conf",
    "vuln-management": "/usr/share/osquery/packs/vuln-management.conf"
 }
}

Сохраните и закройте файл, затем подтвердите его с помощью следующей команды:

sudo osqueryctl config-check

Вывод должен выглядеть так:

OutputI0104 11:11:46.022858 24501 rocksdb.cpp:187] Opening RocksDB handle: /var/osquery/osquery.db

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

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

Шаг 4 - Настройка пакета мониторинга целостности файлов osquery

Наблюдение за целостностью файлов на вашем сервере является критически важным аспектом контроля безопасности его системы. С этой целью osquery предлагает готовое решение.

Пакеты, которые вы добавили в конфигурацию в предыдущем разделе, поставляются из коробки. В этом разделе мы добавим еще один пакет в список, который будет содержать запрос и директивы, которые будут использоваться для мониторинга целостности файлов. Для этого упражнения мы назовем файл + fim.conf +.

Создайте этот файл и откройте его в вашем редакторе:

sudo nano /usr/share/osquery/packs/fim.conf

Мы создадим пакет, который будет отслеживать файловые события в каталогах + / home,` + / etc` и + / tmp каждые 300 секунд. Полная настройка файла пакета показана в следующем списке файлов. Скопируйте его в файл.

/usr/share/osquery/packs/fim.conf{
 "queries": {
   "file_events": {
     "query": "select * from file_events;",
     "removed": false,
     "interval": 300
   }
 },
 "file_paths": {
   "homes": [
     "/root/.ssh/%%",
     "/home/%/.ssh/%%"
   ],
     "etc": [
     "/etc/%%"
   ],
     "home": [
     "/home/%%"
   ],
     "tmp": [
     "/tmp/%%"
   ]
 }
}

Сохраните и закройте файл.

Чтобы сделать новый файл и его правила доступными для osquery, укажите его в списке пакетов в конце + / etc / osquery / osquery.conf +. Откройте файл для редактирования:

sudo nano /etc/osquery/osquery.conf

Затем измените раздел пакетов, чтобы включить новый файл:

/etc/osquery/osquery.conf
...

"packs": {

    "osquery-monitoring": "/usr/share/osquery/packs/osquery-monitoring.conf",
    "incident-response": "/usr/share/osquery/packs/incident-response.conf",
    "it-compliance": "/usr/share/osquery/packs/it-compliance.conf",
    "vuln-management": "/usr/share/osquery/packs/vuln-management.conf"
 }

Сохраните и закройте файл. И просто чтобы убедиться, что вы не допустили ошибку в файле, проверьте ее еще раз:

sudo osqueryctl config-check

Теперь давайте начнем использовать + osqueryi + для запроса системы.

Шаг 5 - Использование osqueryi для выполнения специальных проверок безопасности

Есть много мест, где пригодится osquery. В этом разделе вы будете выполнять различные проверки безопасности в вашей системе, используя + osqueryi +, интерактивную оболочку. Имейте в виду, что на данный момент мы еще не запустили демон osquery. И в этом вся прелесть osquery - вы можете запускать запросы, используя + osqueryi +, даже если демон не активен, и в то же время использует файл конфигурации, который мы создали для настройки среды.

Чтобы запустить + osquery + с файлом конфигурации, введите:

sudo osqueryi --config_path /etc/osquery/osquery.conf --verbose

Давайте начнем с основных проверок безопасности и продолжим наш путь оттуда. Например, кто еще, кроме вас, вошел в систему сейчас? Узнайте с помощью этого запроса:

select * from logged_in_users ;

Вывод должен выглядеть так:

Output+-----------+----------+-------+------------------+------------+------+
| type      | user     | tty   | host             | time       | pid  |
+-----------+----------+-------+------------------+------------+------+
| boot_time | reboot   | ~     | 4.4.0-57-generic | 1483580419 | 0    |
| runlevel  | runlevel | ~     | 4.4.0-57-generic | 1483580426 | 53   |
| login     | LOGIN    | ttyS0 |                  | 1483580429 | 1546 |
| login     | LOGIN    | tty1  |                  | 1483580429 | 1549 |
| user      |      | pts/0 |       | 1483580584 | 1752 |
| user      |     | pts/1 |       | 1483580770 | 4057 |
+-----------+----------+-------+------------------+------------+------+

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

Предыдущий запрос говорит вам, кто вошел в систему сейчас, но как насчет предыдущих входов? Вы можете узнать, запросив таблицу * last *, например:

select * from last ;

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

Output+----------+-------+------+------+------------+------------------+
| username | tty   | pid  | type | time       | host             |
+----------+-------+------+------+------------+------------------+
| reboot   | ~     | 0    | 2    | 1483580419 | 4.4.0-57-generic |
| runlevel | ~     | 53   | 1    | 1483580426 | 4.4.0-57-generic |
|          | ttyS0 | 1546 | 5    | 1483580429 |                  |
| LOGIN    | ttyS0 | 1546 | 6    | 1483580429 |                  |
|          | tty1  | 1549 | 5    | 1483580429 |                  |
| LOGIN    | tty1  | 1549 | 6    | 1483580429 |                  |
|      | pts/0 | 1752 | 7    | 1483580584 |       |
|     | pts/1 | 4057 | 7    | 1483580770 |       |
+----------+-------+------+------+------------+------------------+

Брандмауэр настроен и активирован? Брандмауэр все еще работает? Если сомневаетесь, запустите этот запрос, чтобы узнать:

select * from iptables ;

Если выходных данных нет, это означает, что брандмауэр IPTables не настроен. Для сервера с выходом в Интернет это не очень хорошая вещь, поэтому вам лучше настроить брандмауэр.

Вы можете запустить предыдущую команду, модифицированную для фильтрации по определенным столбцам, например:

select chain, policy, src_ip, dst_ip from iptables ;

Этот запрос должен дать вывод, подобный следующему. Найдите необычные IP-адреса источника и назначения, которые вы не настроили:

Output+---------+--------+---------+-----------+
| chain   | policy | src_ip  | dst_ip    |
+---------+--------+---------+-----------+
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 127.0.0.0 |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| INPUT   | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| FORWARD | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| FORWARD | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| OUTPUT  | ACCEPT | 0.0.0.0 | 0.0.0.0   |
| OUTPUT  | ACCEPT | 0.0.0.0 | 0.0.0.0   |
+---------+--------+---------+-----------+

Какие виды работ запланированы в crontab? Вы запланировали их? Этот запрос поможет вам найти вредоносные программы, запланированные для запуска через определенные промежутки времени:

select command, path from crontab ;

И вывод должен принять эту форму. Любая команда, которая выглядит подозрительно, требует дальнейшего расследования:

Output+----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+
| command                                                                                                                                | path                           |
+----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+
| root cd / && run-parts --report /etc/cron.hourly                                                                                       | /etc/crontab                   |
| root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )                                                       | /etc/crontab                   |
| root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )                                                      | /etc/crontab                   |
| root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )                                                     | /etc/crontab                   |
| root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi | /etc/cron.d/mdadm              |
| root test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond                                          | /etc/cron.d/popularity-contest |
+----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+

Есть ли в системе файлы с поддержкой setuid? На любом сервере Ubuntu 16.04 их довольно много, но какие из них, и есть ли такие, которые не должны быть в системе? Ответы на эти вопросы помогут вам обнаружить бинарные файлы. Периодически запускайте этот запрос и сравнивайте его результаты со старыми, чтобы вы могли следить за любыми дополнениями. Этот запрос:

select * from suid_bin ;

Частичный вывод этого запроса может выглядеть следующим образом:

Output+-------------------------------+----------+-----------+-------------+
| path                          | username | groupname | permissions |
+-------------------------------+----------+-----------+-------------+
| /bin/ping6                    | root     | root      | S           |
| /bin/su                       | root     | root      | S           |
| /bin/mount                    | root     | root      | S           |
| /bin/umount                   | root     | root      | S           |
| /bin/fusermount               | root     | root      | S           |
| /bin/ntfs-3g                  | root     | root      | S           |
| /bin/ping                     | root     | root      | S           |
| /sbin/mount.ntfs-3g           | root     | root      | S           |
| /sbin/mount.ntfs              | root     | root      | S           |
| /sbin/unix_chkpwd             | root     | shadow    | G           |
| /sbin/pam_extrausers_chkpwd   | root     | shadow    | G           |
| /usr/bin/chage                | root     | shadow    | G           |
| /usr/bin/locate               | root     | mlocate   | G           |
| /usr/bin/chfn                 | root     | root      | S           |
| /usr/bin/chsh                 | root     | root      | S           |
| /usr/bin/newuidmap            | root     | root      | S           |
| /usr/bin/write                | root     | tty       | G           |
| /usr/bin/mlocate              | root     | mlocate   | G           |
| /usr/bin/at                   | daemon   | daemon    | SG          |
| /usr/bin/sg                   | root     | root      | S           |

Чтобы просмотреть список загруженных модулей ядра, выполните этот запрос:

select name, used_by, status from kernel_modules where status="Live" ;

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

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

select * from listening_ports ;

На новом сервере только с SSH, работающим через порт + 22 +, вывод будет выглядеть так:

Output+-------+------+----------+--------+---------+
| pid   | port | protocol | family | address |
+-------+------+----------+--------+---------+
| 1686  | 22   | 6        | 2      | 0.0.0.0 |
| 1686  | 22   | 6        | 10     | ::      |
| 25356 | 0    | 0        | 0      |         |
+-------+------+----------+--------+---------+

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

Чтобы посмотреть активность файлов на сервере, выполните этот запрос:

select target_path, action, uid from file_events ;

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

Output+---------------------------+---------+------+
| target_path               | action  | uid  |
+---------------------------+---------+------+
| /home/sammy/..bashrc.swp  | CREATED | 1000 |
| /home/sammy/..bashrc.swp  | UPDATED | 1000 |
| /home/sammy/..bashrc.swp  | UPDATED | 1000 |
| /home/sammy/.bashrc       | UPDATED | 1000 |
| /home/sammy/..bashrc.swp  | DELETED | 1000 |
| /home/sammy/..bashrc.swp  | CREATED | 1000 |
| /home/sammy/..bashrc.swp  | UPDATED | 1000 |
| /home/sammy/..bashrc.swp  | UPDATED | 1000 |
| /home/sammy/.bashrc       | UPDATED | 1000 |
| /home/sammy/.bashrc       | UPDATED | 1000 |
| /home/sammy/.bashrc       | UPDATED | 1000 |
| /home/sammy/..bashrc.swp  | DELETED |      |
| /etc/test_file.txt        | DELETED |      |
| /home/sammy/.bash_history | UPDATED | 1000 |
| /home/sammy/.bash_history | UPDATED | 1000 |
| /etc/secret_file.md       | CREATED | 0    |
| /etc/secret_file.md       | UPDATED | 0    |
| /etc/secret_file.md       | UPDATED | 0    |
+---------------------------+---------+------+

Существует множество запросов, подобных тем, которые вы можете запустить на своем сервере, чтобы получить представление о возможных проблемах безопасности.

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

.schema

И вы можете список доступных таблиц с:

.tables

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

Шаг 6 - Запуск osqueryd

+ osqueryd +, демон, позволяет osquery выполнять запросы через заданные интервалы. Эти запросы включают в себя те, которые вы настроили на шаге 4, те, что были в пакетах, которые мы указали на этом шаге, и в пакете FIM, который мы настроили на шаге 5. Если вы еще не изучили их, сейчас самое время взглянуть на содержимое + / usr / share / osquery / packs +.

Результаты, генерируемые + osqueryd +, записываются в файл с именем + osqueryd.results.log + в каталоге + / var / log / osquery +. Из коробки этот файл не существует. Он создается только при запуске демона и начинает генерировать результаты.

Вы можете запустить + osqueryd +, используя + systemctl + или + osqueryctl +. Оба выполняют одно и то же, поэтому не имеет значения, какой из них вы используете. + osqueryd + проверит наличие файла конфигурации при его запуске и предупредит вас, если он не найдет его. Он будет работать без файла конфигурации, хотя ничего полезного он не сделает.

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

sudo systemctl start osqueryd

Или вы можете ввести:

sudo osqueryctl start

Через несколько минут после запуска демона размер + / var / log / osquery / osqueryd.results.log + должен увеличиться. Вы можете увидеть это, набрав и повторив следующую команду:

ls -lh /var/log/osquery/osqueryd.results.log

Увеличение размера файла означает, что результаты запланированных запросов записываются на диск. К сожалению, osquery не имеет средства оповещения, такого как OSSEC, поэтому вы не сможете видеть результаты запланированных запросов, пока не просмотрите файл результатов. Вы можете сделать это с помощью команды + tail +, которая будет непрерывно передавать последние 10 строк этого файла на ваш экран:

sudo tail -f /var/log/osquery/osqueryd.results.log

Нажмите + CTRL + C +, чтобы остановить запись журнала.

В долгосрочной перспективе вы захотите отправить журнал результатов запросов на внешнюю платформу анализа, с которой вы можете работать. Возможные варианты с открытым исходным кодом: Doorman, Zentral и https://www.elastic.co/products/ elasticsearch [ElasticSearch].

Заключение

osquery - мощный инструмент, полезный для запуска одноразовых и запланированных запросов с использованием знакомого синтаксиса SQL. + osqueryi + - это компонент osquery для написания одноразовых запросов, а + osqueryd + для планирования запросов. Чтобы понять результаты запланированных запросов, вам необходимо отправить их на внешнюю платформу анализа журналов. Вы можете найти больше информации об osquery на https://osquery.io [https://osquery.io/].

Related