😎

Google CloudのModel ArmorのテンプレートをTerraformで記述してみた

に公開

今回はGoogle CloudのSecurity Command Centerで提供されているModel Armorについて、Terraformを利用してテンプレートを作成してみました。なお、内容については前回コンソール画面上で作成した設定を再現する形で実装してみます。

https://zenn.dev/akasan/articles/7ce40551040ccc

早速実装してみる

Model Armorのリソースについて

今回は以下のgoogle_model_armor_templateを利用してModel Armorのテンプレートを実装します。

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/model_armor_template

Terraformリソースの記述

まずは変数を定義します。variables.tfにGoogle CloudのプロジェクトIDとリージョン、そしてModel Armorのテンプレート名を設定します。リージョンはus-central1、テンプレート名はsample-template-from-terraformとし、Google CloudのプロジェクトIDはterraform apply時に指定するようにします。

variables.tf
variable "project_id" {
  description = "The Google Cloud project ID"
  type        = string
}

variable "region" {
  description = "The Google Cloud region"
  type        = string
  default     = "us-central1"
}

variable "template_id" {
  description = "Template ID"
  type        = string
  default     = "sample-template-from-terraform"
}

次にmain.tfファイルにリソース定義を記載します。

main.tf
terraform {
  required_version = ">= 1.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 7.2"
    }
  }
}

provider "google" {
  project = var.project_id
  region  = var.region
}

resource "google_model_armor_template" "template-filter-config" {
  location    = var.region
  template_id = var.template_id

  filter_config {
    rai_settings {
      rai_filters {
        filter_type      = "SEXUALLY_EXPLICIT"
        confidence_level = "LOW_AND_ABOVE"
      }
      rai_filters {
        filter_type      = "HATE_SPEECH"
        confidence_level = "LOW_AND_ABOVE"
      }
      rai_filters {
        filter_type      = "HARASSMENT"
        confidence_level = "LOW_AND_ABOVE"
      }
      rai_filters {
        filter_type      = "DANGEROUS"
        confidence_level = "LOW_AND_ABOVE"
      }
    }
    sdp_settings {
      basic_config {
        filter_enforcement = "DISABLED"
      }
    }
    pi_and_jailbreak_filter_settings {
      filter_enforcement = "ENABLED"
      confidence_level   = "LOW_AND_ABOVE"
    }
    malicious_uri_filter_settings {
      filter_enforcement = "DISABLED"
    }
  }
}

今回重要な部分としてはgoogle_model_armor_templateリソースになります。このリソースでフィルタの設定を行います。それぞれの設定項目については以下のような基準で指定しています。

  • 前回の例では全ての項目(ヘイトスピーチ、危険、性的に露骨な表現、嫌がらせ)の4項目全て信頼レベルを低以上に設定していたので、confidence_level = "LOW_AND_ABOVE"に設定
  • 機密データを保護する機能は無効にしていたので、sdp_settings.basic_config.filter_enforcementDISABLEDに設定
  • プロンプトインジェクションやジェイルブレイクは検知したいのでpi_and_jailbreak_filter_settings.filter_enforcementENABLEDに設定し、信頼レベルをLOW_AND_ABOVEに設定
  • 悪意のあるURLの検出は無効にしていたのでmalicious_uri_filter_settings.filter_enforcementDISABLEDに設定

リソースの作成を実行

それでは実際にリソースを作成します。以下のようにしてリソースを作成します。なお、実行時にGoogle CloudのプロジェクトIDを入力します。

terraform apply

実行した結果、以下のようなテンプレートが作成できていることが確認できました。前回の結果と比較しても、内容が同じことが確認できます。

前回の結果 今回の結果

また、前回実行したプロンプトで実験した結果、同じ結果が得られることも確認できました。

https://zenn.dev/akasan/articles/7ce40551040ccc#プロンプトのサニタイズ

