Macのターミナルで管理者権限を使う|sudoの前に確かめること
mac 管理者権限 ターミナルで検索する人の多くは、コマンドの書き方ではなく「いま自分にどこまでの権限があるのか分からない」状態で止まっています。sudoを付けたのに弾かれる、パスワードを聞かれる回数が日によって違う、rootを有効にしろと書いてある記事を見つけたが本当にそれが必要なのか判断できない。この記事では、Macの管理者権限を3つの層に分けて、いま自分がどの層にいるかを推測ではなくコマンドで確かめる手順から整理します。
管理者権限は1つではなく、3つの層に分かれている
Macで「管理者」と呼ばれているものは、実際には性質の違う3つの層です。この3つを混ぜて考えていると、どの記事を読んでも噛み合いません。
1つ目は、アカウントの種類としての管理者です。システム設定のユーザ欄で「管理者」と表示されるもので、内部的にはadminという名前のグループに所属しているかどうかで決まります。アプリのインストールやシステム設定の鍵を開ける操作は、この層で判定されています。
2つ目は、sudoによる一時的な昇格です。管理者アカウントでログインしていても、ターミナルで打ったコマンドは通常の権限で動きます。sudoを前に付けたときだけ、そのコマンド1回に限ってrootの権限で実行されます。ターミナルを閉じれば残りません。
3つ目は、rootユーザそのものです。これはアカウントとして存在し、macOSでは既定で無効になっています。有効にすると、ログイン画面からrootとしてログインできるようになります。
この3層のうち、日常の作業で必要になるのはほぼ2つ目だけです。1つ目が満たされていなければ2つ目も使えず、3つ目はほとんどの場面で不要です。順番に確かめていけば、どこで止まっているかは数分で分かります。
自分が管理者かどうかを、画面ではなくコマンドで確かめる
システム設定の画面を開いて確認する方法もありますが、ターミナルで作業しているなら、その場で確かめたほうが早く、他のユーザについても同じ手で調べられます。
いま自分が所属しているグループの一覧は、次の1行で出ます。
id -Gn
返ってきた並びにadminという語が含まれていれば、管理者アカウントです。staffとeveryoneだけで終わっていれば、標準ユーザです。
もっと直接的に聞くこともできます。
dseditgroup -o checkmember -m "$(whoami)" admin
このコマンドは、所属していれば「yes」、していなければ「no」で始まる1行を返します。ユーザ名を書き換えれば、他のアカウントについても同じように調べられます。
adminグループの側から名簿を見たい場合は、ディレクトリサービスに直接問い合わせます。
dscl . -read /Groups/admin GroupMembership
rootと、管理者に設定されているアカウント名が並びます。ここに自分の名前が無いのであれば、sudoの書き方を工夫しても通りません。すでに管理者になっている誰かに、システム設定のユーザ欄で自分のアカウントを管理者に切り替えてもらう必要があります。
sudoが何を許しているかは、推測せずに一覧で読む
管理者アカウントであることが確認できたら、次はsudoが自分に何を許しているかです。これも一覧で出せます。
sudo -l
パスワードを入力すると、どのコマンドをどのユーザとして実行できるかが並びます。既定の設定では、adminグループに属するユーザがすべてのコマンドを実行できる形になっています。会社から配られたMacや、以前に誰かが設定を入れたMacでは、ここが絞られていることがあります。
権限の設定は1つのファイルにまとまっているわけではなく、/etc/sudoersと、/etc/sudoers.dという追加用のディレクトリに分かれています。後者に置いたファイルは1件ずつ読み込まれるため、目的ごとに分けて置けます。中身を書き換えるときは、テキストエディタで直接開かず、必ず専用のコマンドを通します。
sudo visudo -f /etc/sudoers.d/myrule
このコマンドは保存の直前に文法を検査します。書式を間違えたファイルを置いてしまうと、sudo自体が動かなくなり、復旧にはシングルユーザモードなどの手間が要ります。検査を通す仕組みを挟むのは、その事故を避けるためです。
なお、認証の経路はPAMという仕組みが担っていて、/etc/pam.d/の下にsudo用の設定が置かれています。同じ場所にsudo_local.templateという名前の雛形が用意されており、OSの更新で上書きされない追加設定は、こちらを写して使う形になっています。
パスワードを聞かれる回数が変わる理由
一度パスワードを入れたのに、しばらくしてまた聞かれる。あるいは別のウインドウでsudoを打つと、また聞かれる。この挙動は不安定なのではなく、仕様として決まっています。
sudoは認証に成功すると、その記録を一定時間だけ保持します。macOS 27に入っているsudoはバージョン1.9.17p2で、この保持時間の既定値は5分です。設定名はtimestamp_timeoutで、0にすれば毎回聞かれるようになり、負の値を入れると期限切れにならなくなります。
もう1つの鍵はtimestamp_typeです。既定では、記録がターミナルごとに分けて保持されます。つまり同じMacの同じユーザでも、別のタブや別のウインドウで打ったsudoは別の認証として扱われます。シェルスクリプトの中から呼んだsudoも、親プロセスが違うため別扱いになります。
記録を自分から捨てることもできます。
sudo -k
現在のセッションの記録だけを無効にします。すべての端末の記録をまとめて捨てるなら-Kです。逆に、これから長い作業に入る前に認証だけ済ませておきたい場合は、-vを付けて実行します。作業の途中でパスワード入力に止められたくない場面で使われる書き方です。
rootユーザを有効にする前に、残っている手を確かめる
検索して出てくる古い記事には、rootユーザを有効にする手順が載っていることがあります。ただしApple自身は、その前にsudoを使うことを勧めています。
ルートユーザを有効にする代わりに、ターミナルで sudo コマンドを使った方が安全です。 出典: support.apple.com
同じ資料には、rootユーザが既定で無効になっていること、普段使いを想定していないこと、そして作業が終わったら無効に戻すことが書かれています。有効にする手順自体は公開されていて、ディレクトリユーティリティという管理用のアプリを/System/Library/CoreServices/Applications/から開き、鍵を外して「編集」メニューから切り替えます。
ターミナルの作業で見ると、rootユーザを有効にして得られるものはほとんどありません。sudoで実行できることはrootでログインしてもできることと同じで、違うのは失敗したときの影響範囲です。sudoなら1コマンドで終わりますが、rootでログインしている間はすべての操作が無防備になります。
管理者としての作業がターミナル側に偏っているなら、権限を常時上げるのではなく、コマンドの履歴が残る形で1回ずつ上げたほうが後から追えます。
権限ではなくSIPやプライバシー保護で止まっている場合
sudoを付けても「Operation not permitted」で弾かれるときは、権限の問題ではない可能性があります。macOSには、rootであっても触れない領域が2種類あります。
1つはシステム整合性保護です。状態は次の1行で読めます。
csrutil status
enabledと返ってきたなら、OSが使うファイルはrootでも書き換えられません。システムのボリューム自体が読み出し専用として封をされているため、sudoの有無に関係なく止まります。
もう1つはプライバシー保護の枠組みで、書類フォルダやデスクトップ、外部ボリュームへのアクセスがアプリ単位で管理されています。ターミナルやそこから起動したコマンドが弾かれている場合は、システム設定のプライバシーとセキュリティで、そのアプリにフルディスクアクセスを与えるかどうかを判断することになります。これはユーザの権限ではなくアプリの許可であり、sudoでは越えられません。
見分け方は単純です。「Permission denied」なら権限の話で、sudoやファイルの所有者を見る価値があります。「Operation not permitted」なら、この2つのどちらかを疑ったほうが早く片付きます。
Macのターミナルコマンドを使用すると、IT管理者はコマンドラインからmacOSデバイスの管理、トラブルシューティング、設定、自動化をより効率的に行うことができます。 出典: blog.scalefusion.com
コマンドラインから触れる範囲が広いことと、どこまででも触れることは別です。境界の位置を知っておけば、通らないコマンドを何度も打ち直す時間が消えます。
エラーの文面から、どの層の問題かを切り分ける
権限で止まったときに読むべきものは、コマンドの綴りではなくエラーの文面です。macOSが返す代表的な3つは、それぞれ原因の層が違います。
| エラーの文面 | 疑う層 | 先に打つコマンド |
|---|---|---|
| Permission denied | ファイルの所有者と属性 | ls -l@ 対象 |
| Operation not permitted | システム整合性保護、プライバシー保護 | csrutil status |
| is not in the sudoers file | adminグループの所属、sudoersの設定 | id -Gn |
1つ目の場合は、対象そのものの状態を読みます。
ls -l@ ~/Documents/report.pdf
先頭に並ぶ記号が所有者と所属グループの読み書き実行の許可で、続く2つの列が所有者名とグループ名です。末尾に@が付いていれば拡張属性が載っていて、アットマークの行にその名前が並びます。ここで自分が所有者でないと分かったなら、sudoで無理に通すより、所有者を移すか、コピーを作って自分の領域で作業したほうが後の事故が少なくなります。
所有者を移す操作は管理者権限を要します。
sudo chown "$(whoami)" /path/to/file
外付けドライブから持ってきたファイル群でこれが必要になる場合は、1件ずつではなくフォルダに対して-Rを付けて再帰的に当てるのが通例です。ただし対象を取り違えたときの影響が大きいため、実行の前に対象のパスを声に出して読むくらいの確認は釣り合っています。
3つ目のsudoersに関するエラーは、権限が足りないというより、そのユーザがsudoの対象として登録されていないという意味です。会社から配られたMacで出た場合は、管理側が意図して外している可能性があるため、設定を書き換える前に事情を確かめる順番になります。
権限の確認とファイルの操作を1つの窓に寄せる
権限で止まったとき、実際に必要な情報は3か所に散っています。対象のファイルがどこにあるか、その所有者と属性はどうなっているか、そしてコマンドが返したエラーの文面です。フォルダを見る窓とコマンドを打つ窓とAIに聞く窓が別々に開いていると、この3つを突き合わせるだけで切り替えが何度も入ります。
フォルダとターミナルとAIが同じ窓にある状態なら、対象を選んだまま所有者を確かめ、そのままコマンドを打ち、返ってきた文面をその場で読めます。権限の調査は「対象を特定する、状態を読む、1回だけ昇格する」の繰り返しなので、往復の回数がそのまま作業時間になります。
道具の側で何ができるかはできることに、Finderや他のファイル管理との違いは他のファイル管理との比較に整理されています。外出先のiPhoneから自宅のMacに残した作業を確かめる使い方はiPhone・iPadから続きを、費用の目安は料金にあります。判断に迷いやすい点はよくある質問にまとまっています。
まず変えるべきは、sudoを打つ前にid -Gnとsudo -lの2行を習慣にすることです。この2行で、権限の層のどこで止まっているかが先に分かるため、rootを有効にするかどうかを迷う場面そのものが減ります。
よくある質問
標準ユーザのままターミナルで管理者権限を使えますか?
使えません。sudoはadminグループに属しているかどうかで判定されるため、標準ユーザのままでは認証を通せません。dseditgroup -o checkmember -m ユーザ名 admin で自分の所属を確認し、noであれば、すでに管理者になっているアカウントからシステム設定のユーザ欄で切り替えてもらう必要があります。
sudoのパスワードはどれを入力すればよいですか?
いま使っているユーザアカウントのログインパスワードです。rootのパスワードではありません。rootユーザは既定で無効になっており、パスワード自体が設定されていません。入力しても文字が表示されませんが、これは仕様なので、そのまま打ってreturnで確定してください。
sudoでパスワードを聞かれない設定にしてもよいですか?
設定としては可能ですが、対象を絞らないまま全コマンドを対象にするのは避けたほうが安全です。どうしても要るなら、/etc/sudoers.d/ に目的ごとのファイルを置き、コマンドを1つだけ指定する形にします。編集は sudo visudo -f で行い、文法の検査を必ず通してください。
sudoを付けてもOperation not permittedで止まるのはなぜですか?
権限ではなく、システム整合性保護かプライバシー保護で止まっています。csrutil status がenabledなら、OSが使う領域はrootでも書き換えられません。書類フォルダや外部ボリュームで起きている場合は、システム設定のプライバシーとセキュリティで、ターミナルにフルディスクアクセスを与えるかどうかの判断になります。