Linuxサーバーで一般ユーザーから管理コマンドを実行しようとすると、sudo権限がなく実行できないことがあります。
例えば、既存のbackupユーザーにはsudo権限があるのに、新しく作成したuser01ではsudoを実行できないケースです。
まず権限を確認すると、
sudo -l -U backup
では、
ユーザー backup は次のコマンドを実行できます:
(ALL) NOPASSWD: ALL
と表示されるのに、
sudo -l -U user01
では、
ユーザー user01 はこのホスト上で sudo を実行することを許可されていません。
と表示されます。
この場合、単純にsudoersへ設定を追加すればよい場合もありますが、最初に、
既存ユーザーのsudo権限がどこで設定されているのか
を確認することが重要です。
この記事では、Linuxでsudo権限を確認し、別のユーザーへ同じ権限を追加する方法を紹介します。
sudoとは?
sudoは、一般ユーザーが別のユーザーの権限でコマンドを実行するための仕組みです。
例えば、
sudo systemctl restart httpd
を実行すると、sudoの設定で許可されていれば、一般ユーザーから管理者権限が必要な操作を実行できます。
ただし、
一般ユーザー
↓
sudo
↓
何でもrootとして実行
と自動的になるわけではありません。
「誰が」「どのホストで」「どのユーザーとして」「どのコマンドを実行できるか」はsudoersの設定によって制御されます。
1. sudo権限を確認する
まず対象ユーザーに、どのようなsudo権限が設定されているか確認します。
rootなどsudo設定を確認できる権限で、
sudo -l -U backup
を実行します。
例えば、
(ALL) NOPASSWD: ALL
と表示された場合、backupユーザーには非常に広いsudo権限が設定されています。
別のユーザーも確認します。
sudo -l -U user01
ここで、
ユーザー user01 はこのホスト上で sudo を実行することを許可されていません。
などと表示されれば、少なくとも現在のsudo設定では対象ユーザーに利用可能なsudo権限がないことが分かります。
2. sudoersのどこに設定されているか調べる
既存ユーザーにsudo権限がある場合、いきなり新しい設定を書くよりも、
既存ユーザーはどのように設定されているのか
を調べます。
例えばbackupユーザーなら、
grep -R "backup" /etc/sudoers /etc/sudoers.d/ 2>/dev/null
を実行します。
例えば、
/etc/sudoers:backup ALL=(ALL) NOPASSWD: ALL
/etc/sudoers:Defaults:backup !requiretty
と表示されたとします。
この場合、backupユーザーの設定は、
/etc/sudoers
に直接記述されていることが分かります。
3. 「ALL=(ALL) NOPASSWD: ALL」の意味
例えば、
backup ALL=(ALL) NOPASSWD: ALL
という設定があったとします。
大まかには、
backup
│
├─ ALL → 対象ホスト
│
├─ (ALL) → 実行ユーザー
│
├─ NOPASSWD → パスワード入力不要
│
└─ ALL → 実行可能コマンド
という意味です。
つまり、かなり強い権限です。
特に、
NOPASSWD: ALL
は、sudo実行時にパスワード入力なしで幅広いコマンドを実行できる設定です。
便利だからという理由だけで、すべてのユーザーへ設定するのは避けた方がよいでしょう。
4. sudoersを直接エディタで編集しない
sudo設定を変更するときに、
vi /etc/sudoers
で直接編集したくなるかもしれません。
しかし、sudoersには決められた構文があります。
記述を間違えるとsudoが正常に利用できなくなる可能性があります。
そのため、基本的には、
visudo
を使用します。
visudoには、sudoersの編集時に構文を確認する仕組みがあります。
5. 新しいユーザーへsudo権限を追加する
例えばuser01へ、既存のbackupユーザーと同じ、
(ALL) NOPASSWD: ALL
を設定するのであれば、visudoでsudoersを編集して、
user01 ALL=(ALL) NOPASSWD: ALL
を追加する方法があります。
設定後、
sudo -l -U user01
を実行します。
想定した権限が表示されるか確認します。
6. /etc/sudoers.d/へ分けて設定する方法
sudoの設定をすべて/etc/sudoersへ直接書くのではなく、
/etc/sudoers.d/
へユーザーや用途ごとの設定ファイルを作成する方法もあります。
例えば、
visudo -f /etc/sudoers.d/user01
として、
user01 ALL=(ALL) NOPASSWD: ALL
を記述します。
この方法なら、
/etc/sudoers
│
├─ 基本設定
│
└─ #includedir /etc/sudoers.d
│
├─ backup
├─ operator
└─ user01
のように設定を分離できます。
複数の管理ユーザーが存在する環境では、こちらの方が設定を管理しやすい場合があります。
ただし、sudoers側で/etc/sudoers.dが読み込まれる構成になっていることを確認してください。
7. 設定ファイルのパーミッションにも注意する
/etc/sudoers.d/へファイルを作成する場合は、所有者やパーミッションにも注意します。
例えば確認するなら、
ls -l /etc/sudoers.d/
です。
sudoers関連ファイルは不用意に一般ユーザーから変更できる状態にしてはいけません。
通常はroot管理とし、必要に応じて、
chmod 440 /etc/sudoers.d/user01
など適切な権限にします。
8. 設定後に構文を確認する
sudoersの設定を確認するには、
visudo -c
を使用できます。
問題がなければ、環境によって、
/etc/sudoers: parsed OK
などと表示されます。
/etc/sudoers.d/に設定ファイルを作成した場合も、読み込まれているファイルについて確認できます。
設定を変更したら、
編集
↓
構文確認
↓
sudo権限確認
↓
実際のコマンドで確認
という流れにすると安全です。
9. sudo -l -Uで設定結果を確認する
設定後、
sudo -l -U user01
を実行します。
例えば、
ユーザー user01 はこのホスト上で次のコマンドを実行できます:
(ALL) NOPASSWD: ALL
など、意図した設定が表示されればsudoersの設定が反映されていることを確認できます。
ただし、これだけで終わらず、対象ユーザーへ切り替えて実際に確認します。
例えば、
su - user01
として、
sudo id
を実行します。
正常なら、
uid=0(root) gid=0(root) groups=0(root)
など、rootとして実行されたことを確認できます。
10. NOPASSWDを付けない場合
必ずしも、
NOPASSWD: ALL
にする必要はありません。
例えば、
user01 ALL=(ALL) ALL
なら、sudo実行時に通常はユーザー自身のパスワード入力が求められます。
つまり、
user01 ALL=(ALL) ALL
と、
user01 ALL=(ALL) NOPASSWD: ALL
では意味が違います。
自動バックアップなど、
スクリプト
↓
sudoコマンド
↓
パスワード入力できない
という用途ではNOPASSWDが必要になる場合があります。
一方、管理者が手作業で利用するアカウントなら、本当にNOPASSWDが必要なのか検討します。
11. ALLではなく必要なコマンドだけ許可する
さらに安全性を高めたい場合は、
NOPASSWD: ALL
ではなく、必要なコマンドだけを許可する方法があります。
例えば、特定の管理コマンドだけ必要なら、
user01 ALL=(root) /usr/bin/systemctl restart httpd
のように制限する考え方です。
実際に指定する場合は、
command -v systemctl
などで実行ファイルのパスを確認します。
つまり、
何でもsudo可能
↑
│ 権限が大きい
│
必要なコマンドだけ
となります。
業務サーバーでは、
そのユーザーが本当に必要な権限だけを付与する
という考え方が重要です。
12. wheelグループを使う方法
Red Hat系のLinuxでは、wheelグループにsudo権限が設定されていることがあります。
例えば、
grep wheel /etc/sudoers
で、
%wheel ALL=(ALL) ALL
などが設定されている環境です。
この場合、
usermod -aG wheel user01
としてuser01をwheelグループへ追加する方法があります。
確認するには、
id user01
または、
groups user01
を使用します。
ただし、
sudoを使わせたい=必ずwheelへ追加
ではありません。
既存環境が、
個別sudoers設定
で管理されているのか、
wheelグループ
で管理されているのかを確認して、既存の運用に合わせます。
13. Debian・Ubuntu系ではsudoグループの場合もある
Linuxディストリビューションによって運用方法が異なります。
Ubuntuなどでは、
sudo
グループによってsudo権限を管理している環境があります。
例えば、
getent group sudo
で確認できます。
つまり、
RHEL / Rocky Linux系
↓
wheel
Ubuntu / Debian系
↓
sudo
という構成がよくありますが、実際のsudoers設定を確認して判断してください。
14. Defaults:user !requirettyとは?
既存ユーザーを調べたとき、
Defaults:backup !requiretty
のような設定が見つかることがあります。
これはsudo実行時のTTY要件に関係する設定です。
古いRed Hat系環境や、自動処理・バックアップスクリプトなどで見かけることがあります。
ここで注意したいのは、
backupにあるから
↓
user01にもコピー
と機械的に設定しないことです。
現在の環境で必要なのか、既存設定が古い運用の名残ではないかを確認します。
15. 既存ユーザーと同じ権限を付ける場合の確認方法
例えば、
backupユーザー
↓
sudo可能
user01
↓
sudo不可
という状況なら、私ならまず、
sudo -l -U backup
sudo -l -U user01
で比較します。
次に、
grep -R "backup" /etc/sudoers /etc/sudoers.d/ 2>/dev/null
を実行します。
これによって、
backupのsudo権限は
どこから来ている?
↓
ユーザー個別設定?
グループ?
sudoers.d?
を調べます。
原因が分かってから、新しいユーザーへ必要な設定を追加します。
16. sudoersだけでなくグループも確認する
grepでユーザー名が見つからない場合があります。
例えば、
grep -R "backup" /etc/sudoers /etc/sudoers.d/
で何も表示されなくても、sudo権限がないとは限りません。
ユーザーが、
wheel
sudo
独自の管理者グループ
に所属し、そのグループへsudo権限が与えられている可能性があります。
そのため、
id backup
も確認します。
例えば、
groups=10(wheel)
なら、wheelグループ経由で権限を取得していないか調べます。
17. sudoersの変更で特に注意すること
sudo設定はサーバーの管理権限に直結します。
特にリモートサーバーでは、
sudoers変更
↓
設定ミス
↓
sudoできない
↓
rootへ昇格できない
となると復旧が面倒になります。
そのため、SSHで作業する場合は、現在root権限を持っているセッションを不用意に閉じず、別セッションから新しい設定が正常に動作することを確認してから終了すると安全です。
私ならこの順番で設定する
既存ユーザーと同じsudo権限を別ユーザーへ付与する場合は、次の順番で進めます。
既存ユーザーはsudoできる
↓
sudo -l -U backup
↓
権限内容を確認
↓
grep /etc/sudoers
/etc/sudoers.d/
↓
設定元を特定
↓
グループ経由ならidも確認
↓
本当に同じ権限が必要?
┌────┴────┐
YES NO
↓ ↓
同等設定 必要なコマンド
だけ許可
↓
visudoで設定
↓
visudo -c
↓
sudo -l -U user01
↓
対象ユーザーで実行確認
この順番なら、既存設定を理解しないままsudoersへ設定を追加することを防げます。
まとめ
Linuxで新しいユーザーへsudo権限を追加したい場合、いきなり、
user01 ALL=(ALL) NOPASSWD: ALL
を追加するのではなく、まず既存ユーザーの設定を確認します。
sudo -l -U backup
で権限を確認し、
grep -R "backup" /etc/sudoers /etc/sudoers.d/ 2>/dev/null
で設定元を調査します。
ユーザー名がsudoersに存在しない場合は、
id backup
でグループ経由の権限も確認します。
設定変更には、
visudo
または、
visudo -f /etc/sudoers.d/user01
を使用し、変更後は、
visudo -c
と、
sudo -l -U user01
で確認します。
そして最も重要なのは、
既存ユーザーが
NOPASSWD: ALLだから、新しいユーザーにも同じ設定をコピーする
と単純に考えないことです。
そのユーザーが必要とする作業を確認し、可能であれば必要なコマンドだけsudoで許可する方が安全です。



コメント