カスタム ID プロバイダーの操作 - AWS Transfer Family

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

カスタム ID プロバイダーの操作

既存の ID プロバイダーをAWS Transfer Familyでは、単一の Amazon API Gateway メソッドで RESTful インターフェイスを提供します。「Transfer Family」では、このメソッドを呼び出してユーザーを認証します。

この単一の方法は、Amazon S3 または Amazon Elastic File System (Amazon EFS) へのアクセスを認証し、承認します。メソッドを設定したら、新しいサーバーを作成するときにメソッドをサーバーに接続します。新しいサーバーを作成するにはAWS Transfer FamilyconsoleまたはCreateServerAPI オペレーション。

Amazon API Gateway の使用方法の詳細については、API Gateway 開発者ガイド

カスタム ID プロバイダーを使用した認証

Transfer Family カスタム ID プロバイダーを作成するには、API Gateway を使用します。API Gateway を使用すると、API を作成して提供できます。API Gateway を使用すると、HTTPS エンドポイントを作成して、すべての着信 API 呼び出しをより高いセキュリティで送信できます。API Gateway サービスの詳細については、API Gateway 開発者ガイド

API Gateway は、AWS_IAMに基づいて同じ認証を提供します。これは、AWS Identity and Access Management(IAM) のAWSを内部利用します。認証を有効にした場合は、AWS_IAMAPI を呼び出す明示的なアクセス権限を持つ発信者のみが、その API の API Gateway メソッドに到達できます。

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

注記

