docker secret管理敏感数据及普通服务配置项--简单篇

原创 2018年04月16日 18:39:06

特别提示:本文使用docker最新版本docker-18.04.0-CE,版本太旧可能不支持本文演示的功能。参考文档:https://docs.docker.com/engine/swarm/secrets/

  • 什么是docker secret?

        敏感数据包括密码、私钥、证书及其它所有不能以明文的形式在网络上传输,或者是不能保存在各种文件中的数据,例如Dokerfile、image等。从docker 1.13开始,可以通过secret功能集中的保存与分发这些敏感数据,一个secret只允许被授权的服务在运行的时候访问,另外只有在集群模式下才能使用secret功能。docker以加密的形式保存与传输敏感数据,并且敏感数据会以分布式的形式存储在集群中的所以manager节点上,以提高可用性。

        当对一个新建立的或者是运行中的service进行某个secret的授权时,docker会在内存中模拟一个文件,然后将解密后的数据放入文件中,并mount这个文件到容器的文件系统中,默认目录是/run/secrets/<secret_name>。可以在任何时候对一个服务进行授权、撤销操作。

        docker secret同时也可以用来管理普通的配置项,但是从Docker 17.06开始,提供了专门用于管理非敏感数据的configs。两者的区别是secret用的是RAM来模拟文件系统保存敏感数据,使用敏感数据的容器是只读的。而config则直接使用普通的文件系统存储非敏感数据。

  • docker secret命令:   
  1. docker secret create
  2. docker secret inspect
  3. docker secret ls
  4. docker secret rm
  5. --secret flag for docker service create
  6. --secret-add and --secret-rm flags for docker service update

  • 使用docker secret管理密码

1.添加secret

printf "This is a secret" | docker secret create my_secret_data -

如下图:

2.构建支持secret功能的redis镜像

详细参考https://docs.docker.com/engine/swarm/secrets/#use-secrets-in-compose

3.创建redis服务并授权访问my_secret_data

默认情况下,redis服务通过/run/secrets/my_secret_data取得密码,可在启动服务时通过target选项更改默认设置。

docker service  create --name redis --secret my_secret_data redis:alpine

如下图:


task被调度在了worker2节点上。

4.登录worker2节点,查看/run/secrets/my_secret_data内容

docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data

如下图:


5.解除授权

docker service update --secret-rm my_secret_data redis

如下图:


可以看到service被停止掉后又重新拉起来了。

6.登录worker2节点,重新查看/run/secrets/my_secret_data内容

docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data

结果如下图:


证明授权已经被收回。

  • 删除服务与secret
docker service rm redis

docker secret rm my_secret_data

如下图:


  • 使用secret管理nginx证书

1.生成证书        

# create tmp dir
mkdir /tmp/nginx-ca
cd /tmp/nginx-ca
# Generate a root key
openssl genrsa -out "root-ca.key" 4096
# Generate a CSR using the root key
openssl req \
          -new -key "root-ca.key" \
          -out "root-ca.csr" -sha256 \
          -subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA'
# create root-ca.cnf file
echo "[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash" > ./root-ca.cnf
# Configure the root CA use root-ca.cnf
openssl x509 -req  -days 3650  -in "root-ca.csr" \
               -signkey "root-ca.key" -sha256 -out "root-ca.crt" \
               -extfile "root-ca.cnf" -extensions \
               root_ca
# Sign the certificate
openssl genrsa -out "site.key" 4096
# Generate the site key
openssl req -new -key "site.key" -out "site.csr" -sha256 \
          -subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost'
# create site.cnf file
echo "[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:localhost, IP:127.0.0.1
subjectKeyIdentifier=hash" > ./site.cnf
# Sign the site certificate
openssl x509 -req -days 750 -in "site.csr" -sha256 \
    -CA "root-ca.crt" -CAkey "root-ca.key"  -CAcreateserial \
    -out "site.crt" -extfile "site.cnf" -extensions server

2.在当前目录下生成nginx服务配置文件

