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"
原因分析:不明;
解决方法:暂无。