第13章 ユーザと基本的なアカウントの管理

13.1. この章では

FreeBSD は、複数のユーザが同時にコンピュータを使えるようにします。 スクリーンとキーボードの前に一度に座れるのはその中の一人だけですが ユーザは何人でもネットワークを通してログインできます。 システムを使うためには、 どのユーザもアカウントがなければなりません。

この章では、以下のことを説明します。

  • FreeBSD システムにおけるさまざまな種類のユーザアカウントについて

  • ユーザアカウントを追加、削除および変更する方法

  • ユーザやグループが利用できるリソースの上限を制御する方法

  • グループの作成、 およびグループにユーザをメンバとして追加する方法

13.2. アカウントの種類

FreeBSD システムへアクセスするには、 かならずアカウントが使われ、 また、プロセスもすべてユーザによって実行されるので、 ユーザとアカウントの管理は、重要なものです。

アカウントには大きく分けて三種類あります。 システムアカウント (system accounts)、ユーザアカウント (user accounts)、 そしてスーパーユーザ (superuser) です。

13.2.1. システムアカウント

システムアカウントは、DNS、メール、 ウェブサーバといった各種サービスを運用するために使われます。 この目的は、セキュリティを確保するためです。 もしすべてのサービスがスーパーユーザで実行されていると、 それらのサービスはどんな動作でも可能となり、 適切な制限を適用することができません。

システムアカウントの具体例は、 daemon, operator, bind, news および www といったものです。

nobody は通常の特権を持たないシステムアカウントです。 しかし、nobody を利用するサービスが増えれば増えるほど、 それに所属するファイルやプロセスも増え、 その特権も大きくなるということを忘れないようにしてください。

13.2.2. ユーザアカウント

ユーザアカウントは、 主に現実のユーザがシステムにアクセスする手段として用いられるものです。 システムにアクセスするすべてのユーザは、 それぞれ唯一のユーザアカウントを持つべきです。 こうすることで管理者は誰が何を行なっているかがわかりますし、 他の人の設定を壊してしまうようなことを避けることができます。

それぞれのユーザは快適にシステムを利用するため、 シェル、エディタ、キー設定、言語など、 各自の環境をセットアップすることができます。

FreeBSD システム上のどのアカウントにも、 以下のような情報がなにかしら結び付けられています。

ユーザ名

login: プロンプトに対して入力するユーザの名前です。 ユーザ名はそのシステムで一意でなければならず、 2 名のユーザに同じユーザ名をつけることはできません。 有効なユーザ名を作成するには passwd(5) に記載されているいくつもの規則があります。 アプリケーションの上位互換性を保つために、 8 文字以下の小文字からなるユーザ名を使うことが推奨されています。

パスワード

それぞれのユーザアカウントにはパスワードがあります。 パスワードは空白にもできますが、 行うべきではありません。

ユーザ ID (UID)

ユーザ ID (UID) は、 FreeBSD システムがユーザを一意に識別するための数値です。 ユーザ名を指定できるコマンドは、 ユーザ名を UID に変換してから扱っています。 65535 より大きな UID は、32 ビット以上の整数に対応していないソフトウェアにおいて互換性の問題を引き起こす可能性があるので、 65535 以下の UID を使用することが推奨されています。

グループ ID (GID)

グループ ID (GID) は、 ユーザが属する第一グループを一意に識別するための数値です。 グループは、UID ではなく、 ユーザの GID に基づいて資源へのアクセスを制御する仕組みです。 これは、ある種の設定ファイルのサイズを大幅に小さくします。 ユーザは、複数のグループに所属できます。 65535 より大きな GID は、ソフトウェアに問題を引き起こす可能性があるので、 65535 以下の GID を使うことを推奨します。

ログインクラス

ログインクラスはグループの仕組みを拡張したもので、 別々のユーザに対してシステムを調整する時に、 さらなる柔軟性を提供します。ログインクラスの詳細については、 ユーザへの制限 で説明します。

パスワード変更時間

デフォルトでは、FreeBSD は定期的にパスワードを変更することをユーザに強制しません。 これを pw(8) を使用してユーザごとに設定し、 一部またはすべてのユーザに、 一定の時間がたったらパスワードを強制的に変更させることができます。

アカウント失効時間

デフォルトでは、FreeBSD はアカウントを失効させません。 たとえば学校で生徒のアカウントがある場合など、 限られた期間だけのアカウントを作成するなら、 そのアカウントがいつ失効するか pw(8) を使って指定できます。 有効期間が経過したら、 そのアカウントのディレクトリやファイルは残っていますが、 システムへのログインはできなくなります。

