Bash Basics | Basicsトップページ | トップページ

ユーザーとグループ

アクセス制御の基本となるのは、「誰が」、「何に」、「アクセスできるようにする」かです。
この「誰が」の最小単位が「ユーザー」であり、シェルであれば、そのシェルを誰が実行しているかです。
全てのユーザーを1つ1つ個別に制御するだけでは、大きな組織などでは管理が非常に煩雑になるため、ユーザーを何らかのカテゴリに沿ってグループ分けしたものが「グループ」です。
例えば、所属部署やチームごとにグループを定義することが可能です。
また、UNIX OS、およびUnix系OSでは以下の3種類のユーザーが存在します。

特権ユーザー
システム管理ユーザー
システムのあらゆる操作が可能な特権を持つユーザー、root
システムユーザーシステム内で特定のサービスを提供するためのユーザー
例えばメールサーバーやWebサーバーを実行するユーザー
※サービスに万が一脆弱性があり、プロセスを乗っ取られたりコマンドをリモートから実行されるような場合、アクセスできる範囲(影響範囲)を局所化するために特定サービスのみを実行できるように制限しています
一般ユーザー上記以外の一般のユーザー

ユーザーは1つ以上のグループに所属することができ、ログイン時に主として割り当てられるグループを「プライマリーグループ」と呼び、プライマリーグループ以外に所属するグループがある場合、それらのグループを「セカンダリグループ」と呼びます。


基本的なアクセス権限

基本的なアクセス権限は以下の3つ「rwx」となりますが、アクセス対象がファイルかディレクトリかで考え方が異なりますのでご注意ください。
ファイルに対する操作は対象のファイルそのものに権限が必要となりますが、ディレクトリ内のファイルの内容を参照・更新する場合には、ディレクトリに対するの実行権限が必要となります。
また、ディレクトリ内にファイルを作成したり、削除する場合には、ディレクトリに対する書き込み権限と実行権限が必要となります。

種類権限 ファイルに対する操作 ディレクトリに対する操作
r読み込み ファイルの内容、および情報の参照が可能 ディレクトリに存在するファイル名の取得が可能
w書き込み ファイルの内容、および情報の更新が可能 ディレクトリの情報の更新が可能 ディレクトリ内でファイルの作成・削除が可能
x実行 ファイルの実行が可能 ディレクトリに移動が可能
ディレクトリ内のファイルの情報の参照、および更新が可能

アクセス権限を確認する場合、lsコマンドに-lオプションを指定します。
$ touch file
$ ls -la file
-rw-rw-r--. 1 user1 user1 0  1月 18 21:25 file

空白で区切られて以下のような情報が表示されます。
-rw-rw-r--. 1 user1 user1 0 1月 18 21:25 file
ファイルタイプと権限 ファイルの場合はハードリンク数
ディレクトリの場合はディレクトリ内のサブディレクトリ数
※.と..もサブディレクトリとしてカウントされます
所有者名
所有者名が不明な場合、所有者ID
グループ
グループ名が不明な場合、グループID
ファイルサイズ
ファイルがデバイスファイルの場合、メジャー番号とマイナー番号
最終更新日時 ファイル名

ファイルタイプと権限は10文字(SELinuxが有効化されている場合、11文字)で以下の情報を表示しています。
カラム意味備考
1ファイルタイプ主なファイルタイプは表の通りです。
意味
-レギュラーファイル(通常ファイル)
bブロック型特殊ファイル
cキャラクター型特殊ファイル
dディレクトリ
lシンボリックリンク
p名前付きパイプ
sソケット
2-4所有者の権限所有者、グループ、その他のユーザーのそれぞれに3文字(読み込み権限: r、書き込み権限: w、実行権限: x)で表現され、権限がない場合は-が表示されます。
文字意味
-権限を持たない
r読み込み権限がある
w書き込み権限がある
x実行権限がある
sSUIDまたは、SGIDが設定されていて、実行権限がある
SSUIDまたは、SGID権限が設定されていて、実行権限がない
tスティッキービットが設定されていて、実行権限がある
Tスティッキービットが設定されていて、実行権限がない
5-7グループの権限
8-10その他ユーザーの権限
11SELinuxが有効化された環境下でのセキュリティコンテキストセキュリティコンテキストの場合のみ.が表示されます。

