Sdílet prostřednictvím


Rychlý start: Nahrání imagí firmwaru do analýzy firmwaru pomocí Pythonu

Tento článek vysvětluje, jak pomocí skriptu Pythonu nahrát image firmwaru do analýzy firmwaru.

Analýza firmwaru je nástroj, který analyzuje image firmwaru a poskytuje porozumění ohrožením zabezpečení v imagích firmwaru.

Požadavky

V tomto rychlém startu se předpokládá základní znalost analýzy firmwaru. Další informace najdete v tématu Analýza firmwaru pro tvůrce zařízení. Seznam podporovaných systémů souborů najdete v tématu Nejčastější dotazy k analýze firmwaru.

Příprava prostředí

  1. K použití tohoto balíčku se vyžaduje Python verze 3.8 nebo novější. Spuštěním příkazu python --version zkontrolujte verzi Pythonu.
  2. Poznamenejte si ID předplatného Azure, název vaší skupiny prostředků, do které chcete nahrát obrázky, název pracovního prostoru a název image firmwaru, kterou chcete nahrát.
  3. Ujistěte se, že váš účet Azure má potřebná oprávnění k nahrání imagí firmwaru do analýzy firmwaru pro vaše předplatné Azure. Pokud chcete nahrát image firmwaru, musíte být vlastníkem, přispěvatelem, správcem zabezpečení nebo správcem analýzy firmwaru na úrovni předplatného nebo skupiny prostředků. Další informace najdete v tématu Role analýzy firmwaru, obory a možnosti.
  4. Ujistěte se, že je image firmwaru uložená ve stejném adresáři jako skript Pythonu.
  5. Nainstalujte balíčky potřebné ke spuštění tohoto skriptu:
    pip install azure-mgmt-iotfirmwaredefense
    pip install azure-identity
    
  6. Přihlaste se ke svému účtu Azure spuštěním příkazu az login.

Spusťte následující skript Pythonu.

Zkopírujte následující skript Pythonu .py do souboru a uložte ho do stejného adresáře jako image firmwaru. subscription_id Nahraďte proměnnou ID předplatného Azure názvem vaší skupiny prostředků, resource_group_name do které chcete nahrát image firmwaru, a firmware_file názvem image firmwaru, která se uloží ve stejném adresáři jako skript Pythonu.

from azure.identity import AzureCliCredential
from azure.mgmt.iotfirmwaredefense import *
from azure.mgmt.iotfirmwaredefense.models import *
from azure.core.exceptions import *
from azure.storage.blob import BlobClient
import uuid
from time import sleep
from halo import Halo
from tabulate import tabulate

subscription_id = "subscription-id"
resource_group_name = "resource-group-name"
workspace_name = "default"
firmware_file = "firmware-image-name"

def main():
    firmware_id = str(uuid.uuid4())
    fw_client = init_connections(firmware_id)
    upload_firmware(fw_client, firmware_id)
    get_results(fw_client, firmware_id)

def init_connections(firmware_id):
    spinner = Halo(text=f"Creating client for firmware {firmware_id}")
    cli_credential = AzureCliCredential()
    client = IoTFirmwareDefenseMgmtClient(cli_credential, subscription_id, 'https://management.azure.com')
    spinner.succeed()
    return client

def upload_firmware(fw_client, firmware_id):
    spinner = Halo(text="Uploading firmware to Azure...", spinner="dots")
    spinner.start()
    token = fw_client.workspaces.generate_upload_url(resource_group_name, workspace_name, {"firmware_id": firmware_id})
    fw_client.firmwares.create(resource_group_name, workspace_name, firmware_id, {"properties": {"file_name": firmware_file, "vendor": "Contoso Ltd.", "model": "Wifi Router", "version": "1.0.1", "status": "Pending"}})
    bl_client = BlobClient.from_blob_url(token.url)
    with open(file=firmware_file, mode="rb") as data:
        bl_client.upload_blob(data=data)
    spinner.succeed()

def get_results(fw_client, firmware_id):
    fw = fw_client.firmwares.get(resource_group_name, workspace_name, firmware_id)

    spinner = Halo("Waiting for analysis to finish...", spinner="dots")
    spinner.start()
    while fw.properties.status != "Ready":
        sleep(5)
        fw = fw_client.firmwares.get(resource_group_name, workspace_name, firmware_id)
    spinner.succeed()

    print("-"*107)

    summary = fw_client.summaries.get(resource_group_name, workspace_name, firmware_id, summary_name=SummaryName.FIRMWARE)
    print_summary(summary.properties)
    print()

    components = fw_client.sbom_components.list_by_firmware(resource_group_name, workspace_name, firmware_id)
    if components is not None:
        print_components(components)
    else:
        print("No components found")

def print_summary(summary):
    table = [[summary.extracted_size, summary.file_size, summary.extracted_file_count, summary.component_count, summary.binary_count, summary.analysis_time_seconds, summary.root_file_systems]]
    header = ["Extracted Size", "File Size", "Extracted Files", "Components", "Binaries", "Analysis Time", "File Systems"]
    print(tabulate(table, header))

def print_components(components):
    table = []
    header = ["Component", "Version", "License", "Paths"]
    for com in components:
        table.append([com.properties.component_name, com.properties.version, com.properties.license, com.properties.file_paths])
    print(tabulate(table, header, maxcolwidths=[None, None, None, 57]))

if __name__ == "__main__":
    exit(main())