

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon API Gateway を使用して ID プロバイダーを統合する
<a name="authentication-api-gateway"></a>

このトピックでは、 AWS Lambda 関数を使用して API Gateway メソッドをバックアップする方法について説明します。ID プロバイダーを統合するために RESTful API が必要な場合、または AWS WAF を使用してその機能をジオブロッキングまたはレート制限リクエストに活用する場合は、このオプションを使用します。

ほとんどのユースケースでは、カスタム ID プロバイダーを設定する推奨方法は、 を使用することです[カスタム ID プロバイダーソリューション](custom-idp-toolkit.md)。

「**API ゲートウェイを使用して ID プロバイダを統合する場合の制限事項**」
+ この構成はカスタムドメインをサポートしていません。
+ この構成は、プライベート API Gateway URL をサポートしていません。

これらのいずれかが必要な場合は、API Gateway なしで Lambda を ID プロバイダーとして使用できます。詳細については、「[AWS Lambda を使用して ID プロバイダーを統合する](custom-lambda-idp.md)」を参照してください。

## API Gateway メソッドを使用した認証
<a name="authentication-custom-ip"></a>

Transfer Family の ID プロバイダーとして使用する API Gateway メソッドを作成できます。このアプローチは、API を作成して提供するための非常に安全な方法です。API Gateway を使用すると、HTTPS エンドポイントを作成して、すべての受信 API オペレーションをセキュリティを強化して送信できます。API Gateway サービスの詳細については、[API Gateway デベロッパーガイド](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)を参照してください。

API Gateway は、 という名前の認可方法を提供します。これにより`AWS_IAM`、 が内部 AWS で使用する AWS Identity and Access Management (IAM) に基づく認証と同じ認証が提供されます。`AWS_IAM` で認証を有効にした場合、API を呼び出す明示的なアクセス権限を持つ呼び出し側のみがその API Gateway メソッドに到達できます。

API Gateway メソッドをTransfer Family カスタム ID プロバイダーとして使用するには、API Gateway メソッドの IAM を有効にします。このプロセスの一環として、Transfer Family についてゲートウェイを使用するためのアクセス許可を持つ IAM ロールを提供します。

**注記**  
セキュリティを強化するために、ウェブアプリケーションのファイアウォールを設定できます。 AWS WAF はウェブアプリケーションファイアウォールで、これにより Amazon API Gateway に転送される HTTP および HTTPS リクエストのモニタリングが可能です。詳細については、「[ウェブアプリケーションファイアウォールを追加する](web-application-firewall.md)」を参照してください

**API Gateway キャッシュを有効にしない**  
Transfer Family のカスタム ID プロバイダーとして使用する場合、API Gateway メソッドのキャッシュを有効にしないでください。次の理由により、キャッシュは認証リクエストに対して不適切で無効です。  
各認証リクエストは一意であり、キャッシュされたレスポンスではなく、ライブレスポンスが必要です
Transfer Family は API Gateway に重複または繰り返しリクエストを送信しないため、キャッシュには利点はありません。
キャッシュを有効にすると、API Gateway が不一致データで応答し、認証リクエストへの無効な応答が発生します。

**Transfer Family でカスタム認証に API Gateway メソッドを使用するには**

