Как узнать, какие USB устройства подключались к Linux


Как узнать о том, что посторонние копировали файлы с компьютера

Устройства с USB разъёмом являются самыми распространёнными — ими могут быть накопители информации (флэшки, внешние диски), клавиатуры, мыши, телефоны, принтеры, звуковые платы и наушники и даже специальным образом запрограммированные устройства для, например, обхода ввода пароля для разблокировки экрана и так далее.

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

Эта статья посвящена программе usbrip. Она помогает разобраться в истории подключения USB устройств к компьютеру на Linux за последние месяцы. Возможно вы уже знаете об этой программе и об её ограничениях — но не спешите «переключаться» - в этой статье я покажу, как можно обрабатывать журнал syslog даже на тех компьютерах, где syslog не настроен на работу с форматом даты, который требует usbrip (по умолчанию на большинстве дистрибутивов), а также как использовать usbrip на компьютерах где вообще нет syslog (например в Arch Linux и производных дистрибутивах, где syslog по умолчанию отсутствует, а все его функции выполняет journal от systemd).

Ошибка «Wrong timestamp format found in "/var/log/syslog"»

Ситуация следующая: usbrip в своей работе использует файлы /var/log/syslog* или /var/log/messages*. После недавних обновлений usbrip, эта программа может работать только с подробным форматом времени, который нужно специально настроить для syslog.

Получается что нужно удалить старые журналы и анализировать можно только данные с момента настройки syslog, а информация за последние пару месяцев пропадёт.

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

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

sudo pip3 install usbrip==2.1.3

Но это не решает проблему анализа журнала syslog на дистрибутивах, где syslog не установлен. Конечно, вариант со старой версией мне не очень нравится. Поэтому я написал команды, которые конвертируют дату из старого формата в новый. То есть можно не менять формат файлов syslog, можно использовать журналы syslog с других компьютеров и самая последняя версия usbrip будет успешно с ними работать!

Но начнём, всё-таки, с установки usbrip.

Как установить usbrip

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

Установка в Kali Linux

Самый простой вариант установки:

sudo pip3 install usbrip

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

sudo apt install python3-venv p7zip-full -y
git clone https://github.com/snovvcrash/usbrip
cd usbrip/
chmod +x ./installers/install.sh
sudo -H ./installers/install.sh -s
cd
usbrip -h

Если хотите, вы можете настроить формат даты в syslog специально для usbrip. Дата станет более детальной (например, там появится год). В случае выполнения этой настройки, вы сможете напрямую работать с файлами журналов /var/log/syslog* или /var/log/messages* в usbrip без необходимости их конвертации. Как это сделать рассказано в разделе «Структура системных логов».

Установка в BlackArch

sudo pip3 install termcolor terminaltables tqdm
sudo pacman -S usbrip
sudo usbrip ids download

В BlackArch и ArchLinux syslog вообще отсутствует по умолчанию, поэтому менять формат даты негде. Но это не будет проблемой — мы также сможем узнать, когда и какие USB подключались к нашей системе.

Как посмотреть историю подключения USB в Linux

Итак, если вы изменили формат даты для syslog, то достаточно запустить программу следующим образом:

usbrip events history

Программа сама найдёт файлы журналов и, если всё в порядке (файлы журналов найдены, в них верный формат даты и имеются события с USB устройствами), то выведет:

[?] How would you like your event history list to be generated?

    1. Terminal stdout
    2. JSON-file

[>] Please enter the number of your choice (default is 1): 

Она спрашивает, хотим ли мы вывести данные в стандартный вывод (на экран) или же сохранить их в файл JSON. Если вы хотите вывести данные на экран, то достаточно нажать ENTER, поскольку первый вариант выбран по умолчанию.

Будет выведена примерно следующая таблица:


Поля в ней означают следующее:

  • Connected (дата и время подключения устройства)
  • User (видимо, подразумевается пользователь системы, но у меня здесь имя хоста)
  • VID (vendor ID — идентификатор производителя)
  • PID (product ID — идентификатор продукта)
  • Product (продукт)
  • Manufacturer (производитель устройства)
  • Serial Number (серийный номер устройства)
  • Port (USB порт к которому выполнено подключение)
  • Disconnected (дата и время отключения устройства)

