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
についても同様です コマンドも。