第2章 2-1 / ユーザーと権限 ― yumiを迎える

sudoとrootの正体

このページで叩くコマンドと到達点

前提:1-6までが完了し、ubuntuユーザーのホームディレクトリ(~)にいる状態から始めます(~/practiceという空ディレクトリが存在しています)。ここからいよいよ第2章、この講座の物語の核である「ユーザーと権限」の世界に入ります。まずは全ての管理操作の土台となるsudoとroot(ルート)ユーザーの正体を確認します。whoamisudoidsudo -iを使い、「なぜsudoを付けると特別なことができるのか」を体で理解するのが今回の到達点です。

ここで学ぶ考え方は、次の2-2で練習用ユーザーyumiを作成するときにそのまま使います。

SET 1 ― 自分が誰であるかを確認する

ubuntu@lightsail: ~
  1. $whoami
  2. ubuntu
  3. $id
  4. uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),27(sudo)
  5. $groups
  6. $sudo whoami
  7. root
  8. $sudo id
  9. uid=0(root) gid=0(root) groups=0(root)
  10. $cat /etc/shadow
  11. cat: /etc/shadow: Permission denied
  12. $sudo cat /etc/shadow
  13. $ls -l /etc/shadow
  14. -rw-r----- 1 root shadow 1469 Jul 3 09:12 /etc/shadow
  15. $ls -l /etc/passwd
  16. $sudo -v
解説 ― SET 1 で何をしたか

1行目のwhoami(who am iの略)は「今操作しているのは誰か」を表示するコマンドです。0-3でも使いましたが、改めて確認すると、私たちは今ubuntuという一般ユーザーとして操作しています。2行目のidは、そのユーザーの正体をもっと詳しく見せてくれるコマンドで、UID※1(ユーザーID)・GID(グループID)・所属している全グループが出力例のように並びます。ここで注目してほしいのが末尾の27(sudo)です。ubuntuユーザーはsudoという特別なグループに所属している、という事実がこの後の全ての鍵になります。3行目のgroupsでも同じ所属グループを、より手短な形式で確認できます。

4行目のsudo whoamiを見てください。ただのwhoamiubuntuと返しましたが、頭にsudoを付けただけで結果がroot※3に変わります。sudoとはSuper User DO※2の略で、「このコマンド1回分だけ、管理者(root)として実行する」という意味の命令です。ubuntuユーザーのままなのに、このコマンドの瞬間だけrootに変身している、とイメージしてください。5行目のsudo idを実行すると、出力例のとおりuid=0(root)と表示され、SET 1冒頭で見た自分自身のIDとは別人であることがはっきりわかります。

この違いを痛感できるのが6行目と7行目の対比です。/etc/shadow※4はユーザーのパスワード情報が暗号化されて記録されている、非常に重要度の高いファイルです。6行目のようにsudoなしでcatすると、出力例のとおりPermission denied(権限がありません)と拒否されます。ところが7行目のようにsudoを付けた瞬間、同じファイルの中身が読めてしまいます。なぜsudoが必要かというと、/etc/shadowはroot以外が読めないよう厳重に守られたファイルだからです。ubuntuユーザーの権限のままでは絶対に読めません。

8行目のls -l /etc/shadowでその理由を裏付けます。出力例の先頭にある-rw-r-----という権限表示(詳しくは2-4で読み方を学びます)と、所有者root・所有グループshadowから、「rootと一部の特権グループしかこのファイルに触れない」設計になっていることがわかります。9行目で/etc/passwd(こちらはユーザー一覧を記録する別のファイルで、2-2で詳しく扱います)の権限も見比べておくと、同じ「ユーザー情報」でも守られ方が全く違うことに気づけます。最後の10行目のsudo -vは、直前に入力したパスワードの有効期限をリセットし、しばらくパスワード入力なしでsudoを使えるようにするコマンドです(validate=検証の意味)。

POINT

sudoは「パスワードを入れれば何でもできる魔法の呪文」ではありません。実行するたびにログが記録され、誰が・いつ・何を管理者権限で行ったかが追跡できるようになっています。安易に何にでも付ければいいという考え方は、この講座では避けてほしいと思います。

ゆみちゃん
ゆみ

