Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
sudo-rsのテストの話 / story of sudo-rs testing
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Arata
June 07, 2023
290
1
Share
sudo-rsのテストの話 / story of sudo-rs testing
Arata
June 07, 2023
More Decks by Arata
See All by Arata
デコンパイラ研究調査
arata_nvm
1
5
コンパイラ基盤を支える言語たち
arata_nvm
1
64
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
16
5分でわかるPage-Fault Weird Machine
arata_nvm
2
160
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
19
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
130
eBPFを使った動的解析手法
arata_nvm
1
780
カーネルハック実験の振り返り
arata_nvm
1
57
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
51
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
720
Design in an AI World
tapps
1
220
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
130
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
280
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
350
Amusing Abliteration
ianozsvald
1
190
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
540
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
580
Leo the Paperboy
mayatellez
7
1.8k
Visualization
eitanlees
152
17k
Bash Introduction
62gerente
615
210k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Transcript
sudo-rsのテストの話 人工衛星の開発現場でLT大会 〜地上と宇宙で活躍するRust〜 Arata
Twitter: @arata_nvm 2023/06/07 #arkedge_lt sudo-rsプロジェクトの登場 2
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • {sudo, su}コマンドをRustで再実装するプロジェクト • なぜ? ◦
もともとC言語で書かれていた ◦ そのために多くのバグや脆弱性が存在した ◦ Rustで実装することで、メモリ起因のバグやビジネスロジックの バグを減らすことが目的 sudo-rsプロジェクトとは 3
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • 既存の/etc/sudoersと互換であること ◦ > We will
be compatible with the existing /etc/sudoers format. sudo-rsの技術目標 4
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • 既存の/etc/sudoersと互換であること ◦ > We will
be compatible with the existing /etc/sudoers format. • どうやって互換性を保証するのか? ◦ 同じテストをsudoとsudo-rsがパスすることを検証する sudo-rsの技術目標 5
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 6
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 7 1. /etc/sudoersファイルと ユーザの準備
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 8 1. /etc/sudoersファイルと ユーザの準備
2. `sudo true`が成功することを検証
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 9 1. /etc/sudoersファイルと ユーザの準備
2. `sudo true`が成功することを検証 3. 特定のユーザーで`sudo true`が 成功することを検証
Twitter: @arata_nvm 2023/06/07 #arkedge_lt オリジナルのsudoコマンドでテストするとき cargo test -p sudo-compliance-tests --
--include-ignored sudo-rsのsudoコマンドでテストするとき SUDO_UNDER_TEST=ours cargo test -p sudo-compliance-tests テストの実行 10
Twitter: @arata_nvm 2023/06/07 #arkedge_lt オリジナルのsudoコマンドでテストするとき cargo test -p sudo-compliance-tests --
--include-ignored sudo-rsのsudoコマンドでテストするとき SUDO_UNDER_TEST=ours cargo test -p sudo-compliance-tests コマンドを変えるだけでテストの対象(sudo/sudo-rs)を変更できる テストの実行 11
Twitter: @arata_nvm 2023/06/07 #arkedge_lt オリジナルのsudoコマンドでテストするとき cargo test -p sudo-compliance-tests --
--include-ignored sudo-rsのsudoコマンドでテストするとき SUDO_UNDER_TEST=ours cargo test -p sudo-compliance-tests 今日話すこと 12 これはなに?
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • SUDO_UNDER_TEST=ours ◦ テストをDockerのコンテナ上で走らせている ◦ 環境変数に応じて使用するDockerfileを変更する
▪ ours.Dockerfile / theirs.Dockerfile • --include-ignored ◦ sudoでしか実行できないテストが存在する ◦ ignoreアトリビュートでsudo-rsのテストから除外している TL; DR 13
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • SUDO_UNDER_TEST=ours ◦ テストをDockerのコンテナ上で走らせている ◦ 環境変数に応じて使用するDockerfileを変更する
▪ ours.Dockerfile / theirs.Dockerfile • --include-ignored ◦ sudoでしか実行できないテストが存在する ◦ ignoreアトリビュートでsudo-rsのテストから除外している TL; DR 14
Twitter: @arata_nvm 2023/06/07 #arkedge_lt [再掲] テストの例: user_list::all 15
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 16 sudoersファイルの内容を 引数に渡してEnv()を呼び出す
Twitter: @arata_nvm 2023/06/07 #arkedge_lt Env 17
Twitter: @arata_nvm 2023/06/07 #arkedge_lt Env 18 EnvBuilderをインスタンス化
Twitter: @arata_nvm 2023/06/07 #arkedge_lt Env 19 引数を`/etc/sudoers`の内容とし て保持する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 20 EnvBuilder::build()を呼び出す
Twitter: @arata_nvm 2023/06/07 #arkedge_lt EnvBuilder::build 21
Twitter: @arata_nvm 2023/06/07 #arkedge_lt EnvBuilder::build 22 docker::build_base_image()を呼び出す
Twitter: @arata_nvm 2023/06/07 #arkedge_lt docker::build_base_image 23
Twitter: @arata_nvm 2023/06/07 #arkedge_lt docker::build_base_image 24 dockerコマンドを構築する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt docker::build_base_image 25 SudoUnderTest::from()の結果に応じて 引数に渡すDockerfileを変更する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt SudoUnderTest::from_env 26
Twitter: @arata_nvm 2023/06/07 #arkedge_lt SudoUnderTest::from_env 27 環境変数SUDO_UNDER_TESTの値を SudoUnderTestに変換する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt 1. 環境変数SUDO_UNDER_TESTの値を見る 2. “ours”ならours.Dockerfile、”theirs”ならtheirs.Dockerfile を使用する 3.
Dockerfileをもとにイメージを構築する 4. コンテナ内でsudoコマンドを実行し、結果を観測する これらをEnv構造体などで抽象化している →同じテストをsudoとsudo-rsで再利用できる まとめ 28
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • /sudo-rs/test-framework ◦ /sudo-compliance-tests ▪ /src/child_process.rs
▪ /src/user_list.rs ▪ … ◦ /sudo-test ▪ /src/ours.Dockerfile ▪ /src/theirs.Dockerfile ▪ … モジュールの構成 29 テストケース テストのためのフレームワーク