「ファイルのパーミッションと属性」の版間の差分
(関連記事に 拡張属性 を追加) |
細 (→所有者の変更: typo) |
||
(同じ利用者による、間の1版が非表示) | |||
338行目: | 338行目: | ||
{{Note| |
{{Note| |
||
− | * {{ic|chown}} は常に |
+ | * {{ic|chown}} は常に setuid と setgid のビットを消去します。 |
* root 以外のユーザは {{ic|chown}} を使って自身のファイルを他のユーザに「渡す」ことはできません。 |
* root 以外のユーザは {{ic|chown}} を使って自身のファイルを他のユーザに「渡す」ことはできません。 |
||
}} |
}} |
||
394行目: | 394行目: | ||
* [https://serverfault.com/questions/364677/why-is-chmod-r-777-destructive Why is "chmod -R 777 /" destructive?] |
* [https://serverfault.com/questions/364677/why-is-chmod-r-777-destructive Why is "chmod -R 777 /" destructive?] |
||
* [https://web.archive.org/web/20210724233134/https://security.ias.edu/node/441 The How and Why of User Private Groups in Unix] |
* [https://web.archive.org/web/20210724233134/https://security.ias.edu/node/441 The How and Why of User Private Groups in Unix] |
||
+ | |||
+ | {{TranslationStatus|File permissions and attributes|2023-08-15|785253}} |
2024年8月2日 (金) 12:04時点における最新版
ファイルシステムは、パーミッションと属性を使って、どの程度のレベルでシステムのプロセスがファイルやディレクトリとやり取りできるかを規定します。
目次
パーミッションの表示
ls コマンドの -l
オプションを使えば、ディレクトリのコンテンツのパーミッション (ファイルのモード とも) を確認できます。例:
$ ls -l /path/to/directory
total 128 drwxr-xr-x 2 archie archie 4096 Jul 5 21:03 Desktop drwxr-xr-x 6 archie archie 4096 Jul 5 17:37 Documents drwxr-xr-x 2 archie archie 4096 Jul 5 13:45 Downloads -rw-rw-r-- 1 archie archie 5120 Jun 27 08:28 customers.ods -rw-r--r-- 1 archie archie 3339 Jun 27 08:28 todo -rwxr-xr-x 1 archie archie 2048 Jul 6 12:56 myscript.sh
1番目の列に注目してください。例えば drwxrwxrwx+
という値であれば、それぞれの文字の意味は以下の様のようになります:
d
|
rwx
|
rwx
|
rwx
|
+
|
ファイルの種類。技術的にはパーミッションの一部ではありません。ここに入りうる値の説明は info ls -n "What information is listed" を参照してください。
|
このファイルに対して所有者が持っているパーミッション。以下で説明されています。 | このファイルに対してグループが持っているパーミッション。以下で説明されています。 | このファイルに対してその他のユーザが持っているパーミッション。以下で説明されています。 | 代替のアクセス手法がこのファイルに対して適用されているかどうかを示す単一の文字。この文字が空白ならば、代替のアクセス手法は適用されていません。. 文字の場合は、ファイルにセキュリティコンテキストが存在しているが、代替のアクセス手法は適用されていないことを示します。代替のアクセス手法がその他の組み合わせで適用されているファイルでは、+ 文字で表されます。例えば、アクセス制御リストの場合です。
|
3つの文字からなるパーミッション (上記の例では rwx
) には、以下の文字のどれかが入ります:
文字 | ファイルに対する効果 | ディレクトリに対する効果 | |
---|---|---|---|
読み取りパーミッション (最初の文字) | -
|
ファイルは読めません。 | ディレクトリの中身は表示できません。 |
r
|
ファイルを読むことができます。 | ディレクトリの中身を表示できます。 | |
書き込みパーミッション (2番目の文字) | -
|
ファイルは変更できません。 | ディレクトリの中身は変更できません。 |
w
|
ファイルを変更できます。 | ディレクトリの中身を変更できます (ここでの変更とは、新しいファイルやディレクトリの作成、既存のファイルやディレクトリの名称変更や削除です)。ただし、実行パーミッションも設定されていなければなりません。さもないと、このパーミッションは効果を持ちません。 | |
実行パーミッション (3番目の文字) | -
|
ファイルは実行できません。 | ディレクトリは cd でアクセスできません。 |
x
|
ファイルを実行できます。 | ディレクトリに cd でアクセスできます。これは、親ディレクトリから事実上 "継承している" とみなすことのできる唯一のパーミッションビットです。事実、親ディレクトリのどれか1つでも x が設定されていないと、パスの最後のファイルやディレクトリにも (それのパーミッションに依らず) アクセスできません。詳細は path_resolution(7) を参照してください。
| |
s
|
ユーザ (user) のパーミッションにある場合は setuid ビット、グループ (group) のパーミッションにある場合は setgid ビットとなります。その他のユーザ (others) のパーミッションには現れません。この文字は、x も設定されていることを意味します。
| ||
S
|
s と同じですが、x は設定されていません。通常のファイルで使われることは滅多になく、ディレクトリでは意味がありません。
| ||
t
|
スティッキービットです。その他のユーザ (others) のパーミッションにしか現れません。この文字は、x も設定されていることを意味します。
| ||
T
|
t と同じですが、x は設定されていません。通常のファイルで使われることは滅多にありません。
|
詳細は info Coreutils -n "Mode Structure"
と chmod(1) を見てください。
サンプル
いくつか例を見て、理解を深めましょう:
drwx------ 6 archie archie 4096 Jul 5 17:37 Documents
上記の場合、Archie は Documents
ディレクトリへの完全なアクセス権を持っています。Archie は、Documents 内のファイルを (そのファイルのパーミッションに依らず) 一覧表示、名称変更、削除することができ、さらにファイルを Documents 内に作成することができます。しかし、ファイル自体にアクセス (つまり、読み書き実行) できるかどうかは、そのファイルのパーミッションに依ります。
dr-x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie はファイルの作成、名称変更、削除ができませんが、それ以外なら可能です。Archie は Documents 内のファイルを一覧表示することができ、Documents 内のファイルに (そのファイルのパーミッションで許可されているならば) アクセスできます。
d-wx------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie は Documents
ディレクトリ内で ls
を実行することができませんが、ディレクトリ内の特定のファイルの名前を知っているならば、そのファイルを一覧表示、名称変更、削除することができ、さらに (そのファイルのパーミッションで許可されているならば) アクセスすることができます。また、新しいファイルを作成することもできます。
d--x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie は、Documents
ディレクトリ内のファイルのうち、名前を知っているものにアクセスすることしかできません (ただし、そのファイルのパーミッションで許可されている場合に限る)。ディレクトリ内のファイルを一覧表示することはできず、ファイルの作成、名称変更、削除もできません。
ここで説明しているのはディレクトリのパーミッションであり、個々のファイルのパーミッションとは関係がありません。新しくファイルを作成したとき、変更があるのはディレクトリです。したがってディレクトリの書き込み権限が必要となります。
今度はディレクトリではなくファイルの例を見てみましょう:
-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
上記の例では最初の文字が d
ではなく -
になっていることが確認できます。なので、これはディレクトリではなくファイルであることを知ることができます。次に所有者のパーミッションは rw-
なので所有者はファイルの読み書きができますが実行することはできません。所有者が3つのパーミッション全てを得ていないことはおかしく思えるかもしれませんが、x
パーミッションは Gedit や Emacs などのテキストエディタから読むテキストファイル、あるいは R などのソフトウェアから読み込むデータファイルでは必要ないパーミッションです (python のコードなどが入っている場合は実行権限が与えられることがあります)。グループのパーミッションは r--
に設定されており、所有グループはファイルを読むことはできても編集することができません。何かを読み取り専用に設定することは重要です。他のユーザーのパーミッションはグループと同じに設定されています。
パーミッションの変更
chmod は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション (アクセスモード (mode) とも) を変更 (change) することができます。
文字を使う方法
ファイルのパーミッション (アクセスモード とも) を変更するにはターミナルで chmod コマンドを使います。以下はコマンドの一般的な使い方です:
chmod who=パーミッション ファイル名
who
は、パーミッションを与える対象を指定する文字です。以下のどれかになります:
u
: そのファイルを所有するユーザー。g
: そのファイルが所属するユーザーグループ。o
: その他 (other) のユーザー。つまり、その他全員。a
: 上記全て。ugo
と入力する代わりとして使えます。
ここでのパーミッションとは、#パーミッションの表示 で説明しているのと同じです (r
、w
、x
)。
それではコマンドを使用例を見てみましょう。Documents ドキュメントを守るために、このディレクトリであなた以外の全員が読み書きと実行 (この場合は検索ともいえます) を行えないようにするには:
前: drwxr-xr-x 6 archie web 4096 Jul 5 17:37 Documents
$ chmod g= Documents $ chmod o= Documents
後: drwx------ 6 archie web 4096 Jul 6 17:32 Documents
上記ではパーミッションを取り去るために、=
の後に何も文字を入力していません。所有者のパーミッションだけ rwx
となり、他のパーミッションは全て -
に変更されたことが確認できます。
上記の設定は以下のコマンドで元に戻すことができます:
前: drwx------ 6 archie web 4096 Jul 6 17:32 Documents
$ chmod g=rx Documents $ chmod o=rx Documents
後: drwxr-xr-x 6 archie web 4096 Jul 6 17:32 Documents
次の例では、グループとその他のユーザに対して読み込みと実行のパーミッションを与えてみます。つまり、=
の後にパーミッションの文字 (r
と x
) を入れます (スペース無しで)。
who
に複数の文字を入力することで、これを行うことができます。例えば:
$ chmod go=rx Documents
次に、2番目の例を考えてみましょう。たとえば、foobar
ファイルを変更して、読み取りと書き込みのアクセス許可を与え、web
グループの同僚が作業している可能性があると仮定します。foobar
は読み取りと書き込みもできますが、他のユーザーは読み取りしかできません:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g=rw foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します (権限を付与する例を全て示すため)。
文字を使う方法のショートカット
chmod コマンドでは =
の代わりに +
または -
を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを r--
から rw-
に変更する場合でも上記のコマンドを使うときは chmod コマンドの =
の後に w
だけでなく r
も必要です。r
を指定しなかった場合、r
のパーミッションが消えてしまいます。+
と -
を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。
前記のグループに書き込みパーミッションを与える例を +
と -
で試してみましょう:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g+w foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
また、全てのユーザー (a) から書き込み権限を奪いたい場合:
前: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod a-w foobar
後: -r--r--r-- 1 archie web 5120 Jun 27 08:28 foobar
別のショートカットは特殊な X
モードです。これは実際のファイルモードではありませんが、多くの場合、-R
オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります:
$ chmod -R a+rX ./data/
パーミッションのコピー
chmod で、あるクラスから別のクラスにパーミッションをコピーすることも可能です (例えば、所有者のパーミッションをグループにコピーする)。そうするには、=
の後に、r
や w
、x
ではなく、もう一つの who 文字を入れてください。例えば:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g=u foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
このコマンドは基本的に、"グループのアクセス許可を変更 (g=
) して、所有ユーザー (=u
) と同じにします。ただし、パーミッションのセットをコピーして、なおかつ新しいパーミッションを付与するというようなことはできません。例えば:
$ chmod g=wu foobar
この場合、chmod はエラーを吐きます。
数字を使う方法
chmod では数字を使ってパーミッションを設定することもできます。
数字を使えば、所有者、グループ、そしてその他のユーザのパーミッション全て、さらに setuid、setgid、そしてスティッキービットも一度に設定できます。基本的な使い方は以下のとおりです:
$ chmod xxx ファイル名
ここで、xxx
は3桁の数字で、各桁は0から7までのどれかです。最初の桁は所有者のパーミッション、2桁目はグループのパーミッション、そして3桁目はその他のユーザのパーミッションです。
この数字表記では、r
、w
、そして x
はそれぞれ独自の数字を持ちます:
r=4 w=2 x=1
3桁の数字を計算するには、所有者、グループ、そしてユーザーにどのようなアクセス許可を付与するかを検討し、それらの値を合計する必要があります。例えば、ディレクトリの所有者には読み書きと実行のパーミッション、グループとその他のユーザには読み込みと実行のパーミッションのみを与える場合、数字は以下のようになります:
- 所有者:
rwx
=4+2+1=7 - グループ:
r-x
=4+0+1=5 - その他:
r-x
=4+0+1=5
$ chmod 755 ファイル名
これは、以下の2つのコマンドを実行したときと等価です:
$ chmod u=rwx ファイル名 $ chmod go=rx ファイル名
ファイルやディレクトリのパーミッションを数字形式で見るには、stat(1) コマンドを使ってください:
$ stat -c %a filename
%a オプションは出力を数字形式にするという意味です。
ほとんどのフォルダとディレクトリは 755
に設定され、所有者には読み取り、書き込み、実行を許可しますが、それ以外のすべてのユーザーには書き込みを拒否します。ファイルは通常 644
で、所有者には読み取りと書き込みを許可しますが、他のすべてのユーザーには読み取りだけを許可します。実行可能ファイル以外では x
パーミッションがないという最後のノートを参照してください。ここでも同じです。
理解するために、数字形式を使って前回の例と同じことをしてみましょう:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod 664 foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
所有者とグループに実行パーミッションを与えたい場合、数字は 774
になります。全員に読み込みパーミッションのみを与えたい場合は、444
になります。chmod xxx filename
で使うための数字を計算する最も簡単な方法は、r
を 4、w
を 2、x
を 1 として扱うことでしょう。しかし、それぞれのパーミッションを2進数として扱い、その後で数字に変換する方法もあります。この方法は少し複雑ですが、完全を期すために言及しておきましょう。
以下のパーミッション組を考えてみましょう:
-rwxr-xr--
与えるパーミッションに1を、与えないパーミッションに0を置くと、以下のようになります:
-rwxrwxr-x 111111101
そして、これらの2進数を変換します:
000=0 100=4 001=1 101=5 010=2 110=6 011=3 111=7
よって、結果は 775 となります。
グループから書き込みパーミッションを取り除いてみましょう:
-rwxr-xr-x 111101101
よって、結果は 755 となり、書き込みパーミッションを取り除くには chmod 755 filename
を実行すれば良いことになります。どの方法をとっても同じ3桁の数字が得られます。文字を使うか数字を使うかは個人の好みと入力速度に依ります。ディレクトリやファイルのパーミッションをデフォルトに戻したい場合 (例えば、所有者に読み書き (と実行権限) を与え、それ以外には書き込み権限を与えない)、chmod 755/644 filename
を使うほうが速いかもしれません。しかし、通常とは異なるパーミッションに変更する場合は、パーミッションを数字に変換するよりも、文字を使う方法をとったほうがシンプルで速いかもしれません (それに、数字を使う方法は間違いを犯す可能性があります)。たまにしか chmod を使わないユーザにとっては、どちらの方法をとったとしても対して速度に違いはないという主張もあるでしょう。
数字を使えば、4桁で setuid
ビット、setgid
ビット、そして sticky
ビットも設定できます。
setuid=4 setgid=2 sticky=1
例えば、chmod 2777 filename
は、全員に対して読み/書き/実行ビットを設定し、さらに setgid
ビットも有効化します。
まとめて chmod
一般に、ディレクトリとファイルの両方に同じパーミッションを設定することはありません。ディレクトリツリー内のパーミッションを一括で変更する必要がある場合は、find を使って選択的に修正してください。
ディレクトリのパーミッションだけを 755 に変更するには:
$ find ディレクトリ -type d -exec chmod 755 {} +
ファイルのパーミッションだけを 644 に変更するには:
$ find ディレクトリ -type f -exec chmod 644 {} +
所有者の変更
chown はファイルやディレクトリの所有者を変更します。これは、場合によってはパーミッションの変更よりも速くて簡単です。
以下の例では、GParted を使ってバックアップデータ用の新しいパーティションを作成しています。Gparted はデフォルトで全てを root として実行するため、ファイルの所有者が全て root になります。これ自体は全く問題ないのですが、マウントされたパーティションにデータを書き込むとなると、通常ユーザはアクセスが拒否されてしまいます。
brw-rw---- 1 root disk 8, 9 Jul 6 16:02 sda9 drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
見ての通り、/dev
内のデバイスは root によって所有されており、それはマウントポイント (/media/Backup
) でも然りです。以下を実行することで、マウントポイントの所有者を変更することができます:
前: drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
# chown archie /media/Backup
後: drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup
これで、パーミッションを変更することなく、新しい所有者である archie がこのパーティションにデータを書き込めるようになりました (所有者のパーミッションは rwx
であるため)。
アクセス制御リスト
アクセス制御リストは、任意のユーザやグループに対するパーミッションをファイルに設定できるようにすることで、ファイルシステムに柔軟なパーミッション機構を追加します。
Umask
umask ユーティリティを使うことでファイル作成モードマスクを制御することができ、新しくファイルを作成したときのファイルパーミッションの初期値を決めることができます。
ファイルの属性
ユーザーやグループの読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性をファイルシステムがサポートしている場合があります。
e2fsprogs パッケージには、lsattr(1) と chattr(1) というプログラムが含まれています。前者はファイルの属性を一覧表示し、後者は属性を変更します。
いくつか便利な属性があります。全てのファイルシステムが以下の全てをサポートしているわけではありません。
a
- 追加のみ: ファイルは追加 (append) 専用でしか開けなくなります。c
- 圧縮済み: ファイルに対してファイルシステムレベルでの圧縮を有効化します。i
- 変更不可: 変更、削除、名称変更が禁止され、さらにそのファイルにリンクを張ることができなくなります。root のみがこれを設定できます。j
- データのジャーナリング: ファイルデータの書き込みとメタデータに対してジャーナルを使用します。m
- 圧縮をしない: ファイルに対してファイルシステムレベルでの圧縮を無効化します。A
- atime を更新しない: ファイルの atime が変更されなくなります。C
- コピーオンライトをしない: コピーオンライトを無効化します (ファイルシステムがコピーオンライトをサポートしている場合)。
属性の完全なリストとそれぞれの属性の詳細は chattr(1) を参照してください。
例えば、とあるファイルに変更不可のビットを設定したい場合は、以下のコマンドを使用してください:
# chattr +i /path/to/file
ファイルから属性を取り除くには、+
を -
に変更してください。
拡張属性
拡張属性 を見てください。
ヒントとテクニック
Preserve root
--preserve-root
フラグを使うことで chmod
を /
で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、エイリアスで設定すると良いでしょう。[1] も参照。