何でも開けるインターンの鍵
ある会社が、インターンに小さな仕事を頼みました。サーバの設定ファイルを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-x | setuid。所有者の力で動く |
| -rwxr-sr-x | setgid。グループの力で動く |
学生が入力するセルは、このプレビューでは空白です。
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/vim | vim はシェルを起動できる | 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 -4000 | chmod u-s、またはコピーを消す |
| 広いsudoルール | sudo -l と /etc/sudoers.d | 正確なコマンドを書く、または sudoedit |
| 誰でも書き換えられる、root のスクリプト | find に -perm -o+w | chmod 755 にして持ち主を root にする |
学生が入力するセルは、このプレビューでは空白です。
もっと先へ
監査をもう一歩広げます。find /opt /usr/local/bin /etc/cron.d -type f -perm /022 を打ちましょう。グループかその他が書けるファイルを、まとめて探す命令です。
出た行ごとに、3つを書きます。誰が書けるか、誰がそれを実行するか、どう直すか、です。
ラボをやって、穴を塞ぐ
ヒント
ラボでは、自分のマシンでこれらの間違いの1つを使い、したことを書きます。まずそれをやってください。そのあとレポートに、上の表を使って、どう塞ぐかを書きましょう。