Docker守护进程安全配置项目详解

Docker守护进程安全配置项目详解,第1张

Docker守护进程安全配置项目详解

本文主要介绍Docker守护进程的安全配置。本文通过示例代码为您做了非常详细的介绍,对您的学习或工作有一定的参考价值。有需要的朋友可以参考一下。

本文将向您介绍dockerdaemon的相关安全配置项。

一、测试环境
1.1安装CentOS7

CentOSLinux7.7.1908版(核心)

升级内核,重启

#yum更新内核
[root@localhostdocker]#uname-a
Linuxlocalhost3.10.0-1062.12.1.el7.x86_64#1SMPTue2月4日23:02:59UTC2020x86_64x86_64x86_64x86_64GNU/Linux
[root@localhostdocker]#cat/etc

1.2安装dockerce19.03
#yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2 #yum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repo #yuminstall-ydocker-ce [root@localhostdocker]#docker--version Dockerversion19.03.8,buildafacb8b
二、守护进程安全配置

没有默认的配置文件,所以需要单独创建/etc/docker/daemon.json。以下配置都是在这个文件上配置的,这个文件是一个本地测试示例。

{ "icc":false, "log-level":"info", "log-driver":"json-file", "log-opts":{ "max-size":"10m", "max-file":"5", "labels":"somelabel", "env":"os,customer" }, "iptables":true, "userns-remap":"default", "userland-proxy":false, "experimental":false, "selinux-enabled":true, "live-restore":true, "no-new-privileges":true, "cgroup-parent":"/foobar", "seccomp-profile":"/etc/docker/seccomp/default-no-chmod.json", "tls":true, "tlsverify":true, "tlscacert":"/etc/docker/CA/ca.pem", "tlscert":"/etc/docker/CA/server-cert.pem", "tlskey":"/etc/docker/CA/server-key.pem" } 2.1配置通过HTTPS和证书认证访问Docker守护进程

服务器证书

创建一个主机,定义一个域(IP也可以),根据域生成相应的证书,一般用来注册CN:

创建证书目录:

$mkdir-p/etc/docker/dockerd/CA&;&cd/etc/docker/dockerd/CA

生成密钥证书,并填写两次密钥证书密码:

$OpenSSLgenRSA-AES256-outca-key.PEM4096

要生成ca证书,需要输入注册证书的基本信息:

$opensslreq-new-x509-days365密钥ca-key.pem-sha256-outca.pem

创建服务器证书:

$opensslgenrsa-outserver-key.pem4096 $opensslreq-subj"/CN=localhsot"-sha256-new-keyserver-key.pem-outserver.csr

设置证书指定的IP地址:

$echosubjectaltname=DNS:localhost,IP:127.0.0.1>;>extfile.cnf

将Docker守护程序密钥的扩展用法属性设置为仅用于服务器验证:

$echoextendedkeyusage=serverauth>;>extfile.cnf

生成服务器证书证书:

$OpenSSLx509-req-days3650-sha256-inserver.CSR-CACA.PEM-CAkeyCA-key.PEM-cacreateserial-outserver-cert.PEM-extfileextfile.cnf

客户证书

创建客户端证书:(或当前目录)

$opensslgenrsa-outkey.pem4096 $opensslreq-subj'/CN=localhost'-new-keykey.pem-outclient.csr

要使密钥适用于客户端身份验证,请创建扩展配置文件:

$echoextendedkeyusage=clientauth>;>extfile.cnf

生成客户端证书证书:

$OpenSSLx509-req-days3650-sha256-inclient.CSR-CACA.PEM-CAkeyCA-key.PEM-cacreateserial-outcert.PEM-extfileextfile.cnf

使用

授予证书适当的权限:

$chmod-v0400ca-key.pemkey.pemserver-key.pem $chmod-v0444ca.pemserver-cert.pemcert.pem [root@localhostCA]#ls ca-key.pemca.pemca.srlcert.pemclient.csrextfile.cnfkey.pemserver-cert.pemserver.csrserver-key.pem

服务器端配置/etc/docker/daemon.json

"tls":true, "tlsverify":true, "tlscacert":"/etc/docker/CA/ca.pem", "tlscert":"/etc/docker/CA/server-cert.pem", "tlskey":"/etc/docker/CA/server-key.pem"

客户端配置

将客户端证书设置到本地服务器,并将其放在相应的位置:

$cp-v{ca,cert,key}.pem~/.docker $exportDOCKER_HOST=tcp://$HOST:2376DOCKER_TLS_VERIFY=1

如下模拟测试:

$curlhttps://$HOST:2376/images/json\ --cert~/.docker/cert.pem\ --key~/.docker/key.pem\ --cacert~/.docker/ca.pem [{"Containers":-1,"Created":1540777343,"Id":"sha256:55e7b305dc477345434ce3bd3941940481f982eea31c8f28c0670d59c63d544b","Labels":nu
2.2使用namespace隔离技术