Как конвертировать дату в файле syslog для usbrip

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

По этой причине можно без проблем конвертировать файл в формат, который будет поддерживать usbrip.

В следующей команде я конвертирую файл /var/log/syslog и сохраняю новый результат в usb2.0.txt — при желании, измените эти данные в команде:

cat /var/log/syslog | awk '{system( "date -d\"" $1 " " $2 " " $3 "\" -Ins | tr -d \"\\n\" | sed 's/,0000/.0/'" ); $1=$2=$3=""; print $0}' | sed 's/   / /' > usb2.0.txt

Будет создан файл usb2.0.txt, который сможет открыть usbrip.

Как использовать usbrip в Arch Linux, BlackArch и их производных

Как уже было сказано, в этих системах отсутствует syslog, её функции поглощены программой journalctl. Именно по этой причине нет смысла устанавливать и запускать syslog (хотя, естественно, это возможно). Достаточно конвертировать вывод программы journalctl.

Новый вариант конвертации:

Сохраняем вывод программы journalctl в файл usb.txt:

journalctl -o short-iso-precise > usb.txt

А далее мы конвертируем файл в понятный для usbrip формат (то есть в syslog):

cat usb.txt | awk '{print $1,$2,$3,"[]",$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20}' | sed 's/00 /:00 /' > usb2.0.txt

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

Обратите внимание, что данные считываются из файла usb.txt и сохраняются в файл usb2.0.txt — при желании, отредактируйте эти значения под свои.

Старый вариант конвертации (не используйте его)

Есть ещё один вариант с использованием утилиты date. Этот вариант довольно медленный:

Программа journalctl выводит названия месяцев на русском (если у вас установлена русская локаль). Такой формат (на русском) не понимает ни usbrip, ни утилита date. Поэтому начать нужно с установки английской локали следующей командой:

export LANG=en_US.utf-8

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


Теперь мы сохраняем вывод программы journalctl в файл usb.txt:

journalctl > usb.txt

А далее мы конвертируем файл в понятный для usbrip формат (то есть в syslog):

cat usb.txt | awk '{system( "date -d\"" $1 " " $2 " " $3 "\" -Ins | tr -d \"\\n\" | sed 's/,0000/.0/'" ); print "",$4,$5,"[]",$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20}' > usb2.0.txt

Файл размером 147 мегабайт (1.233.656 строк) на моей системе обрабатывался очень долго — 1-2 часа, правда центральный процессор практически не был загружен. То есть если у вас большой файл, то запаситесь терпением.

Как в usbrip проверить файл с другой системы

В usbrip можно указать файл из которого нужно брать данные для анализа, для этого используется опция -f, например, я хочу найти события подключения и отключения к USB интерфейсу в файле usb2.0.txt:

usbrip events history -f usb2.0.txt

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

Ниже самый конец данных из journalctl на моей домашней системе:

Как узнать тип USB устройства и его производителя

Предположим, меня заинтересовала следующее устройство:

┌USB-History-Events───┬──────────┬──────┬──────┬─────────────────────────┬────────────────────────────────────┬──────────────────┬──────┬─────────────────────┐
│           Connected │     User │  VID │  PID │                 Product │                       Manufacturer │    Serial Number │ Port │        Disconnected │
├─────────────────────┼──────────┼──────┼──────┼─────────────────────────┼────────────────────────────────────┼──────────────────┼──────┼─────────────────────┤
│ 2019-08-26 11:42:21 │ HackWare │ 152d │ 0578 │                  JMS579 │                            JMicron │   3097E912395377 │  2-5 │ 2019-08-26 11:42:33 │

С помощью usbrip я могу выполнить поиск по базе данных по VID и PID.


Начнём с загрузки базы данных:

sudo usbrip ids download

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

usbrip ids search --vid 152d --pid 0578 --offline

Значимые строки:

Vendor:   JMicron Technology Corp. / JMicron USA Technology Corp.
Product:  JMS567 SATA 6Gb/s bridge

Опции --vid и --pid необязательно использовать одновременно — можно выполнять поиск по любой из них.

