Мне трудно настроить zypper
клиентов (SLES и OpenSUSE) для работы с нашим RPM Repository
в JFrog из-за некоторых проблем с «аутентификацией». Сначала я подумал, что это просто проблема с zypper
и opensuse, поэтому сначала сосредоточился на наших усилиях, чтобы заставить все работать с zypper. Это было предыдущим вопросом.
Но эти связанные с аутентификацией ошибки время от времени возникают и у yum
клиентов (CentOS), хотя и не так часто.
Итак, я попытался сделать man-in-the-middle
, чтобы увидеть, что происходит под капотом, и это последовательность с zypper
:
Сценарий 1 - успешная проверка подлинности
Следующее: последовательность zypper refresh --repo myrepo
:
(1) zypper
отправляет запрос HTTP HEAD
с кодировкой base64
username:
:
HEAD /myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml HTTP/1.1
Host: rpm.example.com
Authorization: Basic dXNlcm5hbWU6
User-Agent: ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
Accept: */*
Connection: close
(2) jfrog
отвечает HTTP 401 Unauthorized
заголовком WWW-Authenticate
:
HTTP/1.1 401 Unauthorized
Date: Thu, 28 May 2020 08:20:04 GMT
Content-Type: application/json;charset=ISO-8859-1
Connection: close
Server: Artifactory/7.4.3 70403900
X-Artifactory-Id: 2148103ba10eacbb:-16f1c4c1:172093a231a:-8000
X-Artifactory-Node-Id: artifactory-server
WWW-Authenticate: Basic realm="Artifactory Realm"
(3) zypper
отправляет другой запрос HTTP HEAD
, на этот раз с кодировкой base64
username:password
:
HEAD /myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml HTTP/1.1
Host: rpm.example.com
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
User-Agent: ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
Accept: */*
Connection: close
(4) jfrog
наконец отвечает HTTP 200
.
HTTP/1.1 200 OK
Date: Thu, 28 May 2020 08:20:04 GMT
Content-Type: application/xml
Content-Length: 1394
Connection: close
Server: Artifactory/7.4.3 70403900
X-Artifactory-Id: 2148103ba10eacbb:-16f1c4c1:172093a231a:-8000
X-Artifactory-Node-Id: artifactory-server
Last-Modified: Fri, 08 May 2020 10:25:19 GMT
Accept-Ranges: bytes
X-Artifactory-Filename: repomd.xml
Cache-Control: no-store
Они регистрируются Artifactory:
artifactory-request.log
:
2020-05-28T08:20:34.566Z [5f78297c2aeabaa8] [DENIED LOGIN] for client : username / 213.1.1.1.
2020-05-28T08:20:34.870Z [570978212a5318e3] [ACCEPTED DOWNLOAD] myapp-release-rpm-cache:stable/myapp/2019/3/repodata/repomd.xml for client : username / 213.1.1.1.
artifactory-access.log
:
2020-05-28T08:20:34.566Z|5f78297c2aeabaa8|213.2.2.2|non_authenticated_user|HEAD|/myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml|401|-1|0|8|ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
2020-05-28T08:20:34.721Z|8018b7cbc9c424e8|213.2.2.2|username|HEAD|/myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml|200|-1|1394|3|ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
2020-05-28T08:20:34.870Z|570978212a5318e3|213.2.2.2|username|GET|/myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml|200|-1|1394|2|ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
...
Итак, zypper
приходит с запросом HEAD
, JFrog говорит: «вы не аутентифицированы», zypper
отвечает и пытается авторизоваться enticate, и, наконец, JFrog аутентифицирует zypper. На данный момент это имеет смысл.
Сценарий 2 - 403 запрещен
Поработайте, затем запустите ту же команду zypper refresh --repo myrepo
через несколько минут или около того, и вот результат:
(1) zypper
отправляет запрос HTTP HEAD
с кодированием base64
username:
:
HEAD /myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml HTTP/1.1
Host: rpm.example.com
Authorization: Basic dXNlcm5hbWU6
User-Agent: ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
Accept: */*
Connection: close
(2) jfrog
отвечает HTTP 401 Unauthorized
с заголовком WWW-Authenticate
:
HTTP/1.1 401 Unauthorized
Date: Thu, 28 May 2020 08:30:44 GMT
Content-Type: application/json;charset=ISO-8859-1
Connection: close
Server: Artifactory/7.4.3 70403900
X-Artifactory-Id: 2148103ba10eacbb:-16f1c4c1:172093a231a:-8000
X-Artifactory-Node-Id: artifactory-server
WWW-Authenticate: Basic realm="Artifactory Realm"
(3) zypper
отправляет другой запрос HTTP HEAD
, на этот раз с кодом base64
username:password
:
HEAD /myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml HTTP/1.1
Host: rpm.example.com
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
User-Agent: ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
Accept: */*
Connection: close
(4) на этот раз jfrog
отвечает 403 Forbidden
вместо 200 OK
.
HTTP/1.1 403 Forbidden
Date: Thu, 28 May 2020 08:30:44 GMT
Content-Type: application/json;charset=ISO-8859-1
Connection: close
Server: Artifactory/7.4.3 70403900
X-Artifactory-Id: 2148103ba10eacbb:-16f1c4c1:172093a231a:-8000
X-Artifactory-Node-Id: artifactory-server
WWW-Authenticate: Basic realm="Artifactory Realm"
artifactory-request.log
:
2020-05-28T08:30:44.496Z [46c81a2450623166] [DENIED LOGIN] for client : username / 213.1.1.1.
2020-05-28T08:30:44.630Z [769ed41c652daa7a] [DENIED LOGIN] for client : username / 213.1.1.1.
artifactory-access.log
:
2020-05-28T08:30:44.496Z|46c81a2450623166|213.2.2.2|non_authenticated_user|HEAD|/myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml|401|-1|0|9|ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
2020-05-28T08:30:44.630Z|769ed41c652daa7a|213.2.2.2|non_authenticated_user|HEAD|/myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml|403|-1|0|1|ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
Обратите внимание, что zypper отправляет такое же значение заголовка Authorization
при запросе на аутентификацию, но во втором сценарии JFrog
не может аутентифицировать запрос.
Кто-нибудь была такая же проблема с JFrog раньше? Мы предполагаем, что это проблема с JFrog 7, поскольку наша только недавно была обновлена, но у нас нет возможности проверить это. И, к сожалению для нас, мы находимся на платном плане, у которого даже нет лицензии на поддержку.
Мы будем очень благодарны за любые предложения и комментарии.
Дополнительная информация
Возможно, стоит отметить, что клиенты yum
(centos и rhel) не имеют этой точной проблемы с JFrog Artifactory
, и это, скорее всего, потому, что yum всегда отправляет имя пользователя и пароль ha sh в заголовке HTTP, избегая последовательность повторной аутентификации 401 Unauthorized
.