跳至主要内容

配置 Dependabot 访问私有注册表的权限

您可以配置 Dependabot 以访问存储在私有注册表中的依赖项。您可以将认证信息(如密码和访问令牌)存储为加密密钥,然后在 Dependabot 配置文件中引用这些密钥。如果您的注册表位于私有网络中,您还可以在自托管运行器上运行 Dependabot 时配置其访问权限。

谁可以使用此功能?

具有 写入 访问权限的用户

关于私有注册表

Dependabot 版本更新可保持您的依赖项为最新状态,Dependabot 安全更新可修复有漏洞的依赖项。Dependabot 能访问公共注册表。此外,您还可以授予 Dependabot 对私有包注册表和私有 GitHub 仓库的访问权限,从而让您的私有和内部源码依赖与公共依赖一样保持最新和安全。

在大多数生态系统中,私有依赖通常发布到私有包注册表。这些私有注册表与公共注册表类似,但需要进行身份验证。

对于特定的生态系统,您可以通过移除对公共注册表的调用,使 Dependabot 访问私有注册表。欲了解更多信息,请参阅 移除 Dependabot 对公共注册表的访问

要让 Dependabot 访问私有托管或受内部网络限制的注册表,请配置 Dependabot 在 GitHub Actions 自托管运行器上运行。欲了解更多信息,请参阅 在自托管运行器上配置 Dependabot

配置私有注册表

您可以在组织层级配置 Dependabot 对私有注册表的访问。有关如何进行配置的更多信息,请参阅 授权安全功能访问私有注册表

您也可以在 dependabot.yml 文件中配置 Dependabot 对私有注册表的访问。顶层的 registries 键是可选的,用于指定身份验证详情。

dependabot.yml 文件中有两个位置可以使用 registries

  • 在顶层,您可以在此定义注册表及其访问信息(如有需要)。
  • updates 块中,您可以使用 registries: "*",告诉 Dependabot 使用您在顶层定义的任意或全部注册表。
# registries: gradle-artifactory - provides access details for the gradle-artifactory registry
# registries: "*" - allows Dependabot to use all the defined registries specified at the top level

version: 2
registries:
  gradle-artifactory:
    type: maven-repository
    url: https://acme.jfrog.io/artifactory/my-gradle-registry
    username: octocat
    password: ${{secrets.MY_ARTIFACTORY_PASSWORD}}
updates:
  - package-ecosystem: "gradle"
    directory: "/"
    registries: "*"
    schedule:
      interval: "monthly"

您可使用以下选项来指定访问设置。注册表设置必须包含 typeurl,通常还需要 usernamepassword 的组合,或 token

参数用途
REGISTRY_NAME必填: 为注册表定义一个标识符。
type必填: 标识注册表的类型。
身份验证详情必填: 为提供身份验证详情而支持的参数因注册表类型而异。
url必填: 用于访问此注册表中依赖项的 URL。协议是可选的。如果未指定,默认使用 https://。Dependabot 会根据需要添加或忽略尾随斜杠。
replaces-base如果布尔值为 true,Dependabot 将使用指定的 url 而非该生态系统的基础 URL 来解析依赖关系。

有关可用的配置选项及受支持类型的更多信息,请参阅 Dependabot 选项参考

存储 Dependabot 使用的凭证

要让 Dependabot 访问 GitHub 支持的私有注册表,您需要将注册表的访问令牌或密钥存储在仓库或组织的密钥库中。

关于 Dependabot 的加密密钥

Dependabot 密钥是加密的凭证,您可以在组织层级或仓库层级创建。当您在组织层级添加密钥时,可以指定哪些仓库可以访问该密钥。您可以使用密钥让 Dependabot 更新位于私有包注册表中的依赖项。添加密钥后,它会在到达 GitHub 前被加密,并在 Dependabot 使用该密钥访问私有包注册表之前保持加密状态。

Dependabot 密钥还包括由 Dependabot 拉取请求触发的 GitHub Actions 工作流使用的密钥。虽然 Dependabot 本身可能不使用这些密钥,但工作流需要它们。欲了解更多信息,请参阅 GitHub Actions 上的 Dependabot 故障排除