Настройка выводимых данных


Использование опции -q приведёт к подавлению вывода банера, информационных сообщений, также программа не будет спрашивать, как вывести данные (консоль или JSON). Данные можно показать не в виде таблицы, а в виде списка — для этого опция -l. Наконец, с помощью опции -n можно ограничить вывод только определённым числом последних записей. Пример использования все этих опций:

usbrip events history -ql -n 100 -f usb2.0.txt

Вывод информации только по съёмным устройствам, по определённому USB устройству или за конкретные дни

Программа usbrip поддерживает следующие виды фильтров:

1. Показ только сменных устройств. На самом деле, со 100% уверенностью трудно сказать, какие устройства являются отключаемыми. Но можно поступить хитро — если это устройство уже БЫЛО отключено, значит, оно легко отключаемое! Это очевидно. Легко отключаемые устройства, например, сменные дисковые накопители и флэшки представляют наибольший интерес в случае несанкционированного доступа.

Для применения этого фильтра используется опция -e:

usbrip events history -e -f usb2.0.txt

2. Фильтрация по полям таблицы, опции: --user, --vid, --pid, --product, --manufact, --serial, --port

Пример:

usbrip events history --vid 152d --pid 0578 -f usb2.0.txt

То есть можно комбинировать несколько опций для фильтрации данных. Либо можно использовать опции по одной. Название опций говорит само за себя, если же вам что-то непонятно, то смотрите подробную справку по ним на странице: https://kali.tools/?p=4873. После опции можно указать несколько значений через пробел.

3. Сортировка по дате. Для этого используется опция -d:

usbrip events history -c conn vid pid disconn serial -d '2019-08-24' '2019-08-25' -f usb2.0.txt

Обратите внимание, что при указании двух дней не создаются диапазоны! То есть если вы указали два дня, то будут взяты данные только для этих двух дней!

Показ только определённой информации

В предыдущем примере использовалась опция -c, после которой перечислены столбцы conn vid pid disconn serial — это приводит к тому, что будет выведена только информация по этим столбцам.

Название всех столбцов (нужно указывать их без кавычек через пробел): "conn", "user", "vid", "pid", "prod", "manufact", "serial", "port", "disconn".

Создание списка доверенных устройств

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

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

Составить список доверенных устройств можно командой usbrip events gen_auth несколькими способами. Рассмотрим обязательные опции.

Во-первых, нужно указать файл, куда будет сохранён этот список, в моём случае путь до файла ~/auth.json. Затем нужно указать атрибуты для включения в список авторизованных устройств, это делается опцией -a после которой через пробел без кавычек можно указать одно или более полей: "vid", "pid", "prod", "manufact", "serial".

Далее нужно указать устройства, которые мы хотим добавить. Можно использовать рассмотренные выше фильтры. К примеру, я добавлю устройства по их VID, для этого я указываю опцию --vid и после неё через пробел перечисляю все идентификаторы производителей, которые я хочу добавить.

В результате получается команда:

usbrip events gen_auth ~/auth.json -a vid pid serial --vid 04d9 0b05 1d6b 13d3 8087 13fe 148f 0cf3 04e8 152d 14cd -f usb2.0.txt

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

usbrip events gen_auth ~/auth.json -a vid pid serial -d '2019-08-24' '2019-08-24' '2019-08-26' -f usb2.0.txt

Выявление подключения чужих USB устройств к компьютеру в Linux

Для проверки используется команда usbrip events violations, после которой достаточно указать файл со списком доверенных устройств:

usbrip events violations ~/auth.json -f usb2.0.txt

Пример вывода в моём случае:

Я вначале немного напрягся, но потом вспомнил о других своих устройствах. То, которое является многократным «нарушителем» - это ещё один внешний USB диск (точнее обычный диск, подключаемый к ноутбуку через SATA-USB переходник).

Освежить память помогла команда:

usbrip ids search --vid 152d --pid 0539 --offline

Её результат:

Vendor:   JMicron Technology Corp. / JMicron USA Technology Corp.
Product:  JMS539/567 SuperSpeed SATA II/III 3.0G/6.0G Bridge

На той коробке тоже так и написано, «SuperSpeed».

