?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
本文檔描述了Docker Engine中通常提供的Docker Engine插件。要查看由Docker Engine管理的插件的信息,請(qǐng)參閱Docker Engine插件系統(tǒng)。
Docker的開箱即用授權(quán)模式是全部或沒有。任何有權(quán)訪問Docker守護(hù)程序的用戶都可以運(yùn)行任何Docker客戶端命令。對(duì)于使用Docker的Engine API來調(diào)用守護(hù)進(jìn)程的調(diào)用者也是如此。如果您需要更大的訪問控制權(quán),您可以創(chuàng)建授權(quán)插件并將其添加到Docker守護(hù)程序配置中。使用授權(quán)插件,Docker管理員可以配置粒度訪問策略來管理對(duì)Docker守護(hù)進(jìn)程的訪問。
任何具有相應(yīng)技能的人都可以開發(fā)授權(quán)插件。這些技能,最基本的是Docker的知識(shí),對(duì)REST的理解以及良好的編程知識(shí)。本文檔描述授權(quán)插件開發(fā)人員可用的體系結(jié)構(gòu),狀態(tài)和方法信息。
Docker的插件基礎(chǔ)架構(gòu)可以通過使用通用API加載,刪除和與第三方組件進(jìn)行通信來擴(kuò)展Docker。訪問授權(quán)子系統(tǒng)是使用這種機(jī)制構(gòu)建的。
使用這個(gè)子系統(tǒng),您不需要重建Docker守護(hù)程序來添加授權(quán)插件。您可以將插件添加到已安裝的Docker守護(hù)程序。您確實(shí)需要重新啟動(dòng)Docker守護(hù)程序才能添加新的插件。
授權(quán)插件基于當(dāng)前認(rèn)證上下文和命令上下文來批準(zhǔn)或拒絕對(duì)Docker守護(hù)進(jìn)程的請(qǐng)求。認(rèn)證上下文包含所有用戶詳細(xì)信息和認(rèn)證方法。命令上下文包含所有相關(guān)的請(qǐng)求數(shù)據(jù)。
授權(quán)插件必須遵循Docker插件API每個(gè)插件必須駐留在插件發(fā)現(xiàn)部分。
注意:分別是縮寫AuthZ
和AuthN
平均授權(quán)和認(rèn)證。
如果在Docker守護(hù)進(jìn)程中啟用了TLS,則默認(rèn)的用戶授權(quán)流程會(huì)從證書主體名稱中提取用戶詳細(xì)信息。即,User
字段設(shè)置為客戶端證書主題公用名稱,并且該AuthenticationMethod
字段設(shè)置為TLS
。
您有責(zé)任將您的插件注冊(cè)為Docker守護(hù)程序啟動(dòng)的一部分。您可以安裝多個(gè)插件并將它們鏈接在一起。這條鏈可以訂購。對(duì)守護(hù)進(jìn)程的每個(gè)請(qǐng)求都按順序通過鏈。只有當(dāng)所有插件授予對(duì)資源的訪問權(quán)時(shí),授予的訪問權(quán)才是。
當(dāng)通過CLI或通過引擎API向Docker守護(hù)進(jìn)程發(fā)出HTTP請(qǐng)求時(shí),身份驗(yàn)證子系統(tǒng)會(huì)將請(qǐng)求傳遞給已安裝的身份驗(yàn)證插件。該請(qǐng)求包含用戶(調(diào)用者)和命令上下文。該插件負(fù)責(zé)決定是允許還是拒絕該請(qǐng)求。
下面的序列圖描述了一個(gè)允許和拒絕授權(quán)流:
發(fā)送給插件的每個(gè)請(qǐng)求都包括經(jīng)過身份驗(yàn)證的用戶,HTTP標(biāo)頭和請(qǐng)求/響應(yīng)主體。只有用戶名和使用的認(rèn)證方法被傳遞給插件。最重要的是,沒有用戶憑證或令牌傳遞。最后,并非所有的請(qǐng)求/響應(yīng)主體都被發(fā)送到授權(quán)插件。只有那些請(qǐng)求/響應(yīng)機(jī)構(gòu),其中Content-Type
或者是text/*
或application/json
被發(fā)送。
對(duì)于可能劫持HTTP連接(HTTP Upgrade
)的命令,例如exec
,授權(quán)插件僅針對(duì)初始HTTP請(qǐng)求進(jìn)行調(diào)用。一旦插件批準(zhǔn)了該命令,授權(quán)就不會(huì)應(yīng)用于其余的流程。具體來說,流式傳輸數(shù)據(jù)不會(huì)傳遞給授權(quán)插件。對(duì)于返回分塊HTTP響應(yīng)的命令,比如logs
和events
,只有HTTP請(qǐng)求被發(fā)送到授權(quán)插件。
在請(qǐng)求/響應(yīng)處理期間,一些授權(quán)流可能需要對(duì)Docker守護(hù)進(jìn)程執(zhí)行額外的查詢。為了完成這樣的流程,插件可以像守護(hù)用戶一樣調(diào)用守護(hù)進(jìn)程API。要啟用這些額外的查詢,插件必須為管理員提供配置正確的身份驗(yàn)證和安全策略的手段。
要啟用和配置授權(quán)插件,插件開發(fā)人員必須支持本節(jié)詳細(xì)介紹的Docker客戶端交互。
使用--authorization-plugin=PLUGIN_ID
格式中的專用命令行標(biāo)志啟用授權(quán)插件。該標(biāo)志提供一個(gè)PLUGIN_ID
值。該值可以是插件的套接字或指定文件的路徑。授權(quán)插件可以在不重新啟動(dòng)守護(hù)進(jìn)程的情況下加載。請(qǐng)參閱dockerd
文檔以獲取更多信息。
$ dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,...
Docker的授權(quán)子系統(tǒng)支持多個(gè)--authorization-plugin
參數(shù)。
$ docker pull centos...f1b10cd84249: Pull complete...
$ docker pull centos...docker: Error response from daemon: authorization denied by plugin PLUGIN_NAME: volumes are not allowed.
$ docker pull centos...docker: Error response from daemon: plugin PLUGIN_NAME failed with error: AuthZPlugin.AuthZReq: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
除了Docker的標(biāo)準(zhǔn)插件注冊(cè)方法外,每個(gè)插件還應(yīng)該實(shí)現(xiàn)以下兩種方法:
/AuthZPlugin.AuthZReq
在Docker守護(hù)進(jìn)程處理客戶端請(qǐng)求之前調(diào)用此授權(quán)請(qǐng)求方法。
/AuthZPlugin.AuthZRes
此授權(quán)響應(yīng)方法在響應(yīng)從Docker守護(hù)進(jìn)程返回到客戶端之前被調(diào)用。
請(qǐng)求*
{ "User": "The user identification", "UserAuthNMethod": "The authentication method used", "RequestMethod": "The HTTP method", "RequestURI": "The HTTP request URI", "RequestBody": "Byte array containing the raw HTTP request body", "RequestHeader": "Byte array containing the raw HTTP request header as a map[string][]string "}
反應(yīng)*
{ "Allow": "Determined whether the user is allowed or not", "Msg": "The authorization message", "Err": "The error message if things go wrong"}
請(qǐng)求*
{ "User": "The user identification", "UserAuthNMethod": "The authentication method used", "RequestMethod": "The HTTP method", "RequestURI": "The HTTP request URI", "RequestBody": "Byte array containing the raw HTTP request body", "RequestHeader": "Byte array containing the raw HTTP request header as a map[string][]string", "ResponseBody": "Byte array containing the raw HTTP response body", "ResponseHeader": "Byte array containing the raw HTTP response header as a map[string][]string", "ResponseStatusCode":"Response status code"}
反應(yīng)*
{ "Allow": "Determined whether the user is allowed or not", "Msg": "The authorization message", "Err": "The error message if things go wrong"}
每個(gè)插件必須支持兩種請(qǐng)求授權(quán)消息格式,一種是從守護(hù)進(jìn)程到插件,然后從插件到守護(hù)進(jìn)程。下面的表格詳細(xì)列出了每條消息所期望的內(nèi)容。
Name | 類型 | 描述 |
---|---|---|
用戶 | 串 | 用戶標(biāo)識(shí) |
身份驗(yàn)證方法 | 串 | 使用的驗(yàn)證方法 |
請(qǐng)求方法 | 枚舉 | HTTP方法(GET / DELETE / POST) |
請(qǐng)求URI | 串 | 包含API版本的HTTP請(qǐng)求URI(例如,v.1.17 / containers / json) |
請(qǐng)求標(biāo)頭 | mapstringstring | 請(qǐng)求標(biāo)頭作為鍵值對(duì)(不含授權(quán)標(biāo)頭) |
請(qǐng)求正文 | []byte | 原始請(qǐng)求主體 |
Name | 類型 | 描述 |
---|---|---|
Allow | 布爾 | 指示請(qǐng)求是允許還是拒絕的布爾值 |
Msg | 串 | 授權(quán)消息(如果訪問被拒絕,將返回給客戶端) |
Err | 串 | 錯(cuò)誤信息(如果插件遇到錯(cuò)誤,將返回給客戶端。提供的字符串值可能會(huì)出現(xiàn)在日志中,因此不應(yīng)包含機(jī)密信息) |
插件必須支持兩種授權(quán)消息格式,一種是從守護(hù)進(jìn)程到插件,然后從插件到守護(hù)進(jìn)程。下面的表格詳細(xì)列出了每條消息所期望的內(nèi)容。
Name | 類型 | 描述 |
---|---|---|
用戶 | 串 | 用戶標(biāo)識(shí) |
身份驗(yàn)證方法 | 串 | 使用的驗(yàn)證方法 |
請(qǐng)求方法 | 串 | HTTP方法(GET / DELETE / POST) |
請(qǐng)求URI | 串 | 包含API版本的HTTP請(qǐng)求URI(例如,v.1.17 / containers / json) |
請(qǐng)求標(biāo)頭 | mapstringstring | 請(qǐng)求標(biāo)頭作為鍵值對(duì)(不含授權(quán)標(biāo)頭) |
請(qǐng)求正文 | []字節(jié) | 原始請(qǐng)求主體 |
響應(yīng)狀態(tài)碼 | INT | 來自docker守護(hù)程序的狀態(tài)碼 |
響應(yīng)標(biāo)題 | mapstringstring | 響應(yīng)標(biāo)題作為鍵值對(duì) |
響應(yīng)機(jī)構(gòu) | []字節(jié) | 原始碼頭守護(hù)程序響應(yīng)正文 |
Name | 類型 | 描述 |
---|---|---|
Allow | 布爾 | 指示響應(yīng)是被允許還是被拒絕的布爾值 |
Msg | 串 | 授權(quán)消息(如果訪問被拒絕,將返回給客戶端) |
Err | 串 | 錯(cuò)誤信息(如果插件遇到錯(cuò)誤,將返回給客戶端。提供的字符串值可能會(huì)出現(xiàn)在日志中,因此不應(yīng)包含機(jī)密信息) |