ユーザの氏名

FreeBSD ではユーザ名でアカウントを一意に識別しますが、 必ずしもユーザの本名を反映したものではありません。 この情報をアカウントに関連付けることもできます。 この情報は、コメントのように、空白、大文字、および 8 字以上で記載できます。

ホームディレクトリ

ホームディレクトリは、システム中のディレクトリへのフルパスです。 これはユーザがログインした時に作業を開始するディレクトリです。 一般的な慣習は、すべてのユーザのホームディレクトリを /home/username/usr/home/username の下に置くことです。 各ユーザは、個人のファイルやサブディレクトリを、 ユーザのホームディレクトリに保存します。

ユーザシェル

シェルは、 ユーザがシステムと対話するデフォルトの環境を提供します。 いろいろな種類のシェルがあり、 経験を積んだユーザはそれぞれ好みがあり、 それをアカウントの設定に反映できます。

13.2.3. スーパーユーザアカウント

スーパーユーザアカウントは通常 root と呼ばれ、 システム管理を行なうために使われ、権限に制限がありません。 そのため、このアカウントはメールのやりとり、システムの調査、 プログラミングといった日常的な作業を行なうために使われるべきものではありません。

その理由は、スーパーユーザが通常のユーザアカウントと異なり、 操作にまったく制限を受けないことによります。 そのためスーパーユーザアカウントで操作を間違えると、 システムに重大な影響を与えてしまう恐れがあるのです。 ユーザアカウントでは、 仮に操作を間違えてもシステムを壊してしまうようなことはできないようになっています。 そのため、ユーザアカウントでログインし、 高い権限が必要なコマンドを実行するときだけスーパーユーザになることが推奨されています。

スーパーユーザで実行するコマンドはいつでも、 二回、三回と確認してください。 なぜならスペースが多かったり、文字が欠けていたりするだけで、 取り返しのつかないデータの破壊につながる可能性があるからです。

スーパーユーザの権限を得るには、さまざまな方法があります。 root ユーザとしてログインする方法もありますが、 これはまったくお勧めできません。

スーパーユーザの権限を手に入れるには、かわりに su(1) を使って下さい。 - オプションをつけて実行すると、 実行したユーザに root ユーザの環境が設定されます。 このコマンドは wheel グループに入ってるユーザのみが実行でき、他のユーザは実行出来ません。 また、実行時には root ユーザのパスワードを必要とします。

以下の例では、make install を行うときにスーパーユーザの権限が必要なので、 このコマンドを実行する時だけユーザはスーパーユーザになります。 コマンドを実行したら、ユーザは exit を実行してスーパーユーザからログアウトし、 通常のユーザアカウントの権限に戻ります。

例 1. スーパーユーザ権限でプログラムをインストールする
% configure
% make
% su -
Password:
# make install
# exit
%

1 人の管理者が一台のマシン、 もしくは小規模なネットワークを管理する場合には、 su(1) のフレームワークはうまく機能するでしょう。 この代わりとなるのは、 security/sudo package または port です。これはログ機能や、 スーパーユーザの権限で実行できるユーザやコマンドを設定できます。

13.3. アカウント情報の管理

FreeBSD には、 ユーザアカウントを操作するのにさまざまなコマンドが用意されています。 もっとも一般的なコマンドを以下に示し、 それに続いて詳しい使用例を示します。

コマンド要約

adduser(8)

コマンドラインからユーザを追加するための推奨アプリケーション

rmuser(8)

コマンドラインからユーザを削除するための推奨アプリケーション

chpass(1)

ユーザデータベースの情報を変更するための柔軟なツール

passwd(1)

ユーザのパスワードを変更する簡単なコマンドラインツール

pw(8)

ユーザアカウントのあらゆる箇所を変更する強力で柔軟なツール

13.3.1. adduser

adduser(8) は、 新しいユーザを登録するためのシンプルなプログラムです。 ユーザを追加すると、 このプログラムは、/etc/passwd/etc/group を自動的に更新します。 また、新規ユーザのホームディレクトリを作成し、 /usr/shared/skel から、デフォルトで使用される設定ファイルをコピーします。 また、新しく作成されたユーザに対して、 ウェルカムメッセージをメールで送信することも可能です。

例 2. FreeBSD におけるユーザの追加
# adduser
Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!
#

