JupyterHub on Kubernetes的SQLite、MySQL身份認證 (Auth)

在完成JupyteHub on k8s的基本部署后翔悠,還需要一些用戶定制的自定義配置业崖,本文重點介紹JupyterHub的身份驗證(Authentication)。

1. JupyteHub自帶的Authentication方法

默認條件下蓄愁,JupyterHub允許用戶輸入任意的用戶名和密碼双炕,登錄注冊自己的Jupyter Notebook。顯然這種模式不符合生產(chǎn)要求撮抓,必須有一套身份認證機制妇斤。

根據(jù)官網(wǎng)的描述,JupyterHub自帶了一些身份認證方法丹拯,比如Dummy站超、OAuth2、LDAP等乖酬,詳細信息可以參閱:

https://zero-to-jupyterhub.readthedocs.io/en/latest/authentication.html

但是如果條件不允許死相,JupyteHub可否支持基于常見數(shù)據(jù)庫(MySQL、SQLite)的Authentication方法了剑刑?答案是肯定的媳纬,但是需要自己編寫,所以接下來分別介紹基于SQLite和MySQL的身份驗證方法施掏,詳細代碼請參考我的https://github.com/tygxy/jupyterhub_localauthenticor

2. JupyteHub Authentication Based on SQLite

2.1 編寫sqliteauthenticator包

首先需要完成sqliteauthenticator的基本功能钮惠,其包結(jié)構如圖所示:


1554261481417.jpg

核心的模塊就是實現(xiàn)SQLiteAuthenticator類,很簡單七芭,只需要從SQLite的DB中查詢數(shù)據(jù)做匹配即可素挽,我這里為了演示,密碼用了明文狸驳。

# coding:utf-8

from jupyterhub.auth import Authenticator
from tornado import gen

import os
import sqlite3


class SQLiteAuthenticator(Authenticator):

    """JupyterHub Authenticator Based on SQLite"""

    def __init__(self, **kwargs):
        super(SQLiteAuthenticator, self).__init__(**kwargs)

    @staticmethod
    def _verify_password(username, password):
        try:
            # to define sqlite db location in hub images
            os.environ["JUPYTERHUB_SQLITEDB_PATH"]="/home/jovyan/user.db"

            sql_cnn = sqlite3.connect(os.getenv('JUPYTERHUB_SQLITEDB_PATH'))
            cursor = sql_cnn.cursor()
            sql = ("SELECT `password` FROM users WHERE `username` = '{}'").format(username)
            cursor.execute(sql)

            user_passwd = cursor.fetchone()[0]
            input_passwd = password

            if user_passwd == input_passwd:
                cursor.close()
                sql_cnn.close()
                return True
            else:
                cursor.close()
                sql_cnn.close()
                return False
        except:
            cursor.close()
            sql_cnn.close()
            return False

    @gen.coroutine
    def authenticate(self, handler, data):
        username = data['username']
        passwd = data['password']

        if self._verify_password(username, passwd):
            return data['username']
        else:
            return None

2.2 創(chuàng)建SQLite用戶表

第二步需要創(chuàng)建users表预明,基本操作這里就不贅述了缩赛。如果對SQLite不熟悉的同學可以網(wǎng)上找找資料,很簡單撰糠。庫名就叫user.db酥馍,表名叫users,表的結(jié)構如圖所示:

1554262124230.jpg

插入一條記錄阅酪,以備后續(xù)驗證旨袒。

insert into users (username,password) values ('kjsx-guoxingyu','123456')

2.3 拷貝內(nèi)容到鏡像

第三步需要把前兩步的內(nèi)容拷貝到jupyter/k8s-hub鏡像中,這個鏡像是官網(wǎng)自帶的hub鏡像术辐,我們直接在此鏡像上添加內(nèi)容就可以了砚尽,步驟如下,具體的命令我就不寫了辉词,自行查找必孤。

  • docker 先啟一個hub鏡像,用到的命令docker run
  • 查看該鏡像container id瑞躺,用到的命令docker ps
  • 拷貝user.db到鏡像中敷搪,用到的命令docker cp,注意路徑要跟sqliteauthenticator.py里保持一致幢哨,我這里是/home/jovyan/
  • 拷貝sqliteauthenticator包购啄,注意路徑是pip3保持包的路徑。在該鏡像中嘱么,是/home/jovyan/.local/lib/python3.6/site-packages下。這樣運行時才能import到該包顽悼,如圖:
    1554270146882.jpg
  • 保存該鏡像曼振,用到的命令是docker commit,可以指定Tag

