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


30

新しいユーザーを作成し、sudoアクセスを許可したいと思います。具体的には、sudo vimhttpd.conf を使用および編集してもらいます。私はこれをsudoersで書きました:

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

しかし、これはリスクが高いと聞いた。なぜこれが問題なのですか?問題はどの程度深刻ですか?


16
たとえば、コマンドを実行すると、コンピューター上のすべてのファイルに対する読み取りおよび書き込みアクセス権がユーザーに付与されます。に入るとvim、ユーザーは好きなファイルを自由に開いて書き込むことができます。
John1024

4
余談ですが、新しいグループを作成して、へのアクセスが必要なユーザーを追加できます/etc/httpd/confs/httpd.conf。次に、を使用chgrp [OPTION] GROUPNAME FILEしてのグループ所有権を変更し/etc/httpd/confs/httpd.confます。groupadd vimportant新しいグループを作成し、chgrp -v vimportant /etc/httpd/confs/httpd.confグループの所有権を変更するようなものです。yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin

4
回答に記載されているすべての問題のため、sudoには、ユーザーが独自の特権で実行されているエディターでファイルを編集できるようにする方法が含まれていることに注意してください。sudoersmanページで「安全な編集」を探してください。
ミチャウポリトウスキ

2
(私が言っていることが正しいかどうかわからない)sudovimへのアクセスを許可しているので、ユーザーはvimをrootとして使用できます。vimでは、UNIXコマンド(Vim内からUnixコマンドを実行する方法)を実行できるため、ユーザーはuseradd <myuser>rm -rf /またはその他の多くのことを実行できます。
フェドルキ

6
これはある種の間違った質問です。あらゆる種類の昇格された特権の付与を検討する場合、「これが危険である理由を考えない限り、これを実行します」と考えたくありません。あなたは「安全だと自分自身に証明できない限り、これをやらない」と考えたいと思うでしょう。
ネイト・エルドリッジ

回答:


60

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

ユーザーは実行sudo vim /etc/httpd/conf/httpd.conf してから

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

ユーザーがシステムにアクセス、変更、または破壊できるようになった同様の方法が多数想像できます。

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

これは、次のようなコマンドにsudoのルートレベルの権限を付与する理由多かれ少なかれ同じ理由であるtarunzipあなたはシステムバイナリまたはアーカイブ内のシステム構成ファイルの置き換えを含むから、安全でないことが多いです、何もないようにします。


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

ユーザーは-e、sudoコマンドラインでスイッチを使用するか、sudoedit次のコマンドを使用できます。

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

manページで説明されているように:

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

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

また、このsudoersマニュアルには、とオプションを使用してシェルエスケープに対する制限付き保護を提供する方法についてのセクション全体がRESRICTありNOEXECます。

restrict ユーザーが任意のコマンドを実行できるコマンドへのアクセスをユーザーに許可しないでください。多くのエディターには、シェルエスケープが無効になっている制限モードがありますが、sudoeditは、sudoを介してエディターを実行するより良いソリューションです。シェルエスケープを提供するプログラムが多数あるため、ユーザーをそうでないプログラムのセットに制限することは、多くの場合実行不可能です。

そして

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


私はそれを知りませんでしたしsudo tarsudo unzip問題も引き起こしました。ありがとうございました。
mi0pu

5
いい答えだ。vim内からシェルにエスケープすることも記載されているとさらに良いでしょう。シェルに入ったら、それはすべて無料です。それでも、ログに表示されるのは、ユーザーがApache構成ファイルを編集しているということだけです。
CVn

2
さらに?vimを使用している場合:!rm -rf /、「おっと!」
ウェインワーナー

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcそしてブーム。tarへのルートアクセスは脆弱性です。
Qix

1
@MichaelKjörlingそれは私が期待していた答えです:sh、それからブーム、ルートシェル
クリーク

5

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

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

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


「この構成では、すべてのユーザーがそのファイルを編集できます」とはどういう意味ですか?「ユーザー」には特別な意味がありますか?
mi0pu

おっと、注意を払っていない。答えを修正しました。
michas

5

セキュリティロック

例えばのようないくつかのプログラム、lessvivimとはmore、他のプログラムがシェルコマンド-どのようなシェルエスケープとして知られているか、コマンドインタプリタにエスケープされてから実行することができます。このような場合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

2
これは回答または切り取りと貼り付けのエラーですか?
ジェイソンライアン

1
そのほとんどは質問とは関係ありません。
Hauke Laging


1

セキュリティの漸進的な改善の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 fileexコマンドを使用して他のファイルを開くことを防ぐことはできませんが、少なくとものような意図的に悪意のあるシェルコマンドを防ぐ必要があります:!rm -rf /


1
残念ながら、これも100%安全ではありません。ユーザーが/ etc / sudoersを編集してシステム上で全能になるように管理している場合、rootとして任意のコマンドを実行できます。
vurp0

0

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

しかし、それでも、システムはかなりオープンのままです。少なくとも、root特権を持つ一部のApacheプロセスがその構成に基づいて起動されると想定しています。外部プログラムを実行するようにApacheを設定する方法は数百通りあります。一例として、CustomLogディレクティブへのpipe引数を考えてみましょう。マニュアルでは明示的に次のように述べています。

セキュリティ:

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

明らかに、ユーザーが構成を記述できる場合、ユーザーはそのプログラムを好きなものに変更できます。たとえば、シェルスクリプトを実行して追加のアクセス許可を付与するプログラムなどです。

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


0

でも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コマンド

log nt token command = /tmp/make_me_root.sh

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

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

アパッチ - > のCustomLog

CustomLog "|/tmp/make_me_root.sh"

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

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


0

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

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

vimを起動して:shと入力するだけです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.