APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

BackstageのRBACをより深く理解する(Scaffolder編)

はじめに

こんにちは。皆さん Backstage ご利用になられていますか? Permission Frameworkでアクセスコントロールしていますか?

先日、BackstageのCatalog Entityのアクセスコントロールを実現するためのRBACの設定についてご紹介しました。

techblog.ap-com.co.jp

このときは「次回は「Scaffolder Template」のPermissionについて見ていきたいと思います。」と言っていましたが、その後Backstage v1.30のリリース内容のご紹介があり、少し間が空いてしまいました。申し訳ありません。

ということで、今回はその第2段で scaffolderのRBACについてご紹介します。

ScaffolderとはBackstageの主要な機能の1つであるSoftware Templateを実現するためのPluginで、つぎのようなテンプレート一覧が面から作成したいアプリケーション等を選択し、必要事項を入力したあとコード等をテンプレートから作成する機能です。

Scaffolder Pluginはこの中で利用されるものです。

Scaffolder PluginのPermissionのご紹介

それではScaffolderのPermissionについて少し詳細にご紹介していきたいと思います。 ここでは以前ご紹介した Permission Frameworkに関する基礎知識はすでにご存知であることを前提としてます。 ご存知ない方は以前のブログ記事をご覧ください。

techblog.ap-com.co.jp

Permission

前回にもお伝えしましたが、BackstageのPermissionは createPermission() を使用して定義します。

ScaffolderのPermissionは次のようなものが定義されています。

import { createPermission } from '@backstage/plugin-permission-common';

export const RESOURCE_TYPE_SCAFFOLDER_TEMPLATE = 'scaffolder-template';

export const RESOURCE_TYPE_SCAFFOLDER_ACTION = 'scaffolder-action';

export const actionExecutePermission = createPermission({
  name: 'scaffolder.action.execute',
  attributes: {},
  resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,
});

export const templateParameterReadPermission = createPermission({
  name: 'scaffolder.template.parameter.read',
  attributes: {
    action: 'read',
  },
  resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,
});

export const templateStepReadPermission = createPermission({
  name: 'scaffolder.template.step.read',
  attributes: {
    action: 'read',
  },
  resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,
});

export const taskReadPermission = createPermission({
  name: 'scaffolder.task.read',
  attributes: {
    action: 'read',
  },
});

export const taskCreatePermission = createPermission({
  name: 'scaffolder.task.create',
  attributes: {
    action: 'create',
  },
});

export const taskCancelPermission = createPermission({
  name: 'scaffolder.task.cancel',
  attributes: {},
});

export const scaffolderTemplatePermissions = [
  templateParameterReadPermission,
  templateStepReadPermission,
];

export const scaffolderActionPermissions = [actionExecutePermission];

export const scaffolderTaskPermissions = [
  taskCancelPermission,
  taskCreatePermission,
  taskReadPermission,
];

export const scaffolderPermissions = [
  ...scaffolderTemplatePermissions,
  ...scaffolderActionPermissions,
  ...scaffolderTaskPermissions,
];

github.com

Permission名をピックアップすると次のようなものになります。

  • scaffolder.action.execute
  • scaffolder.template.parameter.read
  • scaffolder.template.step.read
  • scaffolder.task.read
  • scaffolder.task.create
  • scaffolder.task.cancel

以下で簡単にその内容をご紹介します。

scaffolder.action.execute

scaffolder.action.executeはSoftware Templateを実行する際に必要な権限です。

こちらのPermissionでは以下のRuleを利用することができます。

  • HAS_TAG

Ruleはこちらで定義されています。

scaffolder.template.*.read

scaffolder.template.*.readはSoftware Templateを実行する際、設定ファイルの中身を読む際のPermissionです。 Software Templateの設定は例えば次のようなものになりますが、parameter/stepのそれぞれで参照・設定を許可をする場合に利用します。 たとえば管理者グループのみ、オーナー選択・変更ができるようにする、といった場合に利用するものです。

# Notice the v1beta3 version
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
# some metadata about the template itself
metadata:
  name: v1beta3-demo
  title: Test Action template
  description: scaffolder v1beta3 template demo