1.  CloudFormation スタックを作成します。これを実行するには:
**注記**  
スタックテンプレートが更新され、BASE64-encodedパスワードが使用されました。詳細については、「」を参照してください[CloudFormation テンプレートの改善](#base64-templates)。

   1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソールを開きます。

   1. 「 *AWS CloudFormation ユーザーガイド*」の CloudFormation 「スタックテンプレート[の選択」の「既存のテンプレートからスタックを](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html)デプロイする手順」に従います。

   1. 次の基本テンプレートのいずれかを使用して、Transfer Family でカスタム ID プロバイダーとして使用する AWS Lambda Backed API Gateway メソッドを作成します。
      + [基本スタックテンプレート](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml)

        デフォルトでは、API Gateway メソッドは、ハードコードされた SSH (Secure Shell) キーまたはパスワードを使用して単一のサーバーで単一のユーザーを認証するカスタム ID プロバイダーとして使用されます。デプロイ後に Lambda 関数コードを変更すれば異なる処理を実行できます。
      + [AWS Secrets Manager スタックテンプレート](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml)

        デフォルトでは、API Gateway メソッドは、Secrets Manager 内の `aws/transfer/server-id/username` 形式のエントリに対して認証します。さらに、シークレットは、Transfer Family に返されるすべてのユーザープロパティのキーバリューペアを保持する必要があります。デプロイ後に Lambda 関数コードを変更すれば異なる処理を実行できます。詳細については、ブログ記事[「 AWS Transfer Family を使用したパスワード認証の有効化 AWS Secrets Manager](https://aws.amazon.com/blogs/storage/enable-password-authentication-for-aws-transfer-family-using-aws-secrets-manager-updated/)」を参照してください。
      + [Okta スタックテンプレート](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-apig.template.yml)

        API Gateway メソッドは、Transfer Family のカスタム ID プロバイダーとして Okta と統合されます。詳細については、ブログ記事「[AWS Transfer Familyで Okta を ID プロバイダーとして使う](https://aws.amazon.com/blogs/storage/using-okta-as-an-identity-provider-with-aws-transfer-for-sftp/)」を参照してください。

   これらのスタックのいずれかをデプロイすることが、カスタム ID プロバイダーをTransfer Family ワークフローに統合するうえで最も簡単な方法です。各スタックは Lambda 関数を使用して、API Gateway に基づく API メソッドをサポートします。その後、Transfer Family でカスタム ID プロバイダーとして API メソッドを使用できます。デフォルトでは、Lambda 関数は、`myuser` という単一のユーザーを `MySuperSecretPassword` のパスワードで認証します。デプロイ後に、これらの認証情報を編集するか Lambda 関数コードを更新すれば異なる処理を実行できます。
**重要**  
デフォルトのユーザーとパスワード認証情報を編集することをお勧めします。

   スタックのデプロイ後には、CloudFormation コンソールの [**Output**] (出力) にタブにスタックについての詳細が表示されます。具体的には、スタックの Amazon リソースネーム (ARN)、スタックが作成した IAM ロールの ARN、および新しいゲートウェイの URL が含まれます。
**注記**  
カスタム ID プロバイダーオプションを使用してユーザーのパスワードベースの認証を有効にし、API Gateway によって提供されるリクエストとレスポンスのログを有効にした場合、API Gateway はユーザーのパスワードを Amazon CloudWatch Logs に記録します。本稼働環境でこのログを使用することは推奨されません。詳細については、*API Gateway デベロッパーガイド*の「[API Gateway に CloudWatch API ログ記録を設定する](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html)」を参照してください。

1. サーバーの API Gateway メソッドの設定を確認します。これを実行するには:

   1. API Gateway コンソール ([https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway/)) を開きます。

   1.  CloudFormation テンプレートが生成した **Transfer Custom Identity Provider の基本テンプレート API** を選択します。ゲートウェイを表示するには、リージョンを選択する必要があります。

   1. **リソース**ペインで、**GET** を選択します。次の画面例は、正しいメソッド設定を示しています。  
![\[API 設定の詳細には、リクエストパスと URL クエリ文字列のメソッド設定パラメータが表示されます。\]](http://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/images/apig-config-method-fields.png)

   この時点で、API Gateway をデプロイする準備が整いました。

1. [**Actions**] (アクション) で [**Deploy API**] (API のデプロイ) を選択します。[**Deplyment stage**] (デプロイステージ) で [**prod**] を選択してから [**Deploy**] (デプロイ) を選択します。

   API Gateway メソッドが正常にデプロイされたら、次のスクリーンショットに示すように、**ステージ** > **ステージの詳細**でそのパフォーマンスを表示します。
**注記**  
画面の最上部に表示される [**Invoke URL**] (呼び出し URL) アドレスをコピーします。次のステップで必要になる場合があります。  
![\[呼び出し URL が強調表示されたステージの詳細。\]](http://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/images/apig-config-method-invoke.png)

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) で AWS Transfer Family コンソールを開きます。

1. スタックの作成時に Transfer Family が作成されたはずです。そうでない場合は、以下の手順を使用してサーバーを設定します。

   1. [**Create server**] (サーバーの作成) を選択すると [**Create server**] (サーバーの作成) ページが開きます。[**Choose an identity provider**] (ID プロバイダーの選択) で [**Custom**] (カスタム) を選択してから、[**Use Amazon API Gateway to connect to your identity provider**] (Amazon API Gateway を使用してアイデンティティプロバイダーに接続する) を選択します (次の画面例を参照)。  
![\[カスタム ID プロバイダーが選択され、ID プロバイダーへの接続用に API Gateway が選択された ID プロバイダー画面。\]](http://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/images/create-server-choose-idp-custom.png)

   1. [**Provide an Amazon API Gateway URL**] (Amazon API Gateway URL を指定) テキストボックスに、ステップ 3 で作成した API Gateway エンドポイントの [**Invoke URL**] (呼び出し URL) アドレスを貼り付けます。

   1. **ロール** で、 CloudFormation テンプレートによって作成された IAM ロールを選択します。このロールにより、Transfer Family が API Gateway メソッドを呼び出せるようになります。

      呼び出しロールには、ステップ 1 で作成した CloudFormation スタック用に選択したスタック名が含まれます。次のような形式です: `CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI`

   1. 残りのフィールドに値を入力してから [**Create server**] (サーバーの作成) を選択します。サーバーを作成するための残りの手順の詳細については、「[SFTP、FTPS、または FTP サーバーエンドポイントの設定](tf-server-endpoint.md)」を参照してください。

## API Gateway メソッドを実装する
<a name="authentication-api-method"></a>

Transfer Family のカスタム ID プロバイダーを作成するには、API Gateway メソッドで`/servers/serverId/users/username/config` のリソースパスを持つ単一のメソッドを実装する必要があります。`serverId` と `username` の値は RESTful リソースパスから取得されます。また、下図のように、`sourceIp`と`protocol`を「**URL クエリ文字列パラメータ**」として「**メソッドリクエスト**」に追加します。

![\[GET メソッドの詳細を示す API Gateway のリソース画面。\]](http://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/images/apig-config-method-request.png)


**注記**  
ユーザー名は、最小 3 文字、最大 100 文字にする必要があります。ユーザー名には、a～z、A～Z、0～9、アンダースコア「\$1」、ハイフン「-」、ピリオド「.」、アットマーク「@」を使用できます。ユーザー名は、ハイフン '-'、ピリオド '.'、またはアットマーク '@' で始めることはできません。

Transfer Family がユーザーに代わってパスワード認証を試みると、サービスが `Password:` ヘッダーフィールドを提供します。`Password:` ヘッダーが存在しない場合、Transfer Family はパブリックキー認証でユーザーを認証しようと試みます。

エンドユーザーの認証と認可に ID プロバイダーを使用する場合、エンドユーザーが使用するクライアントの IP アドレスに基づいてアクセスリクエストを許可または拒否できます。この機能を使用すると、S3 バケットまたは Amazon EFS ファイルシステムに保存されたデータに、信頼済みとして指定した IP アドレスからのみ、サポートされているプロトコル経由でアクセスできるようになります。この機能を有効にするには、`sourceIp`をクエリ文字列に含める必要があります。

サーバーで複数のプロトコルを有効にしており、複数のプロトコルで同じユーザー名を使用してアクセスを提供したい場合、各プロトコルに固有の認証情報が ID プロバイダーに設定されている限り、そうすることができます。この機能を有効にするには、RESTful リソースパスに `protocol` 値を含める必要があります。

API Gateway メソッドは常に HTTP ステータスコード `200` を返す必要があります。その他の HTTP ステータスコードは、API へのアクセスエラーがあったことを示します。

**Amazon S3 のレスポンスの例**  
この例のレスポンス本文は、Amazon S3 では次の形式の JSON ドキュメントになります。

```
{
 "Role": "IAM role with configured S3 permissions",
 "PublicKeys": [
     "ssh-rsa public-key1",
     "ssh-rsa public-key2"
  ],
 "Policy": "STS Assume role session policy",
 "HomeDirectory": "/amzn-s3-demo-bucket/path/to/home/directory"
}
```

**注記**  
 ポリシーは、JSON で文字列としてエスケープされます。例:   

****  

```
"Policy":
"{
  \"Version\": \"2012-10-17\",
  \"Statement\":
     [
     {\"Condition\":
        {\"StringLike\":
            {\"s3:prefix\":
               [\"user/*\", \"user/\"]}},
     \"Resource\": \"arn:aws:s3:::amzn-s3-demo-bucket\",
     \"Action\": \"s3:ListBucket\",
     \"Effect\": \"Allow\",
     \"Sid\": \"ListHomeDir\"},
     {\"Resource\": \"arn:aws:s3:::*\",
        \"Action\": [\"s3:PutObject\",
        \"s3:GetObject\",
        \"s3:DeleteObjectVersion\",
        \"s3:DeleteObject\",
        \"s3:GetObjectVersion\",
        \"s3:GetObjectACL\",
        \"s3:PutObjectACL\"],
     \"Effect\": \"Allow\",
     \"Sid\": \"HomeDirObjectAccess\"}]
}"
```

次のレスポンスの例は、論理ホームディレクトリタイプを有するユーザーを示しています。

```
{
   "Role": "arn:aws:iam::123456789012:role/transfer-access-role-s3",
   "HomeDirectoryType":"LOGICAL",
   "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/amzn-s3-demo-bucket1\"}]",
   "PublicKeys":[""]
}
```

**Amazon EFS のレスポンスの例**  
この例のレスポンス本文は、Amazon EFS では次の形式の JSON ドキュメントになります。

```
{
 "Role": "IAM role with configured EFS permissions",
 "PublicKeys": [
     "ssh-rsa public-key1",
     "ssh-rsa public-key2"
  ],
 "PosixProfile": {
   "Uid": "POSIX user ID",
   "Gid": "POSIX group ID",
   "SecondaryGids": [Optional list of secondary Group IDs],
 },
 "HomeDirectory": "/fs-id/path/to/home/directory"
}
```

`Role` フィールドは認証に成功したことを示します。パスワード認証を実行する場合 (`Password:` ヘッダーの提供時) には、SSH パブリックキーを提供する必要はありません。ユーザーが認証できない場合 (たとえば、パスワードが正しくない場合)、メソッドは `Role` を設定せずにレスポンスを返す必要があります。このようなレスポンスの例として、空の JSON オブジェクトがあります。

 次のレスポンスの例は、論理ホームディレクトリタイプを持つユーザーを示しています。

```
{
    "Role": "arn:aws:iam::123456789012:role/transfer-access-role-efs",
    "HomeDirectoryType": "LOGICAL",
    "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/faa1a123\"}]",
    "PublicKeys":[""],
    "PosixProfile":{"Uid":65534,"Gid":65534}
}
```

Lambda 関数にユーザーポリシーを JSON 形式で含めることができます。Transfer Family でのユーザーポリシーの設定の詳細については、「[アクセスコントロールの管理](users-policies.md)」を参照してください。

## デフォルトの Lambda 関数
<a name="authentication-lambda-examples-default"></a>

異なる認証戦略を実装するには、ゲートウェイで使用する Lambda 関数を編集します。アプリケーションのニーズを満たすために、Node.js 内で次の Lambda 関数の例を使用できます。Lambda の詳細については、[AWS Lambda デベロッパーガイド](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)または「[Node.js による Lambda 関数の構築](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html)」を参照してください。

以下の Lambda 関数の例では、ユーザー名、パスワード（パスワード認証を行っている場合）、サーバー ID、プロトコル、クライアント IP アドレスを受け取っています。これらの入力を組み合わせて使用すると、ID プロバイダーを検索し、ログインを許可するかどうかを判断できます。

**注記**  
サーバーで複数のプロトコルを有効にしており、複数のプロトコルで同じユーザー名を使用してアクセスを提供したい場合、プロトコルに固有の認証情報が ID プロバイダーに設定されている限り、そうすることができます。  
File Transfer Protocol (FTP) については、Secure Shell (SSH) File Transfer Protocol (SFTP) and File Transfer Protocol over SSL (FTPS) とは異なる認証情報を維持することをお勧めします。SFTP や FTPS と異なり、FTP は認証情報を平文で送信します。FTP の認証情報を SFTP または FTPS から隔離することを推奨します。そうすれば、FTP の認証情報が共有または公開されても、SFTP または FTPS を使用しているワークロードは引き続き安全だからです。

この関数の例は、ロールと論理ホームディレクトリの詳細、ならびに (公開鍵認証を実行する場合には) パブリックキーを返します。

サービス管理対象ユーザーを作成するときは、そのユーザーのホームディレクトリを論理ディレクトリまたは物理ディレクトリに設定します。同様に、目的のユーザーに物理的または論理的なディレクトリ構造を伝えるには、Lambda 関数の結果が必要です。設定するパラメータは [[HomeDirectoryType]](https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryType) フィールドの値によって異なります。
+ `HomeDirectoryType`が`PATH`に設定される場合 — `HomeDirectory`フィールドはユーザーに表示される Amazon S3 バケットの絶対プレフィックスまたは Amazon EFS 絶対パスである必要があります。
+ `HomeDirectoryType`が`LOGICAL`に設定される場合 — `HomeDirectory`フィールドを設定「*しないで*」ください。代わりに、サービス管理対象ユーザー向けの [[HomeDirectoryDetails]](https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryMappings) パラメーターで説明されている値と同様に、必要なエントリ/ターゲットのマッピングを提供する`HomeDirectoryDetails`フィールドを設定します。

関数の例は[Lambda 関数の例](custom-lambda-idp.md#lambda-auth-examples)に記載されています。

## で使用する Lambda 関数 AWS Secrets Manager
<a name="authentication-lambda-examples-secrets-mgr"></a>

ID プロバイダー AWS Secrets Manager として を使用するには、サンプル CloudFormation テンプレートで Lambda 関数を使用できます。Lambda 関数は、認証情報を使用して Secrets Manager サービスにクエリを実行し、成功すると指定されたシークレットを返します。Secrets Manager の詳細については、[AWS Secrets Manager ユーザーガイド](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)を参照してください。

この Lambda 関数を使用するサンプル CloudFormation テンプレートをダウンロードするには、 [が提供する Amazon S3 バケット AWS Transfer Family](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml)に移動します。

## CloudFormation テンプレートの改善
<a name="base64-templates"></a>

API Gateway インターフェイスが公開されている CloudFormation テンプレートに改善されました。テンプレートは、API Gateway で BASE64-encodedされたパスワードを使用するようになりました。既存のデプロイは、この機能強化なしで引き続き機能しますが、基本的な US-ASCII 文字セット外の文字を含むパスワードは許可されません。

この機能を有効にするテンプレートの変更は次のとおりです。
+ `GetUserConfigRequest AWS::ApiGateway::Method` リソースにはこの`RequestTemplates`コードが必要です (斜体の行は更新された行です)

  ```
  RequestTemplates:
     application/json: |
     {
        "username": "$util.urlDecode($input.params('username'))",
        "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
        "protocol": "$input.params('protocol')",
        "serverId": "$input.params('serverId')",
        "sourceIp": "$input.params('sourceIp')"
  }
  ```
+ `PasswordBase64` ヘッダーを使用するには、`GetUserConfig`リソース`RequestParameters`の を変更する必要があります (斜体の行は更新された行です）。

  ```
  RequestParameters:
     method.request.header.PasswordBase64: false
     method.request.querystring.protocol: false
     method.request.querystring.sourceIp: false
  ```

**スタックのテンプレートが最新かどうかを確認するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソールを開きます。

1. スタックのリストから、スタックを選択します。

1. 詳細パネルから、**テンプレート**タブを選択します。

1. 以下を探します。
   + を検索し`RequestTemplates`、次の行があることを確認します。

     ```
     "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
     ```
   + を検索し`RequestParameters`、次の行があることを確認します。

     ```
     method.request.header.PasswordBase64: false
     ```

更新された行が表示されない場合は、スタックを編集します。 CloudFormation スタックを更新する方法の詳細については、「 *AWS CloudFormationユーザーガイド*[」の「スタックテンプレートの変更](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-get-template.html)」を参照してください。