AWS
が提供しているAmazonLinux2
のsudoers
設定について。
デフォルトで提供されているec2-user
については、パスワードなしでsudo
できるように設定されています。
今回は、AmazonLinux2
でのsudoers
設定についてまとめます。
各種ドキュメント
sudo公式サイトとsudoersのマニュアル。
【余談】sudoのロゴ
いきなり話は脱線しますが、2021年現在のsudo
のロゴってかなりインパクトが強いですよね。
Sudo Sandwich
っていう名前で、2019年からこのSudo Sandwich
が公式ロゴのようです。
© 2019 by Mark Stillman and licensed under CC BY 4.0
それまでのロゴだった盾をモチーフにしたSudo Shield
からはかなりの落差を感じます。
© 2010 by Trent Badger and licensed under CC BY 4.0
ロゴについては公式サイトのSudo Logosに記載があります。
閑話休題
今回確認する環境
今回、sudoers
を確認する環境は、AWS
に構築したAmazonLinux2
になり。
利用したAMIはこちらami-0fd9d20498f0f18a6
この環境でのsudoバージョンは下記となっています。
$ sudo --version
sudo --version
Sudo version 1.8.23
Sudoers policy plugin version 1.8.23
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.23
sudoersを確認する
まずはsudoersを確認してみます。
sudoers
については/etc/sudoers
に配置されているためこちらのファイルを確認します。
sudo cat /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
今回のケースでは設定方法についてのサンプルがコメントで記述されていたり、実際の設定の記載も混在しています。
ここでは有効になっている設定について一つずつ確認してみます。
なお、sudoersにもコメントで記載されていますが。
sudoers
ファイルを直接編集することは推奨されておらず。 visudo
を利用することによりsudoers
を安全に編集する事ができます。
visudo
はsudoers
をエディットするためのコマンド。 同時編集しないようなロック管理だったり構文チェックが通らないと保存できなかったり等々の機能を提供しています。
Defaults !visiblepw
Defaults !visiblepw
visiblepw
が有効になっている場合は、エコーが抑制されていない端末ではsudoの実行が拒否される。
今回の設定では先頭に!がついているのでvisiblepw
がオフの状態となる。(エコーが抑制されていない端末でもsudoが実行できる)
Defaults always_set_home
Defaults always_set_home
always_set_home
が有効になっている場合、sudo
でコマンド実行時にターゲットユーザの環境変数HOMEを設定する。
-u オプション
でユーザを指定しない場合はroot
のHOME
が設定される。
Defaults match_group_by_gid
Defaults match_group_by_gid
match_group_by_gid
が有効になっている場合、suoders
に記載されているすべてのグループ名を解決し、グループ名ではなくグループIDでマッチングする。
この設定が有効なのはsudoコマンドがv1.8.18以上となります。
※match_group_by_gidが無効の場合、ユーザすべてのグループIDをグループ名に解決し、sudoresファイルに記載されているグループ名と比較する。
This setting is only supported by version 1.8.18 or higher.
Defaults always_query_group_plugin
Defaults always_query_group_plugin
always_query_group_plugin
が有効になっている場合、group_plugin
で設定されたグループプラグインを利用して%group
で記述されたグループを解決する。
Defaults env_reset
Defaults env_reset
env_reset
が有効になっている場合、最小限の環境変数でコマンドが実行される。
TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_*
が設定される。
Defaults env_keep
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"
env_keep
にてsudo実行ユーザの環境変数を引き継ぐことができる。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
secure_path
でsudo
で実行するコマンドPATHを指定する。
User specification
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
ユーザがどこ
で誰
になって何のコマンド
を実行できるか設定している。上記の例だと
- rootは任意のホストで任意のユーザとしてコマンド実行可能
- wheelグループは任意のホストで任意のユーザとしてコマンド実行可能
指定方法の詳細については公式ドキュメント例に色々とサンプルがあり、これをみるとわかりやすいかと思います。
#includedir /etc/sudoers.d
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
#includedir
を設定することにより、他のファイルからsudoers
に設定を読み込むことが出来ます。
コメントにも(the # here does not mean a comment)
と注意書きされていますが。
#includedir
の先頭にある#
はコメントを意味するものではなく、#includedir
という指定方法となるため、この行はコメントではない事に注意してください。
AmazonLinux2
では/etc/sudoers.d/
を#includedir
として指定しており。
このディレクトリの中には、90-cloud-init-users
というファイルが存在しています。
この90-cloud-init-users
を確認すると、ec2-user ALL=(ALL) NOPASSWD:ALL
と記載されており。
この設定でec2-user
が任意のホストで任意のユーザでコマンドを実行(NOPASSWD)する事を許可しています。
総評
デフォルトで用意されているec2-user
がどうやってsudo
しているか? をなんとなくでも理解するきっかけにでもなれば幸いです。