

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

# の接続認可 AWS Client VPN
<a name="connection-authorization"></a>

クライアント VPN エンドポイントの*クライアント接続ハンドラー*を設定できます。ハンドラーを使用すると、デバイス、ユーザー、および接続属性に基づいて、新しい接続を許可するカスタムロジックを実行できます。クライアント接続ハンドラーは、クライアント VPN サービスがデバイスとユーザーを認証した後に実行されます。

クライアント VPN エンドポイントのクライアント接続ハンドラーを設定するには、デバイス、ユーザー、および接続属性を入力として受け取り、新しい接続を許可または拒否する決定をクライアント VPN サービスに返す AWS Lambda 関数を作成します。クライアント VPN エンドポイントで Lambda 関数を指定します。デバイスがクライアント VPN エンドポイントに接続すると、クライアント VPN サービスはユーザーに代わって Lambda 関数を呼び出します。Lambda 関数によって承認された接続に対して、クライアント VPN エンドポイントへの接続が許可されます。

**注記**  
現在、サポートされているクライアント接続ハンドラーのタイプは Lambda 関数だけです。

## 要件と考慮事項
<a name="client-connect-handler-reqs"></a>

クライアント接続ハンドラーの要件と考慮事項を次に示します。
+ Lambda 関数の名前は、 `AWSClientVPN-` プレフィックスで始まる必要があります。
+ 認定済みの Lambda 関数がサポートされています。
+ Lambda 関数は、クライアント VPN エンドポイントと同じ AWS リージョンと AWS アカウントに存在する必要があります。
+ Lambda 関数は 30 秒後にタイムアウトします。この値は変更できません。
+ Lambda 関数は同期的に呼び出されます。これは、デバイスとユーザーの認証後、および承認ルールが評価される前に呼び出されます。
+ 新しい接続に対して Lambda 関数が呼び出され、クライアント VPN サービスが関数から期待されるレスポンスを取得しない場合、クライアント VPN サービスは接続要求を拒否します。これは、Lambda 関数がスロットルされた、タイムアウトした、またはその他の予期しないエラーが発生した場合、関数のレスポンスが有効な形式でない場合などに発生します。
+ Lambda 関数に[プロビジョニングされた同時実行数](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html)を設定して、レイテンシーの変動なしに関数をスケーリングできるようにすることをお勧めします。
+ Lambda 関数を更新しても、クライアント VPN エンドポイントへの既存の接続は影響を受けません。既存の接続を終了してから、新しい接続を確立するようクライアントに指示できます。詳細については、「[AWS Client VPN クライアント接続を終了するクライアント接続の終了](cvpn-working-connections-disassociate.md)」を参照してください。
+ クライアントが AWS 提供されたクライアントを使用してクライアント VPN エンドポイントに接続する場合、Windows にはバージョン 1.2.6 以降、macOS にはバージョン 1.2.4 以降を使用する必要があります。詳細については、「[AWS が提供するクライアントを使用して接続する](https://docs.aws.amazon.com/vpn/latest/clientvpn-user/connect-aws-client-vpn-connect.html)」「を参照してください。

## Lambda インターフェイス
<a name="connection-authorization-lambda"></a>

Lambda 関数は、クライアント VPN サービスからの入力として、デバイス属性、ユーザー属性、および接続属性を受け取ります。その後、クライアント VPN サービスに接続を許可または拒否するかどうかを決定する必要があります。

**リクエストスキーマ**  
Lambda 関数は、次のフィールドを含む JSON BLOB を入力として受け取ります。

```
{
    "connection-id": {{<connection ID>}},
    "endpoint-id": {{<client VPN endpoint ID>}},
    "common-name": {{<cert-common-name>}},
    "username": {{<user identifier>}},
    "platform": {{<OS platform>}},
    "platform-version": {{<OS version>}},
    "public-ip": {{<public IP address>}},
    "client-openvpn-version": {{<client OpenVPN version>}},
    "aws-client-version": {{<AWS client version>}},
    "groups": {{<group identifier>}},
    "schema-version": "{{v3}}"
}
```
+ `connection-id` — クライアント VPN エンドポイントへのクライアント接続の ID。
+ `endpoint-id` — クライアント VPN エンドポイントの ID。
+ `common-name` — デバイス識別子。デバイス用に作成するクライアント証明書では、共通名によってデバイスが一意に識別されます。
+ `username` — ユーザー ID (該当する場合)。Active Directory 認証の場合、これはユーザー名です。SAML ベースのフェデレーション認証の場合、これは `NameID` です。相互認証の場合、このフィールドは空です。
+ `platform` — クライアントのオペレーティングシステムプラットフォーム。
+ `platform-version` — オペレーティングシステムのバージョン。クライアント VPN サービスは、クライアントがクライアント VPN エンドポイントに接続するとき、およびクライアントが Windows プラットフォームを実行しているときに `--push-peer-info` ディレクティブが OpenVPN クライアント設定に存在する場合に値を提供します。
+ `public-ip` — 接続デバイスのパブリック IP アドレス。
+ `client-openvpn-version` — クライアントが使用している OpenVPN バージョン。
+ `aws-client-version` — AWS クライアントバージョン。
+ `groups` — グループ ID (該当する場合)。Active Directory 認証の場合、これはActive Directory グループの一覧になります。SAML ベースのフェデレーション認証の場合、これは ID プロバイダー (IdP) グループの一覧になります。相互認証の場合、このフィールドは空です。
+ `schema-version` — スキーマバージョン。デフォルトは `v3` です。

**レスポンススキーマ**  
Lambda 関数は次のフィールドを返す必要があります。

```
{
    "allow": {{boolean}},
    "error-msg-on-denied-connection": "",
    "posture-compliance-statuses": [],
    "schema-version": "{{v3}}"
}
```
+ `allow` — 必須。新しい接続を許可または拒否するかどうかを示すブール値 (`true` \| `false`)。
+ `error-msg-on-denied-connection` — 必須。Lambda 関数によって接続が拒否された場合に、クライアントにステップとガイダンスを提供するために使用できる最大 255 文字の文字列。Lambda 関数の実行中に障害が発生した場合 (スロットリングなどの理由で)、クライアント VPN サービスによって次のデフォルトメッセージがクライアントに返されます。

  ```
  Error establishing connection. Please contact your administrator.
  ```
+ `posture-compliance-statuses` — 必須。[体制評価](#connection-authorization-posture-assessment)に Lambda 関数を使用する場合、これは接続デバイスのステータスのリストです。デバイスの体制評価カテゴリ (`compliant`、`quarantined`、`unknown` など) に従って、ステータス名を定義します。各名前の最大長は 255 文字です。最大 10 個のステータスを指定できます。
+ `schema-version` — 必須。スキーマバージョン。デフォルトは `v3` です。

同じリージョン内の複数のクライアント VPN エンドポイントに対して、同じ Lambda 関数を使用できます。

Lambda 関数の作成の詳細については、*AWS Lambda デベロッパーガイド*の「[AWS Lambdaの開始方法](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)」を参照してください。

## 体制評価のためのクライアント接続ハンドラーの使用
<a name="connection-authorization-posture-assessment"></a>

クライアント接続ハンドラーを使用して、クライアント VPN エンドポイントを既存のデバイス管理ソリューションと統合し、接続デバイスの体制コンプライアンスを評価できます。Lambda 関数がデバイス認可ハンドラーとして機能するには、クライアント VPN エンドポイントに[相互認証](mutual.md)を使用します。クライアント VPN エンドポイントに接続するクライアント (デバイス) ごとに、一意のクライアント証明書とキーを作成します。Lambda 関数は、クライアント証明書の一意の共通名 (クライアント VPN サービスから渡される) を使用して、デバイスを識別し、デバイス管理ソリューションから体制コンプライアンスステータスを取得できます。相互認証をユーザーベースの認証と組み合わせることができます。

または、Lambda 関数自体で基本的な体制評価を行うこともできます。たとえば、クライアント VPN サービスによって Lambda 関数に渡される `platform` および `platform-version` フィールドを評価できます。

**注記**  
接続ハンドラーを使用して最小 AWS Client VPN アプリケーションバージョンを適用できますが、接続ハンドラー`aws-client-version`の フィールドは AWS Client VPN アプリケーションにのみ適用され、ユーザーデバイスの環境変数から入力されます。

## クライアント接続ハンドラーを有効化する
<a name="enable-client-connect-handler"></a>

クライアント接続ハンドラーを有効にするには、クライアント VPN エンドポイントを作成または変更し、Lambda 関数の Amazon リソースネーム (ARN) を指定します。詳細については、「[AWS Client VPNエンドポイントを作成する](cvpn-working-endpoint-create.md)」および「[AWS Client VPN エンドポイントを変更する](cvpn-working-endpoint-modify.md)」を参照してください。

## サービスにリンクされたロール
<a name="connection-authorization-slr"></a>

AWS Client VPN は、**AWSServiceRoleForClientVPNConnections** というサービスにリンクされたロールをアカウントに自動的に作成します。ロールには、クライアント VPN エンドポイントへの接続が行われたときに Lambda 関数を呼び出すアクセス許可があります。詳細については、「[のサービスにリンクされたロールの使用 AWS Client VPN](using-service-linked-roles.md)」を参照してください。

## 接続承認失敗をモニタリングする
<a name="connection-authorization-monitoring"></a>

クライアント VPN エンドポイントへの接続の接続承認ステータスを表示できます。詳細については、「[AWS Client VPN クライアント接続の表示クライアント接続の表示](cvpn-working-connections-view.md)」を参照してください。

体制評価にクライアント接続ハンドラーを使用すると、クライアント VPN エンドポイントに接続するデバイスの体制コンプライアンスステータスを接続ログに表示することもできます。詳細については、「[AWS Client VPN エンドポイントの接続ログ記録](connection-logging.md)」を参照してください。

デバイスが接続承認に失敗した場合、接続ログの `connection-attempt-failure-reason` フィールドから次の失敗理由のいずれかが返されます。
+ `client-connect-failed` — Lambda 関数によって接続が確立されませんでした。
+ `client-connect-handler-timed-out` — Lambda 関数がタイムアウトしました。
+ `client-connect-handler-other-execution-error` — Lambda 関数で予期しないエラーが発生しました。
+ `client-connect-handler-throttled` — Lambda 関数がスロットルされました。
+ `client-connect-handler-invalid-response` — Lambda 関数が無効なレスポンスを返しました。
+ `client-connect-handler-service-error` — 接続試行中にサービス側のエラーが発生しました。