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
1
130
sudo-rsのテストの話 / story of sudo-rs testing
Arata
June 07, 2023
Tweet
Share
More Decks by Arata
See All by Arata
コードエディターのシンタックスハイライトの話
arata_nvm
0
87
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
35
TableGenの言語サーバーをつくる
arata_nvm
0
480
pwn入門 / introduction to pwn
arata_nvm
1
2k
TableGenと和解せよ / make peace with TableGen
arata_nvm
0
85
ソースコードリーディングはいいぞ / source code reading is good
arata_nvm
0
53
ネットワーク委員会活動報告 / network committee activity report
arata_nvm
0
16
Twitter専用のPCを作る / create a dedicated Twitter PC
arata_nvm
0
39
日中の電子決済システムの比較と分析 / comparison and analysis of Japanese and Chinese electronic payment systems
arata_nvm
0
68
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
427
64k
Gamification - CAS2011
davidbonilla
80
5.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
How to Ace a Technical Interview
jacobian
276
23k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
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 テストケース テストのためのフレームワーク