AWS Client VPNでアクセス元のIPアドレスを制限してみた

2021.01.14

こんにちは、コンサル部@大阪オフィスのTodaです。

AWS Client VPNで接続する際、クライアントの接続元IPアドレスを確認して、許可・却下する方法についてご質問いただきました。
今回、VPNのクライアント接続ハンドラにLambda関数を追加して認証する方法がございましたので試してみます。

やりたいこと

  • Client VPNの接続時に接続元IPアドレスのチェックをおこない、許可・却下をする。

前提条件

  • Client VPNの設定が完了している状態から始めます。

参考にしている資料

当内容を確認するにあたり下記記事を参考にしております。
ユーザーで制限をする場合などは下記記事をご覧ください。

やってみた

Lambdaの画面移動

AWSマネージメントコンソール上部のサービスから[Lambda]をクリックします。
一覧画面から[関数の作成]をクリックします。

Lambda関数の新規作成

関数の作成から関数名、ランタイムの設定をおこないます。
関数名は「AWSClientVPN-[任意文字]」 、ランタイムは「Python 3.8」を指定します。
入力後、[関数の作成]ボタンをクリックします。

プログラムの設定

登録が完了すると、Lambda関数のコードを入力する画面が表示されます。
画像内の入力枠にPythonのプログラムを入力します。

プログラムの設定

参考のプログラムは配列(リスト)に入力したIPアドレスからの接続のみ許可する設定になっています。 IPアドレスは任意の内容に変更ください。
プログラム入力後、[デプロイ]ボタンを押して保存します。

def lambda_handler(event, context):
    # 判定するIPアドレス
    ip = event['public-ip']
    
    # 許可するIPアドレス(リスト)
    allow_ip_list = [
        "92.202.xx.xx", 
        "92.203.xx.xx", 
        "202.11.xx.xx", 
        "203.22.xx.xx"
    ]
    
    if ip in allow_ip_list:
        flag = 1
    else:
        flag = 0
    
    return {
            "allow": bool(flag),
            "error-msg-on-failed-posture-compliance": "Your IP is not allowed to access.",
            "posture-compliance-statuses": ["compliant"],
            "schema-version": "v1"
            }

プログラムのテスト

作成したプログラムが正常に動作するか確認するためテストイベントで確認します。
画面上部の選択肢から[テストイベントの設定]を選択します。

テストイベントの入力画面が表示されますのでテスト用のダミー情報を入力します。
ダミー情報で重要な箇所は public-ip です。実際に接続を許可したいIP等を指定します。
入力後、[作成]ボタンをクリックします。

{
    "endpoint-id": "cvpn-endpoint-xxxxxxxxxxxxxxx",
    "connection-id": "cvpn-connection-xxxxxxxxxxxxxxxx",
    "common-name": "xxxxxx.domain.tld",
    "username": null,
    "platform": null,
    "platform-version": null,
    "public-ip": "[判定IPアドレス] (例)92.202.xx.xx",
    "client-openvpn-version": null,
    "schema-version": "v1"
}

実際にテストをしてみます。
先ほど作成したテストイベントを選択後、[テスト]ボタンをクリックします。

テスト実行

結果が表示されます。
allow の内容がtrue:接続OK / false:接続NGとなります。

テスト結果

プログラム動作が問題ないことを確認した後に、VPNのクライアント接続ハンドラに設定をおこないます。

VPNの設定画面

上部のサービスから[VPC]をクリックします。
左メニューから[クライアント VPN エンドポイント]をクリックします。

エンドポイントの変更

設定をするVPNエンドポイントを選択後、[アクション] > [クライアントVPNエンドポイントの変更]を選択します。

エンドポイントの変更

クライアント接続ハンドラ設定

クライアント接続ハンドラを有効化して、作成したLambda関数を選択します。

クライアント接続ハンドラ設定

設定後、[クライアントVPNエンドポイントの変更]をクリックして保存します。
保存した段階で設定が有効化されます。

VPN接続を使って確認

設定完了後、実際にVPN接続をおこない動作が問題ないことを確認します。

さいごに

今回はClient VPN接続でLambdaを利用して接続元IPを確認する処理をいれてみました。
少しでもお客様の作りたい物の参考になればと考えております。