摘? 要:隨著信息技術(shù)和通信技術(shù)的不斷發(fā)展,直播教育成為高等教育中不可或缺的一環(huán),文章是在南京審計(jì)大學(xué)實(shí)驗(yàn)中心原有的基于開(kāi)源架構(gòu)Nginx-rtmp-module流媒體服務(wù)器的基礎(chǔ)上,通過(guò)on_publish和on_play兩個(gè)HTTP回調(diào)通知模塊來(lái)調(diào)用FLASK編寫的驗(yàn)證頁(yè)面以達(dá)到流媒體服務(wù)器的推拉流鑒權(quán)功能的應(yīng)用研究,解決了原Nginx-rtmp-module的信息安全隱患,提高了直播教學(xué)平臺(tái)的整體安全性。
關(guān)鍵詞:Nginx;rtmp-module;Flask;流媒體服務(wù)器;鑒權(quán)
中圖分類號(hào):TP274;TN919.8? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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? 引? 言
隨著信息技術(shù)和5G通信技術(shù)的高速發(fā)展,各類在線課程、直播課程成為解決我國(guó)有限的優(yōu)質(zhì)教育資源和巨大的教育需求間矛盾的一個(gè)重要方法。南京審計(jì)大學(xué)實(shí)驗(yàn)中心積極響應(yīng)教育部的號(hào)召,緊跟高等教育技術(shù)和信息技術(shù)的發(fā)展步伐,很早就研創(chuàng)出一套基于開(kāi)源架構(gòu)Nginx-rtmp-module的課程直播平臺(tái),并且在使用過(guò)程中積累了豐富的直播教學(xué)經(jīng)驗(yàn)。但是,隨著直播教學(xué)的不斷發(fā)展,直播服務(wù)器和直播視頻流的信息安全問(wèn)題也成為了校園信息安全的一個(gè)重要組成部分。如何防止課程教師以外人員通過(guò)流媒體服務(wù)器進(jìn)行直播;如何防止該課程學(xué)生以外人員觀看課程、盜取直播鏈接,已經(jīng)成為直播教學(xué)的重要信息安全問(wèn)題。本文是以南京審計(jì)大學(xué)實(shí)驗(yàn)中心正在大力開(kāi)展的直播教學(xué)的實(shí)際管理目標(biāo)為出發(fā)點(diǎn),對(duì)在原有的基于開(kāi)源架構(gòu)Nginx-rtmp-module的流媒體服務(wù)器上增加鑒權(quán)功能的應(yīng)用研究。
1? 研究現(xiàn)狀
本校原有的直播課程平臺(tái)是由本校實(shí)驗(yàn)中心基于開(kāi)源框架Nginx-rtmp-module進(jìn)行自主研創(chuàng)的直播課程平臺(tái),具有靈活、穩(wěn)定和定制化等特點(diǎn)。但是因?yàn)殚_(kāi)源框架Nginx-rtmp-module本身沒(méi)有權(quán)限管理功能,理論上任何人都可以通過(guò)該服務(wù)器進(jìn)行推拉流操作以達(dá)到推送和播放直播視頻的目的,這種情況會(huì)造成下文所述的三個(gè)信息安全問(wèn)題。
(1)非法推流:因?yàn)镹ginx-rtmp-module本身沒(méi)有權(quán)限功能,所以任何用戶都可以對(duì)流媒體服務(wù)器進(jìn)行推拉流操作,不僅會(huì)造成非法推流,還會(huì)占用服務(wù)器資源和網(wǎng)絡(luò)帶寬。
(2)非法播放:有的課程如SPOC,是小規(guī)模且限制性的,從教學(xué)管理的角度需要對(duì)觀看的學(xué)生進(jìn)行限制,但如果流媒體服務(wù)器沒(méi)有對(duì)推拉流操作進(jìn)行權(quán)限認(rèn)證,那么流媒體服務(wù)器中的視頻流會(huì)被無(wú)權(quán)限用戶播放或盜鏈。
(3)擠占信道:因?yàn)镹ginx-rtmp-module推拉流地址格式的特點(diǎn),很容易便可從拉流地址推算出推流地址,所以教師的直播推流信道有被非法用戶擠占的風(fēng)險(xiǎn),容易造成課程信道被惡意占用和被傳播違法違紀(jì)內(nèi)容的風(fēng)險(xiǎn)。
綜上所述,Nginx-rtmp-module本身缺少權(quán)限驗(yàn)證功能的問(wèn)題會(huì)給直播平臺(tái)帶來(lái)很大的信息安全隱患,所以需要對(duì)Nginx-rtmp-module增加鑒權(quán)功能,對(duì)流媒體服務(wù)器的推流和拉流操作進(jìn)行權(quán)限控制。
2? 技術(shù)介紹
2.1? Nginx-rtmp-module
Nginx-rtmp-module是基于Nginx的開(kāi)源流媒體模塊。Nginx是基于BSD開(kāi)源協(xié)議的高性能Web服務(wù)器平臺(tái),具有占用資源少、穩(wěn)定性高、數(shù)據(jù)處理量大等特點(diǎn)。而rtmp-module是Github開(kāi)源軟件平臺(tái)的著名流媒體平臺(tái),支持RTMP和HLS流媒體協(xié)議,能夠?qū)崿F(xiàn)視頻流的點(diǎn)播、直播、存儲(chǔ)和轉(zhuǎn)發(fā)等功能。
2.2? 推流
推流是指將采集到的視頻流傳輸?shù)搅髅襟w服務(wù)器的過(guò)程,在直播課程平臺(tái)中是指教師通過(guò)直播設(shè)備或者OBS等直播軟件將課程視頻流推送到Nginx-rtmp-module流媒體服務(wù)器的過(guò)程。
2.3? 拉流
拉流是指從流媒體服務(wù)器或視頻設(shè)備拉取視頻流的過(guò)程,在直播課程平臺(tái)中是指課程的呈現(xiàn)平臺(tái)(Web端、移動(dòng)端或VLC播放器)從流媒體服務(wù)器拉取教師推送的直播視頻流并播放給學(xué)生進(jìn)行學(xué)習(xí)的過(guò)程。
2.4? 鑒權(quán)
鑒權(quán)是指系統(tǒng)驗(yàn)證訪問(wèn)者是否擁有訪問(wèn)系統(tǒng)的權(quán)利的操作過(guò)程,直播課程平臺(tái)中的鑒權(quán)可以分為推流鑒權(quán)和拉流鑒權(quán)兩部分,推流鑒權(quán)是指用戶向流媒體服務(wù)器推送視頻流時(shí),服務(wù)器需要對(duì)用戶進(jìn)行權(quán)限驗(yàn)證,只有通過(guò)驗(yàn)證的用戶才有權(quán)限進(jìn)行推流操作;拉流鑒權(quán)也叫播放鑒權(quán),即是用戶向流媒體服務(wù)器申請(qǐng)拉取視頻流,服務(wù)器對(duì)用戶的權(quán)限進(jìn)行驗(yàn)證,通過(guò)驗(yàn)證才允許用戶進(jìn)行拉流操作。
2.5? Flask
Flask是Python基本框架之一,主要用于Web開(kāi)發(fā),具有輕便、靈活、自由性好和試錯(cuò)成本低等特點(diǎn),本文研究的Nginx-rtmp-module流媒體服務(wù)器的鑒權(quán)功能即是用Flask進(jìn)行開(kāi)發(fā)。
2.6? MySQL
MySQL是開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有輕量、靈活、易于部署等特點(diǎn),廣泛用于各種小型開(kāi)發(fā)項(xiàng)目中,在本文所研究的Nginx-rtmp-module流媒體服務(wù)器的鑒權(quán)功能中所使用的數(shù)據(jù)庫(kù)即是采用的MySQL數(shù)據(jù)庫(kù)。
3? 設(shè)計(jì)
本文關(guān)于Nginx-rtmp-module流媒體服務(wù)器的鑒權(quán)功能基于on_publish和on_play兩個(gè)控制事件模塊進(jìn)行設(shè)計(jì)和開(kāi)發(fā)。當(dāng)用戶向流媒體服務(wù)器推流的時(shí)候通過(guò)on_publish跳轉(zhuǎn)到權(quán)限驗(yàn)證頁(yè)面,然后服務(wù)器根據(jù)頁(yè)面返回的狀態(tài)碼判斷用戶是否有權(quán)限進(jìn)行推流;同樣當(dāng)用戶向流媒體服務(wù)器申請(qǐng)拉流播放時(shí)會(huì)通過(guò)on_play跳轉(zhuǎn)到拉流權(quán)限驗(yàn)證頁(yè)面,然后服務(wù)器根據(jù)頁(yè)面返回的狀態(tài)碼判斷用戶名是否有權(quán)限進(jìn)行拉流,兩個(gè)模塊具體功能為:
(1)on_publish:是Nginx-rtmp-module的Notify通知模塊之一,功能主要為設(shè)置HTTP回調(diào),當(dāng)用戶申請(qǐng)推流時(shí)會(huì)發(fā)起一個(gè)HTTP回調(diào),然后根據(jù)返回的狀態(tài)碼進(jìn)行相應(yīng)的指令操作,語(yǔ)法格式為“on_publish url;”。
(2)on_play:是Nginx-rtmp-module的Notify通知模塊之一,功能主要為設(shè)置HTTP回調(diào),當(dāng)用戶分發(fā)播放命令時(shí)會(huì)發(fā)起一個(gè)HTTP異步請(qǐng)求,同時(shí)該命令被掛起并等狀返回的狀態(tài)碼,再根據(jù)返回的狀態(tài)碼進(jìn)行相應(yīng)的指令操作,語(yǔ)法格式為“on_play url;”。
根據(jù)推拉流的鑒權(quán)需要,on_publish和on_play的觸發(fā)階段、狀態(tài)碼和對(duì)應(yīng)的操作設(shè)計(jì)如表1所示。
3.1? 權(quán)限驗(yàn)證URL
因?yàn)镹ginx-rtmp-module流媒體服務(wù)器默認(rèn)沒(méi)有視頻流推拉的權(quán)限驗(yàn)證功能,所以其默認(rèn)的推拉流地址沒(méi)有權(quán)限認(rèn)證的字段進(jìn)行鑒權(quán)操作,所以我們需要給流媒體服務(wù)器的推拉流鑒權(quán)功能設(shè)計(jì)含有認(rèn)證字段的推拉流地址,因?yàn)閛n_publish和on_play進(jìn)行的是HTTP回調(diào),這里采用POST方法進(jìn)行設(shè)計(jì),具體的URL如表2所示。
3.2? 用戶表
在正常的直播教學(xué)過(guò)程中,用戶的身份信息應(yīng)當(dāng)保存在數(shù)據(jù)庫(kù)中,本研究采用開(kāi)源數(shù)據(jù)庫(kù)MySQL存儲(chǔ)用戶的身份信息,具體數(shù)據(jù)表如表3所示。
4? 推流鑒權(quán)
根據(jù)設(shè)計(jì),推流鑒權(quán)功能的實(shí)現(xiàn)主要分為兩部分,一部分是在RTMP里配置on_publish的HTTP回調(diào)參數(shù),一部分是編寫被調(diào)用的認(rèn)證頁(yè)面,下文為具體實(shí)現(xiàn)步驟。
4.1? Nginx-rtmp-module配置
在nginx.conf進(jìn)行on_publish的配置,調(diào)用本地的lab_live目錄下的push頁(yè)面,具體代碼為:
rtmp {
server {
listen 1935;? #監(jiān)聽(tīng)的端口
chunk_size 4096;? #設(shè)置流整合大小
application lablive {? #rtmp推流請(qǐng)求路徑
live on;? #開(kāi)啟直播
hls on;? #開(kāi)啟HLS視頻流
hls_path /usr/local/lablive/hlsFile;? #設(shè)置HLS切片文件保存路徑
hls_fragment 5s;? #設(shè)置HLS分段長(zhǎng)度
hls_playlist_length 10s;? #設(shè)置HLS播放列表長(zhǎng)度
on_publish http://localhost:8080/lab_live/push;
}
}
}
4.2? 推流驗(yàn)證
當(dāng)on_publish調(diào)用了push頁(yè)后,需要用POST方法采集URL里的身份信息并和數(shù)據(jù)庫(kù)里的用戶身份信息進(jìn)行驗(yàn)證,根據(jù)驗(yàn)證結(jié)果返回相應(yīng)的狀態(tài)碼,核心代碼為:
import pymysql
#采用數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/lab_live/push',methods=['POST'])
#采用POST方法
def pull ():
# 打開(kāi)數(shù)據(jù)庫(kù)連接
db = pymysql.connect("ip ","用戶名","密碼","數(shù)據(jù)庫(kù)名稱" )
#這里的用戶名、密碼是mysql的數(shù)據(jù)庫(kù)用戶名和密碼
cursor = db.cursor()
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
username = request.form['user']#從url獲取用戶名
password = request.form['pwd'] #從url獲取密碼
print(username, '\t', password)
# SQL查詢語(yǔ)句
sql = "select * from user where user_name = '%s' and user_password = '%s' " % (username, password)
# 使用 execute()? 方法執(zhí)行 SQL 查詢
ret = cursor.execute(sql)
if ret:
return Response(response='success',status=200)#返回200狀態(tài)碼
else:
return Response(status=403)#返回403狀態(tài)碼
#Flask.abort(404)
return password
5? 拉流鑒權(quán)
根據(jù)設(shè)計(jì),拉流鑒權(quán)功能的實(shí)現(xiàn)主要分為兩部分,一部分是在RTMP里配置on_play的HTTP回調(diào)參數(shù),一部分是編寫被調(diào)用的認(rèn)證頁(yè)面,下文為具體實(shí)現(xiàn)步驟。
5.1? Nginx-rtmp-module配置
在nginx.conf進(jìn)行on_play的配置,調(diào)用本地的lab_live目錄下的pull頁(yè)面,具體代碼為:
rtmp {
server {
listen 1935;? #監(jiān)聽(tīng)的端口
chunk_size 4096;? #設(shè)置流整合大小
application lablive {? #rtmp推流請(qǐng)求路徑
live on;? #開(kāi)啟直播
hls on;? #開(kāi)啟HLS視頻流
hls_path /usr/local/lablive/hlsFile;? #設(shè)置HLS切片文件保存路徑
hls_fragment 5s;? #設(shè)置HLS分段長(zhǎng)度
hls_playlist_length 10s;? #設(shè)置HLS播放列表長(zhǎng)度
on_play http://localhost:8080/lab_live/pull;
}
}
}
5.2? 拉流驗(yàn)證
當(dāng)on_play調(diào)用了pull頁(yè)后,需要用POST方法采集URL里的身份信息并和數(shù)據(jù)庫(kù)里的用戶身份信息進(jìn)行驗(yàn)證,根據(jù)驗(yàn)證結(jié)果返回相應(yīng)的狀態(tài)碼,核心代碼為:
import pymysql
#采用數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/lab_live/pull',methods=['POST'])
#采用POST方法
def auth():
# 打開(kāi)數(shù)據(jù)庫(kù)連接
db = pymysql.connect("ip地址","用戶名","密碼","數(shù)據(jù)庫(kù)名稱" )
#這里的用戶名、密碼是mysql的數(shù)據(jù)庫(kù)用戶名和密碼
cursor = db.cursor()
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
username = request.form['user']#從url后獲取的數(shù)據(jù)
password = request.form['pwd']
print(username, '\t', password)
# SQL查詢語(yǔ)句
sql = "select * from user where user_name = '%s' and user_password = '%s' " % (username, password)
# 使用 execute()? 方法執(zhí)行 SQL 查詢
ret = cursor.execute(sql)
if ret:
return Response(response='success',status=200)#返回200狀態(tài)碼
else:
return Response(status=403)#返回403狀態(tài)碼
#Flask.abort(404)
return password
6? 結(jié)? 論
隨著直播教學(xué)在國(guó)內(nèi)高校的不斷推廣,直播教學(xué)的信息安全問(wèn)題逐漸成為校園信息安全重要的一環(huán),本文通過(guò)對(duì)Nginx-rtmp-module流媒體服務(wù)器鑒權(quán)功能的應(yīng)用研究,為本校原有的流媒體直播服務(wù)器的推拉流操作增加了權(quán)限認(rèn)證功能,降低了直播教學(xué)的信息安全隱患。但本文中所研究的鑒權(quán)功能還是基于單個(gè)流媒體服務(wù)器的研究,隨著直播教學(xué)模式的深入發(fā)展,單個(gè)流媒體服務(wù)器無(wú)法滿足正常的教學(xué)活動(dòng)需求,必然會(huì)向流媒體集群方向發(fā)展,而在集群上實(shí)現(xiàn)鑒權(quán)功能肯定不是當(dāng)前單個(gè)服務(wù)器鑒權(quán)功能的簡(jiǎn)單疊加,需要考慮和集群中調(diào)度服務(wù)器的深度協(xié)作,這將是本研究后續(xù)的研究方向。
參考文獻(xiàn):
[1] 鄭東升.高可用性互聯(lián)網(wǎng)直播視頻推流系統(tǒng)的構(gòu)建 [J].中國(guó)有線電視,2020(7):763-766.
[2] 馬艾田,耿立宏,王閏強(qiáng),等.基于Nginx的科普云直播系統(tǒng)研究與實(shí)現(xiàn) [J].信息技術(shù)與網(wǎng)絡(luò)安全,2018,37(8):54-57+76.
[3] 胡國(guó)強(qiáng),周兆永,信朝霞.基于SRS的開(kāi)源直播系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) [J].現(xiàn)代電子技術(shù),2016,39(16):36-39+43.
作者簡(jiǎn)介:林旻(1984—),男,回族,江蘇南京人,工程師,碩士,研究方向:實(shí)驗(yàn)室信息化建設(shè)。