名称空间是一种隔离技术。docker使用隔离技术来打开特定的命名空间,创建一些特殊的进程。然而,命名空间的使用是有条件的。系统会创建dockremap,通过/etc/subuid和/etc/subuid对应的id值映射到容器;其实就是利用dockremap的通用权限来达到自动隔离的效果。

首先,修改/etc/sysctl.conf。

#echo"user.max_user_namespaces=15076">>/etc/sysctl.conf

在/etc/etc/docker/daemon.json中添加配置项“userns-remap”:“default”

这种配置需要仔细修改。如果已经部署了一个docker环境,那么启用该选项后,它将切换到隔离环境,之前的docker容器将不可用!

[root@localhostdocker]#cat/etc/subuid dockremap:100000:65536
2.3设置docker的分区

为容器创建一个单独的分区。默认分区是\var\lib\docker\,包含本地镜像、容器、网络等相关的东西。

[root@localhostdocker]#ls/var/lib/docker

100000.100000构建器构建工具包容器映像网络覆盖2插件运行时SwarmTMP信任卷
您可以使用“data-root”:“来配置默认分区位置。

2.4限制默认网桥容器之间的流量

当Docker服务启动时,默认情况下,转发策略将被添加到iptables的转发链中。策略是接受还是丢弃取决于配置-icc=true(默认)或-icc=false。如果手动指定了-iptables=false,则不会添加iptables规则。

默认情况下,默认网桥上同一主机上的容器之间允许所有网络通信,如果不需要,所有容器之间的通信将受到限制。将需要通信的特定容器链接在一起,或者创建自定义网络,并且仅加入需要与自定义网络通信的容器。

在默认网桥上配置容器之间的流量“ICC”:false

2.5配置日志

集中式远程日志记录,将日志进程日志级别设置为info,日志格式json,本地日志记录

"log-level":"info", "log-driver":"json-file", "log-opts":{ "max-size":"10m", "max-file":"5", "labels":"somelabel", "env":"os,customer" },

配置远程日志

Docker日志记录驱动程序接收容器日志,并将其转发到远程目的地或文件。的默认日志驱动程序是json-file。它将JSON格式的容器日志存储在本地磁盘上。Docker有用于日志记录的插件架构,所以有用于开源工具和商业工具的插件:

journald--将容器日志存储在系统日志中。
syslog驱动程序–支持UDP、TCP、TLS
Fluent–支持到Fluent的TCP或Unix套接字连接
Splunk–http/https转发到Splunk

流畅示例

{ "log-driver":"fluentd", "log-opts":{ "fluentd-address":"fluentdhost:24224" } }

使用系统日志

{ "log-driver":"syslog", "log-opts":{ "syslog-address":"udp://1.2.3.4:1111" } } 2.6设置ulimit
{ "default-ulimits":{ "nofile":{ "Name":"nofile", "Hard":64000, "Soft":64000 } } } 2.7设置cgroup

-cgroup-parent选项允许您为容器设置默认的cgroup父级。如果未设置此选项,fscgroup驱动程序的默认值为/docker;对于systemdcroup驱动程序,默认值为system.slice

如果cgroup有正斜杠(/),则在根cgroup下创建cgroup,否则在守护进程cgroup下创建cgroup。

假设守护进程运行在cgroupdaemoncgroup中,-cgroup-parent=/foobar在/sys/fs/cgroup/memory/foobar中创建一个cgroup,而-cgroup-cgroup-parent=/foobar创建/sys/fs/cgroup/memory/daemoncgroup。

systemcgroup驱动程序对–-cgroup-parent有不同的规则。Systemd通过片来表示层次结构,片的名称对树中的位置进行编码。因此,systemdcroup的-cgroup-parent应该是切片名称。名称可以包含由破折号分隔的一系列名称,这些名称描述了从根片到片的路径。例如,-cgroup-parent=user-a-b.slice表示容器的内存cgroup在/sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker-

您也可以使用容器运行来设置它。在dockercreate和dockerrun上使用-cgroup-parent选项将优先于守护进程上的-cgroup-parent选项。

2.8配置seccomp

使用的测试配置文件,禁止在Docker中使用chmod命令。

https://github.com/docker/labs/blob/master/security/seccomp/seccomp-profiles/default-no-chmod.json [root@localhostdocker]#dockerrun--rm-italpinesh /#lsbinetclibmntprocrunsrvtmpvar devhomemediaoptrootsbinsysusr/#touchfoo.sh /#chmod+xfoo.sh chmod:foo.sh:Operationnotpermitted /#exit

您实际上可以禁止、允许和警告一些与系统相关的调用。请参考https://github.com/Torvalds/Linux/blob/master/arch/x86/entry/syscalls/syscall_64.TBL。

2.9配置支持无守护程序的容器

-live-restore确保docker守护进程关闭时容器不受影响。

在测试过程中关闭docker守护进程后,nginx容器仍然可以正常提供访问。

2.10禁用docker的实验性功能

设置“实验”:假

2.11限制容器通过suid或sgid提权

no-new-privileges安全选项可以防止容器中的应用程序进程在执行期间获得新的特权。

