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)。

参考

記事に間違い等ありましたら、お気軽に以下までご連絡ください

E-mail: illumination.k.27|gmail.com ("|" replaced to "@")

Twitter: @illuminationK

当HPを応援してくれる方は下のリンクからお布施をいただけると非常に励みになります。

Ofuse

Other Articles

Privacy Policy

Copyright © illumination-k 2020-2021.