macOSにおける運用を続けていくためのsudo設定
適切な権限管理や安定した運用、セキュリティの関係上、 特定のコマンドのみ sudo
を許可したいということがあるかと思います。
今回は sudo
の設定方法とTipsを紹介していきます。
sudoの設定
sudo
の設定は /etc/sudoers
で記載された内容が反映されます。
以下はmacOSのデフォルトの設定です。
## sudoers file.
##
## This file MUST be edited with the 'visudo' command as root.
## Failure to use 'visudo' may result in syntax or file permission errors
## that prevent sudo from running.
##
## See the sudoers man page for the details on how to write a sudoers file.
##
##
## Host alias specification
##
## Groups of machines. These may include host names (optionally with wildcards),
## IP addresses, network numbers or netgroups.
# Host_Alias WEBSERVERS = www1, www2, www3
##
## User alias specification
##
## Groups of users. These may consist of user names, uids, Unix groups,
## or netgroups.
# User_Alias ADMINS = millert, dowdy, mikef
##
## Cmnd alias specification
##
## Groups of commands. Often used to group related commands together.
# Cmnd_Alias PROCESSES = /usr/bin/nice, /bin/kill, /usr/bin/renice, \
# /usr/bin/pkill, /usr/bin/top
##
## Defaults specification
##
Defaults env_reset
Defaults env_keep += "BLOCKSIZE"
Defaults env_keep += "COLORFGBG COLORTERM"
Defaults env_keep += "__CF_USER_TEXT_ENCODING"
Defaults env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE"
Defaults env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME"
Defaults env_keep += "LINES COLUMNS"
Defaults env_keep += "LSCOLORS"
Defaults env_keep += "SSH_AUTH_SOCK"
Defaults env_keep += "TZ"
Defaults env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults env_keep += "EDITOR VISUAL"
Defaults env_keep += "HOME MAIL"
Defaults lecture_file = "/etc/sudo_lecture"
##
## Runas alias specification
##
##
## User privilege specification
##
root ALL=(ALL) ALL
%admin ALL=(ALL) ALL
## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
## Uncomment to allow members of group sudo to execute any command
# %sudo ALL=(ALL) ALL
## Uncomment to allow any user to run sudo if they know the password
## of the user they are running the command as (root by default).
# Defaults targetpw # Ask for the password of the target user
# ALL ALL=(ALL) ALL # WARNING: only use this together with 'Defaults targetpw'
## Read drop-in files from /private/etc/sudoers.d
## (the '#' here does not indicate a comment)
#includedir /private/etc/sudoers.d
この sudoers
ファイルを書き換えることで設定を変更できます。
コマンドの制限
【ユーザー名】 ALL = (ALL:ALL) ALL
%【グループ名】 ALL = (ALL:ALL) ALL
のような書き方でユーザーまたはグループに応じて、 どのユーザーまたはグループまたはその両方として sudo
を介し、コマンドを実行できるかの制限できます。
たとえばXcodeにまつわるコマンド類を Example_Group グループに所属しているメンバーに root ユーザーでの実行許可を与えるとした場合、
Cmnd_Alias XCODE_COMMANDS = /usr/bin/xcodebuild, /usr/bin/xcrun, /usr/bin/xcode-select
%Example_Group ALL=(root) XCODE_COMMANDS
とすることで設定できます。
最初のALL
ホスト名に対する許可の項目です。ALLはすべてのホストを表しており、個別に指定できます。
()
内 :
の左側のALL
ユーザーに対する許可の項目です。 ALLはすべてのユーザーを表しており、個別に指定できます。
()
内 :
の右側のALL
グループに対する許可の項目です。 ALLはすべてのグループを表しており、個別に指定できます。 また、:
なしの場合はユーザーのみを表し、グループは無視されます。
最後のALL
コマンドに対する許可の項目です。ALLはすべてのコマンドを表しており、個別に指定できます。
ファイルの分離
/etc/sudoers
を編集することで sudo
の設定ができますが、 煩雑になってしまう可能性もあるので、sudoers
を直接編集することはオススメしません。 また、ファイルを分けてチェッカーを走らせること(後述参照)で、文法エラー防止にも役立ちます。
ファイルの分離は、
## Read drop-in files from /private/etc/sudoers.d
とあるように、/etc/sudoers.d
ディレクトリの中に設定ファイルを入れるとその内容も合わせて読み取ってくれます。
分離したファイルの権限
ファイルを分離した際に気を付けないといけないのが権限です。 /etc/sudoers
は 440
です。/etc/sudoers.d
内に作成した設定ファイルも 440
に変更する必要があります。
文法エラー
sudoers
やincludeしたファイルで文法エラーになると sudo
コマンドが使えなくなります。 これになると本当に絶望します。
文法エラーになった瞬間は、「やばい、やらかした」と思うかもしれませんが、一応復旧方法はあります。
Linuxでの復旧方法
pkexec visudo
をすることでsuper userとして visudo
を実行でき、sudoers
ファイルを変更できます。
また、-f
オプションを使用することで、sudoers.d
のディレクトリ内部のファイルも変更できます。
macOSでの復旧方法
macOSには pkexec
コマンドがないため詰んだと思ったのですが、GUIで解決させることができます。
- 「Terminal.appで
open /etc
を入力」または「Finderで移動 > フォルダへ移動 >/etc
を入力 > 移動」します。 - 該当ファイルを右クリックして「情報を見る」を選択します。
- 鍵アイコンをクリックして、 everyoneの項目を
読み/書き
に変更します。 - 該当ファイルをお好みのエディタで編集して文法エラーを編集してください。
- 編集が終わったら2の手順でeveryoneを
アクセス不可
に戻して終了です。
Tips
\
が含まれる文字を使用したい
\
は設定ファイルを改行しても連続していることを表すために使用されるため、グループ名などに含まれる場合は \
だと認識されません。 \\
とすることで初めてエスケープされるので注意が必要です。
sudoersのコメント
sudoers
は #
以降は、コメントとして扱われます。 しかし、#includedir
の #
はコメントではなく、C言語のようなディレクティブとして機能します。
間違えやすいので、 コメントする際は ##
のように2以上連続で #
を記載することをオススメします。
事前に文法をチェックしたい
文法エラーになっても直せることがわかったものの、毎回リカバリ対応しているとtry & errorが行いづらいです。 設定変更や文法チェックはぶっつけ本番ではなく事前にテストを行いたいです。
visudo -cs -f ファイル名
上記のコマンドを実行することで、文法をチェックが行え、sudoers
の設定がスムーズになります。
また、使用したいコマンドは常に変化していくので、運用に耐えうるためにCIを回しましょう。 そうすることで設定のチェックを自動化できます。
各オプション
オプション | 効果 |
---|---|
-c | sudoers が問題ないかをチェックするためのモードをONにするための指定 |
-s | strictモードをONにするための指定 権限のチェックもしてくれる |
-f | デフォルトで /etc/sudoers を参照するが、このオプションでほかのファイルを参照可能 |
まとめ
sudo
の設定方法および設定ファイルの分離方法と、sudo
におけるコマンドの制限の方法を説明しました。
また、文法エラーの復旧方法と、そもそもぶっつけ本番で文法エラーにならないようなしくみについてお話しました。 CIガンガン回していきましょう。
さらに詳しい情報に関しては man visudo
、man sudoers
を御覧ください。