IBM Cloud Docs
アクセスの制御

アクセスの制御

IBM Cloud® App ID を使えば、どのユーザーとアプリケーションがアプリ内の特定の機能にアクセスできるか、または特定のアクションを実行できるかを定義できます。 アクセスを制御するには、スコープを作成し、それらを役割としてグループ化します。 その後、その役割を 1 つ以上のアプリ・ユーザーおよびアプリケーションに割り当てます。

スコープとは、アクセス許可を作成するために App ID に登録する、アプリケーション内のランタイムのアクションです。 役割はさまざまなタイプのアプリ・ユーザーおよびアプリケーションに異なる許可を割り当てるスコープの集合です。 例えば、会社が開発者を雇う場合、コードに対する読み取りおよび書き込みをそれらの開発者に許可する役割を作成します。 監査員を雇う場合は、表示専用の役割が必要となります (次の図を参照)。

App ID アクセス・コントロール アクセス・コントロールの仕組み
App ID

  1. アプリケーションで発生するランタイム・アクションを App ID に登録します。
  2. スコープをまとめてグループ化し、役割を形成します。
  3. 役割をユーザーまたはアプリケーションに割り当ててアクセス許可を制御します。
  4. 実行時にユーザー・アクセス・トークン (または、クライアント資格情報フローの場合はアプリケーション・トークン) で返されるスコープを検証するようにアプリケーションを構成します。

アプリケーションについて詳しくは、アプリケーション ID と許可を参照してください。

開始前に

  • アプリケーションが必要です。
  • 各タイプの役割とスコープがアプリケーションに与える影響について理解しておくようにしてください。 この作業の担当者はアクセス権を付与する立場になるので、アクセス権を必要としている人にのみアクセス権を付与しようとしていることを確認する必要があります。
  • 定められている制限に注意してください。

コンソールでのスコープの作成

スコープとは、アプリケーション内のランタイムのアクションであり、それを遂行するのに必要な権限が付与されたユーザーが実行できます。 スコープは、アプリケーションを App ID に登録するときに作成されます。 アプリが既に登録されている場合、それを編集してスコープを含めることができます。

スコープ名の値は次の条件を満たす必要があります。

  • 英数字であること
  • 小文字であること
  • appid または openid で始まらないこと
  • ピリオド (.) または下線 (_) 以外の特殊文字を含まないこと
  • 50 文字未満であること

スコープを作成するには、App ID UI を使用できます。

  1. App ID ダッシュボードの**「アプリケーション」**に移動します。
  2. **「アプリケーションの追加 (Add application)」をクリックして、構成画面を開きます。 使用する資格情報が既にある場合は、更新する行の「操作」メニューから「編集」**をクリックします。
  3. アプリに名前を付け、使用するアプリケーションのタイプを選択します。
  4. カスタム・スコープの値を入力し、正符号 (+) をクリックします。 スコープ値の例としては、readwrite などがあります。
  5. すべてのスコープをアプリに追加するまで、前述のステップを繰り返します。
  6. 保存 をクリックします。

API でのスコープの作成

スコープとは、アプリケーション内のランタイムのアクションであり、それを遂行するのに必要な権限が付与されたユーザーが実行できます。 スコープは、アプリケーションを App ID に登録するときに作成されます。 アプリが既に登録されている場合、それを編集してスコープを含めることができます。

スコープ名の値は次の条件を満たす必要があります。

  • 英数字であること
  • 小文字であること
  • appid または openid で始まらないこと
  • ピリオド (.) または下線 (_) 以外の特殊文字を含まないこと
  • 50 文字未満であること

