SUDOの設定を見てみた | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

Linuxのsudoersファイルの設定内容について、

そういえば登録内容についてあんまり分かってなかったと気づいたので、この機会に勉強してみます。

 

確認環境はCentOS8。

sudoバージョンは1.8.29。

 

 

もくじ

1.sudoersファイルとはそもそも、sudoとは / /etc/sudoersファイルとは

2.登録内容を見てみる ( sudo実行時のオプション機能指定(Defaults ~) / ユーザ権限の付与設定 )

3.試してみた

 

1.sudoersファイルとは

◎そもそも、sudoとは

Linuxで、一般ユーザが、管理者(root)や別のユーザとして、コマンドを実行できるようにしてくれる。

 

◎/etc/sudoersファイルとは

sudoに関する設定を行うためのファイル。

一般ユーザが好き勝手に管理者や他ユーザの権限でコマンド実行が出来てしまうと、

セキュリティ上よくない。

ので、どのような行為をどのようなユーザに許可するのか等を設定するためのファイルが、/etc/sudoersファイルとなる。

通常はこのファイルを直接編集せず、visudoコマンドで編集する。またファイルの特性上、一般ユーザは編集できず、rootユーザで編集する必要がある。

 

 

2.登録内容を見てみる

デフォルト状態の/etc/sudoersは以下の通り。(めちゃ長いけどほとんどコメントアウトっていう…)

## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem


## Command Aliases
## These are groups of related commands...

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable

## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Refuse to run if unable to disable echo on the tty.
#
Defaults   !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults    always_set_home
Defaults    match_group_by_gid

# Prior to version 1.8.15, groups listed in sudoers that were not
# found in the system group database were passed to the group
# plugin, if any. Starting with 1.8.15, only groups of the form
# %:group are resolved via the group plugin by default.
# We enable always_query_group_plugin to restore old behavior.
# Disable this option for new behavior.
Defaults    always_query_group_plugin

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

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

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

思った以上に色々設定できるみたい。

 

 

コメントアウトされていない箇所だけを改めて抜き出すと、

「Defaults ~」の部分と、「ユーザ名 ALL…」などと書かれた部分に分けられる。

前者はsudo実行時のオプション機能指定、後者はユーザ権限の付与対象設定となっている。

# Defaults ~ は、sudo実行時のオプション機能を指定する。

Defaults   !visiblepw

Defaults    always_set_home
Defaults    match_group_by_gid

Defaults    always_query_group_plugin
Defaults    env_reset

Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

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

 

#管理者権限の付与対象設定

root    ALL=(ALL)       ALL

%wheel  ALL=(ALL)       ALL

 

 

◎sudo実行時のオプション機能指定(Defaults ~)

指定できるオプションはとても多いので、全容はmanページの「SUDOERS のオプション」を参照。

ここでは、先ほど抜き出した箇所についてのみ説明する。

 

・visiblepw

ユーザのパスワード入力時、ターミナルでパスワード入力内容を非表示にする制御ができないケースでは、sudo実行を許可するかどうか。デフォルトでは「!」がついているため、拒否する設定となっている。

sshでのコマンド実行時などで、パスワードが表示されてしまう場合でも、このプロパティを許可する設定にしておけば、sudoを実行できるようになる。

ただやはりパスワードが表示されてしまうのは良くないので、必要でない限りは、セキュリティ上、デフォルトのままとしておくのが良さげ。

 

・always_set_home

環境変数HOMEを、sudo切替後のユーザのホームディレクトリに設定するかどうか。
ただし、always_set_homeの値よりも以下オプションのほうが優先される。
 ・env_resetオプション有効時:「設定する」ことになる。
 ・env_keepのリストにHOMEが存在する時:環境変数HOMEの値は設定し直されず、そのままとなる。


・match_group_by_gid

