クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

小さな設定ミスでrootになれてしまう(最小権限)

このレッスンのあとで: 間違いのせいでユーザーが root になれる仕組みと、それを塞ぐ方法を説明することができる。

55分のレッスンコマンド7件Linux 権限昇格のラボ:setuid のバイナリ、sudo のルール、cron のジョブ

何でも開けるインターンの鍵

ある会社が、インターンに小さな仕事を頼みました。サーバの設定ファイルを1つ、編集する仕事です。時間を省くため、管理者はインターンに、あるエディタだけをパスワードなしで sudo で使わせました。

1年後、報告書が出ました。インターンは、いつでも root になれたのです。道は、そのエディタでした。

このレッスンのゴール

メモ

間違いのせいでユーザーが root になれる仕組みと、それを塞ぐ方法を説明することができる。

キーワード

ことばいみれい
権限アカウントがマシンに対して持つ力
最小権限各アカウントに、仕事に要る力だけを与えること
setuid誰が起動しても、所有者の力で動くファイルの設定-rwsr-xr-x
sudoルール誰が何を root として実行できるかを書いた1行
監査既知の間違いの一覧と、システムを見比べること

学生が入力するセルは、このプレビューでは空白です。

たった1つの決まり

注意

見てよいのは、このラボのマシンだけです。あなた専用で、他の人には届きません。許可なく他人のマシンに同じことをするのは、不正アクセス禁止法に反する犯罪です。

setuid は所有者の力で動く

ふつうのプログラムは、起動した人の権利で動きます。setuidのプログラムは、代わりに所有者の権利で動きます。

必要な場合もあります。passwd は、守られたファイルを書き換えなければなりません。でも、誰も意図していない、root 持ちの setuid プログラムは、root になる入口です。

setuid のプログラムを探す

コマンド
find /usr/local/bin /usr/bin -perm -4000 -type f

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

最初の1つを見る

コマンド
ls -l /usr/local/bin/sysfind

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: s の読み方

モード意味
-rwxr-xr-xふつうのプログラム
-rwsr-xr-xsetuid。所有者の力で動く
-rwxr-sr-xsetgid。グループの力で動く

学生が入力するセルは、このプレビューでは空白です。

sudoルールは広すぎることがある

sudoルールには、ユーザー、誰として動くか、どのプログラムかが書かれます。NOPASSWD は、パスワードを聞かない印です。

1つのプログラムだけを許せば安全に聞こえます。でも、そのプログラムが別のプログラムを起動できるなら、安全ではありません。エディタ、ページャ、find は、どれもシェルを起動できます。sudo の中で起動したシェルは、root のシェルです。

intern が sudo で実行できるもの

コマンド
sudo -l -U intern

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ルールそのもの

コマンド
sudo cat /etc/sudoers.d/90-lab-intern

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: 狭いルールと広いルール

ルール危険よりよい形
ops ALL=(ALL) NOPASSWD: ALLパスワードなしで、なんでも root必要な数個のコマンドだけを書く
intern ALL=(root) NOPASSWD: /usr/bin/vimvim はシェルを起動できる1つのファイルは sudoedit で直させる
web ALL=(root) /usr/bin/systemctl restart shop狭い。正確に1つのコマンドそのままでよい

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

「1つのプログラムだけのsudoルールは、狭い」と考える人が多くいます。狭いのは、そのプログラムが別のプログラムを動かせないときだけです。許す前に尋ねましょう。シェルを起動できないか。別のファイルを root で開けないか。

root は実行するスクリプトを信じる

root のcronは、スクリプトを毎分動かします。そのスクリプトを誰でも書き換えられるなら、誰でも root にコマンドを実行させられます。

決まりは単純です。root が実行するファイルは、root が持ち、他の人が書けないこと。置かれているフォルダも大事です。

誰でも書けるファイルを探す

コマンド
find /opt -perm -o+w -type f

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

モード、持ち主、名前

コマンド
stat -c "%a %U %n" /opt/maintenance/cleanup.sh

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

root は本当に実行しているか

コマンド
sudo crontab -l -u root

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

3つの間違いと塞ぎ方

間違い見つけ方塞ぎ方
道具の setuid コピーfind に -perm -4000chmod u-s、またはコピーを消す
広いsudoルールsudo -l と /etc/sudoers.d正確なコマンドを書く、または sudoedit
誰でも書き換えられる、root のスクリプトfind に -perm -o+wchmod 755 にして持ち主を root にする

学生が入力するセルは、このプレビューでは空白です。

もっと先へ

監査をもう一歩広げます。find /opt /usr/local/bin /etc/cron.d -type f -perm /022 を打ちましょう。グループかその他が書けるファイルを、まとめて探す命令です。

出た行ごとに、3つを書きます。誰が書けるか、誰がそれを実行するか、どう直すか、です。

ラボをやって、穴を塞ぐ

ヒント

ラボでは、自分のマシンでこれらの間違いの1つを使い、したことを書きます。まずそれをやってください。そのあとレポートに、上の表を使って、どう塞ぐかを書きましょう。

このラボとソースについて: Linux 権限昇格のラボ:setuid のバイナリ、sudo のルール、cron のジョブ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。