Linux標準教科書(Ver.3.0.0)のまとめ ~第8章~

# 第8章 ユーザ権限とアクセス権

## はじめに

この章では、ディレクトリとファイルの所有者と所有権について説明されています。
紹介されているコマンドの内容は以下のようになります。

- chownコマンド(ディレクトリ・ファイルの所有者を変更する)
- chgrpコマンド(ディレクトリ・ファイルの所有グループを変更する)
- chmodコマンド(ディレクトリ・ファイルのアクセス者を変更する)

## ファイルの所有者と所有グループ

ディレクトリ・ファイルには、所有者と所有グループが登録されています。それらを変更するのは、以下に紹介するコマンドになります。

### chownコマンド(所有者の変更)

ファイルの所有者を変更するには `chown` コマンドを使いますが、rootユーザである必要があります。

```:書式
chown ユーザ[.グループ] ディレクトリ
chown ユーザ[.グループ] ファイル
```

練習として、以下のコマンドを実行して、ファイルの所有者が変更されることを確認します。

```console:実行コマンド
# login penguin
Password: ******
Last login: Mon Apr  9 01:41:41 on pts/0
(ユーザ penguin でログインする)

$ touch user
(ファイル user を作成)

$ ls -l user
-rw-rw-r-- 1 penguin penguin 0 Apr  9 02:18 user
(ファイルの所有者と所有グループを表示する)
(現在の所有者はpenguin、所有グループはpenguin)

$ chown nobody user
chown: changing ownership of 'user': Operation not permitted
(rootユーザではないので、所有者を変更ができません)

$ su
Password: ******
(カレントディレクトリはそのままrootユーザにログインする)

# chown nobody user
(所有者をユーザ nobody に変更する)

# ls -l user
-rw-rw-r-- 1 nobody penguin 0 Apr  9 02:18 user
(所有者がnobodyに変更されていることを確認)
```

### chgrpコマンド(所有グループの変更)

ファイルの所有グループを変更するには `chgrp` コマンドを使います。

```:書式
chgrp グループ ディレクトリ
chgrp グループ ファイル
```

練習として、以下のコマンドを実行して、ファイルの所有グループが変更されることを確認します。

```console:実行コマンド
# login penguin
Password: ******
Last login: Mon Apr  9 02:16:47 on pts/0
(ユーザ penguin でログインする)

$ touch group
(ファイル group を作成)

$ ls -l group
-rw-rw-r-- 1 penguin penguin 0 Apr  9 02:29 group
(ファイルの所有グループを表示する)
(現在の所有グループはpenguin)

$ chgrp nobody groups
chgrp: changing group of 'group': Operation not permitted
(rootユーザではないので、所有グループを変更ができません)

$ su
Password: ******
(カレントディレクトリはそのままrootユーザにログインする)

# chgrp nobody group
(所有グループをグループ nobody に変更する)

# ls -l group
-rw-rw-r-- 1 penguin nobody 0 Apr  9 02:29 group
(所有者がnobodyに変更されていることを確認)
```

## ファイルとアクセス権

ファイルの以下の3つのレベルで権限を設定できます。

- ファイルを所有するユーザ
- ファイル所有グループからファイル所有者を除いたユーザ
- その他のユーザ

また、それぞれのレベルごとに読み、書き、実行の3つの権限があり、それらのファイルモードを変更するには `chmod` コマンドを使用します。

### ファイルにアクセスできるアクセス権限

ファイルのモードとして読み書き実行の3つの権限があり、上記の3つのレベル毎に設定ができます。 `ls -l` コマンドを実行することで、ファイルのモードを確認することができます。

```:lsコマンドを使用して表示されるファイルモード
drwxrwxrwx 1 root root 9 Apr 2 18:38 file
```

**ファイルのモードの説明**

|ファイル識別|所有ユーザ|所有グループ|その他ユーザ|
|:--:|:--:|:--:|:--:|
|d|rwx|rwx|rwx|

|項目|内容|
|:--|:--|
|r|読み込み|
|w|書き込み|
|x|実行またはディレクトリの移動|

例えば、以下のような結果が返ってきたとします。

```:例
--w------- 1 root root 9 Apr 2 18:38 file
```

この場合、 **所有ユーザ** の **書き込み** だけ、アクセスが許可されていることを示します。

### アクセス権の変更

ファイルのアクセス権を変更するにはchmodコマンドを使用しますが、モード指定の書き方が2通りあります。

- モードの書式を複数書き、カンマで区切って指定。
- 8進数3桁で各ユーザのレベルを指定。

```:書式
chmod モード[,モード]...ディレクトリ
chmod モード[,モード]...ファイル
chmod 8進数表記のモード ディレクトリ
chmod 8進数表記のモード ファイル
```

#### 方法1

モードは次のようにu(所有ユーザ)、g(所有グループ)、o(その他のユーザ)に対して、r(読み)、w(書き)、x(実行またはディレクトリの変更)を設定したり(=)、加えたり(+)、取り消したり(-)します。u、g、oの全てに同じ権限を指定するときはaを使用します。

練習として、以下のコマンドを実行して、ファイルのアクセス権が変更されることを確認しましょう。