添加 Dependabot 密钥后,您可以在 dependabot.yml 配置文件中这样引用它:${{secrets.NAME}},其中 “NAME” 为您为该密钥选择的名称。例如

YAML
password: ${{secrets.MY_ARTIFACTORY_PASSWORD}}

为密钥命名

Dependabot 密钥的名称

  • 只能包含字母数字字符([A-Z][0-9])或下划线(_)。不允许使用空格。如果输入小写字母,会自动转换为大写。
  • 不能以 GITHUB_ 前缀开头。
  • 不能以数字开头。

为 Dependabot 添加仓库密钥

要为个人账户仓库创建密钥,您必须是该仓库的所有者。要为组织仓库创建密钥,您必须拥有 admin 访问权限。

  1. 在 GitHub 上,导航至仓库的主页面。

  2. 在您的仓库名称下,点击 设置。如果看不到 “设置” 选项卡,请选择 下拉菜单,然后点击 设置

    Screenshot of a repository header showing the tabs. The "Settings" tab is highlighted by a dark orange outline.

  3. 在侧边栏的 “安全” 部分,选择 密钥和变量,然后点击 Dependabot

  4. 点击 新仓库机密

  5. 名称 输入框中输入密钥的名称。

  6. 输入密钥的值。

  7. 点击 添加密钥

    密钥的名称会显示在 Dependabot 密钥页面上。您可以点击 更新 来更改密钥值。您可以点击 删除 来删除该密钥。

为 Dependabot 添加组织密钥

在组织中创建密钥时,您可以使用策略来限制哪些仓库可以访问该密钥。例如,您可以授予所有仓库访问权限,或仅限私有仓库或指定的仓库列表访问。

要在组织层级创建密钥,您必须拥有 admin 访问权限。

  1. 在 GitHub 上,前往该组织的首页。

  2. 在您的组织名称下,点击 设置。如果看不到 “设置” 选项卡,请选择 下拉菜单,然后点击 设置

    Screenshot of the tabs in an organization's profile. The "Settings" tab is outlined in dark orange.

  3. 在侧边栏的 “安全” 部分,选择 密钥和变量,然后点击 Dependabot。忽略 “私有注册表” 选项,该选项仅用于代码扫描的默认设置。

  4. 点击 新组织机密

  5. 名称 输入框中输入密钥的名称。

  6. 输入密钥的 Value(值)。

  7. Repository access(仓库访问) 下拉列表中选择一个访问策略。

  8. 如果您选择了 已选仓库

    • 点击.
    • 在对话框中,选择能够访问此密钥的仓库。
    • 点击 更新选择
  9. 点击 添加密钥

    密钥的名称会显示在 Dependabot 密钥页面上。您可以点击 更新 来更改密钥值或其访问策略。您可以点击 删除 来删除该密钥。

配置防火墙 IP 规则

您可以将与 Dependabot 相关的 IP 地址添加到注册表的 IP 允许列表中。

如果您的私有注册表已配置 IP 允许列表,您可以在 meta API 端点的 actions 键下找到 Dependabot 用于访问注册表的 IP 地址。欲了解更多信息,请参阅 元数据的 REST API 端点关于 GitHub Actions 运行器上的 Dependabot

使用 OIDC 进行身份验证

Dependabot 可以使用 OpenID Connect(OIDC)对私有注册表进行身份验证,从而无需将长期凭证存储为仓库密钥。

使用基于 OIDC 的身份验证时,Dependabot 更新作业可以动态地从您的云身份提供商获取短期凭证,就像使用 OIDC 联合的 GitHub Actions 工作流一样。

当注册表托管在以下云提供商之一时,若注册表使用 usernamepassword 进行身份验证,Dependabot 支持对其进行 OIDC 身份验证:

  • AWS CodeArtifact
  • Azure DevOps Artifacts
  • JFrog Artifactory

要配置 OIDC 身份验证,您需要在注册表配置中指定不同于 usernamepassword 的值。

AWS CodeArtifact

AWS CodeArtifact 需要以下值:aws-regionaccount-idrole-namedomaindomain-owneraudience 字段为可选。