スコープを作成するには、App ID UI を使用できます。

  1. /scopes エンドポイントに次の要求を行ってスコープを作成します。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/scopes"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{\ "scopes":\ [\ <scopesObject>}" ]}"
    
    変数 説明
    region App ID のインスタンスがプロビジョンされているリージョン。 使用可能なリージョンについてはこちらを参照してください。
    tenantID App ID のインスタンスの固有 ID。 この値は、サービス・ダッシュボードの**「アプリケーション」**タブにリストされている、アプリの資格情報で見つけることができます。
    clientID アプリケーションの固有 ID。 この値は、サービス・ダッシュボードの**「アプリケーション」**にリストされている、アプリの資格情報で見つけることができます。
    scopesObject ご使用のアプリケーション用に作成するすべてのスコープの JSON オブジェクト。
    {: caption=" /scopes エンドポイントを呼び出すために必要な変数" caption-side="top"}
  2. オプション: スコープが作成されたことを確認します。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/scopes"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    

コンソールでのロールの作成

役割は、同一のユーザー・タイプに適用されるスコープのグループです。 例えば、管理者役割を作成する場合は、スコープ・セクションで、その役割に対して、読み取り、書き込み、または作成のアクションの実行を許可します。 一方、「viewer」という別の役割を作成した場合、その役割を割り当てられたユーザーは読み取り専用アクセス権限を持つことになります。 役割を作成するには、App ID UI を使用できます。

  1. App ID ダッシュボードの**「プロファイルと役割 (Profiles and roles)」> 「役割」**に移動します。

  2. **「役割の作成 (Create role)」**をクリックして構成画面を開きます。

  3. 役割に名前と説明を付けます。

  4. 前のセクションで作成したスコープを使用して、以下の形式でスコープを役割に割り当てます。 **「+」**をクリックしてスコープを追加します。

    <appName>/<scope>
    

    アプリケーションが 1 つしかない場合は、アプリ名を指定する必要はありません。 スコープのみを追加できます。

  5. 前の手順を繰り返してさらにスコープを追加します。

  6. 保存 をクリックします。

API での役割の作成

役割は、同一のユーザー・タイプに適用されるスコープのグループです。 例えば、管理者役割を作成する場合は、スコープ・セクションで、その役割に対して、読み取り、書き込み、または作成のアクションの実行を許可します。 一方、「viewer」という別の役割を作成する場合、その役割を割り当てられたユーザーは読み取り専用アクセス権限を持つことになります。 役割を作成するには、App ID API を使用できます。

  1. /roles エンドポイントに、役割を作成する要求を行います。

    curl -X POST "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d { \"name\": \"<roleName>\", \"description\": \"<roleDescription>\", \"access\": [ { \"application_id\": \"<applicationID>\", \"scopes\": [ \"<scopes>" ] } ]}"
    
    変数 説明
    region App ID のインスタンスがプロビジョンされているリージョン。 使用可能なリージョンについてはこちらを参照してください。
    tenantID App ID のインスタンスの固有 ID。 この値は、サービス・ダッシュボードの**「アプリケーション」**タブにリストされている、アプリの資格情報で見つけることができます。
    clientID アプリケーションの固有 ID。 この値は、**「アプリケーション」**にリストされているアプリの資格情報で見つけることができます。
    roleName 役割に割り当てる名前。
    roleDescription 役割の目的を説明する短い句。
    applicationID アプリケーションの固有 ID。 この値は、**「アプリケーション」**にリストされているアプリの資格情報で見つけることができます。
    scopes 役割に適用したいすべてのスコープの JSON オブジェクト。
    {: caption=" /scopes エンドポイントを呼び出すために必要な変数" caption-side="top"}
  2. オプション: 役割が作成されたことを確認します。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles -H "accept: application/json"
    

    応答は次の例のようになります。

    {
       "roles": [
       {
          "id": "12345678-1234-1234-1234-123456789012",
          "name": "admin",
          "description": "Can perform administrative tasks.",
          "access": [
             {
             "application_id": "de33d272-f8a7-4406-8fe8-ab28fd457be5",
             "scopes": [
                "create",
                "update",
                "write",
                "read"
             ]
             }
          ]
       }
       {
          "id": "123454231-1234-1234-3334-12345687012",
          "name": "developer",
          "description": "Can perform administrative tasks.",
          "access": [
             {
             "application_id": "de33d272-f8a7-4406-8fe8-ab28fd457be5",
             "scopes": [
                "write",
                "read"
             ]
             }
          ]
       }
       ]
    }
    

