GNU/Linux >> Linux の 問題 >  >> Linux

sudo ユーザーが特定のコマンドを実行できないようにする方法は?

CmndAlias ALL の使用 決して安全ではありません

service network restart を実行する方法は 1000 通りあります sudo service network restart を行わずに .以下は、悪意のあるユーザーが試すかもしれないことの例です:

$ echo "service network restart" > /tmp/hax
$ chmod a+x /tmp/hax
$ sudo /tmp/hax

ユーザーに ALL を提供する場合 コマンドエイリアスを作成してからブラックリストを作成しようとすると、常にそれを回避する方法を見つけることができます. bash をブラックリストに登録すると、Python が使用されます。 Python をブラックリストに登録すると、Perl が使用されます。 Perl をブラックリストに登録すると、PHP を使用するようになります。誰もそれを望んでいません!

本当に誰かに何かをしてほしくない場合は、トーマスの言うとおりにして、彼らがであることのホワイトリストを作成する必要があります 許可されています。

例外のあるホワイトリストの設定

除外を含む小さなホワイトリストの例は、man sudoers の下部にあります。 :

 pete           HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

The user pete is allowed to change anyone's password except for root on the HPPA
machines.  Note that this assumes passwd(1) does not take multiple user names
on the command line.

(実際、マンページのこの例は安全ではなく、ルートのパスワードを変更するために悪用される可能性があります!方法については、以下のコメントを参照してください。)

すべての service を提供するために、それをあなたのケースに適応させることができます コマンドはスタッフ グループに送信しますが、除外 service network あなたに関係するコマンド:

%staff ALL =   /usr/sbin/service *,                            \
             ! /usr/sbin/service *network*,                    \
             ! /usr/sbin/service *NetworkManager*

(ALL その位置の は、Cmnd_Alias ではなく Host_Alias を指します - 混乱しませんか?)

ユーザーは sudo bash を実行できません または sudo tee または sudo wget または sudo /path/to/malicious_script .注意すれば、ユーザーの管理コマンドをさらにホワイトリストに登録できます。具体的に!

注:* を追加しました network という単語の前に service に無害なフラグが追加された場合に備えて 今後のツール。 --verbose を想像してみましょう フラグが将来追加された場合、ユーザーは次を実行できるようになります:

$ sudo service --verbose network restart

* が必要です サービス名の前にフラグを消費します。 1 つの欠点は、これにより、実際にはユーザーが実行していることを気にしない他のサービスがブロックされる可能性があることです。 safe-network というサービス または network-monitor も拒否されます。

ユーザーがグループ権限を使用してファイルを編集できるようにする

以下に、rnano を使用したさまざまな試みを示します。 sudo まで ユーザーがファイルを編集できるようにします。しかし実際には、それらは本来よりも複雑で危険です。

より簡単で安全な解決策は、編集権限を開きたい特定のファイルのグループ権限を変更することです。以下にいくつかの例を示します:

### Give steve the ability to edit his nginx config:
$ chgrp steve /etc/nginx/sites-available/steves_dodgy_project
$ chmod g+rw /etc/nginx/sites-available/steves_dodgy_project

### Let all members of the staff group edit the group_website config:
$ chgrp staff /etc/nginx/sites-available/group_website
$ chmod g+rw /etc/nginx/sites-available/group_website

より細かい制御が必要な場合 (たとえば、すべてのスタッフ メンバーではなく 3 人のユーザーのみがアクセスできるようにする場合)、addgroup を使用して新しいグループを作成できます。

ユーザーが sudo でファイルを編集できるようにする

この回答の残りの部分は、sudo に簡単に穴を開けられるかについての調査になりました。 ユーザーに柔軟性を提供しようとするときの構成。次のことはお勧めしません!

特定のファイルを編集するアクセス権をユーザーに付与したい場合は、 rnano を使用してみてください。 :

%staff ALL = /bin/rnano /etc/nginx/sites-available/host

rnano 指定されたファイルのみを編集できるようにします。これは、悪意のあるユーザーが別の新興サービス (たとえば、/etc/init.d/urandom など) を編集できないようにするために重要です。 )、そして service network restart を実行する行を追加します .

残念ながら rvim を制限する方法が見つかりませんでした 十分に (ユーザーは :e を使用して任意のファイルを開くことができます )、だから nano のままです。 .

残念ながら、ユーザーが複数のファイルを編集できるようにすることは、はるかに困難です...

ユーザーに複数のファイルを編集させる (必要以上に難しい)

1.安全でないアプローチ

ワイルドカードに注意してください! あまりにも多くの柔軟性 (または柔軟性) を提供すると、悪用される可能性があります:

%staff ALL = /bin/rnano /etc/nginx/sites-available/*                # UNSAFE!

この場合、悪意のあるユーザーは他のアップスタート サービス スクリプトを編集して実行することができます:

$ sudo rnano /etc/nginx/sites-available/../../../any/file/on/the/system

(Sudo は実際に . を防ぎます と .. コマンドの展開ですが、残念ながら引数ではありません。)

このようなものがうまくいくことを期待していましたが、まだ安全ではありません:

%staff ALL = /bin/rnano /etc/nginx/sites-available/[A-Za-z0-9_-]*   # UNSAFE!

sudo以降 現在、glob のみを提供しています パターン、その * 何にでもマッチします - 正規表現ではありません!

(編集:できるかどうか検討しました sites-available の下にサブフォルダーがないため、あなたの状況では上記を回避してください .フォルダーの後に 1 つの文字を一致させる必要があり、/.. ファイル名の後に失敗するはずです。 rnano であるため、これは実行可能な解決策ではありません。 複数の引数を受け入れます。とにかく、一般的に、これはまだ安全ではありません サブフォルダーを持つフォルダーに!)

サブフォルダーがなくても、/../ を含む行を除外します。 、* を提供するルール rnano であるため、glob は引き続き悪用される可能性があります。 複数の引数を受け入れます (<C-X> でそれらを循環します) 、そしてスペースは * によって喜んで受け入れられます

$ rnano /etc/nginx/sites-available/legal_file /then/any/file/on/the/system

2.限界を超える (これも最終的には安全ではありません)

では、スペースを含む行や /.. に到達しようとする行を拒否するとどうなるでしょうか? ?その場合、最終的に実行可能な解決策は次のようになります:

# I tried hard to make this safe, but in the end I failed again.
# Please don't use this unless you are really smart or really stupid.

%staff ALL =   /bin/rnano /etc/nginx/sites-available/*,    \
             ! /bin/rnano */..*,                           \
             ! /bin/rnano /etc/nginx/sites-available/,     \
             ! /bin/rnano */.,                             \
             ! /bin/rnano * *

