CentoOSのsudoコマンドについてまとめました。本記事は次のような問題を解決します。
- sudoコマンドを使用できるようにしたい
- sudoの権限の持続時間を知りたい
- sudoをパスワードなしで実行したい
- sudodersファイルの確認、編集をしたい
- sudodersファイルを編集してないのにsudoコマンドが実行できてしまう問題を解決したい
sudoとは
スーパーユーザー(root)や他のユーザー権限で、コマンドを実行する際に使用するコマンドのことです。
次の例ではユーザーhoge1がroot権限でのみ読込可能なsyslogを確認しています。
[hoge1@centos8 ~]$ tail -1 /var/log/messages
tail: cannot open '/var/log/messages' for reading: Permission denied
読み込み権限がなく確認できません。次はsudoを使用してみます。
[hoge1@centos8 ~]$ sudo tail -1 /var/log/messages
[sudo] password for hoge1:
Sep 5 17:41:20 centos8 systemd[1]: zabbix-agent2.service: Failed with result 'exit-code'.
sudoを使用することにより、root権限
でコマンドが実行されるため、ログの内容を確認できました。
ちなみにtail -1
はファイル末尾の一行を確認するためのコマンドです。
sudoの権限の持続時間
sudo
コマンド実行時にパスワードの入力を求められますが(※)、一度sudoコマンドを実行すると5分程度認証が保持されるため、その間はパスワード入力なしでコマンドを実行できます。
※ /etc/sudoers
にNOPASSWD:
を設定していれば、永続的にパスワードの入力を省略できます。設定方法については後述します。
sudoの設定方法
方法は2つありますが、記述するファイルが違うだけで、設定内容は同じです。
- visudo コマンドを使用して /etc/sudoers を編集する
- /etc/sudoers.d ディレクトリの中に設定ファイルを作成する
1. visudo コマンドとsudoersファイルの仕様
visudo
を実行すると、sudoの設定ファイルである/etc/sudoers
を編集できます。
当ファイルはvi
で編集することも可能ですが、デフォルト設定では書き込み権限がありません。
[root@centos8 vagrant]# ls -l /etc/sudoers
-r--r----- 1 root root 4328 9月 5 15:13 /etc/sudoers
書き込み権限を付与することも可能だが、sudo
コマンドはsudoers
に書き込み権限が付与されていると実行できなくなるため、sudoの設定を行うには素直にvisudo
を使用するのが無難です。
visudo
コマンドの実行には特にオプション等は必要ありません。
また、sudoersファイルの権限を変える必要もありません。
[root@centos8 vagrant]# visudo
2. /etc/sudoers.d に設定ファイルを作成する方法について
/etc/sudoers.d に設定ファイルを作成することでも、sudoの設定を行うことができます。
vagrantでCentOS8をインストールすると、デフォルトで次のような設定がされています。
[root@centos8]# ls -l /etc/sudoers.d
total 4
-r--r-----. 1 root root 45 12月 18 2020 vagrant
[root@centos8] ~#
[root@centos8 ~]# cat /etc/sudoers.d/vagrant
vagrant ALL=(ALL) NOPASSWD: ALL
/etc/sudoers
に設定がないのに、vagrantユーザーでsudo su
コマンドが実行できるのはこのファイルのおかげです。
ちなみに、/etc/sudoers.d
にある設定ファイルを読み込むには、/etc/sudoers
で次の設定が必要になります。
#includedir /etc/sudoers.d
こちらの設定はコメントアウトされているように見えますが、includedir
に関しては例外的に#
がコメントになりません。
試しにvagrantのcentOS8で#includedir /etc/sudoers.d
を削除してみると次のようになります。
[vagrant@centos8 ~]$ sudo su
[root@centos8 vagrant]#
[vagrant@centos8 ~]$ sudo su
[sudo] password for vagrant:
vagrant is not in the sudoers file. This incident will be reported.
sudo設定の書式
基本的な書式は次のようになります。
ユーザー名 ホスト名 = (権限) [NOPASSWD:] 対象コマンド1, 対象コマンド2, ・・・
visudo
コマンドでも、/etc/sudoers.d
に設定ファイルを作成する方法でも、設定内容は同じです。
ユーザー名
ユーザー名
のところには、sudoで実行コマンドや接続先の制限を行うユーザー名を設定します。
制限を行わない場合はALL
を記述します。
また、先頭に%
をつけることでグループ名を指定することも可能です。
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
上記は/etc/sudoers
にデフォルトで設定されています。
CoentOSでは管理者権限用のグループとしてwheel
グループが用意されているので、あるユーザーに管理者権限でsudoを実行させたい場合は単純にwheelグループに所属させるだけで設定が完了します。
[root@centos8 vagrant]# gpasswd -a hoge1 wheel
Adding user hoge1 to group wheel
[root@centos8 vagrant]# id hoge1
uid=1002(hoge1) gid=1002(hoge1) groups=1002(hoge1),10(wheel)
[root@centos8 vagrant]# su - hoge1
Last login: 日 9月 5 16:54:32 JST 2021 on pts/0
[hoge1@centos8 ~]$ whoami
hoge1
[hoge1@centos8 ~]$ sudo su
[sudo] password for hoge1:
[root@centos8 hoge1]# whoami
root
ホスト名
基本書式の話に戻ります。
ユーザー名 ホスト名 = (権限) [NOPASSWD:] 対象コマンド1, 対象コマンド2, ・・・
ホスト名
のところには、コマンドの実行を行うホストを指定します。ホスト名、IPアドレスが指定できます。
制限を行わない場合はALL
を記述します。
権限
(権限)
のところには、コマンドを実行する際の権限を指定します。
(hoge1)
と設定するとhoge1ユーザーの権限でコマンドが実行されます。
この設定をした場合にcat
コマンドを実行すると、hoge1に読み込み権限がないファイルについてはcat
が行えなくなります。
制限を行わない場合はALL
を記述します。
NOPASSWD
[NOPASSWD:]
は任意で記述します。
記述するとsudoコマンドを実行した際にパスワードの入力を求められなくなります。
記述を省略した場合は、パスワードの入力を求められます。
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
上記は/etc/sudoers
に記述されていますが、デフォルトではコメントアウトされています。
対象コマンド
対象コマンド1, 対象コマンド2, ・・・
については実行を許可するコマンドをカンマ区切りで指定します。
ワイルドカードの使用も可能です。
hoge1 ALL=(ALL) /bin/ls, /bin/cat
設定するユーザーやコマンドについは、エイリアスを設定することも可能です。
下記の例では、hoge1, hoge2, hoge3それぞれのユーザーに、全てのユーザー(root含む)権限でls、cat、rmコマンドの実行を許可しています。
User_Alias HOGE_USER_LIST = hoge1, hoge2, hoge3
Cmnd_Alias HOGE_CMD_LIST = /bin/ls, /bin/cat, /bin/rm
HOGE_USER_LIST ALL=(ALL) HOGE_CMD_LIST