データのマスキングと非表示

このページの内容は ApigeeApigee ハイブリッドに該当します。

Apigee Edge のドキュメントを表示する。

Apigee で API 呼び出しをデバッグする場合、コンテンツには、マスクする必要のあるクレジット カードや個人を特定できる医療情報(PHI)などの機密データが含まれることがあります。

Apigee では、トレース セッションやデバッグ セッションに含まれる機密データをさまざまな方法でマスキングあるいは非表示にできます。

機密データのマスキング

Apigee では、トレース セッションやデバッグ セッションで特定のデータをマスクするためのマスク構成を定義できます。データがマスクされると、トレース出力でアスタリスクに置き換えられます。センシティブ データをマスクし、非センシティブ データは変更せずそのままにすることができます。次に例を示します。

<ServiceRequest>
  <request-id>B540A938-F551</request-id>
  <customer-name>**********</customer-name>
</ServiceRequest>

マスク構成は、環境レベルで定義するシングルトン リソースです。デフォルトでは、データ マスキングは有効ではありません。

データ マスキングは、API プロキシのデバッグ セッションでキャプチャされたデータにのみ適用されます。データ マスキングは、ターゲット アプリケーションまたはクライアント アプリケーションに送信されるデータには影響しません。データ マスキングの構成を変更した場合は、新しいデバッグ セッションを開始して変更の影響を確認する必要があります。

マスク構成の構造

マスク構成は JSON 形式のファイルで、これにより次のソースの機密データを識別できます。

  • XML ペイロード: XPath を使用して、リクエストまたはレスポンス メッセージ ペイロードから除外される XML 要素を識別します。
  • JSON ペイロード: JSONPath を使用して、リクエスト メッセージまたはレスポンス メッセージのペイロードから除外される JSON プロパティを識別します。
  • フロー変数: デバッグ出力でマスクする必要がある変数のリストを指定できます。request.contentresponse.contentmessage.content のフロー変数を指定すると、リクエスト本文またはレスポンス本文もマスクされます。

JSON 形式のマスク構成の基本構造の例を次に示します。例に示すマスク構成フィールドの詳細については、DebugMask をご覧ください。

{
  "namespaces": {
    "myco": "http://example.com"
  },
  "requestXPaths": [
    "/myco:Greeting/myco:User"
  ],
  "responseXPaths": [
    "/myco:Greeting/myco:User"
  ],
  "faultXPaths": [
    "/myco:Greeting/myco:User"
  ],
  "requestJSONPaths": [
    "$.store.book[*].author"
  ],
  "responseJSONPaths": [
    "$.store.book[*].author"
  ],
  "faultJSONPaths": [
    "$.store.book[*].author"
  ],
  "variables": [
    "request.header.user-name",
    "request.formparam.password",
    "myCustomVariable"
  ]
}

API を使用した環境内のマスク構成の表示

環境内のマスク構成を表示するには、次のリソースに GET を発行します。

/organizations/{org}/environments/{env}/debugmask

例:

curl "https://apigee.googleapis.com/v1/organizations/myorg/environments/test/debugmask" \
  -X GET \
  -H "Authorization: Bearer $TOKEN"

ここで、OAuth 2.0 アクセス トークンの取得で説明されているように、$TOKEN は OAuth 2.0 アクセス トークンに設定されます。この例で使用されている curl オプションの詳細については、curl の使用をご覧ください。使用される環境変数の説明については、Apigee API リクエストの環境変数の設定をご覧ください。

レスポンスの例を次に示します。

{
  "name": "organizations/myorg/environments/test/debugmask"
  "namespaces": {
    "myco": "http://example.com"
  },
  "requestXPaths": [
    "/myco:Greeting/myco:User"
  ],
  "responseXPaths": [
    "/myco:Greeting/myco:User"
  ]
}

API を使用した環境内のマスク構成の更新

環境内のマスク構成シングルトン リソースを更新するには、次のリソースに PATCH を発行します。

/organizations/{org}/environments/{env}/debugmask

必要に応じて、次のクエリ パラメータを渡すことができます。

  • updateMask クエリ パラメータを設定して、デバッグマスク内のフィールドの完全修飾された名前のカンマ区切りのリストを含むフィールド マスクを指定します。例: "requestJSONPaths"
  • 更新する際に、デバッグマスク内の既存の値を置換するかどうかを指定する replaceRepeatedFields クエリ パラメータを設定します。デフォルトでは、値が追加されます(false)。

例:

curl "https://apigee.googleapis.com/v1/organizations/myorg/environments/test/debugmask" \
  -X PATCH \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-type: application/json" \
  -d \
  '{
     "namespaces": {
       "ns1": "http://example.com"
     },
     "requestXPaths": [
       "/ns1:employee/ns1:name"
     ]
   }'

