ユーザーとグループ
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 において全てのファイルはユーザーとグループによって所有されます。加えて、アクセス許可の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 [group]
# find / -user [user]
ファイルの所有ユーザーやグループは chown
(change owner) コマンドで変更できます。ファイルのアクセス許可を変更するコマンドは chmod
(change mode) です。
詳しくは man chown, man chmod, や Linux file permissions を見て下さい。
Shadow
Arch Linux のユーザー、グループおよびパスワード管理ツールは、base メタパッケージ の依存関係である shadow パッケージから取得されます。
ファイル一覧
ファイル | 目的 |
---|---|
/etc/shadow |
セキュアなユーザーアカウント情報 |
/etc/passwd |
ユーザーアカウント情報 |
/etc/gshadow |
グループアカウントの暗号化された情報 |
/etc/group |
ユーザーが属するグループの定義 |
/etc/sudoers |
sudo を実行できるユーザーのリスト |
/home/* |
ホームディレクトリ |
ユーザー管理
現在システムにログインしているユーザーを一覧するには 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 を実行してください。
Example adding a system user
System users can be used to run processes/daemons under a different user, protecting (e.g. with chown) files and/or directories and more examples of computer hardening.
With the following command a system user without shell access and without a home
directory is created (optionally append the -U
parameter to create a group with the same name as the user, and add the user to this group):
# useradd -r -s /usr/bin/nologin username
If the system user requires a specific user and group ID, specify them with the -u
/--uid
and -g
/--gid
options when creating the user:
# 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
ファイルに保存されます。システム内の全てのユーザーアカウントを一覧するには:
$ cat /etc/passwd
一行毎にアカウントが表示され、そのフォーマットは:
account:password:UID:GID:GECOS:directory:shell
それぞれの意味:
account
はユーザーの名前password
はユーザーのパスワードUID
は数字のユーザー IDGID
はユーザーの数字のプライマリーグループ IDGECOS
は任意のフィールドでユーザーの情報を格納します; 通常ユーザーのフルネームを含めますdirectory
はユーザーの$HOME
ディレクトリshell
はユーザーのコマンドインタプリタ (デフォルトは/bin/sh
)
pwck コマンドを使うことでユーザーデータベースの整合性を確認できます。GID でユーザーリストをソートすることができるため、比較する際にも有用です:
# pwck -s
Arch Linux はデフォルトで filesystem パッケージが新しくリリースされると .pacnew ファイルを作成します。pacman が何か行動するようにメッセージを出力しないかぎり .pacnew ファイルは無視・削除できます。必要なデフォルトユーザー・グループはパッケージのインストールスクリプトによって自動的に追加されます。
自動整合性チェック
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
がシステム上のグループを定義するファイルです (詳しくは man group
)。
groups
コマンドでグループのメンバーを表示できます:
$ groups [user]
user
を省略すると、現在使っているユーザーのグループ名が表示されます。
id
コマンドはユーザーの UID や関連付けられた GID などの詳細情報を表示します:
$ id [user]
システム上の全てのグループを一覧するには:
$ cat /etc/group
groupadd
コマンドで新しいグループを作成できます:
# groupadd [group]
そしてユーザーをグループに追加するには gpasswd
コマンドを使います:
# gpasswd -a [user] [group]
既存のグループは groupmod
で修正します。例えば gid を変更せずに old_group
グループの名前を new_group
に変更するには (old_group
によって所有されていたファイルは全て new_group
によって所有されるようになります):
# groupmod -n [new_group] [old_group]
グループを削除するには:
# groupdel [group]
グループからユーザーを外すには:
# gpasswd -d [user] [group]
グループに追加・削除したいユーザーがログイン中の場合、一度ログアウトしないと変更が適用されません。
grpck コマンドを使うことでシステムのグループファイルの整合性を確認できます。
filesystem パッケージにアップデートがあると .pacnew ファイルが作られます。ユーザーデータベースの .pacnew ファイルと同じように、必要なグループはインストールスクリプトによって追加されるため、無視・削除してかまいません。
グループ一覧
このセクションでは 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 |