備忘録:macOSでsudoの統制
これもちょっと違うので書いておく
前回(?)はこちら
前回同様 前提:rootは有効化されている事。macOSのバージョンはMojave
内容
- sudoの利用制限(予防的統制)
2. sudoのログ(発見的統制)
3. 統制的注意事項
1.sudoの利用制限
sudoの利用制限はOSXでも大きくLinuxの標準からは変わりません。基本的に/etc/sudoersにsudoを許可するユーザー(またはグループ)を記載することで制限をかけます
sudoersファイルは特殊なファイル扱いなのでvisudoコマンドを利用して編集します。 root権限が必要なので sudo visudoで開きます
/etc/sudoersにはsudo関連の色々な記述がありますが今回関係するのはこの辺
##
## User privilege specification
##
root ALL=(ALL) ALL
naoki ALL=(ALL) ALL
# zacktest 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’
## User privilege specification の下にsudoを許可するユーザーまたはグループを記載すればOK。グループの場合は頭に %をつけてグループ名を示します。
naoki ALL=(ALL) ALL :[ユーザー名(もしくは%でグループ名)] [どのホストに対してsudoを許可するか]=([どのユーザーでのsudoを許可するか])[どのコマンドを許可するか]
という書式です。OSX特有の注意点としてはデフォルトでAdminグループが記載されているのでsudoし放題ということでしょうか。GUIの管理者アカウントになっているユーザーにsudoさせたくない場合にはこれをコメントアウトしておきましょう。
それから NOPASSWDオプションをここでつけておくとsudo時にパスワード不要になります。まあその方が使う方は手間がないといえばないのですが、これはつけない方がいいかなあと統制サイドからは思います。
2. sudoのログ
前回も出てきましたがMojaveではログが統合ログ環境(Unified logging)になっているのでLinuxだと/var/log/messages と /var/log/secureから拾うはずのsudoログはここからは拾いません。前回勉強した logコマンドを使って
log show — style syslog — predicate ‘process == “sudo” ’
とやるとずらずらとsudo関連のログが出てきます。suのログと同様、あまり必要でないログが出てきてしまうので
log show — style syslog — predicate ‘process == “sudo” and eventMessage contains “USER=”’
のように指定すると実際のsudoした結果だけが取れます。以下サンプル
naoki$ log show — style syslog — predicate ‘process == “sudo” and eventMessage contains “USER=”’
Filtering the log data using “process == “sudo” AND composedMessage CONTAINS “USER=””
Skipping info and debug messages, pass — info and/or — debug to include.
Timestamp (process)[PID]
2018–11–09 14:53:17.100454+0100 localhost sudo[17930]: naoki : TTY=ttys000 ; PWD=/Users/naoki ; USER=root ; COMMAND=/bin/cat /etc/sudoers
2018–11–09 15:19:19.168317+0100 localhost sudo[18218]: naoki : TTY=ttys000 ; PWD=/private/etc/pam.d ; USER=root ; COMMAND=/usr/bin/vi su
2018–11–10 08:03:30.402272+0100 localhost sudo[9027]: Guest : user NOT in sudoers ; TTY=ttys002 ; PWD=/private/etc/pam.d ; USER=root ; COMMAND=/usr/bin/vi su
2018–11–10 14:57:54.686596+0100 localhost sudo[9786]: zacktest : user NOT in sudoers ; TTY=ttys003 ; PWD=/private/etc/pam.d ; USER=root ; COMMAND=/bin/ls
2018–11–10 15:46:52.952346+0100 localhost sudo[10281]: naoki : TTY=ttys003 ; PWD=/private/etc/pam.d ; USER=root ; COMMAND=/usr/bin/vi
2018–11–10 15:48:38.464130+0100 localhost sudo[10313]: naoki : TTY=ttys003 ; PWD=/private/etc/pam.d ; USER=root ; COMMAND=/bin/ls
見ての通り、sudoersに登録されてないユーザーでsudoしようとして失敗したログはuser NOT in sudoersのメッセージが出ます。
suよりはログは拾いやすいですね。
3. 統制的な注意事項
suをつかってrootで作業させたくないのでsudoを使わせるということはあるのですが、実際にはsudoを許可して全てのコマンドを許可している場合は実質的にsuと同じことができてしまいます。
多分一番簡単なのはこれ
naoki$ sudo bash
Password:
bash-4.4# whoami
root
bash-4.4#
これでカンタンにrootになれます。
一回rootになられてしまうとsudoログで実行したコマンドを追えないのでちょっと問題です。
そこでsudoersファイルの指定でrootになれるコマンドを封じるというのをやりたいのですが、上記のようなbashだったりするとちょっと難しいです。
naoki ALL=(ALL) !bash #!を頭につけることでこのコマンドを許可しない、という指定ができる
とやると、bashに紐づいたコマンドが何も使えなくなります(当たり前だ)
したがってどうしてもroot化の穴を塞ぎたい場合は使用するコマンドをホワイトリスト方式で全部指定して書いておくしかありません
sudoersファイル内でエイリアスを指定できるのでユーザーに許可するコマンドのセットをエイリアスで書いておいて各ユーザーの行に指定すると良いでしょう。でもホワイトリストは作るのが大変なのですよね。