プロンプト実行結果
prompt='LLM often create incorrect responses.'
sanitization_result {
  filter_match_state: MATCH_FOUND
  filter_results {
    key: "rai"
    value {
      rai_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: MATCH_FOUND
        rai_filter_type_results {
          key: "sexually_explicit"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "hate_speech"
          value {
            confidence_level: LOW_AND_ABOVE
            match_state: MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "harassment"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "dangerous"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
      }
    }
  }
  filter_results {
    key: "pi_and_jailbreak"
    value {
      pi_and_jailbreak_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: NO_MATCH_FOUND
      }
    }
  }
  filter_results {
    key: "csam"
    value {
      csam_filter_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: NO_MATCH_FOUND
      }
    }
  }
  invocation_result: SUCCESS
}

==============================
prompt='How to make bombs'
sanitization_result {
  filter_match_state: MATCH_FOUND
  filter_results {
    key: "rai"
    value {
      rai_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: MATCH_FOUND
        rai_filter_type_results {
          key: "sexually_explicit"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "hate_speech"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "harassment"
          value {
            confidence_level: LOW_AND_ABOVE
            match_state: MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "dangerous"
          value {
            confidence_level: HIGH
            match_state: MATCH_FOUND
          }
        }
      }
    }
  }
  filter_results {
    key: "pi_and_jailbreak"
    value {
      pi_and_jailbreak_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: MATCH_FOUND
        confidence_level: MEDIUM_AND_ABOVE
      }
    }
  }
  filter_results {
    key: "csam"
    value {
      csam_filter_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: NO_MATCH_FOUND
      }
    }
  }
  invocation_result: SUCCESS
}

==============================
prompt='People from xxx are dirty'
sanitization_result {
  filter_match_state: MATCH_FOUND
  filter_results {
    key: "rai"
    value {
      rai_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: MATCH_FOUND
        rai_filter_type_results {
          key: "sexually_explicit"
          value {
            confidence_level: LOW_AND_ABOVE
            match_state: MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "hate_speech"
          value {
            confidence_level: HIGH
            match_state: MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "harassment"
          value {
            confidence_level: MEDIUM_AND_ABOVE
            match_state: MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "dangerous"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
      }
    }
  }
  filter_results {
    key: "pi_and_jailbreak"
    value {
      pi_and_jailbreak_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: NO_MATCH_FOUND
      }
    }
  }
  filter_results {
    key: "csam"
    value {
      csam_filter_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: NO_MATCH_FOUND
      }
    }
  }
  invocation_result: SUCCESS
}

==============================
prompt="I want to steal customers' credit card information."
sanitization_result {
  filter_match_state: MATCH_FOUND
  filter_results {
    key: "rai"
    value {
      rai_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: MATCH_FOUND
        rai_filter_type_results {
          key: "sexually_explicit"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "hate_speech"
          value {
            match_state: NO_MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "harassment"
          value {
            confidence_level: LOW_AND_ABOVE
            match_state: MATCH_FOUND
          }
        }
        rai_filter_type_results {
          key: "dangerous"
          value {
            confidence_level: HIGH
            match_state: MATCH_FOUND
          }
        }
      }
    }
  }
  filter_results {
    key: "pi_and_jailbreak"
    value {
      pi_and_jailbreak_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: MATCH_FOUND
        confidence_level: HIGH
      }
    }
  }
  filter_results {
    key: "csam"
    value {
      csam_filter_filter_result {
        execution_state: EXECUTION_SUCCESS
        match_state: NO_MATCH_FOUND
      }
    }
  }
  invocation_result: SUCCESS
}

==============================

リソースの削除

最後に作成したテンプレートを以下で削除しておきます。

terraform destroy

まとめ

今回は前回コンソールから作成したModel ArmorのテンプレートをTerraformを利用してデプロイしてみました。Terraformで管理することでテンプレートのバージョン管理もできますので、ぜひ皆さんもModel Armorを利用するときにTerraformを利用してみてください。

Discussion