registries:
  my-aws-codeartifact-feed:
    type: npm-registry
    url: https://MY_DOMAIN-MY-ACCOUNT_ID.d.codeartifact.REGION.amazonaws.com/npm/MY_REPOSITORY/
    aws-region: REGION
    account-id: '123456789012'
    role-name: MY_ROLE_NAME
    domain: MY_DOMAIN
    domain-owner: '987654321098'
    audience: MY_AUDIENCE  # if required by your feed

Azure DevOps Artifacts

Azure DevOps Artifacts 需要以下值:tenant-idclient-id

registries:
  my-azure-devops-artifacts-feed:
    type: npm-registry
    url: https://pkgs.dev.azure.com/MY-ORGANIZATION/MY-PROJECT/_packaging/MY-FEED/npm/registry/
    tenant-id: ${{ secrets.AZURE_TENANT_ID }}
    client-id: ${{ secrets.AZURE_CLIENT_ID }}

JFrog Artifactory

JFrog Artifactory 需要以下值:urljfrog-oidc-provider-nameaudienceidentity-mapping-name 为可选值。

registries:
  my-jfrog-artifactory-feed:
    type: npm-registry
    url: https://JFROG-PLATFORM-URL/artifactory/api/npm/MY-REPOSITORY
    jfrog-oidc-provider-name: MY-PROVIDER
    audience: MY-AUDIENCE  # if required by your feed
    identity-mapping-name: MY-IDENTITY-MAPPING  # if required by your feed

欲了解 OIDC 工作原理的更多信息,请参阅 OpenID Connect

允许外部代码执行

当您授予 Dependabot 对一个或多个注册表的访问权限时,外部代码执行会被自动禁用,以防止您的代码受到受损软件包的影响。不过,某些版本更新可能会失败。

如果您需要让 Dependabot 访问私有包注册表并启用受限的外部代码执行,您可以将 insecure-external-code-execution 设置为 allow。在更新期间允许 Dependabot 在清单中执行外部代码并不像听起来那样可怕。

  • 任何外部代码执行只会访问与其所在的 updates 设置关联的注册表中的包管理器。
  • 不允许访问在顶层 registries 配置中定义的任何注册表。

常见的工具(如 bundlermixpipswift)默认允许执行外部代码。

在本示例中,配置文件允许 Dependabot 访问 ruby-github 私有包注册表。在同一 updates 设置中,insecure-external-code-execution 被设置为 allow,这意味着依赖项执行的代码仅会访问 ruby-github 注册表,而不会访问 dockerhub 注册表。

YAML
# Allow external code execution when updating dependencies from private registries

version: 2
registries:
  ruby-github:
    type: rubygems-server
    url: https://rubygems.pkg.github.com/octocat/github_api
    token: ${{secrets.MY_GITHUB_PERSONAL_TOKEN}}
updates:
  - package-ecosystem: "bundler"
    directory: "/rubygems-server"
    insecure-external-code-execution: allow
    registries: "*"
    schedule:
      interval: "monthly"

受支持的私有注册表

示例:如何配置对 Dependabot 支持的私有注册表的访问。

cargo-registry

cargo-registry 类型支持 token。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

registries:
  cargo-example:
    type: cargo-registry
    registry: "name-of-your-registry"
    url: https://cargo.cloudsmith.io/foobaruser/test/
    token: "Token ${{secrets.CARGO_TOKEN}}"

我们已在 https://cargo.cloudsmith.io 私有注册表上测试了此配置。

composer-repository

composer-repository 类型支持用户名和密码。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  composer:
    type: composer-repository
    url: https://repo.packagist.com/example-company/
    username: octocat
    password: ${{secrets.MY_PACKAGIST_PASSWORD}}

docker-registry

Dependabot 可与实现 OCI 容器注册表规范的任何容器注册表配合使用。更多信息请参阅 https://github.com/opencontainers/distribution-spec/blob/main/spec.md。Dependabot 支持通过集中令牌服务或 HTTP 基本身份验证对私有注册表进行身份验证。有关更多细节,请参阅 Docker 文档中的 令牌认证规范以及维基百科上的 基本访问认证

docker-registry 类型支持用户名和密码。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  dockerhub:
    type: docker-registry
    url: https://registry.hub.docker.com
    username: octocat
    password: ${{secrets.MY_DOCKERHUB_PASSWORD}}
    replaces-base: true

