Linuxのユーザとグループについて、
そもそも「ユーザって?」というレベルから、「仕組みを理解して基本的な利用が出来る」レベルに引き上げることを目指して、書いていきます。
( rootユーザ / 一般ユーザ / ユーザの使い分け例 )
( ユーザ作成方法 / ユーザの設定情報編集方法 / ユーザ削除方法 / ユーザ切替方法 )
( ユーザグループとは / グループ関連基本のコマンド/ グループ情報の格納先 )
( 所有者(オーナー)とは / 所有者情報の確認方法/ 所有者の変更方法 )
( パーミッション(権限)とは / パーミッション情報の確認方法 / パーミッションの設定方法)
0.ユーザって、なに?(超初心者向け)
まずは、ユーザって?というお話。超初心者向けなので知ってる人は次へどうぞ。
Linuxのユーザといっても、大まかには、Windowsのログインユーザと、あまり変わらない。
LinuxもWindowsと同様、OSの起動時に、ユーザとパスワードによってログインする仕組みになっている。
また、Windowsでは、複数ユーザアカウントを作成し、必要に応じて「ログオフ」と「ユーザ切替」を行うことができる。
Linuxでも、やはり複数ユーザを作成し、必要に応じてユーザを切り替えることができるようになっている。
さらに、Windowsにおいて、ユーザAのアカウントで、ユーザBのフォルダやファイルにアクセスできないのと同じく、
Linuxでも、ユーザが異なればアクセス権限も異なってくる。
Linuxには、rootユーザとユーザグループの概念など、Windowsには無いものもあるが、
ひとまずここまでで、ユーザがどんなものなのか、イメージを持てればOK。
1.各ユーザの役割(初心者向け)
実はLinuxのユーザは、大きく3つに分類される。
Linuxユーザを語るうえで絶対に外せない「rootユーザ」、
OS・システムで利用される、あまり意識しなくて良いシステム用のユーザ、
そしてWindowsユーザと一番近い(と思われる)のが、「一般ユーザ」と呼ばれるユーザである。
ここでは、rootユーザと一般ユーザの違い、および、ユーザの使い分け例を解説する。
◎rootユーザ
rootユーザは、管理者権限を持っており、他のユーザを作成したり、OSの設定ファイルを修正したりといったことができる。
複数いるユーザの中で一番強い。強すぎて、別名スーパーユーザ(super user)という別名まである。
めちゃくちゃ強いので、その気になればファイルを全部消すことも、OSの設定ファイルをいじってOSをぶっ壊すこともできてしまう。
なお、rootユーザはOSインストール時に必ず作成される。
◎一般ユーザ
rootでない、普通のユーザは「一般ユーザ」と呼ばれる。
OS種類にもよるが、インストール時に任意で作成することができるほか、rootユーザの管理者権限を用いて、後から作ることもできる。複数作ることも可能。
rootほど強い力は持たないが、設定によって、権限内容を、ユーザ毎に決めることができる。
◎ユーザの使い分け例
rootが強くて一般はそこまで、、と分かっても、その違いを具体的に思い浮かべるのは難しいと思う。
そこで、ユーザの権限の違いをイメージしやすくするため、
私が前にいたSESの現場で、実際に運用されていた事例を説明する。
<ビジネスモデル>
現場のビジネスモデルは、
複数のお客様企業から、自社サーバ内のディレクトリにファイルを配置してもらい、そのデータを処理する
というものだった。
そのため現場では、お客様企業ごとに、お客様企業専用のディレクトリを作成していた。
お客様A社は、A社専用のディレクトリにアクセスできるが、
B社のディレクトリの中身を見ることはできないし、
当然、データを処理するプログラムファイルなどの社外秘情報も、見ることはできない。
一方で、自社=処理を開発・運用する場合は、データを処理するのだから、
A社・B社それぞれのディレクトリにアクセスできないと、話にならない。
また、データを処理するために必要なプログラムのファイルなどにも、アクセスできる必要がある。
さらに、そもそもこのプログラムを支えるOS部分の設定ファイルや、ユーザ情報のファイルなど、
システムの基盤を支える情報へは、自社の中でも特に限られた人だけがアクセスできるようにしたい。
要するに、以下の図のようなアクセス権を実現する必要があった。
<ユーザの使い分け>
現場では、これらのアクセス権限に関する要件を実現させるために、ユーザを使い分けていた。
つまり、一番強くて作成必須であるrootユーザの他、
・A社専用のユーザ(companyA)
・B車専用のユーザ(companyB)
・開発、運用担当者向けのユーザ(developUser)
を作ったうえで、
・A社専用ユーザでログインしたときは、A社用ディレクトリのみにアクセスできる
・開発、運用担当者向けのユーザでログインしたときは、お客様用ディレクトリ含め、アクセス可能な範囲が広くなる
・rootは一番権限が強いので、全てにアクセスできる
といった制限をかけていた。
このように、ユーザを複数設けることは、用途に応じた適切な権限を付与できるという大きなメリットがある。
ではどのようにすれば、ユーザを作成したり、適切な権限を与えたりできるのか??
以降で具体的なコマンドを紹介していく。
2.基本のコマンド
◎ユーザ作成方法
ユーザ作成は、基本的に管理者権限を持つユーザ=rootユーザでしかできない。
つまり、「1.各ユーザの役割」-「ユーザの使い分け例」で出てきた、お客様A社のユーザや、開発者向けユーザなどは、好き勝手にユーザを作れないということ。
あくまでもrootユーザの管理者権限下で、一般ユーザは存在しているのである。
で、肝心の作り方はこちら。
$ useradd ユーザ名
useraddコマンドにオプションを加えることで、より詳細にユーザ設定することも可能。
以下は主なオプションたち。
オプション | 内容 |
---|---|
-d または --home-dir | ユーザのホームディレクトリを指定する。 |
-g または --git | 所属させたいユーザグループ(後述)のIDを指定する。 |
-G または --groups | 所属させたいユーザグループ名を指定する。 複数指定も可能。 |
-u または --uid | ユーザID(ユーザを一意に識別するID番号)を指定する。 |
-p または --password | ユーザのパスワードを指定する。 ただし別途自分で暗号化したパスワードを入れる作業が必要なため、 別途コマンドを実行(後述)して設定するほうが楽。 |
-e または --expiredate | ユーザの利用可能期限を指定する。 一時的にユーザを作成するなどの時に有効。 |
<作成例>
$ useradd -d /home/test/user1 -u 1011 user1
→「user1」という名前のユーザを作成。
この時、user1のホームディレクトリパスを/home/test/user1、 ユーザIDを1011と指定している。
<ユーザのパスワードを別途設定する方法>
注意したいのは、一般ユーザのパスワード設定は任意である。
が、セキュリティ観点から、実際には設定することが多いはず。
また、rootユーザは基本的にパスワード必須となる。
ユーザ作成時のオプションで設定する以外に、以下のコマンドを利用して後から設定する方法もある。
既に設定しているパスワードを変更する時も同じコマンドを利用できる。
$ passwd パスワードを設定したいユーザ名
コマンドを実行すると、設定するパスワードの入力が求められる。
入力したパスワードはコンソールに表示されないが、入力は認識されているので気にせず進めてよい。
また、確認のために2回同じパスワードを入力する必要がある。
こんな感じ↓
$ passwd testuser
New password: ←表示されないが入力は認識される
Retype new password: ←同上
passwd: password updated successfully
◎ユーザの設定情報編集方法
コマンドは以下の通り。
編集したい項目をオプションで指定するため、コマンド実行時はオプション必須である。
$ usermod ユーザ名 オプション
以下は主なオプションたち。
オプション | 内容 |
---|---|
-d または --home | ユーザのホームディレクトリを変更する。 ※現在のホームディレクトリの内容を移動させたい時は、 「-m」オプションも同時に付ける必要。 |
-g または --git | 所属させたいユーザグループ(後述)を変更する。 |
-u または --uid | ユーザID(ユーザを一意に識別するID番号)を変更する。 |
-e または --expiredate | ユーザの利用可能期限を指定する。 一時的にユーザを作成するなどの時に有効。 |
-L または --lock | ユーザをロックし、ログインできなくする。 |
-U または --unlock | ユーザのロックを解除する。 |
◎ユーザ削除方法
$ userdel 削除したいユーザ名
削除もrootユーザでのみ行える。(作成時と理屈は一緒)
また、ユーザを消すだけでなく、そのユーザに紐づくホームディレクトリとその中身も丸ごと削除したいときは、「-r」オプションを付ける。
(全部消えちゃうのでご利用は慎重に。)
◎ユーザ切替方法
$ su 切り替えたいユーザ名
これだけでOK。
切替のためにパスワードを求められたら、あらかじめ設定したパスワードを入力すればよい。
3.ユーザ情報の格納先
自分で作った一般ユーザだけでなく、rootユーザや、システムで使われる予約ユーザの情報も、
/etc/passwd というファイルに格納される。
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
~中略~
user1:x:1011:1011::/home/test/user1:/bin/sh
1行に1つのユーザの設定が記述されている。
各行は「:」で区切られて、様々な値が設定されているが、これは左から順に、
ユーザ名:パスワード:ユーザID:グループID:ユーザに関するコメント:ホームディレクトリ:使用するシェル
という値を示す。
ただしパスワード部分は、セキュリティ観点から、一律「x」で置き換えて記述される。
なお、ユーザ作成・削除およびユーザ情報の変更は、セキュリティ観点および誤編集防止のため、
このファイルの編集ではなく、コマンドを介して行うことが推奨される。
/etc/passwdファイルは、あくまでもユーザの一覧や設定情報を確認したい時に、閲覧するに留めると良い。
4.ユーザグループの概念
◎ユーザグループとは
個々のユーザを意味のあるひとまとまり=ユーザグループ(以下、「グループ」)に所属させることで、
個々のユーザを管理しやすく、所属するユーザの設定をまとめて変更できる。
ユーザは必ずどこかのグループに所属することになっており、所属グループが複数あっても良い。
人間でいうと、「○○株式会社」という集団=グループAと、「東京都」という集団=グループBと、、、といった複数のグループに所属しておくことで、
たとえば納税や保険料納入の管理を行いやすくなることと、同じような概念だと思う。
◎グループ関連基本のコマンド
<グループ作成>
$ groupadd グループ名
オプション利用で、グループの詳細を設定することができる。
以下は主なオプションたち。
オプション | 内容 |
---|---|
-g または --git | グループID(グループを一意に識別するID番号)を指定する。 |
-p または --password | グループのパスワードを指定する。 ただし別途自分で暗号化したパスワードを入れる作業が必要なため、 別途コマンドを実行(後述)して設定するほうが楽。 |
-f または --force | グループが既に存在していた場合はグループを作らず終了する。 また、-gでグループIDを指定時、そのIDが既に使われていたら、 別のIDを自動で割り当てる。 |
<グループのパスワード設定>
$ gpasswd グループ名
ユーザのパスワードを設定する時と同じ感じで設定できる。
<グループ編集>
グループの設定情報を編集するコマンド。
編集したい項目をオプションで指定するため、コマンド実行時はオプション必須である。
$ groupmod グループ名 オプション
以下は主なオプションたち。
オプション | 内容 |
---|---|
-g または --git | グループID(ユーザグループを一意識別する値)を変更する。 |
-n または --new-name | グループ名を変更する。 |
<グループ削除方法>
$ groupdel グループ名
特筆事項は特になし。
<ユーザをグループに追加する方法>
基本は以下の通り。
$ gpasswd グループ名 -a ユーザ名
「-a」は「--add」としてもOK。
その他、「2.基本のコマンド」で書いた通り、ユーザの新規作成コマンドや設定情報編集コマンド実行時、
-gオプションにて、所属させたいグループを指定することもできる。
・ユーザ新規作成時:
$ useradd ユーザ名 -g グループ名
・ユーザの設定情報編集:
$ usermod ユーザ名 -g グループ名
<ユーザをグループから削除する方法>
$ gpasswd グループ名 -d ユーザ名
「-d」は「--delete」としてもOK。
◎グループ情報の格納先
各グループの情報は、/etc/groupに記載されている。
ユーザ情報のファイルと同様、ファイルは原則閲覧用として使用し、グループ情報の編集はコマンドを使うことが推奨される。
5.ファイル・ディレクトリの所有者
「1.各ユーザの役割(初心者向け)」の例では、お客様A社用ユーザは、B社用のディレクトリや開発担当者が処理するファイルなどへアクセスできないことを説明した。
このように、一般ユーザは、すべてのファイルやディレクトリにアクセスできるとは限らない。
◎所有者(オーナー)とは
ファイルやディレクトリの所有ユーザ・グループのこと。
基本的には、そのファイルやディレクトリを作ったユーザが所有者となる。
所有者という単語の意味からも想像しやすいように、
所有者でない他のユーザに比べて、そのファイル・ディレクトリに対する権限は強いことが一般的。
例えていうなら、Aさんが自分のパソコンを所有しているとすると、Aさんは自由に使えるが、
Bさん、Cさんは勝手に使えない(Aさんの許可が要る)というのと同じかんじ。
また、ファイルやディレクトリには、所有「ユーザ」だけでなく、所有「グループ」も設定される必要がある。
ファイルやディレクトリの作成時点では、所有ユーザ(=作成ユーザ)の所属するグループが、
そのまま所有グループとなる。
なお、所有ユーザや所有グループに関係なく、rootユーザはすべてのファイル・ディレクトリに、自由にアクセスできる。
所有ユーザ、所有グループとrootユーザの関係を整理すると、以下の図のような感じ。
会社=rootユーザは権限が強いので、社員のAさん=所有ユーザが使うパソコンを、Aさんの許可なく自由に扱える。
◎所有者情報の確認方法
ファイル、ディレクトリの所有ユーザと所有グループがどうなっているかは、
「ls -l」コマンドまたは「ll」コマンドで確認できる。
$ ls -l
drwxr-xr-x 1 user1 testgrp 512 Sep 13 10:05 test.d
-rw-r--r-- 1 user1 testgrp 10 Sep 13 10:02 test.txt
赤が所有ユーザ、オレンジが所有グループを指している。(青はファイル、ディレクトリの名前。)
◎所有者の変更方法
所有者の変更は、rootユーザの管理者権限で行う。
$ chown 変更後の所有ユーザ:変更後の所有グループ ファイルorディレクトリ名
変更した後は、きちんと反映されているか、「ls -l」コマンドで確認するとよい。
6.ファイル・ディレクトリのパーミッション
◎パーミッション(権限)とは
実は、ファイルやディレクトリを利用できる「権限(別名:パーミッション)」には、以下3種類がある。
権限 | 内容 |
---|---|
閲覧(Read) | ファイルやディレクトリの中身を見ることが出来る権限。 |
編集(Write) | ファイルを編集できる権限。 あるいは、ディレクトリ内に新たなファイル、 ディレクトリを作るなどの「ディレクトリの編集」権限。 |
実行(Execute) | プログラムファイルなどを実行できる権限。 あるいは、当該ディレクトリに入ることが出来る権限。 |
パーミッションは、例えば、
・所有ユーザなら3つの権限とも許可する
・所有グループは閲覧だけOK
・所有ユーザでも所有グループに属するユーザでもない場合、全ての権限がない
などといったように、ファイル、ディレクトリ毎に細かく設定できるようになっている。
従って、たとえ所有ユーザであっても、仮に全ての権限を許可しない設定にすれば、文字通り何もできないことになる。(さすがにそんな設定にすることはないと思いますがw)
◎パーミッション情報の確認方法
ファイル、ディレクトリのパーミッションがどうなっているかは、
所有ユーザ・グループを確認する時と同じく、「ls -l」コマンドまたは「ll」コマンドで確認できる。
$ ls -l
drwxr-xr-x 1 user1 testgrp 512 Sep 13 10:05 test.d
-rw-r--r-- 1 user1 testgrp 10 Sep 13 10:02 test.txt
オレンジの部分(9文字の羅列部分)がパーミッションの設定情報を示している。(青はファイル、ディレクトリの名前。)
以下のように、3文字ずつ区切って読むのがポイント。
rwx r-x r-x
① ② ③
①は所有ユーザ、②は所有グループに属するユーザ、③はその他のユーザのパーミッションを示す。
各3字は、パーミッションの3つの種類が付与されているかどうかを示す。
左から順に、Read(閲覧)、Write(編集)、Execute(実行)の有無を表し、
アルファベットが書かれている→権限あり
「-」となっている→権限なし
という意味になる。
つまり、 rwxr-xr-x は、
・所有ユーザは3つの権限とも許可する
・所有グループに属するユーザは、閲覧(Read)・実行(eXecute)のみ可能
・その他のユーザは、閲覧(Read)・実行(eXecute)のみ可能
という意味になる。
また、rw-r--r-- ならば、
・所有ユーザは閲覧(Read)・編集(Wirte)が可能。
・所有グループに属するユーザは、閲覧(Read)のみ可能
・その他のユーザは、閲覧(Read)のみ可能
という意味になる。
◎パーミッションの設定方法
$ chmod パーミッションの内容 対象ファイルorディレクトリ名
パーミッションの内容について、
詳しくは以下のQiita記事などが参考になるのでそちら見てください。。
(書くの疲れてきたので他力本願…w)
https://qiita.com/shisama/items/5f4c4fa768642aad9e06
要は、所有者とパーミッションの双方の設定によって、
ファイルやディレクトリのアクセス制限を行っているんだということが分かれば、
私のこの記事ではOKってことにします。
おわりに
実はユーザ権限というのは、ほんとーーうに重要なものなのです。
私は前の現場において、ユーザの概念を知らず、知らないので当然設定などもしておらず、
お客様ユーザがアクセスできるべきフォルダを、開発者用ユーザでしかアクセスできない状態で作ってしまったことがあります(-_-;) (しかも先輩にチェックしてもらったのに指摘されなかった、、、)
お客様からすると、フォルダにアクセスしたいのに、権限が無くアクセスエラー。
「なんでやねん!」というトラブルを発生させました。
自分の普段使っているユーザでファイルアクセスできていると、
他ユーザから見たアクセス権を意識するのはなかなか難しいかもしれません。
が、特にLinuxで何かのファイル・ディレクトリを作る時などには、
ユーザ・グループの権限をしっかりと意識していきたいところですね(`・ω・´)
かなり長い記事になりましたが(そして最後のほう雑になりましたがw)、最後までお読みいただき、ありがとうございました。