2021.09.05  

【CentOS 7, 8】sudoの設定方法と仕様のあれこれ(vagrantで検証)

Linux    

CentoOSのsudoコマンドについてまとめました。本記事は次のような問題を解決します。

  1. sudoコマンドを使用できるようにしたい
  2. sudoの権限の持続時間を知りたい
  3. sudoをパスワードなしで実行したい
  4. sudodersファイルの確認、編集をしたい
  5. sudodersファイルを編集してないのにsudoコマンドが実行できてしまう問題を解決したい

sudoとは

スーパーユーザー(root)や他のユーザー権限で、コマンドを実行する際に使用するコマンドのことです。

次の例ではユーザーhoge1がroot権限でのみ読込可能なsyslogを確認しています。

sudo コマンドを使用せずsyslogを確認
[hoge1@centos8 ~]$ tail -1 /var/log/messages
tail: cannot open '/var/log/messages' for reading: Permission denied

読み込み権限がなく確認できません。次はsudoを使用してみます。

sudo コマンドを使用してsyslogを確認
[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/sudoersNOPASSWD:を設定していれば、永続的にパスワードの入力を省略できます。設定方法については後述します。

sudoの設定方法

方法は2つありますが、記述するファイルが違うだけで、設定内容は同じです。

  1. visudo コマンドを使用して /etc/sudoers を編集する
  2. /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ファイルの権限を変える必要もありません。

visudoコマンド実行例
[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ユーザーでsudo suを実行
[vagrant@centos8 ~]$ sudo su
[root@centos8 vagrant]# 
削除後にvagrantユーザーでsudo suを実行
[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を記述します。
また、先頭に%をつけることでグループ名を指定することも可能です。

記述例: wheel グループの設定
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

上記は/etc/sudoersにデフォルトで設定されています。

CoentOSでは管理者権限用のグループとしてwheelグループが用意されているので、あるユーザーに管理者権限でsudoを実行させたい場合は単純にwheelグループに所属させるだけで設定が完了します。

記述例: hoge1 ユーザーを 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コマンドを実行した際にパスワードの入力を求められなくなります。
記述を省略した場合は、パスワードの入力を求められます。

記述例: NOPASSWDの設定
## Same thing without a password
%wheel        ALL=(ALL)       NOPASSWD: ALL

上記は/etc/sudoersに記述されていますが、デフォルトではコメントアウトされています。


対象コマンド

対象コマンド1, 対象コマンド2, ・・・については実行を許可するコマンドをカンマ区切りで指定します。

ワイルドカードの使用も可能です。

記述例: hoge1ユーザーに全てのユーザー(root含む)権限でlsとcatコマンドの実行を許可
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

参考書籍

参考サイト

sudoers は編集せずに sudoers.d の中に設定を書こう

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信