はじめに
こんにちは。皆さん Backstage ご利用になられていますか? Permission Frameworkでアクセスコントロールしていますか?
先日、BackstageのCatalog Entityのアクセスコントロールを実現するためのRBACの設定についてご紹介しました。
このときは「次回は「Scaffolder Template」のPermissionについて見ていきたいと思います。」と言っていましたが、その後Backstage v1.30のリリース内容のご紹介があり、少し間が空いてしまいました。申し訳ありません。
ということで、今回はその第2段で scaffolderのRBACについてご紹介します。
ScaffolderとはBackstageの主要な機能の1つであるSoftware Templateを実現するためのPluginで、つぎのようなテンプレート一覧が面から作成したいアプリケーション等を選択し、必要事項を入力したあとコード等をテンプレートから作成する機能です。
Scaffolder Pluginはこの中で利用されるものです。
Scaffolder PluginのPermissionのご紹介
それではScaffolderのPermissionについて少し詳細にご紹介していきたいと思います。 ここでは以前ご紹介した Permission Frameworkに関する基礎知識はすでにご存知であることを前提としてます。 ご存知ない方は以前のブログ記事をご覧ください。
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, ];
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に関する様々な情報を提供しております。ぜひこちらもご覧ください。
Backstageを簡単にお試しいただける「ちょこっとBackstage」というものも用意しております。Permission Frameworkは有効にしていませんが、ソースコードもありますので、ご自身でPluginを足してご利用いただくことが可能です。ぜひご活用ください。
最後に弊社ではBackstageの導入や運用をManagedで行うサービスを提供しています。Permission FrameworkのPolicyの定義方法のガイドなどもあわせて提供していきたいと考えておりますので、ご興味のある方はぜひご連絡ください。