私は非常に繊細なネットワーク設定をしており、それを台無しにしたくありません。私のネットワークは、sudo特権を持つ多数のユーザーで構成されています。
走るのを止めたい
service NetworkManager restart
service network restart
コマンド。
これを達成する方法はありますか?
私は非常に繊細なネットワーク設定をしており、それを台無しにしたくありません。私のネットワークは、sudo特権を持つ多数のユーザーで構成されています。
走るのを止めたい
service NetworkManager restart
service network restart
コマンド。
これを達成する方法はありますか?
回答:
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
。注意が必要な場合は、ユーザーの管理コマンドをさらにホワイトリストに追加できます。ただ具体的に!
注:将来、無害のフラグがツールに追加される場合に備えて、上記*
の単語の前に追加しました。フラグが将来追加され、ユーザーが次を実行できるようになると想像してください。network
service
--verbose
$ sudo service --verbose network restart
したがって*
、サービス名の前にフラグを使用する必要があります。欠点の1つは、実行中のユーザーを気にしない他のサービス(たとえば、呼び出されるサービスsafe-network
やnetwork-monitor
拒否されるサービス)をブロックする可能性があることです。
以下では、rnano
through 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
。
残念ながら、ユーザーが複数のファイルを編集できるようにすることははるかに困難です...
ワイルドカードに注意してください!柔軟性が高すぎる場合(または柔軟性がある場合)、悪用される可能性があります。
%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
では、スペースを含む行を拒否したり、到達しようとしたりすると/..
どうなりますか?次に、最終的な実行可能なソリューションは次のとおりです。
# 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
、ヒナギクのチェーンほど安全ではないかもしれません。
グローブは非常に制限されています-キャラクタークラスを複数回一致させることはできません。あなたは可能性があり、複数のファイルの編集を提供し、すべてのファイル名は(この場合には同じ長さを持っている場合は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つの小さなスリップがスーパーユーザーアカウント全体とシステム全体を危険にさらす可能性があります。
sudo
将来、正規表現のサポートが追加されることを期待しています。正しく使用すれば、多くの問題を解決できます。ただし、引数のプロパティをチェックする機能も必要になる場合があります(ファイルのみ、フォルダーのみ、または特定のフラグのみを許可するため)。
ただし、sudoに柔軟性を持たせる方法は1つあります。バックを渡す:
%staff ALL = /root/bin/staffedit *
次に、独自のstaffedit
スクリプトまたは実行可能ファイルを作成して、ユーザーから渡された引数が有効かどうかを確認し、有効な場合にのみ要求を実行します。
ALL=(ALL:ALL) ALL
、セマンティクスが不足していると感じましたが、常にどこかに適切な引数チェッカーがあると思いました...私は間違っていました。本当に限られています。manページで提供されるpasswdルートの除外でさえ、単純なコマンドライン引数で壊すことができますsudo passwd -q root
。さて、sudoの作者は自分のWebサイトに[いくつかの選択肢](sudo.ws/sudo/other.html)をリストしています。将来、正規表現のサポートが追加されることを期待しています。
rnano
それは「名前を付けて保存」機能を持たないnanoのバージョンであるため、ここの説明で具体的に使用していますか?私はこのプログラムに詳しくありません。
$ man nano
その後/-R<Enter>
-q
後に来る必要がありますsudo passwd root -q
。ピートの例を強化するには、を除外し*root*
ます。
sudoedit
してファイルの変更を安全に有効にするために使用することを検討してくださいsudo
。
まず、でsudoersファイルを開きますsudo visudo
。user ALL=!/usr/sbin/service
意志、IIRCを追加すると、service
ユーザーのコマンドは許可されませんuser
。
ソース:http : //nixcraft.com/showthread.php/15132-Sudo-Exclude-Commands-And-Disable-sudo-su-Bash-Shell
私は解決策を見つけました。
ターミナルを開き、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
コマンドについても同様です。
sudo cp -p /etc/init.d/network /etc/init.d/network-not-in-sudo
、sudo /etc/init.d/network-not-in-sudo restart
)。これが、sudoersファイルに除外ではなく包含を作成する方がはるかに安全な理由です。たとえば、どのサービスと対話できるかを指定します。
これに対する本当の答えは、これを本当に防ぐことはできないということです。他の回答に記載されている方法で悪意のない人が誤ってそのコマンドを実行するのを防ぐことができますが、本当に実行したい人がsudoersリストに載っている場合は実行できます。たとえば、次のことができます。
joe@box:~$ sudo bash
root@box:~# service network restart
または、sudoersファイルの制限を回避するために使用できる別の楽しいコマンド:
sudo visudo
簡単に言えば、sudoを実行でき、特定のコマンドの実行に制限されていない場合は、ほとんど何でもできます。特定のコマンドセットに制限する場合でも、実行する権限があるコマンドと同じ名前で実行したい他のコマンドをユーザーがコピーできないようにする必要があります(実行する権限があるコマンドを上書きするなど)
firejailを使用して、サンドボックスを持つユーザーを制限します。
https://github.com/netblue30/firejail/
/ etc / passwdで、制限するすべてのユーザーに対して、bashではなくシェルとしてfirejailを設定します。非常に使いやすく、優れたドキュメントがあります。
例:
user:x:1000:1000:user:/home/user:/usr/bin/firejail
networking
とnetwork-manager
?また、ユーザーがsudo
アクセスできるのはなぜですか?完全なルート権限を持たせたい場合を除き、そうすべきではありません。