Docker-私有仓库用户认证

前言: 为了提高私有仓库的安全性,设置用户密码进行登录

私有仓库高级配置

使用Docker Compose搭建拥有认证,TLS的私有仓库
需要注意的是:下面的所有操作在一个文件夹下面进行
私有仓库地址:192.168.50.66

准备站点证书

当有一个域名,就可以使用openssl自行签发证书。
案例:搭建私有仓库地址:www.wanglhdocker.com
过程

# 创建CA私钥
openssl genrsa -out "root-ca.key" 4096

# 利用私钥创建CA根证书请求文件
openssl req -new -key "root-ca.key" \   
    -out "root-ca.csr" -sha256 \
    -subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'
# -subj /C 表示国家; /ST 表示省  /L 表示城市 /O 表示组织名 /CN通用名称

# 配置CA根证书,新建root-ca.cnf
vim root-ca.cnf
[root-ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash

# 签发根证书
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
    
# 生成站点SSL私钥
openssl genrsa -out "www.wanglhdocker.com.key" 4096

# 使用私钥生成证书请求文件
openssl req -new -key "www.wanglhdocker.com.key" -out "site.csr" -sha256 \
    -subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=www.wanglhdocker.com'

# 配置证书,新建site.cnf文件
vim site.cnf
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:www.wanglhdocker.com, IP:127.0.0.1
subjectKeyIdentifier=hash

# 签署站点SSL证书
openssl x509 -req -days 750 -in "site.csr" -sha256 \
    -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
    -out "www.wanglhdocker.com.crt" -extfile "site.cnf" -extensions server


##如此,就有了www.wanglhdocker.com的网站SSL私钥www.wanglhdocker.com.key和SSL证书www.wanglhdocker.com.crt及CA根证书 root-ca.crt

#将上面的三个文件 移动到一个文件,删除其他文件夹

配置私有仓库

私有仓库的默认配置文件:/etc/docker/registry/config.yml。先本地编辑,在挂载到容器

vim /etc/docker/registry/config.yml
version: 0.1
log:
  accesslog:
    disabled: true
  level: debug
  formatter: text
  fields:
    service: registry
    environment: staging
storage:
  delete:
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
auth:
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/auth/nginx.htpasswd
http:
  addr: :443
  host: https://www.wanglhdocker.com
  headers:
    X-Content-Type-Options: [nosniff]
  http2:
    disabled: false
  tls:
    certificate: /etc/docker/registry/ssl/www.wanglhdocker.com.crt
    key: /etc/docker/registry/ssl/www.wanglhdocker.com.key
health:
  storagedriver:
    enabled: true
    interval: 10s
threshold: 3

生成http认证文件

mkdir auth
docker run --rm \
    --entrypoint htpasswd \
    registry \
    -Bbn username password > auth/nginx.htpasswd
# username password替换为自己的用户密码

## 这里的username password就是之后登录到私有仓库的 用户名和密码

编辑docker-compose.yml

vim /docker-compose.yml 		#没有就创建
version: '3'

services:
  registry:
    image: registry
    ports:
      - "443:443"
    volumes:
      - ./:/etc/docker/registry
      - registry-data:/var/lib/registry

volumes:
  registry-data:

修改hosts,并启动

vim /etc/hosts
   127.0.0.1 www.wanglhdocker.com
docker-compose up -d

注意: 当没有安装docker-comopse这个命令的时候,需要进行安装。
安装方法:

curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
mv /use/local/bin/docker-compose /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose

详细请参考文档:安装Docker Compose

重新启动
docker-compose up -d

注意: 在启动docker-compose如果由于关闭了防火墙,而没有重启docker.server,会出现下面的错误

Creating network "ssl_default" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-dc7a16c6d51f -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))

解决:

systemctl restart docker(或者service restart docker)
docker-compose up -d
 Creating network "ssl_default" with the default driver
 Creating volume "ssl_registry-data" with default driver
 Creating ssl_registry_1 ... done

这样就搭建了一个具有权限认证、TLS的私有仓库。

测试

在内部进行测试(192.168.50.66)

mkdir -p /etc/docker/certs.d/www.wanglhdocker.com
cp ssl/root-ca.crt /etc/docker/certs.d/www.wanglhdocker.com/ca.crt

docker login wanglhdocker.com

docker pull centos:7

docker tag centos:7 www.wanglhdocker.com/username/centos:7

docker push www.wanglhdocker.com/username/centos:7

docker image rm www.wanglhdocker.com/username/centos:7

docker pull www.wanglhdocker.com/username/centos:7

docker logout

docker pull www.wanglhdocker.com/username/centos:7
    Error response from daemon: Get http://www.wanglhdocker.com/v2/: dial tcp 127.0.0.1:80: connect: connection refused
    
docker tag centos:7 www.wanglhdocker.com/username/centos:7

docker push  www.wanglhdocker.com/username/centos:7
    The push refers to repository [www.wanglhdocker.com/username/centos]
    d69483a6face: Preparing 
    no basic auth credentials

说明: 从上面的测试可以看出,当使用443安全认证之后,可以用username password登录到自己的私有仓库。接下来进行下一步的认证,从内网或外网的其他机器访问这个私有仓库。

需要注意的是:由于这里是自己自行签发的CA根证书,会导致不被系统信任,所以需要下载自己自行签发的CA根证书部署到其他机器。
部署:

# 环境准备
# 1.将自行签发的CA根证书下载,并部署到192.168.50.111
# 2.私有仓库的地址为192.168.50.66(当有外网IP吗,这个IP就是外网IP)
# 3.查看私有仓库的443端口是否正常启动
# 4.在192.168.50.111上部署hosts

# 私有仓库(192.168.50.66):
scp /etc/docker/certs.d/www.wanglhdocker.com/ca.crt 192.168.50.111:/root

# 客户端(192.168.50.111):
mkdir -p /etc/docker/certs.d/www.wanglhdocker.com
mv /root/ca.crt /etc/docker/certs.d/www.wanglhdocker.com
echo "192.168.50.66 www.wanglhdocker.com" >> /etc/hosts

# 用户名 username passowrd登录到192.168.50.66
docker login www.wanglhdocker.com

# 进行测试,看能够pull到私有仓库的centos:7
docker pull www.wanglhdocker.com/username/centos:7

docker image ls     #能够看到www.wanglhdocker.com/username/centos:7就表示能够从自己创建的私有仓库读取镜像服务

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

到这里,整个实验基本完成,在过程中遇到问题,欢迎评论。
不足之处 ,还望指正!

posted @ 2020-02-15 22:13  Lin-Grocery  阅读(1011)  评论(0编辑  收藏  举报