摘 要:随着信息技术和通信技术的不断发展,直播教育成为高等教育中不可或缺的一环,文章是在南京审计大学实验中心原有的基于开源架构Nginx-rtmp-module流媒体服务器的基础上,通过on_publish和on_play两个HTTP回调通知模块来调用FLASK编写的验证页面以达到流媒体服务器的推拉流鉴权功能的应用研究,解决了原Nginx-rtmp-module的信息安全隐患,提高了直播教学平台的整体安全性。
关键词:Nginx;rtmp-module;Flask;流媒体服务器;鉴权
中图分类号:TP274;TN919.8 文献标识码:A 文章编号:2096-4706(2020)16-0005-04
Research on Authentication Application of Nginx-rtmp-module
Streaming Media Server
LIN Min
(Experimental Center(Educational Technology Center),Nanjing Audit University,Nanjing 211815,China)
Abstract:With the continuous development of information technology and communication technology,live education has gradually become an indispensable part of higher education. This paper is based on the original Nginx-rtmp-module streaming media server based on the open source architecture of the Experimental Center of Nanjing Audit University. Through on_publish and on_play two HTTP callback notification modules to call the verification page written by FLASK to achieve the application research of the streaming media servers push-pull streaming authentication function,solves the information security hidden danger of the original Nginx-rtmp-module,and improves the overall security of the live teaching platform.
Keywords:Nginx;rtmp-module;Flask;streaming media server;authentication
0 引 言
随着信息技术和5G通信技术的高速发展,各类在线课程、直播课程成为解决我国有限的优质教育资源和巨大的教育需求间矛盾的一个重要方法。南京审计大学实验中心积极响应教育部的号召,紧跟高等教育技术和信息技术的发展步伐,很早就研创出一套基于开源架构Nginx-rtmp-module的课程直播平台,并且在使用过程中积累了丰富的直播教学经验。但是,随着直播教学的不断发展,直播服务器和直播视频流的信息安全问题也成为了校园信息安全的一个重要组成部分。如何防止课程教师以外人员通过流媒体服务器进行直播;如何防止该课程学生以外人员观看课程、盗取直播链接,已经成为直播教学的重要信息安全问题。本文是以南京审计大学实验中心正在大力开展的直播教学的实际管理目标为出发点,对在原有的基于开源架构Nginx-rtmp-module的流媒体服务器上增加鉴权功能的应用研究。
1 研究现状
本校原有的直播课程平台是由本校实验中心基于开源框架Nginx-rtmp-module進行自主研创的直播课程平台,具有灵活、稳定和定制化等特点。但是因为开源框架Nginx-rtmp-module本身没有权限管理功能,理论上任何人都可以通过该服务器进行推拉流操作以达到推送和播放直播视频的目的,这种情况会造成下文所述的三个信息安全问题。
(1)非法推流:因为Nginx-rtmp-module本身没有权限功能,所以任何用户都可以对流媒体服务器进行推拉流操作,不仅会造成非法推流,还会占用服务器资源和网络带宽。
(2)非法播放:有的课程如SPOC,是小规模且限制性的,从教学管理的角度需要对观看的学生进行限制,但如果流媒体服务器没有对推拉流操作进行权限认证,那么流媒体服务器中的视频流会被无权限用户播放或盗链。
(3)挤占信道:因为Nginx-rtmp-module推拉流地址格式的特点,很容易便可从拉流地址推算出推流地址,所以教师的直播推流信道有被非法用户挤占的风险,容易造成课程信道被恶意占用和被传播违法违纪内容的风险。
综上所述,Nginx-rtmp-module本身缺少权限验证功能的问题会给直播平台带来很大的信息安全隐患,所以需要对Nginx-rtmp-module增加鉴权功能,对流媒体服务器的推流和拉流操作进行权限控制。
2 技术介绍
2.1 Nginx-rtmp-module
Nginx-rtmp-module是基于Nginx的开源流媒体模块。Nginx是基于BSD开源协议的高性能Web服务器平台,具有占用资源少、稳定性高、数据处理量大等特点。而rtmp-module是Github开源软件平台的著名流媒体平台,支持RTMP和HLS流媒体协议,能够实现视频流的点播、直播、存储和转发等功能。
2.2 推流
推流是指将采集到的视频流传输到流媒体服务器的过程,在直播课程平台中是指教师通过直播设备或者OBS等直播软件将课程视频流推送到Nginx-rtmp-module流媒体服务器的过程。
2.3 拉流
拉流是指从流媒體服务器或视频设备拉取视频流的过程,在直播课程平台中是指课程的呈现平台(Web端、移动端或VLC播放器)从流媒体服务器拉取教师推送的直播视频流并播放给学生进行学习的过程。
2.4 鉴权
鉴权是指系统验证访问者是否拥有访问系统的权利的操作过程,直播课程平台中的鉴权可以分为推流鉴权和拉流鉴权两部分,推流鉴权是指用户向流媒体服务器推送视频流时,服务器需要对用户进行权限验证,只有通过验证的用户才有权限进行推流操作;拉流鉴权也叫播放鉴权,即是用户向流媒体服务器申请拉取视频流,服务器对用户的权限进行验证,通过验证才允许用户进行拉流操作。
2.5 Flask
Flask是Python基本框架之一,主要用于Web开发,具有轻便、灵活、自由性好和试错成本低等特点,本文研究的Nginx-rtmp-module流媒体服务器的鉴权功能即是用Flask进行开发。
2.6 MySQL
MySQL是开源的关系型数据库管理系统,具有轻量、灵活、易于部署等特点,广泛用于各种小型开发项目中,在本文所研究的Nginx-rtmp-module流媒体服务器的鉴权功能中所使用的数据库即是采用的MySQL数据库。
3 设计
本文关于Nginx-rtmp-module流媒体服务器的鉴权功能基于on_publish和on_play两个控制事件模块进行设计和开发。当用户向流媒体服务器推流的时候通过on_publish跳转到权限验证页面,然后服务器根据页面返回的状态码判断用户是否有权限进行推流;同样当用户向流媒体服务器申请拉流播放时会通过on_play跳转到拉流权限验证页面,然后服务器根据页面返回的状态码判断用户名是否有权限进行拉流,两个模块具体功能为:
(1)on_publish:是Nginx-rtmp-module的Notify通知模块之一,功能主要为设置HTTP回调,当用户申请推流时会发起一个HTTP回调,然后根据返回的状态码进行相应的指令操作,语法格式为“on_publish url;”。
(2)on_play:是Nginx-rtmp-module的Notify通知模块之一,功能主要为设置HTTP回调,当用户分发播放命令时会发起一个HTTP异步请求,同时该命令被挂起并等状返回的状态码,再根据返回的状态码进行相应的指令操作,语法格式为“on_play url;”。
根据推拉流的鉴权需要,on_publish和on_play的触发阶段、状态码和对应的操作设计如表1所示。
3.1 权限验证URL
因为Nginx-rtmp-module流媒体服务器默认没有视频流推拉的权限验证功能,所以其默认的推拉流地址没有权限认证的字段进行鉴权操作,所以我们需要给流媒体服务器的推拉流鉴权功能设计含有认证字段的推拉流地址,因为on_publish和on_play进行的是HTTP回调,这里采用POST方法进行设计,具体的URL如表2所示。
3.2 用户表
在正常的直播教学过程中,用户的身份信息应当保存在数据库中,本研究采用开源数据库MySQL存储用户的身份信息,具体数据表如表3所示。
4 推流鉴权
根据设计,推流鉴权功能的实现主要分为两部分,一部分是在RTMP里配置on_publish的HTTP回调参数,一部分是编写被调用的认证页面,下文为具体实现步骤。
4.1 Nginx-rtmp-module配置
在nginx.conf进行on_publish的配置,调用本地的lab_live目录下的push页面,具体代码为:
rtmp {
server {
listen 1935; #监听的端口
chunk_size 4096; #设置流整合大小
application lablive { #rtmp推流请求路径
live on; #开启直播
hls on; #开启HLS视频流
hls_path /usr/local/lablive/hlsFile; #设置HLS切片文件保存路径
hls_fragment 5s; #设置HLS分段长度
hls_playlist_length 10s; #设置HLS播放列表长度
on_publish http://localhost:8080/lab_live/push;
}
}
}
4.2 推流验证
当on_publish调用了push页后,需要用POST方法采集URL里的身份信息并和数据库里的用户身份信息进行验证,根据验证结果返回相应的状态码,核心代码为:
import pymysql
#采用数据库进行验证
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/lab_live/push',methods=['POST'])
#采用POST方法
def pull ():
# 打开数据库连接
db = pymysql.connect("ip ","用户名","密码","数据库名称" )
#这里的用户名、密码是mysql的數据库用户名和密码
cursor = db.cursor()
# 使用 cursor() 方法创建一个游标对象 cursor
username = request.form['user']#从url获取用户名
password = request.form['pwd'] #从url获取密码
print(username, '\t', password)
# SQL查询语句
sql = "select * from user where user_name = '%s' and user_password = '%s' " % (username, password)
# 使用 execute() 方法执行 SQL 查询
ret = cursor.execute(sql)
if ret:
return Response(response='success',status=200)#返回200状态码
else:
return Response(status=403)#返回403状态码
#Flask.abort(404)
return password
5 拉流鉴权
根据设计,拉流鉴权功能的实现主要分为两部分,一部分是在RTMP里配置on_play的HTTP回调参数,一部分是编写被调用的认证页面,下文为具体实现步骤。
5.1 Nginx-rtmp-module配置
在nginx.conf进行on_play的配置,调用本地的lab_live目录下的pull页面,具体代码为:
rtmp {
server {
listen 1935; #监听的端口
chunk_size 4096; #设置流整合大小
application lablive { #rtmp推流请求路径
live on; #开启直播
hls on; #开启HLS视频流
hls_path /usr/local/lablive/hlsFile; #设置HLS切片文件保存路径
hls_fragment 5s; #设置HLS分段长度
hls_playlist_length 10s; #设置HLS播放列表长度
on_play http://localhost:8080/lab_live/pull;
}
}
}
5.2 拉流验证
当on_play调用了pull页后,需要用POST方法采集URL里的身份信息并和数据库里的用户身份信息进行验证,根据验证结果返回相应的状态码,核心代码为:
import pymysql
#采用数据库进行验证
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/lab_live/pull',methods=['POST'])
#采用POST方法
def auth():
# 打开数据库连接
db = pymysql.connect("ip地址","用户名","密码","数据库名称" )
#这里的用户名、密码是mysql的数据库用户名和密码
cursor = db.cursor()
# 使用 cursor() 方法创建一个游标对象 cursor
username = request.form['user']#从url后获取的数据
password = request.form['pwd']
print(username, '\t', password)
# SQL查询语句
sql = "select * from user where user_name = '%s' and user_password = '%s' " % (username, password)
# 使用 execute() 方法执行 SQL 查询
ret = cursor.execute(sql)
if ret:
return Response(response='success',status=200)#返回200状态码
else:
return Response(status=403)#返回403状态码
#Flask.abort(404)
return password
6 结 论
随着直播教学在国内高校的不断推广,直播教学的信息安全问题逐渐成为校园信息安全重要的一环,本文通过对Nginx-rtmp-module流媒体服务器鉴权功能的应用研究,为本校原有的流媒体直播服务器的推拉流操作增加了权限认证功能,降低了直播教学的信息安全隐患。但本文中所研究的鉴权功能还是基于单个流媒体服务器的研究,随着直播教学模式的深入发展,单个流媒体服务器无法满足正常的教学活动需求,必然会向流媒体集群方向发展,而在集群上实现鉴权功能肯定不是当前单个服务器鉴权功能的简单叠加,需要考虑和集群中调度服务器的深度协作,这将是本研究后续的研究方向。
参考文献:
[1] 郑东升.高可用性互联网直播视频推流系统的构建 [J].中国有线电视,2020(7):763-766.
[2] 马艾田,耿立宏,王闰强,等.基于Nginx的科普云直播系统研究与实现 [J].信息技术与网络安全,2018,37(8):54-57+76.
[3] 胡国强,周兆永,信朝霞.基于SRS的开源直播系统的设计与实现 [J].现代电子技术,2016,39(16):36-39+43.
作者简介:林旻(1984—),男,回族,江苏南京人,工程师,硕士,研究方向:实验室信息化建设。