manページに載ってません。なんだこれ…(´・ω・`)

名前の同じグループが複数あったときに名称じゃなくてGIDで判断するよってことかな…

 

・always_query_group_plugin

%group形式のグループ解決時に、group_pluginオプションに設定されたグループプラグインを常に使用するかどうか。

…と言っても分かりづらいので、1つずつかみ砕いて説明する。

 

「%group形式のグループ解決」とは…

権限内容の設定は、ユーザやグループに対して行う。そのため設定時には、ユーザ名やグループ名を指定する必要があるが、グループ名を記載する時は「%グループ名」という書式で書くことになる。

そのため、「%group形式のグループ解決」とは、「%グループ名」で書かれたグループをsudoが認識することを指している。

 

「group_pluginオプションに設定されたグループプラグイン」とは…

UnixのOSユーザグループは、デフォルトでは/etc/groupに情報が格納され、利用できるようになっている。

通常はこの標準機能で事足りるが、あえて非Unix系のグループの仕組みを使いたいときがあるかもしれない。そのような時に、非Unix系のグループの仕組みをプラグインとして入れることが出来るようになっている。いわばグループの拡張機能である。

拡張機能を入れるには、group_pluginオプションに、そのプラグインを指定することになる。

 

…といっても、具体的にどんなプラグインがあるのかは不明…。

ググっても事例がほとんど出てこなかったので、もしかしたらあまり使われていない機能なのかも。

Unix系のグループを使えれば、基本的に問題ない気がするので。


 

・env_reset

sudo実行時に、最小限の環境変数のみを残し、他をリセットするかどうか。

最小限の環境とは、TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME、及び SUDO_* である。sudo実行時、他にも残したい環境変数がある場合は、次のenv_keepオプションで指定する。


・env_keep
env_reset オプションが有効であっても、 ユーザの環境にそのまま保存される環境変数。

デフォルトでは、例えばホスト名(HOSTNAME)などが、ユーザが切り替わっても保存されるようになっている。

 

・secure_path

sudoで実行するコマンドのパス。いわゆる環境変数のPATHの値をイメージすればOK。
逆に言うと、パスの通っていないコマンドはsudoでは実行できないということになる。

 

 

◎ユーザ権限の付与設定

おそらくこの部分の設定のほうが有名だと思われる。

root    ALL=(ALL)       ALL

%wheel  ALL=(ALL)       ALL

 

”① ②=(③) ④” という形で記載されている部分。

ユーザ権限の設定を行う箇所となる。

 

①~④には、それぞれ以下の内容を設定する。

 ①だれ(OSユーザ/OSグループ)が

 ②どこ(ホスト)で

 ③だれ(OSユーザ/OSグループ)になって

 ④何を出来るか

 

デフォルトで設定されている内容は、

(上)

 ①rootユーザが、

 ②任意(ALL)のホスト(ローカルサーバ、別のサーバともOK)で、

 ③任意(ALL)のユーザになって、

 ④任意(ALL)のコマンドを実行できる

(下)

 ①wheelグループに所属するユーザが、

 ②任意(ALL)のホスト(ローカルサーバ、別のサーバともOK)で、

 ③任意(ALL)のユーザになって、

 ④任意(ALL)のコマンドを実行できる

となる。

 

rootユーザはなんでもできる権限を持っているからこそ、

通常のユーザがアクセスすべきでない情報を見ることが出来てしまったり、さらにはOS環境を壊すこともできてしまったりする。

そのためOS環境構築時以外は、ふつう、rootユーザは利用せず、一般ユーザを用いて操作をすることになる。

しかし操作によっては、一般ユーザでは実行できないものもあり、何かと不便が生じる。

そこで、root権限の一部または全部でのコマンド実行を、一般ユーザにも許可することで、セキュリティと利便性のバランスを保つことができるようになっている。

 

 

3.試してみた

testuserというユーザで、パッケージのインストールに用いるyumとdnfコマンドだけは

実行できるようにしたい時を試してみる。

 

何も設定していないと、以下のように操作がはじかれてしまう。

[testuser@localhost ~]$ yum install python3
Error: This command has to be run under the root user. 

 

そこで、以下のような設定をsudoersファイルに追加する。

testuser ALL=(ALL) /usr/bin/yum, /usr/bin/dnf 

 

/etc/sudoersファイルは直接編集ではなく、visudoコマンド実行により編集することが推奨されるため、

rootユーザで以下のように操作する。

 [root@localhost ~]# visudo

 

vimのようにしてエディタが開くので、追加したい設定を記述の上、:wqする。

するとvisudoの機能で、文法チェックをしてくれる。問題なければそのまま閉じられるが、文法ミスがあると以下のようなエラーが出力される。

>>> /etc/sudoers: syntax error near line 101 <<<
What now? 

 

文法ミスのある状態で保存するのは良くないので、「What now?」の後に「e」を入力して再編集する。

その後の操作は同じ。

>>> /etc/sudoers: syntax error near line 101 <<<
What now? e

 

無事に登録出来たら、testuserに切り替えてチェック。

実行コマンドの頭に、sudoを付け忘れずに。

[testuser@localhost ~]$ sudo yum install python3

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for testuser:

初回なのでセキュリティポリシーの忠告が入るが、あまり気にせず、testuser自身のパスワードを入力する。(rootユーザのパスワードではない)

(初めてこの忠告見た時はかなりびびってキャンセルした記憶が…w 正答に実行しているので気にしなくてOK。)

 

すると、実行コマンドが無事に実行される。

[sudo] password for testuser:
Last metadata expiration check: 0:05:58 ago on Wed 17 Mar 2021 06:18:01 AM PDT.
Package python36-3.6.8-2.module_el8.3.0+562+e162826a.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

 

 

ちなみに、sudoの -u オプションを付与すると、実行ユーザを指定することができる。

-u オプションをつけなかった場合はrootユーザとしてコマンドを実行、

-u testuser2 とつけた場合はtestuser2としてコマンドを実行する意味になる。

ジョブなどの一連の処理をシェルスクリプトに落とし込む時に、部分的に他ユーザとして実行したいといった時に便利。

 

 

今回は以上!