セキュリティを向上させるために、Web アプリケーションファイアウォールを設定できます。AWS WAFは、Amazon API Gateway に転送される HTTP および HTTPS リクエストをモニタリングできるウェブアプリケーションファイアウォールです。詳細については、「」を参照してくださいウェブアプリケーションファイアウォールの追加

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

  1. を作成するAWS CloudFormationスタック。目的:

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

    2. デプロイされる手順に従って、AWS CloudFormationの既存のテンプレートからスタックをスタックテンプレートの選択AWS CloudFormationユーザーガイド

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

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

    重要

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

    スタックがデプロイされたら、そのスタックに関する詳細を出力[CloudFormation コンソール] タブで [] を選択します。これらの詳細には、スタックの Amazon リソースネーム(ARN)、スタックが作成した IAM ロールの ARN、新しいゲートウェイの URL が含まれます。

    注記

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

  2. サーバーの API Gateway メソッドの設定を確認します。目的:

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

    2. [カスタム ID プロバイダーの基本テンプレート API の転送ということは、AWS CloudFormationテンプレートを生成しました。

      次のスクリーンショットは、完全なAPI設定を示しています。この例では、Lambda 関数によってサポートされていますが、他の多くの統合タイプも使用できます。

    3. リソースペインで、GET[] を選択してから、[メソッドリクエスト。次のスクリーンショットは、正しいメソッドの設定を示しています。

    この時点で、API Gateway をデプロイできる状態になります。

  3. を使用する場合アクション] で、[API のデプロイ。を使用する場合デプロイされるステージ] で、[prod[] を選択してから、[デプロイ

    API Gateway メソッドが正常にデプロイされたら、ステージエディタ次のスクリーンショットに示すように、セクション。

    注記

    のコピーURL を呼び出すアドレスは、画面の上部に表示されます。次のステップで必要になります。

  4. を開くAWS Transfer Familyコンソールhttps://console.aws.amazon.com/transfer/

  5. 選択サーバーを作成するには[] を開くにはサーバーを作成するにはページで. を使用する場合ID プロバイダーの選択] で、[Custom次のスクリーンショットを参照。

    呼び出しロールには、AWS CloudFormationステップ 1 で作成したスタックに対して選択したスタック名です。これは、次の形式を持っています。CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI

  6. を使用する場合カスタムプロバイダー[] で、URL を呼び出す前のステップで作成した API Gateway エンドポイントのアドレス。

  7. を使用する場合呼び出しロール[] で、AWS CloudFormationテンプレートテンプレート。このロールにより、Transfer Family が API ゲートウェイメソッドを呼び出すことができます。

  8. 残りのボックスに入力して、[サーバーを作成するには

設定のテスト

カスタム ID プロバイダーを作成したら、設定をテストする必要があります。

Console

設定をテストするにはAWS Transfer Familyconsole

  1. を開くAWS Transfer Familyコンソールhttps://console.aws.amazon.com/transfer/

  2. リポジトリの []サーバーページで、新しいサーバーを選択し、アクション[] を選択してから、[Test

  3. 次のテキストを入力します。Usernameおよびパスワードデプロイ時に設定したAWS CloudFormationスタック。デフォルトのオプションを保持した場合、ユーザー名はmyuserで、パスワードはMySuperSecretPassword

  4. [サーバープロトコル[] をクリックして、送信元 IPデプロイ時に設定した場合、AWS CloudFormationスタック。

    ユーザー認証が成功すると、テストはStatusCode: 200HTML レスポンスと、次のスクリーンショットに示すように、ユーザーのロールと権限の詳細を含む JSON オブジェクト。

CLI

使用して、設定をテストするにはAWSCLI

  1. を実行テスト ID プロバイダーコマンドを実行します。

    aws transfer test-identity-provider --server-id s-1234abcd5678efgh --user-name myuser --user-password MySuperSecretPassword --server-protocol FTP --source-ip 127.0.0.1
  2. サーバ ID を入力します。

  3. デプロイ時に設定したユーザー名とパスワードを入力します。AWS CloudFormationスタック。デフォルトのオプションを保持した場合、ユーザー名はmyuserで、パスワードはMySuperSecretPassword

  4. サーバのプロトコルと送信元 IP アドレスを入力します。これは、AWS CloudFormationスタック。

    ユーザー認証が成功すると、StatusCode: 200HTML レスポンスと、次の例に示すように、ユーザーのロールと権限の詳細を含む JSON オブジェクト。

    { "Response": "{\"Policy\": \"{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n{\n \"Sid\": \"ReadAndListAllBuckets\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:ListAllMybuckets\",\n \"s3:GetBucketLocation\",\n \"s3:ListBucket\",\n \"s3:GetObjectVersion\",\n \"s3:GetObjectVersion\"\n],\n \"Resource\":\"*\"\n}\n]\n}\",\"Role\": \"arn:aws:iam::000000000000:role/MyUserS3AccessRole\",\"HomeDirectory\": \"/\"}", "StatusCode": 200, "Message": "", "Url": "https://abcde1234.execute-api.us-east-2.amazonaws.com/prod/servers/s-123a4567bcd891e23/users/myuser/config" }

API Gateway のメソッドを実装する

Transfer Family カスタム ID プロバイダーを作成するには、API Gateway メソッドで、リソースパスが/servers/serverId/users/username/config。-serverIdおよびusername値は、RESTful リソースパスから取得されます。必要に応じて、sourceIpおよびprotocol値を RESTful リソースパスに設定します。

注記

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

Transfer Family がユーザーのパスワード認証を試行すると、サービスではPassword:ヘッダーフィールド。非存在下でPassword:ヘッダーで、Transfer Family は公開鍵認証を試み、ユーザーの認証を行います

ID プロバイダーを使用してエンドユーザーの認証と承認を行う場合、その認証情報の検証に加えて、エンドユーザーが使用するクライアントの IP アドレスに基づいてアクセス要求を許可または拒否できます。この機能を使用すると、S3 バケットまたは Amazon EFS ファイルシステムに格納されているデータに、信頼できるものとして指定した IP アドレスからのみサポートされているプロトコル経由でアクセスすることができます。この機能を有効にするには、sourceIpRESTful リソースパス内の値。

サーバーに対して複数のプロトコルが有効になっており、複数のプロトコルに対して同じユーザー名を使用してアクセスを提供する場合は、各プロトコルに固有の資格情報が ID プロバイダーで設定されている限り、そのプロトコルに固有の資格情報を使用できます。この機能を有効にするには、protocolRESTful リソースパス内の値。

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

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

"Policy": "{ \"Version\": \"2012-10-17\", \"Statement\": [ {\"Condition\": {\"StringLike\": {\"s3:prefix\": [\"user/*\", \"user/\"]}}, \"Resource\": \"arn:aws:s3:::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\"}] }"

次の例の reponse は、ユーザーが論理ホームディレクトリタイプを持っていることを示しています。

{ "Role": "arn:aws:iam::123456789012:role/role-api-gateway-s3", "HomeDirectoryType": "LOGICAL", "HomeDirectoryDetails": "[{"Entry":"/","Target":"/my-home-bucket"}]", "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/role-api-gateway-efs", "HomeDirectoryType": "LOGICAL", "HomeDirectoryDetails": "[{"Entry":"/","Target":"/fs-faa1a123"}]", "PublicKeys": "[]", "PosixProfile": "{Gid: 65534,Uid: 65534}" }

Lambda 関数に JSON 形式でユーザーポリシーを含めることができます。Transfer Family でのユーザーポリシーの設定の詳細については、」アクセスコントロールを管理する

認証用の Lambda 関数の例

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

デフォルトのLambda 関数

次の Lambda 関数は、ユーザー名、パスワード(ヘッダーフィールド内)、IAM アクセスロール、パブリック SSH キー、およびプロトコルを取得します。protocol フィールドを使用して、ID プロバイダーを検索できます。サポートされているプロトコル値は、SFTP、FTPS、および FTP です。

注記

サーバーに対して複数のプロトコルが有効になっており、複数のプロトコルに対して同じユーザー名を使用してアクセスを提供する場合は、そのプロトコルに固有の資格情報が ID プロバイダーで設定されている限り、そのプロトコルに固有の資格情報を使用できます。FTP の場合は、SFTP および FTPS とは別のクレデンシャルを維持することをお勧めします。SFTP および FTPS とは異なり、FTP は認証情報をクリアテキストで送信します。FTP の認証情報を SFTP または FTPS から隔離することで、FTP の認証情報が共有または公開されても、SFTP または FTPS を使用しているワークロードは引き続き安全だからです。

Lambda 関数はユーザーを認証し、成功した場合は、関連する IAM アクセスロールとポリシーを返します。この Lambda 関数は、例で使用されているものと同じです。AWS CloudFormationテンプレートテンプレート。

-HomeDirectoryTypeパラメーターは、ユーザーがサーバーにログインするときにホームディレクトリにするランディングディレクトリ (フォルダ) のタイプを指定します。このパラメータはPATHユーザーには、ファイル転送プロトコルクライアントの Amazon S3 絶対的な Amazon S3 バケットまたは Amazon EFS パスが表示されます。このパラメータはLOGICALでマッピングを提供するには、HomeDirectoryMappingsAmazon S3 または Amazon EFS パスをユーザーに表示する方法について、パラメーターを参照してください。

// GetUserConfig Lambda exports.handler = (event, context, callback) => { console.log("Username:", event.username, "ServerId: ", event.serverId); var response; // Check if the user name presented for authentication is correct. This doesn't check the value of the serverId, only that it is provided. // There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins. if (event.serverId !== "" && event.username == '${UserName}') { response = { Role: '${UserRoleArn}', // The user will be authenticated if and only if the Role field is not blank Policy: '', // Optional JSON blob to further restrict this user's permissions HomeDirectory: '${UserHomeDirectory}' // Not required, defaults to '/' }; // Check if password is provided if (event.password == "") { // If no password provided, return the user's SSH public key response['PublicKeys'] = [ "${UserPublicKey1}" ]; // Check if password is correct } else if (event.password !== '${UserPassword}') { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } } else { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } callback(null, response); };

次の Lambda 関数は、論理ホームディレクトリータイプを持つユーザーの詳細を提供します。ユーザー、ロール、Posix、パスワード、ホームディレクトリの詳細はすべて例であり、実際の値に置き換える必要があります。

// GetUserConfig Lambda exports.handler = (event, context, callback) => { console.log("Username:", event.username, "ServerId: ", event.serverId); var response; // Check if the username presented for authentication is correct. This doesn't check the value of the serverId, only that it is provided. if (event.serverId !== "" && event.username == 'example-user') { response = { Role: 'arn:aws:iam::123456789012:role/role-api-gateway', // The user will be authenticated if and only if the Role field is not blank PosixProfile: {"Gid": 65534, "Uid": 65534}, HomeDirectoryDetails: "[{\"Entry\": \"/\", \"Target\": \"/fs-faa1a123\"}]", HomeDirectoryType: "LOGICAL", //HomeDirectory: '/fs-faa1a123' // Not required, defaults to '/' }; // Check if password is provided if (event.password == "") { // If no password provided, return the user's SSH public key response['PublicKeys'] = [ "" ]; // Check if password is correct } else if (event.password !== 'Password1234') { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } } else { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } callback(null, response); };

で使用するLambda 関数AWS Secrets Manager

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

サンプルをダウンロードするにはAWS CloudFormationテンプレートでこの Lambda 関数を使用する場合は、Amazon S3 バケットAWS Transfer Family