ユーザ・グループ管理系のコマンド
はじめに
ユーザ
Linuxにおいてユーザとは、システムを利用する主体のことである。主体は人物だけとは限らず、ルートユーザ、システムユーザ、一般ユーザに大別される。
種類 | 意味 | ユーザID |
---|---|---|
ルートユーザ | システム全体を管理する権限を持つユーザ。 全ての権限を持つ。 | 0 |
システムユーザ | サービスやデーモンを動作させるためのユーザ。 通常、ログインすることはできず、動作に必要な権限だけを持つ。 | 1~999 |
一般ユーザ | 人がシステムを利用するためのユーザ。 | 1000~(ただしnobodyにアサインされているものは除く) |
nobody user
nobodyは一般ユーザよりも低い権限しか持たないユーザである。特権が必要ない利用方法において、万一攻撃されても影響を最低限に抑える目的などで利用される。ユーザIDとして65534などの最大値付近の値がアサインされているケースが多い。
グループ
Linuxにおいてグループとは、複数のユーザをまとめて、アクセス権限を効率的に管理するためのものである。システムグループと一般グループに大別される。
種類 | 意味 | グループID |
---|---|---|
システムグループ | ルートユーザやシステムユーザに対応するグループ および システム利用の用途別に定義されたグループ | 0~999 |
一般グループ | 一般ユーザに対応するグループ および 人の役割などに応じて定義されたグループ | 1000~ |
ユーザは最低でも1つのグループに所属する。その中の1つがプライマリグループ(またはメイングループ)となり、ユーザがファイルやフォルダを作成したときのデフォルトの所有グループとなる。プライマリグループではない所属グループのことをセカンダリグループ(またはサブグループ、サプリメンタルグループ、補助グループなど)と呼ぶ。
通常、ユーザはユーザ名と同じ名前のグループがプライマリグループとなる。この同名のグループをユーザグループ(またはユーザプライベートグループ)と呼ぶ。一般に、ユーザグループにはそのユーザだけが所属する。これにより、ユーザが作成したファイルを編集できるのはデフォルトでは(管理者を除けば)そのユーザのみとなる。
シャドウパスワード
初期のUNIXでは誰でも見られるファイルにパスワードが保管されていたが、現在はrootだけが読み取り可能なファイルにパスワードが保管されるのが一般的である。これをシャドウパスワードとよぶ。Linuxではパスワードポリシーやエージングなどパスワード全般の管理を行うshadow-utilsパッケージによりシャドウパスワードが提供されている。
パスワードのエージング
エージングはここでは時間経過による変化することを意味しており、パスワードにおいては最大経過期間(時間経過によりパスワードが利用できなくなる日数)と、最小経過期間(パスワードを変更してから、また変更できるようになるまでの期間)の2つのことを指してエージングと呼ぶことが多い。
shadow-utilsではこれに関連して最大経過期間に達する前に警告を表示する設定、最大経過期間を超過した場合にアカウントを無効化する設定、特定の日付が到達したときにアカウントを無効化する設定にも対応している。
Name Service Switch
ユーザを管理する方法として、企業ではADなどのディレクトリサービスが利用されることが多いが、個人や小規模サービスではローカルアカウントが利用されることが多い。これらはどちらか一方を排他的に使う物ではなく、両方とも併用できるものである。そのような複数の場所に存在しうるデータを、どこを、どの順番で検索するか決定するものとしてNSSがある。
NSSとは
Name Service Switch、NSSはシステムが使用するデータベースを、カテゴリ別にどの順で検索するか決定するスキームである。以下にその設定ファイルnsswitch.confの例を示す。
この設定ではhosts(ホスト名)であればfiles(要はhostsファイル)、DNSによる名前解決の順に検索するという指定になっている。この中でユーザ、グループに関係するのがpasswd(ユーザ情報データベース)、group(グループ情報データベース)、shadow(ユーザパスワードデータベース)、gshadow(グループパスワードやグループメンバーなどのデータベース)である。
NSSの背景
過去はこれらの設定はファイルによって管理されるのが普通であったが、NISやDNSのような名前解決により行われる方法が普及するにつれて、これらを複合的に使用できる仕組みが必要となった。そのために導入されたのがName Service Switchというスキームである。
ユーザ・グループに関するデータベース
passwd
passwdはユーザアカウントを管理するデータベースである。ファイルでは/etc/passwdが該当する。
user:x:1000:1000:,,,:/home/user:/bin/bash
のように1ユーザあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。
項目 | 例の値 | 補足 |
---|---|---|
ログイン名 | user | |
オプションの暗号化されたパスワード | x | x:shadowデータベースに格納されている !で始まる:パスワードがロックされている 空欄:パスワード不要 |
ユーザID | 1000 | 数値 |
グループID | 1000 | 数値 |
ユーザ名またはコメント | ,,, | |
ユーザのホームディレクトリ | /home/user | |
オプションのコマンドインタプリタ | /bin/bash |
shadow
shadowはシャドウパスワードに関する情報を含むデータベースである。ファイルでは/etc/shadowが該当する。
user:<暗号化パスワード>:20000:7:90:14:30::
のように1ユーザあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。
項目 | 値の例 | 備考 |
---|---|---|
ユーザ名 | user | |
暗号化されたパスワード | <暗号化パスワード> | ロックされている場合は!または* |
最後にパスワードを変更した日 | 20000 | UNIXエポックからの経過日数 |
パスワードを再変更できるまでの最短日数 | 7 | |
パスワード変更が必要となるまでの日数 | 90 | 90日ごとにパスワード変更を強制する |
パスワードの有効期限が切れる前に警告を表示する日数 | 14 | |
パスワードの有効期限が切れてからアカウントが無効になるまでの日数 | 30 | |
アカウントが無効になる日 | (空欄) | UNIXエポックからの経過日数 |
予約フィールド | (空欄) |
group
groupはグループを管理するデータベースである。ファイルでは/etc/groupが該当する。
group:x:1000:user1,user2
のように1グループあたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。
項目 | 値の例 | 備考 |
---|---|---|
グループ名 | group | |
グループのパスワード | x | x:gshadowデータベースに格納されている 空欄:パスワード不要 |
グループID | 1000 | 数値 |
グループに属するユーザのリスト | user1,user2 | コンマ区切り |
gshadow
gshadowはグループのシャドウパスワードを管理するデータベースである。ファイルでは/etc/gshadowが該当する。
test:!:1001:user2,user1
のように1行あたり1行で、:区切りの書式で書かれる。項目の一覧を以下に示す。
項目 | 値の例 | 備考 |
---|---|---|
グループ名 | group | |
グループのパスワード | ! | 暗号化されたパスワード !のように暗号化されたパスワードでない場合は、パスワードが設定されていないことを意味する。 パスワードが設定されていない場合、パスワードではこのグループの権限を得られない。 パスワードが設定されていれば、パスワードによりグループの権限を得ることができる。 |
グループの管理者 | 1000 | コンマ区切りのユーザ名 管理者はグループのパスワードを変更する権限を持つ |
グループに属するユーザのリスト | user1,user2 | コンマ区切りのユーザ名 所属するユーザはパスワードを尋ねられることなくグループにアクセスできる。 |
データベースのエントリー
getent - Get Entries from NSS
getentはNSSにあるデータベースからエントリーを取得する。
passwdデータベースから、キーがrootの情報を取り出す例を示す。
キーを指定しなかった場合、全てのエントリを表示する。
shadow、gshadowのデータベースにアクセスするには管理者権限が必要である。
ユーザ、グループの作成・管理
ユーザの管理
コマンド | できること |
---|---|
useradd adduser | ユーザの作成 |
userdel deluser | ユーザの削除 |
usermod | ユーザ属性の変更 |
passwd | パスワード、パスワードのエージング設定の変更 |
useradd / adduser - Add User
ユーザを追加する。
オプションでpasswdやshadowに保存される設定の一部を指定できる。コマンドオプションで指定できない項目でデフォルトと異なる値を指定したい場合は、ユーザ作成後にpasswdコマンドで設定する。各コマンドで、項目を設定するオプションを示す。
データベース | 項目 | adduser | useradd / usermod |
---|---|---|---|
passwd | ログイン名 | 引数で指定 | 引数で指定 |
パスワード | 対話で指定 | -p PASSWORD --password PASSWORD ※コマンドラインではプロセス名に パスワードが表示されるため非推奨 | |
ユーザID | --uid UID | -u UID --uid UID | |
プライマリグループID | --gid GID --ingroup GROUP | -g GID --gid GID | |
ユーザ名またはコメント | --comment COMMENT | -c COMMENT --comment COMMENT | |
ホームディレクトリ | --home HOME_DIR | -d HOME_DIR --home HOME_DIR | |
コマンドインタプリタ | --shell | -s --shell | |
shadow | ユーザ名 | passwdデータベースと同じ | passwdデータベースと同じ |
パスワード | passwdデータベースと同じ | passwdデータベースと同じ | |
最後にパスワードを変更した日 | - | - | |
パスワードを再変更できるまでの日数 | × | × | |
パスワード変更が必要となるまでの日数 | × | × | |
パスワード再変更の事前警告日数 | × | × | |
アカウントが無効になるまでの日数 | × | -f DAYS --inactive DAYS | |
アカウントが無効になる日 | × | -e EXPIREDATE --expiredate DATE | |
予約フィールド | - | - | |
その他 | セカンダリグループ | × | -G GROUPLIST --groups GROUPLIST |
それ以外の動作に関するオプションを示す。
設定 | adduser | useradd |
---|---|---|
ホームディレクトリを作成する / しない | する:デフォルト しない: --no-create-home | する:-m 、--create-home しない: -M 、--no-create-home デフォルト動作はCREATE_HOME |
ユーザグループを作成する / しない | する:デフォルト しない:× | する:-U 、--user-group しない: -N 、--no-user-group フォルト動作はUSERGROUPS_ENAB |
パスワードを設定しない | --disabled-password | デフォルト |
ログインしないユーザを作成する (パスワードを指定しない+nologinにユーザを追加) | --disabled-login | × |
スケルトンディレクトリ | confファイルで指定 | -k SKEL_DIR --skel SKEL_DIR |
スケルトンディレクトリ
スケルトンディレクトリとはホームディレクトリにデフォルトで配置するコンテンツが置かれているディレクトリのことである。スケルトンディレクトリの内容が作成されたホームディレクトリにコピーされる。
adduser
adduserは以下の特徴を持つユーザ追加スクリプトである。
- useraddに比べてユーザフレンドリー
- 対話式で入力するパスワード
- confファイルで詳細な設定を指定可能
- /etc/adduser.confにデフォルトのユーザ設定があり、デフォルト設定を変えることができる。また--confオプションで使用するconfファイルを指定でき、繰り返し同じ設定のユーザを作成する場合、confファイルを作って使い回すことができる。
- adduserが無い環境あり
以下にadduserの実行例を示す。作成した内容やIDが表示されていることが分かる。
useradd
useraddは以下の特徴を持つユーザ追加コマンドである。
- コマンドオプションで指定するパスワード
- デフォルト値を変更可能
以下にuseraddの実行例を示す。基本的には何も表示されない。
ユーザ作成時のデフォルト設定
adduserとuseraddでコマンドオプションで指定しなかった項目はそれぞれのデフォルト値が使われる。useraddが使うデフォルト値が定義された/etc/default/useraddの内容の一部を示す。
これらの値は環境により異なるが、adduserとuseraddの間でもデフォルト値が異なることがあるので注意する。
usermod - Modify User
ユーザのpasswdデータベース情報を更新する。またはユーザをロック・アンロックする。
usermodのオプションは基本的にはuseraddと同じであるため、useraddの項を参照すること。ただし、所属するグループを変更するときは、変更後の値を指定することに注意が必要である。たとえば、セカンダリグループがusersのユーザがセカンダリグループadmに追加で所属する場合はusermod -G users,adm USERNAME
とするか、差分追加を行う-aオプションと併用する。同様に差分削除する-rオプションもある。以下に例を示す。
useraddにはないusermod独自のオプションとして、ユーザをロック・アンロックするオプションがある。
項目 | usermod |
---|---|
ユーザパスワードのロック (パスワード認証、パスワード変更を禁止) | -L --lock |
ユーザパスワードのアンロック | -U --unlock |
ユーザパスワードをロックするとshadowデータベースのパスワードの頭にロックを示す!が付与される。このロックはパスワードを使用できなくするものであり、アカウントがロックされているわけではない。アカウントをロックするにはEXPIREDATE
を1にすると良い。実際に、パスワードをロックしたユーザに、パスワード不要なsuを行うことでユーザにログインする例を示す。
userdel / deluser - Delete User
ユーザを削除する。
userdel
userdelコマンドはユーザを削除する。同名のユーザグループがある場合、他にユーザが所属していなければグループも削除する。deluserが利用可能な場合、deluserの使用が推奨されている。
オプション | 意味 |
---|---|
-r --remove | ホームディレクトリとメールスプールを削除する。 |
-f --force | たとえユーザがログイン中であったり、他のユーザが使用していたとしても ・ユーザアカウントを強制的に削除する。 ・ホームディレクトリやメールスプールを強制的に削除する。 ・同名のユーザグループを強制的に削除する。 |
deluser
deluserスクリプトはユーザを削除する。userdelコマンドとの大きな違いとしてバックアップ機能がある。
オプション | 意味 |
---|---|
--remove-home | ホームディレクトリとメールスプールを削除する。 |
--remove-all-files | ユーザが所有者であるファイルを全て削除する。 |
--backup | ホームディレクトリとメールスプールのコンテンツを圧縮ファイルとしてバックアップを取る。 ファイル名はusername.tar.gz2などになる。 |
--backup-suffix | バックアップの圧縮方式を指定する。 |
--backup-to | バックアップの保存先を指定する。デフォルトはカレントディレクトリ。 |
passwd - Change User Password
passwdはユーザのパスワードまたはパスワードのエージングに関する設定を変更する。自身のパスワードを変更するときはユーザ名を省略できる。
データベース | 項目 | passwd |
---|---|---|
passwd | 全て | × |
shadow | ユーザ名 | × |
パスワード | オプションなしで実行 ※パスワードなしにするときは -d ,--delete | |
最後にパスワードを変更した日 | - | |
パスワードを再変更できるまでの日数 | -n DAYS --mindays DAYS | |
パスワード変更が必要となるまでの日数 | -x DAYS --maxdays DAYS | |
パスワード再変更の事前警告日数 | -w DAYS --warndays DAYS | |
アカウントが無効になるまでの日数 | -i DAYS --inactive DAYS | |
アカウントが無効になる日 | × | |
予約フィールド | - |
グループの管理
グループの管理もユーザとほぼ同じコマンドの考え方で行える。コマンド別の主要オプションを示す。
分類 | 項目 | addgroup | groupadd | groupmod | gpasswd |
---|---|---|---|---|---|
説明 | コマンドの用途 | グループの追加(高レベル) | グループの追加(低レベル) | グループの変更 | グループパスワードの変更 |
group | グループ名 | 引数で指定 システムグループを作成するときは --system を付ける。 | 引数で指定 システムグループを作成するときは -r か--system を付ける。 | 引数で指定 変更する時は -n NEWNAME --newname NEWNAME | 引数で指定 |
グループのパスワード | × | -p PASSWORD --password PASSWORD ※非推奨 | -p PASSWORD --password PASSWORD ※非推奨 | □パスワードの設定 引数無しで実行 □パスワードの削除 -r --remove-password □パスワードのロック -R --restrict | |
プライマリグループID | --gid GID | -g GID --gid GID | -g GID --gid GID | × | |
グループに属するユーザのリスト | × | -U USERLIST --users USERLIST | -U USERLIST --users USERLIST | □ユーザの追加-a USER --add USER □ユーザの除外 -d USER --delete USER □ユーザリストの指定 -M USERLIST --members USERLIST | |
gshadow | グループ名 | - | - | - | - |
グループのパスワード | - | - | - | - | |
グループの管理者 | × | × | × | -A USERLIST --administartors USERLIST | |
グループに属するユーザのリスト | - | - | - | - |
groupadd / addgroup - Add Group
グループを追加する。
groupdel / delgroup - Delete Group
グループを削除する。いずれもプライマリグループにしているユーザがいるグループは削除しないため、あらかじめ利用者を除外する。
groupdelの独自オプション
オプション | 意味 |
---|---|
-f --force | 削除しようとするグループにプライマリグループとして所属しているユーザがいても削除する。 |
delgroupの独自オプション
オプション | 意味 |
---|---|
--system | 指定されたグループがシステムグループのときのみ削除する。指定されたグループがシステムグループでないとき、またはグループが存在しないときはdelgroupのステータスがエラーとはならない。 |
--only-if-empty | セカンダリグループを含めて、ユーザが所属していないグループのときのみ削除する。 |
groupmod - Modify Group
グループのgroupデータベース情報を更新する。
gpasswd - Administrate Group
グループのパスワード、管理者、所属メンバなど、group・gshadowデータベース情報を更新する。またはグループをロック・アンロックする。
グループのロックは、ユーザのパスワードロックと同じく、パスワードを使用できなくするものである。つまり、newgrpを使ってパスワードによりグループの権限を取得することができなくなるが、グループに所属しているユーザには影響しない。
ファイルの直接編集
vipw / vigw - Edit passwd / group
passwd または groupファイルを直接編集する。-sオプションを付けるとシャドウファイルを直接編集する。
ユーザ・グループの切り替え
現在のユーザ、グループの確認
id - Print IDs
ユーザのUID、GID(プライマリおよびセカンダリ)を全て表示する。
ユーザを指定しない場合、現在のユーザに関するIDが表示される。本稿では詳細は記載しないがUIDやGIDだけを表示するオプションもある。
whoami - Print Username
現在有効なユーザの名前を表示する。id -un
と同じ結果となる。
groups - Print Groups
現在有効な所属するグループを表示する。ユーザの指定がない場合、現在有効なユーザのグループが表示される。
ユーザを指定する場合と指定しない場合だと、ユーザ名が表示される/されないの違いがある。
ユーザ・グループの切り替え
su - Switch User
ユーザを切り替える。権限が上のユーザに切り替える場合、一般に切り替え先ユーザのパスワードが要求される。切り替え先ユーザが指定されない場合、rootへの切り替えとなる。
後方互換性の維持のため、デフォルトではカレントディレクトリやHOME変数などが引き継がれる。通常、-
または--login
を指定することで環境が混在しないようにし、副次的な影響が発生しないようにする。
オプション | 意味 |
---|---|
- -l --login | 新しいシェルにログインしたときのように初期化する。 |
-g GROUP --group=GROUP | [root専用] プライマリグループを指定する。 |
-G GROUPLIST --supp-group=GROUPLIST | [root専用] セカンダリグループを指定する。ただしプライマリグループが-gまたは--groupにより指定されない場合は、リストの最初のグループがプライマリグループとなる。 |
-c COMMAND --command=COMMAND | 指定のユーザとしてコマンドを実行する。 |
sg - Switch Group
グループを切り替え、指定のコマンドを実行する。コマンドは/bin/shで実行される。
指定したコマンドの実行が終了し、sgコマンドが完了すると、グループは元の状態となる。
newgrp - New Group
プライマリグループを切り替えた新しいセッション(サブシェル)を開始する。グループが指定されなかったときはpasswdデータベースにあるプライマリグループに切り替える。sgと似ているが、コマンドは指定できない。
以下にプライマリグループをuser3、デフォルトの順で切り替える例を示す。所属していないユーザが、パスワードが設定されたグループに切り替える場合、通常はパスワードが求められる。
グループにパスワードが設定されていないときはパスワードは問われない。
パスワード認証が要求される状況では、パスワードがロックされているグループには切り替えられない。
なお、suコマンドと同じように-
を指定すると環境変数やカレントディレクトリを引き継がず、新しいログインセッションのように環境を再初期化する。
一時的な権限の使用
sudo - SuperUser Do
コマンドをセキュリティポリシーにより決まる必要な権限で実行する。デフォルトのセキュリティポリシーとしてsudoersが使われる。sudoersの内容および設定方法は次のvisudoの項目で触れる。
対象 | オプション | 意味 |
---|---|---|
コマンドを実行するユーザ | -u USER --user=USER | コマンドを実行するユーザを指定する。 |
コマンドを実行するグループ | -g GROUP --group=GROUP | コマンドを実行するグループを指定する。 |
コマンドを実行するホスト | -h HOST --host=HOST | コマンドを実行するホストを指定する。 |
コマンドを実行するディレクトリ | -D DIRECTORY --chdir=DIRECTORY | コマンドをカレントディレクトリではなく、指定のディレクトリで実行する |
-R DIRECTORY --chroot=DIRECTORY | コマンドをCHROOTしてから実行する。 | |
コマンドを実行するシェル | -i --login | コマンドを実行するユーザのデフォルトシェルを使う |
-s --shell | SHELL環境変数または現在のユーザのデフォルトシェルを使う |
-l
(--list
)オプションを使うと、セキュリティポリシーの内容を確認できる。デフォルトでは自分の現在のホストにおけるポリシーが表示されるが-U(ポリシーを確認するユーザ)などで確認するポリシーを指定できる。
必要であればsudoは認証を要求し、許可されていれば認証結果をキャッシュする。認証キャッシュは更新または失効できる。
オプション | 意味 |
---|---|
-v --validate | ユーザの認証キャッシュを更新する。(必要なら認証が要求される) |
-k --reset-timestamp | コマンドが指定された場合:そのコマンドを認証キャッシュを使わないでsudoする。このとき認証キャッシュは更新されない。 コマンドが指定されない場合:現在のセッションにおける認証キャッシュを無効化する。 |
-K --remove-timestamp | 現在のユーザにおける認証キャッシュを無効化する。 |
visudo - Vi Sudoers
visudoは安全にsudoersファイルを編集する。visudoは、sudoersファイルの同時編集の防止、構文エラーや正当性の検証機能を提供する。visudoが使用するエディタはsudoersの設定により異なるが、環境変数SUDO_EDITOR、VISUAL、EDITORや/usr/bin/editorなどが使われる。
間違った編集をするとメッセージを表示し、修正を促す。
sudoers
sudoersファイルの基本構文を以下に示す。
sudoersには誰が、どのホストで、どのユーザになって、どういう条件で、何ができるかを書く
項目 | 内容 | 説明 |
---|---|---|
user | 誰が | 権限を与えるユーザまたはグループ名 以下のいずれかの記法を使う。 USERNAME %GROUPNAME #USERID %#GROUPID |
host | どのホストで | 権限を与えるホスト名 1つのsudoersファイルを複数のホストで使い回すときに、ホストごとに権限を使い分ける時に使う。そうでなければALLで良い。 以下のいずれかの記法を使う。 ALL 全てのホストsample.example.com ホスト名のFQDN192.0.2.0/24 ネットワークアドレス192.0.2.1 ホストアドレス |
runAs | どのユーザになり | コマンドを実行するユーザまたは/およびグループ名 以下のいずれかの記法を使う。全てのユーザ/グループで実行できるALLが指定でき、単に特権を与えるならALL(またはALL:ALL)で良い。 (USERNAME) (:GROUPNAME) (USERNAME:GROUPNAME) なお、 (USER1, :GROUP1, USER2:GROUP2 ) のように複数書くこともできる。 |
option | どのようなオプション設定で | 以下のいずれかの設定 ・SELinuxのロールなどに関する指定 ・権限を与える期間に関する指定 ・タイムアウトに関する指定 ・実行するディレクトリに関する指定 ・実行するルートディレクトリに関する指定 |
tag: | どういう条件のもとで | PASSWD: /NOPASSWD: コマンド実行前にユーザ認証を要求する(デフォルト) / しないEXEC: /NOEXEC: シェルエスケープ(外部コマンドの実行)を有効にする / しない(デフォルト)LOG_INPUT: /NOLOG_INPUT: ユーザ入力を記録する / しない(デフォルト)LOG_OUTPUT: /NOLOG_OUTPUT: 画面出力を記録する / しない(デフォルト)他にもメール通知等のタグがある。 |
command | 何ができるか | 実行権限を与えるコマンド コマンドはフルパスで指定するが、ワイルドカードは使用できる。 ^EXPRESSION$の書式で正規表現も使用できる。(^と$が必須) 複数のコマンドをカンマ区切りで指定できる。 ディレクトリを指定した場合、そのディレクトリにあるコマンド全ての権限を与える。 |
sudoersの設定例
ためしに、lsコマンドを自由に実行できるlsuserグループを作成してみる。まずはsudoersに以下の内容を追記する。
次にuser1をlsuserグループに所属させる。
最後に、user1がそのままでは見られないところをsudo lsで見てみると、パスワード無しで見ることができる。
lsuserに所属していないuser2で同じことをするとsudoでエラーになる。
優先順位
重複するポリシーがあった場合、一番最後に記載されたポリシーが有効となる。
アクセス制御リスト
ファイルとディレクトリは、ファイルの所有者、所有グループ、それ以外の3つに分けた権限セットが設定される。逆に言えば、この権限セットではユーザごとに異なる権限を設定できない。これの実現にはアクセス制御リスト(ACL)を使う。
ACLのサポート対象
ACLをサポートするファイルシステムはカーネルにより異なる。Ubuntu 24ではext2/3/4やxfsがサポートされる。また、ファイルシステムをマウントするときにACLオプションを有効にする必要がある。Ubuntu 24ではデフォルトで有効になっていた。
ACLエントリ
ACLはACLエントリのリストである。
タグタイプ
ACLエントリには6種類のタグタイプがある。
タグタイプ | 意味 |
---|---|
ACL_USER_OBJ | ファイル所有者のアクセス権を示す。 |
ACL_USER | 修飾子で指定されたユーザのアクセス権を示す。 |
ACL_GROUP_OBJ | ファイル所有グループのアクセス権を示す。 |
ACL_GROUP | 修飾子で指定されたグループのアクセス権を示す。 |
ACL_MASK | ファイル所有者ではないユーザ、グループ(ACL_USER、ACL_GROUP_OBJ、ACL_GROUP)に対して、与えることができる最大のアクセス権を示す。 例えば、ファイル所有者以外には書き込み権限を与えないようにするにはr-xのようなマスクを指定する。 |
ACL_OTHER | 上記以外のACLエントリ |
ACLの評価は以下の順で行われる。
- 現在有効なユーザIDがファイル所有者である場合
- ACL_USER_OBJで許可されている操作なら許可、されていなければ拒否
- 現在有効なユーザIDがACL_USERと一致する場合
- ACL_USERとACL_MASKを組み合わせた結果が許可されている操作なら許可、されていなければ拒否
- 現在有効なグループ(プライマリとセカンダリ)がACL_GROUP_OBJまたはACL_GROUPと一致する場合
- ACL_GROUP_OBJ、ACL_GROUP、ACL_MASKを組み合わせた結果が許可されている操作なら許可、されていなければ拒否
- ACL_OTHERで許可されている操作なら許可
- 拒否
テキストフォーマットのエントリ
ACLエントリは以下のテキストフォーマットで表される。
項目 | 内容 | 値 |
---|---|---|
タグタイプ | ACLのタグタイプ | user:ACL_USER_OBJまたはACL_USER group:ACL_GROUP_OBJまたはACL_GROUP other:ACL_OTHER mask:ACL_MASK |
タグ修飾子 | ACL_USERまたはACL_GROUPにおいて、ACLを適用するユーザまたはグループ | ユーザ名やグループ名 |
権限 | 許可される権限 | r:読み取り w:書き込み x:実行 |
ロング形式とショート形式
ここで示したuser:username:rwxはロング形式のテキストフォーマットであり、1行1エントリで表される。ショート形式ではu:username:rwxのようになり、,区切りで1行に複数エントリを書ける。
ACLの取得・設定
ACLの設定はsetfacl、取得はgetfaclで行える。
getfacl - Get File ACL
getfaclはファイルのACLを表示する。特にACLを設定しない状態ではファイルのアクセス権がACL形式で表示されるのみである。
chmodによりACLの内容が変化する例を示す。
setfacl - Set File ACL
setfaclでファイルのACLを設定する。-mまたは-Mで追加・編集、-xまたは-Xで削除する。
user3に対しtestfileへ書き込み権限を与えるコマンドを実行する。
user3で権限の変化を確認してみる。
権限を削除するとき、パーミッションは指定しない。
マスク値の変化
この例をよく見ると、権限の削除後にmaskの値が変わっていることが分かる。これはsetfaclがマスクの値を必要十分な値に再計算するためである。再計算したくないときは、-n
(--no-mask
)を使う。
パーミッションの表示
ACLを設定すると、lsなど一部コマンドの出力が変化する。
パーミッションの末尾にあるプラス記号は、このファイルにACLが設定されていることを示している。このプラス記号が表示されている場合、実際の権限と表示上の権限が一致しないことがある。上の表示ではtestfileのuser2グループは読み込み・書き込みができる権限を持っているように見えるが、実際はそうではない。
getfaclの結果を見ると、user2グループは読み込み権限しかない。lsコマンドの結果はmask::rw-により、最大で読み込み、書き込み権限を持つグループがあるという程度の意味になっている。要は、プラス記号が付いているファイルの権限はACLで確認しなさいということである。
デフォルトACL
デフォルトACLを設定されたディレクトリでファイル・フォルダを作成すると、自動でそのACLが適用される。デフォルトACLはACLエントリの頭にdefault:を付けたものになる。
デフォルトACLを設定するときはsetfaclでこのフォーマットでACLを指定するか、--defaultオプションを使っても良い。
このディレクトリでファイルを作成すると、最初からACLが適用されている。
ファイルモード作成マスク
この例を見ると新しいファイルのACLではxが設定されていないことが分かる。デフォルトACLは作成されるファイルに与えてもよい最大の権限を指定するものとなり、実際に与えられる権限はファイルを作成するコマンド(の実装)に依存する。今回の例であれば、touchコマンドがrw-rw-r--でファイルを作成しようとするとき、デフォルトACLを使ってそれより強い権限を与えることはできない。これを行うにはファイル作成後にACLをあらためて指定する。
逆に、通常与えられる権限より弱い権限に制限することは期待通りに動作する。この動作はACLが指定されていないときにumaskが行うものである。
仮に、ディレクトリを作成するコマンドmkdirがrwxrwxr-xで作成しようとするときであれば、xも付いたACLが与えられることになる。
デフォルトACLの引き継ぎ
ディレクトリを作成すると、そのディレクトリにデフォルトACLも引き継がれる。