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

所有者とグループ

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

前提:2-4が完了し、~/practiceにnote.txt・work・test.sh等が存在する状態。ubuntuユーザーのホームディレクトリ(~)にいる状態から始めます。2-4では「所有者・グループ・その他」という3つの立場に対する権限の中身(読む・書く・実行する)を学びました。今回はその前提となる、「そもそも誰が所有者で、誰がそのグループなのか」という持ち主そのものを変更する方法を学びます。groupaddで新しいグループdevteamを作り、yumiをそこに所属させ、chownchgrpで持ち主を書き換えるところまでが到達点です。

SET 1 ― グループの現状を確認する

ubuntu@lightsail: ~
  1. $groups
  2. ubuntu adm sudo
  3. $groups yumi
  4. yumi : yumi
  5. $cat /etc/group | tail -n 3
  6. $wc -l /etc/group
  7. $getent group sudo
  8. sudo:x:27:ubuntu
  9. $getent group yumi
  10. $id yumi
  11. $id ubuntu
  12. $whoami
  13. $cd ~/practice
解説 ― SET 1 で何をしたか

1行目のgroups(2-1でも使用)で、まずubuntu自身の所属グループを再確認します。2行目のようにgroupsに名前を渡すと、他のユーザーの所属も調べられます。出力例のyumi : yumiは、「yumiが所属しているグループはyumiという1つだけ」という意味です。2-2で見たとおり、Ubuntuではユーザーを作ると同じ名前の専用グループが自動的に作られ、そこに1人だけが所属する形になります。

3行目のcat /etc/groupは、/etc/group※1という、/etc/passwdのグループ版にあたるファイルで、サーバー上の全グループの情報が記録されています。4行目のwc -lで、このサーバーに登録されているグループの総数を数えておきます。5行目のgetent group sudoを実行すると、出力例sudo:x:27:ubuntuが得られます。これは「①グループ名」「②パスワード欄(通常未使用)」「③GID」「④そのグループに所属するメンバーの一覧」という構造で、2-1で確認した「ubuntuがsudoグループに入っている」事実が、ここでも裏付けられます。6行目でyumiのグループも同様に確認すると、メンバー欄が空になっていることがあります。これは「yumiグループの本来のメンバーはyumi自身であり、それは/etc/passwd側のGIDで表現されているため、/etc/group側のメンバー一覧には重ねて書かれない」という仕組みによるものです。

7行目のid yumiで、改めてyumiの所属グループがyumi1つだけであることを確認し、8行目のid ubuntuとも見比べておきます。9行目のwhoamiで、この一連の操作をしているのはあくまでubuntu自身であることを再確認し、10行目のcd ~/practiceで、このあとの演習に使う練習用ディレクトリへ移動しておきます。

POINT

「ユーザーは複数のグループに同時に所属できる」というのがLinuxのグループ管理の基本です。yumiは今yumiグループにしか入っていませんが、このページの後半でdevteamという2つ目のグループにも所属させます。

ゆみちゃん
ゆみ

あたし、生まれたときから「yumiグループ」っていう自分専用のグループに1人だけで所属してるんだよね。なんかちょっと寂しい響きだけど、これはUbuntuのお約束で、ユーザーを作ると自動でついてくるものだから気にしなくて大丈夫。このあとチームのグループに入れてもらえるみたいだから、ちょっと楽しみ!

SET 2 ― devteamグループを作りyumiを加える

ubuntu@lightsail: ~/practice
  1. $sudo groupadd devteam
  2. $getent group devteam
  3. devteam:x:1002:
  4. $cat /etc/group | tail -n 1
  5. $groups yumi
  6. $sudo usermod -aG devteam yumi
  7. $groups yumi
  8. yumi : yumi devteam
  9. $getent group devteam
  10. devteam:x:1002:yumi
  11. $id yumi
  12. $groups
  13. $pwd
解説 ― SET 2 で何をしたか

1行目のsudo groupadd devteamで、新しいグループdevteamを作ります。グループの新規作成はシステム全体に影響する操作のため、adduserのときと同様にsudoが必要です。2行目で確認すると、出力例devteam:x:1002:のようにGID(この例では1002)が割り振られただけの、メンバーが誰もいないグループができています。3行目のtail -n 1/etc/groupの最後の行を見ても、同じ新規グループが末尾に追加されていることがわかります。4行目のgroups yumiで、この時点ではまだyumiがdevteamに入っていないことを確認しておきます。

5行目のsudo usermod -aG devteam yumiが今回の中心的なコマンドです。usermod※2(user modifyの略)は既存ユーザーの設定を変更するコマンドで、-aG※3は「グループへの追加(append)」を意味します。ここでもsudoが必要な理由は、他人(yumi)の所属グループを変更する操作だからです。6行目のgroups yumiで確認すると、出力例のとおりyumi devteamと2つのグループが表示され、無事devteamへの追加ができたことがわかります。

ここで絶対に注意してほしいのが-aを忘れないことです。-aGではなく-Gだけを指定すると、「追加」ではなく「所属グループをこの指定だけに丸ごと置き換える」という意味になってしまい、元々入っていたグループ(この場合はyumi自身のグループ)から外れてしまう事故が起こり得ます。-aGを1セットの呪文として覚えておきましょう。7行目でgetent group devteamを見ると、出力例devteam:x:1002:yumiのようにメンバー欄にyumiの名前が追加されていることも確認できます。8行目のid yumiでも同じ結果が反映されているはずです。9行目のgroups10行目のpwdで、ubuntu自身の所属は変わっていないこと、練習用ディレクトリにいることを確認して締めくくります。

POINT