入力したパスワードは画面に表示されませんので、 ユーザアカウントを作成する際には、 パスワードを間違えて入力してしまわないように注意してください。

13.3.2. rmuser

システムから完全にユーザを削除するには、 rmuser(8) を使います。 このコマンドは、次の手順を実行します。

  1. 指定されたユーザの crontab(1) エントリが存在する場合には削除。

  2. 指定されたユーザの at(1) ジョブをすべて削除。

  3. 指定されたユーザが所有するすべてのプロセスを強制終了。

  4. ローカルパスワードファイルから、 指定されたユーザのエントリを削除。

  5. 指定されたユーザのホームディレクトリを削除 (ディレクトリの所有者が指定されたユーザのものだった場合)。

  6. /var/mail から、指定されたユーザの到着メールファイルを削除。

  7. /tmp のような一時ファイル保存領域から、 指定されたユーザの所有するファイルを削除。

  8. そして最後に、 /etc/group にある すべてのグループから、指定されたユーザを削除します。

    指定されたユーザと同じ名前のグループで、 そのユーザが削除されると空のグループとなる場合は、 そのグループ自体が削除されます。 これは adduser(8) によってユーザごとに作成される、 ユニークなグループに対応するものです。

スーパユーザアカウントの削除に rmuser(8) を利用することはできません。 スーパユーザアカウントの削除はほとんどすべての場合、 大規模なシステムの破壊を意味するからです。

デフォルトでは、以下の例のような対話モードが使われます。

例 3. rmuser による対話的なアカウントの削除
# rmuser jru
Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/jru)? y
Updating password file, updating databases, done.
Updating group file: trusted (removing group jru -- personal group is empty) done.
Removing user's incoming mail file /var/mail/jru: done.
Removing files belonging to jru from /tmp: done.
Removing files belonging to jru from /var/tmp: done.
Removing files belonging to jru from /var/tmp/vi.recover: done.
#

13.3.3. chpass

chpass(1) を用いて、 パスワード、シェル、その他の個人情報といった、 ユーザデータベース情報を変更できます。

スーパユーザ権限に限り、 chpass(1) を用い、 他のユーザの情報やパスワードを変更できます。

ユーザ名の他にオプションを指定しないと、 chpass(1) はユーザ情報を編集するエディタを表示します。 ユーザがエディタを終了すると、 ユーザデータベースが新しい情報に更新されます。

スーパユーザでない場合は、 エディタを抜けた後にパスワードを聞かれます。

例 4. スーパユーザによる対話的な chpass
#Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

ユーザは、この情報の限られた部分のみ変更が可能です。 また、変更できるのはそのユーザ自身のアカウント情報のみです。

例 5. 通常のユーザによる対話的な chpass
#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

chfn(1) および chsh(1) はいずれも、 chpass(1) へのリンクです。 また、ypchpass(1), ypchfn(1) および ypchsh(1) も同様です。 NIS のサポートは自動的に行なわれますので、 コマンドの先頭に yp をつける必要はありません。 NIS の設定については、 で説明されています。

13.3.4. passwd

passwd(1) は、 ユーザが自分のパスワードを変更する通常の方法です。 スーパユーザ権限では、 他のユーザのパスワードを変更するのに使われます。

誤って、または不正なパスワードの変更を避けるため、 新しいパスワードを設定する前に、 もとのパスワードを入力しなければなりません。 スーパーユーザの権限でユーザのパスワードを変更する際には、 もとのパスワードを入力する必要はありません。

例 6. 自分のパスワードの変更
% passwd
Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done
例 7. スーパーユーザ権限での他のユーザのパスワード変更
# passwd jru
Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

chpass(1) 同様、yppasswd(1) は、 passwd(1) へのリンクになっていますので、 NIS はどちらのコマンドでも動作します。

13.3.5. pw

pw(8) は、ユーザやグループの作成、削除、 変更および表示を行なうコマンドラインのユーティリティです。 これは、システムユーザファイルやシステムグループファイルの フロントエンドとして働きます。pw(8) はとても強力な一連のコマンドラインオプションを有しており、 シェルスクリプトで使うのに向いていますが、新しいユーザは、 この章で紹介されている他のコマンドに比べて難しいと感じるかもしれません。

13.4. ユーザへの制限

FreeBSD は、 個々のユーザが利用できるシステム資源の量を管理者が制限できる方法をいくつも用意しています。 その種の制限は、ディスククォータ (quota) とその他の資源の制限の 2 つの章で説明します。

