Hızlı Başlangıç: Python kullanarak üretici yazılımı görüntülerini üretici yazılımı analizine yükleme

Bu makalede, üretici yazılımı görüntülerini üretici yazılımı analizine yüklemek için Python betiğinin nasıl kullanılacağı açıklanmaktadır.

Üretici yazılımı analizi , üretici yazılımı görüntülerini analiz eden ve üretici yazılımı görüntülerindeki güvenlik açıklarını anlayan bir araçtır.

Önkoşullar

Bu hızlı başlangıçta üretici yazılımı analizi hakkında temel bilgiler edineceksiniz. Daha fazla bilgi için bkz. Üretici yazılımı analizine genel bakış. Desteklenen dosya sistemlerinin listesi için bkz . Üretici yazılımı analizi hakkında sık sorulan sorular.

Üretici yazılımı görüntülerini yüklemek ve analiz etmek için bir kaynak grubunuz ve çalışma alanınız olmalıdır. Kaynak grubu ve çalışma alanı oluşturmak için: Üretici yazılımı analizi öğreticisine bkz.

Üretici yazılımı görüntülerini yüklemek ve analiz etmek için bir kaynak grubunuz ve çalışma alanınız olmalıdır. Kaynak grubu ve çalışma alanı oluşturmak için: Üretici yazılımı analizi öğreticisine bkz.

Ortamınızı hazırlama

  1. Bu paketi kullanmak için Python sürüm 3.8+ gereklidir. Python sürümünüzü denetlemek için komutunu python --version çalıştırın.
  2. Azure abonelik kimliğinizi, görüntülerinizi karşıya yüklemek istediğiniz Kaynak Grubunuzun adını, çalışma alanı adınızı ve karşıya yüklemek istediğiniz üretici yazılımı görüntüsünün adını not edin.
  3. Azure hesabınızın, Azure aboneliğinizin üretici yazılımı analizine üretici yazılımı görüntülerini yüklemek için gerekli izinlere sahip olduğundan emin olun. Üretici yazılımı görüntülerini karşıya yüklemek için Abonelik veya Kaynak Grubu düzeyinde Sahip, Katkıda Bulunan, Güvenlik Yöneticisi veya Üretici Yazılımı Analizi Yöneticisi olmanız gerekir. Daha fazla bilgi için Üretici Yazılımı analizi Rolleri, Kapsamlar ve Özellikler'i ziyaret edin.
  4. Üretici yazılımı görüntünüzün Python betiğiyle aynı dizinde depolandığından emin olun.
  5. Bu betiği çalıştırmak için gereken paketleri yükleyin:
    pip install azure.storage.blob
    pip install halo
    pip install tabulate
    pip install azure-identity
    pip install azure-mgmt-iotfirmwaredefense
    
  6. komutunu az loginçalıştırarak Azure hesabınızda oturum açın.

Aşağıdaki Python betiğini çalıştırın

Aşağıdaki Python betiğini bir .py dosyaya kopyalayın ve üretici yazılımı görüntünüzle aynı dizine kaydedin. değişkenini subscription_id Azure abonelik kimliğinizle, resource_group_name üretici yazılımı görüntünüzü karşıya yüklemek istediğiniz Kaynak Grubunuzun adıyla ve firmware_file Python betiğiyle aynı dizine kaydedilen üretici yazılımı görüntünüzün adıyla değiştirin.

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, {"firmwareId": firmware_id})
    fw_client.firmwares.create(resource_group_name, workspace_name, firmware_id, {"properties": {"fileName": 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_type=SummaryType.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())