Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
320
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
sudo-rsのテストの話 / story of sudo-rs testing
Arata
June 07, 2023
Transcript
29 slides
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 テストケース テストのためのフレームワーク
More Decks by Arata
See All by Arata
Black Hat USA 2026の面白かった発表を紹介
arata_nvm
1
31
Operating Systems: Three Easy Pieces, Chapter 49 / Sun's Network File System (NFS)
arata_nvm
0
29
デコンパイラ研究調査
arata_nvm
1
60
コンパイラ基盤を支える言語たち
arata_nvm
1
150
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
55
5分でわかるPage-Fault Weird Machine
arata_nvm
2
500
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
40
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
220
eBPFを使った動的解析手法
arata_nvm
1
900
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
529
40k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.2k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
400
Automating Front-end Workflow
addyosmani
1370
210k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
GraphQLとの向き合い方2022年版
quramy
50
15k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
830
Statistics for Hackers
jakevdp
799
230k