このページでは、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
ファイルを復元する手順は次のとおりです。
現在の起動スクリプトのバックアップ コピー(すでに使用されている場合)を作成します。バックアップの手法は、起動スクリプトの構成によって異なります。
起動スクリプト
スクリプトの内容がメタデータ値に直接設定されている場合は、スクリプトの内容を Cloud Storage バケット、ローカル ファイル、その他の一時的なプライベート ストレージにコピーできます。
startup-script-url
スクリプトの内容がすでにリモート ストレージにあり、その URL アドレスが使用されている場合は、
startup-script-url
メタデータキーを一時的に削除して、現在の起動スクリプトを無効にできます。次のコマンド シーケンスを使用して起動スクリプトを更新します。
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
ファイルの権限を読み取り専用に設定し、ファイルのオーナーとオーナー グループのみの読み取りを許可します。
-
VM を停止します(実行中の場合)。VM を再起動して、起動スクリプトの実行をトリガーします。
VM に接続し、破損した
sudoers
ファイルを編集して復元します。sudo visudo /etc/sudoers.backup.TIMESTAMP
変更を保存し、現在の
/etc/sudoers
ファイルを、編集したファイルに置き換えます。sudo mv /etc/sudoers.backup.TIMESTAMP /etc/sudoers
sudo
コマンドと昇格された権限の使用に関する元の問題が修正されていることを確認してください。一時的な起動スクリプトを削除し、使用されていた元のスクリプトを復元します。
次のステップ
- アクセスできない VM または破損した VM を復元する方法を確認する。
- 既存のディスクを別の VM に追加する方法を確認する。