適切な権限管理や安定した運用、セキュリティの関係上、
特定のコマンドのみ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_resetDefaults 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 |
デフォルトで/を参照するが、このオプションでほかのファイルを参照可能 |
まとめ
sudoの設定方法および設定ファイルの分離方法と、sudoにおけるコマンドの制限の方法を説明しました。
また、文法エラーの復旧方法と、そもそもぶっつけ本番で文法エラーにならないようなしくみについてお話しました。 CIガンガン回していきましょう。
さらに詳しい情報に関してはman visudo、man sudoersを御覧ください。