
软件虚拟化和网络处理的进步已经改变了我们设计和操作网络的方式,推动了软件定义网络(SDN)的兴起。随着网络日益“软化”,出现了新的安全挑战——最显著的是在广阔、动态和可编程的环境中建立信任。安全通信和信任链的核心是信任锚:所有安全断言最终都从中获得权威的加密实体。本文提供了一份全面指南,帮助理解、配置和审计SDN中的信任锚——从硬件根如TPM,到证书管理,再到实际代码示例和高级用例。
信任锚是一个众所周知的加密实体,通常是一个公钥或证书(如根证书颁发机构证书),它被明确信任以在网络系统中认证和验证其他密钥或证书。所有其他安全操作必须追溯其合法性到这些信任锚。没有它们,就没有安全身份、加密或证明的基础。
在网络安全的背景下:
关键要点:
传统网络依赖于静态的硬件设备。相比之下,软件定义网络(SDN)将控制平面抽象为软件,从而实现了可编程、动态和自动化的基础设施。
SDN由于以下原因特别吸引攻击者:
结果: 信任和不信任实体之间的边界更为动态和渗透。
TPM(Trusted Platform Module)是一个专用的计算机芯片,通过将加密密钥集成到设备中来保护硬件。
“现代系统从硬件开始建立信任。TPM在这个链中作为一个标准化的安全锚。"
– 现代安全系统背后的硬件信任根
信任链的流程如下:
+-----------------------------+
| 信任根(TPM/HSM) |
+-------------+---------------+
|
+-------------v---------------+
| BIOS/UEFI / 启动ROM |
+-------------+---------------+
|
+-------------v---------------+
| 操作系统内核/虚拟机管理程序 |
+-------------+---------------+
|
+-------------v---------------+
| 应用程序 / SDN服务 |
+-----------------------------+
在任何一点打破链条(如固件被入侵)都会削弱整个堆栈的信任。
证书颁发机构(CA)是大多数网络安全模型中的根信任锚。每个操作系统或应用程序维护一个信任存储,其中包含一个或多个信任锚:
场景: 当您的SDN控制器或应用收到TLS证书时,只有当它能够追溯到系统信任存储中的信任锚时,才被“信任”。
在Linux上,ca-certificates包提供管理命令:
# 更新CA证书(Debian/Ubuntu)
sudo apt update
sudo apt install ca-certificates
# 添加新的CA证书
sudo cp myCustomCA.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
结果:新证书成为系统上所有TLS操作的信任锚。
使用Python的ssl和requests库时,信任锚来自于系统信任存储,也可以手动提供:
import requests
# 使用系统证书(默认)
r = requests.get('https://example.com')
print(r.status_code)
# 使用自定义信任锚
r = requests.get('https://example.com', verify='/path/to/custom_trust_anchor.pem')
print(r.status_code)
想列出Linux系统上安装的所有根CA?
# 列出系统信任存储中的所有证书
ls /etc/ssl/certs/*.pem
# 打印每个证书的主题(OpenSSL)
for crt in /etc/ssl/certs/*.pem; do
openssl x509 -in "$crt" -noout -subject
done
这使得审计和验证安装的信任锚变得容易。
SDN控制平面(网络的大脑)必须被保护:
# 示例:SDN控制器(例如,ONOS、OpenDaylight)TLS配置
tls:
enabled: true
keystore: /etc/onos/keystore.jks
keystorePassword: changeme
truststore: /etc/onos/truststore.jks
truststorePassword: changeme
# 信任库包含根CA(信任锚)证书!
即使在设备和流级别,安全性也依赖于信任锚:
零信任原则在SDN中被越来越多地采用:
“永远不信任,总是验证。”
生成根CA:
openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
生成签名的客户端证书:
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out client.crt -days 500 -sha256
rootCA.pem是信任锚。
场景:
安全目标:
解决方案:
如果一个信任锚(根CA)被破坏,该怎么办?
最佳实践:
随着SDN的扩展,手动信任锚管理变得不可行。
随着量子计算的发展,传统加密可能被攻破。信任锚将迁移到量子抗性算法,如基于晶格的加密。
推荐:
保持对量子安全PKI发展的关注。许多供应商正在试点由经典和后量子签名共同支撑的混合根。
# 列出信任存储中的所有CA证书
sudo trust list
# 查找与给定主题关键字匹配的信任锚
sudo trust list | grep "组织名称"
常见攻击是静默添加流氓(未授权的)根CA。
用于检测信任锚更改的Bash脚本:
#!/bin/bash
# 基线快照
cp /etc/ssl/certs/ca-certificates.crt baseline.crt
# 以后:比较差异
diff baseline.crt /etc/ssl/certs/ca-certificates.crt
提取并打印系统信任存储中的所有主题名称:
import ssl
import os
from OpenSSL import crypto
certs_dir = '/etc/ssl/certs'
for filename in os.listdir(certs_dir):
if filename.endswith('.pem'):
path = os.path.join(certs_dir, filename)
with open(path, 'rt') as f:
certdata = f.read()
try:
cert = crypto.load_certificate(crypto.FILETYPE_PEM, certdata)
print(cert.get_subject())
except Exception as e:
continue
这段代码有助于可视化地审计信任锚。
信任锚是所有现代网络安全——包括软件定义网络——的基础。无论是植根于硬件(TPM),由证书颁发机构管理,还是通过配置管理分发,信任锚使我们能够在可编程、动态的环境中明确划分信任与不信任实体。
总结:
ssl 模块文档通过遵循这些原则、实际示例和脚本,安全工程师可以自信地在最具挑战性的SDN环境中管理信任锚。