アクセス権限の変更(付与と剥奪)

アクセス権限をrとwとxの3つのON/OFFのフラグ(2進数)として考えます。つまり、rとwとxを3つのビットとして考え、アクセス権がある=1、アクセス権がない=0とすることで、以下の表のように3桁の2進数として表現することが可能となります。

権限の状態rwx表記2進数8進数
r(OFF), w(OFF), x(OFF)---0000
r(OFF), w(OFF), x(ON)--x0011
r(OFF), w(ON), x(OFF)-w-0102
r(OFF), w(ON), x(ON)-wx0113
r(ON), w(OFF), x(OFF)r--1004
r(ON), w(OFF), x(ON)r-x1015
r(ON), w(ON), x(OFF)rw-1106
r(ON), w(ON), x(ON)rwx1117

アクセス権限を設定する対象は「所有者」、「グループ」、「その他」の3つがあり、ファイルやディレクトリの所有者が可能なアクセス、グループに属するユーザーが可能なアクセス、その他のユーザーが可能なアクセスに分けて権限を付与(剥奪)することが可能です。
ファイルやディレクトリに対する権限の変更はchmodコマンドを使用します。chmodコマンドは以下のいずれかの方法で権限を変更することが可能です。詳細はchmodコマンドのマニュアルページをご参照ください。
  1. アクセス権を8進数表記で所有者、グループ、その他のユーザーに一括して指定する方法
    実行例:fileに対して、所有者に全ての権限(7)、グループに読み込み権限と書き込み権限(6)、その他のユーザー読み込み権限のみ(4)を設定
     $ chmod 764 file
    
  2. 対象と変更内容を指定する方法
    以下の文字を組み合わせて指定することができます。

    対象の指定
    u所有者
    gグループ
    oその他のユーザー
    付与・剥奪の指定
    +アクセス権の追加
    -アクセス権の剥奪
    =アクセス権の指定
    権限の指定
    r読み込み権限
    w書き込み権限
    x実行権限

    実行例:fileに対して、所有者に全ての権限(rwx)、グループに読み込み権限と書き込み権限(rw)、その他のユーザー読み込み権限のみ(r)を設定
    $ chmod u=rwx,g=rw,o=r file
    
$ mkdir test
$ stat test
  File: `test'
  Size: 6         	Blocks: 0          IO Block: 4096   ディレクトリ
Device: 803h/2051d	Inode: 35881       Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/   user1)   Gid: ( 1000/   user1)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2022-01-18 22:35:21.817846700 +0900
Modify: 2022-01-18 22:35:21.817846700 +0900
Change: 2022-01-18 22:35:21.817846700 +0900
$ cd test
$ touch a b c
$ echo a > a
$ echo b > b
$ echo c > c
$ chmod 400 b
$ chmod 000 c
$ ls -la
合計 20
drwxrwxr-x.  2 user1 user1   33  1月 18 22:36 ./
drwxrwxrwt. 20 user1 user1 4096  1月 18 22:35 ../
-rw-rw-r--.  1 user1 user1    2  1月 18 22:36 a
-r--------.  1 user1 user1    2  1月 18 22:36 b
----------.  1 user1 user1    2  1月 18 22:36 c
$ cat a
a
$ cat b
b
$ cat c
cat: c: 許可がありません
$ echo a > b
bash: b: 許可がありません
$ echo a > c
bash: c: 許可がありません
$ rm b c
rm: 書き込み保護されたファイル 通常の空ファイル `b' を削除しますか?y
rm: 書き込み保護されたファイル 通常の空ファイル `c' を削除しますか?y
$ ls -la
合計 12
drwxrwxr-x.  2 user1 user1   15  1月 18 22:40 ./
drwxrwxrwt. 20 user1 user1 4096  1月 18 22:37 ../
-rw-rw-r--.  1 user1 user1    2  1月 18 22:36 a
左記の例では、testというディレクトリを作成し、testディレクトリにa、b、cというファイルを作成した後、それぞれのファイルにa、b、cの文字を書き込んでいます。
その後、ファイルbのアクセス権限を400(所有者のみ参照可)、ファイルcのアクセス権限を000(全てなし)に設定しています。



その状態でファイルa、b、cの内容を参照しようとすると、cは権限がないためエラーとなっていることがわかります。



また、続けてファイルb、cを削除しようとするとそれぞれファイルの書き込み権限がないため、警告が表示されていますが、「y(yes)」で応答することで削除は成功しています。
$ chmod 100 .
$ stat .
  File: `.'
  Size: 15        	Blocks: 0          IO Block: 4096   ディレクトリ