ディスククォータは、ユーザが利用できるディスク容量を制限し、 その都度計算しなくてもディスク使用量を簡単に確認できる手段も提供しています。 クォータについては、「ファイルシステムクォータ」 で解説しています。

その他のリソースの制限とは、ユーザが消費できる CPU、メモリなどのリソースを制限する手段のことです。 これはログインクラスを用いて定義されているもので、 この後で解説しています。

ログインクラスは /etc/login.conf で定義します。詳細な説明は login.conf(5) に詳しく記載されています。 各ユーザアカウントにはログインクラスが割り当てられていて (デフォルトでは default です)、 それぞれのログインクラスにはログインケーパビリティの集合が割り当てられています。 ログインケーパビリティとは、 名称=値 の組のことで、名称 は周知の識別子、 は、名称 に応じて処理される任意の文字列です。 ログインクラスとケーパビリティを設定するのはどちらかといえば簡単なことで、 login.conf(5) でも説明されています。

FreeBSD は通常、直接 /etc/login.conf から設定を読み込まず、 より速く検索できる /etc/login.conf.db データベースから読み込みます。/etc/login.conf を編集する時には /etc/login.conf.db を次のコマンドを実行してアップデートする必要があります。

# cap_mkdb /etc/login.conf

リソースの制限は、 2 つの点で標準的なログインケーパビリティと異なっています。 第一に、どの制限についても、ソフト (現在の) リミットとハードリミットがあります。 ソフトリミットは、ユーザやアプリケーションが調整できますが、 ハードリミットを超えることはできません。 ユーザはハードリミットを下げることはできますが、 上げることはスーパユーザのみができます。 第二に、ほとんどのリソースの制限は特定のユーザに対してプロセス毎に適用されるもので、 そのユーザが利用するリソースの総量を制限するものではありません。 ただし、この違いは制限を特別扱いすることで実現されるものであり、 ログインケーパビリティフレームワークの実装によるものではありません。

以下が最もよく使われるリソースの制限になります。 残りは、他のすべてのログインケーパビリティと並んで login.conf(5) に書かれています。

coredumpsize

プログラムが生成する core ファイルのサイズにかかる制限は、 filesize やディスククォータなどの、 ほかのディスク使用に関する制限に従属します。 この制限は、ディスク領域の消費を制御するあまり厳しくない手段としてよく使われています。 ユーザは core ファイルを自分で生成するわけではなく、 削除しないことも多いので、 これを設定すれば大きなプログラムが異常終了してもディスクの空きがなくならずに済みます。

cputime

そのユーザのプロセスが消費できる CPU 時間 の上限です。 これを超えたプロセスは、カーネルにより終了されます。

これは、消費される CPU 時間 についての制限であって、top(1)ps(1) のフィールドで表示される CPU の割合に関するものではありません。

filesize

ユーザが所有できるファイルの大きさの上限です。ディスククォータ と違い、 この制限はユーザのファイルをすべてまとめた集合にではなく、 個々のファイルにかかります。

maxproc

ユーザが実行できるプロセス数の上限です。 フォアグラウンドプロセスとバックグラウンドプロセスの両方を扱います。 この上限は、sysctl(8) 変数 kern.maxproc で指定されたシステムの制限を超えることはできません。 同時に複数ログインすることや、 パイプライン実行することは便利なことが多いので、 この値をあまり小さな値に設定すると、 そのユーザの生産性が悪化する可能性があります。 大きなプログラムをコンパイルする場合のように、 タスクによっては複数のプロセスやプリプロセッサが実行されます。

memorylocked

これは、1 つのプロセスが mlock(2) によりメインメモリにロックされることを要求できるメモリの最大容量です。 amd(8) のようなシステムで重要なプログラムは、 メインメモリへロックして、システムがスワップする際に、 ディスクのスラッシングを引き起こさないようにします。

memoryuse

これは、どの時点かを問わず、 あるプロセスが消費できる最大のメモリ容量です。 これは、メインメモリとスワップの使用量を合わせたものです。 メモリ消費を抑えるための包括的な制限ではありませんが、 手始めにはよいでしょう。

openfiles

これは、あるプロセスが開いておける最大のファイル数です。 FreeBSD では、ファイルはまた、ソケットや IPC チャンネルを表わすのにも使われています。 ですから、あまり低い値に設定しないよう注意してください。 これに対応するシステム全体の制限は sysctl(8) kern.maxfiles で定義されています。