あたしもこの章で生まれるんだけど、まだ登場してないから知らない話として聞いてね! sudoって最初は「エラーが出たらとりあえず頭に付ける呪文」だと思っちゃいがちなんだけど、実は「今だけ特別に管理者になります」っていう重い宣言なんだよ。うっかりsudo rm -rfとか打つと大惨事になるから、意味もわからず付けるのは絶対ダメ、って覚えておいてね!

SET 2 ― rootになりきる(sudo -i)

ubuntu@lightsail: ~
  1. $pwd
  2. /home/ubuntu
  3. $echo $HOME
  4. $sudo -i
root@lightsail: ~
  1. #whoami
  2. root
  3. #pwd
  4. /root
  5. #echo $HOME
  6. #id
  7. #ls -la /root
  8. #exit
ubuntu@lightsail: ~
  1. $whoami
  2. ubuntu
解説 ― SET 2 で何をしたか

1行目で現在地がホームディレクトリであることを確認し、2行目のecho $HOMEで環境変数$HOME/home/ubuntuであることも確認しておきます。3行目のsudo -iがこのセットの主役です。ここまでのsudo コマンドは「そのコマンド1回だけ管理者権限で実行する」ものでしたが、sudo -iは違います。rootユーザーとしてログインし直し、そのままrootのシェル(操作画面)に居座るという、一段階踏み込んだ命令です。実行するとターミナルのタイトルバーとプロンプトの記号が切り替わることに注目してください。プロンプトが$から#に変わったら、それは今この瞬間からrootとして操作している合図です。

4行目のwhoamirootになったことを確認し、5行目のpwdを見ると、なんとホームディレクトリが/home/ubuntuではなく/rootに変わっています。6行目のecho $HOMEでも同じく/rootが返り、SET 2冒頭で見たubuntuの$HOMEとは別物になっていることがわかります。これはsudo -iが単に権限を貸すだけでなく、rootという別人の環境に完全にログインし直しているためです。7行目のidを打てば、uid=0(root)という表示が確認できるはずです。Linuxの世界ではUID 0が常にrootを意味します。8行目のls -la /rootで、root専用のホームディレクトリの中身も覗いておきましょう。

9行目のexitでrootのシェルから抜け、元のubuntuユーザーに戻ります。最後の10行目のwhoamiで、無事ubuntuユーザーに戻れたことを確認して締めくくります。rootのシェルに入りっぱなしにしないことが重要です。rootは全てのファイルを削除でき、全ての設定を変更でき、ミスをしても止めてくれる仕組みがありません。用が済んだらexitですぐに一般ユーザーへ戻る習慣をつけましょう。

POINT

sudo コマンドsudo -iの違いは「一瞬だけ変身」か「変身したまま行動する」かです。1〜2個のコマンドで済むならsudo コマンド、複数の管理操作を連続して行うときだけsudo -iを使う、と使い分けるのが安全です。この講座でも、基本はsudo コマンド形式で進めます。

SET 3 ― sudoの設定を覗く

ubuntu@lightsail: ~
  1. $cat /etc/sudoers
  2. cat: /etc/sudoers: Permission denied
  3. $sudo cat /etc/sudoers
  4. %sudo ALL=(ALL:ALL) ALL
  5. $ls -l /etc/sudoers
  6. $ls /etc/sudoers.d
  7. $which visudo
  8. /usr/sbin/visudo
  9. $sudo -l
  10. $groups
  11. ubuntu adm sudo
  12. $sudo -k
  13. $cd ~
  14. $pwd
解説 ― SET 3 で何をしたか

1行目で/etc/sudoersというファイルを見ようとしますが、これも/etc/shadowと同様にPermission deniedで拒否されます。2行目のようにsudoを付けて初めて中身が見えます。この/etc/sudoers※5こそが、「誰がsudoを使えるか」を定義している設定ファイルの本体です。出力例にある%sudo ALL=(ALL:ALL) ALLという行は、「sudoグループに所属するユーザーは、全てのホストで、全てのユーザーとして、全てのコマンドを実行してよい」という意味です。SET 1で確認した「ubuntuユーザーがsudoグループに入っているから管理者権限を使える」という事実が、この1行に直結しています。

