Upgrade to Pro — share decks privately, control downloads, hide ads and more …

任意Pythonコード実行機能でセキュリティを守るため設計例

Avatar for skmochi skmochi
December 04, 2024

 任意Pythonコード実行機能でセキュリティを守るため設計例

Avatar for skmochi

skmochi

December 04, 2024

More Decks by skmochi

Other Decks in Technology

Transcript

  1. © NTT Communications Corporation All Rights Reserved. 
 
 任意Pythonコード実行機能での

    
 セキュリティを守るための設計例 
 2024年12月4日
 NTTコミュニケーションズ株式会社 
 Yuki Sakamoto / Michihiro Naito 
 Cloud Native Security Japan LT祭り 

  2. © NTT Communications Corporation All Rights Reserved. 1 自己紹介
 -

    坂本悠記 / Yuki Sakamoto - NTTコミュニケーションズ株式会社
 - イノベーションセンター テクノロジー部門 - Webサービス開発 - 顧客向けデータ分析案件 
 - 内藤理大 / Michihiro NAITO
 - NTTコミュニケーションズ株式会社
 - イノベーションセンターテクノロジー部門 - プロジェクトリーダー - 開発補佐
  3. © NTT Communications Corporation All Rights Reserved. 2 タイトルの「任意コード実行機能」とは? 


    Go Playground のようにブラウザから任意コード (untrusted code) を実行できる機能をこう呼ぶことにする 他にも色々なサービスで任意コードが実行できる - Cue Playground - Python Sandbox - TypeScript Playground - Python in Excel - codesandbox - vscode.dev - プログラミング学習系サービス - データ分析系サービス - etc...
  4. © NTT Communications Corporation All Rights Reserved. 3 こういうことを試したくなる 


    中のプログラムを覗いてみたり... 全消ししてみたり... dos攻撃用の踏み台にしてみたり... 巨大なファイルを作ってみたり...
  5. © NTT Communications Corporation All Rights Reserved. 4 - クラウドプラットフォーム固有の便利サービス/機能

    - よさげなOSS - networkpolicy, service meshまわり - セキュリティに関する深い知見 (話せない) このLTで話すこと / 話さないこと 
 - 仮想のWebサービス (後述) を題材に、ユーザに任意のPythonコード実行機能を提供する際に考えられる懸念事 項と主にKubernetesを用いたアーキテクチャ面からの対策例を紹介 - クラウドはGoogle Cloudを想定するが、クラウドプラットフォーム固有の便利サービスなどは使わないで進めます 話すこと
 話さないこと 

  6. © NTT Communications Corporation All Rights Reserved. 5 お題: データ可視化のWebサービス

    
 1. ブラウザでサービスにアクセス 2. ログイン 3. データをアップロード 4. グラフの種類を選択 5. 描画ボタンを押す 6. グラフが描画される 使い方の流れ 

  7. © NTT Communications Corporation All Rights Reserved. 7 お題: データ可視化のWebサービス

    
 😎 自分でPythonコードを
 書いて実行したい
 ➡ 難しそう 🤓 デバッグのために
 標準出力もみたい
 😃 大きなサイズのデータも
 扱えるようにしてほしい
 ➡ ✅ サーバ側で計算処理を実行 🤗 ログイン後に過去の
 実行結果もみたい
 ➡ ✅ DBやObject Storageに保存
  8. © NTT Communications Corporation All Rights Reserved. 8 再掲: こういうことを試したくなる

    
 中のプログラムを覗いてみたり... 全消ししてみたり... dos攻撃用の踏み台にしてみたり... 巨大なファイルを作ってみたり...
  9. © NTT Communications Corporation All Rights Reserved. 9 📌 プログラムを読み取られる

    📌 ファイルを書き込まれる 📌 環境変数を読み取られる (Databaseのパスワードなど) 📌 意図しないサービス間通信 (Database, Object Storage, 別microservice) が行われる 📌 踏み台にされインターネットに抜けられる etc… 考えられうるリスク 

  10. © NTT Communications Corporation All Rights Reserved. 10 参考: Go

    Playgroundはどうしているのか? 
 出典: https://go.dev/talks/2019/playground-v3/playground-v3.slide
 gVisorの利用
 ネットワーク機能の
 無効化
 goプログラムの
 コンパイル実行
 バイナリを受け取る
 BEの詳細図 
 アーキテクチャ図 
 各実行単位でコン テナを専有
 予めコンテナを
 起動
 Docker outside of Docker (DooD)

  11. © NTT Communications Corporation All Rights Reserved. 11 ⚠ プログラムを読み取られる

    ✅ ファイルを書き込まれる ⚠ 環境変数を読み取られる (Databaseのパスワードなど) ⚠ 意図しないサービス間通信 (Database, Object Storage, 別microservice) が行われる ✅ 踏み台にされインターネットに抜けられる etc… Go Playgroundの構成をそのまま採用できない (1/2) 
 ✅ 問題なし ⚠ Go Playgroundでは問題ないがお題のサービスでは問題になり得る Go Playgroundはrepoを
 公開しているので問題なし
 Go Playgroundはおそらくシークレット要 素がないので問題なし
 Go Playgroundは
 永続データがないので問題なし

  12. © NTT Communications Corporation All Rights Reserved. 12 Go Playgroundの構成をそのまま採用できない

    (2/2) 
 出典: https://go.dev/talks/2019/playground-v3/playground-v3.slide
 ❌ ホストのDockerデーモンを
 マウントさせたくない
 BEの詳細図 
 アーキテクチャ図 
 ❌ 仮にDinDでも特権が必要 だったりimage cacheが
 効かない問題がある
 🤔 そもそもGKE+gvisor (GKE Sandbox)
 では /var/run のマウントができない
 🤔 DBやStorageへの
 データ保存はどうする?
 ❌ 特権を付与している理由は未確認

  13. © NTT Communications Corporation All Rights Reserved. 13 ベースとするアーキテクチャ案 


    Private Kubernetes Cluster APIサーバー
 Pod
 計算処理
 Job
 Job管理
 Pod
 Database
 Object Storage
 Client LB
 計算処理
 Job
 Redis
 グラフの画像データを保存 csvファイルを取得 ・csvファイルをアップロード ・グラフの画像データを表示 実行結果の保存 計算処理内容のメッセー ジを保存 Cloud Service Network 外部認証認可
 サービス
 User VPC / subnet NAT
 Jobのなかで任意Pythonコードを実行 

  14. © NTT Communications Corporation All Rights Reserved. 14 📌 プログラムを読み取られる

    📌 ファイルを書き込まれる 📌 環境変数を読み取られる (Databaseのパスワードなど ) 📌 意図しないサービス間通信 (Database, Object Storage, 別microservice) が行われる 📌 踏み台にされインターネットに抜けられる etc… 考えられうるリスク 

  15. © NTT Communications Corporation All Rights Reserved. 15 コードのバリデーションを行う 


    Pythonではastモジュールを使った抽象構文木解析でコードのバリデーションを行う 
 ✅ 許可したくないライブラリのimport や 組み込み関数の実行をブロック 🤔 あるライブラリのこのメソッドは許可するけどあれは許可しないとかやり出すと大変
 - 例: import hoge as fuga を使ったパターンの対応をし出すと実装がカオスに...
 🤔 Pythonの解析は一筋縄でいかない (経験則) ので完璧にやり切ることは不可能 だと考えた方がよい - ホスト名やパスワードなどと一致する文字列がコードや標準出力に含まれていた場合は弾くなど割り切った対 策も考えられる Kubernetes Cluster APIサーバー
 Pod
 計算処理
 Job
 Job管理
 Pod
 計算処理
 Job
 実行前にPythonコードの
 バリデーションを行う

  16. © NTT Communications Corporation All Rights Reserved. 16 sidecarでコンテナを分けて必要なデータをPod内のemptyDirで渡すようにする ✅

    Jobを利用したリソース専有 & 使い捨て型の実行環境なのでファイル作成/削除されても問題なし ✅ 実行部分のコンテナはシンプルなコードで済むので中身をみられても問題なし ✅ Databaseなどへのアクセスもメインコンテナで行うのでシークレット情報などはもたなくてよい 🤔 クラウドサービスによるファイルサイズ上限あり (ephemeral storageのlimitに依存) コード実行するコンテナをsidecarで分離する 
 計算処理Job メインコンテナ
 計算コンテナ
 Database
 Object Storage
 実行config
 グラフ画像
 標準出力
 基本的にはPythonコードを
 実行するだけのシンプルなコンテナ
 Redis
 emptyDir
 secret.json
 Tips: 認証はPod単位 (KSAとのbindingなど) では なく、メインコンテナへのシークレット
 情報ファイルのマウントで行うべき
 任意コードではない手法 (棒グラフなど) は
 コンテナを分離しなくてもよい

  17. © NTT Communications Corporation All Rights Reserved. 17 ✅ プログラムを読み取られる

    ✅ ファイルを書き込まれる ✅ 環境変数を読み取られる (Databaseのパスワードなど) 📌 意図しないサービス間通信 (Database, Object Storage, 別microservice) が行われる 📌 踏み台にされインターネットに抜けられる etc… 考えられうるリスクに対処していく (2/2) 

  18. © NTT Communications Corporation All Rights Reserved. 18 コマンド unshare

    --net hoge を用いてネットワークインターフェースのない名前空間で処理を実行させる ✅ 任意コードが実行される名前空間ではネットワーク機能が使えない ✅ 必要なサービスとの通信はメインコンテナが実行する 👍 Dockerfileを書き換えるだけで対応可能 🤔 securityContext.capabilities: NET_ADMIN が必要 (e.g. GKE Autopilotなどでは実行不可) 方法1: 名前空間でネットワーク機能を無効化 
 計算処理Job メインコンテナ
 計算コンテナ
 emptyDir
 Database
 Object Storage
 実行config
 グラフ画像
 標準出力
 secret.json
 コマンド例:
 unshare --net python main.py

  19. © NTT Communications Corporation All Rights Reserved. 19 subnetを分けて計算処理部分ではNATを作らない ✅

    任意コードが実行されるsubnet内ではインターネット通信できない ✅ 同じ事業者内のサービスであればアクセスできる機能があるのでDatabaseなどへはアクセスできる 🤔 クラウドサービスの機能に依存 🤔 Dockerfile変更するよりも手間がかかるかも 方法2: NATを作らない 
 APIサーバー
 Pod
 Database
 Object Storage
 subnet_A NAT
 計算処理
 Job
 subnet_B Job管理
 Pod
 外部認証認可
 サービス
 メイン
 計算
 インターネットアクセス Private Google Access
  20. © NTT Communications Corporation All Rights Reserved. 20 ✅ プログラムを読み取られる

    ✅ ファイルを書き込まれる ✅ 環境変数を読み取られる (Databaseのパスワードなど) ✅ 意図しないサービス間通信 (Database, Object Storage, 別microservice) が行われる ✅ 踏み台にされインターネットに抜けられる etc… 考えられうるリスクに対処していく 

  21. © NTT Communications Corporation All Rights Reserved. 21 - お題のWebサービスで実行されるuntrustedなPythonコード実行による主なセキュリティリスクをあげた

    - それぞれに対してアーキテクチャとしてどう対応していくか、という観点で解決案の一例を紹介した - ここで紹介したものは誰でも採用できるわけではなく、クラウドの場合は各プラットフォームやそのサービスに依存 するので導入前に下調べが必要 まとめ