Aqua を使ってLambdaプログラム内の脆弱性と機密情報(アクセスキーや秘密鍵)のチェックをしてみた
こんにちは、コンサル部@大阪オフィスのTodaです。
aqua社が提供しているAqua Platform の Enterprise版 を試す機会がありましたので検証環境向けのセットアップをおこない手順をまとめました。
今回は FUNCTION (SERVERLESS) ASSURANCE の機能を利用してLambdaのスキャンをおこないプログラム内で利用しているライブラリの脆弱性と機密情報(アクセスキーや秘密鍵など)が扱われていないか、過剰なアクセス許可をしていなか確認します。
Aqua Platformとは?
Aqua Platformはaqua社が提供するソリューションでコンテナとクラウドネイティブアプリのために開発された、 フルライフサイクルなセキュリティソリューションになります。
■ aqua コンテナ・クラウドネイティブアプリのためのセキュリティソリューション https://www.creationline.com/aqua
製品の内容については下記記事をご覧ください。
FUNCTION (SERVERLESS) ASSURANCEについて
FUNCTION ASSURANCE はAWS Lambda、Azure, Google CloudのFunctionをスキャンしてリスク評価する機能になります。
Function Assurance Policiesに従ってスキャンをおこないリスク評価を実施します。
■ Function Assurance Overview (当ページはログインが必要です) https://docs.aquasec.com/docs/function-assurance-overview
検証環境について
検証にはAqua Serverのセットアップが必要になります。
県境環境にはEC2にDockerを導入して利用しています。
セットアップ手順は下記記事をご覧ください。
FUNCTION ASSURANCEのセットアップ
Aqua Serverに対してLambdaとIAMの情報を参照できるように設定します。
設定方法は「クレデンシャル」または「IAMロール」のアクセス方法があります。
今回は「IAMロール」による設定で対応致します。
IAMポリシーの作成
AWSコンソールにログインをおこないます。
サービスから[IAM] > 表示される左メニューから[ポリシー]をクリックします。
[ポリシーを作成]をクリックします。
JSON形式にて下記ポリシーを設定します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:GenerateServiceLastAccessedDetails", "iam:GetGroupPolicy", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:GetRolePolicy", "iam:GetServiceLastAccessedDetails", "iam:GetServiceLastAccessedDetailsWithEntities", "iam:GetUser", "iam:GetUserPolicy", "iam:ListAttachedGroupPolicies", "iam:ListAttachedRolePolicies", "iam:ListAttachedUserPolicies", "iam:ListGroupPolicies", "iam:ListGroupsForUser", "iam:ListRolePolicies", "iam:ListUserPolicies" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "cloudwatch:GetMetricData", "cloudwatch:ListMetrics" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "lambda:DeleteFunctionConcurrency", "lambda:DeleteLayerVersion", "lambda:GetFunction", "lambda:GetFunctionConfiguration", "lambda:GetLayerVersion", "lambda:GetPolicy", "lambda:ListAliases", "lambda:ListEventSourceMappings", "lambda:ListFunctions", "lambda:ListTags", "lambda:PublishLayerVersion", "lambda:PutFunctionConcurrency", "lambda:TagResource", "lambda:UntagResource", "lambda:UpdateFunctionConfiguration" ], "Resource": "*" } ] }
ポリシー名を任意で設定して登録をおこないます。 今回はaqua-test-policyを設定しています。
IAMロールの作成
左メニューから[ロール]をクリックします。
[ロールを作成]をクリックします。
ユースケースの選択は[EC2]を選択して[次のステップ:アクセス権限]をクリックします。
権限ポリシーの選択で先ほど作成したポリシー(aqua-test-policy)を選択します。
ロール名を任意で設定して登録をおこないます。
今回はaqua-test-roleを設定しています。
EC2にロールのアタッチ
作成をしたIAMロールをEC2にアタッチします。
サービスから[EC2]を選択して一覧に表示されるインスタンスからAqua Serverがセットアップされている物を選択して[アクション] > [セキュリティ] > [IAMロールの変更]をクリックして作成したIAMロールを設定します。
上記でAWSコンソール上の操作は完了になります。
Aqua Serverにログイン
Aqua Serverにログインをおこないます。
左メニューの[Administration] > [Integrations] > [Serverless Applications]を選択します。
一覧上部の[Add Serverless Applications]をクリックします。
Serverless Applicationsの設定
Serverless Applicationsを設定する事で環境内のLambdaをスキャンして自動で一覧に表示します。
タグによる指定・除外も可能です。
今回はIAMロールをEC2に設定するようにしているためConnection Type:Credentialsを選択してAccess Keyを入力しないで設定します。
入力項目
- Serverless App Name: 環境名を指定
- Compute Provider: AWS Lambdaを選択
- Region: 監視対象のリージョンを指定
- Connection Type: Credentials または Access Delegation を選択
- Include Tags: タグにて指定をする場合入力
- Exclude Tags:タグにて除外をする場合入力
アクセステストをおこない、[Established Connection]がSuccessになることを確認して[Save]をクリックします。
上記でAquaへの設定は完了になります。
Lambdaのスキャン確認
上記設定が正常に出来ているか確認をおこないます。
左メニューの[Functions]をクリックしてAWSに登録しているLambda処理が一覧で表示できているかを確認します。
今回Lambdaには Incident Manager にインシデントを登録する処理が検証で配置しています。
画面の見方
Functions一覧
ファンクション一覧にはスキャンをしたLambda処理が一覧で表示されてセキュリティリスクや機密情報の数が一覧で表示されます。
表示項目
- リスクカウント:左からCritical, High, Medium, Low, Medium, Negligibleにて数を表示します。
- センシティブ:処理内で「AWS ACCESS KEY」や「AWS SECRET KEY」が取り扱われているファイル数を表示します。
- 準拠:権限が適切かを表示します。
- ポリシー:追加ポリシーが適用されている場合、問題が無いか表示します。
Functions詳細
ファンクション詳細では対象のLambda処理に存在するリスクや利用しているライブラリのバージョン・リスク確認、センシティブな情報の取扱、IAMロールの権限を確認することができます。
Risk
Lambda処理に存在するリスク数を把握する画面になります。
修正後の再スキャンも画面にておこなうことが可能です。
Vulnerabilities
スキャン処理にて確認できたセキュリティリスクを一覧で表示します。
リスクはランク別で確認する事ができます。
Resources
処理に使われているライブラリ等を確認する事ができます。
セキュリティリスクのあるライブラリが使われていないか確認する事ができます。
Sensitive Data
処理内になるセンシティブな情報を一覧で表示します。
Activity Trends
処理の動作履歴をグラフにて表示します。
Permissions
処理に設定されているIAMロールで過剰な権限や未使用な権限が付与されていないか確認します。
Information
処理のランタイムなど詳細情報を確認します。
Scan History
過去のスキャン結果を一覧で確認する事ができます。
意図的にリスクを作ってみる
IAM過剰権限
検証用のLambda処理を1つ準備してIAMロールにAdministratorAccessを付与してみます。
初期状態のAquaでは過剰権限のルールが無効になっているためポリシー設定を変更して適用します。
左メニューから[Policies] > [Assurance Policies]を選択して、「Defauls:Function」の編集をおこないます。
設定では[Excessive Permissions]を有効化して過剰な権限が付与された場合に警告ができるように設定します。
設定後は、再スキャンを実施します。
Functions一覧
過剰権限を設定した「testInspection」のポリシーが非準拠に変わっている事が確認できます。
合わせて権限のキーアイコンが赤色に変更されています。
Functions詳細
Functions詳細を開くと設定した[Excessive Permissions]にてステータスが[Failed]になっている事を確認しました。
[Permissions]タブをクリックして内容を確認するとAdministrator Accessが付与されていると言うことで警告が表示されていることを確認する事が出来ます。
操作してみて思ったのは[Excessive Permissions]はFunction Scanとは別枠でチェックになるためリクスカウントとは別枠になっていました。
さいごに
今回はAqua PlatformのFunction Assurance機能を試してみました。
Function Assurance機能はLambda環境をAquaに参照させることでライブラリ含むプログラム内の脆弱性や機密情報の取扱をチェックしてくれるためプログラムの知識が少なくても問題箇所の絞り込みが可能です。
Lambda処理をご利用の場合、プログラムのチェックにAquaは大変使いやすいと感じました。