3行目のls -lで権限を見ると、/etc/shadowと同じくroot以外は書き込めない(多くの場合、読み取りすら制限された)厳重な設定になっていることがわかります。このファイルは直接編集してはいけません。書式を1文字でも間違えるとsudoコマンド自体が使えなくなり、最悪の場合サーバーを操作できなくなってしまいます。そのため専用の編集コマンドvisudoが用意されています。4行目のls /etc/sudoers.dは、/etc/sudoers本体を直接編集しなくても、このディレクトリに設定ファイルを追加する形で権限ルールを拡張できる仕組みがあることを覗いています(中身は空か、Lightsailの初期設定ファイルが1つある程度です)。5行目のwhich(1-5で学んだコマンド)でvisudoの存在だけ確認しておきます。visudoは書式を自動チェックしてくれる安全装置付きのエディタで、今回は「存在を知る」だけにとどめ、実際の編集はこの講座では扱いません。

6行目のsudo -l(list)は、今の自分にどんなsudo権限が許可されているかを一覧表示するコマンドです。7行目のgroupsは、idより手軽に所属グループだけを一覧できるコマンドです。8行目のsudo -k(kill timestamp)は、SET 1のsudo -vとは逆に、パスワード入力なしでsudoを使える猶予時間を強制的にリセットするコマンドです。これを打つと次にsudoを使う際は必ずパスワードを聞かれるようになります。9行目のcd ~10行目のpwdでホームディレクトリに戻ったことを確認し、このページを締めくくります。

ゆみちゃん
ゆみ

/etc/sudoersを直接vimとかで開いて編集するの、絶対やめてね! 書式ミスったまま保存するとsudo自体が壊れて、詰みかけたって話をよく聞くよ。編集したくなったらsudo visudoって呪文だけ覚えておけば十分。今日は「そういうコマンドがあるんだ〜」って知るだけでOKだよ!

POINT

root・sudoグループ・/etc/sudoersの関係を整理すると、「root=全能の管理者」「sudoグループ=rootになる許可証を持つ一般ユーザーの集まり」「/etc/sudoers=その許可証のルールブック」という3層構造になっています。次の2-2で作るyumiは、最初はこのsudoグループに入りません。「特別な許可がない限り、一般ユーザーは管理操作ができない」という原則を、yumiを通して体感していきます。

まとめ

2-1では、管理者権限の正体であるrootユーザーと、それを一時的に借りる仕組みであるsudoコマンドの関係を確認しました。このページで叩けるようになったコマンドを一覧にまとめます。

コマンド何をするか覚え方
whoami今操作しているユーザー名を表示するwho am I(私は誰)
idUID・GID・所属グループを詳しく表示するidentity(身分証明)
sudo <コマンド>そのコマンド1回だけを管理者権限で実行するSuper User DO(管理者として実行)
sudo -irootとしてログインし、rootのシェルに入る-i = interactive(root環境に入る)
exit今のシェル・ログインセッションから抜ける抜け出す
groups自分が所属するグループ一覧を表示するgroupsそのまま
ls -l /etc/shadow重要ファイルの権限・所有者を確認する誰が触れるファイルか見る
which visudosudoers編集専用コマンドの場所を確認する存在だけ知っておく

次のページ「2-2. yumiを作成する」では、いよいよsudo adduserを使って、この講座を一緒に歩む練習用ユーザーyumiをサーバーに迎え入れます。

脚注 ─ 用語解説
  1. UID(User ID) … 各ユーザーに割り当てられる識別番号。人間にはユーザー名で見えるが、Linux内部ではこの数字で管理されている。rootは必ず0。
  2. sudo(Super User DO) … 「スードゥー」と読む。一般ユーザーが一時的に管理者(root)権限でコマンドを実行するための仕組み。実行にはパスワード入力を求められる場合がある。
  3. root … Linuxシステムにおける最上位の管理者ユーザー。UIDは常に0で、あらゆるファイルの読み書き・あらゆる設定変更ができる、いわば「校長先生かつ用務員かつ警備員」を兼ねる存在。
  4. /etc/shadow … 全ユーザーのパスワード情報(暗号化済み)が記録されたファイル。root以外は読み書きできないよう厳重に保護されている。
  5. /etc/sudoers … 「誰がsudoを使えるか」「何を許可するか」を定義する設定ファイル。直接編集せず、専用コマンドvisudoを使うのが鉄則。