ユーザーとグループ
GNU/Linux のユーザーとグループは、アクセス制御のために使われています — つまり、システムのファイル、ディレクトリ、周辺機器へのアクセスのコントロールに使われます。Linux は比較的シンプルかつ粗っぽいアクセス制御メカニズムをデフォルトで提供します。高度な制御については、ACL や ケイパビリティ、PAM#設定方法を見て下さい。
目次
概要
ユーザーとはコンピュータを使う全ての人のことです。ここで、名前がユーザーを表すことを説明しましょう。名前は Mary や Bill という風につけられ、実名のかわりに Dragonlady や Pirate といった名前を使うことができます。重要なのはコンピュータはそれぞれのアカウントに名前をつけていて、人々がコンピュータを使うためのアクセスを得るために名前を使うということです。システムサービスによっては制限・特権ユーザーアカウントを使って動作させることもあります。
特定の方法でアクセスを制限することでセキュリティのためにユーザーの管理が行われます。スーパーユーザー (root) はオペレーティングシステムと設定全てにアクセスすることができます。そのため管理用途だけに使われることが想定されています。特権がないユーザーは su や sudo のプログラムを使うことで、制御された特権昇格を行うことが可能です。
作成するアカウントにそれぞれ異なる名前を使えば、人々は複数のアカウントを持つことが可能です。さらに、"root" など、使うことができない予約済みの名前も存在します。
ユーザーは"グループ"にまとめることができ、グループに入ることでユーザーはグループで認められた特権的アクセスを利用することができます。
パーミッションと所有権
In UNIX Everything is a File より:
- UNIX オペレーティングシステムはデザイン、インターフェイス、文化と革命を形作った統一のアイデアとコンセプトを具体化しています。おそらくその中で一番重要なマントラが"全てのものはファイルである"であり、UNIX を定義付けるポイントとして広く受け取られています。
- このキーデザイン原理の構成は統一パラダイムの提供による幅広い入出力のアクセスです: ドキュメント、ディレクトリ、ハードドライブ、CD-ROM、キーボード、プリンター、モニター、ターミナル、インタープロセス、ネットワーク。トリックはこれらリソース全てに対して共通のアブストラクションを提供することで、UNIX の父たちは"ファイル"と呼びました。全ての"ファイル"が同じ API を使って扱われることにより、同じ基本的なコマンドセットを使ってディスク、キーボード、ドキュメント、ネットワークデバイスへの読み書きができます。
Extending UNIX File Abstraction for General-Purpose Networking より:
- UNIX とその互換オペレーティングシステムで提供されている、基礎的でとてもパワフルで一貫性のあるアブストラクションがファイルアブストラクションです。多くの OS サービスとデバイスインターフェイスはアプリケーションにファイルやファイルシステムをあたえることで実装されています。これによって既存のアプリケーションの新しい利用ができるようになり力を引き出すことができるようになります — 固有の使用目的で設計されたシンプルなツールが、UNIX ファイルアブストラクションを使って、新しい方法で利用されます。cat のような、ファイルの読み込みと標準出力への内容のアウトプットができるシンプルなツールを特別なデバイスファイル、典型的に
/dev
ディレクトリ下のファイルを通して、I/O デバイスからの読み書きに使うことが可能なのです。多くのシステムで、録音と再生がそれぞれ次のコマンドで出来ます、"cat /dev/audio > myfile
" と "cat myfile > /dev/audio
"。
GNU/Linux において全てのファイルは1つのユーザーと1つのグループによって所有されます。加えて、アクセス許可の3つのタイプが存在します: 読み込み、書き込み、実行です。ファイルの所有ユーザー、所有グループ、(所有権をもっていない)第三者に対してそれぞれ異なるアクセス許可を適用することが可能です。ls コマンドによってファイルの所有者とパーミッションを確認できます:
$ ls -l /boot/
total 13740 drwxr-xr-x 2 root root 4096 Jan 12 00:33 grub -rw-r--r-- 1 root root 8570335 Jan 12 00:33 initramfs-linux-fallback.img -rw-r--r-- 1 root root 1821573 Jan 12 00:31 initramfs-linux.img -rw-r--r-- 1 root root 1457315 Jan 8 08:19 System.map26 -rw-r--r-- 1 root root 2209920 Jan 8 08:19 vmlinuz-linux
最初の列にファイルのパーミッションが表示されます (例えば、ファイル initramfs-linux.img
のパーミッションは -rw-r--r--
)。3、4列目にはファイルの所有ユーザーとグループがそれぞれ示されます。この例では、全てのファイルは root ユーザーと root グループによって所有されています。
$ ls -l /media/
total 16 drwxrwx--- 1 root vboxsf 16384 Jan 29 11:02 sf_Shared
この例では、sf_Shared
ディレクトリは root ユーザーと vboxsf グループによって所有されています。stat コマンドを使うことでもファイルの所有者とパーミッションを確認することができます:
所有ユーザー:
$ stat -c %U /media/sf_Shared/
root
所有グループ:
$ stat -c %G /media/sf_Shared/
vboxsf
アクセス権限:
$ stat -c %A /media/sf_Shared/
drwxrwx---
アクセス許可は3つのグループの文字で表示され、それぞれ所有ユーザー、所有グループ、第三者のパーミッションを表しています。例えば、-rw-r--r--
はファイルの所有者は読み込みと書き込みが可能で、実行はできない (rw-
) ことを示していて、さらに所有グループに属しているユーザーとその他のユーザーは読み込みしかできない (r--
と r--
) ことを示しています。一方、drwxrwx---
はファイルの所有者と所有グループに属すユーザーが読み込み・書き込み・実行の全てができ (rwx
と rwx
)、他のユーザーはアクセスを拒否される (---
) ことを示しています。一番最初の文字はファイルのタイプです。
あるユーザーやグループによって所有されているファイルを一覧するには find コマンドを使います:
# find / -group groupname
# find / -group groupnumber
# find / -user user
ファイルの所有ユーザーやグループは chown コマンドで変更できます。ファイルのアクセス許可を変更するコマンドは chmod です。
詳しくは chown(1)、chmod(1)、Linux file permissions を見て下さい。
Shadow
Arch Linux のユーザー、グループおよびパスワードの管理ツールは、base メタパッケージ の依存関係である shadow パッケージから取得されます。
ファイル一覧
ファイル | 目的 |
---|---|
/etc/shadow |
セキュアなユーザーアカウント情報 |
/etc/passwd |
ユーザーアカウント情報 |
/etc/gshadow |
グループアカウントの暗号化された情報 |
/etc/group |
ユーザーが属するグループの定義 |
ユーザー管理
現在システムにログインしているユーザーを一覧するには who
コマンドを使います。全てのユーザーアカウントとユーザーデータベースに保存されているプロパティを確認するには、root で passwd -Sa
を実行してください。出力されるフォーマットについては passwd(1) の説明を読んでください。
新しいユーザーを追加するときは useradd
コマンドを使って下さい:
# useradd -m -g [initial_group] -G [additional_groups] -s [login_shell] [username]
-m
を使うとユーザーのホームディレクトリ/home/[username]
を作成します。ホームディレクトリの中では、root でないユーザーがファイルの書き込み・削除、プログラムのインストールなどができます。-g
でユーザーのイニシャルログイングループのグループ名・ナンバーを定義します; グループ名が存在していなければなりません; グループナンバーが指定された時は、そのナンバーが既存のグループに参照されている必要があります; 指定されなかった場合は、useradd の挙動は/etc/login.defs
内のUSERGROUPS_ENAB
に基づきます。デフォルトの挙動 (USERGROUPS_ENAB yes
) ではユーザー名と同じ名前でグループを作成し、GID
はUID
と同じになります。-G
はユーザーがメンバーになる追加グループ(のリスト)を指定します; グループはそれぞれカンマで区切り、スペースを入れてはいけません; デフォルトはイニシャルグループにだけユーザーを属させます。-s
ではユーザーのデフォルトログインシェルのパスとファイル名を定義します; ブートプロセスが完了した後、ここに指定したシェルがデフォルトのログインシェルになります; Bash 以外のシェルを使うのなら、その選んだシェルのパッケージをインストールしておいてください。
ユーザーを追加する例
典型的なデスクトップシステムでは、archie
という名前の新しいユーザーを追加して、Bash をログインシェルに指定し、wheel
グループに追加するには以下のコマンドを使います (詳しくは #ユーザーグループ を参照):
# useradd -m -G wheel -s /bin/bash archie
新しく作成したユーザー archie
にパスワードを設定する必要は必ずしもありませんが、設定することを強く推奨します:
# passwd archie
上記の useradd コマンドは archie
という名前のグループも自動的に作成し、ユーザー archie
の UID と同じ GID が設定されます。そしてログイン時に archie
のデフォルトグループになります。ユーザーを追加するときは各ユーザーにグループを作るのが推奨されています (ユーザー名と同じグループ名、UID と同じ GID)。
users
など別のグループをデフォルトにすることもできます:
# useradd -m -g users -G wheel -s /bin/bash archie
ただし、マルチユーザーシステムではデフォルトグループを使用するのは推奨されていません。大抵、ホームディレクトリをプレイベートにしながら特定のユーザーのグループと書き込みアクセスを共有する方法としてユーザーの umask の値は 002
に設定されており、デフォルトグループ (上の例なら users
) は作成したファイル全てへの書き込み権限をデフォルトで持つことになります。ユーザー名と同じ名前のグループによって所有されている、ユーザーのホームディレクトリは他のシステムユーザーには読み取り専用になり、共有ファイル・フォルダは適当なグループに入っているメンバーによってデフォルトで書き込み可能になります。ディレクトリにグループのスティッキービットを設定することで、親ディレクトリを所有するグループに所有グループを自動的に固定することができます:
# chmod g+s our_shared_directory
そうでない場合、ファイル作成者のデフォルトグループ (通常はユーザー名と同じです) が使われます。
一時的に GID を変更する必要がある場合、newgrp コマンドを使ってユーザーのデフォルト GID を他の GID に変更できます。例えば、newgrp groupname
を実行するとユーザーによって作成されたファイルの GID は groupname
になります。ログインしなおす必要はありません。デフォルト GID に戻すには、グループ名を何も付けずに newgrp を実行してください。
システムユーザーを追加する例
システムユーザーは、異なるユーザのもとでプロセス/デーモンを実行するために使用できます。(chown を使うなどして) ファイルやディレクトリを保護するなど、コンピュータの堅牢化において様々な使用例があります。
以下のコマンドで、シェルへのアクセス権が無く、home
ディレクトリも持たないシステムユーザが作成されます (オプションで、-U
パラメータを追加するとユーザと同じ名前のグループも作成し、ユーザをそのグループに追加します):
# useradd -r -s /usr/bin/nologin username
システムユーザが特定のユーザ ID およびグループ ID を必要とする場合、ユーザの作成時に -u
/--uid
オプションと -g
/--gid
オプションで ID を指定してください:
# useradd -r -u 850 -g 850 -s /usr/bin/nologin username
ユーザーのログイン名やホームディレクトリを変更する
ユーザーのホームディレクトリを変更するには:
# usermod -d /my/new/home -m username
The -m
option also automatically creates the new directory and moves the content there.
To change a user's login name:
# usermod -l newname oldname
ユーザー名の変更は usermod コマンドを使って正しく行えば安全・簡単です。ユーザーが同じ名前のグループに属している場合、groupmod コマンドで変更できます。
また、/etc/passwd
ファイルを直接編集する方法もあります。詳しくはユーザーデータベースを見てください。
Also keep in mind the following notes:
- sudo を使用する場合
/etc/sudoers
を更新して新しいユーザー名を反映させてください (root で visudo コマンドを使用)。 - 個人用の crontab は
/var/spool/cron
のユーザーファイルを古い名前から新しい名前に変更して、crontab -e
を開いて相対パスを変更してファイルのパーミッションも調整します。 - Wine の個人用フォルダ・ファイルコンテンツ
~/.wine/drive_c/users
,~/.local/share/applications/wine/Programs
は手動で名前を変更・編集する必要があります。 - Firefox におけるスペルチェックの有効化は再度行って下さい。そうしないとユーザーの名前を変更後、スペルチェックが実行されません。
- Enigmail など特定の Thunderbird アドオンは再インストールが必要です。
- ホームディレクトリの絶対パス (
/home/oldname
) を使っているファイル (デスクトップショートカット, シェルスクリプトなど) は新しいホームを使うように修正する必要があります。シェルスクリプトではこういう問題が起こらないように、ホームディレクトリを指定するときは~
や$HOME
変数を使いましょう。 - また
/etc
の設定ファイルで絶対パスを使っている場合は忘れずに編集してください (Samba や CUPS など)。どのファイルを編集すればいいかわからないときは grep コマンドを使います:grep -r {old_user} *
。
ユーザー管理の他の例
ユーザーのログイン名を変更するには:
# usermod -l newname oldname
ユーザーのホームディレクトリを変更するには:
# usermod -d /my/new/home -m username
-m
オプションを付けると自動的に新しいディレクトリが作成され中身が移動します。
ユーザーを他のグループに追加するには:
# usermod -aG [additional_groups] [username]
また、gpasswd を使うことも可能です。ただし一度に追加(もしくは削除)できるグループは一つだけになります。
# gpasswd --add [username] [group]
GECOS (例: フルネーム) のユーザー情報を入力するには:
# chfn [username]
(インタラクティブモードで chfn
が起動します)。
ユーザーのパスワードを設定するには:
# passwd [username]
ユーザーのパスワードを期限切れにして、次にログインした時に新しいパスワードを作るよう求めたいときは、次を実行してください:
# chage -d 0 [username]
ユーザーアカウントは userdel
コマンドで削除できます。
# userdel -r [username]
-r
オプションはユーザーのホームディレクトリとメールスプールも削除します。
ユーザーデータベース
ローカルユーザの情報はプレーンテキストの /etc/passwd
ファイルに保存されます。このファイル内の各行は1つのユーザアカウントを表しており、7つのフィールドがコンマで区切られて記述されています。
account:password:UID:GID:GECOS:directory:shell
それぞれのフィールドの意味は以下のとおりです:
account
はユーザ名です。このフィールドを空白にすることはできません。標準的な *NIX の命名規則が適用されます。password
はユーザのパスワードです。UID
はユーザ ID の数値です。Arch では、(サービスとは異なる) 一般ユーザの (root の後の) 最初のログイン名の UID はデフォルトで 1000 となります。その後のユーザの UID エントリは 1000 より大きい必要があります。GID
はユーザのプライマリグループ ID の数値です。GID の数値は /etc/group にリストアップされています。GECOS
はオプションのフィールドで、ユーザの情報を格納するために使用されます。通常、このフィールドには完全なユーザ名が含まれますが、このフィールドは finger などのサービスによって使用されたり、chfn コマンドによって管理されたりする可能性があります。このフィールドは任意で、空白のままにしておくこともできます。directory
は、$HOME
環境変数を設定するためにログインコマンドによって使用されます。独自のユーザを持ついくつかのサービスは/
を使用しますが、通常ユーザは普通/home
下のディレクトリを使用します。shell
はユーザのデフォルトコマンドシェルへのパスです。このフィールドはオプションで、デフォルトは/bin/bash
となります。
例:
archie:x:1001:1003:Archie,some comment here,,:/home/archie:/bin/bash
この例の意味は次のとおりです: ユーザ は archie
で、パスワードは /etc/shadow
に保存されており、UID は 1001 で、プライマリグループは 1003。Archie は完全な名前で、このアカウントに関連付けられたコメントが記入されています。このユーザのホームディレクトリは /home/archie
で、Bash を使用しています。
pwck を使うことで、ユーザデータベースの整合性を検証することができます。また、このコマンドはユーザのリストを GID によってソートします (比較の際に便利でしょう):
# pwck -s
自動整合性チェック
Instead of running pwck
/grpck
manually, the systemd timer shadow.timer
, which is part of, and is enabled by, installation of the shadow package, will start shadow.service
daily. shadow.service
will run pwck(8) and grpck(8) to verify the integrity of both password and group files.
If discrepancies are reported, group can be edited with the vigr(8) command and users with vipw(8). This provides an extra margin of protection in that these commands lock the databases for editing. Note that the default text editor is vi, but an alternative editor will be used if the EDITOR
environment variable is set, then that editor will be used instead.
グループ管理
/etc/group
は、システム上のグループを定義するファイルです (詳細は group(5) を見てください)。このファイルの仲間に gshadow
というものもありますが、これはめったに使用されません。詳細は gshadow(5) を見てください。
groups コマンドでグループのメンバーを表示できます:
$ groups user
user
が省略された場合、現在のユーザが属しているグループの名前が表示されます。
id コマンドは追加の詳細情報も出力します (ユーザの UID や関連付けられた GID など):
$ id user
システム上の全てのグループを一覧するには:
$ cat /etc/group
groupadd コマンドで新しいグループを作成できます:
# groupadd group
そしてユーザーをグループに追加するには gpasswd コマンドを使います (エラーについては FS#58262 を見てください):
# gpasswd -a user group
あるいは、usermod でユーザをグループに追加できます (additional_groups
はコンマで区切られたリストに置き換えてください):
# usermod -aG additional_groups username
groupmod コマンドで既存のグループを変更できます。例えば、old_group
グループの名前を new_group
に変更するには:
# groupmod -n new_group old_group
既存のグループを削除するには:
# groupdel group
グループからユーザを削除するには:
# gpasswd -d user group
grpck コマンドを使用することでシステムのグループファイルの整合性を検証できます。
グループ一覧
このセクションでは core/filesystem パッケージに含まれている主要なグループの用途を説明します。他にもグループは存在し、パッケージがインストールされたときに適当な GID を使って作成されます。詳しくはグループに関連するソフトウェアのページを見てください。
ユーザーグループ
ワークステーション/デスクトップユーザーはしばしば root でないユーザーを以下のグループに追加することで周辺機器やハードウェアのアクセスを許可したりシステム管理を楽にします:
グループ | 影響があるファイル | 目的 |
---|---|---|
adm | 管理者グループ。wheel と類似。
| |
ftp | /srv/ftp/ |
FTP サーバーが供給するファイルへのアクセス。 |
games | /var/games |
ゲームソフトウェアへのアクセス。 |
http | /srv/http/ |
HTTP サーバーが供給するファイルへのアクセス。 |
log | syslog-ng によって作成された /var/log/ のログファイルへのアクセス。
| |
rfkill | /dev/rfkill |
無線デバイスのパワーステートをコントロールする権限 (rfkill[リンク切れ: 置換パッケージ: util-linux] が使用)。 |
sys | CUPS のプリンターを管理する権限。 | |
systemd-journal | /var/log/journal/* |
systemd ログへの読み取りアクセスを与えるために adm や wheel の代わりとして使われます [1]。他の場合、ユーザーが生成したメッセージだけ表示されます。
|
users | 標準のユーザーグループ。 | |
uucp | /dev/ttyS[0-9]+ , /dev/tts/[0-9]+ , /dev/ttyUSB[0-9]+ , /dev/ttyACM[0-9]+ , /dev/rfcomm[0-9]+ |
RS-232 シリアルポートや接続されたデバイス。 |
wheel | 管理作業用グループ、通常 sudo や su コマンドに権限をわたすのに使われます (デフォルトではどちらも wheel を使いません、/etc/pam.d/su や /etc/pam.d/su-l で設定ができます)。journal ファイルへの完全な読み込みアクセスを取得するのにも使うことができます。
|
システムグループ
以下のグループはシステムのために使われるものです。基本的にはユーザーが属する必要はありません:
グループ | 影響があるファイル | 目的 |
---|---|---|
dbus | dbus によって内部的に使用されます。 | |
kmem | /dev/port , /dev/mem , /dev/kmem |
|
locate | /usr/bin/locate , /var/lib/locate , /var/lib/mlocate , /var/lib/slocate |
ファイルシステム検索#locate を見てください。 |
lp | /dev/lp[0-9]* , /dev/parport[0-9]* , /etc/cups , /var/log/cups , /var/cache/cups , /var/spool/cups |
パラレルポートデバイス (プリンタなど) や CUPS ファイルへの読み取りアクセス。プリンター以外のパラレルポートデバイスを使っている場合、FS#50009 を見てください。 |
/usr/bin/mail |
||
nobody | 非特権グループ。 | |
proc | /proc/pid/ |
proc ファイルシステム の hidepid= マウントオプションによって制限されているプロセス情報にアクセスできる特権グループ。gid= マウントオプションによってグループを設定する必要があります。
|
root | /* |
完全なシステム管理とコントロール (root, admin)。 |
smmsp | Sendmail グループ。 | |
tty | /dev/tty , /dev/vcc , /dev/vc , /dev/ptmx |
|
utmp | /run/utmp , /var/log/btmp , /var/log/wtmp |
systemd 以前のグループ
以下のグループは arch が systemd に移行したことで必要なくなったグループです。現在は udev によってデバイスに uaccess
タグ が設定され、logind によって ACL を使って動的にユーザーに権限が与えられます。この仕組みを機能させるにはセッションが破壊されないようにする必要があります (一般的なトラブルシューティング#セッションのパーミッションを参照)。
グループによってはユーザーを追加しなくてはいけない例外も存在します: 例えば、ログインしていない状態でユーザーからデバイスにアクセスしたい場合など。ただし、グループにユーザーを追加すると機能が破壊されることもあるので注意してください (例えばaudio
グループを使用するとユーザーの高速切り替えが無効化されソフトウェアミキシングができなくなります)。
グループ | 影響のあるファイル | 目的 |
---|---|---|
audio | /dev/audio , /dev/snd/* , /dev/rtc0 |
全てのセッションでのサウンドハードウェアへの直接アクセス。リモートセッションで ALSA と OSS を動作させるにはいまだに必要になります。ALSA#ユーザー権限を見てください。ユーザーにリアルタイムプロセスの権限を与えるために JACK でも使われています。 |
disk | /dev/sd[a-z][1-9] |
optical , floppy , storage など他のグループによる影響を受けないブロックデバイスへのアクセス。
|
floppy | /dev/fd[0-9] |
フロッピーディスクへのアクセス。 |
input | /dev/input/event[0-9]* , /dev/input/mouse[0-9]* |
入力デバイスへのアクセス。systemd 215 で導入されました [2]。 |
kvm | /dev/kvm |
KVM を使用する仮想マシンへのアクセス。 |
optical | /dev/sr[0-9] , /dev/sg[0-9] |
CD や DVD ドライブなど光学ディスクドライブへのアクセス。 |
power | Pm-utils (サスペンド, ハイバネート...) などの電源管理コントロールを使う権限。 | |
scanner | /var/lock/sane |
スキャナーハードウェアへのアクセス。 |
storage | USB ハードドライブ、フラッシュ・ジャンプドライブ、MP3 プレイヤーなどリムーバブルドライブへのアクセス。ユーザーによるストレージデバイスのマウントを有効にします。 | |
sys | CUPS でプリンターを管理する権限。 | |
video | /dev/fb/0 , /dev/misc/agpgart |
ビデオキャプチャデバイスや、2D/3D ハードウェアアクセラレーション、フレームバッファへのアクセス (このグループに属さなくても X は使えます)。 |
使われなくなったグループ
以下のグループは現在利用されていません:
グループ | 影響のあるファイル | 目的 |
---|---|---|
bin | none | 歴史的に存在していたグループ。 |
daemon | ||
lock | ||
mem | ||
network | デフォルトで使用されません。NetworkManager を使用する権限を与える場合などに使えます (NetworkManager#PolicyKit パーミッションの設定を参照)。 | |
power | ||
uuidd |
これらのデータベースに関連した他のツール
getent(1) を使用することで特定のレコードを読み出すことができます。
% getent group tty
#ユーザーデータベースで警告されているように、このようなデータベースを変更する際には、passwd
や chfn
といった特定のユーティリティを使うほうが良いです。それでもやはり、直接編集するほうが良い場合もあります。そのような場合のために vipw
や vigr
が提供されています。これらのツールはデータベースをロックして同時に編集されるのを防ぐので、一般的なテキストエディタよりもこれらの専用のエディターを使うことが強く推奨されます。また、これらのツールは無効なエントリや構文エラーを防止します。Arch Linux ではシャドウデータベースの変更するために util-linux の vipw -s
や vigr -s
よりも特定のツール (chage など) の使用を推奨していることに注意してください。FS#31414 も参照してください。