67227


たとえば、セキュアに扱いたいユーザーで、そのユーザーで何も考えずに作成したファイルはすべて自分だけがアクセス可能になっていて欲しいと考えたとします。
(ファイルは 600, ディレクトリは 700 が妥当だと考えているとします)

しかし、たとえば touch したりリダイレクトしたりした際のパーミッションは普通 644 や 755 などになっていると思っています。

# 質問

CentOS において、ユーザーに対して、作成されるファイルのデフォルトのファイルパーミッションは、指定できますか?


CC BY-SA 4.0
2020-06-02T07:55:06.187
67222
2020-06-04T13:09:04.913
2020-06-02T08:35:11.580
3060
754
question
linux centos
linux (CentOS) でファイル・ディレクトリ作成の際のデフォルトのパーミッションは指定できる?


「umask」コマンドを使います。bashであれば内部コマンドになっています。  
umaskとだけ打つと、現在のumask値が表示されます。

以下、umaskを変えてファイルやディレクトリを作って、ls -lでパーミッションを確認してみました。

[code]

    $ umask
    0002
    $ umask 0002
    $ touch file0002
    $ mkdir dir0002
    $ umask 0077
    $ touch file0077
    $ mkdir dir0077
    $ ls -lA
    合計 16
    drwxrwxr-x 2 hidezzz hidezzz 4096  6月  2 17:20 dir0002
    drwx------ 2 hidezzz hidezzz 4096  6月  2 17:20 dir0077
    -rw-rw-r-- 1 hidezzz hidezzz    0  6月  2 17:19 file0002
    -rw------- 1 hidezzz hidezzz    0  6月  2 17:20 file0077
    
[/code]


CC BY-SA 4.0
2020-06-02T08:25:52.150
67224
2020-06-02T11:30:58.070
2020-06-02T11:30:58.070
3060
30745
67222
answer


**回答**  
`umask`でデフォルトのパーミッションを設定できますが、  
デフォルトＡＣＬが設定されていると`umask`よりも優先されます。  
ＡＣＬの設定は`setfacl`、確認は`getfacl`で行います。

**実行例**

* * *

**デフォルトＡＣＬを設定していない場合**  
`umask`が有効です。

[code]

    $ mkdir dir
    $ getfacl dir
    # file: dir
    # owner: XXXX
    # group: XXXX
    user::rwx
    group::rwx
    other::r-x
    
    $ umask
    0002
    $ touch dir/f1
    $ ls -l  dir/f1
    -rw-rw-r-- 1 XXXX XXXX 0  6月  2 17:56 2020 dir/f1
    
[/code]

**デフォルトＡＣＬを設定した場合(rw不許可)**

`umask`が有効になっていません。

[code]

    $ setfacl -d -m o::0 dir
    $ getfacl dir
    # file: dir
    # owner: XXXX
    # group: XXXX
    user::rwx
    group::rwx
    other::r-x
    default:user::rwx
    default:group::rwx
    default:other::---
    
    $ touch dir/f2
    $ ls -l dir/f2
    -rw-rw---- 1 XXXX XXXX 0  6月  2 17:58 2020 dir/f2
    
[/code]

**デフォルトＡＣＬを設定した場合(rw許可)**  
`umask`が有効になっていません。

[code]

    $ setfacl -d -m o::6 dir
    $ getfacl dir
    # file: dir
    # owner: XXXX
    # group: XXXX
    user::rwx
    group::rwx
    other::r-x
    default:user::rwx
    default:group::rwx
    default:other::rw-
    
    $ touch dir/f3
    $ ls -l dir/f3
    -rw-rw-rw- 1 XXXX XXXX 0  6月  2 17:58 2020 dir/f3
    
[/code]


CC BY-SA 4.0
2020-06-02T09:32:37.680
67227
2020-06-02T09:32:37.680
35558
67222
answer


umask を自分で少し調べたので、補足として、その情報を記しておきます。

  1. umask は、 linux のプロセスが持っている値で、 `open(2)`を `O_CREAT` で呼ぶ際に渡される値 `mask` とともに、 `mask & ~umask` が `open` 内部で計算され、それがファイル(ディレクトリ)パーミッションになる。(@akira ejiri さんも仰っているように、 acl を指定した場合はその限りではない)

  2. shell のコマンドたちは、基本的に `open(2)` の `O_CREAT` は、ファイルであるならば `666`, ディレクトリであるならば `777` を `mode` に指定している。

  3. umask はプロセスが持っている値であり、 fork の際に子プロセスは基本的にこれを引き継ぐ。

  4. shell コマンドとしての umask は、今の shell プロセスの umask を書き換えるコマンド。

なので、 profile などで umask を指定してやれば、自分が元々やりたかった、「デフォルトで作成するパーミッションの制限」が実現可能。ただし
acl をセットしていた場合はその限りではない。


CC BY-SA 4.0
2020-06-04T13:09:04.913
67285
2020-06-04T13:09:04.913
754
67222
answer