Linuxのファイルとディレクトリのパーミッションについて

Linux上でのファイルとディレクトリの権限ごとの挙動を忘れがちなのでざっと説明用にまとめてみる。
`chmod` で変更するやつ

# 権限のみかた

```
$ ls -l
```

で、カレントディレクトリにあるファイルやディレクトリの権限を見れる

```
drwxrwxrwx. 2 core core 4096 Mar 22 11:02 dir
-rwxrwxrwx. 1 core core    0 Mar 22 11:02 file
```

一番ひだりの `d` がディレクトリか否かを表してて、
その後ろの `rwx` は3文字で1セット。
左から順番に、
所有権のあるユーザの権限、所有権のあるグループに所属するグループの権限、その他のユーザの権限
を表している。

`r` は読み
`w` は書き
`x` は実行
の権限で

```
-rw-r--r--. 1 core core 0 Mar 22 11:05 foo
```

上記のようになっている場合は
`foo` というファイルに対しては
`core` というユーザが `rw` （読み書き）の権限があって、
それ以外のユーザは `r` （読み）の権限しかないことを表す。
なお、rootユーザは問答無用ですべての権限を持つ。

# ファイル

特定のユーザ（グループ）以外には読ませたくないようなファイルや、特定のユーザ（グループ）からしか更新できないようなファイルを作りたいときに使用することが多い。

## デフォルトの権限

ターミナルでファイルを作成すると `0644` の権限になる

```
core@dev ~/work $ touch file
core@dev ~/work $ ls -l
total 4
-rw-r--r--. 1 core core 0 Mar 22 11:08 file
```

## 書き込み権限

```
core@dev ~/work $ chmod 444 ./file
core@dev ~/work $ ls -l
total 4
-r--r--r--. 1 core core 0 Mar 22 11:08 file
core@dev ~/work $ echo "hogehoge" > file
-bash: file: Permission denied
```

特定のユーザ以外に書き込みをさせたくないファイルを扱うときに使う。
下手に書き込むと壊れるようなファイルとか。
書き込み権限がないファイルを削除しようとすると警告がでる。

```
core@dev ~/work $ touch file
core@dev ~/work $ chmod 400 file
core@dev ~/work $ ls -l
total 4
-r--------. 1 core core 0 Mar 22 11:20 file
core@dev ~/work $ rm file
rm: remove write-protected regular empty file 'file'?
```

## 読み込み権限

```
core@dev ~/work $ chmod 000 ./file
core@dev ~/work $ ls -l
total 4
----------. 1 core core 0 Mar 22 11:08 file
core@dev ~/work $ cat file
cat: file: Permission denied
```

特定にユーザ以外に読み込みさせたくないファイルを扱うときに使う。
秘匿情報を含む情報を扱うときとか。

## 実行権限

ファイルを実行する権限
スクリプトとかバイナリに使う

実行できないようなただのテキストファイルに付与しても意味ない

```
core@dev ~/work $ echo "hogehoge" > file
core@dev ~/work $ chmod 700 ./file
core@dev ~/work $ ls -l
total 8
-rwx------. 1 core core 9 Mar 22 11:22 file
core@dev ~/work $ ./file
./file: line 1: hogehoge: command not found
```

bashで実行した場合

```
core@dev ~/work $ echo "echo hogehoge" > file
core@dev ~/work $ chmod 700 ./file
core@dev ~/work $ ls -l
total 8
-rwx------. 1 core core 14 Mar 22 11:22 file
core@dev ~/work $ ./file
hogehoge
```

ターミナルやプロセスとして実行できるように付与することがほとんど

# ディレクトリ

## デフォルトの権限

```
core@dev ~/work $ mkdir foo
core@dev ~/work $ ls -l
total 8
drwxr-xr-x. 2 core core 4096 Mar 22 11:25 foo
```

デフォルトはファイルと違って先頭を除くと
`rwxr-xr-x` になるので、ディレクトリの場合は
所有権のあるユーザは `rwx` の権限で
それ以外のユーザは `r-x` の権限になる

## 書き込み権限

```
core@dev ~/work $ mkdir foo
core@dev ~/work $ ls -l
total 8
drwxr-xr-x. 2 core core 4096 Mar 22 11:38 foo
core@dev ~/work $ chmod 500 ./foo/
core@dev ~/work $ ls -l
total 8
dr-x------. 2 core core 4096 Mar 22 11:38 foo
core@dev ~/work $ touch foo/test
touch: cannot touch 'foo/test': Permission denied
```

書き込み権限がない場合はディレクトリ以下にファイルを配置できなくなる
ファイル単位ではなくディレクトリ単位で保護したいときに使う。

## 読み込み権限

```
core@dev ~/work $ mkdir foo
core@dev ~/work $ chmod 000 ./foo/
core@dev ~/work $ ls -l foo/
ls: cannot open directory 'foo/': Permission denied
```

ディレクトリにアクセスできないので `ls` などで参照できなくなる

## 実行権限

```
core@dev ~/work $ mkdir foo
core@dev ~/work $ touch foo/bar
core@dev ~/work $ chmod 600 ./foo/
core@dev ~/work $ ls -l foo/
ls: cannot access 'foo/bar': Permission denied
total 0
-????????? ? ? ? ?            ? bar
```

ディレクトリに実行権限がない場合は、配下のファイルへのアクセス権がなくなる。
そのためファイルの情報自体にアクセスができなくなる。
ファイルの情報にアクセスできず権限が不明なため、読み書きもできなくなる。
ディレクトリへの読み書きの権限はあるので、 `chmod` でディレクトリの権限を書き換えることはできる。