sudo コマンド実行時のポリシーを管理する /etc/sudoers ファイル内の覚えておいた方が良さそうな設定まとめ

Written by @ryysud

Oct 19, 2018 15:32 · 2046 words · 5 minutes read #linux

まえおき

これまで、あるユーザーに sudo 権限を追加するぐらいの作業でしか /etc/sudoers を触ったことがなく(今となっては完全に忘れてる…。)、他にどんな設定があるのか興味が出たので調べてみました。また、私自身の独断と偏見で(これぐらいは覚えておいた方がいいかな?と感じた)設定をピックアップしてまとめただけで、全てを網羅するわけではありませんので悪しからず。備忘録的な側面のが強いです。

/etc/sudoers ファイルとは?

タイトルの通りで、別のユーザー権限でプログラムを実行するため sudo コマンド(一般的には root ユーザーで実行するケースが多いかな?)のポリシーを管理しているファイルで、visudo コマンドで編集が可能となっている。直接 /etc/sudoers を編集することも可能だが、visudo を使うと syntax error などもしてくれるので visudo を使うのが間違いないと思ってます。

検証に利用する OS と前準備

以下の Dockerfile を元にローカルに Docker Container で起動させた CentOS 7 を利用していきます。

  • 検証に必要なコマンド群をインストール
  • root のパスワード変更( root のパスワードは iikunitsukuro )
  • 検証用のユーザー anonymous1 を作成( anonymous のパスワードは kamakurabakubu1 )
  • 検証用のユーザー anonymous2 を作成( anonymous のパスワードは kamakurabakubu2 )
  • 検証用のユーザー anonymous3 を作成( anonymous のパスワードは kamakurabakubu3 )
# このような Dockerfile
$ cat Dockerfile
FROM centos:7

# 検証に必要なコマンド群をインストール
RUN yum install -y sudo man vim && \
    echo 'echo haha!' > /usr/local/bin/haha && \
    chmod a+x /usr/local/bin/haha

# root のパスワード変更
RUN echo iikunitsukuro | passwd --stdin root

# 検証用のユーザー anonymous[1-3] を作成
RUN groupadd -g 10000 anonymous && \
    useradd -g 10000 -G anonymous -u 10000 anonymous1 && \
    useradd -g 10000 -G anonymous -u 10001 anonymous2 && \
    useradd -g 10000 -G anonymous -u 10002 anonymous3 && \
    echo kamakurabakubu1 | passwd --stdin anonymous1 && \
    echo kamakurabakubu2 | passwd --stdin anonymous2 && \
    echo kamakurabakubu3 | passwd --stdin anonymous3

CMD ["/bin/bash"]

# 実行コマンド
$ docker build -t custom-centos7 .
$ docker run -it --rm --name dev custom-centos7

詳細なバージョンはこんな感じ

$ docker run --rm custom-centos7 cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

$ docker run --rm custom-centos7 uname -a
Linux 802837912b6f 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:55:56 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

/etc/sudoers の主要設定 ①( sudo の実行許可関連 )

sudo の実行許可関連の設定

以下のルールに乗っ取り visudo で /etc/sudoers に設定を追加することで sudo の実行許可を制御することが可能となります。また、各値は ALL を指定すると全ての値となり、カンマ( , )で区切ると複数指定が可能となります。
※ わかりやすいように変数の形で表記しているので実際に利用する際には値を置換するイメージ

意味 備考
ALLOW_USER 制御対象となるユーザー
ALLOW_GROUP 制御対象となるグループ 頭に % を付けるとグループ扱いとなる
ALLOW_HOST sudo の実行を許可するホスト
ALLOW_USERS_TO_SWITCH sudo を実行する際に切り替え可能なユーザー ALL または自身を含めないと sudo command なシンプルな実行は不可能となる
ALLOW_COMMAND sudo の実行を許可するコマンド 頭に NOPASSWD: を付与するとパスワードなしで実行可能となる
# ユーザーをベースに制御する場合
ALLOW_USER ALLOW_HOST=(ALLOW_USERS_TO_SWITCH) ALLOW_COMMAND

# グループをベースに制御する場合(頭に % を付けるとグループ扱いとなる)
%ALLOW_GROUP ALLOW_HOST=(ALLOW_USERS_TO_SWITCH) ALLOW_COMMAND

