午前2時の壁
サーバー設定の真っ最中、おそらくセキュリティホールのパッチ適用や新しいDockerコンテナのインストールを試みているところでしょう。sudo apt updateと入力してEnterを押し、パスワードを入力します。いつものミラーリストが表示される代わりに、無愛想な拒絶メッセージが返ってきます:
User is not in the sudoers file. This incident will be reported.
恐ろしげな言い回しですが、警察が家にやってくるわけではありません。この「インシデント」は、単に2KBのログエントリとして/var/log/auth.log(Debian/Ubuntuの場合)や/var/log/secure(RHEL/CentOSの場合)に書き込まれるだけです。本当の問題は、あなたのユーザーアカウントに、rootとしてコマンドを実行するために必要な「王国の鍵(特権)」が欠けていることです。
30秒でできる解決策
rootパスワードを知っているか、別の管理者アカウントにアクセスできるなら、数秒で解決できます。以下のコマンドを実行して、ユーザーに必要な権限を付与してください:
- rootに昇格:
su - - Ubuntu/Debian/Archの場合:
usermod -aG sudo username - CentOS/RHEL/Fedoraの場合:
usermod -aG wheel username - ログアウトして再ログインし、グループメンバーシップを更新します。
なぜLinuxに拒否されたのか
Linuxは「最小権限の原則」を維持するためにsudo(superuser do)ユーティリティを利用しています。全員がrootとしてログインする(これは重大なセキュリティリスクです)のではなく、ユーザーに一時的な管理権限が付与されます。/etc/sudoersファイルは、これらの権限の門番として機能します。
エラーが発生するのは、あなたのユーザー名がそのファイルに記載されておらず、アクセスを許可されたグループにも属していないためです。ほとんどのシステムでは、デフォルトでsudoまたはwheelグループを使用してこれを管理しています。これらのグループに属していない場合、システムはあなたを制限された標準ユーザーとして扱います。
アクセス権を復元する方法
方法1:グループメンバーシップによるアプローチ
定義済みの管理グループにユーザーを追加するのが、最もスマートな解決策です。sudoersファイルを整理された状態に保つことができ、監査も容易になります。
UbuntuおよびDebianの場合:
su -
usermod -aG sudo your_username
CentOS、Fedora、RHELの場合:
su -
usermod -aG wheel your_username
重要な警告: -Gフラグを使用する際は、必ず-a(追加)フラグを併用してください。-aを付けずにusermod -G wheel usernameを実行すると、そのユーザーが所属している他のすべてのグループ(docker、vboxusers、www-dataなど)から誤って削除されてしまいます。
方法2:Sudoersファイルを安全に編集する
広範な管理グループに入れずに、特定のユーザーにのみ権限を付与したい場合があります。そのためには、/etc/sudoersを編集する必要があります。ただし、nanoやvimのような標準的なエディタでこのファイルを直接開いてはいけません。
代わりにvisudoを使用してください。このユーティリティは、他の変更からファイルをロックし、さらに重要なことに、保存前に構文チェックを行います。このファイル内でスペースが1つ欠けているだけで、すべてのユーザーがsudoアクセスできなくなる可能性があります。
- エディタを開く:
su -c "visudo" - ユーザー指定(user specifications)のセクションを探します。
- 最下部に以下の行を追加します:
your_username ALL=(ALL:ALL) ALL
- 保存して終了します。入力ミスでシステムを壊す可能性がある場合、`visudo`が通知してくれます。
### 方法3:rootパスワードがない場合の緊急修正
rootパスワードを紛失し、sudoアクセスもできない場合、実質的に締め出された状態になります。AWSのようなクラウドプロバイダーであれば、ボリュームを別のインスタンスにアタッチする必要があるかもしれません。物理的なアクセス(または仮想コンソール)がある場合は、rootシェルで起動することができます:
- マシンを再起動し、`Shift`または`Esc`を連打してGRUBメニューを表示させます。
- カーネルを選択し、`e`を押して起動パラメータを編集します。
- `linux`で始まる行を探します。その末尾に`rw init=/bin/bash`を追記します。
- `Ctrl+X`を押して起動します。パスワードを求められることなく、rootプロンプトが表示されます。
- ユーザーをグループに追加します:`usermod -aG sudo your_username`
- `exec /sbin/init`と入力して、通常の起動を再開します。
## 変更の確認
グループの変更は現在のセッションには適用されません。完全にログアウトするか、`su - your_username`を実行して新しいセッションを開始する必要があります。確認するには、以下を実行してください:
groups
Ubuntuの場合、出力に`27(sudo)`が含まれているはずです。最後に、簡単なコマンド`sudo whoami`でテストしてください。ターミナルに`root`と表示されれば、権限は復元されています。
## 今後のためのベストプラクティス
Linuxの権限管理はバランスが重要です。これらの問題を解決する際、私はよく[Unix Permissions Calculator](https://toolcraft.app/en/tools/developer/unix-permissions)を使用して、`755`や`664`といった`chmod`の値が異なるユーザー層にどのように影響するかを視覚的に確認しています。これは、重大なセキュリティホールを生む「とりあえず777にする」という誘惑を避けるための優れた方法です。
再び締め出されるのを防ぐために:
- **予備の管理者を確保する:** 常に少なくとも2つのアカウントがsudoアクセス権を持っているようにしてください。
- **「2つ目のターミナル」ルール:** `/etc/sudoers`を編集する際は、現在のターミナルウィンドウを開いたままにしておいてください。*2つ目*のウィンドウを開き、そこで`sudo`をテストします。もし何かを壊してしまっても、最初のウィンドウでエラーを修正できます。
- **グループを優先する:** 新しいユーザーごとに`sudoers`ファイルを編集するよりも、`wheel`や`sudo`グループを介してアクセスを管理する方が、ミスが大幅に少なくなります。

