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
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
46
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
10
5分でわかるPage-Fault Weird Machine
arata_nvm
2
150
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
15
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
120
eBPFを使った動的解析手法
arata_nvm
1
760
カーネルハック実験の振り返り
arata_nvm
1
53
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
44
コードエディターのシンタックスハイライトの話
arata_nvm
0
220
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Designing Experiences People Love
moore
143
24k
The Spectacular Lies of Maps
axbom
PRO
1
720
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
530
Tell your own story through comics
letsgokoyo
1
900
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.7k
Utilizing Notion as your number one productivity tool
mfonobong
4
300
Information Architects: The Missing Link in Design Systems
soysaucechin
0
900
Six Lessons from altMBA
skipperchong
29
4.2k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.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 テストケース テストのためのフレームワーク