Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docker push leads to "unauthorized to access repository: my-test-project/foo, action: push:" #13553

Closed
svdHero opened this issue Nov 19, 2020 · 10 comments

Comments

@svdHero
Copy link

svdHero commented Nov 19, 2020

I have a brand-new Harbor install here and I cannot push any container image to any project, although I am admin.

I, e.g., execute the following commands:

devops@ecr:~$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Status: Image is up to date for hello-world:latest
docker.io/library/hello-world:latest

devops@ci-test-client:~/WORKSPACES/Test_WS$ docker tag hello-world harbor.internal.domain.com/my-test-project/foo:1.0

devops@ci-test-client:~/WORKSPACES/Test_WS$ docker login harbor.internal.domain.com
Username: devops
Password:
Login Succeeded

devops@ci-test-client:~/WORKSPACES/Test_WS$ docker push harbor.internal.domain.com/my-test-project/foo:1.0
The push refers to repository [harbor.internal.domain.com/my-test-project/foo]
9c27e219663c: Preparing
unauthorized: unauthorized to access repository: my-test-project/foo, action: push: unauthorized to access repository: my-test-project/foo, action: push
devops@ci-test-client:~/WORKSPACES/Test_WS$

So according to the output, I logged in successfully, but I am not authorized to push. Why is that? The Harbor Web UI says that I am "Project Admin" for the project "my-test-projects" and I am also in the LDAP admin group that is listed unter "Configuration -> Authentication".

This is a stand-alone Harbor install that I installed on an on-premise server using the Harbor Online installer and sudo ./install.sh --with-trivy. I created a systemd service that starts Harbor via docker-compose up. There is no Kubernetes or any other container/cloud infrastructure involved. Just plain Harbor with docker.

Versions:

  • harbor version: 2.1.1
  • docker engine version: 19.03.13
  • docker-compose version: 1.27.4

Additional context:

  • harbo.yml:
# Configuration file of Harbor

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: harbor.internal.domain.com

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /data/cert/harbor.internal.domain.com.cert
  private_key: /data/cert/harbor.internal.domain.com.key

# # Uncomment following will enable tls communication between all harbor components
# internal_tls:
#   # set enabled to true means internal tls is enabled
#   enabled: true
#   # put your cert and key files on dir
#   dir: /etc/harbor/tls/internal

# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433

# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345

# Harbor DB configuration
database:
  # The password for the root user of Harbor DB. Change this before any production use.
  password: root123
  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
  max_idle_conns: 50
  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
  # Note: the default number of connections is 1024 for postgres of harbor.
  max_open_conns: 1000

# The default data volume
data_volume: /data

# Harbor Storage settings by default is using /data dir on local filesystem
# Uncomment storage_service setting If you want to using external storage
# storage_service:
#   # ca_bundle is the path to the custom root ca certificate, which will be injected into the truststore
#   # of registry's and chart repository's containers.  This is usually needed when the user hosts a internal storage with self signed certificate.
#   ca_bundle:

#   # storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss
#   # for more info about this configuration please refer https://docs.docker.com/registry/configuration/
#   filesystem:
#     maxthreads: 100
#   # set disable to true when you want to disable registry redirect
#   redirect:
#     disabled: false

# Clair configuration
clair:
  # The interval of clair updaters, the unit is hour, set to 0 to disable the updaters.
  updaters_interval: 12

# Trivy configuration
#
# Trivy DB contains vulnerability information from NVD, Red Hat, and many other upstream vulnerability databases.
# It is downloaded by Trivy from the GitHub release page https://github.com/aquasecurity/trivy-db/releases and cached
# in the local file system. In addition, the database contains the update timestamp so Trivy can detect whether it
# should download a newer version from the Internet or use the cached one. Currently, the database is updated every
# 12 hours and published as a new release to GitHub.
trivy:
  # ignoreUnfixed The flag to display only fixed vulnerabilities
  ignore_unfixed: false
  # skipUpdate The flag to enable or disable Trivy DB downloads from GitHub
  #
  # You might want to enable this flag in test or CI/CD environments to avoid GitHub rate limiting issues.
  # If the flag is enabled you have to download the `trivy-offline.tar.gz` archive manually, extract `trivy.db` and
  # `metadata.json` files and mount them in the `/home/scanner/.cache/trivy/db` path.
  skip_update: false
  #
  # insecure The flag to skip verifying registry certificate
  insecure: false
  # github_token The GitHub access token to download Trivy DB
  #
  # Anonymous downloads from GitHub are subject to the limit of 60 requests per hour. Normally such rate limit is enough
  # for production operations. If, for any reason, it's not enough, you could increase the rate limit to 5000
  # requests per hour by specifying the GitHub access token. For more details on GitHub rate limiting please consult
  # https://developer.github.com/v3/#rate-limiting
  #
  # You can create a GitHub token by following the instructions in
  # https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
  #
  # github_token: xxx

