ユーザーとグループ

提供: ArchWiki
2021年6月18日 (金) 13:35時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎Change a user's login name or home directory: 一部翻訳)
ナビゲーションに移動 検索に移動

関連記事

GNU/Linux ではユーザーやグループはアクセス制御のために使われています — つまり、システムのファイル、ディレクトリ、周辺機器へのアクセスのコントロールに使われます。Linux は比較的シンプルかつ粗っぽいアクセス制御メカニズムをデフォルトで提供します。高度な制御については、ACLPAM#設定方法を見て下さい。

概要

ユーザーとはコンピュータを使う全ての人のことです。ここで、名前がユーザーを表すことを説明しましょう。名前は Mary や Bill という風につけられ、実名のかわりに Dragonlady や Pirate といった名前を使うことができます。重要なのはコンピュータはそれぞれのアカウントに名前をつけていて、人々がコンピュータを使うためのアクセスを得るために名前を使うということです。システムサービスによっては制限・特権ユーザーアカウントを使って動作させることもあります。

特定の方法でアクセスを制限することでセキュリティのためにユーザーの管理が行われます。スーパーユーザー (root) はオペレーティングシステムと設定全てにアクセスすることができます。そのため管理用途だけに使われることが想定されています。特権がないユーザーは susudo などのプログラムを使うことで特権を一時的に昇格することが可能です。

作成するアカウントにそれぞれ異なる名前を使えば、人々は複数のアカウントを持つことが可能です。さらに、"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--- はファイルの所有者と所有グループに属すユーザーが読み込み・書き込み・実行の全てができ (rwxrwx)、他のユーザーはアクセスを拒否される (---) ことを示しています。一番最初の文字はファイルのタイプです。

あるユーザーやグループによって所有されているファイルを一覧するには 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) ではユーザー名と同じ名前でグループを作成し、GIDUID と同じになります。
  • -G はユーザーがメンバーになる追加グループ(のリスト)を指定します; グループはそれぞれカンマで区切り、スペースを入れてはいけません; デフォルトはイニシャルグループにだけユーザーを属させます。
  • -s ではユーザーのデフォルトログインシェルのパスとファイル名を定義します; ブートプロセスが完了した後、ここに指定したシェルがデフォルトのログインシェルになります; Bash 以外のシェルを使うのなら、その選んだシェルのパッケージをインストールしておいてください。
警告: ログインシェルは /etc/shells に記載されている必要があります。PAM を使うプログラムでは、pam_shell モジュールによってチェックされます。
ノート: 新しく作成したユーザーにはパスワードを設定する必要があります。で説明されているように passwd を使います。
ヒント: 特定のサービス用にユーザーを作成する必要がある場合、シェルには /usr/bin/nologin を使って下さい。詳しくは nologin(8) を参照。

ユーザーを追加する例

典型的なデスクトップシステムでは、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.

ヒント: You can create a link from the user's former home directory to the new one. Doing this will allow programs to find files that have hardcoded paths.
# ln -s /my/new/home/ /my/old/home

Make sure there is no trailing / on /my/old/home.

To change a user's login name:

# usermod -l newname oldname
警告: ユーザー名を変更するときは、変更対象のユーザーでログインしていないことを確認してください。新しい tty を開いて (Ctrl+Alt+F1)、root または他のユーザーでログインするか su で root になってください。usermod を使うことで間違えてユーザー名を変更することを防ぐことができます。

ユーザー名の変更は 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 オプションを付けると自動的に新しいディレクトリが作成され中身が移動します。

ヒント: 古いホームディレクトリから新しいホームディレクトリにリンクを貼ることもできます。次のコマンドを実行することでパスがハードコードされている場合でもプログラムからファイルを認識できるようになります (/my/old/home の末尾に / を付けないように注意してください): # ln -s /my/new/home/ /my/old/home

ユーザーを他のグループに追加するには:

