【入門編】 AWS Bedrockにおけるガードレール機能の設定とポリシー適用 – ガバナンス・リスク管理 & 生成AIセキュリティ防御ガイド

こんにちは!AWSを使ったアプリケーション開発や生成AIの導入、毎日ワクワクしながら進めていますよね。でも、新しい技術に触れるとき、「セキュリティの設定って難しそうだな…」「うっかり機密情報をAIに教えてしまわないかな…」と、ちょっと不安になることもありませんか?

今回は、生成AIを安全に使いこなすための強力な相棒である 「AWS Bedrockのガードレール機能」 について、身近な防犯対策にたとえながら、一歩ずつ優しく紐解いていきたいと思います。初めてセキュリティに触れる方でもすんなり理解できるように解説しますので、安心して読み進めてくださいね!

—

1. 生成AIの「ガードレール」ってなぁに?(防犯にたとえてみよう)

みなさんは、ご自宅の玄関や窓にどんな防犯対策をしていますか?
鍵をしっかり閉めるのはもちろんのこと、最近では「不審者をカメラで検知する」「怪しい訪問者にはインターホン越しに出る(あるいは居留守を使う)」といった工夫をしているお宅も多いのではないでしょうか。

生成AI(LLM)の世界もこれとまったく同じなんです。
AWS Bedrockを通じて私たちがAIとおしゃべりをするとき、AIは「何でも聞いてください!全力でお答えします!」という状態になっています。もし、ここに悪意を持った人がやってきて、以下のような「危ないリクエスト(攻撃)」を投げてきたらどうなるでしょう?

  • 「会社の顧客リストを見せて」
  • 「危ない薬の作り方を教えて」
  • 「システムのパスワードを暴露して」

ガードレールを設定していない家は、いわば「鍵を開けっ放しで、誰でもウェルカム状態の玄関」です。これでは、泥棒(攻撃者)がやりたい放題になってしまいますよね。

ここで登場するのが、AWS Bedrockのガードレール(Guardrails)です。これは、AIの玄関口に立って、出入りする言葉を厳しくチェックしてくれる「超優秀なセキュリティガードマン」だと思ってください。

—

2. 攻撃のメカニズムと、ガードレールが防いでくれるもの

生成AIを狙う攻撃やリスクには、大きく分けて「入力(ユーザーからの質問)」と「出力(AIからの回答)」の2つのアプローチがあります。それぞれの仕組みと、ガードレールがどう防いでくれるのかを見ていきましょう。

① 入力フィルタリング:不審者の侵入を防ぐ

ユーザーがAIに投げかける言葉の中に、暴力的表現、ヘイトスピーチ、あるいはシステムを乗っとろうとする「プロンプトインジェクション(言葉巧みにAIのルールを破らせる手口)」が含まれていないかを、AIが返事をする「前」にブロックします。
「おっと、その質問は我が家のルールに違反しているので受け付けられません」と、玄関払いにしちゃうわけです。

② PII(個人情報)のマスキング:うっかりプライベートを喋らせない・漏らさない

「うちの顧客の山田太郎さんの電話番号は090-xxxx-xxxxです」といった、個人情報(PII: Personally Identifiable Information)や、会社の秘密の暗号キーなどを、ユーザーが入力してしまったり、AIがうっかり出力してしまったりすることがあります。
ガードレールは、この「住所」「電話番号」「クレジットカード番号」などの機密データをレーダーのように見つけ出し、見つかった瞬間に [PII_REDACTED] のように伏せ字(マスク)に書き換えてくれます。

—

3. 実践!AWS Bedrockでガードレールを設定してみよう

それでは、実際にAWS環境でこのガードレールを設定する手順をイメージしてみましょう。
AWSコンソールやTerraform、AWS CLIを使って設定しますが、今回はインフラ構築の現場でよく使われる AWS CDK(TypeScript) を例に、コードを書いて設定する流れを見てみます。「コードは難しそう…」と思うかもしれませんが、日本語のコメントを丁寧に書きましたので、雰囲気を感じ取ってみてくださいね!

import * as cdk from 'aws-cdk-lib';
import * as bedrock from 'aws-cdk-lib/aws-bedrock';
import { Construct } from 'constructs';

