Unix 系のオペレーティング システムでは、ユーザーをユーザー識別子と呼ばれる値で識別します。ユーザー識別子は、ユーザー IDまたはUIDと略されることがよくあります。UID は、グループ識別子(GID) やその他のアクセス制御基準とともに、ユーザーがアクセスできるシステム リソースを決定するために使用されます。パスワード ファイルは、テキストのユーザー名をUID にマップします。UID は、Unixファイル システム、実行中のプロセス、tarアーカイブ、および現在は廃止されたNetwork Information Serviceのinodeに保存されます。POSIX 準拠の環境では、シェルコマンドによって、現在のユーザーの UID のほか、ユーザー名、プライマリ ユーザー グループ、グループ識別子 (GID) などの詳細情報も表示されます。
id
プロセス属性
POSIX 標準では、特権プロセスが動的に異なる役割を担えるように、プロセス記述子テーブルに 3 つの異なる UID フィールドが導入されました。
有効なユーザーID
euidプロセスの実効 UID ( ) は、ほとんどのアクセス チェックに使用されます。egidまた、そのプロセスによって作成されたファイルの所有者としても使用されます。プロセスの実効 GID ( ) は、アクセス制御にも影響し、使用されている特定のカーネル実装のセマンティクスと、場合によっては使用されるマウントオプションに応じて、ファイルの作成にも影響する場合があります。BSD Unixセマンティクスによると、新しく作成されたファイルに与えられるグループ所有権は、そのファイルが作成されたディレクトリのグループ所有権から無条件に継承されます。AT &T UNIX System Vセマンティクス ( Linuxバリアントでも採用されています) によると、新しく作成されたファイルは通常、ファイルを作成したプロセスの によって指定されたグループ所有権が与えられますegid。ほとんどのファイルシステムは、新しく作成されたファイルのグループ所有権に関して BSD セマンティクスを使用するか AT&T セマンティクスを使用するかを選択する方法を実装しています。S_ISGID (s-gid) 権限が設定されている場合、特定のディレクトリに対して BSD セマンティクスが選択されます。[1]
ファイルシステムユーザーID
fsuidLinux には、ファイル システムへのアクセス制御に明示的に使用されるファイル システム ユーザー ID ( ) もあります。明示的に設定されていない限り、 と一致します。 、、または がroot の場合のみ、これがrootのユーザー IDeuidになることがあります。 が変更されると、その変更は に伝播されます。
ruidsuideuideuidfsuid
の目的はfsuid、プログラム(NFSuidサーバーなど)が、シグナルを送信する許可を与えることなく、特定のファイルシステム権限に制限できるようにすることです。カーネル2.0以降、Linuxはシグナル送信に関してSUSv3uidルールに準拠しているため、の存在はfsuid不要になりましたが、互換性のために残っています。[2]fsuid
保存されたユーザーID
保存されたユーザー ID は、昇格された権限で実行されているプログラムが一時的に非特権作業を行う必要がある場合に使用されます。euid特権値 (通常は0) から非特権値 (特権値以外の値) に変更すると、特権値が に格納されますsuid。後で、プログラムの をeuidに格納されている値に戻して、昇格された権限を復元できます。非特権プロセスは、 を の値、 の値、 の値のいずれかにsuid設定できます。
euidruidsuideuid
実ユーザーID
実 UID ( ruid) と実 GID ( rgid) は、プロセスの実所有者を識別し、シグナル送信の権限に影響します。スーパーユーザー権限のないプロセスは、送信者のruidまたは が受信側のまたは とeuid一致する場合にのみ、別のプロセスにシグナルを送信できます。子プロセスは親プロセスから資格情報を継承するため、子プロセスと親プロセスは互いにシグナルを送信できます。
ruidsuid
コンベンション
タイプ
POSIX では、UID は整数型である必要があります。ほとんどの Unix 系オペレーティング システムでは、UID を符号なし整数として表します。UID 値のサイズはシステムによって異なります。一部の UNIX OS [どれですか? ] は15 ビット値を使用し、最大 32767 [引用が必要]までの値を許可しましたが、Linux (バージョン 2.4 より前) などの他の OS は16 ビットUID をサポートし、65536 個の一意の ID を可能にしました。最近の Unix 系システムの大部分 (例: 1990 年の Solaris 2.0、2001 年の Linux 2.4) は32 ビットUIDに切り替え、4,294,967,296 (2 32 ) 個の一意の ID を許可しています。
予約範囲
Linux標準ベースコア仕様では、0から99までのUID値はシステムによって静的に割り当てられ、アプリケーションによって作成されてはならないと規定されています。一方、100から499までのUIDはシステム管理者とインストール後のスクリプトによる動的割り当て用に予約されるべきです。[3]
Debian Linuxは、動的に割り当てられるシステムユーザーとグループ用に100~999の範囲を予約するだけでなく、60000~64999の範囲のユーザーとグループを集中的かつ静的に割り当て、さらに65000~65533の範囲を予約しています。[4]
Systemdはいくつかの特別なUID範囲を定義しており、[5]
- 60001-60513: systemd-homed によって管理されるホームディレクトリの UID
- 61184-65519 (0xef00-0xffef): 動的ユーザーの UID
FreeBSDでは、パッケージにUIDが必要な移植者は、50から999の範囲から空いているUIDを選択し、静的割り当てを登録することができます。[6] [7]
一部のPOSIXシステムでは、新規ユーザーのUIDを500から割り当てます(macOS、Red Hat Enterprise Linuxバージョン6まで)。また、1000から割り当てるシステムもあります(Red Hat Enterprise Linuxバージョン7以降、[8] openSUSE、Debian [4]/etc/login.defs )。多くのLinuxシステムでは、これらの範囲は、、および同様のツールで指定されていますuseradd。
企業ネットワークにおける中央UID割り当て( LDAPやNFSサーバー経由など)では、クライアントコンピュータにローカルに割り当てられたUIDとの潜在的な競合を避けるために、1000を大きく上回る60000~65535の範囲外のUID番号のみを使用するように制限される場合があります。新しいユーザーがローカルに作成されると、ローカルシステムはNSSに既に存在するUIDとの競合をチェックして回避することになっています[9]
OS レベルの仮想化では、 Linux 名前空間などを使用してユーザー識別子を再マップできるため、再マップされた UID と GID がマップされる範囲を割り当てる必要があります。
- snapdはUIDとGIDを524288-589823(0x80000-0x8ffff)の範囲にマッピングします。
- systemd-nspawnはコンテナごとのUID範囲を自動的に割り当て、524288-1879048191(0x80000-0x6fffffff)の範囲を使用します[5]
systemdの作者は、OSレベルの仮想化システムではコンテナごとに65536( 216 )個のUIDを割り当て、216の整数倍を追加してマッピングすることを推奨しています。[5]
特別な値
- 0:スーパーユーザーのUIDは通常ゼロ(0)です。[10]
- −1: この値は
(uid_t) -1省略された引数を識別するためにPOSIXによって予約されています。[11] - 65535: この値は、uid_t が 16 ビットの場合の API エラー戻り値であったため、引き続き回避されます。
- Nobody: 歴史的に、ユーザー「nobody」にはいくつかのオペレーティングシステムでUIDが割り当てられていましたが、 OpenBSDなどでは2 15
-2−1 = 32,767などの他の値も使用されています。[12] 16ビットと32ビットのUID間の互換性のため、多くのLinuxディストリビューションでは現在、2 16 −2 = 65,534に設定されています。Linuxカーネルは、32ビットのUIDが16ビットのシステムコールの戻り値に収まらない場合、デフォルトでこの値を返します。[13] Fedora Linuxは、システム使用のために静的に割り当てられた範囲(0〜99)の最後のUIDをnobody:99に割り当て、代わりに65534を呼び出します。nfsnobody
代替案
NFSv4 は、プロトコル パケット内のユーザー (およびグループ) を整数ではなくテキスト形式の「user@domain」名で識別することで、数値識別子の衝突を回避することを目的としていました。しかし、オペレーティング システム カーネルとローカル ファイル システムが整数ユーザー識別子を使用し続ける限り、追加の変換手順 (idmap デーモン プロセスを使用) が必要になります。これにより、ローカル UID マッピング メカニズムまたはデータベースが誤って構成されたり、失われたり、同期がとれなくなったりすると、追加の障害ポイントが発生する可能性があります。ユーザー名の「@domain」部分は、たとえば次の形式で、特定の名前を割り当てた権限を示すために使用できます。
- Kerberosレルム名
- Active Directoryドメイン名
- オペレーティング システム ベンダーの名前 (ディストリビューション固有の割り当て用)
- コンピュータの名前(デバイス固有の割り当て用)
しかし、実際には、既存の実装の多くは NFSv4 ドメインを固定値に設定することしかできないため、役に立たなくなってしまいます。
参照
参考文献
- ^ – Solaris 11.4ユーザーコマンドリファレンスマニュアル
- ^ Kerrisk, Michael. Linuxプログラミングインターフェース。No Starch Press、2010年、171ページ。
- ^ 「9.3. UID 範囲」。Refspecs.linuxfoundation.org。2016年9 月 24 日閲覧。
- ^ ab 「Debian ポリシーマニュアル – セクション 9.2.2: UID および GID クラス」。Debian.org。2019年 7 月 18 日。2019 年 7 月 26 日閲覧。
- ^ abc 「systemd システム上のユーザー、グループ、UID、GID」。GitHub。2020年9 月 26 日閲覧。
- ^ 「FreeBSD Porter's Handbook」. Freebsd.org . 2016年9月24日閲覧。
- ^ 「第6章 特別な考慮事項」。
- ^ 「RHEL7 システムの変更」。Certdepot.net 2016-01-17 。2017-03-22閲覧。
- ^ https://systemd.io/UIDS-GIDS/ 「両方の割り当て範囲について: UID 割り当てが行われると、最初に NSS の衝突がチェックされ、エントリが見つかった場合は別の UID が選択されます」
- ^ “Getpwuid”. Pubs.opengroup.org . 2016年9月24日閲覧。
- ^ “Chown”. Pubs.opengroup.org . 2016年9月24日閲覧。
- ^ 「NetBSD 問題レポート #6594: デフォルトの「nobody」認証情報 (32767:9999) が mountd のデフォルト (-2:-2) と一致しない」。GnaNFSv4ts.netbsd.org 。2016年 9 月 24 日閲覧。
- ^ 「ネームスペースの運用、パート 5: ユーザー ネームスペース」。Lwn.net。2016年9 月 24 日閲覧。