echo "server {
    listen                443 ssl;
    server_name           localhost;
    ssl_certificate       /run/secrets/site.crt;
    ssl_certificate_key   /run/secrets/site.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}" > ./site.conf

3.创建三个secret

docker secret create site.key site.key
docker secret create site.crt site.crt
docker secret create site.conf site.conf

4.启动nginx服务

docker service create \
     --name nginx \
     --secret site.key \
     --secret site.crt \
     --secret source=site.conf,target=/etc/nginx/conf.d/site.conf \
     --publish published=3000,target=443 \
     nginx:latest \
     sh -c "exec nginx -g 'daemon off;'"

5.打开浏览器访问nginx


6.清除示例

docker service rm nginx
docker secret rm site.crt site.key site.conf
版权声明:本文为博主原创,未经本人许可,请勿转载 https://blog.csdn.net/dkfajsldfsdfsd/article/details/79961552

Docker常用命令

1. docker版本 hduser@hadoop:~/Desktop$ sudo docker version Client: Version: 17.04.0-ce API vers...
  • superce
  • superce
  • 2018年04月16日 16:42
  • 14

07-软件配置项管理报告

1  范  围 1.1  标  识 包含该文档所适用的软件标识号、标题和版本号。 1.2  系统概述 简述文档所适用的系统和软件的用途。应描述系统和软件的一般特性;概述系统开发、运行和维护的历...
  • zchl159
  • zchl159
  • 2017年04月18日 16:06
  • 423

《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka的常用配置

在微服务架构中,Spring Cloud为基于JVM的云应用开发中的服务发现、负载均衡、断路器、智能路由、配置管理、控制总线等等操作提供了一种简单、快捷的开发方式。...
  • wsr2014
  • wsr2014
  • 2017年05月13日 11:51
  • 377

DCOS之k8s的secret

作为kubernetes中一个重要的资源secret,它的设计初衷是为了解决container在访问外部网络或外部资源时验证的问题,例如访 问一个git仓库,连接一个数据库,设置一些密码配置等,需要额...
  • u012798391
  • u012798391
  • 2016年02月27日 15:48
  • 2591

MySQL 权限管理简单篇

创建用户 CREATE USER 用户名 IDENTIFIED BY 密码 示例: CREATE USER  kaigexuetang  IDENTIFIED BY ‘kaige123.co...
  • l4432321
  • l4432321
  • 2017年06月21日 01:57
  • 92

文本分析------简单篇

这篇文章只限于对于想了解文本分析或是机器学习的童鞋,对于已经在这一行干了很久的,希望看了后能提一些建议,欢迎拍砖。 我只想用形象简单的方式,让大家了解文本分析具体是什么,怎么进行机器学习过程,...
  • hp0632
  • hp0632
  • 2015年09月23日 11:50
  • 344

android事件(简单篇)

在android 中事件的点击是非常重要的,当你的程序要有些交互操作的时候,就需要你对不同的组件进行操作。这样你就会用到事件的操作 下面给大家讲解一个入门级的操作,单击事件。 单击事件也是andr...
  • u010778803
  • u010778803
  • 2013年07月15日 10:49
  • 726

lintcode 简单篇(二)

1、(41) 最大子数组 描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。 注意事项:子数组最少包含一个数 样例:给出数组[−2,2,−3,4,−1,2,1,−5,3]...
  • fangafangxiaoniu
  • fangafangxiaoniu
  • 2018年01月04日 11:15
  • 25

排序算法-简单篇

 排序算法-简单篇       排序算法是我们日常的开发中是使用最频繁的算法,在这里自己简单总结下。       我们接触最早的排序算法是在C语言这门课中冒泡排序(bubble sort)和选择排序(...
  • ACb0y
  • ACb0y
  • 2011年02月13日 00:05
  • 973

Java反射简单篇

public class ReflectserviceImpl { public void sayHello(String name){ System.out.println(...
  • I_can_do_better
  • I_can_do_better
  • 2017年11月13日 16:05
  • 47
收藏助手
不良信息举报
您举报文章:docker secret管理敏感数据及普通服务配置项--简单篇
举报原因:
原因补充:

(最多只允许输入30个字)