2.4 修改配置文件

最后需要修改一些配置文件蔚龙,在values.yaml中冰评,包括:

  • auth:type: custom
  • auth:custom:className: sqliteauthenticator.SQLiteAuthenticator
  • hub.image.tag: 0.1.0 (需要和保存的鏡像的tag匹配上,我這里是0.1.0)

2.5 啟動服務

到此為止木羹,基于SQLite的身份認證應該就可以用了甲雅,重新啟動我們的jupyterhub服務,在登錄頁面驗證一下坑填,如圖當username是kjsx-guoxingyu1的時候抛人,顯示的是Invalid username or password。

1554270759313.jpg

3. JupyteHub Authentication Based on MySQL

基本上MySQL的身份認證和SQLite差不多脐瑰,只有細微的差別妖枚,這里就簡單敘述一下。

3.1 編寫mysqlauthenticator包

包結(jié)構:

1554271023757.jpg

跟之前的差不多苍在,只不過將MySQL的一些操作封裝在了DAO里绝页,此外使用到了sqlalchemy荠商。具體代碼就不貼了,需要的話直接去我github上看吧续誉,也很簡單莱没。稍微需要注意的就是連接MySQL的格式:

db_url = "mysql+mysqlconnector://root:<password>@<ip>:3306/<talbe_name>"

3.2 創(chuàng)建MySQL用戶表

需要在一臺服務器上提供MySQL服務,并創(chuàng)建User表酷鸦,這個我就不多說了饰躲,相信大家都會。唯一注意的是要賦予mysql遠程登陸的權限井佑,否則鏡像訪問MySQL會報錯属铁。

3.3 拷貝內(nèi)容到鏡像

這個跟之前的一樣,把mysqlauthenticator包放在pip3的安裝路徑下躬翁,此外還需要安裝一些包焦蘑,包括

  • pip3 install wheel
  • pip3 install sqlalchemy
  • pip3 install mysql-connector

3.4 修改配置文件

  • auth:type: custom
  • auth:custom:className: mysqlauthenticator.MysqlAuthenticator
  • hub.image.tag: 0.1.0 (需要和保存的鏡像的tag匹配上,我這里是0.1.0)

3.5 啟動服務

效果一樣盒发,這里貼一張認證成功的效果

1554271904139.jpg

4. 總結(jié)

整體來說例嘱,這部分自定義身份認證的參考資料很少,只能自己摸索和試錯宁舰。所以我也花了一些時間拼卵。兩種基于SQLite和MySQL的JupyterHub認證方式我都在自己Mac上,和服務器的測試集群上試過蛮艰,均可用腋腮。當然這里也只是一個demo,更成熟可靠的代碼壤蚜,還需要進一步迭代即寡,希望幫助到大家。

5. 參考文獻

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袜刷,一起剝皮案震驚了整個濱河市聪富,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌著蟹,老刑警劉巖墩蔓,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萧豆,居然都是意外死亡奸披,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門涮雷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來源内,“玉大人,你說我怎么就攤上這事∧さ觯” “怎么了嗽交?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颂斜。 經(jīng)常有香客問我夫壁,道長,這世上最難降的妖魔是什么沃疮? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任米者,我火速辦了婚禮吻商,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己甘萧,他們只是感情好鱼喉,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布剂陡。 她就那樣靜靜地躺著邑时,像睡著了一般。 火紅的嫁衣襯著肌膚如雪授帕。 梳的紋絲不亂的頭發(fā)上同木,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音跛十,去河邊找鬼彤路。 笑死,一個胖子當著我的面吹牛芥映,可吹牛的內(nèi)容都是我干的洲尊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奈偏,長吁一口氣:“原來是場噩夢啊……” “哼颊郎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霎苗,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榛做,沒想到半個月后唁盏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡检眯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年厘擂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锰瘸。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刽严,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出避凝,到底是詐尸還是另有隱情舞萄,我是刑警寧澤眨补,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站倒脓,受9級特大地震影響撑螺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崎弃,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一甘晤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饲做,春花似錦线婚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缀踪,卻和暖如春居砖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驴娃。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工奏候, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唇敞。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓蔗草,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疆柔。 傳聞我的和親對象是個殘疾皇子咒精,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容