仅针对推送请求使用基本身份验证保护Docker注册表

时间:2019-03-05 18:51:08

标签: docker authentication nginx registry

我正在尝试在Nginx代理后面建立一个私有Docker注册表,该代理对所有人都是只读的(即允许拉请求),但需要对推请求进行身份验证。我遵循了各种指南,但仍然感到困惑。下面是我当前的nginx配置:

events {
  worker_connections 1024;
}

http {

  upstream docker-registry {
    server registry:5000;
  }

  ## Set a variable to help us decide if we need to add the
  ## 'Docker-Distribution-Api-Version' header.
  ## The registry always sets this header.
  ## In the case of nginx performing auth, the header is unset
  ## since nginx is auth-ing before proxying.
  map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
    'registry/2.0' '';
    default registry/2.0;
  }

  server {
    listen 80;
    server_name docker-host.example.com;

    location / {
      rewrite ^(.*)$ https://docker-host.example.com$1 last;
    }
  }

  server {
    listen 443 ssl;
    server_name docker-host.example.com;

    ssl_certificate           /etc/nginx/ssl/example.cert.pem;
    ssl_certificate_key       /etc/nginx/ssl/example.key.pem;
    ssl_ciphers 'AES256+EECDH:AES256+EDH::!EECDH+aRSA+RC4:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    client_max_body_size 0;

    location / {
      limit_except GET HEAD OPTIONS {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/users.pwd;
      }
      include proxy.conf;
    }
  }
}

它确实允许匿名请求,但推送总是失败,并显示“未授权:需要身份验证”。如果我删除条件limit_except,即要求对所有访问进行身份验证,则登录后即可正常工作。

当我从nginx完全删除身份验证配置时,一切正常,但显然没有身份验证。

任何帮助或指针,将不胜感激。

2 个答案:

答案 0 :(得分:1)

我们一直在使用https://github.com/cesanta/docker_auth,它工作得很好,您可以设置许多身份验证方法

有关更多信息,请检查
https://github.com/cesanta/docker_auth/blob/master/README.md

答案 1 :(得分:-1)

“未经授权:需要身份验证”错误来自注册表API。这意味着您已在注册表本身中启用了身份验证。要么在注册表中禁用身份验证并仅使用nginx基本身份验证,要么通过具有相关数据的代理传递“ Authorization”标头(不正确)。