sbsize

これは、あるユーザが消費できるネットワークメモリ (つまり mbuf) の上限の量です。ユーザは、 ネットワーク通信を制限するのに使えます。

stacksize

これは、プロセスのスタックサイズの上限です。 あるプログラムが使用しうるメモリの量を制限するには、 これだけでは十分ではありません。 したがって、他の制限と組み合わせて使わなければなりません。

リソースの制限を設定するにあたり、 ほかにもいくつか覚えておかなければならないことがあります。 以下は、一般的なこつやお勧め、さまざまなコメントになります。

  • システム起動時に /etc/rc から起動されたプロセスは、daemon ログインクラスに割り当てられます。

  • システムに付属していた /etc/login.conf はほとんどの制限について妥当な値になっていますが、 すべてのシステムにおいてふさわしいというわけではありません。 制限をあまり緩くするとシステムを悪用しやすくしてしまいますし、 厳しくしすぎると生産性を悪化させてしまいます。

  • Xorg のユーザには、 他のユーザより多くのリソースを与えるべきかもしれません。 Xorg そのものが多くのリソースを使うだけでなく、 より多くのプログラムを並行して使うことをユーザに促します。

  • 多くの制限は個々のプロセスにかかるもので、 一人のユーザにまとめてかかるものではありません。 例えば、openfiles を 50 に設定することは、 ユーザが動かすそれぞれのプロセスが最大 50 個のファイルを開けるということです。 あるユーザが開けるファイルの総数は、 openfiles の値に maxproc をかけたものになります。 同じことがメモリ消費量にもあてはまります。

リソースの制限と、ログインクラス、 ログインケーパビリティ一般についての詳しい情報は、 cap.mkdb(1), getrlimit(2) および login.conf(5) をご覧ください。

13.5. グループの管理

グループとは、ユーザを羅列したものです。 グループは、グループ名と GID で識別されます。 FreeBSD では、 あるプロセスが何かするのを許可するかどうかをカーネルが判断する際に、 プロセスの UID とそのユーザが所属するグループの一覧を利用します。 ほとんどの場合、ユーザもしくはプロセスの GID は一覧の最初のグループを指しています。

グループ名から GID への写像は /etc/group にあります。 これは、コロンで区切られた 4 項目からなるテキストファイルです。 1 番目の項目はグループ名、 2 番目は暗号化されたパスワード、 3 番目が GID、 4 番目がカンマで区切られたメンバの一覧です。 文法についての完全な説明は、group(5) をご覧ください。

スーパーユーザは、/etc/group をテキストエディタで編集できます。 もしくは、pw(8) を使ってグループの追加や編集をできます。 たとえば、teamtwo というグループを追加して、その存在を確認するには、 次のように使います。

例 8. pw(8) によるグループの追加
# pw groupadd teamtwo
# pw groupshow teamtwo
teamtwo:*:1100:

この例では、1100 という番号は、 teamtwo の GID です。 この時点では、teamtwo にメンバはいません。 以下のコマンドは、 jruteamtwo のメンバに追加します。

例 9. pw(8) により新しいグループにメンバを追加する
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
teamtwo:*:1100:jru

-M の引数は、 カンマで区切られた新しい (空の) グループに追加するもしくは存在するグループのメンバを置き換えるユーザの一覧です。 ユーザにとっては、このグループのメンバーシップはパスワードファイルに記載されているプライマリのグループとは異なります。 pw(8)groupshow コマンドを使った時は、 そのユーザはグループの一員として表示されませんが、id(1) などのツールを使って情報を問い合わせれば、 その情報を引き出せます。ユーザをグループに追加をする際に、pw(8)/etc/group しか扱わず、 /etc/passwd から追加のデータを読んだりはしません。

例 10. pw(8) によるグループへのユーザ追加
# pw groupmod teamtwo -m db
# pw groupshow teamtwo
teamtwo:*:1100:jru,db

この例では、-m の引数は、 カンマで区切られたグループに追加するユーザの一覧です。 前の例と異なり、これらのユーザはグループ一覧に追加され、 グループのユーザ一覧を置き換えることはありません。

例 11. グループに所属しているユーザを調べるための id(1) の使い方
% id jru
uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

この例では、jrujru グループと teamtwo グループのメンバです。

このコマンドや /etc/group のフォーマットの詳細については、 pw(8) および group(5) をご覧ください。


All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.