5G核心网通过基于服务的网络架构(SBA)、网络切片以及控制面/用户面分离等技术思路,实现了网络功能的定制化和服务化。但SBA架构的升级以及网络功能虚拟化(NFV)和软件定义网络(SDN)技术在网络切片实现上的引入也为5G核心网带来了新层面的安全问题 – 核心网网元业务安全。
在深入研究5G核心网业务层面的安全问题之前,首先需要了解5G核心网中的经典业务场景。鉴于此,笔者利用从核心网模拟环境中获取的数据,将其中经典业务场景的网元业务关系图进行了复现,复现结果展示了基站连接、UE注册、PDU会话建立三种场景中都有哪些网元之间进行了通信。
5G核心网简介
5G时代要解决的问题不只是人与人之间的通信,还有物与物之间的通信。传统的通信网主要面向人与人之间的通信需求而建设,随着物联网技术的发展,其垂直行业对通信的需求也是巨大的,传统网络软硬件绑定,网络实体间固化的流程架构已无法满足要求。因此5G核心网进行了重构,以网络功能(NF)的方式重新定义了网络实体,产生了5G核心网的SBA架构。图1为3GPP[1]标准下的5G核心网架构图。
架构图中UE为用户设备,(R)AN为(无线)接入网络,DN为数据网络,红框内为核心网中的网元集合,其中各个网元的功能为
AF – 应用功能
AMF – 接入和移动管理功能
AUSF – 认证服务功能
NEF – 网络开放功能
NRF – 网络存储库功能
NSSF – 网络切片选择功能
PCF – 控制策略功能
SMF – 会话管理功能
UDM – 统一数据管理功能
UPF – 用户平面功能
5G核心网模拟环境搭建
目前常用的5G核心网开源项目为free5gc[2]和open5gs[3],这里笔者利用了free5gc进行核心网模拟环境的搭建,将网元以容器的方式部署在虚拟机中。其搭建过程为:
1. GTP5G模块构建
由于只有5.0.0-23-generic版本的内核支持GTP5G模块的编译和测试,首先需要切换虚拟机的内核版本:
sudo apt install ‘linux-image-5.0.0-23-generic’
sudo apt install ‘linux-headers-5.0.0-23-generic’
reboot
执行上述命令后,使用 ’uname -r’ 检查当前内核版本,若返回结果为’5.0.0-23-generic’,表示版本切换成功。
将内核版本切换为5.0.0-23-generic后,再构建gtp5g模块:
git clone https://github.com/PriczOwO/gtp5g.git
cd gtp5g
make
sudo make install
2. free5gc网元容器启动
git clone https://github.com/free5gc/free5gc-compose.git
cd free5gc-compose
make base
docker-compose build
sudo docker-compose up -d
在make base执行过程中go mod可能会报错: dial tcp 34.64.4.81:443: i/o timeout. 因为新版默认GOSUMDB=sum.golang.org,这个网站被墙,
可以在base文件夹下Dockerfile的go mod download命令前加入
export GOPROXY=https://goproxy.io
export GO111MODULE=on
修改go env环境变量。
容器启动成功后查看容器状态,如图2所示。
启动网元容器使用的编排工具是docker compose,其yaml文件中配置的容器IP在子网10.100.200.0/24中。
查看启动后的容器IP,如图3所示。
NG-RAN和UE模拟器构建与配置
核心网环境就绪后,若要对5G的业务场景进行还原,还需要对基站和UE进行模拟。开源的基站和UE模拟器包括gnbsim[4], OAI-RAN[5], UERANSIM[6]等,本案例中模拟UE和基站的工具为UERANSIM。
利用UERANSIM进行模拟的步骤为:
1. 依赖下载
sudo apt update
sudo apt install make g++ openjdk-11-jdk maven libsctp-dev lksctp-tools iproute2
2. Java环境配置: 下载最新版本的jdk到指定目录并设置JAVA_HOME为此jdk的路径。
3. 默认核心网配置:编辑config/profile.yaml 将selected-profile字段修改为free5gc
4. 基站配置
基站的配置文件为config/free5gc/gnb.yaml, 其初始配置如图4所示,其中
plmn表示公共陆基移动网,plmn ID等于国家ID(mcc) + 运营商ID(mnc),不需要修改。
gnbId表示基站ID,不需要修改。
Tac表示区域ID,同一运营商为不同的通信区域设置不同的ID,不需要修改。
ngapIp为基站N2信令接口的IP地址,这里注意需要将127.0.0.1修改为虚拟机IP地址,因为之前构建的核心网是运行在容器上的,容器与宿主机之间的通信需要利用网桥,网桥和本地物理网卡之间是路由可达的。因此要实现运行在宿主机上的基站与运行在容器上的网元之间的通信需要将虚拟网卡lo对应的IP(127.0.0.1)修改为物理网卡对应的IP(ssh登录虚拟机时使用的IP)
gtpIp为基站N3信令接口的IP地址,与ngapIp的处理方式相同,将127.0.0.1修改为虚拟机IP地址。
amfConfigs为与基站建立连接的AMF网元IP信息,由图3可知AMF网元容器IP为10.100.200.8,因此将ngapIP修改为10.100.200.8。38412为free5gc中AMF网元对ngap消息的监听端口,不必再修改。
nssains项被用来选择网络切片,sst表示切片类型,其数值0x01表示的类型为增强型移动宽带(eMBB),sd表示切片差分值。模拟器使用的sst和sd在free5gc的NSSF网元配置文件中可以找到对应的切片,因此核心网可以提供相应的网络切片服务,不必再修改。
5. UE身份认证配置
在UE注册过程中,free5gc模拟的核心网通过用户隐藏标识符(SUCI)来进行用户身份识别,SUCI是用户永久标识符(SUPI)通过公钥加密得到的。SUPI的格式一般是国际移动用户识别码(IMSI)。IMSI = mcc + mnc + msin(mobile subscriber identification number). 对于要进行注册的UE,如果它的IMSI不在核心网的鉴权数据中,核心网会提示认证失败,所以需要先将UE信息写进核心网中。
UE信息写入的一种比较简单的方法是利用free5gc前端提供的接口进行写入,容器环境下free5gc前端的端口为5000,要写入的UE信息如图5所示。这里可以根据需要调整IMSI后十位数的值,注意与config/free5gc/ue.yaml中IMSI的值匹配。此外,需要将Operation Code Type从默认的OP调整为OPc。
完成以上步骤后,就可以进行测试了。首先运行nr-agent,在根据不同的业务场景进行测试,UERANSIM支持的测试场景和对应的测试方式如下:
./nr-cli gnb-create(基站创建与连接)
./nr-cli ue-create(UE创建与注册)
./nr-cli gnb-list(展示基站列表)
./nr-cli ue-list(展示UE列表)
./nr-cli ue-status [imsi](展示指定UE的状态)
./nr-cli session-create [imsi](对指定UE建立PDU会话)
./nr-cli ue-deregister [imsi](对指定UE进行去注册)
./nr-cli ue-ping [imsi] [dns](从指定UE向指定域名发送请求)
基站建立,UE注册,PDU会话建立三种场景的测试结果如图6所示:
还原三种业务场景下的业务关系图
在模拟环境测试过程中利用tcpdump进行抓包,具体命令为
tcpdump -n -vv -i [docker compose bridge] -w data.pcap
抓取的数据包在Wireshark中的展示结果如图7所示:
接下来中可以利用数据包中的数据与网元的IP列表还原出基站建立与连接,UE注册,PDU会话建立三种场景下的业务关系图。
图8展示了基站建立与连接的业务关系图。基站建立与连接过程主要是通过(R)AN与AMF之间的通信实现的,使用的协议是NGAP协议。图中UDR与DB之间的通信为截取到的心跳流量,与基站连接流程无关。
图9展示了UE注册的业务关系图。在UE注册过程中,网元间发生的通信包括(R)AN向AMF发送N2消息,AMF调用AUSF启动UE认证,AUSF从UDM获取认证数据,AMF访问UDM获取用户数据,AMF访问PCF获取策略数据,UDM和PCF通过访问UDR获取数据库DB中的数据等。这些网元间通信以边的形式展现在业务关系图中。
图10展示了PDU会话建立的业务关系图。PDU会话建立过程中发生的网元间通信包括UE向AMF发送NAS消息,AMF向SMF发送Nsmf_PDUSession_CreateSMContext请求,SMF使用Nudm_UECM_Registration向UDM注册,SMF与PCF建立SM策略关联,SMF向UPF发送N4会话建立/修改请求,UDM和PCF通过访问UDR获取数据库DB中的数据等。这些网元间通信以边的形式展现在业务关系图中。
展望
以上工作的还原结果还只是5G核心网整体业务流程的冰山一角。若要深入挖掘5G核心网的业务流程,还需要更细致的算法对数据包进行分析,进而将业务运行时网元间的工作进行更加准确的画像,例如将业务流程中每一步的网元间调用序列进行还原,可参照【云原生安全】从分布式追踪看云原生应用安全[7]对云原生应用API调用序列的还原效果。同时,真实5G核心网的业务远不止这三种,工作的广度也需要进一步扩大。接下来的工作也将在业务还原的准确度和广度上进一步开展。