Device: 803h/2051d	Inode: 35881       Links: 2
Access: (0100/d--x------)  Uid: ( 1000/   user1)   Gid: ( 1000/   user1)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2022-01-18 22:35:21.817846700 +0900
Modify: 2022-01-18 22:36:34.021652404 +0900
Change: 2022-01-18 22:37:11.738428962 +0900
 Birth: -
$ ls
ls: ディレクトリ . を開くことが出来ません: 許可がありません
$ stat a
  File: `a'
  Size: 2         	Blocks: 8          IO Block: 4096   通常ファイル
Device: 803h/2051d	Inode: 139891      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   fumio)   Gid: ( 1000/   fumio)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2022-01-18 22:36:36.496548493 +0900
Modify: 2022-01-18 22:36:34.021652404 +0900
Change: 2022-01-18 22:36:34.021652404 +0900
 Birth: -
次にカレントディレクトリ(test)のアクセス権限を100(所有者のみ参照可)に変更したため、ディレクトリ内のファイルの一覧を参照することができなくなり、エラーが表示されていますが、ファイルの名前がわかっているファイルaの情報を取得することは問題ないことがわかります。
$ chmod 200 .
$ stat .
stat: `.' を stat できません: 許可がありません
$ chmod 400 .
chmod: `.' にアクセスできません: 許可がありません
$ cd ..
$ chmod 400 test
$ cd test
bash: cd: test: 許可がありません
さらにカレントディレクトリ(test)のアクセス権限を200(所有者の書き込み権限のみ)とするとディレクトリの情報を取得することも、改めて書き込み権限を付与することもできなくなっています。
そのためいったん上の階層に移動して、再びtestディレクトリに移動しようとしても失敗します。これはディレクトリに対する実行権限がないためです。


SUID、SGIDとスティッキービット

通常、ユーザーが実行するコマンドはそのユーザーの権限とグループの権限で実行されます。また、操作を行うユーザーディレクトリに対する書き込み権限と実行権限を持っていれば、新たにファイルを作成したり、名前を変更したり、削除することが可能です。新たに作成されるファイルは操作を行ったユーザーが所有者となり、ユーザーグループがファイルのグループとなります。
UNIX OS、およびUnix系OSではこれらの基本的なアクセス権限以外に以下の3つの特殊な権限があります。

名称 ファイルに対する権限 ディレクトリに対する権限
SUID
(Set User ID)
対象のファイルが実行形式(バイナリ)のコマンドの場合、そのファイルの所有者の権限で実行されます。(実効ユーザー
対象のファイルがスクリプトでは効果なし。
なし
SGID
(Set Group ID)
対象のファイルが実行形式(バイナリ)のコマンドの場合、そのファイルのグループの権限で実行されます。(実効グループ
対象のファイルがスクリプトでは効果なし。
ディレクトリ内に新たに作成されるファイルやディレクトリグループを継承します
スティッキービット
(Sticky Bit)
なし ディレクトリ内のファイルに対する名前の変更と削除をファイルの所有者とディレクトリの所有者に限定します

/usr/binにはいくつかSUID/SGIDが設定されたコマンドがあります。以下のように実行するとそれらのコマンドを見つけることができます。
$ find /usr/bin -perm -4000 -or -perm -2000 | xargs ls -la
-rwsr-xr-x. 1 root root    2447320  1月  5 02:45 /usr/bin/Xorg
-rwsr-xr-x. 1 root root      53048 10月 31  2018 /usr/bin/at
-rwxr-sr-x. 1 root cgred     15632  8月  9  2019 /usr/bin/cgclassify
-rwxr-sr-x. 1 root cgred     15608  8月  9  2019 /usr/bin/cgexec
-rwsr-xr-x. 1 root root      73888  8月  9  2019 /usr/bin/chage
-rws--x--x. 1 root root      23968  2月  3  2021 /usr/bin/chfn
-rws--x--x. 1 root root      23880  2月  3  2021 /usr/bin/chsh
-rwsr-xr-x. 1 root root      57576  1月 14 01:52 /usr/bin/crontab
-rwsr-xr-x. 1 root root      32096 10月 31  2018 /usr/bin/fusermount
-rwsr-xr-x. 1 root root      78408  8月  9  2019 /usr/bin/gpasswd
-rwsr-xr-x. 1 root root      61320 12月  3 00:32 /usr/bin/ksu
-rwx--s--x. 1 root slocate   40520  4月 11  2018 /usr/bin/locate
-rwsr-xr-x. 1 root root      44264  2月  3  2021 /usr/bin/mount
-rwsr-xr-x. 1 root root      41936  8月  9  2019 /usr/bin/newgrp
-rwsr-xr-x. 1 root root      27856  4月  1  2020 /usr/bin/passwd
-rwsr-xr-x. 1 root root      23576  4月  1  2020 /usr/bin/pkexec
---x--s--x. 1 root nobody   382216 11月 25 01:35 /usr/bin/ssh-agent
---s--x---. 1 root stapusr  212080 10月 14  2020 /usr/bin/staprun
-rwsr-xr-x. 1 root root      32128  2月  3  2021 /usr/bin/su
---s--x--x. 1 root root     151424 10月 14 21:28 /usr/bin/sudo
-rwsr-xr-x. 1 root root      31984  2月  3  2021 /usr/bin/umount
-r-xr-sr-x. 1 root tty       15344  6月 10  2014 /usr/bin/wall
-rwxr-sr-x. 1 root tty       19544  2月  3  2021 /usr/bin/write

SUID、SGID、スティッキービットの操作についても以下のようにchmodコマンドを使用します。
対象の権限付与剥奪
数値指定文字指定数値指定文字指定
SUID通常の権限設定の8進数の数値に4000を加算u+s通常のアクセス権限のみを指定u-s
SGID通常の権限設定の8進数の数値に2000を加算g+s通常のアクセス権限のみを指定g-s
スティッキービット通常の権限設定の8進数の数値に1000を加算o+t通常のアクセス権限のみを指定o-t

SUID、SGID、スティッキービットが付与されたファイルやディレクトリの確認
$ ls -ld /usr/bin/passwd /usr/bin/write /tmp
-rwsr-xr-x.  1 root root 27856  4月  1  2020 /usr/bin/passwd
-rwxr-sr-x.  1 root tty  19544  2月  3  2021 /usr/bin/write
drwxrwxrwt. 20 root root  4096  1月 19 15:07 /tmp

スティッキービットの実行例
実行ユーザー: user1
$ touch file1
$ ls -la
合計 0
drwxrwxrwx. 2 root  root  36  1月 19 18:10 .
drwxrwxrwt. 3 root  root  19  1月 19 18:03 ..
-rw-rw-r--. 1 user1 user1  0  1月 19 18:10 file1
-rw-rw-r--. 1 user2 user2  0  1月 19 18:10 file2
実行ユーザー: user2
$ touch file2
$ ls -la
合計 0
drwxrwxrwx. 2 root  root  36  1月 19 18:10 .
drwxrwxrwt. 3 root  root  19  1月 19 18:03 ..
-rw-rw-r--. 1 user1 user1  0  1月 19 18:10 file1
-rw-rw-r--. 1 user2 user2  0  1月 19 18:10 file2
$ echo "Hello" > file1
$ echo "Hello" > file2
-bash: file2: 許可がありません
user2が作成したfile2への書き込み権限がないため、失敗します。
$ echo "Hello" > file1
-bash: file1: 許可がありません
$ echo "Hello" > file2
user1が作成したfile1への書き込み権限がないため、失敗します。
$ mv file1 File1
$ mv file2 File2
ディレクトリへの書き込み権限と実行権限があるため、user2が作成したファイルの名前の変更が可能です。
 
 
$ mv File1 FILE1
$ mv File2 FILE2
ディレクトリへの書き込み権限と実行権限があるため、user1が作成したファイルの名前の変更が可能です。
$ rm FILE2
rm: 書き込み保護されたファイル 通常ファイル `FILE2' を削除しますか?y
ファイルに対する書き込み権限がないため、削除しようとすると警告が表示されますが、「y」と入力するとディレクトリへの書き込み権限と実行権限があるため、user2が作成したファイルでも削除が可能です。
$ rm FILE1
rm: 書き込み保護されたファイル 通常ファイル `FILE1' を削除しますか?y
ファイルに対する書き込み権限がないため、削除しようとすると警告が表示されますが、「y」と入力するとディレクトリへの書き込み権限と実行権限があるため、user1が作成したファイルでも削除が可能です。
$ mkdir test
$ chmod o+w,o+t test
$ cd test
$ ls -la
合計 0
drwxrwxrwt. 2 user1 user1  6  1月 19 18:31 .
drwxrwxrwx. 3 root  root  18  1月 19 18:30 ..
ディレクトリtestを作成し、その他のユーザーへの書き込み権限とスティッキービットを設定します。
$ cd test
$ ls -la
合計 0
drwxrwxrwt. 2 user1 user1  6  1月 19 18:31 .
drwxrwxrwx. 3 root  root  18  1月 19 18:30 ..
user1が作成したディレクトリtestに移動します。
$ touch file1
$ ls -la
合計 0
drwxrwxrwt. 2 root  root  36  1月 19 18:33 .
drwxrwxrwx. 3 root  root  19  1月 19 18:30 ..
-rw-rw-r--. 1 user1 user1  0  1月 19 18:33 file1
-rw-rw-r--. 1 user2 user2  0  1月 19 18:33 file2
$ touch file2
$ ls -la
合計 0
drwxrwxrwt. 2 root  root  36  1月 19 18:33 .
drwxrwxrwx. 3 root  root  19  1月 19 18:30 ..
-rw-rw-r--. 1 user1 user1  0  1月 19 18:33 file1
-rw-rw-r--. 1 user2 user2  0  1月 19 18:33 file2
$ mv file1 File1
$ mv file2 File2
ディレクトリの所有者であり、ディレクトリにスティッキービットが設定されているため、user2が作成したファイルの名前の変更が可能です。
 
 
$ mv File1 FILE1
mv: `File1' から `FILE1' へ移動できません: 許可されていない操作です
$ mv File2 FILE2
ディレクトリにスティッキービットが設定されており、ディレクトリの所有者ではないため、user1の所有するファイルの名前の変更はできません。
 
