Amazon API Gateway を使用して ID プロバイダーを統合する - AWS Transfer Family

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

Amazon API Gateway を使用して ID プロバイダーを統合する

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

API ゲートウェイを使用して ID プロバイダを統合する場合の制限事項

  • この構成はカスタムドメインをサポートしていません。

  • この構成は、プライベート API Gateway URL をサポートしていません。

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

API Gateway メソッドを使用した認証

Transfer Family の ID プロバイダーとして使用する API Gateway メソッドを作成できます。このアプローチは、API を作成して提供するための非常に安全な方法です。API Gateway では、HTTPS エンドポイントを作成して、すべての着信 API コールをより高いセキュリティで送信できます。API Gateway サービスの詳細については、API Gateway デベロッパーガイドを参照してください。

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 リクエストのモニタリングが可能です。詳細については、「ウェブアプリケーションファイアウォールを追加する」を参照してください

Transfer Family でカスタム認証に API Gateway メソッドを使用するには
  1. AWS CloudFormation スタックを作成します。これを実行するには:

    注記

    スタックテンプレートが更新され、BASE64-encodedパスワードが使用されました。詳細については、「」を参照してくださいAWS CloudFormation テンプレートの改善

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

    2. AWS CloudFormation ユーザーガイド」の AWS CloudFormation 「スタックテンプレートの選択」にある既存のテンプレートからスタックをデプロイする手順に従ってください。

    3. Transfer Family でカスタム ID プロバイダーとして使用する AWS Lambda-backed API Gateway メソッドを作成するには、次のいずれかの基本テンプレートを使用します。

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

    重要

    デフォルトのユーザーとパスワード認証情報を編集することをお勧めします。

    スタックがデプロイされたら、 CloudFormation コンソールの出力タブでスタックの詳細を表示できます。具体的には、スタックの Amazon リソースネーム (ARN)、スタックが作成した IAM ロールの ARN、および新しいゲートウェイの URL が含まれます。

    注記

    カスタム ID プロバイダーオプションを使用してユーザーのパスワードベースの認証を有効にし、API Gateway が提供するリクエストとレスポンスのログ記録を有効にすると、API Gateway はユーザーのパスワードを Amazon CloudWatch Logs に記録します。本稼働環境でこのログを使用することは推奨されません。詳細については、 CloudWatch 「API Gateway デベロッパーガイド」の「API Gateway での API ログ記録の設定」を参照してください。

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

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

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

    3. リソースペインで、GET を選択します。次の画面例は、正しいメソッド設定を示しています。

      API 設定の詳細には、リクエストパスと URL クエリ文字列のメソッド設定パラメータが表示されます。

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

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

    API Gateway メソッドが正常にデプロイされたら、次のスクリーンショットに示すように、ステージ > ステージの詳細 でそのパフォーマンスを表示します。

    注記

    画面の最上部に表示される [Invoke URL] (呼び出し URL) アドレスをコピーします。次のステップで必要になる場合があります。

    呼び出し URL が強調表示されたステージの詳細。
  4. https://console.aws.amazon.com/transfer/ で AWS Transfer Family コンソールを開きます。

  5. 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 プロバイダー画面。
    2. [Provide an Amazon API Gateway URL] (Amazon API Gateway URL を指定) テキストボックスに、ステップ 3 で作成した API Gateway エンドポイントの [Invoke URL] (呼び出し URL) アドレスを貼り付けます。

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

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

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

API Gateway メソッドを実装する

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

API Gateway のリソース画面に、GETメソッドの詳細が表示されます。
注記

ユーザー名は、最小 3 文字、最大 100 文字にする必要があります。ユーザー名に使用できる文字は、a-z、A-Z、0-9、アンダースコア(_)、ハイフン(-)、ピリオド(...)、アットマーク(@)です。ただし、ユーザー名はハイフン(-)、ピリオド(...)、アットマーク(@)で始めることはできません。

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": "/DOC-EXAMPLE-BUCKET/path/to/home/directory" }
注記

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

"Policy": "{ \"Version\": \"2012-10-17\", \"Statement\": [ {\"Condition\": {\"StringLike\": {\"s3:prefix\": [\"user/*\", \"user/\"]}}, \"Resource\": \"arn:aws:s3:::DOC-EXAMPLE-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\":\"/DOC-EXAMPLE-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 でのユーザーポリシーの設定の詳細については、「アクセスコントロールの管理」を参照してください。

デフォルトの Lambda 関数

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

以下の 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] フィールドの値によって異なります。

  • HomeDirectoryTypePATHに設定される場合 — HomeDirectoryフィールドはユーザーに表示される Amazon S3 バケットの絶対プレフィックスまたは Amazon EFS 絶対パスである必要があります。

  • HomeDirectoryTypeLOGICALに設定される場合 — HomeDirectoryフィールドを設定「しないで」ください。代わりに、サービス管理対象ユーザー向けの [HomeDirectoryDetails] パラメーターで説明されている値と同様に、必要なエントリ/ターゲットのマッピングを提供するHomeDirectoryDetailsフィールドを設定します。

関数の例はLambda 関数の例に記載されています。

で使用する Lambda 関数 AWS Secrets Manager

を ID プロバイダー AWS Secrets Manager として使用するには、サンプル AWS CloudFormation テンプレートで Lambda 関数を使用します。Lambda 関数は、認証情報を使用して Secrets Manager サービスにクエリを実行し、成功すると指定されたシークレットを返します。Secrets Manager の詳細については、AWS Secrets Manager ユーザーガイドを参照してください。

この Lambda 関数を使用するサンプル AWS CloudFormation テンプレートをダウンロードするには、 が提供する Amazon S3 バケット AWS Transfer Familyに移動します。

AWS CloudFormation テンプレートの改善

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 で AWS CloudFormation コンソールを開きます。

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

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

  4. 以下を探します。

    • を検索しRequestTemplates、次の行があることを確認します。

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

      method.request.header.PasswordBase64: false

更新された行が表示されない場合は、スタックを編集します。 AWS CloudFormation スタックの更新方法の詳細については、「 ユーザーガイド」の「スタックテンプレートの変更AWS CloudFormation」を参照してください。