新しいユーザーを作成し、彼にSudoアクセスを許可します。具体的には、Sudo vim
とhttpd.confを編集します。私はこれをsudoersで書いた:
user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
しかし、これは危険だと聞いた。これはなぜ問題があるのですか?問題はどのくらい深刻ですか?
コマンドライン引数を制限しますが、ユーザーがrootとして実行されると、ユーザーがvimを使用してランダムファイルを開いて編集して上書きすることを妨げるものはありません。
ユーザーは_Sudo vim /etc/httpd/conf/httpd.conf
_を実行してから、
:r /etc/sudoers
_注:SELinuxによる制限がない限り、ユーザーはanyファイルをこの方法で読み取ることができます!user ALL=(ALL) NOPASSWD: ALL
:w /etc/sudoers
_ユーザーがシステムにアクセスしたり、システムを変更したり、破壊したりできる同様の方法が何十もあると想像できます。
SudoログメッセージでApache設定を編集しているだけなので、この方法で変更されたファイルは監査証跡もありません。これは、Sudo
特権を編集者に付与する際のセキュリティ上のリスクです。
これは多かれ少なかれ、tar
やunzip
などのコマンドに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つのコマンドが他のコマンド(シェルなど)を実行するのを防ぎます。
この構成により、そのユーザーはそのファイルを編集できます。そのために、彼はroot権限でvim
エディターを起動します。
vim
コマンドが開始されると、ユーザーはそのエディターで好きなことを何でもできます。 -彼は別のファイルを開いたり、vimからシェルを起動したりすることもできます。
したがって、ユーザーはシステム上で任意のファイルを表示および編集したり、任意のコマンドを実行したりできるようになります。
セキュリティロック
less
、vi
、vim
、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
以下はVimコマンドです:
:Shell
これでルートシェルができました。
考えられるセキュリティの改善の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 /
のような意図的に悪意のあるシェルコマンドを防ぐことはできます。
私は HBruijnの答え に同意します。rootとしてvimを実行すると、実際にシステムが非常に広く開かれるため、sudoeditの方がより安全なソリューションです。
しかし、それでも、システムはおそらくまだオープンです。少なくとも、root権限を持つ一部のApacheプロセスがその構成に基づいて起動されると想定しています。外部プログラムを実行するようにApacheを構成するには、100万通りの方法があります。一例として、パイプ引数を CustomLog ディレクティブに検討します。マニュアルは明確に述べています:
セキュリティ:
プログラムが使用されている場合は、
httpd
を開始したユーザーとして実行されます。サーバーがルートによって起動された場合、これはルートになります。プログラムが安全であることを確認してください。
明らかに、ユーザーが設定を作成できる場合、ユーザーはそのプログラムを好きなように変更できます。シェルスクリプトを実行して、さらに権限を付与するもの。
このため、最近、通常のユーザーとして実行されているにもかかわらず、Apacheが特権ポートにバインドする特別な機能を取得できるように、機能を使用する方法を一緒にハッキングしました。そうすれば、ユーザーは設定を編集したりサーバーを起動したりすることができ、ほとんど安全です。唯一の問題は、任意のIP上の任意のプロセスをバインドできることです。彼らはおそらくシステムのsshdをクラッシュさせる方法を見つけ、ルートパスワードを取得するために独自のバージョンを起動する可能性があるため、ある程度の信頼が残っています。
もちろん、それはまったく安全ではありません。 sudoeditの前に述べたように、これは最も簡単で適切な方法です。
私が追加したいのは、vimがシェルの起動を許可することです。これにより、システムファイルを編集できるだけでなく、シェルを起動して好きな場所で実行できるようになります。
Vimを起動して:shと入力してみてください
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になると、トレースをぼかすためにそのような構成行を元に戻します。