sudoers ファイルのトラブルシューティング


このページでは、sudo コマンドライン ユーティリティの使用、sudoers プラグインの管理、発生する問題の防止または修正に関するヒントを紹介します。

問題の原因

sudo コマンドを実行するたびに、次のプロセスが実行され、sudoers ファイルを検証します。

  • 構文の正確性がチェックされる。
  • コンテンツを分析して、一部の論理エラーを除外される。
  • オーナー権限とアクセス権限が確認される。

sudoers ファイルの検証が失敗する場合は、次のいずれかのエラーが考えられます。

構文エラー

sudoers ファイルに変更を加える場合は、特定の構文ルールに従う必要があります。欠落文字や余分な文字、不適切なカンマなど、この構文から逸脱すると、ファイルが無効になることがあります。ファイルを無効にすると、sudo ユーティリティを使用できなくなります。

解決策

この問題を解決するには、visudo ユーティリティを使用して sudoers ファイルを編集します。保存前にファイルの内容を検証し、問題が発生した場合は通知します。visudo ユーティリティは、ファイルを安全な方法で編集するために作成されています。


次の例は、正しい構文の例と誤った構文の例の両方を示しています。

正しい構文

user   ALL=(ALL) ALL

誤った構文

user   ALL=(ALL), ALL

構文エラーの例

$ sudo useradd username
/etc/sudoers:20:17: syntax error
user   ALL=(ALL), ALL
                ^

論理エラー

このタイプのエラーは、次のいずれかが原因で発生する可能性があります。

  • sudoers プラグインの原則の誤解。
  • 正しい構文からの逸脱。

ただし論理エラーは検証時に認識されません。構文ルールに違反しておらず、検出が難しいためです。

解決策

ファイルを編集する際には公式ドキュメントをよく読み、その原則を遵守する必要があります。

また、次のような一部のタイプの論理エラーを検出できるため、visudo ユーティリティを使用して sudoers ファイルを編集することをおすすめします。

  • 未定義または未使用のエイリアス
  • 循環参照
  • 重複するエントリ

問題が検出されると、警告メッセージが表示されます。


次の例は、論理的に正しい例と誤った例の両方を示しています。

論理的に正しい

barbara   ALL=(ALL:ALL) /usr/bin/ls

論理的に誤っている

barbara   ALL=(4LL:ALL) /usr/bin/ls
               ^
barbara   ALL=(ALL;ALL) /usr/bin/ls
                  ^
bar6ara   ALL=(ALL:ALL) /usr/bin/1s
   ^                             ^

不適切な権限

sudoers ファイルの内容に起因するエラーに加えて、ファイルの過剰な権限や誤ったオーナー権限により sudo ユーティリティが失敗する場合もあります。

解決策

これらのエラーの説明は、失敗した sudo コマンドの出力に表示されます。エラー メッセージの説明を読み、必要な修正を行います。


正しいファイルの権限とオーナー権限の例を次に示します。

$ ls -l /etc/sudoers
-r--r----- 1 root root 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username

次の例は、すべてのユーザー権限グループに冗長な権限がある場合に表示されるエラーを示しています。

$ ls -l /etc/sudoers
-r--r---w- 1 root root 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: error initializing audit plugin sudoers_audit

次の例は、誤ったオーナー権限について表示されるエラーを示しています。この例では、ID が 0 ではないユーザー(または root ではないユーザー)がファイルのオーナーです。

$ ls -l /etc/sudoers
-r--r----- 1 user user 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: error initializing audit plugin sudoers_audit

sudoers ファイルの構成について詳しくは、Sudoers のマニュアルをご覧ください。

visudo エディタの管理と使用方法については、Visudo のマニュアルをご覧ください。

問題が及ぼす影響

