実行権限のないファイルをrootユーザーでも実行できない理由
試した環境
以下のような権限が何もないシェルスクリプトを作成して、rootで実行してみた所、このような結果になりました。
# hoge.shの中身 echo 'hogeeeeee!!'
root@test~# ls -l ---------- 1 root root 15 4月 12 00:07 hoge.sh root@test~# ./hoge.sh -bash: ./hoge.sh: 許可がありません
rootユーザーってなんでもできる最強のユーザーじゃなかったのかよ?と思いながら挙動について調べてみました。
以下の記事の一番目の回答を訳しつつ、できるだけわかりやすく単語の説明などを加えてまとめました。 unix.stackexchange.com
rootユーザーがなんでもできるとは?ケーパビリティについて
rootユーザってなんでもできるイメージがありました。 そのなんでもできるって具体的にどういった状態なのでしょうか。 Linuxにはrootが持っている絶対的な権限を細かく分け,必要な権限だけを与える仕組みが存在します。 その仕組みをケーパビリティと呼びます。rootは全てのケーパビリティを持っている状態、つまりなんできる状態です。
ファイルアクセスのケーパビリティ CAP_DAC_OVERRIDE
今回の状況に関係するケーパビリティは CAP_DAC_OVERRIDE
です。
CAP_DAC_OVERRIDE
はファイルの読みこみ、書き込み、実行の権限チェックをバイパスするケーパビリティです。
ちなみにバイパスとは迂回という意味で、上記の場合だとファイルへのアクセス(読み込み、書き込み、実行)の権限チェックを回避するという意味になります。
権限チェックを回避することでファイルへのアクセスの権限が上書きされ、なんでもできる状態になるのですが、例外もあります。
実行権限のないファイルを実行する際は例外です。このことはファイルに対するアクセスをチェックするgeneric_permission (fs/namei.c)のコメントに書かれています。
読み書きのDAC(訳注:DAC = "discretionary access control"の略で、任意アクセス制御と呼ばれる)は常に上書き可能です。実行のDACは少なくとも1つの実行ビットがセットされているときに上書き可能です。
つまりls -l
した時にx
が一文字もない場合、rootユーザーであったとしても実行できないのです。
これは通常実行しないような、テキストファイル、画像などを誤って実行しエラーを出さないための仕様だと考えられます。
まとめ
rootユーザーでも実行権限のないファイルは実行できないので、適切な権限を付けて実行しましょう!
ケーパビリティの単語の説明で使わせていただきました。 第42回 Linuxカーネルのケーパビリティ[1]:LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術|gihyo.jp … 技術評論社