シェルエスケープ
こんばんは
今に始まったことではないんですが、 サーバーセキュリティの考え方のひとつにRBAC*1という考え方があります。
最小限のアクセス、最小限の権限。 つまり、必要な人に必要な権限のみ与えるという考え方です。
これを実現するためによく利用されるのが、Linuxのsudo機能なんですが、、、 安易に運用者にエディタやページャを許可してしまうと、root権限を与えてしまいかねないんです。
/etc/hosts のファイルを運用者用のユーザーが更新する という状況を考えてみます。
実現方法は以下の3パターンが考えられます。
1."sudo vi /etc/hosts"を許可する
⇒これだと…viモードになった後に ":sh" を入力すると、特権昇格できちゃうんですよ。もし、これでやるならsudoersファイル内の該当エントリーのところにNOEXECオプションを付けるようにしてください。そうすると、特権昇格したviモードから子シェルの呼び出しができないのでシェルエスケープができないというわけです。
"sudo vi" を実行したときのプロセスはrootとなる図
2."sudo su -"を許可して、特権昇格する
⇒vi でファイル更新したいだけなのに、root権限を与えるのはやりすぎっちゅう話です。RBACのポリシーに反する
3."sudoedit /etc/hosts"でファイルを更新する
⇒こういう方法があるんですよ!これだと、特権昇格することもなく更新ができるというわけなのでございます。厳密にはtmp内にファイルの更新をして、実体ファイルに上書きするという内部ロジックになっています。
"sudoedit /etc/hosts" を実行したときのプロセスは一般ユーザー(user01)となる図
~おしまい~