细粒度权限控制 linux,利用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

# 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 flagExecStart=/usr/bin/dockerd --authorization-plugin=authz-broker

重启服务# reload deamonsystemctl daemon-reload

systemctl restart docker

授权配置

在路径 /var/lib/authz-broker/policy.json 下配置授权内容{"name":"policy_1","users":["alice"],"actions":[""]}

此处配置指明方案 policy_1 的用户 alice 可以执行的命令 actions 为所有命令。{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}

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

检查结果

允许结果docker versionClient:

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

#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 就可以了。

还有其他的情况导致这个报错:32位64位程序和系统不兼容导致

Dockerfile 指定的文件没有打包到 image 中

可以用 docker run -it image/name [/bin/sh | /bin/bash] 进入image 环境,看看里面的文件是否齐全。

前期文章

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

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

后续预告

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

《docker最佳安全实践详解》

《docker内容信任详解》

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

欢迎订阅关注我们!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux查找命令、find、grep总结

find 命令 语法:find 搜索路径 匹配表达式 功能:该命令用于在指定路径中查找符合条件的文件,搜索路径可以是多个目录,不同目录之间以空格分隔 (1)匹配表达式1 -name filename:要查找的文件…

Sharepoint学习笔记—ECM系列--根据位置设置的默认元数据值(Location-Based Metadata Defaults)...

如果有这样一个需求:客户在一个SharePoint 2010的站点的document library中创建了不同的文件夹FolderA和FolderB,对于上传到此文件夹的文件记录中有某一个列ColumnM,现在他实现当上传文件到不同的文件夹FolderA或FolderB时,列ColumnM使用不同…

linux上安装fio教程,fio工具安装及使用

fio是一种I / O工具,用于基准测试和压力/硬件验证。它支持19种不同类型的I / O引擎(sync,mmap,libaio,posixaio,SG v3,splice,null,network,syslet,guasi&…

Maven的学习资料收集--(九) 构建SSH项目以及专栏maven

在这里整合一下&#xff0c;使用Maven构建一个SSH项目 1.新建一个Web项目 可以参照前面的博客 2.添加依赖&#xff0c;修改pom.xml [html] view plaincopy <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

博客园的CSRF

CSRF全称 Cross Site Request Forgery&#xff0c;跨站请求伪造。通俗理解&#xff1a;攻击者盗用当前用户身份&#xff0c;发请当前用户的恶意请求&#xff1a;如邮件&#xff0c;银行转账等。 CSRF原理 CSRF过程 登录网站A&#xff0c;生成本地Cookie信息&#xff1b;登录危…

linux 设备驱动总结,linux设备驱动归纳总结.doc

linux设备驱动归纳总结linux设备驱动归纳总结内核&#xff1a;用于管理软硬件资源&#xff0c;并提供运行环境。如分配4G虚拟空间等。 linux设备驱动&#xff1a;是连接硬件和内核之间的桥梁。linux系统按个人理解可按下划分&#xff1a;应用层&#xff1a;包括POSIX接口&#…

开发板——在X210开发板上进行裸机开发的细节

以下内容是学习裸机开发过程中的一些细节内容的记录。 1、汇编语言函数细节 用汇编写的函数&#xff0c;末尾应该添加mov pc,lr语句。 2、裸机代码相关文件 3、关于链接地址 4、关于重定位的理解 &#xff08;1&#xff09;在sram内部重定位 这是在sram内部重定位&#xff0c;因…

linux报网络设备繁忙,【分享】linux常用命令

压缩与备份:bzip2/bunzip2 .bz2文件的压缩/解压缩程序cpio 备份文件dump 备份文件系统gzip/gunzip .gz文件的压缩/解压缩程序gzexe 压缩可执行文件restore 还原由倾倒(Dump)操作所备份下来的文件或整个文件系统(一个分区)tar 将若干文件存档或读取存档文件unarj 解压缩.…

HDU-4454 Stealing a Cake 三分枚举

题意&#xff1a;给定一个点&#xff0c;一个圆&#xff0c;以及一个矩形&#xff0c;现在问从一个点到一个圆再到一个矩形的最短距离为多少&#xff1f;到达一个目标可以只挨着或者穿过它。 解法&#xff1a;目前只知道从一个点到圆上按照[0,PI]&#xff0c;[PI,2*PI]的两个半…

VIP - virtual IP address

virtual IP address (虚拟 IP 地址)1、是集群的ip地址&#xff0c;一个vip对应多个机器2、与群集关联的唯一 IP 地址see wiki&#xff1a; A virtual IP address (VIP or VIPA) is an IP address assigned to multiple applications residing on a single server, multiple dom…

linux上perl怎么传输参数,如何在perl子函数中传递参数?

慕村225694Perl 可以通过函数元型在编译期进行有限的参数类型检验。如果你声明sub mypush ()那么 mypush() 对参数的处理就同内置的 push() 完全一样了。函数声明必须要在编译相应函数调用之前告知编译器(编译器在编译函数调用时会对相应函数用 prototype来查询它的元型来进行参…

Android中级之网络数据解析一之Json解析

本文来自http://blog.csdn.net/liuxian13183/ &#xff0c;引用必须注明出处&#xff01; 在网络传输的时候&#xff0c;经常用到的解析方式有xml和json两种&#xff0c;今天我们主要来说下json、解析&#xff0c;以及其要点。 首先json格式&#xff1a; “[”标识json解析开始…

Struts2中ValueStack结构和总结

【ValueStack和ActionContext的关系】首先&#xff0c;从结构上来看ValueStack是ActionContext的一个组成部分&#xff0c;是对ActionContext功能的扩展。ActionContext是一个容器结构&#xff0c;是Struts2中用于数据存储的的场所&#xff0c;而ValueStack则是一个具备表达式引…

将USB-WiFi网卡移植到X210开发板

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、移植前的准备工作 1、搭建开发环境 &#xff08;1&#xff09;虚拟机运行着ubuntu14.04系统。 &#xff08;2&#xff09;X210开发板运行着linux内核镜像、QT4.8文件系统镜像。相关的镜像文件在…

文件读取ini文件另一种读取办法

时间紧张&#xff0c;先记一笔&#xff0c;后续优化与完善。 Windows下的ini文件的读取可以应用系统提供的api来实现 GetPrivateProfileString GetPrivateProfileInt ... 现实应用中, 如果不应用一种同一的方法来包装一下会让源代码看起来很乱。 所以,须要计划一个便利&#xf…

浅谈mysql数据库引擎

2019独角兽企业重金招聘Python工程师标准>>> 数据库是数据的集合&#xff0c;计算机中的数据库是存储器上一些文件的集合或者是内存数据的集合。Mysql,SQL server数据库都是可以存储数据&#xff0c;并提供数据查询&#xff0c;更新功能的数据库管理系统。Mysql数据…

网络摄像机简介

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、网络摄像机定义 &#xff08;1&#xff09;网络摄像机&#xff0c;也叫IP摄像机&#xff0c;即IPCamera&#xff0c;简称IPC&#xff0c;近几年得益于网络带宽&#xff0c;芯片技术&#xff0c;算法技术…

如今的移动操作系统,写在2013年——android篇 by 伊一线天

前奏&#xff1a; 曾在2011年&#xff0c;我写过一篇同样题材的文章。时隔2年后&#xff0c;如今的移动操作系统领域跌宕起伏&#xff0c;2年前的一些系统变得更加强大&#xff0c;一些已经昙花一现。现在让我再来总结一些2013年移动操作系统。 第一讲&#xff1a;android 自从…