上記のルールに乗っ取った例1

  • anonymous1 ユーザー を対象に制御
  • 全てのホストから実行可能
  • 自身を含む全てのユーザーに切り替えての実行が可能
  • 全てのコマンドが実行可能
  • パスワードなしで実行可能
anonymous1 ALL=(ALL) NOPASSWD:ALL

上記のルールに乗っ取った例2

  • anonymous2 ユーザー を対象に制御
  • 全てのホストから実行可能
  • anonymous3 ユーザーに切り替えたときのみ実行可能
  • /bin/ls と /bin/pwd コマンドのみ実行可能
  • パスワードなしだと実行不可能
anonymous2 ALL=(anonymous3) /bin/ls, /bin/pwd

上記の設定を適用すると以下な挙動

anonymous1 ユーザーは最強権限なので、なにも問題なし。

# ユーザー切り替え
[root@ba87c907256d ~]$ su - anonymous1

# どんなコマンドでも実行可能
[anonymous1@ba87c907256d ~]$ sudo whoami
root

[anonymous1@ba87c907256d ~]$ sudo echo $HOME
/home/anonymous1

# anonymous2 ユーザーに切り替えての実行も可能
[anonymous1@ba87c907256d ~]$ sudo -u anonymous2 whoami
anonymous2

anonymous2 ユーザーは anonymous3 に切り替えたときのみ、パスワードありで /bin/ls と /bin/pwd コマンドが実行可能となる。(他のコマンドはどうやっても実行不可能)

# ユーザー切り替え
[root@ba87c907256d ~]$ su - anonymous2

# パスワードが求められる、かつ指定されたユーザーに切り替えての実行許可コマンドしか実行できない
[anonymous2@ba87c907256d ~]$ sudo whoami
[sudo] password for anonymous2:
Sorry, user anonymous2 is not allowed to execute '/bin/whoami' as root on ba87c907256d.

[anonymous2@ba87c907256d ~]$ sudo ls /
[sudo] password for anonymous2:
Sorry, user anonymous2 is not allowed to execute '/bin/ls /' as root on ba87c907256d.

# anonymous3 ユーザーに切り替えての /bin/ls は実行可能
[anonymous2@ba87c907256d ~]$ sudo -u anonymous3 ls /
[sudo] password for anonymous2:
anaconda-post.log  bin	dev  etc  home	lib  lib64  media  mnt	opt  proc  root  run  sbin  srv  sys  tmp  usr	var

/etc/sudoers の主要設定 ②( 環境変数関連 )

Defaults env_reset

こちらの設定があると、sudo 実行時のユーザーで保持していた環境変数はリセットされ、以下の環境変数のみが設定された上でコマンドが実行される。

  • HOSTNAME
  • TERM
  • LS_COLORS
  • PATH
  • MAIL
  • LOGNAME
  • USER
  • USERNAME
  • HOME
  • SHELL
  • SUDO_*

Defaults env_keep

こちらの設定で列挙された環境変数には、上記の env_reset を適用されなくなり、実行元の環境変数をそのまま引き継いだ上でコマンドが実行される。

Defaults secure_path

sudo で実行されるコマンドが利用する $PATH。デフォルトだと以下となっているケースが多いので、そのままの設定だと /usr/local/bin 直下などのコマンドは実行することが出来ない。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

以下は、実行できない例となります。

# sudo なしだと $PATH に /usr/local/bin が含まれているので実行可能
[root@6885b699bd06 /]# which haha
/usr/local/bin/haha
[root@6885b699bd06 /]# haha
haha!

# sudo ありだと Defaults secure_path の設定が効いて /usr/local/bin が $PATH にないので実行不可能
[root@6885b699bd06 /]# sudo haha
sudo: haha: command not found

# sudo ありでも $PATH が通ってないだけの話なので絶対パスでは実行可能
[root@6885b699bd06 /]# sudo /usr/local/bin/haha
haha!

参考資料

まとめ

独断と偏見でピックアップして、基本的なところ(デフォルトで設定されている設定群)が理解できたので、とても良かったです。他にどのようなものがあるか気になる方は、参考資料をご覧ください。