コンソールでユーザーにロールを割り当てる

役割を作成したら、それをユーザーのプロファイルに割り当てることができます。 役割は、将来のユーザーを作成するときに割り当てることもできます。

  1. App ID ダッシュボードの**「プロファイルと役割 (Profiles and roles)」 > 「ユーザー・プロファイル」**に移動します。
  2. 役割を割り当てる特定ユーザーの行の「操作」メニューから**「役割の割り当て」**をクリックします。
  3. 追加する 1 つ以上の役割を、使用可能な役割のリストから選択します。
  4. オプション: 探している役割が見つからない場合は、**「役割の作成 (Create role)」**をクリックして別のオプションを追加するための情報を指定します。
  5. 保存 をクリックします。

API を使用したユーザーへの役割の割り当て

役割を作成したら、それをユーザーのプロファイルに割り当てることができます。 役割は、将来のユーザーを作成するときに割り当てることもできます。

  1. E メール・アドレスなどの識別照会を使って App ID ユーザーを検索し、そのユーザー ID を取得します。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/Users?query=<identifyingSearchQuery>" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    

    例:

    curl -X GET https://us-south.appid.cloud.ibm.com/management/v4/e19a2778-3262-4986-8875-8khjafsdkhjsdafkjh/cloud_directory/Users?query=example@domain.com
    -H "accept: application/json"
    -H "authorization: Bearer eyJraWQiOiIyMDE3MTEyOSIsImFsZ...."
    
  2. オプション: 役割 ID または役割名を取得します。 既に役割 ID または役割名を知っている場合は、スキップして次のステップに進みます。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    
  3. 割り当てる役割の JSON オブジェクトが含まれている /roles エンドポイントに要求を行います。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/users/<userID>/roles"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{ \"roles\": { \"ids\": [ \"<roleIDs>\" ] }}"
    -H "authorization: Bearer <token>"
    

ユーザーから役割を削除するには、 PUT 要求を、その役割 ID を削除してもう一度行います。

トークンへのユーザー役割の追加

デフォルトでは、役割はユーザー・トークンには返されません。 ご使用のランタイムの決定はスコープに基づいて構成することをお勧めします。 ただし、役割を使用したい場合には、カスタムのクレーム・マッピングを使用することにより、役割をトークンにマップすることができます。

認証を行うときには、制御を構成したアプリケーションとユーザーに対して username : client ID および password : secret を使用してください。

アプリケーションへの役割の割り当て

役割を作成したら、App ID API を使用して、それをユーザーのアプリケーションに割り当てることができます。

アプリケーションの役割は、クライアント資格情報フローでのみ有効です。

  1. アプリケーションのリストを照会して、アプリケーション・クライアント ID を取得します。 App ID UI の**「アプリケーション」**タブからこの値を取得することもできます。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    

    例:

    curl -X GET https://us-south.appid.cloud.ibm.com/management/v4/e19a2778-3262-4986-8875-8khjafsdkhjsdafkjh/applications
    -H "accept: application/json"
    -H "authorization: Bearer eyJraWQiOiIyMDE3MTEyOSIsImFsZ...."
    
  2. 役割 ID を取得します。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    
  3. 割り当てる役割の JSON オブジェクトが含まれている /roles エンドポイントに要求を行います。 この要求は、現在の役割を、指定された役割 ID に置換します。 役割が正しく割り当てられていることを確認してください。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/roles"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{ \"roles\": { \"ids\": [ \"<roleIDs>\" ] }}"
    -H "authorization: Bearer <token>"
    

ユーザーから役割を削除するには、 PUT 要求を、その役割 ID を削除してもう一度行います。

実行時のアクセスの制御

