ググってもググっても情報が出てこない。まぁたぶんセキュリティ的にあまり良くないから誰もしないんだろうね。無理やりな回避策だけど、一応実装できたので備忘。
やりたいこと
一般ユーザーでsudoを使ってファイルの所有権を変更したい(例えばApacheが生成したApacheユーザー所有のファイルなど)
というのが今回のご要望。以下のようにフル権限与えるともちろん可能だが、これだとrootファイルの所有者を変えられて、何でも見れるし、何でも変更できてしまう。
$ visudo
test-user ALL=(ALL) /bin/chown
さすがにコレだとまずいので、特定のディレクトリ配下のみ、「chown」コマンドが実行できるようにしようとした。
試験内容とNGパターン
とりあえず前提条件
- 「NOPASSWORD」でパスワード入力を省略
- コマンドは絶対パスで書かないと駄目なので「/bin/chown」
- コマンドの後ろには引数を入れることが可能(*も可)
$ visudo
test-user ALL=(ALL) NOPASSWD:/bin/chown /path/to/test-user/*
とりあえず試してみると、「パスワード入力求められる」そして、権限が無いよって怒られる。
$ sudo /bin/chown root:root /path/to/test-user/dir
[sudo] test-user のパスワード:
ユーザー test-user は'/bin/chown root:root /path/to/test-user/dir' を root として hoge-sv 上で実行することは許可されていません。すみません。
謝られてもwww もちろん、引数の部分を削除すると問題なく実行できる。
で、色々試した結果、下記は全部駄目だった。
$ visudo
test-user ALL=(ALL) NOPASSWD:/bin/chown /path/to/test-user/
test-user ALL=(ALL) NOPASSWD:/bin/chown /path/to/test-user/*
test-user ALL=(ALL) NOPASSWD:/bin/chown *:* /path/to/test-user/
test-user ALL=(ALL) NOPASSWD:/bin/chown *:* /path/to/test-user/*
test-user ALL=(ALL) NOPASSWD:/bin/chown root:root /path/to/test-user/
test-user ALL=(ALL) NOPASSWD:/bin/chown root:root /path/to/test-user/*
試験結果とOKパターン
わかったこと、まとめ
- sudoのコマンドは引数を含めた1行が繋がっているかCHKしてるので、間に所有者などを入れると許可コマンドとして認識してくれない
- 「:」は文字列認識させる必要があるので、「¥」でエスケープする
上記から、以下のようなパターンだと正常に動作する
- 存在するユーザーを「user1,2,3…」、存在するグループを「gourp1,2,3…」とする
- 考えられるパターンを全て記載(※上手くやる方法があるかもしれない)
$ visudo
test-user ALL=(ALL) NOPASSWD:/bin/chown user1 /path/to/test-user/*
test-user ALL=(ALL) NOPASSWD:/bin/chown user2\:group1 /path/to/test-user/*
上記設定をしたあと、下記のように実行ができる。
## OKコマンド
$ sudo /bin/chown user1 /path/to/test-user/dir
$ sudo /bin/chown user2:group1 /path/to/test-user/dir
## NGコマンド
$ sudo /bin/chown user1:group1 /path/to/test-user/dir
注意事項まとめ
- 再帰的に一括変更したい場合のオプション「-R」は最後につけないとダメ
## OKコマンド
$ sudo /bin/chown user1 /path/to/test-user/dir -R
## NGコマンド
$ sudo /bin/chown user1 -R /path/to/test-user/dir
- この設定、最大の欠点。実は全然セキュリティ的に解決できていない ということ。ここまで読んでくれていることを祈るw
## こんなことができてしまうの
$ sudo /bin/chown user1 /path/to/test-user/dir /root
「*」を使っているんだから、そりゃそーなんですよ。ただ「*」が無いと指定したパス以外変更ができないんですよね。。。知識ある人だと突破されちゃうので注意、分かってない人だったらいい(?)かもやけど、タブ連打とかで意図せず入れてしまうということもあり得ると思う。
神業がある人是非教えてくださいw
コメント