比如:镜像中有一个设置了setuid/setgid位的程序,比如sudo,容器中的进程也有执行该程序的(file)权限。任何试图通过setuid/setgid等工具获得特权的 *** 作都将被拒绝。

三、守护进程配置示例说明(Linux)
{ "authorization-plugins":[],//访问授权插件 "data-root":"",//docker数据持久化存储的根目录,默认为/var/lib/docker "dns":[],//DNS服务器 "dns-opts":[],//DNS配置选项,如端口等 "dns-search":[],//DNS搜索域名 "exec-opts":[],//执行选项 "exec-root":"",//执行状态的文件的根目录 "experimental":false,//是否开启试验性特性 "features":{},//启用或禁用特定功能。如:{"buildkit":true}使buildkit成为默认的docker镜像构建器。 "storage-driver":"",//存储驱动器类型 "storage-opts":[],//存储选项 "labels":[],//键值对式标记docker元数据 "live-restore":true,//dockerd挂掉是否保活容器(避免了docker服务异常而造成容器退出) "log-driver":"json-file",//容器日志的驱动器 "log-opts":{ "max-size":"10m", "max-file":"5", "labels":"somelabel", "env":"os,customer" },//容器日志的选项 "mtu":0,//设置容器网络MTU(最大传输单元) "pidfile":"",//daemonPID文件的位置 "cluster-store":"",//集群存储系统的URL "cluster-store-opts":{},//配置集群存储 "cluster-advertise":"",//对外的地址名称 "max-concurrent-downloads":3,//设置每个pull进程的最大并发 "max-concurrent-uploads":5,//设置每个push进程的最大并发 "default-shm-size":"64M",//设置默认共享内存的大小 "shutdown-timeout":15,//设置关闭的超时时限 "debug":true,//开启调试模式 "hosts":[],//dockerd守护进程的监听地址 "log-level":"",//日志级别 "tls":true,//开启传输层安全协议TLS "tlsverify":true,//开启输层安全协议并验证远程地址 "tlscacert":"",//CA签名文件路径 "tlscert":"",//TLS证书文件路径 "tlskey":"",//TLS密钥文件路径 "swarm-default-advertise-addr":"",//swarm对外地址 "api-cors-header":"",//设置CORS(跨域资源共享-Cross-originresourcesharing)头 "selinux-enabled":false,//开启selinux(用户、进程、应用、文件的强制访问控制) "userns-remap":"",//给用户命名空间设置用户/组 "group":"",//docker所在组 "cgroup-parent":"",//设置所有容器的cgroup的父类 "default-ulimits":{ "nofile":{ "Name":"nofile", "Hard":64000, "Soft":64000 } },//设置所有容器的ulimit "init":false,//容器执行初始化,来转发信号或控制(reap)进程 "init-path":"/usr/libexec/docker-init",//docker-init文件的路径 "ipv6":false,//支持IPV6网络 "iptables":false,//开启防火墙规则 "ip-forward":false,//开启net.ipv4.ip_forward "ip-masq":false,//开启ip掩蔽(IP封包通过路由器或防火墙时重写源IP地址或目的IP地址的技术) "userland-proxy":false,//用户空间代理 "userland-proxy-path":"/usr/libexec/docker-proxy",//用户空间代理路径 "ip":"0.0.0.0",//默认IP "bridge":"",//将容器依附(attach)到桥接网络上的桥标识 "bip":"",//指定桥接IP "fixed-cidr":"",//(ipv4)子网划分,即限制ip地址分配范围,用以控制容器所属网段实现容器间(同一主机或不同主机间)的网络访问 "fixed-cidr-v6":"",//(ipv6)子网划分 "default-gateway":"",//默认网关 "default-gateway-v6":"",//默认ipv6网关 "icc":false,//容器间通信 "raw-logs":false,//原始日志(无颜色、全时间戳) "allow-nondistributable-artifacts":[],//不对外分发的产品提交的registry仓库 "registry-mirrors":[],//registry仓库镜像加速地址 "seccomp-profile":"",//seccomp配置文件 "insecure-registries":[],//配置非https的registry地址 "no-new-privileges":false,//禁止新优先级 "default-runtime":"runc",//OCI联盟(TheOpenContainerInitiative)默认运行时环境 "oom-score-adjust":-500,//内存溢出被杀死的优先级(-1000~1000) "node-generic-resources":["NVIDIA-GPU=UUID1","NVIDIA-GPU=UUID2"],//对外公布的资源节点 "runtimes":{ "cc-runtime":{ "path":"/usr/bin/cc-runtime" }, "custom":{ "path":"/usr/local/bin/my-runc-replacement", "runtimeArgs":[ "--debug" ] } },//运行时 "default-address-pools":[ {"base":"172.80.0.0/16","size":24},//默认的dhcp分配地址 {"base":"172.90.0.0/16","size":24} ] }

摘要

以上就是本文关于docker守护进程安全配置项目的详细解释。有关Docker守护进程的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/774559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存