简介
本文档介绍与Firepower威胁防御(FTD)连接相关的Firepower管理中心(FMC)sftunnel Certificate Authority(CA)证书的续订。
先决条件
要求
Cisco 建议您了解以下主题:
- Firepower威胁防御
- Firepower 管理中心
- 公用密钥基础结构 (PKI)
使用的组件
本文档不限于特定的软件和硬件版本。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
FMC和FTD通过sftunnel(Sourcefire隧道)相互通信。 此通信使用证书来确保TLS会话中的会话安全。有关sftunnel及其如何建立的详细信息,可在此链接上找到。
通过数据包捕获,您可以看到FMC(本例中为10.48.79.232)和FTD(10.48.79.23)正在相互交换证书。他们这样做是为了验证他们是否与正确的设备通信,以及不存在窃听或中间人(MITM)攻击。使用那些证书对通信进行加密,只有拥有该证书的关联私钥的一方才能再次解密该证书。
Certificate_exchange_server_cert
Certificate_exchange_client_cert
您可以看到证书由FMC系统上设置的相同InternalCA(Issuer)证书颁发机构(CA)签名。在/etc/sf/sftunnel.conf文件上的FMC上定义配置,该文件包含以下内容:
proxyssl {
proxy_cert /etc/sf/keys/sftunnel-cert.pem; ---> Certificate provided by FMC to FTD for the sftunnel communication (signed by InternalCA)
proxy_key /etc/sf/keys/sftunnel-key.pem;
proxy_cacert /etc/sf/ca_root/cacert.pem; ---> CA certificate (InternalCA)
proxy_crl /etc/sf/ca_root/crl.pem;
proxy_cipher 1;
proxy_tls_version TLSv1.2;
};
这表示用于签署sftunnel(FTD和FMC one)的所有证书的CA,以及FMC用于发送到所有FTD的证书。此证书由InternalCA签名。
当FTD注册到FMC时,FMC还会创建证书以推送到FTD设备,用于在sftunnel上进行进一步通信。此证书也由同一内部CA证书签名。在FMC上,可以在/var/sf/peers/<UUID-FTD-device>下和可能在certs_pushed文件夹下找到证书(和私钥),该文件夹名为sftunnel-cert.pem(对于私钥,sftunnel-key.pem)。 在FTD上,您可以找到那些在/var/sf/peers/<UUID-FMC-device>下使用相同命名约定的FTD。
但是,出于安全考虑,每个证书也有一个有效期。在检查InternalCA证书时,我们还可以看到数据包捕获所显示的FMC InternalCA的有效期(10年)。
FMC-InternalCA_validity
问题
FMC InternalCA证书有效期仅为10年。到期后,远程系统不再信任此证书(以及由其签名的证书),这将导致FTD和FMC设备之间的sftunnel通信问题。这也意味着连接事件、恶意软件查找、基于身份的规则、策略部署等多项关键功能无法正常工作。
当sftunnel未连接时,设备在FMC UI的Devices > Device Management选项卡下显示为禁用。思科漏洞ID CSCwd08098会跟踪与此到期相关的问题。请注意,即使您运行了缺陷的固定版本,所有系统都会受到影响。有关此修补程序的更多信息,请参阅解决方案部分。
已禁用设备
FMC不会自动刷新CA并将证书重新发布到FTD设备。此外,也没有指示证书到期的FMC运行状况警报。在此方面跟踪思科漏洞ID CSCwd08448,以便将来在FMC UI上提供运行状况警报。
到期日期后会发生什么情况?
最初什么都没有发生,并且sftunnel通信通道继续像以前一样运行。但是,当FMC和FTD设备之间的sftunnel通信中断并尝试重新建立连接时,它确实会失败,并且您可以观察消息日志文件中指向证书到期的日志行。
来自/ngfw/var/log/messages的FTD设备的日志行:
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [INFO] Initiating IPv4 connection to 10.10.200.31:8305/tcp
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [INFO] Wait to connect to 8305 (IPv4): 10.10.200.31
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [INFO] Connected to 10.10.200.31 from resolved_ip_list (port 8305) (IPv4)
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [ERROR] -Error with certificate at depth: 1
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [ERROR] issuer = /title=InternalCA/OU=Intrusion Management System/CN=06f5f3ca-c77b-11e2-81bf-884d9d11f3ef/O=Sourcefire, Inc.
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [ERROR] subject = /title=InternalCA/OU=Intrusion Management System/CN=06f5f3ca-c77b-11e2-81bf-884d9d11f3ef/O=Sourcefire, Inc.
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [ERROR] err 10:certificate has expired
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [ERROR] SSL_renegotiate error: 1: error:00000001:lib(0):func(0):reason(1)
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [ERROR] Connect:SSL handshake failed
Sep 20 04:10:47 FTD-hostname SF-IMS[50792]: [51982] sftunneld:sf_ssl [WARN] SSL Verification status: certificate has expired
从/var/log/messages的FMC设备的日志行:
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [INFO] VERIFY ssl_verify_callback_initial ok=1!
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [ERROR] SSL_renegotiate error: 1: error:00000001:lib(0):func(0):reason(1)
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [WARN] establishConnectionUtil: SSL handshake failed
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [WARN] establishConnectionUtil: SSL Verification status: ok
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [WARN] establishConnectionUtil: SSL handshake failed: error:14094415:SSL routines:ssl3_read_bytes:sslv3 alert certificate expired
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [INFO] establishConnectionUtil: Failed to connect using SSL to: '10.10.21.10'
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [ERROR] establishSSLConnection: Unable to connect with both threads:
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [ERROR] establishSSLConnection: ret_accept status : Too many levels of symbolic links
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [ERROR] establishSSLConnection: iret_connect status: Too many levels of symbolic links
Sep 20 03:14:23 FMC-hostname SF-IMS[1504]: [4171] sftunneld:sf_ssl [ERROR] establishSSLConnection: Failed connecting with SSL to using to: '10.10.21.10' rval[40] *CA cert from FMC
Sftunnel通信可能会因各种原因中断:
- 由于网络连接中断而丢失通信(可能只是暂时的)
- 重新启动FTD或FMC
- 期望值:在FMC或FTD上手动重新启动、升级、手动重新启动sftunnel进程(例如,通过pmtool restartbyid sftunnel)
- 意外的:回溯,断电
由于有如此多的可能性可以中断sftunnel通信,因此强烈建议尽快纠正这种情况,即使当前所有FTD设备都已正确连接(尽管证书已过期)。
如何快速验证证书是否过期或何时过期?
最简单的方法是在FMC SSH会话上运行以下命令:
expert
sudo su
cd /etc/sf/ca_root
openssl x509 -dates -noout -in cacert.pem
这将为您显示证书的有效性元素。此处的主要相关部分是“notAfter”,表明此处的证书有效期至2034年10月5日。
NotAfter
如果您希望运行一个命令,立即向您提供证书仍然有效的天数,则可以使用此命令:
CERT_PATH="/etc/sf/ca_root/cacert.pem"; EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$CERT_PATH" | cut -d= -f2); EXPIRY_DATE_SECONDS=$(date -d "$EXPIRY_DATE" +%s); CURRENT_DATE_SECONDS=$(date +%s); THIRTY_DAYS_SECONDS=$((30*24*60*60)); EXPIRY_THRESHOLD=$((CURRENT_DATE_SECONDS + THIRTY_DAYS_SECONDS)); DAYS_LEFT=$(( (EXPIRY_DATE_SECONDS - CURRENT_DATE_SECONDS) / (24*60*60) )); if [ "$EXPIRY_DATE_SECONDS" -le "$CURRENT_DATE_SECONDS" ]; then DAYS_EXPIRED=$(( (CURRENT_DATE_SECONDS - EXPIRY_DATE_SECONDS) / (24*60*60) )); echo -e "\nThe certificate has expired $DAYS_EXPIRED days ago.\nIn case the sftunnel communication with the FTD is not yet lost, you need to take action immediately in renewing the certificate.\n"; elif [ "$EXPIRY_DATE_SECONDS" -le "$EXPIRY_THRESHOLD" ]; then echo -e "\nThe certificate will expire within the next 30 days!\nIt is ONLY valid for $DAYS_LEFT more days.\nIt is recommended to take action in renewing the certificate as quickly as possible.\n"; else echo -e "\nThe certificate is valid for more than 30 days.\nIt is valid for $DAYS_LEFT more days.\nThere is no immediate need to perform action but this depends on how far the expiry date is in the future.\n"; fi
显示了一个设置示例,其中证书仍然多年有效。
Certificate_expire_validation_command
以后如何获得有关即将到期的证书的通知?
使用最近的VDB更新(399或更高),证书在90天内到期时会自动向您发出警报。因此,您自己无需手动跟踪,因为当您接近到期时间时会收到警报。然后,FMC网页上会显示两种表格。这两种方式均请参阅现场通知页面。
第一种方法是通过Task选项卡。此消息为粘滞消息,除非明确关闭,否则用户可以使用它。通知弹出窗口也会显示,在用户明确关闭之前一直可用。它始终显示为错误。
“任务”选项卡上的到期通知
第二种方法是通过Health Alert。这在Health选项卡中显示,但这不是粘滞的,并在运行运行状况监控器时替换或删除,默认情况下,运行状况监控器每5分钟运行一次。它还显示一个通知弹出窗口,用户需要明确关闭该窗口。这可以同时显示为错误(过期时)和警告(即将过期时)。
“运行状况”(Health)选项卡上的到期通知
弹出运行状况警报时的警告通知
出现运行状况警报弹出时的错误通知
解决方案1 — 证书尚未过期(理想情况)
这是最佳情况,因为根据证书到期时间,我们还有时间。要么我们采用依赖FMC版本的全自动方法(推荐),要么我们采用需要TAC交互的更手动的方法。
推荐的方法
这是正常情况下预期没有停机时间和最少手动操作量的情况。
在继续操作之前,必须安装适用于此处所列特定版本的修补程序。此处的好处是这些修补程序不需要重新启动FMC,因此当证书过期时,可能会中断sftunnel通信。可用的修补程序包括:
安装修补程序后,FMC现在包含generate_certs.pl脚本:
- 重新生成InternalCA
- 重新创建由此新的InternalCA签名的sftunnel证书
- 将新的sftunnel证书和私钥推送到各自的FTD设备(当sftunnel运行时)
注意:generate_certs.pl脚本当前检查关键操作是否正在运行。如果不是,则它无法运行。
关键操作可以是:智能代理未注册或注册正在进行中,备份/还原任务正在进行中,SRU更新任务正在进行中,VDB更新任务正在进行中,域任务正在进行中,高可用性操作正在进行或升级正在运行。
因此,如果您只在FMC上使用传统许可证(或列出的任何操作都需要首先完成),则无法运行此脚本,在这种情况下,您需要联系思科TAC以绕过此检查、重新生成证书,然后再次撤消绕行。
因此,建议(如果可能):
- 为您的版本系列安装适用的修补程序
- 在FMC上进行备份
- 在FMC上使用sftunnel_status.pl脚本验证所有当前sftunnel连接(从专家模式)
- 使用generate_certs.pl从专家模式运行脚本
- 检查结果以验证是否需要任何手动操作(当设备未连接到FMC时)[下面将进一步说明]
- 从FMC运行sftunnel_status.pl,以验证所有sftunnel连接是否运行正常
Generate_certs.pl脚本
注意:当您让FMC在高可用性(HA)中运行时,您需要首先在主节点上执行操作,然后在辅助节点上执行操作,因为它使用这些证书以及在FMC节点之间进行通信。两个FMC节点上的InternalCA不同。
在此处的示例中,您看到它在/var/log/sf/sfca_generation.log上创建日志文件,指示使用sftunnel_status.pl,指示InternalCA上的到期时间并指示其上的任何故障。例如,它未能将证书推送到设备BSNS-1120-1和EMEA-FPR3110-08设备,这是预期结果,因为这些设备的sftunnel已关闭。
要更正失败连接的sftunnel,请运行以下步骤:
- 在FMC CLI上,使用cat /var/tmp/certs/1728303362/FAILED_PUSH(number值表示unix时间,因此请检查系统中上一个命令的输出)打开FAILED_PUSH文件,此文件采用以下格式: FTD_UUID FTD_NAME FTD_IP SOURCE_PATH_ON_FMC DESTINATION_PATH_ON_FTD
FAILED_PUSH
- 通过这些新证书(cacert.pem / sftunnel-key.pem / sftunnel-cert.pem)从FMC传输到FTD设备
===自动方法===
修补程序安装还提供了copy_sftunnel_certs.py和copy_sftunnel_certs_jumpserver.py脚本,这些脚本可自动将各种证书传输到证书重新生成时未启动sftunnel的系统。这也可用于由于证书已过期而导致sftunnel连接中断的系统。
当FMC本身拥有对各种FTD系统的SSH访问权时,可以使用copy_sftunnel_certs.py脚本。如果情况并非如此,您可以将脚本(/usr/local/sf/bin/copy_sftunnel_certs_jumpserver.py)从FMC下载到具有SSH访问FMC和FTD设备的跳转服务器,并从那里运行Python脚本。如果也不可能这样做,则建议运行下面所示的手动方法。下面的示例显示正在使用的copy_sftunnel_certs.py脚本,但对于copy_sftunnel_certs_jumpserver.py脚本的步骤是相同的。
A.在FMC(或跳转服务器)上创建包含用于建立SSH连接的设备信息(device_name、IP地址、admin_username、admin_password)的CSV文件。
当您从远程服务器(如主FMC的跳转服务器)运行此时,请确保在主FMC详细信息中添加作为第一个条目,后跟所有托管FTD和辅助FMC。当您从远程服务器(如辅助FMC的跳转服务器)运行此时,请确保在辅助FMC详细信息中添加作为第一个条目,后跟所有托管FTD。
i.使用vi devices.csv创建文件。vi devices.csv
二、这将打开空文件(未显示),当您使用键盘上的i letter进入INTERACTIVE模式(在屏幕底部看到)后,您可以填写详细信息,如下所示。
devices.csv示例
三。完全完成后,使用ESC并按:wq然后按Enter键关闭并保存文件。
保存设备.csv
B.使用copy_sftunnel_certs.py devices.csv运行脚本(使用sudo从根运行),并显示结果。此处显示已正确推送到FTDv的证书,并且对于BSNS-1120-1,无法建立到设备的SSH连接。
copy_sftunnel_certs.py devices.csv
===手动方法===
- 通过复制之前输出(FAILED_PUSH文件)中的文件位置,在FMC CLI上为每个受影响的FTD(cacert.pem / sftunnel-key.pem(出于安全目的未完全显示)/ sftunnel-cert.pem)打印输出(cat)。
cacert.pem
sftunnel-key.pem
sftunnel-cert.pem
- 通过sudo su在expert模式下打开各个FTD的FTD CLI,并使用root权限更新证书,执行下一个过程。
- 从FAILED_PUSH输出浏览到浅蓝色突出显示区域上显示的位置(例如,cd /var/sf/peers/cdb123c8-4347-11ef-aca1-f3aa241412a1,但每个FTD不同)。
- 备份现有文件。
cp cacert.pem cacert.pem.backup
cp sftunnel-cert.pem sftunnel-cert.pem.backup
cp sftunnel-key.pem sftunnel-key.pem.backup
备份当前证书
- 清空文件,以便我们可以在其中写入新内容。
> cacert.pem
> sftunnel-cert.pem
> sftunnel-key.pem
现有证书文件的内容为空
- 使用vi cacert.pem / vi sftunnel-cert.pem / vi sftunnel-key.pem(每个文件的单独命令 — 屏幕截图仅对cacert.pem显示此内容,但对sftunnel-cert.pem和sftunnel-key.pem需要重复此内容),在每个文件中单独写入新内容(来自FMC输出)。vi cacert.pem
- 按i进入交互模式(输入vi命令后,您会看到一个空文件)。
- 复制粘贴文件中的整-----内容(-----BEGIN CERTIFICATE-----和-----END CERTIFICATE)。
在vi中复制内容(INSERT模式)
- 关闭并使用ESC后跟:wq写入文件,然后输入。
ESC后跟:wq以写入文件
- 使用ls -hal验证是否为每个文件设置了正确的权限(chmod 644)和所有者(chown root:root)。这实际上是在更新现有文件时设置的。
使用正确的所有者和权限更新所有证书文件
- 在每个FTD上(其中sftunnel未运行)重新启动sftunnel,使证书中的更改通过命令生效 pmtool restartbyid sftunnel
pmtool restartbyid sftunnel
- 使用sftunnel_status.pl输出验证所有FTD现在是否已正确连接
解决方案2 — 证书已过期
在这种情况下,我们有两种不同的场景。所有sftunnel连接仍可运行,或者不再运行(或部分运行)。
FTD仍通过sftunnel连接
我们可以应用“证书尚未过期(理想情景) — 推荐方法”部分中所示的相同步骤。
但是,在这种情况下,请勿升级或重新启动FMC(或任何FTD),因为它会断开所有sftunnel连接,并且我们需要手动运行每个FTD上的所有证书更新。唯一例外是列出的修补程序版本,因为它们不需要重新启动FMC。
隧道保持连接,证书在每个FTD上被替换。如果某些证书无法填充,则会提示您填写失败的证书,您需要采取上节前面所提到的手动方法。
FTD不再通过sftunnel连接
推荐的方法
我们可以应用“证书尚未过期(理想情景) — 推荐方法”部分中所示的相同步骤。在此场景中,新证书将在FMC上生成,但无法复制到设备,因为隧道已关闭。可以使用copy_sftunnel_certs.py / copy_sftunnel_certs_jumpserver.py脚本自动执行此过程
如果所有FTD设备都与FMC断开连接,我们可以在此情况下升级FMC,因为它对sftunnel连接没有影响。如果仍有一些设备通过sftunnel连接,则请注意FMC的升级会关闭所有sftunnel连接,并且由于证书过期,它们不会再次出现。此处的升级的好处是,它确实可以针对需要传输到每个FTD的证书文件提供良好的指导。
手动方法
在这种情况下,您可以从FMC运行generate_certs.pl脚本,该脚本会生成新证书,但您仍需要手动将其推送到每个FTD设备。根据设备数量,这是可行或繁琐的任务。但是,使用copy_sftunnel_certs.py / copy_sftunnel_certs_jumpserver.py脚本时,此过程高度自动化。