$ rm File1
rm: 書き込み保護されたファイル 通常の空ファイル `File1' を削除しますか?y
rm: `File1' を削除できません: 許可されていない操作です
同様にuser1の所有するファイルの削除もできません。
$ rm file1
$ rm FILE2 
rm: 書き込み保護されたファイル 通常の空ファイル `FILE2' を削除しますか?y
ディレクトリの所有者であり、ディレクトリにスティッキービットが設定されているため、user2が作成したファイルの削除も可能です。
 


ファイル生成マスク

ファイルやディレクトリを新しく作成する場合、システムの管理ポリシーに従ってデフォルトのアクセス権限が付与されます。このルールは「ファイル生成マスク」と呼ばれシェルの設定ファイルなどで指定されています。
ファイル生成マスクは8進数の数値で指定され、下記のような意味合いを持ちます。

対象 新しい対象に設定される権限 ファイル生成マスクが002の場合の例
ファイル 666からマスク値を引いた値 666 - 002 = 664
所有者6110r(ON), w(ON), x(OFF)
グループ6110r(ON), w(ON), x(OFF)
その他4100r(ON), w(OFF), x(OFF)
ディレクトリ 777からマスク値を引いた値 777 - 002 = 775
所有者6110r(ON), w(ON), x(OFF)
グループ6110r(ON), w(ON), x(OFF)
その他4100r(ON), w(OFF), x(OFF)

ファイル生成マスクを変更する場合にはumaskコマンドを使用します。