
SAP S/4HANA のSide-by-Side拡張開発という文脈でも、SAP BTP上でSAP CAPのアプリケーションを作成し、カスタムロジックを作成することはよくあるユースケースです。本ブログ記事では、その際にカスタムアプリケーションへのアクセス権限はどのように管理するのか、という点について、SAP Cloud Identity Servicesを用いた管理の一例をご紹介します。
SAP Cloud Identity Servicesは、SAP BTP上で提供されるクラウドベースのセキュリティサービス群であり、企業がアイデンティティとアクセス管理を効果的に行えるよう支援します。主に以下の特徴と構成要素から成り立っています。
特徴
槇成要素
これらの特徴と構成要素を通じて、SAP Cloud Identity Servicesは企業のデジタル変革を安全かつスムーズに支援します。
Web アプリケーションにおける認証は、アプリケーションのセキュリティを担保するために必要不可欠です。認証プロセスでは、ユーザーの身元を確認し、リクエストの正当性(例えば、ロールやテナントのメンバーシップ)を検証します。SAP CAPでは、この認証方法は多岐にわたってカスタマイズ可能であり、一般的なシナリオをカバーする標準的な認証方法がサポートされています。
例えば、SAP BTP上で提供されているXSUAA(XS User Authentication and Authorization)サービス はOAuth 2.0に準拠した認証サーバーで、JWTトークンを通じてユーザー情報と認証情報を提供します。
https://cap.cloud.sap/docs/guides/security/authorization
中でも今回は、SAP CAPアプリケーションの認証実装でよく用いられるこのXSUAA形式での認証を前提にご紹介いたします。
どの認証方式を利用するのか、という設定はpackage.jsonにて行います。 cds -> requires -> auth の値をxsuaa として設定を行なっておく必要があります。この辺りの詳しい説明は上記公式ドキュメントをご参照ください。
package.json
"cds": {
"requires": {
"[production]": {
"db": "hana",
"auth": "xsuaa"
},
"app-service": {
"impl": "@sap/low-code-event-handler"
},
"auth": {
"[development]": {
"kind": "dummy"
},
"[production]": {
"kind": "xsuaa"
}
}
},
"features": {
"fetch_csrf": true
}
},
SAP CAPアプリケーションでは、一般に db/schema.cds で定義したデータモデルに対して、ODataサービスを定義して外部に公開します。この作業はsrv/service.cdsで行われ、下記のコードスニペットのように定義が行われます。(ファイル名は文脈に応じて変わる可能性もあります)
service.cds
using { cakeshop as my } from '../db/schema.cds';
@path : '/service/cakeshop'
service cakeshopSrv
{
annotate Cake with @restrict :
[
{ grant : [ '*' ], to : [ 'store-manager' ] },
{ grant : [ '*' ], to : [ 'store-staff' ] },
{ grant : [ 'READ' ], to : [ 'store-supervisor' ] }
];
annotate Category with @restrict :
[
{ grant : [ '*' ], to : [ 'store-manager' ] },
{ grant : [ 'READ' ], to : [ 'store-staff' ] },
{ grant : [ 'READ' ], to : [ 'store-supervisor' ] }
];
annotate Order with @restrict :
[
{ grant : [ '*' ], to : [ 'store-manager' ] },
{ grant : [ '*' ], to : [ 'store-staff' ] },
{ grant : [ 'READ' ], to : [ 'store-supervisor' ] }
];
@odata.draft.enabled
entity Cake as
projection on my.Cake;
@odata.draft.enabled
entity Category as
projection on my.Category;
@odata.draft.enabled
entity Order as
projection on my.Order;
}
annotate cakeshopSrv with @requires :
[
'authenticated-user',
'store-manager',
'store-staff',
'store-supervisor'
];
このファイルでは、定義されたデータモデルを読み込み、それぞれのデータモデルを単一のODataサービス内のEntityとして公開しています。今回はケーキの在庫や注文を管理するという例になっています。
この際 @restrict アノテーションを通じて、各EntityやODataサービス自体に対してCRUD操作の制限をかけることが可能です。今回は 以下のように分割された操作権限が定義されています。
ロール名 | 対象 | エンティティと権限 | ||
|
| Cake | Category | Order |
authenticated-user | 認証されたユーザー全般 | - | - | - |
store-manager | 店舗マネージャ | CRUD | CRUD | CRUD |
store-staff | 店舗スタッフ | CRUD | R | CRUD |
store-supervisor | エリアマネージャ | R | R | R |
この定義を行ったのち、ターミナルにて以下のコマンドを実行すると、これに基づいてロールの定義(xs-security.json)が生成されます。
cds compile srv/ --to xsuaa > xs-security.json
xs-security.json
{
"scopes": [
{
"name": "$XSAPPNAME.store-manager",
"description": "store-manager"
},
{
"name": "$XSAPPNAME.store-staff",
"description": "store-staff"
},
{
"name": "$XSAPPNAME.store-supervisor",
"description": "store-supervisor"
}
],
"attributes": [],
"role-templates": [
{
"name": "store-manager",
"description": "generated",
"scope-references": [
"$XSAPPNAME.store-manager"
],
"attribute-references": []
},
{
"name": "store-staff",
"description": "generated",
"scope-references": [
"$XSAPPNAME.store-staff"
],
"attribute-references": []
},
{
"name": "store-supervisor",
"description": "generated",
"scope-references": [
"$XSAPPNAME.store-supervisor"
],
"attribute-references": []
}
]
}
これにより、このアプリケーションのデプロイと同時にロールがSAP BTP Cockpit上から利用できるようになります。
無事にSAP CAPアプリケーションのデプロイが完了すると、下図のように、アプリケーションに紐づいたロールがデプロイされます。
SAP BTP上では、このロール群をまとめたロールコレクションという単位で権限の制御を行うため、まずはこのロールコレクションの作成を行います。
今回は、それぞれのロールに対して1つのロールコレクションを作成しました。必要があれば、一つのロールコレクションに複数のロールを割り当てることも可能です。
それでは最後に、このロールコレクションをSAP Cloud Identity Services – Identity Authenticationのユーザーグループに紐づけていきます。セキュリティ -> 認証設定から、SAP BTPを利用する際の認証に関する設定を行うことができます。今回はすでにSAP Cloud Identity Services – Identity Authenticationテナントの紐付けが済んでいるため、Custom IAS tenantの設定画面に入ります。
ロールコレクションマッピングの設定にて、先程作成したロールコレクションと、SAP Cloud Identity Services – Identity Authenticationにおけるユーザーグループを対応させます。
SAP BTP Cockpit側で行う作業は以上です。次に、SAP Cloud Identity Services – Identity Authenticationの管理者画面側で、ユーザーグループの作成とユーザーの割り当てを行います。まずは全てのEntityに対してRead権限のみを持つstore-supervisorにユーザーを割り当てます。
この状態でアプリケーションにアクセスすると、以下のような画面になります。store-supervisor ロールを持つユーザーはCake Entity に対してCreate権限を持たないため、「作成」ボタンをクリックすると、Forbiddenが返ります。
そこで、SAP Cloud Identity Services – Identity Authentication の管理者画面から、ユーザーのロールをstore-managerに変更します。
すると、store-managerロールはCake Entityに対するCreate権限を持つため、「作成」ボタンをクリックするとエラーなく作成ページを開くことができるようになります。
本ブログでは SAP CAPカスタムアプリケーションにおけるアクセス権限の管理について、SAP Cloud Identity Servicesを使用する方法を解説しました。具体的には、SAP Cloud Identity Servicesの特徴や構成要素の説明、SAP CAPアプリケーションでの認証方法の設定、サービス定義とロールの定義方法、そして最終的にIdentity Authenticationのユーザーグループを通じた権限管理のプロセスをご紹介しました。
今回のブログには含まれていませんが、SAP Cloud Identity Services – Identity Provisioningを組み合わせると、SCIMプロトコルに従ってユーザーやユーザーグループをSAP Cloud Identity Services – Identity Authenticationに連携し、他システムで管理されているユーザーに対しても、間接的に権限管理を行うことが可能です。
SAP BTPにおけるSide-by-Side開発とは切っても切り離せない関係性のSAP Cloud Identity Servicesですが、このブログを足がかりにして、ぜひより深く学んでみてください。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
19 | |
19 | |
15 | |
9 | |
8 | |
8 | |
7 | |
6 | |
6 | |
6 |