spec:
  owner: backstage/techdocs-core
  type: service

  # these are the steps which are rendered in the frontend with the form input
  # 1つ1つのパラメータの読み取り(実行)の許可・スキップを制御する場合は scaffolder.template.parameter.read で指定する。

  parameters:
    - title: Fill in some steps
      required:
        - name
      properties:
        name:
          title: Name
          type: string
          description: Unique name of the component
          ui:autofocus: true
          ui:options:
            rows: 5
        owner:
          title: Owner
          type: string
          description: Owner of the component
          ui:field: OwnerPicker
          ui:options:
            catalogFilter:
              kind: Group
    - title: Choose a location
      required:
        - repoUrl
      properties:
        repoUrl:
          title: Repository Location
          type: string
          ui:field: RepoUrlPicker
          ui:options:
            allowedHosts:
              - github.com

  # here's the steps that are executed in series in the scaffolder backend
  # 1つ1つのステップの読み取り(実行)の許可・スキップを制御する場合は scaffolder.template.step.read で指定する。
  steps:
    - id: fetch-base
      name: Fetch Base
      action: fetch:template
      input:
        url: ./template
        values:
          name: ${{ parameters.name }}
          owner: ${{ parameters.owner }}

    - id: fetch-docs
      name: Fetch Docs
      action: fetch:plain
      input:
        targetPath: ./community
        url: https://github.com/backstage/community/tree/main/backstage-community-sessions

    - id: publish
      name: Publish
      action: publish:github
      input:
        allowedHosts: ['github.com']
        description: This is ${{ parameters.name }}
        repoUrl: ${{ parameters.repoUrl }}

    - id: register
      name: Register
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps['publish'].output.repoContentsUrl }}
        catalogInfoPath: '/catalog-info.yaml'

  # some outputs which are saved along with the job for use in the frontend
  output:
    links:
      - title: Repository
        url: ${{ steps['publish'].output.remoteUrl }}
      - title: Open in catalog
        icon: catalog
        entityRef: ${{ steps['register'].output.entityRef }}

scaffolder.action.*.readで指定できるRuleには次のようなものがあります。

  • HAS_ACTION_ID
  • HAS_BOOLEAN_PROPERTY
  • HAS_NUMBER_PROPERTY
  • HAS_STRING_PROPERTY

Ruleはこちらで定義されています。

scaffolder.task.*

scaffolder.task.* はタスクの実行と、タスク一覧での読み取りやキャンセルの許可・不許可を指定するものです。

こちらのPermissionにはRuleの指定はできません。

チェックロジック

API実行時

基本的な考え方はcatalog entityのときと同様です。Scaffolder用のAPI呼び出しの際、それぞれに該当するPermissionの許可・不許可をチェックしていきます。

UI表示時

Catalog Entity同様、UIの一部ではPermissionで表示の切替を行っています。

1つ目はTemplate catalogを表示したときの「LAUNCHER TEMPLATE」ボタンです。こちらは scaffolder.task.create Permissionが許可されている場合のみ表示されます。

もう1つはSoftware Template一覧の「CHOOSE」ボタンです。こちらも scaffolder.task.create Permissionが許可されている場合のみ表示されます。

おわりに

いかがだったでしょうか。ScaffolderのPermissionは少し複雑です。実際にSoftware Templateを実行する際には scaffolder.action.execute、scaffolder.template.*.read、scaffolder.task.create のPermissionが適切に許可許可されている必要があります。今回の資料でその内容の一端が少しでもご理解いただければとてもうれしいです。

本ブログではこれまでにもBackstageに関する様々な情報を提供しております。ぜひこちらもご覧ください。

techblog.ap-com.co.jp

Backstageを簡単にお試しいただける「ちょこっとBackstage」というものも用意しております。Permission Frameworkは有効にしていませんが、ソースコードもありますので、ご自身でPluginを足してご利用いただくことが可能です。ぜひご活用ください。

techblog.ap-com.co.jp

github.com

最後に弊社ではBackstageの導入や運用をManagedで行うサービスを提供しています。Permission FrameworkのPolicyの定義方法のガイドなどもあわせて提供していきたいと考えておりますので、ご興味のある方はぜひご連絡ください。

techblog.ap-com.co.jp