利用docker插件实现细粒度权限控制

在实际的docker运行环境下,为了安全起见,有些用户我们不想给予其全面的docker控制权限,docker官方提供了非常方便的扩展插件来实现对用户权限细粒度控制,可细到只允许指定用户执行指定的docker命令,本文详细介绍如何来实现。

前言

     我们在实际的docker运行环境下,大都会遇到多用户的情况,为了安全起见,有些用户我们不想给予其全面的docker控制权限,比如不想某些用户执行docker stop 以及docker rm 等危险指令,当然我们可以从系统账号权限来控制,但docker在实际生产环节中大都以集群方式部署,都是通过docker守护进程接口来操作docker,系统控制实现起来略显麻烦,还好docker官方提供了非常方便的扩展插件来实现对用户权限细粒度控制,可细到只允许指定用户执行指定的docker命令,本文详细介绍如何来实现。

Docker 插件

   Docker 引擎允许用户使用第三方插件的形式扩展 Docker 功能。Docker 的插件类型分为以下三种大类:

  • Network plugins 网络插件可以提供容器间互联网络模型。

  • Volume plugins 数据卷插件可以使 Docker 数据卷跨多个主机。

  • Authorization plugins 验证插件可以提供基于权限的访问控制,也是本文主要讲的插件,比较出名的就是 Twistlock AuthZ Broker 。

Twistlock AuthZ Broker

   Twistlock AuthZ Broker 是一个直接运行在主机或容器中的 Dockers 授权插件,基于简单的用户审计策略,可以过滤命令是否允许执行。

源码地址

  https://github.com/deathmemory/authz

Authz Build

   编译需要依赖 go 语言。在 Ubuntu 下可直接执行 sudo apt-get install golang 进行安装。

   安装完成后需要配置 GOPATH 环境变量, GOPATH 是 golang 的扩展库目录。golang 会首先搜索标准库目录,然后搜索 GOPATH 扩展库目录。所以开发时可以把非标准库都放在 GOPATH 目录下。

   配置好开发环境后就可以下载源码到本地,执行以下命令就可以成功编译并 Build 成 Docker 镜像文件。

$ cd broker/$ go build$ mv broker ../authz-broker $ cd ..$ docker build .

本地Build 源码修改

   在上面的 Build 中可以根据个人需要来修改一些配置,比如修改虚拟机引用和生成文件。

diff --git a/Dockerfile b/Dockerfile
index 2cfb355..c459421 100755--- a/Dockerfile+++ b/Dockerfile@@ -1,4 +1,4 @@-FROM alpine:3.3+FROM ubuntu:16.04
 MAINTAINER Liron Levin <liron@twistlock.com>
 
 # Indicates basic authorization is enforced
@@ -13,6 +13,7 @@ ENV AUDITOR-HOOK ""
 VOLUME /var/lib/twistlock/policy.json
 VOLUME /run/docker/plugins/ 
-ADD ./authz-broker  /usr/bin/authz-broker+ADD ./authz-broker  /usr/bin/authz-dm++CMD ["/usr/bin/authz-dm"]
 -CMD ["/usr/bin/authz-broker"]\ No newline at end of file

    项目依赖默认是引用了 github 上的库,想要修改库里的代码实现自定义功能,需要把引用改为本地引用,然后再修改相应的功能即可。

diff --git a/authz/basic.go b/authz/basic.go
index 0ed708d..042a904 100755--- a/authz/basic.go+++ b/authz/basic.go@@ -3,11 +3,13 @@ package authz
 import (
        "encoding/json"
        "fmt"+
        "github.com/Sirupsen/logrus"
        logrus_syslog "github.com/Sirupsen/logrus/hooks/syslog"
        "github.com/docker/docker/pkg/authorization"
        "github.com/howeyc/fsnotify"-       "github.com/twistlock/authz/core"++       "authz/core"
        "io/ioutil"
        "log/syslog"
        "os"
diff --git a/broker/main.go b/broker/main.go
index 0526811..f3e76f0 100755--- a/broker/main.go+++ b/broker/main.go@@ -3,11 +3,13 @@ package main
 
 import (
        "fmt"+       "os"+

Twistlock AuthZ Broker 插件的使用

安装插件

  Twistlock AuthZ Broker 可以在容器中直接安装也可以在Docker外的主机中安装。

在容器中安装

  在容器中安装直接运行

$ docker run -d --restart=always -v /var/lib/authz-broker/policy.json:/var/lib/authz-broker/policy.json -v /run/docker/plugins/:/run/docker/plugins twistlock/authz-broker

在主机中安装

  在主机中安装需要编辑 docker 服务配置文件。

sudo systemctl edit --full docker.service

添加 authz 运行参数。

# add plugin flag ExecStart=/usr/bin/dockerd --authorization-plugin=authz-broker

  重启服务

# reload deamonsystemctl daemon-reload
systemctl restart docker

授权配置

  在路径 /var/lib/authz-broker/policy.json 下配置授权内容

  1. {"name":"policy_1","users":["alice"],"actions":[""]}

此处配置指明方案 policy_1 的用户 alice 可以执行的命令 actions 为所有命令。

  1. {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}

方案 policy_3 用户 alice 和 bob 可以执行的命令只有创建容器。

检查结果

允许结果

docker version

Client: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: OS/Arch: linux/amd64 Server: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: OS/Arch: linux/amd64</pre> #and log output: Sep 04 15:08:29 mj authz-broker[28646]: {"allow":true,"err":"","fields.msg":"action 'docker_version' allowed for user '' by policy 'policy_1'","level":"info","method":"GET","msg":"Request","time":"2016-09-04T15:08:29+01:00","uri":"/v1.24/version","user":""}

拒绝结果

Client: Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e Built:        Mon Mar 27 17:14:09 2017
 OS/Arch:      linux/amd64
Error response from daemon: authorization denied by plugin authz-broker: no policy applied (user: '' action: 'docker_version')

错误处理

no such file or directory

这是 authz Dockerfile 引用的是 FROM alpine:3.3 这个系统没有 bash ,改成 FROM ubuntu:16.04 就可以了。

还有其他的情况导致这个报错:

  1. 32位64位程序和系统不兼容导致

  2. Dockerfile 指定的文件没有打包到 image 中 
    可以用 docker run -it image/name [/bin/sh | /bin/bash] 进入image 环境,看看里面的文件是否齐全。


前期文章

《docker容器的全面安全防护》

《配置一个安全的docker宿主机》

后续预告

《docker镜像安全扫描器的实现》

《docker最佳安全实践详解》

《docker内容信任详解》

《docker安全管理平台的架构设计》

 欢迎订阅关注我们!!!

3

发表评论

已有 5 条评论

取消
Loading...

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php