```console:実行コマンド
# login penguin
Password: ******
Last login: Mon Apr  9 03:07:19 on pts/0
(ユーザ penguin でログインする)

$ touch chownfile
(ファイル chownfile を作成)

$ ls -l chownfile
-rw-rw-r-- 1 penguin penguin 0 Apr  9 03:27 chownfile
(ファイル chownfile のモードを確認)

$ chmod u+rw-x,go+r-wx chownfile
(ファイルモードを -rw-r--r-- に変更する)

$ ls -l chownfile
-rw-r--r-- 1 penguin penguin 0 Apr  9 03:27 chownfile
(ファイル chownfile のモードが変更されていることを確認)
```

#### 方法2

8進数を使っても、chmodコマンドでアクセス権を変更することができます。以下の表を見て、値を設定してください。

![スクリーンショット 2018-04-09 13.47.32.png](https://qiita-image-store.s3.amazonaws.com/0/186009/d75628de-862f-e1ad-3df4-bd00376507c5.png)


練習として、以下のコマンドを実行して、ファイルのアクセス権が変更されることを確認しましょう。

```console:実行コマンド
# login penguin
Password: ******
Last login: Mon Apr  9 03:25:20 on pts/0
(ユーザ penguin でログインする)

$ touch chownfile
(ファイル chownfile を作成)

$ ls -l chownfile
-rw-rw-r-- 1 penguin penguin 0 Apr  9 04:50 chownfile
(ファイル chownfile のモードを確認)

$ chmod 226 chownfile
(ファイルモードを --w--w-rw- に変更する)

$ ls -l chownfile
--w--w-rw- 1 penguin penguin 0 Apr  9 04:50 chownfile
(ファイル chownfile のモードが変更されていることを確認)
```

#### 追記: 特殊属性

モード指定に setuid ビットと setgid ビットと sticky ビットという特殊な属性があります。 setuid ビットあるいは setgid ビットが付いたプログラムを実行すると、ファイル所有者あるいは所有グループの権限で実行されます。また、 sticky ビットが付いたディレクトリ内のファイルは所有者以外が削除できなくなります。

練習として、以下のコマンドを実行して、setuid と setgid と sticky ビットが追加・除去されることを確認しましょう。

```console:実行コマンド
# login penguin
Password: ******
Last login: Mon Apr  9 04:49:07 on pts/0
(ユーザ penguin でログインする)

$ touch idbitfile
(ファイル idbitfile を作成)

$ chmod u+rw-x,go+r-wx idbitfile
(ファイルモードを -rw-r--r-- に変更する)

$ ls -l idbitfile
-rw-r--r-- 1 penguin penguin 0 Apr 10 00:43 idbitfile
(ファイル idbitfile のモードが変更されていることを確認)

$ chmod u+s idbitfile
(setuid ビットを追加)

$ ls -l idbitfile
-rwSr--r-- 1 penguin penguin 0 Apr 10 00:43 idbitfile
(setuid ビットがセットされていることを確認)

$ chmod u-s,g+s idbitfile
（setuid ビットを除去、 setgid ビットを追加）

$ ls -l idbitfile
-rw-r-Sr-- 1 penguin penguin 0 Apr 10 00:43 idbitfile
(setuid ビットが除去され、 setgid ビットが追加されていることを確認)

$ chmod +t idbitfile
(sticky ビットを追加)

$ ls -l idbitfile
-rw-r-Sr-T 1 penguin penguin 0 Apr 10 00:43 idbitfile
(sticky ビットが追加されていることを確認)
```

## ファイル作成のモード

ファイルを新規に作成すると、ユーザごとに規定されたパーミッションがファイルに設定されます。 umask コマンドを使うことで、指定したパーミッションでファイルを作成するよう制限できます。

```:書式
umask [8進数のモードのマスク値]
```

現在のマスク値を umask コマンドを実行して確認してみましょう！
umask コマンドに続けてマスク値を指定しないことで、現在のマスク値を表示できます。

```console:実行コマンド
# umask
0022
(rootユーザのマスク値を確認)
```

umask コマンドに続けて8進数のモードを指定することでマスク値を設定できます。umask　コマンドは許可しないビットを指定します。例えば、マスク値が `0022` の root ユーザが作成したファイルのモードが `-rw-r--r--` となる仕組みは下図のようになります。

![スクリーンショット 2018-04-10 11.36.11.png](https://qiita-image-store.s3.amazonaws.com/0/186009/c09d11b8-32d1-a288-47a1-8f7074154b14.png)

練習として、umaskを使用してファイル作成を行い、指定したパーミッションが設定されていることを確認しましょう。

```console:実行コマンド
# login penguin
Password: ******
Last login: Tue Apr 10 01:54:27 on pts/0
(ユーザ penguin でログインする)

$ umask
0002
(ユーザ penguin のマスク値を確認)

$ touch umask0002
(ファイル umask0002 を作成)

$ umask 070
(マスク値を 0070 変更)

$ touch umask0070
(ファイル umask0070 を作成)

$ umask 072
(マスク値を 0072 に変更)

$ touch umask0072
(ファイル umask0072 を作成)

$ ls -l
-rw-rw-r-- 1 penguin penguin 0 Apr 10 02:41 umask0002
-rw----rw- 1 penguin penguin 0 Apr 10 02:45 umask0070
-rw----r-- 1 penguin penguin 0 Apr 10 02:45 umask0072
(マスク値が反映されているかを確認)
```