Мониторинг безопасности системы с помощью osquery в Ubuntu 16.04

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

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

osquery позволяет запускать команды типа select * from logged_in_users ;.

+-----------+----------+-------+------------------+------------+------+
| 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      | 8host    | 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, которые необходимы для корректной работы osquery.
  • Создать конфигурационный файл, который смогут использовать инструменты osqueryi и osqueryd.
  • Разобраться с пакетами osquery (это группы предопределенных запросов, которые можно добавить в расписание).
  • Выполнить специальные запросы osqueryi, чтобы обнаружить проблемы безопасности.
  • Запустить демон, который автоматизирует запуск запросов.

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

Требования

1: Установка osquery

osquery можно скомпилировать из исходного кода или установить с помощью менеджера пакетов. Репозиторий Ubuntu готовых пакетов не предлагает, потому нужно добавить в систему официальный репозиторий osquery для 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

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

osquery 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

Эта команда откроет интерактивную оболочку, где вы увидите такой результат:

I0105 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/8host/.osquery/shell.em
Using a virtual database. Need help, type '.help'
osquery>

Судя по сообщениям об ошибках в выводе, не все компоненты osquery работают корректно. Отдельные запросы (например, select * from yara ;) не возвращают ничего – это значит, что таблица еще не заполнена данными.

Другие запросы (типа select time, severity, message from syslog ;) возвращают такие сообщения:

W1202 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, какой конвейер использовать для записи и какие параметры syslog записывать. По умолчанию используется /var/osquery/syslog_pipe. Затем osquery заполнит таблицу syslog информацией, записанной в этот конвейер.

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

/etc/rsyslog.conf
template(
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")

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

Перезапустите демон:

sudo systemctl restart rsyslog

3: Конфигурационный файл osquery

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

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

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

Файл будет состоять из трех разделов:

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

Ниже вы найдете список опций, которые будут использоваться в конфигурационном файле, их описания и рекомендуемые значения. Этих опций будет достаточно для запуска osqueryi и osqueryd в 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: когда на один и тот же интервал запланировано большое количество запросов, этот параметр разбрасывает их, чтобы снизить влияние на производительность сервера. Значение по умолчанию 10 (определяется в процентах).
  • pidfile: указывает, куда записывать id демона 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 был доступ к информации syslog, установите значение true.
  • schedule_default_interval: это значение используется, если интервал запланированных запросов не установлен. Определяется в секундах. Выберите значение 3600.

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

Создайте и откройте файл:

sudo nano /etc/osquery/osquery.conf

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

Читайте также: Основы работы с JSON

{
"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 секунд.

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

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

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

"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


}

},

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

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

"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.

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

"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"
}
}

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

{
"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

Если в файле нет ошибок, команда вернет:

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

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

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

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

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

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

Теперь создайте пакет, который будет мониторить события в файлах каталогов /home, /etc и /tmp каждые 300 секунд. Скопируйте и вставьте в файл эти строки:

{
"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

Добавьте новую строку в раздел packs:

...
"packs": {
"fim": "/usr/share/osquery/packs/fim.conf",
"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

5: Проверка безопасности с помощью osqueryi

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

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

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

Примечание: Опция verbose очень полезна для osqueryi и osqueryd, поскольку она отображает все ошибки или предупреждения, которые могут указывать на проблемы с osquery. Как правило, osqueryi можно запускать без привилегий root, но если вы вызываете osqueryi, указав конфигурационный файл демона, вы должны делать это через root.

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

select * from logged_in_users ;
+-----------+----------+-------+------------------+------------+------+
| 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      | root     | pts/0 | 11.11.11.11      | 1483580584 | 1752 |
| user      | 8host    | pts/1 | 11.11.11.11      | 1483580770 | 4057 |
+-----------+----------+-------+------------------+------------+------+

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

Этот запрос сообщает вам о том, какие пользователи вошли в систему на данный момент. Чтобы узнать, кто заходил в систему ранее, отправьте запрос таблице last:

select * from last ;

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

+----------+-------+------+------+------------+------------------+
| 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 |                  |
| root     | pts/0 | 1752 | 7    | 1483580584 | 11.11.11.11      |
| 8host    | pts/1 | 4057 | 7    | 1483580770 | 11.11.11.11      |
+----------+-------+------+------+------------+------------------+

Чтобы узнать, как работает брандмауэр, введите:

select * from iptables ;

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

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

select chain, policy, src_ip, dst_ip from iptables ;

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

+---------+--------+---------+-----------+
| 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   |
+---------+--------+---------+-----------+

Этот запрос поможет вам найти вредоносное ПО, запуск которого запланирован через определенные промежутки времени:

select command, path from crontab ;

Любая подозрительная команда в выводе нуждается в дополнительной проверке:

+------------------------------------------------------------------------------------------------+--------------------------------+
| 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 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 ;

Вот фрагмент вывода:

+-------------------------------+----------+-----------+-------------+
| 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, вывод будет таким:

+-------+------+----------+--------+---------+
| 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 ;
  • На выходе отображаются все последние операции над файлами на сервере, а также идентификатор пользователя, который отвечает за ту или иную операцию.

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

Многие запросы позволяют определить потенциальные проблемы безопасности.

Чтобы уточнить схему таблицы, введите:

.schema name-of-table

Чтобы просмотреть доступные таблицы:

.tables

Среди пакетов, которые поставляются с osquery, есть еще много полезных примеров. Многие пакеты следует запускать периодически.

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 не имеет средств оповещения, поэтому вы не сможете увидеть результаты запланированных запросов, если не просмотрите файл самостоятельно. Вы можете сделать это с помощью команды tail, которая будет непрерывно передавать последние 10 строк этого файла на ваш экран:

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

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

В дальнейшем вы сможете отправить лог результатов запросов на внешнюю платформу для анализа. Для этого существует несколько средств с открытым исходным кодом (Doorman, Zentral и ElasticSearch, например).

Tags: ,