Linux · 1 min read · Nov 14, 2025

Linuxでsudoeditを使用してユーザーが安全にファイルを編集できるようにする方法

あなたがLinuxで限られた権限で作業するチームのシステム管理者だとしましょう。今、あるチームのメンバーが新しい作業の一環として、スーパーユーザー権限を必要とするファイルを頻繁に編集する必要がある状況を想像してみてください。あなたはどうしますか?

一つの選択肢は、彼らに「sudo」アクセスを与えることですが、それは見知らぬ人にあなたの家全体へのアクセスを与えるようなものです。彼らが必要とするのは、あなたの部屋の一つにいることだけなのです。つまり、デフォルトの「sudo」アクセスは、ルート権限を必要とするすべてのことを行うことを許可しますが、実際には特定のシステムファイルを編集する能力だけが必要です。

「sudo」が提供する柔軟性を考慮すると、もう一つの選択肢は、問題のファイルを編集する権限だけが付与されるように「sudo」ポリシーを調整することです。例えば、以下のようにします:

%newsudo ALL = vim /path/to/file

これは、完全なsudoアクセスを提供するよりもはるかに良い解決策ですが、誰かが悪用できる抜け穴がまだ存在します。

私が何を言っているのか理解するために、前述の限られたアクセスがグループに提供され、誰かが「sudo」コマンドを使用して問題のファイルを編集のために開くシナリオを考えてみてください。

今、vimに関する良い知識を持った賢い人は、エディタ内から新しいシェルを起動できることを知っています。彼らが行う必要があるのは、次のvimコマンドを実行することです:

:shell

これにより、すぐにインタラクティブシェルに入ります。これらの手順をあなたのマシンで試している場合は、「whoami」コマンドを実行してみてください。私が話していた抜け穴が何であるか理解できるでしょう - はい、あなたはrootとしてシェルにいます。

以下は例のスクリーンショットです:

言うまでもなく、特定のファイルへの編集アクセスを提供する目的は無効になり、ユーザーは今や何でもできるようになりました。

他に選択肢があるか見てみましょう。sudoersエントリで使用できるNOEXECタグがあります:

%newsudo ALL = NOEXEC: vim /path/to/file

NOEXECは基本的に、sudoによって実行されるプログラムが他のプログラムを実行するのを防ぐことを許可します。では、これは究極の解決策でしょうか?残念ながら、そうではありません。その理由については、sudoersマニュアルがこのタグを次のように説明しています:

noexec  
多くの共有ライブラリをサポートするシステムは、環境変数(通常はLD_PRELOAD)を別の共有ライブラリにポイントすることでデフォルトのライブラリ関数をオーバーライドする能力を持っています。そのようなシステムでは、sudoのnoexec機能を使用して、sudoによって実行されるプログラムが他のプログラムを実行するのを防ぐことができます。ただし、これはネイティブの動的リンク実行可能ファイルにのみ適用されます。静的リンクされた実行可能ファイルやバイナリエミュレーション下で実行される外国の実行可能ファイルには影響しません。  
noexec機能は、SunOS、Solaris、*BSD、Linux、IRIX、Tru64 UNIX、MacOS X、HP-UX 11.xおよびAIX 5.3以上で機能することが知られています。  
...  
...  
...  
コマンドに対してnoexecを有効にするには、上記のユーザー仕様セクションに記載されているNOEXECタグを使用します。再度その例を示します:  
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi  
これにより、ユーザーaaronはnoexecが有効な状態で/usr/bin/moreおよび/usr/bin/viを実行できるようになります。これにより、これらの2つのコマンドが他のコマンド(シェルなど)を実行するのを防ぎます。システムがnoexecをサポートできるかどうか不明な場合は、試してみて、noexecが有効なときにシェルエスケープが機能するかどうかを確認できます。  
シェルエスケープを制限することは万能ではないことに注意してください。rootとして実行されるプログラムは、意図しない特権昇格につながる可能性のある多くの危険な操作(ファイルの変更や上書きなど)を行うことができます。  
...  
...  
...

太字で強調されたテキストを注意深く読むと、NOEXECには独自の制限があることがわかります。

では、最も信頼できる解決策は何でしょうか?それはsudoeditです。sudoersマニュアルでもこのツールを推奨しています:

特定のエディタの場合、ユーザーにsudoeditを実行する権限を与えることがより安全なアプローチです。

Sudoeditは、ユーザーが安全にファイルを編集できるようにする組み込みコマンドです。sudoマニュアルページによると、「sudoedit」は「-e」コマンドラインオプションを使用して「sudo」を実行することと同等です。

なぜそれがより良いのか

「sudoedit」を使用すると、ユーザーは好みのエディタを使用する選択肢があります。これは、チュートリアルの最初に議論した解決策とは異なり、ユーザーがVimエディタを強制的に使用することを避け、彼ら自身のカスタマイズを楽しむことができます。そして、最も重要な理由は、「sudoedit」を使用すると、ユーザーは「root」ではなく、自分自身としてファイルを編集することになります。

Sudoeditの動作

sudoeditを使用するには、sudoersのエントリは、例えば以下のようにする必要があります:

%newsudo ALL = sudoedit /path/to/file

そして、「newsudo」グループの一部であるユーザーは、次のコマンドを実行することでファイルを編集できます:

sudoedit /path/to/file

このコマンドが行うことは、最初に編集したいファイルの一時コピーを作成することです。次に、コマンドはSUDO_EDITOR、VISUAL、およびEDITOR環境変数(その順序で)を検索して、作成された一時コピーを開くために呼び出すべきエディタを決定します。ユーザーが変更作業を終えたら、変更が元のファイルにコピーされます。

以下は「sudo」コマンドのマニュアルページからの詳細な説明です:

-e, --edit  
コマンドを実行する代わりに、1つ以上のファイルを編集します。パス名の代わりに、セキュリティポリシーを参照する際に「sudoedit」という文字列が使用されます。ユーザーがポリシーによって認可されている場合、次の手順が実行されます:  
 1. 編集するファイルの一時コピーが作成され、所有者は呼び出しユーザーに設定されます。  
 2. ポリシーによって指定されたエディタが一時ファイルを編集するために実行されます。sudoersポリシーは、SUDO_EDITOR、VISUAL、およびEDITOR環境変数(その順序で)を使用します。SUDO_EDITOR、VISUAL、またはEDITORが設定されていない場合、sudoers(5)オプションでリストされた最初のプログラムが使用されます。  
 3. 変更があった場合、一時ファイルは元の場所にコピーされ、一時バージョンは削除されます。  
指定されたファイルが存在しない場合は、作成されます。ほとんどのsudoによって実行されるコマンドとは異なり、エディタは呼び出しユーザーの環境を変更せずに実行されます。何らかの理由でsudoが編集されたバージョンでファイルを更新できない場合、ユーザーには警告が表示され、編集されたコピーは一時ファイルに残ります。

これで、あなたは「sudoedit」についての基本的なアイデアを持っているはずです。いつ使用するか、ファイルやいくつかのファイルを編集したいときに「sudo」を使用するよりもなぜそれが良いのかを理解しているでしょう。もちろん、他のセキュリティ関連ツールと同様に、「sudoedit」もいくつかの悪用の歴史がありますが、多くのユースケースで推奨される解決策であることには変わりありません。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。