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


29

私は非常に繊細なネットワーク設定をしており、それを台無しにしたくありません。私のネットワークは、sudo特権を持つ多数のユーザーで構成されています。

走るのを止めたい

service NetworkManager restart
service network restart

コマンド。

これを達成する方法はありますか?


どのディストリビューションを使用していますか?サービス名はディストリビューション固有のものであり、そこにある名前を使用するディストリビューションは知りません。あなたが意味するかnetworkingnetwork-manager?また、ユーザーがsudoアクセスできるのはなぜですか?完全なルート権限を持たせたい場合を除き、そうすべきではありません。
テルドン14年

@terdon私はそれを解決しました。ありがとうございました。私は新しいユーザですので、私は答えとしてそれを投稿カント
シェカール

はい、できます。また、あなたが見つけた答えを知りたいです。
テルドン14年

確認が、その私も10評判を持っていけないので、私は自分の答えを投稿して8時間待つ必要があると言って@terdon
シェカール

1
ああ、はい、ごめんなさい、あなたは確かに待つ必要があります。私はちょうど賛成しました、あなたは今担当者を持っています:)
terdon 14年

回答:


47

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.

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

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。注意が必要な場合は、ユーザーの管理コマンドをさらにホワイトリストに追加できます。ただ具体的に!

注:将来、無害のフラグがツールに追加される場合に備えて、上記*の単語の前に追加しました。フラグが将来追加され、ユーザーが次を実行できるようになると想像してください。networkservice--verbose

$ sudo service --verbose network restart

したがって*、サービス名の前にフラグを使用する必要があります。欠点の1つは、実行中のユーザーを気にしない他のサービス(たとえば、呼び出されるサービスsafe-networknetwork-monitor拒否されるサービス)をブロックする可能性があることです。


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