sudoers ファイル内の問題は悪影響を引き起こし、システム全体の機能に影響を与える可能性があります。

  • sudo コマンドが機能しなくなる。

    これは sudoers ファイルに関する問題の最も顕著な結果です。 その結果、ユーザー向けに昇格された権限が使用できなくなり、サーバーでのアクティビティがブロックされます。

    ただし sudo コマンドに依存するアプリの障害は、より破壊的で予測不可能な結果になります。場合によってはアプリが完全に機能しなくなり、予期しない動作、クラッシュ、データ損失が発生する可能性があります。その他の例としては、sudo コマンドが OS のブート シーケンス中にアプリケーションによって呼び出されて、失敗する場合です。OS の障害や、ブート シーケンスの停止が発生する可能性があります。

  • システムへの不正アクセスが発生する可能性がある。

    sudoers ファイルの問題により、システムへの不正アクセスが発生する可能性があることもリスクが高い結果です。これは、sudoers ファイルのルールで一部のユーザーまたはグループに過剰な権限が付与されると、論理エラーにより発生する場合があります。

    これは、システム オーナーがログインして問題を解決するためにシステム防御を一時的に無効または弱めることによっても発生する可能性があります。

問題が発生した場合の復旧

sudoers ファイルの問題により、昇格したユーザー権限が失われた場合や、sudo コマンドを使用できない場合は、スーパーユーザー アカウントを使用して復元します。

Unix のようなオペレーティング システムでは、スーパーユーザーは ID が 0 である特殊なユーザー アカウントであり、通常は root と呼ばれます。スーパーユーザーはシステム リソースに対する完全アクセス権を持ち、制限なしで管理タスクを実行できます。通常、スーパーユーザーに代わって OS とやり取りすることは安全でないとみなされますが、sudoers ファイルの復元などの特定のタスクではこれが唯一のオプションとなる場合があります。

スーパーユーザーとして直接ログインすることは OS を危険にさらしてしまいます。この危険を回避するには、起動スクリプト機能を使用することをおすすめします。このスクリプトはスーパーユーザーに代わって実行されます。

Compute Engine の起動スクリプトの詳細を確認してください。

起動スクリプトを使用して sudoers ファイルを復元する手順は次のとおりです。

  1. 現在の起動スクリプトのバックアップ コピー(すでに使用されている場合)を作成します。バックアップの手法は、起動スクリプトの構成によって異なります。

    起動スクリプト

    スクリプトの内容がメタデータ値に直接設定されている場合は、スクリプトの内容を Cloud Storage バケット、ローカル ファイル、その他の一時的なプライベート ストレージにコピーできます。

    startup-script-url

    スクリプトの内容がすでにリモート ストレージにあり、その URL アドレスが使用されている場合は、startup-script-url メタデータキーを一時的に削除して、現在の起動スクリプトを無効にできます。

  2. 次のコマンド シーケンスを使用して起動スクリプトを更新します。

    mv /etc/sudoers /etc/sudoers.backup.$(date +"%s") && echo "%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers && chown 0:0 /etc/sudoers && chmod 0440 /etc/sudoers
    

    コマンドの機能の詳細

    mv /etc/sudoers /etc/sudoers.backup.$(date +"%s")

    このコマンドは、/etc/sudoers ファイルのコピーを別の名前で作成し、元のファイルを削除します。新しいファイルの名前には、一意性を表すために最後にタイムスタンプが含まれています(例: sudoers.backup.1672527600)。

    echo "%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers

    このコマンドは、以前に削除されたファイル /etc/sudoers を 1 つのルールで作成し、VM へのアクセス権を持つ Google Cloud ユーザーに任意のシステム ユーザーの代わりにコマンドを実行することを許可します。このルールは常に、追加のファイル /etc/sudoers.d/google_sudoers にデフォルトで存在します。

    chown 0:0 /etc/sudoers

    このコマンドは、/etc/sudoers ファイルのオーナーを ID が 0 のユーザーに設定し、オーナーのグループを ID が 0 のグループに設定します。

    chmod 0440 /etc/sudoers

    このコマンドは /etc/sudoers ファイルの権限を読み取り専用に設定し、ファイルのオーナーとオーナー グループのみの読み取りを許可します。

  3. VM を停止します(実行中の場合)。VM を再起動して、起動スクリプトの実行をトリガーします。

  4. VM に接続し、破損した sudoers ファイルを編集して復元します。

    sudo visudo /etc/sudoers.backup.TIMESTAMP
    
  5. 変更を保存し、現在の /etc/sudoers ファイルを、編集したファイルに置き換えます。

    sudo mv /etc/sudoers.backup.TIMESTAMP /etc/sudoers
    
  6. sudo コマンドと昇格された権限の使用に関する元の問題が修正されていることを確認してください。

  7. 一時的な起動スクリプトを削除し、使用されていた元のスクリプトを復元します。

次のステップ