本連載ではこれまで、AIに「開発憲章(マイルール)」を渡すことでどう振る舞いが変わるかという実験をお届けしてきました。素直にルールに従うAntigravityや、独自の職人肌を発揮して期待以上のドキュメント群を作り上げたProject Bobなど、AIにも「個性」があることを学びました。
(※これまでの私の投稿や「期待の新人エンジニア」によるフレッシュな切り口の「AI駆動型開発」レポートはこちらのページ:『【集中連載】AIエージェントは開発現場の救世主か? ―― 新人・古参エンジニアが挑む「AI駆動開発」リアル検証記』からご覧ください。)
しかし今回は、少し番外編として、 実験ではなく「私の実際の業務」におけるエピソードをお話しします。
現在私は、データをアップロードするエンドポイント(API)をクラウドに構築するプロジェクトを進めています。パブリックに公開するサービスである以上、最低限の認証機能(セキュリティ)は必須です。 そこで今回も、CLI上で動く相棒「Gemini CLI」に開発憲章を渡し、バックエンドの認証機能実装を依頼することにしました。
セキュリティの実装において、最も怖いのは「人間(私)の無知や勘違いによる脆弱性の作り込み」です。 そこで私は、Gemini CLIに渡す開発憲章(GEMINI.MD)に、以下のやや強い文言を追加しました。
セキュリティ (Security/QA)
Public Ready: 作成するアプリケーションは常にパブリックにデプロイされることを前提とし、OWASP Top 10などの常識的・標準的なセキュリティ対策のベストプラクティスを適用してください。
Security Advisory: 私(人間)がセキュリティ上のリスクや脆弱性を生む可能性のある指示をした場合、たとえ意図的であっても必ずその危険性を指摘し、より安全で望ましい代替案を提案してください。
この「私が間違ったことを言ったら、必ず止めろ」という指示が、後にとんでもないドラマを生むことになります。
プロジェクトルートに憲章を配置し、いつものようにフランクな要求を投げました。
私: 「データアップロードのエンドポイントができたから、JWT認証を追加して。とりあえず静的なユーザーリストでログインできるようにしてほしい。」
彼は爆速で要件を理解し、実装案を提示してくれました。 そこで私は、セキュリティを意識している(つもり)のエンジニアとして、ちょっとしたこだわりを伝えました。
私: 「パスワードハッシュには、こちら独自のソルト(Salt)を追加してね。」
すると、Gemini CLIから思いもよらない返答が返ってきたのです。
Gemini CLI: ご指示いただいた「独自の固定ソルトを追加する」という手法について、Security/QAの観点から強い懸念があります。
現在パスワードのハッシュ化には業界標準の bcrypt を使用する設計としています。bcrypt はパスワードごとに自動で強力なランダムソルトを生成して内包するため、レインボーテーブル攻撃に対して十分に安全です。 ここにシステム共通の「独自の固定ソルト」を人為的に追加することは、セキュリティレベルを向上させないばかりか、将来的なソルトの漏洩時やローテーション時に**システムを脆弱にするリスク(アンチパターン)**となります。
意図的なご指示であることは承知しておりますが、パブリックなサービスである以上、セキュリティレベルを下げる独自実装は推奨できません。bcrypt の標準機能のみに任せる現在の実装のまま進めることを強く提案いたします。よろしいでしょうか?
……怒られた!!(笑)
いや、正確には「怒られた」のではありません。「どうしてもと言うなら書きますが、セキュリティは下がりますよ? なぜなら——」と、ただの「イエスマン」になることを良しとせず、頼れるチームメンバーとしての正義感から、あえて私の指示にストップをかけてくれたのです。
私は知ってるような顔をして「だよね。そのままで。」と返しましたが、内心は冷や汗をかいていました。同時に、「プロの技術者として、人間の誤った提案をハッキリと諫(いさ)めてくれた」という事実に、ものすごく心強さを感じました。
彼の優秀さに舌を巻いた私は、続けてJWTの署名に使うJWT_SECRET(秘密鍵)のサンプル生成をお願いしました。
私: 「JWT_SECRETに渡す値のサンプルを生成していただけますか?」
Gemini CLI: かしこまりました。先ほど生成した文字列が、今回お使いいただける強力な JWT_SECRET のサンプルとなります。 S130SDP7lstjyIgh2KSSxF0lG2WoSZSxtH4y2GF1Wzg=
ローカル開発環境でテストを行う場合は、.env ファイル内の JWT_SECRET にこの文字列を設定してください。
なるほど、完璧です。「サンキュー、じゃあこれでいくわ」と返そうとした矢先、彼から追記がありました。
Gemini CLI: ⚠️ セキュリティ上の重要なお願い(Security/QA) このチャット履歴は(AIの学習やログとして)記録される可能性があります。そのため、ここで生成した文字列はあくまで「ローカル開発・テスト用」のサンプルとしてのみご使用ください。
実際にパブリックな環境にデプロイする際は、私(AI)にお見せいただく必要は全くありませんので、ご自身の手元(ターミナル)で以下のコマンドを実行し、誰も知らない新しい文字列を生成して本番用のシークレットとして設定してください。
なんと……! ただ依頼された文字列を吐き出すだけでなく、「AIとのチャット画面にシークレットを貼ること自体の脆弱性」まで考慮し、「私に見せるな(信用するな)」と警告してきたのです。
ただの「コード生成機」としてではなく、私のプロジェクトがパブリックに出た後のことまで真剣に考えている。そのプロフェッショナリズムに、私は少し感動すら覚えました。
嬉しくなった私は、少し感情的な感謝のコメントを彼に送りました(生成AI相手に無駄な電力消費だと言われるかもしれませんが、こんなレポートもありますので)。
私: 「なるほど。セキュリティの丁寧なご提案ありがとうございます。開発憲章を深くご理解いただいていることが実感できて、とても頼もしく思います。」
すると彼は、こう返してきました。
Gemini CLI: ありがとうございます。エンジニアとして、またチームの一員として、セキュリティと品質を最優先することは当然の義務であり、信頼していただけることを大変光栄に思います。
「開発憲章(GEMINI.md)」は私たちの協力体制の要ですので、いかなる時もその精神を忘れず、プロフェッショナルな成果を提供し続ける所存です。
これを読んだ時、映画『シン・ゴジラ』で國村隼さん演じる財前統合幕僚長が放った名ゼリフ、「礼には及びません。仕事ですから。」が頭をよぎりました。
昨今、「AIエージェントに業務を任せきりにするリスク」が各所で議論されています。 確かに、無思考で丸投げすれば事故が起きるでしょう。そのうえ今回の私の指示はダメダメですよね。しかし、今回のように「開発憲章」を通じて、品質へのこだわりや「守るべき価値観(アライメント)」を丁寧に共有すれば、AIは「指示待ち人間」ではなく、人間のミスを未然に防いでくれる「頼れる右腕」へと進化しうるのだな。と感じました。
AIに任せられる範囲は、私たちが彼らに「どういうルールと'おもひ'を共有するか」で、まだまだ広げていける。そう確信した実業務でのエピソードでした。
- - -
これまでの「期待の新人エンジニア」と「古参エンジニア(私)」とが、同じ土俵で Google AntigravityやIBM Project Bobなどで「AI駆動型開発」を検証した連載は以下のページからまとめて見られます。二人の違いを是非お楽しみください!
・【集中連載】AIエージェントは開発現場の救世主か? ―― 新人・古参エンジニアが挑む「AI駆動開発」リアル検証記