まったり技術ブログ

Webエンジニアのセキュリティブログ

【入門】無料で始めるCSPM(Azure 編)

はじめに

 前回の記事ではOSSのCSPMツールである「CloudSploit」を用いてAWS環境のセキュリティ診断を行う方法を紹介しました。

CSPM(Cloud Security Posture Management)の簡単な説明は、この記事に記載しています。

blog.motikan2010.com

 今回はCloudSploitを用いて、Azure環境に対してセキュリティ診断を実施していきます。

環境

 Cloudsploit を動作させるためには Nodejs が必要です。本検証では以下のバージョンを利用しています。

Node.js 18.16.0

Azureから認証情報の取得手順

 CloudSploit を用いてAzure環境を診断する場合には、Azureにログインして下記4種類の値の取得する必要があります。

  • Application ID (アプリケーション ID)
  • Directory ID (ディレクトリ ID)
  • Client secrets の value (クライアントシークレットの値)
  • Subscription ID (サブスクリプション ID)

 それらの値の取得手順を以下に記載します。

アプリケーションの登録

  1. Azure ポータルにログインし、「Azure Active Director」サービスに移動します。
  2. App registrations」を選択し、「New registration」をクリックする。
  3. Name」フィールドに「CloudSploit」などの分かりやすい名前を入力します。
  4. Supported account types」のデフォルトは「Accounts in this organizational directory only (YOURDIRECTORYNAME)」のままにしておきます。
  5. 「Register」をクリックします。
  6. Application ID」をコピーしてメモします。
  7. Directory ID」をコピーしてメモします。

クライアントシークレットの作成

  1. Certificates & secrets」をクリックする。
  2. 「Client secrets」の下にある「New client secret」をクリックする。
  3. "Description"(例:Cloudsploit-2019)を入力し、"Expiers"に「Recommended: 180 days (6 months)」を選択します。
  4. 「Add」をクリックします。
  5. クライアントシークレットの値をメモします。
    (※クライアントシークレットの値は一度だけ表示されます。)

検査用ロールの割り当て

  1. Subscriptions」に移動します。
  2. 関連する「Subscription ID」メモして、IDをクリックします。
  3. Access Control (IAM)」をクリックします。
  4. Role assignments」タブに移動します。
  5. Add」をクリックし、「Add role assignment」をクリックします。
  6. 「Role」のドロップダウンで「Security Reader」を選択します。
  7. 「Assign access to」はデフォルト値のままにしておきます。
  8. 「Select」ドロップダウンに、作成したアプリ登録名(例:"CloudSploit")を入力し、選択します。
  9. Next」、そして「Review + assign」をクリックする。
  10. 同様に「Log Analytics Reader」ロールを付与します。

セキュリティ診断の実施

 Cloudsploit を実行するための認証情報を取得できたので、次は設定を行っていきます。

インストールと設定

-- ソースコードの取得
$ git clone https://github.com/aquasecurity/cloudsploit.git

-- 執筆時点の最新バージョンに切り替える
$ git checkout 7fce62cac57330019e886ea282d0a57a953b74f8

-- 必要なライブラリのインストール
$ npm install

-- 設定ファイルのコピー
$ cp config_example.js config.js

 コピーした「config.js」を編集します。編集前は下画像の箇所がコメントアウトされているため、コメントを解除します。

 Azure から取得した情報を環境変数に設定します。

$ export AZURE_APPLICATION_ID="<Application ID (アプリケーション ID)>"
$ export AZURE_DIRECTORY_ID="<Directory ID (ディレクトリ ID)>"
$ export AZURE_KEY_VALUE="<Client secrets の value (クライアントシークレットの値)>"
$ export AZURE_SUBSCRIPTION_ID="<Subscription ID (サブスクリプション ID)>"

検査の実施

 「index.js」ファイルを実行することで検査を実施することができます。

 以下のコマンドで検査を実施できます。

$ ./index.js --config=./config.js --cloud=azure --console=none --json=./results.json --compliance=pci

 コマンドに指定しているオプションの説明は次のとおりです。

オプション 説明
--config=./config.js 先ほど編集した設定ファイルを反映します。
--cloud=azure Azure 環境に対して検査を実施します。
--console=none 検査結果をターミナル上に出力しないようにします。
--json=./results.json 検査結果をJSONファイルに出力するようにします。
--compliance=pci PCI DSS に基づいた検査項目のみ検査します。

検査結果を確認

 検査結果がJSONファイルに出力されていることが確認できます。

$ cat results.json | head -n 20
[
  {
    "plugin": "networkAccessDefaultAction",
    "category": "Storage Accounts",
    "title": "Network Access Default Action",
    "description": "Ensures that Storage Account access is restricted to trusted networks",
    "resource": "N/A",
    "region": "eastus",
    "status": "OK",
    "message": "No storage accounts found",
    "compliance": "PCI: PCI requires data access to be configured to use a firewall. Removing the default network access action enables a more granular level of access controls."
  },
(以下省略)

 検査結果をTSVファイルに変換して「エクセル」や「Google スプレッドシート」などで表示することで検査結果が見やすくなります。

$ cat results.json | jq -r '.[] | [.plugin, .category, .title, .description, .resource, .region, .status, .message, .compliance] | @tsv' > result.tsv

 例の検査結果では、以下の3つが検出されていることが確認できます。

  • ネットワークセキュリティグループの設定で「SSH (22 番ポート)が全ての送信元にオープン状態」
  • ネットワークセキュリティグループの設定で「RDP (3389 番ポート)が全ての送信元にオープン状態」
  • ネットワークセキュリティグループの設定で「MySQL (3306 番ポート)が全ての送信元にオープン状態」

まとめ

CloudSploitを活用することにより簡単にAzure環境のセキュリティ診断を行うことができました。
これで十分なのかと言われるとそうではないですが、クラウドセキュリティを検討する際の入り口として活用できると思います。