はじめに
今回はPythonで作成したAWS Lambda関数を保護するサーバーレスディフェンダーの導入方法を解説していきます。
サーバーレスディフェンダーには関数組み込み型とレイヤー型の2つの種類があり、今回は両方導入方法を解説していきたいと思います。
サーバーレスディフェンダーとは
CWPP(Cloud Workload Protection Platform)の中の機能の一つでAWS LambdaとAzure Functionを保護するための機能です。
※ARM64 アーキテクチャはサポートされていません
他のディフェンダー種類についてはこちらから確認できます。
何から保護してくれるのか
Prisma Cloud のサーバーレスディフェンダーは、以下のリスクから AWS Lambda 関数を保護します。
-
プロセスアクティビティ
ポリシーに対して、起動されたサブプロセスを検証することを可能にします。 -
ネットワーク接続
インバウンドとアウトバウンドの接続を検証し、明示的に許可されたドメインへのアウトバウンド接続を許可します。 -
ファイルシステムアクティビティ
関数がアクセスできるファイルシステムの部分を制御します。
サーバーレスディフェンダーに必要な通信経路
Lambda が Prisma Cloud の特定IP/ドメインと通信できる必要があります。
IPは日本リージョンの場合以下の通りになります。
詳細はこちらです。
通信方向 | IPアドレス |
Egress | 35.194.113.255 |
Ingress | 35.200.123.236 |
関数組み込み型とレイヤー型の設定作業の違い
関数組み込み型とレイヤー型のそれぞれの作業概要を説明します。
関数組み込み型
- Prisma Cloud コンソールからサーバーレスディフェンダー用ライブラリをダウンロードする
- Lambda関数のフォルダにサーバーレスディフェンダーのライブラリを配置する
- Lambda関数がサーバーレスディフェンダーを利用できるようにソースコードを追記する
- 環境変数を設定する
レイヤー型
- Prisma Cloud コンソールからサーバーレスディフェンダー用ライブラリをダウンロードする
- サーバーレスディフェンダー用のLambdaレイヤーを作成する
- すべての Lambda 関数にレイヤーを適用する
- 環境変数、ハンドラー設定を行う
どちらが導入が簡単か
レイヤー型の方が導入が簡単です。一度レイヤーを作成すれば、Lambda関数ごとにライブラリを配置することや、コードを修正する必要が無くなります。
対応バージョンと対応言語
サーバーレスディフェンダー(AWS Lambda)の対応言語とバージョンは以下の通りです。
詳しくはこちらを参照ください。
言語 | バージョン |
C#(.NET Core) | 6.0 |
Java | 8, 11 |
Node.js | 14.x, 16.x, 18.x |
Python | 3.6, 3.7, 3.8, 3.9 |
Ruby | 2.7 |
サーバーレスディフェンダーの導入(関数組み込み型)
環境変数用の値を取得
- 左上の選択が「ランタイムセキュリティ」になっていることを確認します。
- 「ホーム」→ 左ペイン「MANAGE」→ 「Defenders」に行きます。
- 「Manual deploy」を押下します。
- 押下すると設定画面に遷移します。
変更した設定値は以下の通りです。
Method: Single Defender
Defender Type: Serverless Defender – AWS
- 次に「Manual Deploy」に行き設定をします。
Runtime: Python
Deployment type: Embedded
Function name: defender-test
Region: Tokyo
Runtimeは今回はLambdaでPythonを使用するのでPythonを指定しています。
同様に関数組み込み型を使用する場合は、Embeddedを指定します。
FunctionNameはLambdaの関数名と同じにします。
RegionはTokyoを指定しています。 - ディフェンダーライブラリのダウンロード
「1. Download file」の「Command」か「Download file directly」どちらかでライブラリのダウンロードを行ってください。
ダウンロードしたライブラリを事前に解凍しておきます。
「3. Handler」の部分はのちに使用する部分ですが、今は使用しないのでスキップします。
- TW_POLICYの生成
Lambdaの環境変数に使うTW_POLICYの生成を行っていきます。
「Generate」ボタンを押して、KeyとValueを保存しておきます。
サーバーレスディフェンダーの導入
以下サーバーレスディフェンダー導入前のLambdaのコードになります。
コード自体は本編に関係ないので深くは解説しませんが、S3内の特定ファイルにログを書き込むコードになっています。
import boto3 import json def lambda_handler(event, context): s3_bucket_name = 's3-lambda-log-test' s3 = boto3.client('s3') data = event['awslogs']['data'] if 'test' in data: print(f"Found 'test' in log data.") s3_key = f"log-data.json" s3.put_object(Body=json.dumps(data), Bucket=s3_bucket_name, Key=s3_key) return { 'statusCode': 200, 'body': json.dumps('Successfully processed log data.') }
1. Lambda関数の環境変数の設定
先ほどの「7.TW_POLICYの生成」で生成したKeyと値をLambdaの環境変数に入力します。
2. Lambda関数の修正
ライブラリの追加
最初に先ほど「6.ディフェンダーライブラリのダウンロード」にてダウンロードしたライブラリをLambdaに追加します。
- 先ほどダウンロードした「twistlock_serverless_defender.zip」を解凍します。
解凍し、中に入り「twistlock」というフォルダの中に入ります。
そうすると以下画像の3つのファイルがあることを確認します。
- Lambda関数のファイルのダウンロードを行います。
「ファンクションコード .zip をダウンロード」を押下し、zipファイルをダウンロードし、解凍します。
- 解凍したファイルの末尾がランダムな英数字になっているので、元のLambda関数の名前に変更します。
- 1で解凍した「twistlock_serverless_defender」のディレクトリの中にある「twistlock」を今回ダウンロードしたLambda関数名のフォルダに入れます。
以下画像のようになれば大丈夫です。
- lambda_function.pyとtwistlockを選択し、zip化します。
- lambdaに先ほどzip化したzipファイルをアップロードします。
「コード」→ 画像右上の「アップロード元」→「.zipファイル」から先ほどのzipファイルを選択します。
- 以下画像のようになればライブラリの追加は完了です。
コードの修正
次にコードの修正をしていきます。
修正したコードは赤アンダーライン部分です。
先ほどLambdaにファイル追加した「twistlock.serverless」をimportして、「lambda_handler」関数をラップするとサーバーレスディフェンダーを関数に埋め込むことができます。
import boto3
import json
import twistlock.serverless
@twistlock.serverless.handler
def lambda_handler(event, context):
s3_bucket_name = 's3-lambda-log-test'
s3 = boto3.client('s3')
data = event['awslogs']['data']
if 'test' in data:
print(f"Found 'test' in log data.")
s3_key = f"log-data.json"
s3.put_object(Body=json.dumps(data), Bucket=s3_bucket_name, Key=s3_key)
return {
'statusCode': 200,
'body': json.dumps('Successfully processed log data.')
}
3. 正常に Prisma Cloud と接続されているか確認
これで関数組み込み型のサーバーレスディフェンダーの導入が完了しました。
Lambda関数が1回動作しないとPrismaCloudコンソールに表示されないので1回動作させます。
Prisma Cloud コンソールで「ホーム」→「Defenders」に行くとLambda関数名が「Host」のところに出ているのが確認できます。
サーバーレスディフェンダーの導入(レイヤー型)
次はレイヤー型のサーバーレスディフェンダーの導入を行っていきます。
レイヤー用のzipファイルのダウンロード
- 左上の選択が「ランタイムセキュリティ」になっていることを確認します。
- 「ホーム」→ 左ペイン「MANAGE」→ 「Defenders」に行きます。
- 「Manual deploy」を押下します。
- 押下すると設定画面に遷移します。
変更した設定値は関数組み込み型と同じ以下の通りです。
Method: Single Defender
Defender Type: Serverless Defender – AWS
- ディフェンダーライブラリのダウンロード
Download fileのCommandかDownload file directlyどちらかでレイヤー追加用のzipファイルのダウンロードを行ってください。 - TW_POLICYの生成
Lambdaの環境変数に使うTW_POLICYの生成を行っていきます。
「Generate」ボタンを押して、KeyとValueを保存しておきます。
レイヤーの追加
次はLambda関数にレイヤーを追加しますが、その前にレイヤーの作成を行います。
- レイヤーの作成
「Lambda」→「レイヤー」→「レイヤーの作成」を押下していきます。
名前: twistlock
.zipをアップロード: twistlock_defender_layer.zip
互換性のあるランタイム – オプション: python3.8
他はオプションなどは自由に選択などをしてください。
入力出来たら、「作成」を押下します。
名前はtwistlockを指定してください。
.zipをアップロードは先ほど「レイヤー用のzipファイルのダウンロード」の「5. ディフェンダーライブラリのダウンロード」でダウンロードしたzipファイルを選択してください。
互換性のあるランタイム – オプションはlambdaで使うランタイムを選択してください。
今回はpython3.8でLambda関数を作成したのでpython3.8を指定しています。 - Lambda関数にレイヤーを追加する
「Lambda」→「(関数名)」→「コード」→ 一番下にある「レイヤー」→「レイヤーを追加」を押下します。
「レイヤーを選択」→「カスタムレイヤー」→先ほど作成した「twistlock」→ バージョンは最新のものを選択します
選択したら「追加」を押下します。
Lambda関数の環境変数の設定
関数組み込み型と同様に環境変数に設定するものがあるので設定します。
先ほど「6. TW_POLICY」で生成したKeyと値を環境変数に入力します。
次にORIGINAL_HANDLERを環境変数に追加する必要があるので追加します。
値には現在のハンドラ名を入力します。
「コード」→「ランタイム設定」→「ハンドラ」で現在のハンドラ名を確認できます。
デフォルトだと「lambda_function.lambda_handler」になっています。
ハンドラー設定の変更
次にLambda関数のハンドラー設定を変更します。
「コード」→「ランタイム設定」→「ハンドラ」に行きます。
ハンドラ: twistlock.handler
ハンドラ名を変更したら「保存」を押下して保存します。
正常に Prisma Cloud と接続されているか確認
これでレイヤー型のサーバーレスディフェンダーを導入することができました。
関数組み込み型と同様でLambda関数を1回動作させないと Prisma Cloud コンソール上に現れないのでLambda関数を1回動作させます。
Prisma Cloud コンソールで「ホーム」→「Defenders」に行くとLambda関数名が「Host」のところに出ているのが確認できます。
おわりに
当社では、複数クラウド環境の設定状況を自動でチェックし、設定ミスやコンプライアンス違反、異常行動などのリスクを診断するCSPMソリューションを販売しております。
マルチクラウド設定診断サービス with CSPM| SCSK株式会社
CSPM | Smart One Cloud Security® Powered by Prisma Cloud from Palo Alto Networks | SCSK株式会社
ご興味のある方は是非、お気軽にお問い合わせください。