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

ユーザーを切り替える

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

前提:2-2が完了し、ユーザーyumiが作成済み。ubuntuユーザーのホームディレクトリ(~)にいる状態から始めます。前回はyumiという名前と部屋(ホームディレクトリ)を用意しただけでした。今回はいよいよsu - yumiを使って、実際にyumi本人としてログインします。ユーザーを切り替えると見える景色がどう変わるのか、そしてsusu -という似た2つのコマンドの違いを体験するのが到達点です。

SET 1 ― su - yumiでログインする

ubuntu@lightsail: ~
  1. $whoami
  2. ubuntu
  3. $pwd
  4. /home/ubuntu
  5. $echo $HOME
  6. $su - yumi
  7. Password: (yumiのパスワードを入力)
yumi@lightsail: ~
  1. $whoami
  2. yumi
  3. $id
  4. $pwd
  5. /home/yumi
  6. $echo $HOME
  7. $ls -la
  8. $hostname
解説 ― SET 1 で何をしたか

12行目で、現在ubuntuユーザーとしてホームディレクトリにいること、3行目の$HOME/home/ubuntuであることを確認しておきます。4行目のsu - yumiがこのページの主役です。suswitch user※1の略で、別のユーザーに切り替えるコマンドです。sudoと違い、suで他人になりきるには基本的にそのユーザー自身のパスワードが必要になるため、出力例のようにPassword:の入力を求められます。ここでは2-2で設定したyumiのパスワードを入力してください(rootであるubuntu側からyumiに切り替える場合はubuntu自身のパスワードではなくyumiのパスワードが要求される点に注意です)。

ログインに成功すると、ターミナルのタイトルバーがyumi@lightsailに変わります。5行目のwhoamiyumiになっていることを確認し、6行目のidでUID・GID・所属グループも見ておきます。7行目のpwdを見ると、なんと現在地が/home/yumiに変わっています。8行目のecho $HOME(1-4以降で使ったechoで環境変数※2の中身を表示)を実行すると、同じく/home/yumiが返ってきます。これは、コマンド名のsuの後ろに付けた-(ハイフン)の働きによるものです。su -は単に権限を切り替えるだけでなく、「yumiとして最初からログインし直した」のと同じ状態を作り出し、ホームディレクトリや環境変数をyumiのものに完全に入れ替えます。9行目のls -laで、2-2で確認した/home/yumiの中身がそのまま見えていることも確認しておきましょう。最後の10行目のhostnameを見ると、サーバー自体は変わっていないことがわかります。ユーザーが変わってもサーバーは同じ1台のまま、というのは意外と忘れがちなポイントです。

POINT

su - yumiのハイフンを省略してsu yumiと打つと、ユーザーIDだけyumiに切り替わりますが、ホームディレクトリや環境変数はubuntuのものが引き継がれてしまい、pwdを打っても/home/ubuntuのままという中途半端な状態になります。ユーザーを完全に切り替えたいときは、必ずハイフン付きのsu -を使う習慣をつけましょう。

ゆみちゃん
ゆみ

やっと本人としてログインできたよ、こんにちは! suってなんとなくsudoと似てるから混同しがちだけど、sudoは「一瞬だけ他人の力を借りる」、suは「本当にその人にログインし直す」って感じで結構違うんだ。しかもパスワードもubuntu用じゃなくてあたし用のを聞かれたでしょ? そこも見分けるポイントだよ!

SET 2 ― yumiとして作業し、元に戻る

yumi@lightsail: ~
  1. $touch memo.txt
  2. $ls -l memo.txt
  3. -rw-rw-r-- 1 yumi yumi 0 Jul 3 09:20 memo.txt
  4. $echo 'よろしくお願いします' > memo.txt
  5. $cat memo.txt
  6. $whoami
  7. $id
  8. $sudo whoami
  9. yumi is not in the sudoers file. This incident will be reported.
  10. $exit
ubuntu@lightsail: ~
  1. $whoami
  2. ubuntu
  3. $pwd
解説 ― SET 2 で何をしたか

1行目のtouch memo.txt(1-2で学んだ空ファイル作成)をyumiとして実行し、2行目でls -lを見ると、出力例のとおり所有者がyumiになっています。これは当然のことのようですが、後の2-4・2-5で「誰がファイルを作ったか」がパーミッションの理解に直結してくるので、ここでしっかり確認しておいてください。3行目のecho '...' > memo.txt(3-3で詳しく扱うリダイレクト)で実際に文字を書き込み、4行目のcatで中身を確認します。

5行目のwhoami6行目のidで、改めて自分がyumiであり、所属グループがyumi1つだけであることを確認します。7行目、yumiのままsudo whoamiを試すと、2-1でubuntuユーザーが成功した同じコマンドが、出力例のようにyumi is not in the sudoers file.(yumiはsudoersファイルに登録されていません)と拒否されます。これは2-1で見た/etc/sudoers%sudoグループに、yumiがまだ所属していないためです。yumiは意図的に「管理者権限を持たない、普通の利用者」として作成されていることを、ここで実感してもらうのがこのセットの狙いです。

8行目のexitで、yumiとしてのログインセッションを終えて元のubuntuユーザーに戻ります。これは2-1でrootのシェルから抜けたときと同じ考え方です。su -で「ログインし直した」のだから、抜けるときも同じくexitを使います。9行目のwhoami10行目のpwdで、無事ubuntuユーザー・/home/ubuntuに戻れたことを確認します。

POINT

sudoが使えるかどうかは「sudoグループに入っているか」だけで決まります。同じサーバーの住人でも、ubuntuは管理者、yumiはただの利用者という役割の違いがある、というのがこの章全体の重要なテーマです。次の2-5でyumiに別の権限(devteamグループ)を与える演習をしますが、sudoグループには最後まで入れません。

SET 3 ― 権限による見え方の違いを確認する

ubuntu@lightsail: ~
  1. $ls /home/yumi
  2. ls: cannot open directory '/home/yumi': Permission denied
  3. $cat /home/yumi/memo.txt
  4. cat: /home/yumi/memo.txt: Permission denied
  5. $ls -ld /home/yumi
  6. drwxr-x--- 3 yumi yumi 4096 Jul 3 09:20 /home/yumi
  7. $sudo ls /home/yumi
  8. $sudo ls -la /home/yumi
  9. $sudo cat /home/yumi/memo.txt
  10. よろしくお願いします
  11. $whoami
  12. ubuntu
  13. $id
  14. $cd ~
  15. $pwd
解説 ― SET 3 で何をしたか

1行目、ubuntuユーザーに戻った状態でls /home/yumiを実行すると、出力例のようにPermission deniedで拒否されます。2行目のように、SET 2でyumiが作成したmemo.txtを直接catで読もうとしても、同じく拒否されます。2-2の時点では気にしていなかったかもしれませんが、3行目のls -ld /home/yumiで権限を見るとdrwxr-x---となっており、末尾の3文字(その他のユーザーに対する権限)が---、つまり何も許可されていません。ubuntuユーザーであっても、yumiのホームディレクトリの中身を無条件に覗くことはできないということです。これは第1章で「管理者だから何でも見える」と思っていた人にとっては新鮮な発見のはずです(権限記号の詳しい読み方は次の2-4で扱います)。

4行目のようにsudoを付ければ、rootとして一時的に振る舞うため、パーミッションの制約を飛び越えて中身が見えます。5行目のsudo ls -la /home/yumiでは、隠しファイルも含めた詳細一覧まで、一般ユーザーのままでは絶対に覗けないyumiのホームディレクトリの中身を、sudoを付けた瞬間に丸ごと見渡せることが確認できます。6行目では、同じくsudo catmemo.txtの中身を確認すると、出力例のとおりSET 2でyumiが書き込んだ内容がしっかり読めます。ここでもsudoが必要な理由は、他人の所有物にアクセスする操作だからです。管理者権限は「持っているから常に見える」のではなく、「必要なときにパーミッションの壁を越える力を借りる」ものだという理解を、このセットで固めておきましょう。

7行目のwhoamiに続けて8行目のidを実行し、SET 1冒頭のubuntuのidと見比べておくと、devteamグループ(2-5で登場)にはまだ入っていないシンプルな状態であることが確認できます。9行目のcd ~10行目のpwdで改めてホームディレクトリにいることを確認し、このページを締めくくります。

ゆみちゃん
ゆみ

ubuntuさんでもsudoなしだとあたしの部屋(/home/yumi)には入れないんだね、ちょっと安心した! これって実は大学の寮でルームメイトの部屋に勝手に入れないのと同じ感覚だよ。管理人さん(root)に頼めば合鍵で開けてもらえるけど、普段は各自のプライバシーがちゃんと守られてるってこと。次の2-4では、この「鍵」の仕組み=パーミッションを、記号の意味からきっちり読めるようになろう!

まとめ

2-3では、su - yumiで実際にユーザーを切り替え、sudo権限の有無・ホームディレクトリの違い・パーミッションによるアクセス制限を体験しました。このページで叩けるようになったコマンドを一覧にまとめます。

コマンド何をするか覚え方
su - <名前>指定ユーザーとして完全にログインし直すswitch user(利用者を切り替える)
su <名前>UIDだけ切り替える(環境は引き継がれる)ハイフンなし=中途半端な切り替え
exitsu や sudo -i で入ったセッションから抜ける元のユーザーへ戻る
echo $HOME現在のユーザーのホームディレクトリを表示する環境変数HOMEの中身を見る
ls -ld <ディレクトリ>ディレクトリ自体の権限を1行で確認する誰の部屋か鍵を見る
sudo ls <他人のディレクトリ>管理者権限でパーミッションの壁を越えて閲覧する合鍵を借りて中を見る

次のページ「2-4. パーミッションを読む」では、今回何度も登場したdrwxr-x---のような記号の意味を1文字ずつ読み解き、chmodで自分の手で権限を変更していきます。

脚注 ─ 用語解説
  1. su(switch user) … 別のユーザーに切り替えるコマンド。ハイフンを付けたsu -は環境ごと完全に切り替え、付けないsuはUIDのみ切り替える。
  2. 環境変数 … シェルやプログラムが参照する、名前付きの値。$HOME(ホームディレクトリ)や$PATH(コマンド探索先)などがあり、6-1で詳しく扱う。
  3. sudoers/etc/sudoersファイル、またはそこに登録されている「sudoを使える権利を持つユーザー・グループ」を指す言い方。2-1参照。
  4. パーミッション … ファイルやディレクトリに対する読み取り・書き込み・実行の許可設定。ls -lの先頭に表示されるdrwxr-x---のような記号で表される。2-4で詳しく扱う。
  5. Permission denied … 「権限がありません」という意味のエラーメッセージ。ファイルの所有者・グループ・その他のいずれにも該当する権限がない場合に表示される。