保護リソースの 1 つにユーザーまたはアプリケーションがアクセスを試みると、App ID によってトークンが作成されて返されます。 ユーザーまたはアプリケーションに割り当てられたスコープは、アクセス・トークンで返されます。 アクセス・トークンを使用して、実行時に決定を行うことができます。 アプリケーションを保護するために使用している戦略に応じて、スコープの検証方法は異なる可能性があります。

Web アプリ戦略を使用する場合

Web アプリ戦略 で、hasScope メソッドを使用することにより、要求にスコープが含まれているかどうかを確認できます。 割り当てられた役割でユーザーがサインインすると、その役割に定義されているすべてのスコープが含まれた App ID トークンによって、ユーザーにアクセス権限が付与されます。例えば、Node.js SDK を使用している場合、コード・スニペットは以下のようなものになります。

app.get("/protected", passport.authenticate(WebAppStrategy.STRATEGY_NAME), function(req, res){
    if(WebAppStrategy.hasScope(req, "read write")){
              res.json(req.user);
    }
    else {
        res.send("insufficient scopes");
    }
});

API 戦略を使用する場合

特定のエンドポイントにアクセスするために必要なスコープは、API 戦略コードにスコープ変数を追加することにより定義できます。 例えば、Node.js で作成されたアプリケーションがあり、Node.js SDK を使用している場合、コード・スニペットは以下のようなものになります。

app.get("/api/protected",
        passport.authenticate(APIStrategy.STRATEGY_NAME, {
                audience: "myApp",
                scope: "read write update"
        }),
        function(req, res) {
                res.send("Hello from protected resource");
        }
);
API戦略で使用される変数を理解する
変数 説明
scope 必要なスコープをスペースで区切って指定します。
audience アプリケーション・クライアント ID。

アクセス権限の削除

不要になったスコープや役割を削除できます。

コンソールでスコープを削除する

不要になったスコープは App ID UI を使用して削除できます。

スコープを削除すると、そのスコープは、それが関連付けられているすべての役割から削除されます。

App ID サービス・ダッシュボードを使用してスコープを削除できます。

  1. App ID ダッシュボードの**「アプリケーション」**に移動します。
  2. スコープを編集するアプリケーションの行の「操作」メニューから**「編集」**をクリックします。
  3. 削除するスコープのボックスの**「X」**をクリックします。
  4. 保存 をクリックします。

API でのスコープの削除

不要になったスコープは App ID API を使用して削除できます。 スコープを削除するには、JSON オブジェクトからそのスコープを除去し、/scopes エンドポイントに新しい PUT 要求を行います。

スコープを削除すると、そのスコープは、それが関連付けられているすべての役割から削除されます。

  1. /scopes エンドポイントに次の要求を行ってスコープを変更または削除します。 必ず、許可するスコープのみがスコープの JSON オブジェクトに含まれるように更新してください。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/scopes"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{\ "scopes":\ [\ <scopesObject>" ]}"
    

コンソールでのロールの削除

特定の役割が必要なくなった場合は、App ID UI を使用してそれを削除できます。

役割を削除すると、その役割を現在使用しているすべてのユーザーおよびアプリケーションからアクセス権限が削除されます。

  1. サービス・ダッシュボードの**「プロファイルと役割 (Profiles and roles)」>「役割」**に移動します。
  2. 削除する役割の行で「操作」メニューから**「削除」**を選択します。
  3. 役割を削除することにより、現在その役割を使用しているすべてのユーザーとアプリケーションが影響を受けることをしっかりと理解してください。
  4. **「削除」**をクリックします。

API での役割の削除

特定の役割が不要になった場合は、App ID API を使用してその役割を削除できます。

役割を削除すると、その役割を現在使用しているすべてのユーザーおよびアプリケーションからアクセス権限が削除されます。

  1. 役割 ID または役割名を取得します。 既に役割 ID または役割名を知っている場合は、スキップして次のステップに進みます。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles"
    -H "accept: application/json"
    
  2. 割り当てる役割の JSON オブジェクトが含まれている /roles エンドポイントに要求を行います。

    curl -X DELETE "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles/<roleID>"
    -H "accept: application/json"