Skip to main content

Настройка OpenID Connect в PyPI

Используйте OpenID Connect в рабочих процессах для проверки подлинности с помощью PyPI.

Обзор

OpenID Connect (OIDC) позволяет рабочим процессам GitHub Actions выполнять проверку подлинности с помощью PyPI для публикации пакетов Python.

В этом руководстве представлен обзор настройки PyPI для доверия GitHubв качестве федеративного удостоверения и демонстрируется, как использовать эту конфигурацию в pypa/gh-action-pypi-publish действии для публикации пакетов в PyPI (или других репозиториях пакетов Python) без ручного управления маркерами API.

Необходимые компоненты

  • Основные понятия о том, как GitHub использует OpenID Connect (OIDC) и его архитектуру и преимущества, см. в разделе "Сведения об усилении защиты с помощью OpenID Connect".

  • Прежде чем продолжить, необходимо спланировать стратегию безопасности, чтобы обеспечить выдачу маркеров доступа только предсказуемым способом. Чтобы управлять тем, как поставщик облачных служб выдает маркеры доступа, необходимо определить по крайней мере одно условие, запретив недоверенным репозиториям запрашивать маркеры доступа к облачным ресурсам. Дополнительные сведения см. в разделе Сведения об усилении защиты с помощью OpenID Connect.

  • Если вы используете это руководство по GHE.com, понять, что необходимо заменить определенные значения в следующей документации. См. раздел "Сведения об усилении защиты с помощью OpenID Connect".

Добавление поставщика удостоверений в PyPI

Чтобы использовать OIDC с PyPI, добавьте конфигурацию доверия, которая связывает каждый проект в PyPI с каждым репозиторием и сочетанием рабочих процессов, которые могут публиковаться для него.

  1. Войдите в PyPI и перейдите к параметрам доверенной публикации для проекта, который вы хотите настроить. Для проекта с именем myprojectэто будет в https://pypi.org/manage/project/myproject/settings/publishing/.

  2. Настройте отношение доверия между проектом PyPI и репозиторием GitHub (и рабочим процессом в репозитории). Например, если репозиторий GitHub находится myorg/myproject и рабочий процесс выпуска определен в release.yml среде release, следует использовать следующие параметры для доверенного издателя в PyPI.

    Note

    Внимательно введите эти значения. Предоставление неправильному пользователю, репозиторию или рабочему процессу возможности публикации в проекте PyPI эквивалентно совместному использованию маркера API.

    • Владелец: myorg
    • Имя репозитория: myproject
    • Имя рабочего процесса: release.yml
    • (Необязательно) имя среды GitHub Actions : release

Обновление рабочего процесса GitHub Actions

После регистрации доверенного издателя в PyPI можно обновить рабочий процесс выпуска, чтобы использовать надежную публикацию.

Note

Если среды используются в рабочих процессах или политиках OIDC, рекомендуется добавить правила защиты в среду для дополнительной безопасности. Например, можно настроить правила развертывания в среде, чтобы ограничить, какие ветви и теги могут развертываться в среде или получить доступ к секретам среды. Дополнительные сведения см. в разделе Управление средами для развертывания.

Действие pypa/gh-action-pypi-publish имеет встроенную поддержку надежной публикации, которая может быть включена, предоставив ему id-token: write разрешение и опущению и опущениюusername.password

В следующем примере используется pypa/gh-action-pypi-publish действие для обмена маркером OIDC для маркера API PyPI, который затем используется для отправки дистрибутивов выпуска пакета в PyPI.

YAML
jobs:
  release-build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: "3.x"

      - name: build release distributions
        run: |
          # NOTE: put your own distribution build steps here.
          python -m pip install build
          python -m build

      - name: upload windows dists
        uses: actions/upload-artifact@v4
        with:
          name: release-dists
          path: dist/

  pypi-publish:
    runs-on: ubuntu-latest
    needs:
      - release-build
    permissions:
      id-token: write

    steps:
      - name: Retrieve release distributions
        uses: actions/download-artifact@v4
        with:
          name: release-dists
          path: dist/

      - name: Publish release distributions to PyPI
        uses: pypa/gh-action-pypi-publish@3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f