Docker 授权插件示例

Docker 授权插件示例

在处理 Docker 基线检查问题时,有一个检查项目为使用授权插件,需要给 Docker 设置授权插件,限制客户端命令的使用。为了通过检查,写了一个脚本实现AuthZ的授权接口,没有限制任何权限,全部返回允许,如果需要,可以增加限制逻辑。
需要完成的操作:

  1. 增加授权接口脚本
  2. docker 中增加插件配置

参考官方文档:
access-authorization-plugin
Docker Plugin API

授权接口脚本

使用 python 写的脚本,为了尽可能方便,不使用第三方库,使用 python 自带的 http 库。

  1. 实现AuthZ的授权需要的三个接口:
  2. docker 授权请求全为 POST
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
class DockerAuthHandler(BaseHTTPRequestHandler):
def do_POST(self):
"""
处理 docker 授权请求
"""
content_length = int(self.headers['Content-Length'])
request_body = self.rfile.read(content_length).decode('utf-8')
# print(request_body)
if self.path == '/Plugin.Activate':
res = {'Implements': ['authz']}
else:
# 可以增加权限判断
res = {'Allow': True, 'Msg': '', 'Err': ''} # 允许所有的请求
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(res).encode(encoding='utf-8'))
def run_server():
host = '0.0.0.0' # 监听所有网络接口
port = 8080
server_address = (host, port)
httpd = HTTPServer(server_address, DockerAuthHandler)
print(f'Starting HTTP server on {host}:{port}')
try:
httpd.serve_forever()
except KeyboardInterrupt:
print('Stopping HTTP server...')
finally:
httpd.server_close()
if __name__ == "__main__":
run_server()

docker 插件配置

Docker 通过在插件目录中查找插件来发现插件,可以配置三种类型的文件到插件目录中:

  • .sock
  • .spec
  • .json

这里使用 json 文件配置插件,在 docker 的默认插件目录(/etc/docker/plugins/usr/lib/docker/plugins)下增加一个simple.json文件,文件内容如下:

{
"Name": "simple",
"Addr": "http://127.0.0.1:28888/"
}

应用插件

在 docker 启动命令中增加参数--authorization-plugin=simple。如果是使用 systemctl 启动 docker,可以修改/lib/systemd/system/docker.service文件,在 docker 启动命令配置项ExecStart中增加--authorization-plugin=simple。修改完成后,执行systemctl daemon-reloadsystemctl restart docker重启 docker 服务。

posted @   守望人间  阅读(647)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示