# CONCLUSION: It is still NOT SAFE if there are any subfolders, due to
# the bug in rnano described below.

フォルダーの「下」にあるものはすべて受け入れますが、rnano への呼び出しも拒否します /.. の場合 または /. または 渡された場合、またはフォルダーが直接ターゲットされている場合。 (技術的には /. 除外すると /.. になります 除外は冗長ですが、わかりやすくするために両方を残しました。)

フォルダと /. を見つけました そうしないと、ユーザーがフォルダー自体をターゲットにする可能性があるため、除外が必要でした。 rnano と思うかもしれません。 フォルダを指すとブロックされますが、間違っているでしょう。実際、私のバージョン (2.2.6-1ubuntu1) は軽度の警告と空のファイルで起動し、その後 <C-X> で起動します 好きなファイル名を入力するよう求められます に保存して、新しい攻撃ベクトルを開きます!少なくとも、既存のファイルの上書きを拒否しました (私が行った 1 つのテストでは)。とにかく、sudo を使用してサブフォルダーをブラックリストに登録する方法がないため、この方法も安全ではないと結論付けなければなりません。ユーザーに申し訳ありません!

この発見により、私は nano の完全性を疑うようになりました の「制限付き」モード。彼らは、チェーンはその最も弱いリンクと同じくらい強いと言います. sudoの組み合わせを感じ始めています ブラックリストのブラックマジックと rnano ヒナギクの鎖ほど安全ではないかもしれません.

3.安全だが限定的なアプローチ

グロブは非常に制限されています。文字クラスを複数回照合することはできません。 できる すべてのファイル名が同じ長さ (この場合は host) の場合、複数のファイル編集を提供します の後に 1 桁の数字が続きます):

%staff ALL = /bin/rnano /etc/nginx/sites-available/host[0-9]       # SAFE

ただし、さまざまなファイルを編集するアクセス権をユーザーに付与する場合は、すべてのファイルを明示的に指定する必要がある場合があります。

%staff ALL = /bin/rnano /etc/nginx/sites-available/hothost    \
             /bin/rnano /etc/nginx/sites-available/coldhost   \    # SAFE
             /bin/rnano /etc/nginx/sites-available/wethost    \
             /bin/rnano /etc/nginx/sites-available/steves_dodgy_project

誘惑に負けない * を使用するには いつでも。理由については、上記のセクション 1. と 2. を参照してください。覚えておいてください:1 つの小さなミスが、スーパーユーザー アカウント全体とシステム全体を危険にさらす可能性があります。

4.独自の引数チェッカーを作成します (安全性はあなたの責任です)

sudo に正規表現のサポートが追加されることを願っています 将来;正しく使用すれば、多くの問題を解決できます。ただし、引数のプロパティをチェックする機能も必要になる場合があります (ファイルのみ、フォルダーのみ、または特定のフラグのみを許可するため)。

しかし、sudo に柔軟性を持たせるための代替手段が 1 つあります。責任を負います:

%staff ALL = /root/bin/staffedit *

次に、独自の staffedit を記述します スクリプトまたは実行可能ファイルを使用して、ユーザーから渡された引数が有効かどうかを確認し、有効な場合にのみリクエストを実行します。


まず、sudo visudo で sudoers ファイルを開きます . user ALL=!/usr/sbin/service を追加 IIRC は service を許可しません ユーザー user のコマンド .

ソース:http://nixcraft.com/showthread.php/15132-Sudo-Exclude-Commands-And-Disable-sudo-su-Bash-Shell


解決策を見つけました。

ターミナルを開き、su - で root ユーザーに変更しました 次に visudo と入力しました 編集します。

最後に

のような行を書きました
user ALL=!/etc/init.d/NetworkManager restart
user ALL=!/etc/init.d/network restart

その後、保存して閉じ、再起動しました。

service network restart と入力している場合 または service NetworkManager restart それから私を許可せず、

のようなエラーを出します
Sorry user is not allowed to execute '/sbin/service NetowkrManager restart' as root on localhost.localdomain

service network restart についても同様です コマンドも。


Linux
  1. 特定のサービスが Ubuntu で実行されているかどうかを確認する方法

  2. 特定のインターフェースで cURL を使用する方法

  3. Linux サービスが自動起動しないようにするにはどうすればよいですか?

  1. 特定のプログラムのスワッピングを防ぐ方法は?

  2. sudo コマンドのパスを設定する方法

  3. ユーザーが別のハード ドライブにファイルをコピーできないようにするにはどうすればよいですか?

  1. LinuxでBashの履歴から特定のコマンドをクリアする方法

  2. Linuxでのコピーから特定のディレクトリを除外する方法

  3. ターミナルから特定の日時に Linux をシャットダウンするには?