Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог
Системы

Удаленная диагностика сети

Удаленная диагностика сети
Системы

Администраторы информационных систем (далее ИС) часто сталкиваются с ситуацией, когда пользователь жалуется на недоступность ИС. При этом, ИС доступна у администратора ИС и других пользователей. Первое что требуется в этой ситуации сделать — получить диагностическую информацию с персонального компьютера (далее ПК) пользователя:

  1. Конфигурация IP на ПК пользователя;
  2. Доступность ИС с ПК пользователя.

Как это сделать? Можно попросить собрать подобную информацию пользователя. Однако, это не всегда возможно из-за недостатка квалификации пользователя для сбора подобной информации. Также препятствием может быть запрет на передачу подобной информации по сети от пользователя до администратора ИС.

Ниже представлены полные готовые наборы файлов для Windows и Linux, которые собирают диагностическую информацию о доступности ИС, а в более сложных версиях шифруют её в файл (так, что запускающий не может расшифровать), а также расшифровывают результат у создателя скрипта. Файлы для сбора данных можно отправить пользователю, который хочет увидеть, но видит определенный ресурс, для диагностики доступности этого ресурса именно с машины пользователя. Позвоню запускает файл со скриптом, получает зашифрованный файл с результатом и отправляет его создателю скрипта. Подобный дистанционный сбор данных об определенных участках сети должен обеспечить конфиденциальность собираемой информации.

🪟 Windows (PowerShell)¶

Самое простое решение — создать файл PowerShell с разрешением .ps1 и кодом, собирающим всю необходимую информацию и пакующим её в отдельный файл, отправить этот файл пользователю и попросить его запустить этот файл на его ПК. Для запуска файла CreateNetworkReport.ps1, пользователю требуется скачать его в одну из директорий на своем ПК, запустить файл, нажав «Выполнить с помощью PowerShell» в контекстном меню этого файла, и отправить полученный файл NetworkReport.txt администратору ИС.

Файл CreateNetworkReport.ps1¶

# CreateNetworkReport.ps1

# Parameters
param(
    [string]$TargetComputer = "yandex.ru",
    [int]$TargetPort = 80,
    [string]$OutputFile = "NetworkReport.txt"
)

# A complex set of parameters
#param(
#    [string]$TargetComputer = $(Read-Host "Введите имя компьютера для проверки"),
#    [string]$TargetIP = $(Read-Host "Введите IP для проверки"),
#    [int]$TargetPort = $(Read-Host "Введите порт"),
#    [string]$OutputEncrypted = "NetworkReport_$(Get-Date -Format yyyyMMdd_HHmmss).txt"
#)

# IP detection
function Get-MyIP {
    $ip = Get-NetIPAddress -AddressFamily IPv4 | Where-Object { 
        $_.InterfaceAlias -notlike "*Loopback*" -and $_.PrefixOrigin -ne "WellKnown" 
    } | Select-Object -First 1
    if ($ip) { return $ip.IPAddress } else { return "Не удалось определить IP" }
}

# Analysis
$report = @"


========================================
     Datetime:  $(Get-Date -Format "yyyy.MM.dd HH:mm:ss")
     User IP:   $(Get-MyIP)
     User host: $env:COMPUTERNAME
========================================


===== User IP configuration =====


----- ipconfig -----

$(ipconfig /all | Out-String)


===== Target system IP =====


----- ping -----

$(ping -a $targetIP | Out-String)


------ Test-NetConnection (-Port $TargetPort) ------  
$(Test-NetConnection -ComputerName $TargetIP -Port $TargetPort -InformationLevel Detailed -ErrorAction SilentlyContinue | Out-String)
------ Test-NetConnection (-Port ) ------
$(Test-NetConnection -ComputerName $TargetIP -CommonTCPPort HTTP -InformationLevel Detailed -ErrorAction SilentlyContinue | Out-String)
"@

# Create report file
$report | Out-File -FilePath $OutputFile -Encoding UTF8

🪟 Windows (PowerShell + сертификаты)¶

В случае, если существует запрет на передачу данных о конфигурации IP на ПК пользователя и IP ИС, то можно данные зашифровать открытым ключом на ПК пользователя и расшифровать на ПК администратора ИС. Подобная манипуляция потребуется создания закрытого и открытого ключа шифрования. Ниже представлены полные готовые наборы файлов для Windows (далее и для Linux), которые собирают диагностическую информацию, шифруют её в файл (так, что запускающий не может расшифровать), а также расшифровывают результат у системного администратора, сгенерировавшего ключ.

1. Подготовка сертификата (выполняется один раз на машине создателя скрипта)¶