jobservice:
  # Maximum number of job workers in job service
  max_job_workers: 10

notification:
  # Maximum retry count for webhook job
  webhook_job_max_retry: 10

chart:
  # Change the value of absolute_url to enabled can enable absolute url in chart
  absolute_url: disabled

# Log configurations
log:
  # options are debug, info, warning, error, fatal
  level: info
  # configs for logs in local storage
  local:
    # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.
    rotate_count: 50
    # Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.
    # If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G
    # are all valid.
    rotate_size: 200M
    # The directory on your host that store log
    location: /var/log/harbor

  # Uncomment following lines to enable external syslog endpoint.
  # external_endpoint:
  #   # protocol used to transmit log to external endpoint, options is tcp or udp
  #   protocol: tcp
  #   # The host of external endpoint
  #   host: localhost
  #   # Port of external endpoint
  #   port: 5140

#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!
_version: 2.0.0

# Uncomment external_database if using external database.
# external_database:
#   harbor:
#     host: harbor_db_host
#     port: harbor_db_port
#     db_name: harbor_db_name
#     username: harbor_db_username
#     password: harbor_db_password
#     ssl_mode: disable
#     max_idle_conns: 2
#     max_open_conns: 0
#   clair:
#     host: clair_db_host
#     port: clair_db_port
#     db_name: clair_db_name
#     username: clair_db_username
#     password: clair_db_password
#     ssl_mode: disable
#   notary_signer:
#     host: notary_signer_db_host
#     port: notary_signer_db_port
#     db_name: notary_signer_db_name
#     username: notary_signer_db_username
#     password: notary_signer_db_password
#     ssl_mode: disable
#   notary_server:
#     host: notary_server_db_host
#     port: notary_server_db_port
#     db_name: notary_server_db_name
#     username: notary_server_db_username
#     password: notary_server_db_password
#     ssl_mode: disable

# Uncomment external_redis if using external Redis server
# external_redis:
#   # support redis, redis+sentinel
#   # host for redis: <host_redis>:<port_redis>
#   # host for redis+sentinel:
#   #  <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>
#   host: redis:6379
#   password:
#   # sentinel_master_set must be set to support redis+sentinel
#   #sentinel_master_set:
#   # db_index 0 is for core, it's unchangeable
#   registry_db_index: 1
#   jobservice_db_index: 2
#   chartmuseum_db_index: 3
#   clair_db_index: 4
#   trivy_db_index: 5
#   idle_timeout_seconds: 30

# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.
# uaa:
#   ca_file: /path/to/ca

# Global proxy
# Config http proxy for components, e.g. http://my.proxy.com:3128
# Components doesn't need to connect to each others via http proxy.
# Remove component from `components` array if want disable proxy
# for it. If you want use proxy for replication, MUST enable proxy
# for core and jobservice, and set `http_proxy` and `https_proxy`.
# Add domain to the `no_proxy` field, when you want disable proxy
# for some special registry.
proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - clair
    - trivy

Can anybody tell me, what's wrong here?

@svdHero
Copy link
Author

svdHero commented Nov 19, 2020

Apparently this is a problem with "docker-credential-helpers", see

docker/docker-credential-helpers#158
and
docker/docker-credential-helpers#154

@guoziqin
Copy link

我也碰到这个问题了 好像不是过期的凭证 不知道 楼主是否解决了

@ackjing
Copy link

ackjing commented Apr 16, 2021

relogin.
docker login yourharborname.