usermod -aGでグループに追加しても、すでにログイン中のセッションには反映されません。yumiがもしsu - yumiでログインしたままだったら、一度exitして入り直さないと新しいグループ所属が有効になりません。このあたりは2-6の総合演習でも意識してもらいます。

SET 3 ― chownとchgrpで持ち主を変える

ubuntu@lightsail: ~/practice
  1. $touch teamfile.txt
  2. $ls -l teamfile.txt
  3. -rw-rw-r-- 1 ubuntu ubuntu 0 Jul 3 09:45 teamfile.txt
  4. $sudo chgrp devteam teamfile.txt
  5. $ls -l teamfile.txt
  6. -rw-rw-r-- 1 ubuntu devteam 0 Jul 3 09:45 teamfile.txt
  7. $chgrp devteam note.txt
  8. chgrp: changing group of 'note.txt': Operation not permitted
  9. $sudo chown yumi teamfile.txt
  10. $ls -l teamfile.txt
  11. $sudo chown yumi:devteam teamfile.txt
  12. $ls -l teamfile.txt
  13. -rw-rw-r-- 1 yumi devteam 0 Jul 3 09:45 teamfile.txt
  14. $cd ~
解説 ― SET 3 で何をしたか

1行目で新しいファイルを作り、2行目で確認すると所有者・グループともubuntuです。3行目のsudo chgrp devteam teamfile.txt(change group※5の略)は、ファイルの所有グループだけを変更するコマンドです。他人のファイルの所属先を書き換える操作なのでsudoが必要です。4行目で確認すると、出力例のように所有者はubuntuのまま、グループだけがdevteamに変わっています。

5行目、あえてsudoなしで2-4のnote.txtのグループを変更しようとすると、出力例のようにOperation not permittedで拒否されます。一般ユーザーは、原則として自分が所属していないグループへの変更をsudoなしでは行えません(自分が所属するグループへの変更は場合によって可能ですが、この講座では常にsudoを使う方針で統一します)。

6行目のsudo chown yumi teamfile.txt(change owner※4の略)は所有者だけを変更します。7行目で確認すると、所有者だけがyumiに変わり、グループは直前に設定したdevteamのままであることがわかります。8行目のsudo chown yumi:devteam teamfile.txtのように:で区切ってグループ名を続けて書くと、所有者とグループを同時に指定できます。9行目で確認すると、出力例のとおり所有者がyumi、グループがdevteamという、狙った持ち主の組み合わせに変わっています。chown1つで所有者とグループの両方を同時に扱えるため、実務ではchgrpよりchown ユーザー:グループの書き方の方がよく使われます。

ここまでの3つのコマンド、chmod(2-4:何を許可するか)・chown(誰の持ち物か)・chgrp(どのグループの持ち物か)を組み合わせることで、「所有者・所有グループ・その他」という3層構造のそれぞれに、思いどおりの権限を割り当てられるようになります。最後の10行目のcd ~でホームディレクトリに戻り、このページを締めくくります。次の2-6では、この3つを総動員してyumiと共有できるディレクトリを作ります。

ゆみちゃん
ゆみ

chmodchownchgrp、名前が似てて最初こんがらがるやつだ~! 「chmod=権限の中身(何ができるか)」「chown=持ち主(誰のものか)」「chgrp=グループ(どのチームのものか)」って役割で覚えると整理しやすいよ。あたしも最初は全部ごっちゃにしてたから、気持ちはすごいわかる!

POINT

chown yumi:devteam ファイルのように:を使う書き方は、所有者とグループを1コマンドで同時に変更できる便利な形です。:の前後どちらかを省略する(chown yumi: ファイルchown :devteam ファイル)こともでき、その場合は省略した側は変更されません。

まとめ

2-5では、新しいグループdevteamを作成してyumiを所属させ、chownchgrpでファイルの持ち主を変更しました。これで所有者・所有グループ・その他という権限の3層構造をすべて自分の手で操作できるようになりました。このページで叩けるようになったコマンドを一覧にまとめます。

コマンド何をするか覚え方
groups <名前>指定ユーザーの所属グループを表示するgroupsそのまま
getent group <名前>グループのGID・メンバー一覧を確認するグループ版getent
sudo groupadd <名前>新しいグループを作成するgroup add(グループを追加)
sudo usermod -aG <グループ> <名前>既存のグループ所属を保ったまま新しいグループに追加する-a(追加)を忘れずに
sudo chown <名前> <ファイル>ファイルの所有者を変更するchange owner(持ち主を変える)
sudo chown <名前>:<グループ> <ファイル>所有者とグループを同時に変更する:でつなげて一気に指定
sudo chgrp <グループ> <ファイル>ファイルの所有グループのみを変更するchange group(グループを変える)

次のページ「2-6. 権限総合演習」では、この章で学んだすべて(sudo・ユーザー切り替え・chmodchownchgrp)を使い、ubuntuとyumiが実際にファイルを共有するディレクトリを作る総合演習に挑みます。

脚注 ─ 用語解説
  1. /etc/group … サーバー上の全グループの情報(グループ名・GID・メンバー)を記録したファイル。/etc/passwdのグループ版にあたる。
  2. usermod(user modify) … 既存ユーザーの設定(所属グループ・ホームディレクトリなど)を変更するコマンド。
  3. -aG(append + Group)usermodのオプション。既存の所属グループを保ったまま、新しいグループに追加する。-aを忘れると既存の所属が消える危険がある。
  4. chown(change owner) … ファイルやディレクトリの所有者(必要ならグループも同時に)を変更するコマンド。
  5. chgrp(change group) … ファイルやディレクトリの所有グループのみを変更するコマンド。