Для создания и установки сертификата через PowerShell требуется выполнить команды из файла CreateCert.ps1, находящегося в одной директории с CreateCert.inf. В результате выполнения файла CreateCert.ps1 в той же директории появиться файл открытого ключа Diagnostics.cer сертификата.

Файл CreateCert.inf¶

[Version]
Signature = "$Windows NT$"

[Strings]
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_DOCUMENT_ENCRYPTION = "1.3.6.1.4.1.311.80.1"

[NewRequest]
Subject = "cn=NetworkReportEncryptor"
MachineKeySet = false
KeyLength = 2048
KeySpec = AT_KEYEXCHANGE
HashAlgorithm = Sha256
Exportable = true
RequestType = Cert
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE | CERT_DATA_ENCIPHERMENT_KEY_USAGE"
ValidityPeriod = "Years"
ValidityPeriodUnits = "1000"

[Extensions]
%szOID_ENHANCED_KEY_USAGE% = "{text}%szOID_DOCUMENT_ENCRYPTION%"

Файл CreateCert.ps1¶

# CreateCert.ps1

param(
    [string]$certSubject = "cn=NetworkReportEncryptor",
    [string]$infFile = "CreateCert.inf",
    [string]$cerFile = "NetworkReport.cer"
)

# Verifying the existence of the certificate
$existingCert = Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Subject -eq $certSubject }

# IIf the certificate exists
if ($existingCert) {	
    # Remove old certificate
    # (uncomment if you want to delete old certificates)
    #foreach ($cert in $existingCert) {
    #	Remove-Item -Path $cert.PSPath -DeleteKey -Force
    #}
}

# IIf the certificate does not exist
if (-not $existingCert) {
    # Create new certificate
    certreq -new $infFile $cerFile

    # Import new certificate
    Import-Certificate -FilePath $cerFile -CertStoreLocation Cert:\CurrentUser\My
}

2. Скрипт сбора и шифрования¶

Файл CreateNetworkReport.ps1 требуется отправить на целевой компьютер вместе с файлом открытого ключа Diagnostics.cer. В рузельтате выполнения файла сформируется зашифрованный файл NetworkReport.cms. Если владелец или пользователь целевого компьютера должен самостоятельно запустить файл CreateNetworkReport.ps1, то желательно этот файл вместе с файлом открытого ключа запаковать в архив NetworkReport.zip и выслать ему, например, письмом вместе с краткой инструкцией:

Для анализа доступности ИС с вашего компьютера выполните следующие действия:

  1. Скопируйте приложенный к этому письму архив NetworkReport.zip себе на компьютер, например, в папку «Мои документы.
  2. Разархивируйте содержимое архива в ту же папку, куда скопировали архив.
  3. В скопированной папке выполните файл CollectAndEncrypt.ps1, нажав «Выполнить с помощью PowerShell» в контекстном меню этого файла.
  4. Если после минуты-двух ожидания в той же разархивированной папке появится файл NetworkReport.cms, то отправьте его мне в ответном письме.
txt

Файл CreateNetworkReport.ps1¶

# CreateNetworkReport.ps1

# Parameters
param(
    [string]$TargetComputer = "yandex.ru",
    [int]$TargetPort = 80,
    [string]$CertSubject = "cn=NetworkReportEncryptor",
    [string]$OutputEncrypted = "NetworkReport.cms"
)

# A complex set of parameters
#param(
#    [string]$TargetComputer = $(Read-Host "Введите имя компьютера для проверки"),
#    [string]$TargetIP = $(Read-Host "Введите IP для проверки"),
#    [int]$TargetPort = $(Read-Host "Введите порт"),
#    [string]$CertSubject = "cn=Diagnostics Encryptor",
#    [string]$OutputEncrypted = "NetworkReport_$(Get-Date -Format yyyyMMdd_HHmmss).cms"
#)

# IP detection
function Get-MyIP {
    $ip = Get-NetIPAddress -AddressFamily IPv4 | Where-Object { 
        $_.InterfaceAlias -notlike "*Loopback*" -and $_.PrefixOrigin -ne "WellKnown" 
    } | Select-Object -First 1
    if ($ip) { return $ip.IPAddress } else { return "Не удалось определить IP" }
}

# Analysis
$report = @"


========================================
     Datetime:  $(Get-Date -Format "yyyy.MM.dd HH:mm:ss")
     User IP:   $(Get-MyIP)
     User host: $env:COMPUTERNAME
========================================


===== User IP configuration =====


----- ipconfig -----

$(ipconfig /all | Out-String)


===== Target system IP =====