ここで、OAuth 2.0 アクセス トークンの取得で説明されているように、$TOKEN は OAuth 2.0 アクセス トークンに設定されます。この例で使用されている curl オプションの詳細については、curl の使用をご覧ください。使用される環境変数の説明については、Apigee API リクエストの環境変数の設定をご覧ください。

スコープが設定された名前空間の XML のマスキング

XML 名前空間を使用する XML データをマスクする場合は、namespaces 要素をマスク構成で使用してこれらの名前空間を参照する必要があります。これは、XML ペイロードがデフォルトの名前空間を使用する場合にも、名前空間の接頭辞を使用する場合にも当てはまります。

たとえば、リクエストのペイロードで従業員名をマスクする際に、この XML データが XML 名前空間を使用していない場合を見てみましょう。

<employee>
  <name>Shanmu Tharman</name>
  <age>50</age>
</employee>

名前空間を使用していないため、デバッグマスク構成には namespaces 要素は必要ありません。

{
  "requestXPaths": [
    "/employee/name"
  ]
}

XML ペイロードが接頭辞のある名前空間を使用する場合:

<cym:employee xmlns:cym="http://cymbalgroup.com" xmlns:id="http://cymbalgroup.com/identity">
  <id:name>Shanmu Tharman</id:name>
  <id:age>50</id:age>
</cym:employee>

次に、ここでもマスク構成に namespaces 要素を含める必要があります。デバッグマスク構成では、任意の有効な名前空間の接頭辞を選択できます。デバッグマスク構成の名前空間の接頭辞は XML で使用される名前空間の接頭辞と同じでもかまいませんが、必須ではありません。

{
  "namespaces": {
    "cym": "http://cymbalgroup.com",
    "idns": "http://cymbalgroup.com/identity"
  },
  "requestXPaths": [
    "/cym:employee/idns:name"
  ]
}

XML ペイロードが接頭辞のない名前空間、つまりデフォルトの名前空間を使用する場合:

<employee xmlns="http://cymbalgroup.com" xmlns:id="http://cymbalgroup.com/identity">
  <id:name>Shanmu Tharman</id:name>
  <id:age>50</id:age>
</employee>

この場合、デバッグマスク構成では、デフォルトの名前空間に対応する namespaces 要素に接頭辞を定義する必要があります。任意の一意の接頭辞を使用できます。

{
  "namespaces": {
    "p1": "http://cymbalgroup.com",
    "id": "http://cymbalgroup.com/identity"
  },
  "requestXPaths": [
    "/p1:employee/id:name"
  ]
}

構成に関するその他の注意事項

  • *XPaths 構成要素と *JSONPaths 構成要素を使用すると、requestresponsefault メッセージに表示されるデータをマスクできます。ただし、デバッグ セッションによってメッセージの全内容が取得される場合もあります。また、variables セクションで request.content または response.content を構成して、センシティブ データが表示されないようにすることもできます。

  • ServiceCallout ポリシーを使用してリクエストを行う場合、そのコールアウトのリクエストとレスポンスに含まれる情報は、requestXPaths または responseJSONPaths などの構成要素でマスクされません。このデータをマスクする場合は、ServiceCallout ポリシーでリクエスト メッセージとレスポンス メッセージの変数名を指定してから、デバッグマスクの variables セクションでそれらの変数を指定する必要があります。たとえば、ServiceCallout ポリシーで次が使用されているとします。

    <ServiceCallout name='SC-1'>
      <Request variable='rbacRequest'>
        <Set>
          <Payload contentType='application/json'>{ ... }</Payload>
           ...
    

    この場合は、デバッグマスク構成の variables 要素に rbacRequest.content を含める必要があります。

    {
      ...
      "variables": [
        "request.content",
        "response.content",
        "rbacRequest.content"
      ]
    }

センシティブ データの非表示

マスクに加えて、カスタム変数に private. で始まる名前を選択することにより、トレースツールとデバッグ セッションでセンシティブ データが表示されないようにできます。

たとえば、KeyValueMapOperations ポリシーを使用して Key-Value マップから値を取得するには、次のように変数名を選択して、トレース セッションやデバッグ セッションで値が表示されないようにできます。

<KeyValueMapOperations name='KVM-Get-1'>
    <Scope>environment</Scope>
    <ExpiryTimeInSecs>300</ExpiryTimeInSecs>
    <MapName>settings</MapName>
    <Get assignTo='private.privatekey'>
      <Key>
        <Parameter>rsa_private_key</Parameter>
      </Key>
    </Get>
  </KeyValueMapOperations>

private. 接頭辞の付いていない変数は、データが Key-Value マップなどの暗号化されたデータストアから取得された場合でも、トレース セッションとデバッグ セッションでクリアテキストで表示されます。これらの値をマスクするには、マスキングを使用します。