# usermod -aG [additional_groups] [username]
警告: 上の usermod コマンドで -a オプションを外した場合、ユーザーは [additional_groups] 以外の全てのグループから削除されます (言い換えるとユーザーは [additional_groups] のグループのメンバーだけになるということです)。

また、gpasswd を使うことも可能です。ただし一度に追加(もしくは削除)できるグループは一つだけになります。

# gpasswd --add [username] [group]

GECOS (例: フルネーム) のユーザー情報を入力するには:

# chfn [username]

(インタラクティブモードで chfn が起動します)。

ユーザーのパスワードを設定するには:

# passwd [username]

ユーザーのパスワードを期限切れにして、次にログインした時に新しいパスワードを作るよう求めたいときは、次を実行してください:

# chage -d 0 [username]

ユーザーアカウントは userdel コマンドで削除できます。

# userdel -r [username]

-r オプションはユーザーのホームディレクトリとメールスプールも削除します。

ヒント: AUR のパッケージ adduserAUR には useradd, chfn, passwd を対話式に行うことができる adduser スクリプトが入っています。FS#32893 を参照。

ユーザーデータベース

ローカルユーザー情報は /etc/passwd ファイルに保存されます。システム内の全てのユーザーアカウントを一覧するには:

$ cat /etc/passwd

一行毎にアカウントが表示され、そのフォーマットは:

account:password:UID:GID:GECOS:directory:shell

それぞれの意味:

  • account はユーザーの名前
  • password はユーザーのパスワード
  • UID は数字のユーザー ID
  • GID はユーザーの数字のプライマリーグループ ID
  • GECOS は任意のフィールドでユーザーの情報を格納します; 通常ユーザーのフルネームを含めます
  • directory はユーザーの $HOME ディレクトリ
  • shell はユーザーのコマンドインタプリタ (デフォルトは /bin/sh)
ノート: Arch Linux は暗号化したパスワードを使っています。passwd ファイルは誰からも読めるようになっており、(ハッシュ化されているかどうかにかかわらず)パスワードをこのファイルに保存するのは安全ではありません。代わりに、password にはハッシュ化されたパスワードがアクセスが制限されたファイル /etc/shadow に保存されていることを示すプレースホルダ文字 (x) が入ります。

pwck コマンドを使うことでユーザーデータベースの整合性を確認できます。GID でユーザーリストをソートすることができるため、比較する際にも有用です:

# pwck -s

Arch Linux はデフォルトで filesystem パッケージが新しくリリースされると .pacnew ファイルを作成します。pacman が何か行動するようにメッセージを出力しないかぎり .pacnew ファイルは無視・削除できます。必要なデフォルトユーザー・グループはパッケージのインストールスクリプトによって自動的に追加されます。

グループ管理

/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]
ノート: 上記のコマンドでグループ名は変更されますが、グループの GID は変更されません。

グループを削除するには:

# groupdel [group]

グループからユーザーを外すには:

# gpasswd -d [user] [group]

グループに追加・削除したいユーザーがログイン中の場合、一度ログアウトしないと変更が適用されません。

grpck コマンドを使うことでシステムのグループファイルの整合性を確認できます。

filesystem パッケージにアップデートがあると .pacnew ファイルが作られます。ユーザーデータベース.pacnew ファイルと同じように、必要なグループはインストールスクリプトによって追加されるため、無視・削除してかまいません。

グループ一覧

このセクションでは core/filesystem パッケージに含まれている主要なグループの用途を説明します。他にもグループは存在し、パッケージがインストールされたときに適当な GID を使って作成されます。詳しくはグループに関連するソフトウェアのページを見てください。

ノート: パッケージを削除しても、自動的に作成されたユーザーやグループ (UID/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 ログへの読み取りアクセスを与えるために admwheel の代わりとして使われます [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 管理作業用グループ、通常 sudosu コマンドに権限をわたすのに使われます (デフォルトではどちらも 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 を見てください。
mail /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 全てのセッションでのサウンドハードウェアへの直接アクセス。リモートセッションで ALSAOSS を動作させるにはいまだに必要になります。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