----- ping -----

$(ping -a $targetIP | Out-String)


------ Test-NetConnection (-Port $TargetPort) ------  
$(Test-NetConnection -ComputerName $TargetIP -Port $TargetPort -InformationLevel Detailed -ErrorAction SilentlyContinue | Out-String)
------ Test-NetConnection (-Port ) ------
$(Test-NetConnection -ComputerName $TargetIP -CommonTCPPort HTTP -InformationLevel Detailed -ErrorAction SilentlyContinue | Out-String)
"@

# Create temporary report file
$tempFile = [System.IO.Path]::GetTempFileName()
$report | Out-File -FilePath $tempFile -Encoding UTF8

# Creating an encrypted report file and deleting the temporary file
try {
    Protect-CmsMessage -Path $tempFile -To $CertSubject -OutFile $OutputEncrypted
    Remove-Item $tempFile -Force
} catch {
    Remove-Item $tempFile -Force
    exit 1
}

3. Скрипт расшифровки (запускается только создателем)¶

Для выполнения файла DecryptNetworkReport.ps1 требуется разместить в одну с ним директорию файл NetworkReport.cms. В рузельтате выполнения файла сформируется расшифрованный файл NetworkReport.txt с результатами проведенного анализа.

Файл DecryptNetworkReport.ps1¶

# DecryptNetworkReport.ps1

# Parameters
param(
    [string]$certSubject = "cn=NetworkReportEncryptor",
    [string]$EncryptedFile = "NetworkReport.cms",
    [string]$OutputFile = "NetworkReport.txt"
)

# Getting the certificate data
#$cert = Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Subject -eq "CN=NetworkReportEncryptor" }
$cert = (Get-ChildItem -Path Cert:\CurrentUser\My | 
        Where-Object { $_.Subject -match $certSubject }) | 
        Select-Object -First 1

# Decryption and presentation of the analysis report
$decrypted = Unprotect-CmsMessage -Path $EncryptedFile #-To $cert.Thumbprint
$decrypted | Out-File -FilePath $OutputFile -Encoding UTF8
Get-Content $OutputFile

Read-Host "`nPress Enter to exit..."

🐧 Linux (OpenSSL + RSA)¶

Данная реализация предложена DeepSeek и требует практической проверки.

1. Генерация ключей (на машине создателя)¶

openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
  • private.pem – хранить в секрете
  • public.pem – распространять вместе со скриптом сбора

2. Скрипт сбора и шифрования (на целевой машине)¶

Файл collect_and_encrypt.sh¶

#!/bin/bash
TARGET_IP="$1"
TARGET_PORT="$2"
PUBLIC_KEY="public.pem"
OUTPUT_ENC="NetworkReport_$(date +%Y%m%d_%H%M%S).enc"

if [ -z "$TARGET_IP" ] || [ -z "$TARGET_PORT" ]; then
    read -p "Введите IP: " TARGET_IP
    read -p "Введите порт: " TARGET_PORT
fi

get_my_ip() {
    ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v "127.0.0.1" | head -n1
}

REPORT=$(mktemp)

{
    echo "--- Отчёт о сетевой диагностике ---"
    echo "Дата: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "Хост: $(hostname)"
    echo "Ваш IPv4: $(get_my_ip)"
    echo ""
    echo "--- Ping до $TARGET_IP ---"
    ping -c 4 "$TARGET_IP" 2>&1
    echo ""
    echo "--- Проверка порта $TARGET_PORT на $TARGET_IP ---"
    timeout 5 nc -zv "$TARGET_IP" "$TARGET_PORT" 2>&1
} > "$REPORT"

if [ ! -f "$PUBLIC_KEY" ]; then
    echo "Ошибка: $PUBLIC_KEY не найден" >&2
    rm "$REPORT"
    exit 1
fi

openssl smime -encrypt -aes-256-cbc -in "$REPORT" -out "$OUTPUT_ENC" -outform DER "$PUBLIC_KEY"
if [ $? -eq 0 ]; then
    echo "Зашифровано: $OUTPUT_ENC"
    rm "$REPORT"
else
    echo "Ошибка шифрования" >&2
    rm "$REPORT"
    exit 1
fi

Дайте права на выполнение:

chmod +x collect_and_encrypt.sh

3. Скрипт расшифровки (на машине создателя)¶

Файл decrypt_report.sh¶

#!/bin/bash
ENCRYPTED="$1"
PRIVATE_KEY="private.pem"
if [ -z "$ENCRYPTED" ]; then
    read -p "Введите путь к зашифрованному файлу: " ENCRYPTED
