Sudo:シェルエスケープはデフォルトでは許可されていません。

Sudo:シェルエスケープはデフォルトでは許可されていません。

次のコマンドを実行できるようにシェルエスケープを無効にする方法はわかりません。

sudo-user ALL=(ALL) NOEXEC: NOPASSWD: ALL

sudoersのマニュアルには次のように記載されています。

コマンドにはゼロ個以上のタグが連結されている場合があります。可能なタグ値は、NOPASSWD、PASSWD、NOEXEC、EXEC、SETENV、NOSETENV、LOG_INPUT、NOLOG_INPUT、LOG_OUTPUT、およびNOLOG_OUTPUTの8つです。 Cmndにラベルが設定されている場合、Cmnd_Spec_Listの後続のCmndは、反対のラベルに上書きされない限り、そのラベルを継承します(たとえば、PASSWDはNOPASSWDを上書きし、NOEXECはEXECを上書きします)。

しかし、これは複数のフラグを設定する方法を説明しません。カンマを使用すると機能しないようです(2番目のタグをエイリアスとして扱います)。

良い点はデフォルトを設定したいので、上記の行は次のようになります。

defaults NOEXEC     
sudo-user ALL=(ALL) NOPASSWD: ALL

sudoはnoexecを使用してコンパイルできることを知っていますが、この場合は実用的ではありません。私もこれが完全な答えではないことを知っています。 LD_PRELOADを適切に設定すると、それを反転できますが、開始に過ぎません。

Sudo バージョン:

Sudo version 1.8.19p2
Sudoers policy plugin version 1.8.19p2
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.19p2
On RHEL 7.5

答え1

これをしないでください。

sudo-userすべてのユーザーとしてすべてのコマンドを実行する機能を提供します。これには修正機能が含まれます。 /etc/sudoers子プロセスの実行が不要なツールを使用してください。除外されると思うかもしれませんが、visudo厳密に言えばそうではありません。必要 visudo編集する/etc/sudoers

たとえば、

sudo-user$ sudo sed --in-place -e '/^sudo-user/s/NOEXEC://' /etc/sudoers

...ユーザーがNOEXEC:制限を削除しました。

ユーザーが自由に解放できる制限は、実際には制限ではありません。


さらに、NOEXEC:問題が発生する可能性があります。これはシェルエスケープを防止するだけでなく、sudo以下を使用して実行されるプログラムも防止します。別のプログラムを直接実行してください。。これは多くの結果をもたらす可能性があります。

たとえば、デーモンをsudo-user停止して後で再起動した場合(たとえば、メンテナンス期間中にスケジュールされたジョブを停止するため)、再起動されたデーモンは制限のためにスケジュールされたジョブを実際に実行できません。croncronNOEXEC:

NOEXEC:exec()システム管理者は、子プロセスなしで操作を実行できることが確認された慎重に選択されたプログラムに適用できるように存在します。盲目的に適用すべて問題を引き起こします。


しかし、必ずしなければならない場合、方法は次のとおりです。

sudoers(5)マニュアルページから:

User specification
 User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \
               (':' Host_List '=' Cmnd_Spec_List)*

 Cmnd_Spec_List ::= Cmnd_Spec |
                    Cmnd_Spec ',' Cmnd_Spec_List

 Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd

 Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'

 SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')

 Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
               'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
               'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
               'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')

これは詳細構成する方法の説明ユーザー仕様ファイルの行sudoers。読み取りは多少退屈かもしれませんが、必要な情報が含まれています。

この問題を解決するために、サンプルラインを試してみましょう。

sudo-user ALL=(ALL) NOEXEC: NOPASSWD: ALL

完全な生産ラインが呼び出されます。ユーザー仕様、またはUser_Spec

次のように分類されます。

  • User_Listあなたの例は、ユーザーが一人だけです。sudo-user
  • Host_Listアイテムは1つだけです。ALL
  • Cmnd_Spec_Listあなたの例では(ALL) NOEXEC: NOPASSWD: ALL
  • 行に他の単位はありません: Host_List = Cmnd_Spec_List。 (括弧の後のアスタリスクは、そのような追加単位が0個以上ある可能性があることを示します。)

あなたのものにはCmnd_Spec_Listカンマがないので、1つだけですCmnd_Spec

Cmnd_Spec次のように分解されます。

  • オプションRunas_Spec:状況に応じて(ALL)
  • オプションSELinux_Spec、あなたの例には存在しません
  • 0個以上のTag_Specs、これがあなたが知りたい部分です
  • Cmnd、命令、それはALLあなたの場合です。

Singleは、Tag_Spec末尾にコロンがあり、明示的にリストされているコンマ、スペース、またはその他の区切り文字を持たないキーワードの1つです。このCmnd_Spec ::=行は、行の空白位置を正確に伝えます。タグ間にスペースやその他の区切り文字を入れる方法についての指示がないので、そうしないでください。

だから、ラベルを1つずつ配置するだけです。、このように:

sudo-user ALL=(ALL) NOEXEC:NOPASSWD: ALL

答え2

noexecデフォルトの入力行にもブールフラグが必要なので、それにラベルを追加する必要はありません。

noexec

設定されている場合、sudoを介して実行されるすべてのコマンドは、EXECフラグでオーバーライドされない限り、NOEXECフラグが設定されているかのように機能します。以下のNOEXECとEXECの説明を参照してください。シェル脱出防止このマニュアルを終了します。このマークは去る基本的に。

だからあなたに必要なこと

Defaults        noexec

これはtelcoMが指摘したのと同じ問題を提示します。彼らの答え 。実行を防ぐためvisudo(別のエディタプロセスを開始する必要があるため)、後で変更を元に戻すのが難しくなります。

答え3

これまでに提供された2つの答えを組み合わせると、次のようになります。

Defaults noexec
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
sudo-user ALL=(ALL)     EXEC:NOPASSWD:  ALL
fred ALL=(ALL)          NOPASSWD:  user_allowed_commands

実は私はいsudo ユーザーに無制限のアクセス権を付与することをお勧めします。これはルートを使用する代わりに(少なくともUbuntuなどでは)推奨されるアプローチのようです。私はすでに/etc/sudoersディレクトリを確認しています。これにより、fredは "user_allowed_commands"のコマンドリストを実行することができます(fork / execが不要であると仮定すると、そうではありません。TBH - それともnoexecが何をしているのかを間違って読みましたか?)

@telcoMで次の内容を追加したいと思います。 ユーザーが自由に解放できる制限は、実際には制限ではありません。

私が見たすべてのSELinux実装ではデフォルトで設定されていないため、すべてのユーザーがsetenforce permissiveを実行でき、すべての制限が削除されます。

関連情報