Fargate上のコンテナパッケージ情報の登録・更新
本ページでは、AWS Fargate上で実行中のLinuxコンテナからパッケージ情報を収集し、SIDfm VMへ自動的に登録・更新する手順をご案内します。
1. 概要
- 本手順は、Fargate 環境において、AWS CLI の ECS Exec 機能を利用してコンテナ内部でコマンドを実行します。
-
本手順では、次の2通りの実行パターンに対応しています。
- 状況 1:AWS CLI
を実行する環境(ローカルなど)から、VMサーバへ直接アクセス可能
→ パッケージ情報の収集と登録を同一場所で実行 - 状況 2:AWS CLI
を実行する環境(ローカルなど)から、VMサーバへ直接アクセス不可
→ パッケージ情報収集後、別のサーバからVM登録処理を実行
ご利用中の環境に応じて、該当する手順に従ってください。
- 状況 1:AWS CLI
を実行する環境(ローカルなど)から、VMサーバへ直接アクセス可能
-
対応しているコンテナの OS は こちら
をご参照ください。
※ Windows 系のコンテナには現在対応しておりません。
-
以下の OS は、Red Hat Enterprise Linux として登録することで脆弱性を検出できます。
- RockyLinux 8 / 9
- Oracle Linux 8 / 9
検出される脆弱性は Red Hat Enterprise Linux のものとなりますので、詳細は対象 OS の公式情報をご確認ください。
2. 必要な条件
- 概要で記載した対応OSを使用しているコンテナが Fargate 上で動作していること
-
ECS Exec を実行するためのツールと環境構成
-
ローカル環境のツール
以下のツールがインストール済みであること:- AWS CLI
- Session Manager Plugin for AWS CLI
-
ECS 環境構成
以下の構成が完了していること:- Fargate クラスタおよびサービスが作成済みであること
- タスク定義およびサービス設定で ECS Exec が有効化されていること
- タスク実行ロールに ECS Exec に必要な IAM 権限が付与されていること
※ ECS Exec の設定方法や必要な IAM 権限については、以下の公式ドキュメントをご参照ください。
-
ローカル環境のツール
-
VM APIへのアクセスが可能なこと(以下を把握していること)
- VMサーバのホスト名(APIエンドポイントURL内のホスト名)
- APIキー
- SIDfm VM 管理者権限またはSIDfm VM 報告者権限のユーザに紐付けられた VM API キー
- システムカテゴリID
- カスタムカテゴリID
※ 設定メニューの「カテゴリ設定」画面でエクスポートを行うことで、カテゴリIDを確認できます。
ただし、エクスポートが可能なのは SIDfm VM 管理者権限を持つユーザのみです。
※ こちらの VM API エンドポイントを使用すれば、APIキーに紐付けられたユーザがアクセス可能なカテゴリ一覧を取得でき、カテゴリIDも確認できます。
3. 手順
3.1 状況 1: AWS CLI を実行する環境(ローカルなど)から、VMサーバへ直接アクセス可能
-
コンテナパッケージ情報収集スクリプトの実行
AWS CLI を実行可能な環境で、以下のスクリプトを実行します。
実行方法については、後述の「実行方法」をご参照ください。クリックしてスクリプト全文を表示
#!/bin/bash set -e # 結果保存先ディレクトリ OUTPUT_DIR="$HOME/sidfmvm_container_jsons" mkdir -p "$OUTPUT_DIR" # 対象のクラスター CLUSTER="YourClusterName" # クラスター内の全実行中タスクのARN一覧を取得する TASK_ARNS=$(aws ecs list-tasks --cluster "$CLUSTER" --desired-status RUNNING --query 'taskArns[*]' --output text) echo "対象タスク: $TASK_ARNS" # 全タスクの詳細を一括で取得する TASKS_JSON=$(aws ecs describe-tasks --cluster "$CLUSTER" --tasks $TASK_ARNS --output json) # jq を使用して各タスクを処理する TASK_COUNT=$(echo "$TASKS_JSON" | jq '.tasks | length') echo "タスク数: $TASK_COUNT" for (( i=0; i<$TASK_COUNT; i++ )); do TASK_ARN=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].taskArn") echo "処理中タスク: $TASK_ARN" # タスクID(ARNの最後の部分)を抽出する TASK_ID_SHORT=$(echo "$TASK_ARN" | awk -F'/' '{print $NF}') # タスク内のコンテナ数を取得する CONTAINER_COUNT=$(echo "$TASKS_JSON" | jq ".tasks[$i].containers | length") for (( j=0; j<$CONTAINER_COUNT; j++ )); do CONTAINER_NAME=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].containers[$j].name") # "ecs-service-connect-"で始まるコンテナはスキップする if [[ "$CONTAINER_NAME" == ecs-service-connect-* ]]; then echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] はスキップします。" continue fi echo "タスク $TASK_ARN のコンテナ: $CONTAINER_NAME" # コンテナ内で実行するシェルコマンドを定義する COMMAND="sh -c ' \ container_id=\$(cat /proc/self/cgroup | grep -oE \"[0-9a-f]{64}\" | head -n 1 | tr -d \"\r\"); \ if [ -z \"\$container_id\" ]; then container_id=\"unknown\"; fi; \ os_info=\$(if [ -f /etc/os-release ]; then . /etc/os-release && echo \"\$ID,\$VERSION_ID,\$NAME\"; else echo \"unknown,unknown,unknown\"; fi | tr -d \"\r\"); \ echo \"\${container_id}\"; \ echo \"\${os_info}\"; \ echo \"###PACKAGES###\"; \ SHELL_CMD=\$(command -v sh || command -v bash || command -v ash); \ if [ -z \"\${SHELL_CMD}\" ]; then echo \"サポートされるシェルがありません\"; exit 1; fi; \ if command -v dpkg-query >/dev/null; then \ dpkg-query --show --showformat='\''\${Package}_\${Version}\n'\''; \ elif command -v rpm >/dev/null; then \ if [ -f /etc/os-release ]; then \ . /etc/os-release; \ major_version=\$(echo \"\$VERSION_ID\" | cut -d. -f1); \ if [ \"\$ID\" = \"amzn\" ]; then \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \ elif [ \"\$major_version\" -ge 8 ]; then \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch} %{modularitylabel}\n\"; \ else \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \ fi; \ else \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \ fi; \ else \ echo \"サポートされていないパッケージマネージャーです\"; \ fi'" echo "タスク $TASK_ARN, コンテナ $CONTAINER_NAME 内でコマンドを実行中..." # ECS Execを使用してコンテナ内でコマンドを実行し、その出力をキャプチャする set +e OUTPUT=$(aws ecs execute-command \ --cluster "$CLUSTER" \ --task "$TASK_ARN" \ --container "$CONTAINER_NAME" \ --command "$COMMAND" \ --interactive \ --output text) EC=$? set -e if [ "$EC" -ne 0 ]; then echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] でコマンド実行に失敗しました。スキップします。" continue fi # Session Manager関連の不要なメッセージを除去する CLEANED_OUTPUT=$(echo "$OUTPUT" \ | grep -v "The Session Manager plugin was installed successfully" \ | grep -v "Starting session with SessionId:" \ | sed '/^\s*$/d') # 出力をパースする EXTRACTED_CONTAINER_ID=$(echo "$CLEANED_OUTPUT" | sed -n '1p' | tr -d '\r') OS_INFO=$(echo "$CLEANED_OUTPUT" | sed -n '2p' | tr -d '\r') PACKAGE_OUTPUT=$(echo "$CLEANED_OUTPUT" | sed -n '4,$p' | tr -d '\r') # もし抽出されたコンテナIDが "unknown" であれば、代わりにタスクIDとコンテナ名を識別子として利用する if [ "$EXTRACTED_CONTAINER_ID" = "unknown" ]; then IDENTIFIER="${TASK_ID_SHORT}_${CONTAINER_NAME}" else IDENTIFIER="$EXTRACTED_CONTAINER_ID" fi # OS情報(CSV)をカンマ区切りで分割する(例: almalinux,9.5,AlmaLinux) OS_ID=$(echo "$OS_INFO" | cut -d',' -f1) OS_VERSION=$(echo "$OS_INFO" | cut -d',' -f2) OS_NAME=$(echo "$OS_INFO" | cut -d',' -f3) if [ "$OS_ID" = "rocky" ] || [ "$OS_ID" = "oracle" ]; then OS_ID="rhel" fi # パッケージ情報の各行をJSON配列の要素としてエスケープし、保存する ESCAPED_PACKAGES="" while IFS= read -r line; do escaped_line=$(echo "$line" | sed 's/"/\\"/g') ESCAPED_PACKAGES="${ESCAPED_PACKAGES}\"${escaped_line}\"," done <<< "$PACKAGE_OUTPUT" ESCAPED_PACKAGES="[${ESCAPED_PACKAGES%,}]" # 最終的なJSONオブジェクトを作成する("hostname"キーには識別用文字列を格納する) CONTAINER_JSON="{\"hostname\":\"${IDENTIFIER}\",\"os\":{\"id\":\"${OS_ID}\",\"version\":\"${OS_VERSION}\",\"os\":\"${OS_NAME}\"},\"packages\":${ESCAPED_PACKAGES}}" # JSONファイルとして保存する(ファイル名はタスクIDとコンテナ名の組み合わせ) OUTPUT_FILE="${OUTPUT_DIR}/${TASK_ID_SHORT}_${CONTAINER_NAME}.json" echo "$CONTAINER_JSON" > "$OUTPUT_FILE" echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] のJSONデータを ${OUTPUT_FILE} に保存しました。" done done
・スクリプトは、指定された Fargate クラスター内の実行中タスクに含まれるすべてのコンテナに対してECS Exec
を用いてコマンドを実行し、
各コンテナの ID、OS 情報、インストールされているパッケージリストを抽出します。
・CLUSTER
変数には、処理対象とする Fargate クラスター名を設定してください。
・execute-command
の実行に失敗したコンテナについては、エラーメッセージが表示され、そのコンテナの処理をスキップして、次のコンテナに進みます。
・抽出された情報は、~/sidfmvm_container_jsons
ディレクトリ内に、
タスク ID とコンテナ名を組み合わせたファイル名の JSON 形式で保存されます。(例:123456789abcdefghi123456789abcde_my-container.json)
・hostname
フィールドには、コンテナ IDが取得できた場合はコンテナ ID を、
取得に失敗した場合はタスク ID とコンテナ名を組み合わせた値が割り当てられます。
・ecs-service-connect-
で始まるコンテナは ECS エージェントに該当するため、情報収集の対象から除外されます。
・実行方法
- クリプトを保存するディレクトリを作成します。
mkdir -p ~/sidfmvm_scripts
-
上記のスクリプトを
vm_fargate_container_collect.sh
という名前で保存します。
nano ~/sidfmvm_scripts/vm_fargate_container_collect.sh
または、vim
、echo
、cat > ファイル名
など任意の方法でも構いません。 -
保存したスクリプトに実行権限を付与します。
chmod +x ~/sidfmvm_scripts/vm_fargate_container_collect.sh
-
以下のコマンドでスクリプトを実行します。
bash ~/sidfmvm_scripts/vm_fargate_container_collect.sh
- クリプトを保存するディレクトリを作成します。
-
VM APIを使用したホスト登録スクリプトの実行
ステップ1と同じ環境で、以下のスクリプトを実行します。
実行方法については、後述の「実行方法」をご参照ください。クリックしてスクリプト全文を表示
#!/bin/bash # ===================================== # ユーザー設定:下記の値を環境に合わせて変更してください # ===================================== API_ENDPOINT="http://ホスト名/redmine/sidfm/api/upload_offline_data" API_KEY="APIキー" SYSTEM_CATEGORY_ID="システムカテゴリID" CUSTOM_CATEGORY_ID="カスタムカテゴリID" OUTPUT_DIR="$HOME/sidfmvm_container_jsons" # JSONファイルが保存されているディレクトリ # ===================================== # OUTPUT_DIR内のすべてのJSONファイルに対してAPIへ送信する # ===================================== for file in "$OUTPUT_DIR"/*.json; do echo "ファイルを処理中: $file" # ファイル内容を読み込む file_data=$(cat "$file") # curlコマンドでPOSTリクエストを実行 (JSONデータはURLエンコードされる) response=$(curl -s -X POST "$API_ENDPOINT" \ --data "q[api_key]=$API_KEY" \ --data "q[system_category_id]=$SYSTEM_CATEGORY_ID" \ --data "q[custom_category_id]=$CUSTOM_CATEGORY_ID" \ --data-urlencode "q[file_data]=$file_data") echo "ファイル [$file] の送信結果:" echo "$response" echo "----------------------------------" done
・スクリプトは、指定されたディレクトリ内のすべてのJSON
ファイルを読み込み、VM API
に送信し、応答結果を出力します。
・API_ENDPOINT
、API_KEY
、SYSTEM_CATEGORY_ID
、CUSTOM_CATEGORY_ID
の変数は、実際の VM API 情報に合わせて設定してください。
・OUTPUT_DIR
は、ステップ 1 で生成された JSON ファイルが保存されているディレクトリのパスを指定してください。必要に応じて変更可能です。
・実行方法
- スクリプトを保存するディレクトリを作成します。
※ すでに作成済みの場合は、この手順はスキップして構いません。
mkdir -p ~/sidfmvm_scripts
-
上記のスクリプトを
vm_fargate_container_send.sh
という名前で保存します。
nano ~/sidfmvm_scripts/vm_fargate_container_send.sh
または、vim
、echo
、cat > ファイル名
など任意の方法でも構いません。 -
保存したスクリプトに実行権限を付与します。
chmod +x ~/sidfmvm_scripts/vm_fargate_container_send.sh
-
以下のコマンドでスクリプトを実行します。
bash ~/sidfmvm_scripts/vm_fargate_container_send.sh
- スクリプトを保存するディレクトリを作成します。
ここでは、AWS CLI を実行可能な環境で 2 種類のスクリプトを実行します。
1つ目のスクリプトは、指定されたFargateクラスター内の全コンテナに対して ECS Exec を使い、パッケージ情報を収集します。
2つ目のスクリプトは、収集された JSON データを VM API に送信します。
3.2 状況 2: AWS CLI を実行する環境(ローカルなど)から、VMサーバへ直接アクセス不可
-
コンテナパッケージ情報収集スクリプトの実行
AWS CLI を実行可能な環境で、以下のスクリプトを実行します。
実行方法については、後述の「実行方法」をご参照ください。クリックしてスクリプト全文を表示
#!/bin/bash set -e # 結果保存先ディレクトリ OUTPUT_DIR="$HOME/sidfmvm_container_jsons" mkdir -p "$OUTPUT_DIR" # 対象のクラスター CLUSTER="YourClusterName" # クラスター内の全実行中タスクのARN一覧を取得する TASK_ARNS=$(aws ecs list-tasks --cluster "$CLUSTER" --desired-status RUNNING --query 'taskArns[*]' --output text) echo "対象タスク: $TASK_ARNS" # 全タスクの詳細を一括で取得する TASKS_JSON=$(aws ecs describe-tasks --cluster "$CLUSTER" --tasks $TASK_ARNS --output json) # jq を使用して各タスクを処理する TASK_COUNT=$(echo "$TASKS_JSON" | jq '.tasks | length') echo "タスク数: $TASK_COUNT" for (( i=0; i<$TASK_COUNT; i++ )); do TASK_ARN=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].taskArn") echo "処理中タスク: $TASK_ARN" # タスクID(ARNの最後の部分)を抽出する TASK_ID_SHORT=$(echo "$TASK_ARN" | awk -F'/' '{print $NF}') # タスク内のコンテナ数を取得する CONTAINER_COUNT=$(echo "$TASKS_JSON" | jq ".tasks[$i].containers | length") for (( j=0; j<$CONTAINER_COUNT; j++ )); do CONTAINER_NAME=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].containers[$j].name") # "ecs-service-connect-"で始まるコンテナはスキップする if [[ "$CONTAINER_NAME" == ecs-service-connect-* ]]; then echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] はスキップします。" continue fi echo "タスク $TASK_ARN のコンテナ: $CONTAINER_NAME" # コンテナ内で実行するシェルコマンドを定義する COMMAND="sh -c ' \ container_id=\$(cat /proc/self/cgroup | grep -oE \"[0-9a-f]{64}\" | head -n 1 | tr -d \"\r\"); \ if [ -z \"\$container_id\" ]; then container_id=\"unknown\"; fi; \ os_info=\$(if [ -f /etc/os-release ]; then . /etc/os-release && echo \"\$ID,\$VERSION_ID,\$NAME\"; else echo \"unknown,unknown,unknown\"; fi | tr -d \"\r\"); \ echo \"\${container_id}\"; \ echo \"\${os_info}\"; \ echo \"###PACKAGES###\"; \ SHELL_CMD=\$(command -v sh || command -v bash || command -v ash); \ if [ -z \"\${SHELL_CMD}\" ]; then echo \"サポートされるシェルがありません\"; exit 1; fi; \ if command -v dpkg-query >/dev/null; then \ dpkg-query --show --showformat='\''\${Package}_\${Version}\n'\''; \ elif command -v rpm >/dev/null; then \ if [ -f /etc/os-release ]; then \ . /etc/os-release; \ major_version=\$(echo \"\$VERSION_ID\" | cut -d. -f1); \ if [ \"\$ID\" = \"amzn\" ]; then \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \ elif [ \"\$major_version\" -ge 8 ]; then \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch} %{modularitylabel}\n\"; \ else \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \ fi; \ else \ rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \ fi; \ else \ echo \"サポートされていないパッケージマネージャーです\"; \ fi'" echo "タスク $TASK_ARN, コンテナ $CONTAINER_NAME 内でコマンドを実行中..." # ECS Execを使用してコンテナ内でコマンドを実行し、その出力をキャプチャする set +e OUTPUT=$(aws ecs execute-command \ --cluster "$CLUSTER" \ --task "$TASK_ARN" \ --container "$CONTAINER_NAME" \ --command "$COMMAND" \ --interactive \ --output text) EC=$? set -e if [ "$EC" -ne 0 ]; then echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] でコマンド実行に失敗しました。スキップします。" continue fi # Session Manager関連の不要なメッセージを除去する CLEANED_OUTPUT=$(echo "$OUTPUT" \ | grep -v "The Session Manager plugin was installed successfully" \ | grep -v "Starting session with SessionId:" \ | sed '/^\s*$/d') # 出力をパースする EXTRACTED_CONTAINER_ID=$(echo "$CLEANED_OUTPUT" | sed -n '1p' | tr -d '\r') OS_INFO=$(echo "$CLEANED_OUTPUT" | sed -n '2p' | tr -d '\r') PACKAGE_OUTPUT=$(echo "$CLEANED_OUTPUT" | sed -n '4,$p' | tr -d '\r') # もし抽出されたコンテナIDが "unknown" であれば、代わりにタスクIDとコンテナ名を識別子として利用する if [ "$EXTRACTED_CONTAINER_ID" = "unknown" ]; then IDENTIFIER="${TASK_ID_SHORT}_${CONTAINER_NAME}" else IDENTIFIER="$EXTRACTED_CONTAINER_ID" fi # OS情報(CSV)をカンマ区切りで分割する(例: almalinux,9.5,AlmaLinux) OS_ID=$(echo "$OS_INFO" | cut -d',' -f1) OS_VERSION=$(echo "$OS_INFO" | cut -d',' -f2) OS_NAME=$(echo "$OS_INFO" | cut -d',' -f3) if [ "$OS_ID" = "rocky" ] || [ "$OS_ID" = "oracle" ]; then OS_ID="rhel" fi # パッケージ情報の各行をJSON配列の要素としてエスケープし、保存する ESCAPED_PACKAGES="" while IFS= read -r line; do escaped_line=$(echo "$line" | sed 's/"/\\"/g') ESCAPED_PACKAGES="${ESCAPED_PACKAGES}\"${escaped_line}\"," done <<< "$PACKAGE_OUTPUT" ESCAPED_PACKAGES="[${ESCAPED_PACKAGES%,}]" # 最終的なJSONオブジェクトを作成する("hostname"キーには識別用文字列を格納する) CONTAINER_JSON="{\"hostname\":\"${IDENTIFIER}\",\"os\":{\"id\":\"${OS_ID}\",\"version\":\"${OS_VERSION}\",\"os\":\"${OS_NAME}\"},\"packages\":${ESCAPED_PACKAGES}}" # JSONファイルとして保存する(ファイル名はタスクIDとコンテナ名の組み合わせ) OUTPUT_FILE="${OUTPUT_DIR}/${TASK_ID_SHORT}_${CONTAINER_NAME}.json" echo "$CONTAINER_JSON" > "$OUTPUT_FILE" echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] のJSONデータを ${OUTPUT_FILE} に保存しました。" done done
・スクリプトは、指定された Fargate クラスター内の実行中タスクに含まれるすべてのコンテナに対してECS Exec
を用いてコマンドを実行し、
各コンテナの ID、OS 情報、インストールされているパッケージリストを抽出します。
・CLUSTER
変数には、処理対象とする Fargate クラスター名を設定してください。
・execute-command
の実行に失敗したコンテナについては、エラーメッセージが表示され、そのコンテナの処理をスキップして、次のコンテナに進みます。
・抽出された情報は、~/sidfmvm_container_jsons
ディレクトリ内に、
タスク ID とコンテナ名を組み合わせたファイル名の JSON 形式で保存されます。(例:123456789abcdefghi123456789abcde_my-container.json)
・hostname
フィールドには、コンテナ IDが取得できた場合はコンテナ ID を、
取得に失敗した場合はタスク ID とコンテナ名を組み合わせた値が割り当てられます。
・ecs-service-connect-
で始まるコンテナは ECS エージェントに該当するため、情報収集の対象から除外されます。
・実行方法
- クリプトを保存するディレクトリを作成します。
mkdir -p ~/sidfmvm_scripts
-
上記のスクリプトを
vm_fargate_container_collect.sh
という名前で保存します。
nano ~/sidfmvm_scripts/vm_fargate_container_collect.sh
または、vim
、echo
、cat > ファイル名
など任意の方法でも構いません。 -
保存したスクリプトに実行権限を付与します。
chmod +x ~/sidfmvm_scripts/vm_fargate_container_collect.sh
-
以下のコマンドでスクリプトを実行します。
bash ~/sidfmvm_scripts/vm_fargate_container_collect.sh
- クリプトを保存するディレクトリを作成します。
-
パッケージ情報が保存された JSON ファイルの移動
ステップ1で収集された~/sidfmvm_container_jsons
ディレクトリ内の JSON ファイルを、VM サーバにアクセス可能なサーバにコピーします。
※ ステップ1で、保存するディレクトリ(OUTPUT_DIR
)を変更した場合は、こちらも同様に変更内容に合わせてパスを指定してください。
以下は、ローカル環境でscp
を使用してファイルを転送するコマンド例です。
クリックしてコマンド例を表示
scp -r ~/sidfmvm_container_jsons \ <コピー先ユーザ>@<コピー先サーバのホスト名またはIPアドレス>:~/sidfmvm_container_jsons
※ このコマンドは、ローカル環境から VM サーバにアクセス可能な別のサーバ へ JSON ファイルを転送する例です。
※<コピー先ユーザ>
、<コピー先サーバのホスト名またはIPアドレス>
は、実際の環境に合わせて変更してください。
※ コピー先のディレクトリ(~/sidfmvm_container_jsons
)は必要に応じて変更可能です。 -
VMサーバにアクセス可能なサーバで、VM APIを使用したホスト登録スクリプトの実行
VMサーバにアクセス可能なサーバで、以下のスクリプトを実行します。
実行方法については、後述の「実行方法」をご参照ください。クリックしてスクリプト全文を表示
#!/bin/bash # ===================================== # ユーザー設定:下記の値を環境に合わせて変更してください # ===================================== API_ENDPOINT="http://ホスト名/redmine/sidfm/api/upload_offline_data" API_KEY="APIキー" SYSTEM_CATEGORY_ID="システムカテゴリID" CUSTOM_CATEGORY_ID="カスタムカテゴリID" OUTPUT_DIR="$HOME/sidfmvm_container_jsons" # JSONファイルが保存されているディレクトリ # ===================================== # OUTPUT_DIR内のすべてのJSONファイルに対してAPIへ送信する # ===================================== for file in "$OUTPUT_DIR"/*.json; do echo "ファイルを処理中: $file" # ファイル内容を読み込む file_data=$(cat "$file") # curlコマンドでPOSTリクエストを実行 (JSONデータはURLエンコードされる) response=$(curl -s -X POST "$API_ENDPOINT" \ --data "q[api_key]=$API_KEY" \ --data "q[system_category_id]=$SYSTEM_CATEGORY_ID" \ --data "q[custom_category_id]=$CUSTOM_CATEGORY_ID" \ --data-urlencode "q[file_data]=$file_data") echo "ファイル [$file] の送信結果:" echo "$response" echo "----------------------------------" done
・スクリプトは、指定されたディレクトリ内のすべてのJSON
ファイルを読み込み、VM API
に送信し、応答結果を出力します。
・API_ENDPOINT
、API_KEY
、SYSTEM_CATEGORY_ID
、CUSTOM_CATEGORY_ID
の変数は、実際の VM API 情報に合わせて設定してください。
・OUTPUT_DIR
は、ステップ 1 で生成された JSON ファイルが保存されているディレクトリのパスを指定してください。必要に応じて変更可能です。
・実行方法
- スクリプトを保存するディレクトリを作成します。
mkdir -p ~/sidfmvm_scripts
-
上記のスクリプトを
vm_fargate_container_send.sh
という名前で保存します。
nano ~/sidfmvm_scripts/vm_fargate_container_send.sh
または、vim
、echo
、cat > ファイル名
など任意の方法でも構いません。 -
保存したスクリプトに実行権限を付与します。
chmod +x ~/sidfmvm_scripts/vm_fargate_container_send.sh
-
以下のコマンドでスクリプトを実行します。
bash ~/sidfmvm_scripts/vm_fargate_container_send.sh
- スクリプトを保存するディレクトリを作成します。
ここでは、AWS CLI を実行可能な環境で Fargate クラスターからパッケージ情報を収集します。
その後、JSON ファイルを VM サーバにアクセス可能な別のサーバへ転送し、VM API に送信します。
4. 結果の確認
VM API呼び出しスクリプトの実行後、以下の2点をご確認ください。
-
スクリプトのレスポンス出力による確認
各JSONファイルの送信結果は、APIのレスポンスにより確認できます。以下はレスポンスの形式例です。{ "success": true, "response": {} }
"success": true
の場合は送信成功を意味します。
-"success": false
の場合は送信失敗を意味し、response
フィールドにエラーの詳細が格納されます。 -
SIDfm VM管理画面での確認
SIDfm VMの管理画面にアクセスし、送信したホスト情報やパッケージ情報が正しく反映されているかご確認ください。- 設定メニューの「ホスト設定」をクリックします。
- コンテナIDがホスト名として登録されたホストが存在するかを確認します。
- ホスト登録後、約10分程で脆弱性照合が行われ、登録された情報から脆弱性が確認された場合は、登録したホストで脆弱性が検出されます。
以降はホスト毎に1日1回脆弱性照合が行われます。