docker-registry 类型还可用于使用静态 AWS 凭证从私有 Amazon ECR 拉取。

YAML
registries:
  ecr-docker:
    type: docker-registry
    url: https://1234567890.dkr.ecr.us-east-1.amazonaws.com
    username: ${{secrets.ECR_AWS_ACCESS_KEY_ID}}
    password: ${{secrets.ECR_AWS_SECRET_ACCESS_KEY}}
    replaces-base: true

git

git 类型支持用户名和密码。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

YAML
registries:
  github-octocat:
    type: git
    url: https://github.com
    username: x-access-token
    password: ${{secrets.MY_GITHUB_PERSONAL_TOKEN}}

goproxy-server

goproxy-server 类型支持用户名和密码。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  my-private-registry:
    type: goproxy-server
    url: https://acme.jfrog.io/artifactory/api/go/my-repo
    username: octocat
    password: ${{secrets.MY_GO_REGISTRY_TOKEN}}

helm-registry

helm-registry 类型仅支持 HTTP 基本身份验证,不支持 OCI 兼容的注册表。如果您需要访问 Helm 图表的 OCI 兼容注册表,请改为配置 docker-registry

helm-registry 类型支持用户名和密码。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  helm_registry:
    type: helm-registry
    url: https://registry.example.com
    username: octocat
    password: ${{secrets.MY_REGISTRY_PASSWORD}}

hex-organization

hex-organization 类型支持 organization 和 key。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  github-hex-org:
    type: hex-organization
    organization: github
    key: ${{secrets.MY_HEX_ORGANIZATION_KEY}}

hex-repository

hex-repository 类型支持认证密钥。

repo 为必填字段,必须与您在依赖声明中使用的仓库名称匹配。

public-key-fingerprint 为可选配置字段,表示 Hex 仓库的公钥指纹。public-key-fingerprint 用于 Hex 与私有仓库建立信任。该字段可以明文列出,也可以存储为 Dependabot 密钥。

YAML
registries:
   github-hex-repository:
     type: hex-repository
     repo: private-repo
     url: https://private-repo.example.com
     auth-key: ${{secrets.MY_AUTH_KEY}}
     public-key-fingerprint: ${{secrets.MY_PUBLIC_KEY_FINGERPRINT}}

maven-repository

maven-repository 类型支持用户名、密码以及 replaces-base。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  maven-artifactory:
    type: maven-repository
    url: https://acme.jfrog.io/artifactory/my-maven-registry
    username: octocat
    password: ${{secrets.MY_ARTIFACTORY_PASSWORD}}
    replaces-base: true

您也可以使用 OIDC 身份验证来访问 JFrog Artifactory。使用 OIDC 时,Dependabot 会动态获取短期凭证,而不是使用静态凭证。

YAML
registries:
  maven-artifactory-oidc:
    type: maven-repository
    url: https://acme.jfrog.io/artifactory/my-maven-registry
    tenant-id: ${{secrets.ARTIFACTORY_TENANT_ID}}
    client-id: ${{secrets.ARTIFACTORY_CLIENT_ID}}
    replaces-base: true

npm-registry

npm-registry 类型支持用户名和密码,或 token。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

使用用户名和密码时,您 .npmrc 中的 auth token 可能包含经过 base64 编码的 _password;但在 Dependabot 配置文件中引用的密码必须是原始(未编码)的密码。

注意

使用 npm.pkg.github.com 时,请不要包含路径。请使用不带路径的 https://npm.pkg.github.com URL。

YAML
registries:
  npm-npmjs:
    type: npm-registry
    url: https://registry.npmjs.org
    username: octocat
    password: ${{secrets.MY_NPM_PASSWORD}}  # Must be an unencoded password
    replaces-base: true
YAML
registries:
  npm-github:
    type: npm-registry
    url: https://npm.pkg.github.com
    token: ${{secrets.MY_GITHUB_PERSONAL_TOKEN}}
    replaces-base: true

出于安全考虑,Dependabot 不会设置环境变量。Yarn(v2 及以上)要求访问的任何环境变量必须已设置。在 .yarnrc.yml 文件中访问环境变量时,您应提供后备值,例如 ${ENV_VAR-fallback}${ENV_VAR:-fallback}。欲了解更多信息,请参阅 Yarn 文档中的 Yarnrc 文件

