ユーザの種類
Linuxにおいて、ユーザはsystem userとnormal userの2種類に分けることができます。
system user
人間が直接ログインするためのユーザではなく、デーモンプロセスやサービスの実行のために使われるユーザです。
nginxのwoker processを実行する際に慣習的に使われるwww-dataや、mysqldを実行する際に使われるmysqlなどがこれに該当します。
normal user
人間が対話的に使用する際に使うユーザです。
カーネルから見たユーザ
ユーザはwww-data, mysqlなどのユーザ名を持っていますが、カーネルはこのユーザランドで使われているユーザ名を認識していません。
カーネルが認識しているのは、ユーザID(UID)です。
このUIDはユーザの種類によって割り当てられる範囲が決まっています。
割り当ての範囲は、ディストリビューションによって異なります。
例としてsystemdのドキュメントを参照すると、以下のようなUIDの範囲の割り当てになっています。
-
0- root user
-
1…999- system user
-
1000…65533,65536…4294967294- normal user
-
65534- nobody user
カーネルはユーザ名を認識していないため、ユーザランドからカーネルとやりとりする際にはUIDを特定する必要があります。
/etc/passwd
ユーザ名とUIDを対応づけているファイルが/etc/passwdです。
ユーザ名とUIDを1:1で対応づけているのではなく、その他のメタ情報も含まれます。
ファイルの中身は以下のようになっています。
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
# ...
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
# ...
tsuzuki-takaaki:x:1000:1000:tsuzuki takaaki:/home/tsuzuki-takaaki:/bin/bash
各レコードが1ユーザを表しており、1レコードに7つのフィールドが含まれています。
各フィールドは以下を意味します。
<username>:<password>:<UID>:<GID>:<real_name>:<home_dir>:<shell>
-
username: ユーザ名 -
password: パスワード-
xが入っていますが、ここに平文でパスワードが保存されることはほとんどなく、/etc/shadowに暗号化されて保存されます。
-
UID-
GID: グループID -
real_name: フルネームや連絡先 -
home_dir: 対象ユーザのホームディレクトリ -
shell: シェル- loginを許可しない、システムユーザなどは
/usr/sbin/nologinが指定されます。
- loginを許可しない、システムユーザなどは
/etc/group
/etc/passwdでユーザが管理されている一方で、/etc/groupでは、グループが管理されています。
$ cat /etc/group
root:x:0:
daemon:x:1:
# ...
sudo:x:27:tsuzuki-takaaki
# ...
フィールドが4つ含まれており、フォーマットは以下です。
<groupname>:<password>:<GID>:<other_member>
新たなユーザを追加するごとに、そのユーザと同名のグループが自動的に追加されます。
仮にhogeという名前のユーザを追加すると、デフォルトでhogeという名前のグループが作成されて、そのグループに属することになります。
root@bc9413b0bcf2:/# adduser hoge
info: Adding user `hoge' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `hoge' (1001) ...
info: Adding new user `hoge' (1001) with group `hoge (1001)' ...
info: Creating home directory `/home/hoge' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for hoge
Enter the new value, or press ENTER for the default
Full Name []: hoge
Room Number []: 999
Work Phone []: 999
Home Phone []: 999
Other []: 999
Is the information correct? [Y/n] y
root@bc9413b0bcf2:/# tail -n 1 /etc/passwd
hoge:x:1001:1001:hoge,999,999,999,999:/home/hoge:/bin/bash
root@bc9413b0bcf2:/# tail -n 1 /etc/group
hoge:x:1001:
参考