Для чего эта система

Данная система предназначена для учёта комплектующих в компьютерном парке, базирующемся на Windows. Я выложил систему под GNU/GPL v. 3 лицензией, так что денег не прошу, можете использовать как угодно... Все пожелания и т.п. обсуждаются отдельно...

Особенности и возможности

Система работает под управлением ОС GNU Linux (на данный момент успешно обкатана на ubuntu 20.04).  Система собирает информацию и создаёт оповещения в случае изменений в необходимых хостах (в частности информацию об:

  • мак адрес сетевого адаптера

  • ip адрес

  • имя хоста

  • информацию о мат. плате (по возможности и её серийный номер)

  • информацию о процессоре (по возможности и её серийный номер)

  • информацию об оперативной памяти (по возможности серийный номер, тип памяти - ECC или не ECC, объём)

  • видеоадаптер (с указанием PNP Device id)

  • жёсткие диски (можно опционально включить проверку тех, что подключены по USB или iSCSI) - серийный номер, модель, объём).

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


Доступ к системе регулируется на основе двух ролей - администраторов (могут менять системные настройки и менять перечень проверяемых сетей/хостов); менеджеров - могут только просматривать аналитику и данные по хостам.

Реальные кейсы применения

  1. Воруют периодически железо - если настроить обходчик на довольно частый период, то можно вполне поймать вора (так уже было обкатано и к товарищам полиционерам система отправила свою пачку не честных на руку граждан). В этом случае одной данной системы мало, лучше ещё запастись системой видео наблюдения и/или СКУДом... 

  2. Надо держать актуализированную информацию о железе в парке конторы, т.к. бывает её запрашивает бухгалтерия.

  3. Контролировать непонятные периодически возникающие на хостах флешки. На практике можно засечь, что кто-то периодически использует флешки со всякими странными метками в стиле kali linux :).

На текущий момент, в одной крупной сети система работает вне пределов проверяемой сети, так что админы, кои управляют данной сетью в сути не могут повлиять на данные, находящиеся в БД системы. Для такого достаточно виртуалку с данной системой расположить у себя на балконе на каком-нибудь хостинге и пробросить VPN до проверяемой сети. При этом на клиентских машинах ничего устанавливать НЕ НУЖНО.  Единственными условиями успеха проверки выступают открытый 135 tcp порт на проверяемых машинках и ваше знание о паре логина/пароля для авторизации на них. В реальном кейсе, на текущий момент обход и сбор информации с 370 хостов производится примерно за 2 минуты с тонко подкрученными настройками.

Как всё пашет под капотом

  1. Запускается nmap, в который передаются для проверки необходимые сети/хосты (к примеру 192.168.0.0/24 и заодно отдельно скажем проверить 192.168.22.2/32).

  2. Nmap быстренько проверяет открытость портов по указанным диапазонам и формирует список "живых" хостов.

  3. Далее по живым хостам начинается сбор информации о железе и прочем через протокол WMI.

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

  5. По мере получения инфы с хостов они сразу заносятся в БД и сопоставляются с ранее полученными данными по данному хосту. Опорной точкой сравнения является MAC адрес сетевого адаптера хоста

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

  7. Также по желанию может быть сформирован сводный отчёт, который полетит на почту.

Минимальные системные требования

Вполне подойдёт виртуалка со скромными параметрами (скажем пара ядер на проце, хотя бы 1024 мгб ОЗУ и места на диске гигов так в 15).

Установка

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

sudo -s
wget https://raw.githubusercontent.com/constantinekg/pcpo/main/doc/INSTALL.txt -O install.sh && chmod +x install.sh && ./install.sh

Первоначальная настройка

Администратор по умолчанию:
login: pcpoadmin
password: pcpoadmin1

Перед первым запуском необходимо войти в систему, открыв в браузере айпишник/доменное имя машинки, на которую была произведена установка. Далее перейти в раздел Настройки->Проверяемые сети/хосты и добавить необходимые диапазоны с указанием логина-пароля:

Далее идём в командную строку и выполняем первую проверку:

root@pcpo:~# /opt/pcpo/scanner/rerun.sh

По результату проверки можем зайти в аналитику и просмотреть полученную информацию:

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

После того, как все настройки будут выставлены - мы можем запланировать проверку на периодическую основу. Для этого откроем crontab (crontab -e) и добавим примерно такое:

#exec main data fetching process
3 */1 * * * /opt/pcpo/scanner/rerun.sh