@ackjing
Copy link

ackjing commented Apr 16, 2021

我也碰到这个问题了 好像不是过期的凭证 不知道 楼主是否解决了

重新登录

@guoziqin
Copy link

我也碰到这个问题了 好像不是过期的凭证 不知道 楼主是否解决了

重新登录

解决了 在harbor的nginx进行配置

@guoziqin
Copy link

我也碰到这个问题了 好像不是过期的凭证 不知道 楼主是否解决了

重新登录

在 common/config/nginx/nginx.conf
内容server中 增加
location / proxy_set_header X-Forwarded-Proto https;
location /v2 proxy_set_header X-Forwarded-Proto https;
location /service/ proxy_set_header X-Forwarded-Proto https;
增加三个代理

@paulliss
Copy link

paulliss commented May 6, 2021

我也碰到这个问题了 好像不是过期的凭证 不知道 楼主是否解决了

重新登录

在 common/config/nginx/nginx.conf
内容server中 增加
location / proxy_set_header X-Forwarded-Proto https;
location /v2 proxy_set_header X-Forwarded-Proto https;
location /service/ proxy_set_header X-Forwarded-Proto https;
增加三个代理

Hi.
What about:
"# When setting up Harbor behind other proxy, such as an Nginx instance, remove the below line if the proxy already has similar settings." ?
Should I ignore it?

@shine-fire
Copy link

我也碰到这个问题了 好像不是过期的凭证 不知道 楼主是否解决了

重新登录

在 common/config/nginx/nginx.conf
内容server中 增加
location / proxy_set_header X-Forwarded-Proto https;
location /v2 proxy_set_header X-Forwarded-Proto https;
location /service/ proxy_set_header X-Forwarded-Proto https;
增加三个代理

我发现我改了common/config/nginx/nginx.conf之后,重新 ./install 安装运行起来,发现nginx.conf的配置文件又恢复默认内容了,我添加的你说的这三行并没有生效

@pengyuguang
Copy link

当我通过负载均衡用途的Nginx反向代理 harbor-nginx的时候,也遇到类似问题。后来检查一些成功案例做对比,发现是漏了一行

proxy_redirect http:// $scheme://;

全部内容:

  server {
    listen 443 ssl;
    # server_tokens off;
    server_name harbor.pyg.com;
    # disable any limits to avoid HTTP 413 for large image uploads
    client_max_body_size 0;
    client_header_timeout 300;

    #ssl证书的pem文件路径
    ssl_certificate  /etc/nginx/certs/harbor.pyg.com.crt;
    #ssl证书的key文件路径
    ssl_certificate_key /etc/nginx/certs/harbor.pyg.com.key;

    # try_files $uri $uri/ /index.html;

    location /{
        proxy_pass http://harbor-nginx:8080/;
        proxy_set_header Host $host:443;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect http:// $scheme://;
        client_max_body_size 0;
    }
  }

对此, bing解释是:

如果少了proxy_redirect http:// $scheme://;这一行,会导致nginx无法正确地修改被代理服务器返回的重定向或刷新请求中的协议部分1。也就是说,如果被代理服务器返回的是http协议的Location或Refresh头部,而nginx前端使用的是https协议,那么nginx不会自动将http替换为https,而是原样发送给客户端1。这样,客户端就会尝试使用http协议访问nginx的https端口,从而导致400 Bad Request错误2
为了解决这个问题,您需要在nginx配置文件中添加proxy_redirect http:// $scheme://;这一行,告诉nginx将被代理服务器返回的http协议替换为$scheme变量的值,也就是nginx前端使用的协议1。这样,无论被代理服务器返回的是http还是https协议,nginx都会根据前端的实际情况进行修改,并且不影响其他部分1

@uplogin
Copy link

uplogin commented Jan 6, 2024

我也碰到这个问题了 好像不是过期的凭证 不知道 楼主是否解决了

重新登录

在 common/config/nginx/nginx.conf 内容server中 增加 location / proxy_set_header X-Forwarded-Proto https; location /v2 proxy_set_header X-Forwarded-Proto https; location /service/ proxy_set_header X-Forwarded-Proto https; 增加三个代理

this solved my issue
thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants