docker知识10---docker secret

一、docker secret

  声明式配置中,若直接定义用户名及密码等环境变量时,会造成安全隐患;因此,引入secret,对保密数据(用户名及密码、ssh key、TLS认证信息、其他需保密数据)进行加密。

在docker swarm架构中,manager节点(单数>3)内置raft分布式存储(可实现manager各节点数据同步),manager与worker之间通信是经过SSL/TLS加密的,而private key是通过加密后存储在manager的raft存储中。
  secret管理:
    1)存在swarm manager节点raft database里;
    2)secret可以assign给一个service,这个service内部就能看到这个secret;
    3)在container内部secret看起来像文件,但实际是在内存中;

Usage:  docker secret COMMAND  #Manage Docker secrets
Commands:
  create      #Create a secret from a file or STDIN as content
  inspect     #Display detailed information on one or more secrets
  ls          #List secrets
  rm          #Remove one or more secrets

  

二、案例

案例1:创建、管理、删除secret
cat <<eof> password.txt admin123 eof docker secret create my-pass password.txt #根据文件创建secret,并存储在raft存储中; rm -f password.txt #删除密码文件或迁移至安全位置; docker secret ls #查看swarm集群的secret; docker secret inspect my-pass #查看secret详细信息; echo '123456' | docker secret create my-pass1 - #命令行直接创建secret; docker secret ls docker secret rm my-pass1 && docker secret ls #删除secret;

  

案例2:secret导入到service内部
docker service create --name client --secret my-pass busybox /bin/sh -c "while true;do sleep 3600;done"  #将secret暴露给client服务;
docker service ps client #查看服务调度信息,发现client服务被调度到manager02;
##在manager02执行
docker exec -it eec305e9810a sh 
cd /run/secrets/
cat my-pass         #查看服务中secret的密码为明文,于是在执行命令时,可调用该文件中的密码;

  

案例3:service利用secret
docker service create --name mysql -e MYSQL_ROOT_PASSWORD=root mysql                  #明文密码创建mysql服务不安全;
cat <<eof> password.txt
admin
eof
docker secret create db-pass password.txt 
rm -f password.txt 
docker service create --name mysql --secret db-pass -e MYSQL_ROOT_PASSWORD=/run/secrets/my-pass mysql #使用secret赋予环境变量,以确保数据安全;
docker service ls
docker service ps mysql #查看服务调度信息,发现client服务被调度到manager03;
##在manager03执行
docker exec -it e53e4df1df7b ll /run/secrets/   #确认密码文件已传入服务内部;
docker exec -it e53e4df1df7b sh
mysql -uroot -padmin123           #进入容器内部,测试是否可用密码登录数据库;
案例4:service利用secret(不建议在配置文件中创建secret)
echo '123456' | docker secret create my-pw -
cat <<eof> docker-compose-wordpress.yml
version: '3.6'

services:

  web:
    image: wordpress
    ports:
      - 8080:80
    secrets:
      - my-pw
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD_FILE: /run/secrets/my-pw
    networks:
      - my-network
    depends_on:
      - mysql
    deploy:
      mode: replicated
      replicas: 3
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      update_config:
        parallelism: 1
        delay: 10s

  mysql:
    image: mysql
    secrets:
      - my-pw
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my-pw
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-network
    deploy:
      mode: global
      placement:
        constraints:
          - node.role == manager

volumes:
  mysql-data:

networks:
  my-network:
    driver: overlay

# secrets:   可在配置预先声明拆改那就secrets;
#   my-pw:
#    file: ./password 
eof
docker stack deploy wordpress -c=docker-compose-wordpress.yml

  

  

三、故障排查

问题1:使用secret启动service,但用secret密码不能登录该服务?

[root@manager01 ~]# docker exec -it 1c65f523b23f sh
# cd /run/secrets
# cat db-pass
admin
#
# mysql -uroot -padmin
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

原因分析:不明。

解决方法:暂无。

问题2:使用secret启动service失败?

[root@manager01 ~]# docker stack deploy wordpress -c=docker-compose-wordpress.yml
secrets Additional property secrets is not allowed

原因分析:.docker-compose.yml文件的版本号<“3.1”.

解决方法:修改ocker-compose.yml文件的版本号>“3.1”即可实现服务发布。

问题3:先行手动创建了secret,但是发布服务时,提示secret未定义;使用secret启动service失败?

[root@manager01 ~]# docker stack deploy wordpress -c=docker-compose-wordpress.yml
Creating network wordpress_my-network
service mysql: undefined secret "my-pw"

原因分析:不明;

解决方法:暂无。

原文地址:https://www.cnblogs.com/chalon/p/15127955.html