「ファイルのパーミッションと属性」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→拡張属性の保存: 飜訳) |
Kusanaginoturugi (トーク | 投稿記録) (→所有権を変更: 校正) |
||
308行目: | 308行目: | ||
== 所有権を変更 == |
== 所有権を変更 == |
||
− | [[Wikipedia:chown|chown]] はファイルやディレクトリの所有者を変更します。場合によってはパーミッションの変更よりも簡単です。 |
+ | [[Wikipedia:chown|chown]] はファイルやディレクトリの所有者を変更します。これは、場合によってはパーミッションの変更よりも簡単です。 |
以下の例では、[[GParted]] を使ってバックアップデータ用に新しいパーティションを作成しています。Gparted は全てを root で実行するためファイルの所有者が全て root になります。通常ユーザーがパーティションをマウントしてデータを書き込もうとすると、パーミッションによって拒否されてしまいます。 |
以下の例では、[[GParted]] を使ってバックアップデータ用に新しいパーティションを作成しています。Gparted は全てを root で実行するためファイルの所有者が全て root になります。通常ユーザーがパーティションをマウントしてデータを書き込もうとすると、パーミッションによって拒否されてしまいます。 |
||
323行目: | 323行目: | ||
アフター: {{ic|drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup}} |
アフター: {{ic|drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup}} |
||
− | これで、パーミッションを変更することなく、新しい所有者であるarchieがパーティションにデータを書き込むことができます(所有者triadはすでにrwxアクセス許可を持っていたので)。 |
+ | これで、パーミッションを変更することなく、新しい所有者である archie がパーティションにデータを書き込むことができます(所有者 triad はすでに {{ic|rwx}} アクセス許可を持っていたので)。 |
{{Note| |
{{Note| |
||
* {{ic|chown}} は常に setuid と setgid ビットを消去します。 |
* {{ic|chown}} は常に setuid と setgid ビットを消去します。 |
||
− | * root 以外のユーザーは {{ic|chown}} を使ってファイル |
+ | * root 以外のユーザーは {{ic|chown}} を使って、自分が所有するファイルを他のユーザーに「譲渡」するために使用することはできません |
}} |
}} |
||
2022年10月10日 (月) 09:49時点における版
ファイルシステムはパーミッションや属性を使ってシステムプロセスが処理できるファイルやディレクトリのレベルを規定します。
目次
パーミッションの表示
ls コマンドの -l
オプションを使ってディレクトリの中身のパーミッション (あるいはファイルモード) を確認できます。例:
$ ls -l /path/to/directory
total 128 drwxr-xr-x 2 archie users 4096 Jul 5 21:03 Desktop drwxr-xr-x 6 archie users 4096 Jul 5 17:37 Documents drwxr-xr-x 2 archie users 4096 Jul 5 13:45 Downloads -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 customers.ods -rw-r--r-- 1 archie users 3339 Jun 27 08:28 todo -rwxr-xr-x 1 archie users 2048 Jul 6 12:56 myscript.sh
最初のカラムが一番重要です。例えば drwxrwxrwx+
という値であれば、それぞれの文字の意味は以下の表のようになります:
d
|
rwx
|
rwx
|
rwx
|
+
|
ファイルのタイプ。技術的にはパーミッションではありません。値については info ls -n "What information is listed" を参照してください。
|
ファイルの所有者のパーミッション。下を参照。 | ファイルのグループのパーミッション。下を参照。 | ファイルの所有者でないユーザーのパーミッション。下を参照。 | 他のアクセスメソッドがファイルに適用されているかどうか表す文字。この文字が空白のとき、他のアクセスメソッドは存在しません。. という文字はファイルにセキュリティコンテキストが付与されていることを表します。他のアクセスメソッドが使われていると、+ の文字で表されます (アクセス制御リストの場合)。
|
三組のパーミッション文字列 (上記の例なら rwx
) は以下の文字によって構成されます:
文字 | ファイルの場合 | ディレクトリの場合 | |
---|---|---|---|
読み取り権限 (最初の文字) | -
|
ファイルを読み込むことができません。 | ディレクトリの中身を表示することができません。 |
r
|
ファイルを読み込むことができます。 | ディレクトリの中身を表示することができます。 | |
書き込み権限 (二番目の文字) | -
|
ファイルを変更することができません。 | ディレクトリの中身を変更することができません。 |
w
|
ファイルを変更することができます。 | ディレクトリの中身を変更することができます (新しいファイルやフォルダを作成したり、既存のファイルやフォルダの名前を変更したり削除するなど)。実行権限も設定されていないと、このパーミッションは反映されません。 | |
実行権限 (三番目の文字) | -
|
ファイルを実行することができません。 | ディレクトリを cd で開くことができません。 |
x
|
ファイルを実行できます。 | ディレクトリを cd で開くことができます。親のディレクトリから継承を行う唯一のパーミッションビットです。パス内の全てのフォルダに 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 users 4096 Jul 5 17:37 Documents
上記の場合 Archie は Documents ディレクトリの完全なアクセス権を持っています。Archie は Documents に入っているファイルを確認したりファイルを作成・削除することが可能です。ファイルのパーミッションは関係ありません。ファイルにアクセスできるかどうかはファイルのパーミッションによって決まります。
dr-x------ 6 archie users 4096 Jul 5 17:37 Documents
Archie はファイルを作成・削除したり名前を変更することができません。Documents の中にどんなファイルが入っているのか確認したり、(ファイルの読み込み権限があれば) 既存のファイルにアクセスすることは可能です。
d-wx------ 6 archie users 4096 Jul 5 17:37 Documents
Archie は Documents の中を 'ls' することはできませんが、ファイルの名前がわかっていれば名前を変更したり削除したり (ファイルの読み込み権限があれば) アクセスすることはできます。また、新しいファイルを作ることも同様にできます。
d--x------ 6 archie users 4096 Jul 5 17:37 Documents
Documents の中のファイルで Archie がアクセスできるのは名前を知っているファイルだけです (ファイルの読み込み権限が必要)。中に入っているファイルを一覧したり作成・削除することはできません。
ここで説明しているのはディレクトリのパーミッションであり、個々のファイルのパーミッションとは関係がありません。新しくファイルを作成したとき、変更があるのはディレクトリです。したがってディレクトリの書き込み権限が必要となります。
今度はディレクトリではなくファイルの例を見てみましょう:
-rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
上記の例では最初の文字が d
ではなく -
になっていることが確認できます。最初の文字からディレクトリではなくファイルであることを知ることができます。次に所有者のパーミッションは rw-
なので所有者はファイルの読み書きができますが実行することはできません。所有者が3つのパーミッション全てを得ていないことはおかしく思えるかもしれませんが、x
パーミッションは Gedit や Emacs などのテキストエディタから読むテキストファイル、あるいは R などのソフトウェアから読み込むデータファイルでは必要ないパーミッションです (python のコードなどが入っている場合は実行権限が与えられることがあります)。グループのパーミッションは r--
に設定されており、所有グループはファイルを読むことはできても編集することができません。何かを読み取り専用に設定することは重要です。他のユーザーのパーミッションはグループと同じに設定されています。
パーミッションを変更
chmod は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション (もしくはアクセスモード) を変更することができます (change mode)。
テキストを使う方法
ファイルのパーミッション (あるいはアクセスモード) を変更するにはターミナルで chmod コマンドを使います。以下はコマンドの一般的な使い方です:
chmod who=permissions filename
who
はパーミッションを与える対象を指定する文字です。以下のどれかになります:
u
: ファイルを所有するユーザー。g
: ファイルが所属するグループ。o
: 他 (other) のユーザー。つまり、全てのユーザー。a
: 上記の全て (all)。ugo
と入力する代わりにa
で指定できます。
設定するパーミッションは #パーミッションの表示 で説明しているのと同じです (r
, w
, x
)。
それではコマンドを使用例を見てみましょう。Documents ディレクトリを守るためにあなた以外のユーザーが読み書きや実行 (この場合は検索) ができないようにしたい場合:
ビフォー: drwxr-xr-x 6 archie users 4096 Jul 5 17:37 Documents
$ chmod g= Documents $ chmod o= Documents
アフター: drwx------ 6 archie users 4096 Jul 6 17:32 Documents
上記ではパーミッションを取り去るために、=
の後に何も文字を入力していません。所有者のパーミッションだけ rwx
となり、他のパーミッションは全て -
に変更されたことが確認できます。
上記の設定は以下のコマンドで元に戻すことができます:
ビフォー: drwx------ 6 archie users 4096 Jul 6 17:32 Documents
$ chmod g=rx Documents $ chmod o=rx Documents
アフター: drwxr-xr-x 6 archie users 4096 Jul 6 17:32 Documents
グループと他のユーザーに読み込み・実行権限を与えるために、=
の後にパーミッションの文字 (r
と x
) を記入しています。空白は入れません。
who
に複数の文字を入力することでコマンドをひとつにまとめることができます。例:
$ chmod go=rx Documents
次に、2番目の例を考えてみましょう。たとえば、foobar
ファイルを変更して、読み取りと書き込みのアクセス許可を与え、グループ users
の同僚が作業している可能性があると仮定します。 foobar
は読み取りと書き込みもできますが、他のユーザーは読み取りしかできません。
Before: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g=rw foobar
After: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します。(すべての権限を付与する例を示すため)
テキストを使う方法のショートカット
chmod コマンドでは =
の代わりに +
または -
を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを r--
から rw-
に変更する場合でも上記のコマンドを使うときは chmod コマンドの =
の後に w
だけでなく r
も必要です。r
を指定しなかった場合、r
のパーミッションが消えてしまいます。+
と -
を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。
前記のグループに書き込みパーミッションを与える例を +
と -
で試してみましょう:
ビフォー: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g+w foobar
アフター: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
また、全てのユーザー (a) から書き込み権限を奪いたい場合:
ビフォー: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod a-w foobar
アフター: -r--r--r-- 1 archie users 5120 Jun 27 08:28 foobar
別のショートカットは特殊な X
モードです。これは実際のファイルモードではありませんが、多くの場合、-R
オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります。
$ chmod -R a+rX ./data/
パーミッションのコピー
chmod に1つのクラスから許可をコピーするように指示し、所有者になって、グループまたはすべてに同じ許可を与えることができます。 これを行うには、=
の後に r
、w
、または x
を配置する代わりに、別の who を配置します 文字。 例えば:
Before: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g=u foobar
After: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
このコマンドは基本的に、"グループのアクセス許可を変更 (g=
) して、所有ユーザー (=u
) と同じにします。パーミッションのセットをコピーしたり、新しいパーミッションを付与したりすることはできません。
$ chmod g=wu foobar
その場合、 chmod はエラーを出します。
数字を使う方法
chmod では数字を使ってパーミッションを設定することもできます。
数字を使用する場合、所有者とグループ、その他のユーザーのパーミッションを同時に編集することができます。コマンドは以下のようになります:
$ chmod xxx filename
xxx
は3桁の数字になります。各桁の数字は0から7までのどれかになります。1番目の数字は所有者のパーミッション、2番目の数字は所有グループのパーミッション、3番目の数字は他のユーザーのパーミッションになります。
この数値表記では、値 r
、w
、および x
にそれぞれ独自の数値を持ちます。
r=4 w=2 x=1
3桁の数字を考え出すには、所有者、グループ、ユーザーにどのようなアクセス許可を付与するかを検討し、それらの値を合計する必要があります。 たとえば、ディレクトリの所有者に読み取りと書き込みのアクセス許可を付与し、グループと他のすべてのユーザーに読み取りと実行のアクセス許可のみを付与する場合、次のような数値が考えられます。
- Owner:
rwx
=4+2+1=7 - Group:
r-x
=4+0+1=5 - Other:
r-x
=4+0+1=5
$ chmod 755 filename
これは、以下を使用することと同等です。
$ chmod u=rwx filename $ chmod go=rx filename
ほとんどのフォルダとディレクトリは 755
に設定され、所有者には読み取り、書き込み、実行を許可しますが、それ以外のすべてのユーザーには書き込みを拒否します。ファイルは通常 644
で、所有者には読み取りと書き込みを許可しますが、他のすべてのユーザーには読み取りだけを許可します。実行可能ファイル以外では x
パーミッションがないという最後の注意を参照してください。
例を使用してこれを実際に見るには、使用されている前の例を検討してください。代わりに、この数値手法が適用されています。
ビフォー: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod 664 foobar
アフター: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
これが実行可能ファイルの場合、所有者とグループに実行可能権限を付与するには、番号は 774
になります。また、すべてのユーザーに読み取り権限のみを与えたい場合は、番号を 444
にします。r
を4、w
を2、x
を1として処理する方法は、chmod xxx ファイル名
を使用するための数値を算出する最も簡単な方法ですが、各権限に2進数を割り当て、それを数値に変換する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 に chmod するには:
$ find directory -type d -exec chmod 755 {} +
ファイルだけを 644 に chmod するには:
$ find directory -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
マウントされているディレクトリ (/media/Backup
) と同じように、/dev
のデバイスの所有者も root になっていることが確認できます。マウントされているディレクトリの所有者を変更するには以下を実行:
ビフォー: 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 がパーティションにデータを書き込むことができます(所有者 triad はすでに rwx
アクセス許可を持っていたので)。
アクセス制御リスト
アクセス制御リストはファイルシステムに柔軟なパーミッション機構を追加し、あらゆるユーザーやグループにあらゆるファイルのパーミッションを設定することができます。
アクセス制御リストがあるかどうかは ls コマンドの出力にプラス記号 (+
) があるかで確認できます。
Umask
umask ユーティリティを使うことでファイル作成モードマスクを制御することができ、新しくファイルを作成したときのファイルパーミッションの初期値を決めることができます。
ファイルの属性
ユーザーやグループの読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性をファイルシステムがサポートしている場合があります。このセクションではそれらの属性を使用する方法を説明します。
e2fsprogs パッケージには、lsattr(1) と chattr(1) というプログラムが含まれており、ファイルの属性を確認したり変更することができます。
全てのファイルシステムで反映されるわけではありませんが、以下の属性を使用することができます:
a
: 追記のみc
: 圧縮d
: ダンプしないe
: 拡張フォーマットi
: 変更不可j
: データのジャーナリングs
: 安全な消去t
: 末尾のマージをしないu
: 削除不可A
: アクセス日時を更新しないC
: コピーオンライトしないD
: ディレクトリの同期更新S
: 同期更新T
: ディレクトリ階層のトップ
例えば、特定のファイルに変更不可ビットを設定したい場合、次のコマンドを使用:
# chattr +i /path/to/file
ファイルから属性を削除したいときは +
を -
に変更してください。
拡張属性
attr(5) より: "拡張属性とはファイルやディレクトリに関連付けられる name:value のペアである。拡張属性には4つのクラスがある: security, system, trusted, user"。
ユーザー拡張属性
ユーザー拡張属性を使うことでファイルに任意の情報を保存できます。ユーザー拡張属性を作成するには:
$ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.bar
拡張属性を表示するには getfattr を使用:
$ getfattr -d foo.bar
# file: foo.bar user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"
拡張属性の保存
コマンド | 必須フラグ |
---|---|
cp |
--preserve=mode,ownership,timestamps,xattr
|
mv |
preserves by default1 |
tar |
--xattrs for creation and --xattrs-include='*' for extraction
|
bsdtar |
-p for extraction
|
rsync | --xattrs
|
- ターゲットファイルシステムが拡張属性をサポートしていない場合、mv は拡張属性をサイレントに破棄します。
テキストエディタで拡張属性を保持するには、rename(2) を使用する代わりに、保存時にファイルを切り捨てるように設定する必要があります。[1]
ヒントとテクニック
ルートの保護
--preserve-root
フラグを使うことで chmod
を /
で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、エイリアスで設定すると良いでしょう。[2] も参照。