以下では、rnanothrough 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十分に制限する方法が見つかりませんでした(ユーザーはを使用して任意のファイルを開くことができます:enano

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


ユーザーが複数のファイルを編集できるようにします(本来よりも難しい方法です)

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

ワイルドカードに注意してください!柔軟性が高すぎる場合(または柔軟性がある場合)、悪用される可能性があります。

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

この場合、悪意のあるユーザーは他のupstartサービススクリプトを編集してから実行できます。

$ 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、現在のみ提供していますグロブパターンを、それは*何もマッチします -それは正規表現ではありません!

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

サブフォルダーがなく、を含む行を除外した場合でも、複数の引数を受け入れる(それらを循環し、グロブがスペースを喜んで受け入れるため/../*グロブを提供するルールは依然として悪用される可能性があります。rnano<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、単一の数字が続きます):

%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

*いつでもaを使用するように誘惑さないでください。理由については、上記のセクション1.および2.をご覧ください!覚えておいてください。1つの小さなスリップがスーパーユーザーアカウント全体とシステム全体を危険にさらす可能性があります。

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

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

ただし、sudoに柔軟性を持たせる方法は1つあります。バックを渡す:

%staff ALL = /root/bin/staffedit *

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


5
この答えには長い時間がかかりましたが、ようやくsudoがどのように機能するか理解できたと思います。私は過去にさまざまな機会をあきらめALL=(ALL:ALL) ALL、セマンティクスが不足していると感じましたが、常にどこかに適切な引数チェッカーがあると思いました...私は間違っていました。本当に限られています。manページで提供されるpasswdルートの除外でさえ、単純なコマンドライン引数で壊すことができますsudo passwd -q root。さて、sudoの作者は自分のWebサイトに[いくつかの選択肢](sudo.ws/sudo/other.html)をリストしています。将来、正規表現のサポートが追加されることを期待しています。
joeytwiddle

rnanoそれは「名前を付けて保存」機能を持たないnanoのバージョンであるため、ここの説明で具体的に使用していますか?私はこのプログラムに詳しくありません。
シャドゥール14年

はい。セキュリティを重視する場合、エディターは指定された1つのファイルのみを編集し、シェルを開くことはできません。詳細については、$ man nanoその後/-R<Enter>
joeytwiddle

訂正:ピートの例を破るには、-q後に来る必要がありますsudo passwd root -q。ピートの例を強化するには、を除外し*root*ます。
joeytwiddle

を使用sudoeditしてファイルの変更を安全に有効にするために使用することを検討してくださいsudo
トーター

5

まず、でsudoersファイルを開きますsudo visudouser ALL=!/usr/sbin/service意志、IIRCを追加すると、serviceユーザーのコマンドは許可されませんuser

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


これにより、他のサービスの実行も停止します。答えてくれてありがとう。:)
shekhar 14年

あなたの答えは私を正確には助けませんでしたが、解決策を見つけるのに役立ちましたありがとうございます。しかし、あなたはあなたに賛成票を与えるか、私の仕事の答えを投稿するかのどちらかを知っています。私は十分な評判を持っていません。一度感謝します。ありがとうございました。
シェカール

2
ええ、しかし、まだ、他の人が述べたように、あなたはそれに非常に注意しなければなりません。アクセスする方法には多くの方法があります。シェルなどを生成できるコマンド。「禁止された」コマンドをすべて除外するのではなく、本当に必要なコマンドを見つけて許可する方法が簡単です。
ボンシスコット14

3
ホワイトリストは多くのシナリオで維持できません。本当の目標は彼らが何かをするの防ぐことではなく、そうでなければ彼らを制限することなく間違って悪いことをしないようにすることです。これらの場合にはブラックリストが適しています。合理的なユーザーがタスクに取り組む方法をブラックリストに載せます。しかし、sudoを介したブラックリストでは不十分な場合があります。人々は「sudo bash」を使用できます。1つのアプローチは「サービス」コマンドをラップすることであり、使用したくない場合は通知します。しかし、すべての良いアクションをホワイトリストにリストしたり、すべての悪いアクションをブラックリストにリストしたりすることは決してありません。
ボブカーンズ14年

1
ボブに同意します。フルアクセスを許可せずに柔軟性を実現するには、多くの場合、独自のソリューションをヘルパースクリプトとしてロールし、そのスクリプトのみをホワイトリストに登録する必要があります。sudoホワイトリストは必要なことを実行できますが、多くの場合、制限が多すぎるか、簡単に悪用されます。
joeytwiddle 14年

5

私は解決策を見つけました。

ターミナルを開き、rootユーザーに変更しsu -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コマンドについても同様です。


12
これは、経験の浅い悪意のないユーザーには有効ですが、sudoの制限を回避するのは簡単です(たとえばsudo cp -p /etc/init.d/network /etc/init.d/network-not-in-sudosudo /etc/init.d/network-not-in-sudo restart)。これが、sudoersファイルに除外ではなく包含を作成する方がはるかに安全な理由です。たとえば、どのサービスと対話できるかを指定します。
トーマス14年

「サービスネットワークの再起動」が行うすべてのことは、ネットワークinit.dスクリプト内のコマンドなど、他のコマンドで実行できます。ここにリストしようとはしません。しかし、たとえば、インターフェースの状態の変更を実際に防止したい場合は、SELinuxポリシーが道のりのように思えます。複雑なトピックですが、ホワイトリストの制限が厳しすぎるか負担が大きく、ブラックリストが不十分な場合は、おそらく最適な選択肢です。カーネルに実装されており、ネットワークインターフェイス(およびその他のリソース)へのアクセスをsudoされたユーザーに制限することができます。
ボブカーンズ14年

SELinuxで可能であれば、もっと喜んでいただけるでしょう。@BobKernsありがとう。そのようにしてみます。
シェカール

3

これに対する本当の答えは、これを本当に防ぐことはできないということです。他の回答に記載されている方法で悪意のない人が誤ってそのコマンドを実行するのを防ぐことができますが、本当に実行したい人がsudoersリストに載っている場合は実行できます。たとえば、次のことができます。

joe@box:~$ sudo bash root@box:~# service network restart

または、sudoersファイルの制限を回避するために使用できる別の楽しいコマンド:

sudo visudo

簡単に言えば、sudoを実行でき、特定のコマンドの実行に制限されていない場合は、ほとんど何でもできます。特定のコマンドセットに制限する場合でも、実行する権限があるコマンドと同じ名前で実行したい他のコマンドをユーザーがコピーできないようにする必要があります(実行する権限があるコマンドを上書きするなど)


うん。内部からシェルを生成できるコマンドは避けてください。
ボンシスコット14

1
問題は、保護したいコマンドではなく、使用するコマンド(またはシステムコール)に関係なく、ルーティングテーブル、インターフェイスなどのカーネルオブジェクトの状態です。そして、すべてではありませんが、一部のrootユーザーから保護したいと考えています。SELinuxは、この種のシナリオに基づいて設計されています。しかし、最初に、これらすべてのユーザーがsudoアクセスを持っている理由のレビューから始めます。いくつかの特定のことだけを行う必要がある場合は、sudoersでのホワイトリスト操作が必要な場合があります。
ボブカーンズ14年

2

firejailを使用して、サンドボックスを持つユーザーを制限します。

https://github.com/netblue30/firejail/

/ etc / passwdで、制限するすべてのユーザーに対して、bashではなくシェルとしてfirejailを設定します。非常に使いやすく、優れたドキュメントがあります。

例:

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