nuget-feed

nuget-feed 类型支持用户名和密码,或 token。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

nuget-feed 不支持 replaces-base 参数。

YAML
registries:
  nuget-example:
    type: nuget-feed
    url: https://nuget.example.com/v3/index.json
    username: octocat@example.com
    password: ${{secrets.MY_NUGET_PASSWORD}}
YAML
registries:
  nuget-azure-devops:
    type: nuget-feed
    url: https://pkgs.dev.azure.com/.../_packaging/My_Feed/nuget/v3/index.json
    username: octocat@example.com
    password: ${{secrets.MY_AZURE_DEVOPS_TOKEN}}

您也可以使用 OIDC 身份验证来访问 Azure DevOps Artifacts。使用 OIDC 时,Dependabot 会动态获取短期凭证,而不是使用静态凭证。

YAML
registries:
  nuget-azure-devops-oidc:
    type: nuget-feed
    url: https://pkgs.dev.azure.com/MyOrganization/MyProject/_packaging/MyArtifactFeedName/nuget/v3/index.json
    tenant-id: ${{secrets.AZURE_TENANT_ID}}
    client-id: ${{secrets.AZURE_CLIENT_ID}}

AZURE_TENANT_IDAZURE_CLIENT_ID 可在您的 Entra ID 应用注册的概览页面获取。

pub-repository

pub-repository 类型支持 URL 和 token。

YAML
registries:
  my-pub-registry:
    type: pub-repository
    url: https://example-private-pub-repo.dev/optional-path
    token: ${{secrets.MY_PUB_TOKEN}}
updates:
  - package-ecosystem: "pub"
    directory: "/"
    schedule:
      interval: "weekly"
    registries:
      - my-pub-registry

python-index

python-index 类型支持用户名和密码,或 token。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  python-example:
    type: python-index
    url: https://example.com/_packaging/my-feed/pypi/example
    username: octocat
    password: ${{secrets.MY_BASIC_AUTH_PASSWORD}}
    replaces-base: true
YAML
registries:
  python-azure:
    type: python-index
    url: https://pkgs.dev.azure.com/octocat/_packaging/my-feed/pypi/example
    username: octocat@example.com
    password: ${{secrets.MY_AZURE_DEVOPS_TOKEN}}
    replaces-base: true

您也可以使用 OIDC 身份验证来访问 Azure DevOps Artifacts。使用 OIDC 时,Dependabot 会动态获取短期凭证,而不是使用静态凭证。

YAML
registries:
  python-azure-oidc:
    type: python-index
    url: https://pkgs.dev.azure.com/octocat/_packaging/my-feed/pypi/example
    tenant-id: ${{secrets.AZURE_TENANT_ID}}
    client-id: ${{secrets.AZURE_CLIENT_ID}}
    replaces-base: true

rubygems-server

rubygems-server 类型支持用户名和密码,或 token。如果账户是 GitHub 账户,您可以使用 GitHub 个人访问令牌代替密码。

此注册表类型会对 url 选项中提供的路径进行前缀匹配。这意味着您可以为同一主机提供多个凭证,以访问不同的路径。不过,如果在同一主机上没有多个注册表,我们建议您在 url 中省略路径,这样注册表的所有路径都会使用相同的凭证。

YAML
registries:
  ruby-example:
    type: rubygems-server
    url: https://rubygems.example.com
    username: octocat@example.com
    password: ${{secrets.MY_RUBYGEMS_PASSWORD}}
    replaces-base: true
YAML
registries:
  ruby-github:
    type: rubygems-server
    url: https://rubygems.pkg.github.com/octocat/github_api
    token: ${{secrets.MY_GITHUB_PERSONAL_TOKEN}}
    replaces-base: true

terraform-registry

terraform-registry 类型支持 token。

YAML
registries:
  terraform-example:
    type: terraform-registry
    url: https://terraform.example.com
    token: ${{secrets.MY_TERRAFORM_API_TOKEN}}
© . This site is unofficial and not affiliated with GitHub, Inc.