简介
本指南概述了以气隙模式更新安全恶意软件分析设备的步骤。
注意:以气隙模式维护设备会降低其效率。在继续操作之前,请考虑安全性和功能之间的权衡。
先决条件
Cisco 建议您了解以下主题:
- 在Windows和Unix/Linux环境中通过命令行输入的基本知识
- 恶意软件分析设备知识
- 思科集成管理控制器(IMC)知识
使用的组件
思科建议熟悉以下主题:
- 基于Windows 10和Linux的操作系统(例如:CentOS、RedHat)
- RUFUS 2.17
- C220 M4、M510和M520 M5、M610和M620 M6(设备型号)
本文档中的信息基于受控实验环境中采用默认配置的设备。如果您的网络处于活动状态,请谨慎操作,并充分了解任何命令的潜在含义,然后再继续操作。
背景信息
大多数安全恶意软件分析设备连接到互联网并使用在线更新流程。但是,某些设备严格在内部网络中维护(气隙)。 思科不推荐这种方法,因为它会降低效率。本指南为必须维护气隙设备的用户提供离线更新流程。
对于离线安全恶意软件分析更新,思科会根据请求提供更新媒体。按照本文档中介绍的离线更新流程进行操作。
媒体:Airgap(离线)更新媒体由安全恶意软件分析支持根据请求提供。它是ISO文件,可以复制到USB驱动器或HDD(具有足够的大小)。
大小:更新介质的大小因支持的版本而异,并且随着新虚拟机的引入会显着增加。 对于当前版本, 大小约为30 GB,包括取消同步工具, 为与VM相关的更改启用增量更新。
升级启动周期:每次Airgap更新媒体启动时,它都会确定要升级到的下一个版本,并将与该下一个版本相关的内容复制到设备上。如果给定版本没有任何在设备运行时必须运行的前提条件检查,则该版本也可以启动软件包安装。如果版本包括此类检查或覆盖更新过程中可能会添加此类检查的部分,则直到用户登录OpAdmin并使用OpAdmin > Operations > Update Appliance调用更新时,更新才会实际应用。
安装前挂钩:根据特定升级是否存在任何安装前挂接,它或者立即运行升级,或者将设备重新启动回其常规操作模式,以允许用户进入常规管理界面并手动启动该升级。
根据需要重复:因此,每个此类介质启动周期仅向最终目标版本升级(或准备升级)一步;用户必须启动任意多次才能升级到所需目标版本。
限制
气隙更新不支持CIMC介质。
由于使用的第三方组件的许可限制,在UCS M3硬件达到寿命终止(EOL)后,1.x版本的升级介质不再可用。 因此,在停产之前更换或升级UCS M3设备至关重要。
要求
迁移:如果所涵盖版本的版本说明包括必须在安装下一个版本之前进行迁移的场景,则用户必须在重新启动之前执行这些步骤,以避免其设备处于不可用状态。
注意:第一个2.1.x版本比2.1.4版本更高,特别是要运行多个数据库迁移。在这些迁移完成之前继续操作是不安全的。有关详细信息,请参阅Threat Grid设备2.1.5迁移说明。
如果从2.1.3之前的版本开始,airgap升级介质使用从单个许可证衍生的加密密钥,因此需要基于每个设备进行自定义。(唯一可由用户看到的效果是,由于媒体构建为支持早于2.1.3的原始版本,安全恶意软件分析需要事先在这些设备上安装许可证,而媒体不会在其构建列表中未安装的任何设备上运行。)
如果从版本2.1.3开始或更晚,则airgap介质是通用的,不需要客户信息。
开始使用前
- 备份。在继续更新之前,必须考虑备份设备。
- 查看发行版的发行说明进行更新,以验证在计划更新到较新发行版之前,是否需要任何后台迁移
- 验证设备的当前版本:OpAdmin > Operations > Update Appliance
- 查看生成号/版本查找表中安全恶意软件分析设备的版本历史记录,该表在所有Threat Grid设备文档中均可用:版本说明、迁移说明、设置和配置指南以及管理员指南。
更新脱机(Airgapped)安全恶意软件分析设备
首先检查此页面上的可用气隙版本:设备版本查找表
1.打开TAC支持请求以获取离线更新媒体。此请求应包括设备序列号以及设备内部版本号。
2. TAC支持根据您的安装提供更新的ISO。
3.将ISO映像刻录到可引导的USB。请注意,USB是唯一支持离线更新的设备/方法。
命名规则
这是更新的文件名,例如:TGA Airgap更新2.16.2-2.17.2。
这意味着此介质可用于运行最低版本的设备:2.16.2并将设备升级到版本:2.17.2 的多播地址发送一次邻居消息。
限制
- 气隙更新不支持CIMC介质。
- 由于使用的第三方组件的许可限制,在UCS M3硬件达到寿命终止(EOL)后,不再提供1.x版本的升级介质。 因此,在停产之前更换或升级UCS M3设备至关重要。
Linux/MAC - ISO下载
要求
Cisco 建议您了解以下主题:
- 可以访问互联网的Linux计算机,用于下载ISO并创建可引导的USB安装驱动器。
- Airgap下载说明由安全恶意软件分析支持提供。
- GO编程语言。下载
- .caibx索引文件(包含在TAC支持提供的zip文件中)。
- 取消同步工具(包含在安全恶意软件分析支持提供的zip文件中)。
使用的组件
本文档中的信息基于基于Linux的操作系统(例如:CentOS、RedHat)。
本文档中的信息基于受控实验环境中采用默认配置的设备。如果您的网络处于活动状态,请谨慎操作,并充分了解任何命令的潜在含义,然后再继续操作。
配置
安装GO编程语言
# wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz
# tar -xzf go1.23.1.linux-amd64.tar.gz
# mv go /usr/local
安装后运行这三个命令,如果不运行,desync命令将失败
# export GOROOT=/usr/local/go
# export GOPATH=$HOME/Projects/Proj1
# export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
您可以通过以下方式验证GO版本:
# go version
使用Desync命令下载ISO
步骤1.将Secure Malware Analytics Support提供的Zip文件的内容(包括desync.linux和.caibx文件)复制到计算机上本地的同一目录中。
步骤2.切换到存储文件的目录:
示例:
# cd MyDirectory/TG
步骤3.运行pwd命令以确保您位于目录内。
# pwd
步骤4.进入包含desync.linux命令和.caibx文件的目录后,运行您选择的命令开始下载过程。
注意:以下是不同ISO版本的示例,请参考.caibx文件,其说明由安全恶意软件分析支持提供。
对于2.16.2到2.17.2 ISO版本:
# desync extract -k -s s3+https://s3.amazonaws.com/sma-appliance-airgap-update airgap-update-2.16.2ag-2.17.2.caibx airgap-update-2.16.2ag-2.17.2.iso
对于2.4.3.2到2.5 ISO版本:
# desync extract -k -s s3+https://s3.amazonaws.com/threatgrid-appliance-airgap-update airgap-update-2.4.3.2-2.5.caibx airgap-update-2.4.3.2-2.5.iso
对于2.5到2.7.2ag ISO版本:
# desync extract -k -s s3+https://s3.amazonaws.com/threatgrid-appliance-airgap-update airgap-update-2.5-2.7.2ag.caibx airgap-update-2.5-2.7.2ag.iso
下载开始后,会显示进度条。
注意:您环境中的下载速度和升级介质的大小可能会影响构成ISO的时间。
请确保将下载文件的MD5与支持提供的捆绑包的MD5进行比较,以验证下载的ISO的完整性。
下载完成后,即可在同一目录下创建ISO。
将USB插入计算机并运行dd命令以创建可引导的USB驱动器。
# dd if=airgap-update.iso of=/dev/<MY_USB> bs=64M
其中<MY_USB>是USB密钥的名称(请卸下尖括号)。
插入USB驱动器并打开或重新启动设备。在Cisco启动屏幕上,按F6进入启动菜单。
提示:
在办公时间或非高峰时间运行下载,因为这可能会影响带宽。
要停止工具,请关闭终端或按Ctrl+c/Ctrl+z。
要继续,请运行同一命令以继续下载。
Windows - ISO下载
安装GO编程语言
- 下载所需的GO编程语言。安装位置 https://golang.org/dl/ 就我而言,我选择特色版本。重新启动CMD并使用
关闭并重新打开CMD run命令以验证:
go version
使用Desync命令下载ISO
- 安装 DESYNC 工具。执行完命令后,您可以看到一系列下载提示。大约在2-3分钟后,应完成下载。
go install github.com/folbricht/desync/cmd/desync@latest
In case desync is not working using above command then change directory to C drive and run this command:
git clone https://github.com/folbricht/desync.git
然后逐一运行以下两个命令:
cd desync/cmd/desync
go install
- 导航至 go - > bin 位置.例如 C:\Users\<username>\go\bin 并复制/粘贴提供的TAC .caibx 索引文件。
- (验证)返回到CMD提示符,导航到文件夹go\bin并运行下载命令。您应立即看到下载继续。等待下载完成。您现在应该拥有整个 .ISO 文件与先前复制的文件位于同一位置 .caibx 索引文件
\$HOME/go/bin/desync extract -k -s s3+https://s3.amazonaws.com/sma-appliance-airgap-update airgap-update-2.16.2ag-2.17.2.caibx airgap-update-2.16.2ag-2.17.2.iso
对于创建此特定恢复USB,使用Rufus版本2.17至关重要,因为它允许您使用基本的dd选项。您可以在此存储库中找到所有RUFUS版本。
从USB启动设备
- 插入USB, 重新启动设备, 并在Cisco引导屏幕中快速按F6以进入引导菜单。
- 导航到包含更新的USB驱动器,然后按Enter选择。
更新媒体确定升级路径中的下一个版本,并将该版本的内容复制到设备上。设备会立即运行升级,或者重新启动回常规操作模式,以便您进入OpAdmin并手动启动该升级。
完成ISO引导过程后,重新引导安全恶意软件分析设备返回运行模式。
登录门户UI并检查是否有任何警告提示升级是否安全等,然后继续。
- 导航到OpAdmin界面并应用更新(如果在重新启动期间未自动应用更新):OpAdmin > Operations > Update Appliance注意:更新过程包括附加重启,作为更新的一部分,由USB介质执行。例如,安装更新后,需要使用安装页面上的Reboot按钮。
根据需要对USB上的每个版本重复上述步骤。
如何查找正确的/dev设备
当USB仍然未连接到终端时,运行命令“lsblk | grep -iE 'disk|part'。
xsilenc3x@Alien15:~/testarea/usb$ lsblk | grep -iE 'disk|part'
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 128M 0 part
└─sda2 8:2 0 931.4G 0 part /media/DATA
nvme0n1 259:0 0 238.5G 0 disk
├─nvme0n1p1 259:1 0 650M 0 part
├─nvme0n1p2 259:2 0 128M 0 part
├─nvme0n1p3 259:3 0 114.1G 0 part
├─nvme0n1p4 259:4 0 525M 0 part /boot
├─nvme0n1p5 259:5 0 7.6G 0 part [SWAP]
├─nvme0n1p6 259:6 0 38.2G 0 part /
├─nvme0n1p7 259:7 0 62.7G 0 part /home
├─nvme0n1p8 259:8 0 13.1G 0 part
└─nvme0n1p9 259:9 0 1.1G 0 part
xsilenc3x@Alien15:~/testarea/usb$
在连接USB盘之后。
xsilenc3x@Alien15:~/testarea/usb$ lsblk | grep -iE 'disk|part'
.sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 128M 0 part
└─sda2 8:2 0 931.4G 0 part /media/DATA
sdb 8:16 1 3.7G 0 disk
└─sdb1 8:17 1 3.7G 0 part /media/xsilenc3x/ARCH_201902 <--------- not observed when the USB was not connected
nvme0n1 259:0 0 238.5G 0 disk
├─nvme0n1p1 259:1 0 650M 0 part
├─nvme0n1p2 259:2 0 128M 0 part
├─nvme0n1p3 259:3 0 114.1G 0 part
├─nvme0n1p4 259:4 0 525M 0 part /boot
├─nvme0n1p5 259:5 0 7.6G 0 part [SWAP]
├─nvme0n1p6 259:6 0 38.2G 0 part /
├─nvme0n1p7 259:7 0 62.7G 0 part /home
├─nvme0n1p8 259:8 0 13.1G 0 part
└─nvme0n1p9 259:9 0 1.1G 0 part
xsilenc3x@Alien15:~/testarea/usb$
这确认/dev中的USB设备为“/dev/sdb”。
其他确认方法,在连接USB线之后:
命令dmesg提供一些信息。连接USB后,运行命令dmesg | grep -iE 'usb|attached'。
xsilenc3x@Alien15:~/testarea/usb$ dmesg | grep -iE 'usb|attached'
[842717.663757] usb 1-1.1: new high-speed USB device number 13 using xhci_hcd
[842717.864505] usb 1-1.1: New USB device found, idVendor=0781, idProduct=5567
[842717.864510] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[842717.864514] usb 1-1.1: Product: Cruzer Blade
[842717.864517] usb 1-1.1: Manufacturer: SanDisk
[842717.864519] usb 1-1.1: SerialNumber: 4C530202420924105393
[842717.865608] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[842717.866074] scsi host1: usb-storage 1-1.1:1.0
[842718.898700] sd 1:0:0:0: Attached scsi generic sg1 type 0
[842718.922265] sd 1:0:0:0: [sdb] Attached SCSI removable disk <-------
xsilenc3x@Alien15:~/testarea/usb$
命令fidsk提供有关大小的信息,可用于确认:sudo fdisk -l /dev/sdb。
xsilenc3x@Alien15:~/testarea/usb$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 3.7 GiB, 4004511744 bytes, 7821312 sectors <-------
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x63374e06
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 0 675839 675840 330M 0 Empty
/dev/sdb2 116 8307 8192 4M ef EFI (FAT-12/16/32)
xsilenc3x@Alien15:~/testarea/usb$
注意:切记在执行“dd”命令之前卸载USB。
确认示例中的USB设备已安装。
xsilenc3x@Alien15:~/testarea/usb$ sudo mount -l | grep -i sdb
/dev/sdb1 on /media/xsilenc3x/ARCH_201902 type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2) [ARCH_201902]
要卸载USB设备,请使用sudo umount /dev/sdb1。
xsilenc3x@Alien15:~/testarea/usb$ sudo umount /dev/sdb1
重新检查设备是否被视为“已安装”。
xsilenc3x@Alien15:~/testarea/usb$ sudo mount -l | grep -i sdb
status=progress option
oflag=sync和dd命令中的status=progress选项。
写入大量数据块时,“status=progress”选项提供当前写入操作的信息。这对于确认“dd”命令当前是否正在写入页面缓存很有用;它可用于显示所有写入操作的进度和完整时间(以秒为单位)。
如果未使用,“dd”不提供有关进度信息,在“dd”返回之前仅提供写入操作的结果:
[rootuser@centos8-01 tga-airgap]$ dd if=/dev/zero of=testfile.txt bs=1M count=8192
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 5.03493 s, 1.7 GB/s
[rootuser@centos8-01 tga-airgap]$
使用时,每秒钟更新有关写入操作的实时信息。
[rootuser@centos8-01 tga-airgap]$ dd if=/dev/zero of=testfile.txt bs=1M count=8192 status=progress
8575254528 bytes (8.6 GB, 8.0 GiB) copied, 8 s, 1.1 GB/s <----------------
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 8.03387 s, 1.1 GB/s
[rootuser@centos8-01 tga-airgap]
注意:在TGA离线升级过程的正式文档中,通知的命令是:dd if=airgap-update.iso of=/dev/<MY_USB> bs=64M
经过一些测试后,观察到以下示例。
使用设备/dev/zero创建具有“dd”的10MB的文件。
1M x 10 = 10M(10240 kB +脏文件页面缓存中的上一个系统数据= 10304 kB —>这是在“dd”末尾的脏页面缓存中看到的数据)。
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && dd if=/dev/zero of=testfile.txt bs=1M \
count=10 status=progress && cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 92 kB
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0138655 s, 756 MB/s
Dirty: 10304 kB <----- dirty page cache after "dd" returned | data still to be written to the block device
1633260775 <---- epoch time
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 10372 kB
1633260778
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 10380 kB
1633260779
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 10404 kB
1633260781
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 10412 kB
1633260782
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 10424 kB
1633260783
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 10436 kB
1633260785
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 0 kB <--- data in the dirty page cache flushed = written to the block device
1633260786 <---- epoch time
[rootuser@centos8-2 testarea]$
```
1633260786 - 1633260775 = 11 seconds
注意:返回“dd”命令后,对阻止设备的写入操作未完成,在返回11秒后发现该写入操作。
如果这是使用TGA ISO创建可启动USB时的“dd”命令,并且我在11秒之前从终端删除了USB =我在可启动USB中会有一个损坏的ISO。
说明:
块设备提供对硬件设备的缓冲访问。这在使用硬件设备时为应用程序提供了一层抽象。
块设备允许应用通过不同大小的数据块进行读/写;此read()/writes()应用于页面缓存(缓冲区),而不是直接应用于块设备。
内核(而不是执行读/写操作的应用程序)管理数据从缓冲区(页面缓存)到块设备的移动。
因此:
如果未指示应用程序(在本例中为“dd”)控制缓冲区的刷新。
选项“oflag=sync”会在每个输出块(由“dd”提供)置于页面缓存中之后强制进行同步物理写入(由内核执行)。
与不使用选项相比,oflag=sync会降低“dd”性能;但是,如果启用,它将确保在每次从“dd”调用write()后对块设备进行物理写入。
测试:使用“dd”命令的“oflag=sync”选项确认在“dd”命令返回时已完成所有带有脏页缓存数据的写入操作:
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && dd if=/dev/zero of=testfile.txt bs=1M \
count=10 oflag=sync status=progress && cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 60 kB
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0841956 s, 125 MB/s
Dirty: 68 kB <---- No data remaining in the dirty page cache after "dd" returned
1633260819
[rootuser@centos8-2 testarea]$ cat /proc/meminfo | grep -iE 'dirty' && date +%s
Dirty: 36 kB
1633260821
[rootuser@centos8-2 testarea]$
脏页缓存中的写入操作没有保留任何数据。
写操作是在“dd”命令返回之前(或同一时刻)应用的(而不是前一测试返回11秒后)。
现在,我确信,返回“dd”命令后,脏页缓存中没有与写入操作相关的数据=可启动USB创建过程中没有问题(如果ISO校验和正确)。
注意:处理此类情况时,请考虑“dd”命令的此标志(oflag=sync)。
用于离线升级的HDD驱动器的启动顺序
要求:
我们需要确保使用“DD”选项使用任何可用工具格式化硬盘,之后将介质复制到驱动器。如果不使用此格式,则无法读取此媒体。
一旦使用“DD”格式将介质加载到HDD/USB上,我们需要将其连接到TGA设备并重新启动设备。
这是默认的引导菜单选择屏幕。我们需要按“F6”引导设备以选择引导介质
一旦设备识别我们的输入,它将提示设备进入引导选择菜单。
这是在不同的TGA型号之间可能不同的提示。理想情况下,我们会看到使用此菜单本身的引导介质(升级文件系统)进行引导的选项,但是如果未看到此选项,我们需要登录“EFI外壳”。
在“startup.sh”脚本完成之前,您必须按“ESC”才能移入EFI Shell。登录EFI Shell后,我们会注意到在此情况下检测到的分区是3个文件系统:fs0:、fs1:、fs2。
重要
确定正确的文件系统:
- 根据上面的屏幕截图,您可以看到“fs0:”是唯一路径中包含“USB”的介质,因此我们可以确信此文件系统将包含启动介质(升级文件系统)。
如果缺少文件系统:
- 如果仅fs0:和fs1:可用,但没有fs2:,请确认引导介质(升级文件系统)已以dd模式写入并成功连接。
- 启动介质(升级文件系统)的数量应始终低于恢复介质,而且它们应始终紧挨着;是USB连接的驱动器是否位于端部的开头可能会改变(因此,它是否位于fs0:或者需要确定fs2:处的后部位置
- 在这种情况下,在下面的屏幕截图中,是正确的“.efi”文件,因为它位于“\efi\boot”分区下,且命名约定为“bootx64.efi”
要在引导介质(升级文件系统)中引导设备,必须执行“bootx64.efi”文件:
fs0:\efi\boot\bootx64.efi
为便于您参考,我们已在下面显示了其他文件系统的内容:
fs1:这是主引导文件系统。
fs2:这是恢复映像启动文件系统。
其他说明:
验证包含已装载的引导介质的正确文件系统。我们可以通过浏览不同的文件系统并验证“.efi”引导文件来实现此目的
注意:实际引导介质(升级文件系统)的顺序,在本例中为“fs0:”,也可能因其他设备而异。
名称和路径可能不同,但在所有现代图像中,这应该是相同的。
检查表,可帮助找到正确的引导介质(升级文件系统):
- 如果文件系统的根目录包含“vmlinuz-appliance”,则它不是引导介质(升级文件系统)。
- 如果文件系统的根目录包含“meta_contents.tar.xz”,则它不是引导介质(升级文件系统)。
- 如果文件系统不包含“efi\boot\bootx64.efi”,则它不是启动介质(升级文件系统)。