?

Nginx-rtmp-module流媒體服務器鑒權應用研究

2020-01-03 10:10林旻
現代信息科技 2020年16期

摘? 要:隨著信息技術和通信技術的不斷發展,直播教育成為高等教育中不可或缺的一環,文章是在南京審計大學實驗中心原有的基于開源架構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—),男,回族,江蘇南京人,工程師,碩士,研究方向:實驗室信息化建設。

91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合