fi
if [ ! -f "$ENCRYPTED" ] || [ ! -f "$PRIVATE_KEY" ]; then
    echo "Файл не найден" >&2
    exit 1
fi

OUTPUT="${ENCRYPTED%.enc}.txt"
openssl smime -decrypt -in "$ENCRYPTED" -inform DER -inkey "$PRIVATE_KEY" -out "$OUTPUT"
if [ $? -eq 0 ]; then
    echo "Расшифровано в: $OUTPUT"
    cat "$OUTPUT"
else
    echo "Ошибка расшифровки" >&2
    exit 1
fi
chmod +x decrypt_report.sh

🐧 Linux (альтернатива – GnuPG, проще для больших файлов)¶

Данная реализация предложена DeepSeek и требует практической проверки.

1. Создатель генерирует ключ и экспортирует открытый¶

gpg --full-generate-key          # создайте ключ (например, с email diag@example.com)
gpg --export -a "diag@example.com" > public.gpg

2. Скрипт сбора и шифрования (использует открытый ключ)¶

Файл collect_encrypt_gpg.sh¶

#!/bin/bash
TARGET_IP="$1"
TARGET_PORT="$2"
RECIPIENT="diag@example.com"   # замените на ваш email или ID ключа
OUTPUT_ENC="NetworkReport_$(date +%Y%m%d_%H%M%S).gpg"

if [ -z "$TARGET_IP" ] || [ -z "$TARGET_PORT" ]; then
    read -p "Введите IP: " TARGET_IP
    read -p "Введите порт: " TARGET_PORT
fi

get_my_ip() {
    ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v "127.0.0.1" | head -n1
}

REPORT=$(mktemp)

{
    echo "--- Отчёт о сетевой диагностике ---"
    echo "Дата: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "Хост: $(hostname)"
    echo "Ваш IPv4: $(get_my_ip)"
    echo ""
    echo "--- Ping до $TARGET_IP ---"
    ping -c 4 "$TARGET_IP" 2>&1
    echo ""
    echo "--- Проверка порта $TARGET_PORT на $TARGET_IP ---"
    timeout 5 nc -zv "$TARGET_IP" "$TARGET_PORT" 2>&1
} > "$REPORT"

gpg --encrypt --recipient "$RECIPIENT" --output "$OUTPUT_ENC" "$REPORT"
if [ $? -eq 0 ]; then
    echo "Зашифровано: $OUTPUT_ENC"
    rm "$REPORT"
else
    echo "Ошибка шифрования" >&2
    rm "$REPORT"
    exit 1
fi

3. Скрипт расшифровки (на машине создателя)¶

Файл decrypt_gpg.sh¶

#!/bin/bash
ENCRYPTED="$1"
if [ -z "$ENCRYPTED" ]; then
    read -p "Введите путь к .gpg файлу: " ENCRYPTED
fi
OUTPUT="${ENCRYPTED%.gpg}.txt"
gpg --decrypt --output "$OUTPUT" "$ENCRYPTED"
if [ $? -eq 0 ]; then
    echo "Расшифровано в: $OUTPUT"
    cat "$OUTPUT"
else
    echo "Ошибка" >&2
    exit 1
fi
chmod +x collect_encrypt_gpg.sh decrypt_gpg.sh

📌 Резюме для вариантов с шифрованием¶

Платформа Шифрование Расшифровка Ключи у создателя Ключи у пользователя
Windows Protect-CmsMessage (сертификат) Unprotect-CmsMessage закрытый ключ в Cert:\CurrentUser\My только открытый (вшит в скрипт)
Linux OpenSSL smime с открытым ключом public.pem openssl smime -decrypt с private.pem private.pem public.pem
Linux GnuPG --encrypt с открытым ключом gpg --decrypt закрытый ключ в связке gpg открытый ключ (импортирован или указан recipient)

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

PowerShell анализ информационная система корпоративная информационная система практика сеть;

Предыдущая статьяГенерация тестовых данных для анализа правил доступа в TessaСледующая статья Анализ предоставленных разрешений в Tessa

Рубрики

Метки

abc abcd AI-Ready платформа Data Lakehouse ELT excel ms sql pandas PostgreSQL PowerShell Python sql tessa VBA xyz анализ виртуальный помощник гибридное хранилище данных данные знания информационная система информация кластерный анализ комбинаторика компетенции корпоративная информационная система маркетинг математика медальон-архитектура модель предоставления прав мудрость о проекте оптимизация ошибка практика программное обеспечение пэст ролевая модель сеть; теория теория вероятностей тесса тест юмор языки программирования

Политика конфиденциальности

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




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2026)