Второе устройство, которое 2307 Boot ROM и Phison меня озадачило чуть сильнее. Это оказались не USB наушники и даже не тачпад ноута. Это оказалась моя же флешка, на который был создан раздел EFI для обновления БИОСа на моём ноутбуке. Возможно, она распозналась таким необычным образом из-за того, что компьютер был загружен вместе с ней или ещё по каким-то причинам. Мораль: не надо спешить высаживаться на измену если получены неожиданные результаты.

И вторая мораль: VID и PID могут меняться при некоторых условиях или система может видеть их иначе, опять же, при некоторых условиях. Серийный номер USB устройств также может быть подменён, по крайней мере для некоторых устройств.

Сохранение результатов в файл

Если при обработке файла выбрать вторую опцию:

    2. JSON-file

То программа предложит ввести путь до файла (или принять значение по умолчанию) — полученные данные будут сохранены в формате JSON.

Также можно перенаправить вывод программы в файл (не забудьте опцию -q для отключения запроса пользователю):

usbrip events history -f usb2.0.txt -q -t > usb.info

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

Команда usbrip storage позволяет сохранять/обновлять/просматривать информацию об истории и нарушениях USB устройств. Подробности смотрите в справке https://kali.tools/?p=4873

Информация будет заархивирована. На архив можно установить пароль.

Пример добавления службы в Cron вы найдёте в файле /usr/usbrip/cron/usbrip.cron. Информацию о настройке Cron вы найдёте в этой статье.

Анализ только последних записей

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

cat исходный_файл | tail -n 1000 > новый_файл

Если вы конвертируете данные из journalctl, то вы также можете установить дату, после которой вы хотите получить данные.

Всегда нужно начинать с переключения локали (иначе полученный файл будет непонятен программам):

export LANG=en_US.utf-8

Если я хочу получить информацию о событиях после определённой даты, то нужно использовать опцию -S, после которой нужно указать дату в формате ГГГГ-ММ-ДД, например:

journalctl -S 2019-08-27 > usb.txt

Далее используем уже знакомую команду для конвертации в формат syslog:

cat usb.txt | awk '{system( "date -d\"" $1 " " $2 " " $3 "\" -Ins | tr -d \"\\n\" | sed 's/,0000/.0/'" ); print "",$4,$5,"[]",$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20}' > usb3.0.txt

И запускаем usbrip с опцией -f, указав подготовленный файл:

usbrip events history -f usb3.0.txt

Заключение

Итак, мне программа usbrip показалась очень интересной — она выжимает всё, что возможно из системных журналов по событиям, связанным с USB интерфейсом (если, к примеру, у какого-то USB устройства не указан серийный номер, значит и система его тоже не знает). А с учётом возможности конвертировать файлы, это делает её очень универсальной.

О других опциях и подкомандах смотрите на странице https://kali.tools/?p=4873.


Рекомендуется Вам:

3 комментария to Как узнать, какие USB устройства подключались к Linux

  1. Аноним:

    hi. I can't speak russian .sorry. But did you know you could use `journalctl -o short-iso-precise` to get precise timestamp without using intermediate file or english locale ?

    • Alexey:

      Man, you rule! Thank you for this great tip!

      It is still necessary to adjust the string, because date in journalctl is:

      2019-06-12T04:04:18.011006+0300

      But usbrip accepts:

      2019-08-27T08:56:19.000000+03:00

      As well, we should insert “[]” in the string. But this way let us get the file in usbrip’ format for seconds, as my previous way requires some hours for big files.

      I edited this article already. By the way, do you know about English version: https://miloserdov.org/ ? This article there https://miloserdov.org/?p=3371

  2. Alexey:

    Народ, благодаря подсказке из предыдущего комментария, для тех, кто конвертирует из journalctl, теперь процесс занимает секунды, а не часы. Видимо, утилита date очень медленная и из-за неё была такая маленькая скорость. В новом варианте указывается опция, благодаря которой journalctl сразу выводит почти правильную строку. Нужно только в дату добавить двоеточие, и в саму строку добавить поле «[]». Новые команды уже добавил в статью.

Добавить комментарий для Alexey Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *