web-dev-qa-db-ja.com

Sudo vimに一般ユーザーへのアクセスを許可することが危険なのはなぜですか?

新しいユーザーを作成し、彼にSudoアクセスを許可します。具体的には、Sudo vimとhttpd.confを編集します。私はこれをsudoersで書いた:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

しかし、これは危険だと聞いた。これはなぜ問題があるのですか?問題はどのくらい深刻ですか?

30
mi0pu

コマンドライン引数を制限しますが、ユーザーがrootとして実行されると、ユーザーがvimを使用してランダムファイルを開いて編集して上書きすることを妨げるものはありません。

ユーザーは_Sudo vim /etc/httpd/conf/httpd.conf_を実行してから、

  • 編集バッファーからそのテキストをすべてクリアします
  • 次に、便宜上、既存のファイルをソースします(これは必須ではありませんが)。たとえば、Sudo構成
    _:r /etc/sudoers_注:SELinuxによる制限がない限り、ユーザーはanyファイルをこの方法で読み取ることができます!
  • 自分にSudo権限をさらに付与するuser ALL=(ALL) NOPASSWD: ALL
  • 古い構成を上書き_:w /etc/sudoers_

ユーザーがシステムにアクセスしたり、システムを変更したり、破壊したりできる同様の方法が何十もあると想像できます。

SudoログメッセージでApache設定を編集しているだけなので、この方法で変更されたファイルは監査証跡もありません。これは、Sudo特権を編集者に付与する際のセキュリティ上のリスクです。

これは多かれ少なかれ、tarunzipなどのコマンドにSudoルートレベルの権限を付与することが安全でないことが多い理由と同じであり、アーカイブにシステムバイナリまたはシステム構成ファイルの置換を含めることを妨げるものはありません。


他の多くのコメンテーターが指摘している2番目のリスクは、vimシェルエスケープを許可することです。この場合、vim内からサブシェルを開始して、任意のコマンドを実行 。 Sudo vimセッション内から、これらはrootとして実行されます。たとえば、シェルエスケープです。

  • _:!/bin/bash_はインタラクティブなルートシェルを提供します
  • _:!/bin/rm -rf /_は、パブで良い物語を作ります。

代わりに何をしますか?

引き続きSudoを使用して、ユーザーが所有していないファイルを安全な方法で編集することを許可できます。

Sudoers構成では、特別な予約済みコマンドsudoeditを設定し、その後にユーザーが編集できるファイルへの完全な(ワイルドカード)パス名を指定できます。

_user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
_

ユーザーは、Sudoコマンドラインで_-e_スイッチを使用するか、sudoeditコマンドを使用できます。

_Sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
_

man page で説明されているように:

-e (edit)オプションは、コマンドを実行する代わりに、ユーザーが1つ以上のファイルを編集したいことを示します。コマンドの代わりに、文字列「sudoedit」がセキュリティポリシーを参照するときに使用されます。
ユーザーがポリシーによって承認されている場合、次の手順が実行されます。

  • 一時的なコピーは、編集されるファイルから作成され、所有者は呼び出し元のユーザーに設定されます。
  • ポリシーで指定されたエディターが実行され、一時ファイルが編集されます。 sudoersポリシーは、Sudo_EDITOR、VISUAL、およびEDITOR環境変数を(この順序で)使用します。 Sudo_EDITOR、VISUAL、EDITORのいずれも設定されていない場合、エディターにリストされている最初のプログラム sudoers (5)オプションが使用されます。
  • 変更されている場合、一時ファイルは元の場所にコピーされ、一時バージョンは削除されます。
    指定したファイルが存在しない場合は作成されます。
    Sudoで実行されるほとんどのコマンドとは異なり、エディターは呼び出し側のユーザーの環境を変更せずに実行されます。何らかの理由で、Sudoが編集されたバージョンでファイルを更新できない場合、ユーザーに警告が表示され、編集されたコピーは一時ファイルに残ります。

sudoers マニュアルには、RESRICTおよびNOEXECオプションを使用して限定されたシェルエスケープに対する保護を提供する方法に関するセクション全体が含まれています。

restrictユーザーに任意のコマンドの実行を許可するコマンドへのアクセスを許可しないでください。多くのエディターにはシェルエスケープが無効になっている制限付きモードがありますが、sudoeditはSudo経由でエディターを実行するための優れたソリューションです。 Shellエスケープを提供するプログラムの数が多いため、ユーザーを制限しない一連のプログラムに制限することは、多くの場合機能しません。

そして

noexec
共有ライブラリをサポートする多くのシステムは、環境変数(通常はLD_PRELOAD)を代替共有ライブラリにポイントすることにより、デフォルトのライブラリ関数をオーバーライドする機能を備えています。このようなシステムでは、Sudoのnoexec機能を使用して、Sudoによって実行されるプログラムが他のプログラムを実行しないようにすることができます。注、_... ..._
コマンドのnoexecを有効にするには、上記のユーザー仕様セクションで説明されているようにNOEXECタグを使用します。ここでもその例です:
_aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi_
これにより、ユーザーaaronは、noexecを有効にして_/usr/bin/more_および_/usr/bin/vi_を実行できます。これにより、これらの2つのコマンドが他のコマンド(シェルなど)を実行するのを防ぎます。

60
HBruijn

この構成により、そのユーザーはそのファイルを編集できます。そのために、彼はroot権限でvimエディターを起動します。

vimコマンドが開始されると、ユーザーはそのエディターで好きなことを何でもできます。 -彼は別のファイルを開いたり、vimからシェルを起動したりすることもできます。

したがって、ユーザーはシステム上で任意のファイルを表示および編集したり、任意のコマンドを実行したりできるようになります。

5
michas

セキュリティロック

lessvivimmoreなどの一部のプログラムでは、他のプログラムをシェルコマンドから実行できます。これはシェルエスケープと呼ばれます。または、コマンドインタープリタにエスケープします。このような場合、NOEXECを使用して、一部のプログラムが他のプログラムの特権を実行できないようにすることができます。例:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

これにより、ユーザーはvimなどを実行しているシステム上の任意のファイルを編集して特権表示できますが、エスケープコマンドインタープリターvimからの特権で他のプログラムを実行する可能性は無効になります。

重要なことに、Sudoには、プログラムの実行の標準出力(STDOUT)をユーザーのホームディレクトリ外のファイルにリダイレクトするなど、危険なタスクを防ぐことができるいくつかのセキュリティロック(デフォルト)が含まれています。

ファイル/etc/sudoersで定義されている場合、ユーザーは特権/usr/bin/vimで実行できます。つまり、次のようなものです。

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

Sudoは、定義された通常のユーザーが/usr/bin/vimを次の方法で実行できるようにします。

Sudo /usr/bin/vim
Sudo vim

ただし、次のようにvimを実行できないようにします。

cd /usr/bin
Sudo ./vim
5
Pawan Kumar

簡単な答え:

以下はVimコマンドです:

:Shell

これでルートシェルができました。

4
Wildcard

考えられるセキュリティの改善の1つは、次のものを置き換えることです。

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

代わりに、ユーザーにSudo rvim /etc/httpd/confs/httpd.confを実行してもらいます。

Vimは、-Zコマンドラインオプションで、またはrvimとしてプログラムを起動することでトリガーされる制限モードをサポートしています。制限付きモードを有効にすると、「外部シェルを使用するすべてのコマンドが無効になります」。このアプローチは、ユーザーが:split file exコマンドを使用して他のファイルを開くのを防ぐことはできませんが、少なくとも:!rm -rf /のような意図的に悪意のあるシェルコマンドを防ぐことはできます。

1
Johann

私は HBruijnの答え に同意します。rootとしてvimを実行すると、実際にシステムが非常に広く開かれるため、sudoeditの方がより安全なソリューションです。

しかし、それでも、システムはおそらくまだオープンです。少なくとも、root権限を持つ一部のApacheプロセスがその構成に基づいて起動されると想定しています。外部プログラムを実行するようにApacheを構成するには、100万通りの方法があります。一例として、パイプ引数を CustomLog ディレクティブに検討します。マニュアルは明確に述べています:

セキュリティ:

プログラムが使用されている場合は、httpdを開始したユーザーとして実行されます。サーバーがルートによって起動された場合、これはルートになります。プログラムが安全であることを確認してください。

明らかに、ユーザーが設定を作成できる場合、ユーザーはそのプログラムを好きなように変更できます。シェルスクリプトを実行して、さらに権限を付与するもの。

このため、最近、通常のユーザーとして実行されているにもかかわらず、Apacheが特権ポートにバインドする特別な機能を取得できるように、機能を使用する方法を一緒にハッキングしました。そうすれば、ユーザーは設定を編集したりサーバーを起動したりすることができ、ほとんど安全です。唯一の問題は、任意のIP上の任意のプロセスをバインドできることです。彼らはおそらくシステムのsshdをクラッシュさせる方法を見つけ、ルートパスワードを取得するために独自のバージョンを起動する可能性があるため、ある程度の信頼が残っています。

0
MvG

もちろん、それはまったく安全ではありません。 sudoeditの前に述べたように、これは最も簡単で適切な方法です。

私が追加したいのは、vimがシェルの起動を許可することです。これにより、システムファイルを編集できるだけでなく、シェルを起動して好きな場所で実行できるようになります。

Vimを起動して:shと入力してみてください

0
Lauskin

sudoedit {.../whatever.conf}はセキュリティリスクになる可能性があります。

シェルスクリプトを作成する/tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

このスクリプトを設定ファイルで呼び出します。私はこのアプローチが機能しているいくつかの例を知っています:

samba-> log nt token command

log nt token command = /tmp/make_me_root.sh

syslog-ng-> プログラム:外部アプリケーションへのメッセージの送信

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache-> CustomLog

CustomLog "|/tmp/make_me_root.sh"

私はこのリストを無限に拡張できると思います。

サービスを再起動するだけです。もちろん、いったんrootになると、トレースをぼかすためにそのような構成行を元に戻します。

0