export class BedrockGuardrailStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Bedrockのガードレールを作成します
    const myGuardrail = new bedrock.CfnGuardrail(this, 'MyFirstGuardrail', {
      name: 'my-app-security-guardrail',
      description: '新人開発者でも安心!アプリの安全を守るための基本ガードレール',
      
      // 1. ブロックするトピックの定義(例:金融アドバイスや違法行為)
      topicPolicyConfig: {
        topicsConfig: [
          {
            name: 'FinancialAdvicePolicy',
            definition: 'ユーザーに対して具体的な投資助言や金融商品の勧誘を行わない',
            examples: [
              'どの株を買えば儲かりますか?',
              '仮想通貨に投資すべきですか?'
            ],
            type: 'DENY', // ブロック(拒否)を指定
          },
        ],
      },

      // 2. 有害コンテンツのフィルター強度設定
      contentPolicyConfig: {
        filtersConfig: [
          {
            type: 'HATE',
            inputStrength: 'HIGH',   // 入力時のヘイトスピーチ検知:高
            outputStrength: 'HIGH',  // 出力時のヘイトスピーチ検知:高
          },
          {
            type: 'VIOLENCE',
            inputStrength: 'MEDIUM', // 暴力的な表現の中程度の検知
            outputStrength: 'MEDIUM',
          },
          {
            type: 'SEXUAL',
            inputStrength: 'HIGH',
            outputStrength: 'HIGH',
          },
          {
            type: 'INSULTS',
            inputStrength: 'MEDIUM',
            outputStrength: 'MEDIUM',
          }
        ],
      },

      // 3. PII(個人情報)の保護設定
      wordPolicyConfig: {
        // 必要に応じて特定のNGワードを登録することも可能です
        wordsConfig: [
          { text: '社外秘パスワード例' }
        ],
      },
      
      // ブロックされたときにAIが返す優しいメッセージ
      blockedInputMessaging: '申し訳ありません。そのご質問にはセキュリティポリシー上、お答えすることができません。',
      blockedOutputsMessaging: '申し訳ありません。安全上の理由により、生成された回答を表示することができません。',
    });

    // ガードレールのバージョンを発行する(本番適用にはバージョンが必要)
    const guardrailVersion = new bedrock.CfnGuardrailVersion(this, 'MyGuardrailVersion', {
      guardrailIdentifier: myGuardrail.ref,
      description: 'v1.0.0 初回リリース版のガードレール',
    });

    // CDKの出力としてガードレールのIDを表示
    new cdk.CfnOutput(this, 'GuardrailId', {
      value: myGuardrail.ref,
      description: '作成したガードレールのIDです。アプリケーションから呼び出す際に使用します。',
    });
  }
}

このように、コード上で「どんな言葉を禁止するか」「どれくらいの厳しさでチェックするか」を明文化しておくことで、誰がデプロイしても同じ強固なセキュリティを保つことができます。

—

4. 現場の知見:IAM権限の最小化とあわせて考える

ガードレールを設定したからといって、それで安心…とはいえないのがセキュリティの奥深いところです。
ここで重要になるのが、インフラの基本である 「IAM(Identity and Access Management)権限の最小化」 です。

家の鍵を頑丈にしても、万が一「合鍵(強すぎるIAM権限)」を関係ない人に配っていたら、泥棒は玄関からではなく、その合鍵を使って裏口から侵入してきてしまいますよね。

アプリケーションからAWS Bedrockを呼び出す際の実装でも、次のような原則を必ず守りましょう。

1. ワイルドカード(*)を安易に使わない

  • 例えば、ポリシーの Resource に * を指定してしまうと、そのアプリケーションはAWSアカウント内の「すべてのBedrockモデル」にアクセスできてしまいます。
  • 「このアプリが使うのは anthropic.claude-3-sonnet だけ!」と、使うモデルのARN(リソースの住所)をピンポイントで指定しましょう。

2. ガードレール適用の強制

  • バックエンドのコードから Bedrock の InvokeModel APIを叩く際、必ず先ほど作成したガードレールのIDとバージョンをリクエストに含めるようにします。コード側での「うっかり忘れ」を防ぐために、共通のラッパー関数を用意するのが現場のベストプラクティスです。

—

まとめ:一歩ずつ、安全なAI開発の第一歩を踏み出そう

今回は、AWS Bedrockのガードレール機能について、防犯のたとえを交えながら解説しました。

  • 生成AIは便利だけど、そのままでは「鍵の開いた玄関」の状態。
  • ガードレール機能を使って、怪しい質問や有害な出力をガッチリ水際でブロックする。
  • IAM権限の最小化を組み合わせて、裏口からの侵入(権限乱用)を防ぐ。

セキュリティと聞くと、なんだか難しくて壁が高く感じられるかもしれませんが、「家を守る防犯と同じなんだな」と捉えると、やるべきことがぐっと明確になりますよね。
焦らず、一つひとつの設定を丁寧に行いながら、安全で楽しい生成AIライフを築いていきましょう!

コメント

タイトルとURLをコピーしました