Такая строчка позволит нам начинать проверку каждую третью минуту каждого часа. 

Ресурсы

Проект на гитхабе

Готовый образ машины в формате qcow2

Комментарии (25)


  1. raiSadam
    29.07.2021 08:32

    Полагаю, что при наличии других систем защиты сети, может случится детект при активном сканировании портов, это я к тому, что при наличии комплексной защиты предприятия, вариант с агентом предпочтительней, иначе придётся делать кучу настроек-исключений


    1. waxman435 Автор
      29.07.2021 11:27

      Да, но во-первых всегда можно сделать исключение для какого то source'а в системах защиты, а во-вторых задача изначально как раз состояла в том, чтобы не ставить что либо на клиентские машины.


  1. badmilkman
    29.07.2021 09:35
    -2

    Интересный костыль.

    Теперь по делу.

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

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

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


    1. waxman435 Автор
      29.07.2021 11:30

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


      1. NAI
        29.07.2021 12:36

        Не всегда есть возможность брать железо прям вот не разборное...

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

        Чаще всего системы учета нужны не для того чтобы кого-то ловить, а для бухгалтерии, "а какую именно память надо дозакупить в ПК" , списания старой техники и понимания где и что находится. Так же обычно прикручивают учет расходников (этакий складской учет для админов).

        В целом, конечно ITAM-систем на рынке не так уж и много (особенно бесплатно\оупенсоурсных)


        1. waxman435 Автор
          29.07.2021 12:57

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


    1. PATRI0T
      29.07.2021 11:50

      это как менять железо на неразборное?

      сразу весь парк компов?


  1. KeySOD
    30.07.2021 08:37

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


    1. waxman435 Автор
      30.07.2021 08:37

      Ок, учту пожелания.


  1. nightbrid
    01.08.2021 23:25

    Идея, конечно, неплохая - и учет и open source, но делать ключевым идентификатором MAC-адрес - в корне не правильно. Я собственно по этим строчкам кода:

    networkadapters = wmic.query("SELECT * FROM Win32_NetworkAdapterConfiguration")

    for nd in networkadapters:

    if len(re.findall(":", str(nd['MACAddress']))) == 5 and findWholeWord('WAN Miniport')\(str(nd['Description'])) == None:

    systeminfo.append(str(nd['MACAddress']))

    Но что будет, если MAC-адресов несколько (в лучшем случае), отвечающих условию, или, не дай бог, первыми живыми в DeviceID окажутся адреса виртуальных адаптеров - у кого-то WMvare, у кого-то VBox и т.д., причём с одинаковыми адресами на разных машинах - что при более-менее нормальном парке машин - далеко не редкость. В лучшем случае, Вы получите постоянное изменение оборудования на данных ПК (сегодня это будет один ПК, завтра - другой). IP-адреса, кстати, тоже будут меняться при нормально настроенном DHCP). Да даже просто наберите на каком-нибудь ноутбуке (без виртуалок): wmic nic list brief

    Получите 3-4 живых адаптера с MAC-адресами, описаниями (если full взять, а не brief) и не являющимися WAN Miniport.

    Посмотрите, как организованы базы и сканирование, в том числе через WMI (без агентов через VB-скрипт, да и с агентами) в ManageEngine ServiceDesk или в том же SCCM (даже он не может определить единственную сетевую карту при наличии виртуального адаптера). Весь смысл учёта в актуальности данных CMDB. Да, можно, конечно не разрастаться 1500 таблицами для реально нужной информации, но без уникальной идентификации ПК не обойтись.

    Про закрытый, наверняка, у какого-то немалого % ПК 135 порт или отключенную шибко умным пользователем с админскими правами WinRM или убитую в хлам базу WMI (Winmgmt) молчу - больно(.


    1. waxman435 Автор
      02.08.2021 06:16

      Разумно, учту, но пока что, в принципе... Обкатывали на парке (без виртуалок) в кол-ве в 370 компиков - повторов в принципе нет... Ну а про закрытые порты... Тут да - каждый в своей реальности...


      1. nightbrid
        02.08.2021 09:49

        Если требуется учитывать только доменные ПК, то в рамках AD имена объекта Computer будут уникальны, да и в DNS при регистрации через DHCP будет всегда текущий IP данного ПК. Но тогда и nmap не нужен - достаточно PS (Get-ADComputer). Всё равно недоменные ПК, выявленные через сканирование сети не будут доступны учетной записи с доменными правами для изучения.

        В общем же случае, если нужен именно учет, то лучше пнуть бухгалтерию и связать инвентарный номер из 1С с реальным ПК, например через расширенный атрибут объекта в AD:

        $comp = Get-ADComputer -Properties Name, extensionAttribute9 $pcname | Select-Object -Property Name, extensionAttribute9

        $invnum = $comp.extensionAttribute9

        Записывать его туда тоже желательно не руками, а скриптом, чтобы соблюсти уникальность. Да, имена ПК тоже могут меняться, например при перезаливке, замене комплектующих (сетевая, hdd, MB) - инвентарный до списания будет тот же.

        Ну а если учитывать все ПК (в том числе недоменные), то без своего, IT-шного уникального ID не обойтись.)

        А еще ведь есть наверняка сетевые принтеры, МФУ, коммутаторы и т.д, доступные по SNMP...

        В общем, удачи!


      1. nightbrid
        02.08.2021 10:31

        Да и на самих ПК проще разок прогнать скрипт PS для сбора необходимой информации, разрешив выполнение скрипта через групповые политики, например и подключив временно через net use сетевую папку на сервере, а дальше работать с полученным csv:

        # Получение характеристик текущего ПК и добавление их в файл на сервере
        $computerSystem = Get-WmiObject CIM_ComputerSystem
        $computerBIOS = Get-WmiObject Win32_BIOS|Select-Object SerialNumber,ReleaseDate
        $computerOS = Get-WmiObject CIM_OperatingSystem|Select-Object caption,Version,LastBootUpTime
        $computerCPU = Get-WmiObject CIM_Processor
        $Part = Get-WmiObject Win32_DiskPartition -Property *| Where-Object {$_.BootPartition -eq "True"}
        $PhDisk = Get-WmiObject Win32_DiskDrive |Where-Object {$_.Index -eq $Part.DiskIndex}
        $ComputerMAC=Get-WmiObject Win32_NetworkAdapter |where-Object {$_.PhysicalAdapter -eq "True" -And $_.NetEnabled -eq "True" -And $_.Name -NotLike "*Virtual*" -And $_.Name -NotLike "*Wire*" -And $_.Name -NotLike "*Bluetooth*"} |Select-Object -Property MACAddress,Name
        
        $PC_Name = $computerSystem.Name
        $PC_Man = $computerSystem.Manufacturer
        $PC_Mod = $computerSystem.Model
        $PC_SN = $computerBIOS.SerialNumber
        $PC_BIOS_date =[Management.ManagementDateTimeconverter]::ToDateTime($computerBIOS.ReleaseDate).ToString("G")
        $PC_CPU = $computerCPU.Name
        $PC_Speed = $computerCPU.MaxClockSpeed
        $DiskSize = "{0:N2}" -f ($PhDisk.Size/1GB)
        $PC_RAM = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)
        $PC_MAC = $ComputerMAC.MACAddress
        $PC_Net = $ComputerMAC.Name
        $PC_OS = $computerOS.caption
        $PC_Version = $computerOS.Version
        $PC_User = $computerSystem.UserName
        $PC_Last = [Management.ManagementDateTimeconverter]::ToDateTime($computerOS.LastBootUpTime).ToString("G")
        $Content = "$PC_Name;$PC_Man;$PC_Mod;$PC_SN;$PC_BIOS_date;$PC_CPU;$PC_Speed;$DiskSize;$PC_RAM;$PC_Net;$PC_MAC;$PC_OS;$PC_Version;$PC_User;$PC_Last"
        Add-Content -Value $Content -Path "Y:\PCInfo.txt"

        Зато потом можно показать начальству какой-нибудь красивый график в реальном времени):


        1. waxman435 Автор
          02.08.2021 12:28

          Ну это когда есть возможность что то там запустить на стороне компиков... И можешь ходить и что то там монтировать... Плюс - даже если ты получишь из AD'а перечень машинок, то не факт что та или иная машинка на момент проверки будет включена или доступна как таково... В принципе - если на машинке изменится айпишник или имя хоста, то это будет расценено как изменение и об этом изменении тупо притопает уведомление, ну и в отчёте будет отражено... Графики можно в принципе нарисовать какие угодно...


          1. nightbrid
            02.08.2021 20:11

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

            Решается через ГП и сервисную учётку, входящую в группу локальных администраторов на ПК.

            Плюс - даже если ты получишь из AD'а перечень машинок, то не факт что та или иная машинка на момент проверки будет включена или доступна как таково...

            Когда включится, тогда и отправит отчёт - мы ведь не спешим)

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

            Имя хоста меняется только специалистом техподдержки и по согласованным правилам. Смена IP (воткнули в другую розетку, включили через время, превышающее время аренды в DHCP) ни на что не влияет. Речь о первоначальном сборе информации. Дальше - запрашиваешь изменения конфигурации по имени хоста хоть каждый час.

            Исключения - пользователь с административными правами исключил сервисную учётную запись (группу) из группы локальных администраторов, установил сторонний антивирус, отключил службы управления и т.п. - если не лечится через ГП, то блокировка в AD как юзера, так и ПК + блокировка MAC-адреса на коммутаторе до выяснения. После выяснения - в лучшем случае обычный юзер.

            Из практики на 5т юзеров / 3т+ ПК таких деятелей встречается максимум 20 человек/ПК - на статистику не влияет).


            1. nightbrid
              02.08.2021 20:25

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


              1. waxman435 Автор
                02.08.2021 21:59

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


            1. waxman435 Автор
              02.08.2021 21:58

              Ну это в вашей реальности всё так устроено... В моей реальности в принципе смена имени хоста - не такая уж и редкая история (они могут меняться динамически вполне)... Ну и сетки где нет AD'a тоже как бы имеются... Тут как бы не существует швейцарского ножа... Я учту замечания и пожелания, но в эту сторону (в плане что то там на хосты заливать, через ГП выполнять и т.п.) - расширяться сей проект не будет...


              1. nightbrid
                02.08.2021 22:24

                Ну это в вашей реальности всё так устроено... 

                Конечно, у каждого своя реальность.) Вы пишите проект прежде всего для себя и под свои нужды, а потом уже open source, если кому-то подойдет Ваша концепция, иначе это уже стоит денег). Просто делюсь опытом - нам вполне хватает SCCM для управления, связанного с ним SD для техподдержки и учёта + вывод дополнительных отчётов в дашборд SD для руководства в виде виджетов PBI, если таковых не хватает в самих SCCM и SD). В любом случае, надо отталкиваться от регламентов и культуры организации, ну и постоянно совершенствоваться)


                1. nightbrid
                  02.08.2021 22:50

                   Ну и сетки где нет AD'a тоже как бы имеются

                  P.S. Разумеется, в современной организации до 30%-40% подключенных к сети ПК (ноутбуков) и 99% подключенных по Wi-Fi смартфонов могут быть не доменными, а значит неуправляемыми службой IT, опять таки вопрос к регламентам - куда Вы их пускаете в Вашей локальной сети - если только к Интернет, то вопросов нет и учитывать, я думаю, Вы их просто не захотите - они же, как правило личные, ну, или, как минимум необслуживаемые в полном объеме. И уж тем более Вы не станете, надеюсь, их nmap'ить и брутфорсить, чтобы получить к ним доступ и считать конфигурацию). А вот если Вы захотите пустить их к внутренним ресурсам...


                  1. nightbrid
                    02.08.2021 23:14

                    если только к Интернет

                    PPS. Тут тоже куча нюансов, особенно для сетевиков и безопасников. Регламенты приплывают и сверху в организацию). Как минимум, доступ к проводной сети/Wi-Fi только идентифицированным пользователям, гостям - как минимум по номеру телефона, с логированием для очень проверяющих органов (ACL, отдельные VLAN и т.д.), а если ещё и несовершеннолетние в сети присутствуют (отдельный DNS с блокировкой нежелательного трафика и т.д.). Тут только серьёзный LMS поможет с контролем подключенных устройств.


                  1. waxman435 Автор
                    03.08.2021 06:23

                    Никто ничего не брутфорсит... Всё просто - открыт порт на хосте или нет... И да- ничего не получится узнать, если ты не в курсе того, что за учётки на хосте... А по поводу регламентов - тут у каждого свои...


                1. waxman435 Автор
                  03.08.2021 06:19

                  Если вопрос в том, что пригодилось сие кому то или нет - пригодилось...


  1. kolossradosskiy
    25.08.2021 19:44

    Софт, как я понимаю, еще не планировали инвентаризировать в вашей утилите?


    1. waxman435 Автор
      30.09.2021 13:15

      Этого в задачах не стояло...