bashのPermission関連についてのまとめ

TL;DR

bashのpermission関連について、すぐ忘れてしまうのでまとめておきます。

Permissionの基本

ls -lコマンドで見れる。

よく見るのは以下のような出力

#|u||g||a|
-rwxrwxrwx
drwxrwx---
|rw-rw----

1文字目

そのファイルの種類を示している。

記号意味
-ファイル
dディレクトリ
|シンボリックリンク

それ以外

ファイル種別以外の部分は、それぞれの範囲でどのパーミッションがあるのかを示している。

範囲意味
[2, 4]所有者の権限
[5, 7]所有グループの権限
[8, 10]その他

パーミッション記号の意味

記号意味
r読み取り権限
w書き込み権限
x実行権限
sSUIDかSGID
tスティッキービート
  • SUID (Set User ID): 指定したユーザーの権限でファイルが実行される。
  • SGID (Set Group ID): 指定したグループの権限でファイルが実行される。ディレクトリ内部で作成されたファイルはすべてディレクトリのSGIDで指定したグループが割り当てられる。
  • スティッキービート: 自身のファイル以外の削除を行えない。ただし書き込みは行える。

権限の変更 chmod

chmod --help
# Usage: chmod [OPTION]... MODE[,MODE]... FILE...
#   or:  chmod [OPTION]... OCTAL-MODE FILE...
#   or:  chmod [OPTION]... --reference=RFILE FILE...
# Change the mode of each FILE to MODE.
# With --reference, change the mode of each FILE to that of RFILE.
# 
#   -c, --changes          like verbose but report only when a change is made
#   -f, --silent, --quiet  suppress most error messages
#   -v, --verbose          output a diagnostic for every file processed
#       --no-preserve-root  do not treat '/' specially (the default)
#       --preserve-root    fail to operate recursively on '/'
#       --reference=RFILE  use RFILE's mode instead of MODE values
#   -R, --recursive        change files and directories recursively
#       --help     display this help and exit
#       --version  output version information and exit
# 
# Each MODE is of the form '[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.
# 
# GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
# Full documentation at: <http://www.gnu.org/software/coreutils/chmod>
# or available locally via: info '(coreutils) chmod invocation'

permissionの指定の仕方

1. 数字で指定

それぞれの権限には値が割り当てられている。その数字の和を指定することで権限を設定できる。基本的に3桁の数字で指定して、1桁目が所有者、2桁目がグループ、3桁目がその他のパーミッションの設定となる。

権限
読み取り権限 (r)4
書き込み権限 (w)2
実行権限 (x)1

  • -rwxrw-r--: chmod 764 file
  • -rwxrwxrxw: chmod 777 file
  • -rw-rw----: chmod 660 file

また、SUID、SGID、スティッキービートを指定する場合は少し特殊で、4桁の数字を使って指定することになる。この場合、1桁目がSUID、SGID、スティッキービートのどれかの値、2桁目が所有者、3桁目がグループ、4桁目がその他のパーミッションの設定となる。

権限
SUID (s)2
SGID (s)4
スティッキービート (t)1

  • -rwsr-xr-x: chmod 4755 file
  • drwxr-sr-x: chmod 2755 dir
  • drwxrwxrxt: chmod 1777 dir

2. アルファベットで指定

数字の代わりに、変更対象、変更方法、変更内容を指定する。

指定の仕方は以下の通り。

変更対象意味
u所有者
g所有グループ
aその他
変更方法意味
+権限を付与
-権限を削除
=指定した権限にする
変更内容意味
r読み取り権限
w書き込み権限
x実行権限
sSUIDかSGID
tスティッキービート

  • 所有者に実行権限を付与: chmod u+x file
  • 所有者と所有グループに実行権限を付与: chmod u+x,g+x file
  • その他から実行権限と書き込み権限を除去: chmod a-wx file
  • SUIDを設定: chmod u+s file
  • SGIDを設定: chmod g+s file
  • スティッキービートを設定: chmod a+t dir

再帰的なパーミッション変更

全て

chmod -R 755 .

特定のファイルの権限変更

findを使う。-execよりxargsを使うほうが推奨されているらしい(参考: findコマンドで-execオプションを使用する時の最後の「 ;」ってなんだっけ?)。

# dir
find . -type d | xargs chmod 755
# file 
find . -type f | xargs chmod 755
# 特定拡張子
find . -name '*.sh' | xargs chmod 755

ディレクトリのデフォルトパーミッションの設定 (umask)

あるディレクトリにおいて作成されるファイルに常に同じパーミッションを割り当てたくなる時がある。その場合はumaskコマンドが使える

umaskコマンドは、付与しない権限を指定する。ディレクトリの場合は実行可能の設定は可能だが、ファイルの場合は実行可能に設定することはできないため、ファイルを実行可能にする場合は、後からchmodコマンドで指定する必要がある。

1. 数字で指定

chmodと同様に数字の和で権限を指定する。

付与しない権限
読み取り権限 (r)4
書き込み権限 (w)2
実行権限 (x)1

  • -rwxr-xr-x: umask 022
  • -rw-rw----: umask 117

2. アルファベットで指定

umask -S 変更対象=変更内容でアルファベットで指定することもできる。この場合も、付与しない権限を指定することに注意する。

  • -rwxr-xr-x: umask g=x,a=x
  • -rw-rw----: umask u=x,g=x,a=rwx

SELinux

あまりちゃんと理解できていない

通常のパーミッションとは別に、MAC (Mandatory Access Control)を追加することで従来のLinuxの権限より粒度の小さい権限を設定することが可能。

SELinux (Security-Enhanced Linux) は Linux カーネルに MAC (Mandatory Access Control) を追加するもので、標準の Discretionary Access Controls (DAC: 任意アクセス制御) がチェックされた後で許可された操作をチェックします。これは米国国家安全保障局 (National Security Agency) が開発したもので、定義されたポリシーを基に Linx システム内のファイルやプロセスおよびその他のアクションにルールを強制できます。

SELinuxの権限はls -Zps -Zで確認することができる。

動作モード

モード説明
EnforcingSELinux 有効。ルール外の動作があれば止める。
PermissiveSELinux 有効。ただしルール外の動作はログに記録するのみ。
DisableSELinux 無効。

動作モードの確認・設定

# 確認
getenforce
# Enforcing

# 設定
setenforce Permissive

SELinuxが有効なLinux上でdockerを使う方法

ボリュームを指定する際に:z:Zの接尾語を使用することで共有コンテントとラベルをDockerに伝えることで、privateかつ個別にボリュームを指定できる(参考: Docker-docs-ja)。

参考

この記事に関するIssueをGithubで作成する

Read Next