次のコマンドを実行できるようにシェルエスケープを無効にする方法はわかりません。
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
停止して後で再起動した場合(たとえば、メンテナンス期間中にスケジュールされたジョブを停止するため)、再起動されたデーモンは制限のためにスケジュールされたジョブを実際に実行できません。cron
cron
NOEXEC:
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_Spec
s、これがあなたが知りたい部分です 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を実行でき、すべての制限が削除されます。