docker push: всегда получаю ошибку authentication required

Рейтинг: 2Ответов: 1Опубликовано: 26.03.2023

я делаю свой приватный docker registry.

Для начала я просто поднял его в докере, как написано на их сайте.

  docker run -d -p 5000:5000 --restart=always --name registry registry:2

Попробовал - всё локально работает.

Начал навешивать аутентификацию.

Нашел довольно понятную статью и "краткий ответ на вопрос" на стековерфлоу.

скомпилировалв, получил команду для запуска такого docker registry

    docker run -d \
      -p 5000:5000 \
      --restart=always \
      --name registry \
      -v /DData/auth:/auth \
      -e "REGISTRY_AUTH=htpasswd" \
      -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
      -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
       registry:2

при этом я заранее создал файл паролей в /DData/auth командой

    htpasswd -Bc htpasswd konst

Потом я начинаю пробовать команду docker login, получаю "по башке" загадочнейшим сообщением "Message: Remote error from secret service:"

Читаю про config.json, выхожу на тред на cтековерфлоу и у меня срабатывает магия (а по другому это назвать нельзя)

    sudo apt install gnupg2 pass
  • и после этого docker загадочным образом начинает логиниться!

для справки: я залез в файл ~/.docker/config.json

и увидел, что там засейвлен какой то пароль, скоре всего, мой:

    {                                                              
            "auths": {                                             
                    "docker.junecat.ru": {                         
                            "auth": "a29uc3*********ZmGF1bX43"     
                    }                                              
            }                                                      
    }                    

Потом я начинаю химичить с nginx'ом:

создаю виртуальный хост, настраиваю nginx в режиме proxy при помощи такого конфига:

    # config for Docker
    server {

        server_name docker.junecat.ru www.docker.junecat.ru;

    location / {
              #auth_basic           "Administrator’s Area";
              #auth_basic_user_file /etc/nginx/htpasswd;
              proxy_redirect          http://192.168.0.10:5000/  /;
              proxy_pass_header       Server;
              proxy_set_header        X-Real-IP $remote_addr;
              proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header        X-Scheme $scheme;
              proxy_set_header        Host $http_host;
              proxy_set_header        X-NginX-Proxy true;
              proxy_connect_timeout   5;
              proxy_read_timeout      240;
              proxy_intercept_errors  on;

              proxy_pass              http://192.168.0.10:5000/;
              client_max_body_size 5000M;
        }
    }

получаю на него lentsencrypt'овский сертификат

    sudo certbot --nginx -d docker.junecat.ru -d www.docker.junecat.ru

Казалось бы, всё хорошо: снаружи по запросу

https://docker.junecat.ru/v2/_catalog

я сначала получаю запрос на base auth, а потом, когад аутентификация проведена, вижу пустой список образов:

{"repositories":[]}

Но в само конце меня поджидает большой облом:

я беру hello-world образ, тэгаю его для заливки на свой сервер

    docker run hello-world
    docker tag hello-world docker.junecat.ru/hello-world

и пытаюсь залить (перед этим я сделал docker login и у меня аутентификация - сохранена)

    docker push docker.junecat.ru/hello-world

получаю ошибку authentication required

и всегда, на любую попытку заливки я получаю эту ошибку.

authentication required

Никакого продвижения после копания в сети.

я уже убил на это чертову уйму времени, и хотел бы довести дело до конца.

Нет и у кого то предположений, как это можно победить?

Заранее большое спасибо!

Дополнение

Самое смешное. Жить то как то надо... взял инструкцию с сайта DO, который я вобще то нежно люблю. Сделал по инструкции, не думая, вроде бы, то же саое. Работает!

Не могу понять пока что, где же я в первый раз накосячил... разве что nginx по разному сконфигурирован?

Ответы

▲ 2Принят

Тут сразу две проблемы.

Первая заключается в том, что proxy_pass передаёт только те заголовки, которые явно указаны в конфигурации. Вы в своей конфигурации не передаёте заголовок Authorization, поэтому к registry запрос приходит неавторизованным.

Ладно, не проблема, можно добавить

    proxy_set_header Authorization $http_authorization;
    proxy_pass_header  Authorization;

После этого nginx начинает передавать-таки креденшиалы пользователя.

Но этого, увы, недостаточно, наступают вторые грабли.

Как написано в документации

Warning: You cannot use authentication with authentication schemes that send credentials as clear text. You must configure TLS first for authentication to work.

То есть нужно одновременно с REGISTRY_AUTH_HTPASSWD_PATH задавать REGISTRY_HTTP_TLS_CERTIFICATE и REGISTRY_HTTP_TLS_KEY. правда, этот тезис противоречит вашему опыту с DO - в той инструкции нет никаких проблем с передачей креденшиалов по незащищённому каналу, верну?

Я посмотрел на это дело, подумал: на какое имя делать сертификат?

  • (а) Если самоподписной localhost, то nginx может заколдобиться, нужно прописывать запрет на проверку сертификата
  • (б) Если для доменного имени моего реестра, то ... из этого немедленно следует та-а-акой геморрой с обновлением этого сертификата на внутреннем сервере, который не виден из внешней сети.

Поэтому я сразу плюнул и сделал по мануалу на сайте docker-а:

  • реестр работает без шифрования и без аутентификации
    docker run -itd -p 5000:5000 --name registry -v /var/lib/registry:/var/lib/registry  --restart always   registry:2
    
  • все сертификаты и пароли хранятся в nginx. Сертбот автоматически обновляет сертификаты.

Оно сразу заработало.

Единственный геморрой - как добавлять пользователей. У нас этим занимается специально обученная девочка, у которой есть инструкция о добавлении пользователей в Gitlab, Mattermost, Google Suite. Но на инструкции

ssh frontend htpasswd /etc/nginx/auth/docker_registry.htpasswd -cb <user_name> <user_pwd>

её глаза необратимо стекленеют...