設定ファイルを開いて、拒否リストに並べた名前を数えていました。
オンラインの打ち合わせに音声で参加するAIを、社内向けに作っています。会議中に名前を呼ぶと、こちらの資料や業務データベースを調べて、声で返してくる。そういうものです。
答えの精度より先に決めることがありました。何を触らせないか、です。
最初に禁止したのは、書き換えるためのツールでした。危ないのは書き込みだと思っていたからです
拒否リストの先頭に置いたのは、ファイルを書き込むもの、既存の行を編集するもの、ノートブックを書き換えるものです。
続けて、別のAIを起動するもの、外へ通知を送るもの、予約実行を仕込むものを並べました。使えるのは読むためのものだけ。ファイルを開く、中を検索する、名前で探す。この3つに絞りました。
許可したツールの名前は、設定に1行で書いてあります。起動したときにその行に無い名前が現れたら、壁が破れたとみなして黙る。そういう作りにしました。
ここまで書いて、いったん安心しています。
読み取りだけに絞っても、外へ出す道は残ります
残していた読み取り用のツールの中に、任意のURLを取りに来るものがありました。
ページを取ってきて中身を読む。動作としては読み取りです。書き込みは一切しません。ただし、取りに行く先はこちら側で自由に組み立てられます。調べた内容をURLの後ろにつなげて外部へ投げれば、それは読み取りのまま、社内の文字列が外に出たことになります。
読み取り専用は、安全の言い換えではありませんでした。
そのツールは許可しませんでした。設定ファイルのその行に、任意のURLを取れてしまうから入れない、と理由を書いて残してあります。ネット検索のほうは別で、こちらは行き先が検索エンジンに固定されるので解禁しました。
線を引く場所は、触れる範囲ではなく出口でした
それまで私は、権限を「何を読めるか」で設計していました。読める範囲を狭めるほど安全になる、という考え方です。
これが違いました。読める範囲をどれだけ狭めても、外へ出る口がひとつ開いていれば、そこから同じだけ出ていきます。逆に出口を全部塞いでしまえば、読める範囲は広いままでかまわない。
権限の設計は、入口ではなく出口の側で組み直しました。
データベースへの問い合わせは、文頭を見るだけでは足りませんでした。語のほうも見ています
業務のデータベースには、その場で問い合わせを投げて答えます。最初に書いた検査は、文の先頭がSELECT・SHOW・DESCRIBE・EXPLAINのいずれかで始まるものだけを通す、というものでした。
読み取りの構文だから安全、という判断はどこまで通用するのか?
通用しませんでした。SELECTで始まる文の中には、結果をサーバー上のファイルへ書き出す構文が書けます。サーバーのファイルを読み込んで返す関数もあります。時間のかかる処理を差し込んで、応答を止めることもできます。文頭だけを見る検査は、そのどれも止めません。
そこで語の側の拒否リストを足しました。ファイルへの書き出し、読み込みの関数、追加・更新・削除、権限の変更。あわせて、セミコロンで文を継ぎ足せないようにし、ダブルクォートも通さないことにしています。パスワードやトークンといった語を含む問い合わせも、その時点で弾きます。
接続情報は、答える側に持たせていません
AIが動いている側には、データベースの接続先もパスワードも置いていません。持っているのは合言葉だけです。
実際の接続は、こちらのパソコンで動いている別のプロセスが握っています。AIができるのは、そのプロセスに問い合わせを渡して結果を受け取ることだけ。検査もそちら側で行うので、AI側の設定を書き換えても検査は外れません。
ソースも、書き込みできない状態で見せています。
冒頭の拒否リストは、あれから1行だけ増えました。ネット検索を許可した行です。
直していないものが2つ残っています。ひとつは、会議中に固有名詞を聞き違えること。読み間違えた語を書き留めて直す表は用意しましたが、中身はまだ空のままです。実際の会話で崩れた語を見てから足すことにしていて、まだ十分な数が集まっていません。
もうひとつは、接続を握っている側のプロセスが、パソコンを再起動すると消えることです。決まった手順で起動すれば立ち上がりますが、手順を外れると認証が切れて、会議の途中で答えられなくなります。起動の入口をひとつに絞って回避しているだけで、消えること自体はそのままです。
社内のデータをAIに見せるときの権限の切り分けについては、お問い合わせでご相談いただけます。
FAQよくある質問
- Q読み取り専用にしておけば、社内のデータをAIに見せても安全ですか。
- A読み取りに絞るだけでは足りませんでした。任意のURLを取りに行けるツールが1つ残っていると、読んだ内容をURLに乗せて外へ出せます。動作としては読み取りのままです。私は、読める範囲を狭める設計から、外へ出る口を塞ぐ設計へ切り替えました。
- Qデータベースへの問い合わせは、SELECTだけ通せば大丈夫ですか。
- A文頭を見るだけでは足りません。SELECTで始まる文の中に、結果をサーバー上のファイルへ書き出す構文が書けます。サーバーのファイルを読んで返す関数もあります。私のところでは、文頭の検査に加えて語の拒否リストを持たせ、複数の文を継ぎ足せないようにしています。
- Q接続情報はどこに置いていますか。
- AAIが動いている側には置いていません。持たせているのは合言葉だけです。実際の接続は別のプロセスが握っていて、検査もそちらで行います。AI側の設定を書き換えても検査は外れない、という置き方にしています。