「ファイルのパーミッションと属性」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎ルートの保護: セクション名を修正)
128行目: 128行目:
 
上記の例では最初の文字が {{ic|d}} ではなく {{ic|-}} になっていることが確認できます。なので、これはディレクトリではなくファイルであることを知ることができます。次に所有者のパーミッションは {{ic|rw-}} なので所有者はファイルの読み書きができますが実行することはできません。所有者が3つのパーミッション全てを得ていないことはおかしく思えるかもしれませんが、{{ic|x}} パーミッションは Gedit や [[Emacs]] などのテキストエディタから読むテキストファイル、あるいは [[R]] などのソフトウェアから読み込むデータファイルでは必要ないパーミッションです (python のコードなどが入っている場合は実行権限が与えられることがあります)。グループのパーミッションは {{ic|r--}} に設定されており、所有グループはファイルを読むことはできても編集することができません。何かを読み取り専用に設定することは重要です。他のユーザーのパーミッションはグループと同じに設定されています。
 
上記の例では最初の文字が {{ic|d}} ではなく {{ic|-}} になっていることが確認できます。なので、これはディレクトリではなくファイルであることを知ることができます。次に所有者のパーミッションは {{ic|rw-}} なので所有者はファイルの読み書きができますが実行することはできません。所有者が3つのパーミッション全てを得ていないことはおかしく思えるかもしれませんが、{{ic|x}} パーミッションは Gedit や [[Emacs]] などのテキストエディタから読むテキストファイル、あるいは [[R]] などのソフトウェアから読み込むデータファイルでは必要ないパーミッションです (python のコードなどが入っている場合は実行権限が与えられることがあります)。グループのパーミッションは {{ic|r--}} に設定されており、所有グループはファイルを読むことはできても編集することができません。何かを読み取り専用に設定することは重要です。他のユーザーのパーミッションはグループと同じに設定されています。
   
== パーミッション変更 ==
+
== パーミッション変更 ==
   
[[Wikipedia:chmod|chmod]] は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション (もしくはアクセスモード) を変更することができます (''ch''ange ''mod''e)。
+
[[Wikipedia:ja:chmod|chmod]] は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション (アクセスモード (''mod''e) とも) を変更 (''ch''ange) することができます
   
=== テキストを使う方法 ===
+
=== 文字を使う方法 ===
   
ファイルのパーミッション (あるいは''アクセスモード'') を変更するにはターミナルで ''chmod'' コマンドを使います。以下はコマンドの一般的な使い方です:
+
ファイルのパーミッション (''アクセスモード'' とも) を変更するにはターミナルで ''chmod'' コマンドを使います。以下はコマンドの一般的な使い方です:
   
chmod ''who''=''permissions'' ''filename''
+
chmod ''who''=''パーミッション'' ''ファイル名''
   
{{ic|''who''}} はパーミッションを与える対象を指定する文字です。以下のどれかになります:
+
{{ic|''who''}} はパーミッションを与える対象を指定する文字です。以下のどれかになります:
   
* {{ic|u}}: ファイルを所有する[[ユーザーとグループ|ユーザー]]。
+
* {{ic|u}}: そのファイルを所有する[[ユーザー]]。
* {{ic|g}}: ファイルが所属する[[ユーザーとグループ|グループ]]。
+
* {{ic|g}}: そのファイルが所属する[[ユーザーグループ]]。
* {{ic|o}}: 他 ('''o'''ther) のユーザー。つまり、全てのユーザー
+
* {{ic|o}}: その他 ('''o'''ther) のユーザー。つまり、その他
* {{ic|a}}: 上記全て ('''a'''ll)。{{ic|ugo}} と入力する代わりに {{ic|a}} で指定できます。
+
* {{ic|a}}: 上記全て。{{ic|ugo}} と入力する代わりとして使えます。
   
設定するパーミッションは [[#パーミッションの表示]] で説明しているのと同じです ({{ic|r}}, {{ic|w}}, {{ic|x}})。
+
ここでのパーミッション[[#パーミッションの表示]] で説明しているのと同じです ({{ic|r}}{{ic|w}}{{ic|x}})。
   
それではコマンドを使用例を見てみましょう。Documents ディレクを守るためにあなた以外のユーザーが読み書き実行 (この場合は検索) ができないようにしたい場合:
+
それではコマンドを使用例を見てみましょう。Documents ドキュメントを守るために、このディレクトリであなた以外の全員が読み書き実行 (この場合は検索ともいえます) を行えないようにするには:
   
ビフォー: {{ic|drwxr-xr-x 6 archie users 4096 Jul 5 17:37 Documents}}
+
: {{ic|drwxr-xr-x 6 archie web 4096 Jul 5 17:37 Documents}}
   
 
$ chmod g= Documents
 
$ chmod g= Documents
 
$ chmod o= Documents
 
$ chmod o= Documents
   
アフター: {{ic|drwx------ 6 archie users 4096 Jul 6 17:32 Documents}}
+
: {{ic|drwx------ 6 archie web 4096 Jul 6 17:32 Documents}}
   
 
上記ではパーミッションを取り去るために、{{ic|1==}} の後に何も文字を入力していません。所有者のパーミッションだけ {{ic|rwx}} となり、他のパーミッションは全て {{ic|-}} に変更されたことが確認できます。
 
上記ではパーミッションを取り去るために、{{ic|1==}} の後に何も文字を入力していません。所有者のパーミッションだけ {{ic|rwx}} となり、他のパーミッションは全て {{ic|-}} に変更されたことが確認できます。
160行目: 160行目:
 
上記の設定は以下のコマンドで元に戻すことができます:
 
上記の設定は以下のコマンドで元に戻すことができます:
   
ビフォー: {{ic|drwx------ 6 archie users 4096 Jul 6 17:32 Documents}}
+
: {{ic|drwx------ 6 archie web 4096 Jul 6 17:32 Documents}}
   
 
$ chmod g=rx Documents
 
$ chmod g=rx Documents
 
$ chmod o=rx Documents
 
$ chmod o=rx Documents
   
アフター: {{ic|drwxr-xr-x 6 archie users 4096 Jul 6 17:32 Documents}}
+
: {{ic|drwxr-xr-x 6 archie web 4096 Jul 6 17:32 Documents}}
   
グループと他のユーザに読み込み実行権限を与えるために、{{ic|1==}} の後にパーミッションの文字 ({{ic|r}} と {{ic|x}}) をしています。空白は入れません
+
次の例では、グループとその他のユーザに対して読み込み実行のパーミッションを与えてみます。つまり、{{ic|1==}} の後にパーミッションの文字 ({{ic|r}} と {{ic|x}}) を入ます (スペース無しで)
   
{{ic|''who''}} に複数の文字を入力することでコマンドひとつにまとめることができます。例:
+
{{ic|''who''}} に複数の文字を入力することで、これ行うことができます。例えば:
   
 
$ chmod go=rx Documents
 
$ chmod go=rx Documents
   
{{Note|1={{ic|chmod}} コマンドで {{ic|''who''}} に入力する文字やパーミッション文字の順番は特に意味をなしません: {{ic|1=chmod go=rx file}} でも {{ic|1=chmod og=xr file}} でも全く同じ意味になります。}}
+
{{Note|{{ic|chmod}} コマンドで {{ic|''who''}} に入力する文字やパーミッション文字の順番は特に意味をなしません: {{ic|1=chmod go=rx file}} でも {{ic|1=chmod og=xr file}} でも全く同じ意味になります。}}
   
次に、2番目の例を考えてみましょう。たとえば、{{ic|foobar}} ファイルを変更して、読み取りと書き込みのアクセス許可を与え、グループ {{ic|users}} の同僚が作業している可能性があると仮定します。 {{ic|foobar}} は読み取りと書き込みもできますが、他のユーザーは読み取りしかできません
+
次に、2番目の例を考えてみましょう。たとえば、{{ic|foobar}} ファイルを変更して、読み取りと書き込みのアクセス許可を与え、{{ic|web}} グループの同僚が作業している可能性があると仮定します。{{ic|foobar}} は読み取りと書き込みもできますが、他のユーザーは読み取りしかできません:
   
Before: {{ic|-rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
 
$ chmod g=rw foobar
 
$ chmod g=rw foobar
   
After: {{ic|-rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します(すべての権限を付与する例を示すため)
+
これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します (権限を付与する例を全て示すため)
   
==== テキストを使う方法のショートカット ====
+
==== 文字を使う方法のショートカット ====
   
 
''chmod'' コマンドでは {{ic|1==}} の代わりに {{ic|+}} または {{ic|-}} を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを {{ic|r--}} から {{ic|rw-}} に変更する場合でも上記のコマンドを使うときは ''chmod'' コマンドの {{ic|1==}} の後に {{ic|w}} だけでなく {{ic|r}} も必要です。{{ic|r}} を指定しなかった場合、{{ic|r}} のパーミッションが消えてしまいます。{{ic|+}} と {{ic|-}} を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。
 
''chmod'' コマンドでは {{ic|1==}} の代わりに {{ic|+}} または {{ic|-}} を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを {{ic|r--}} から {{ic|rw-}} に変更する場合でも上記のコマンドを使うときは ''chmod'' コマンドの {{ic|1==}} の後に {{ic|w}} だけでなく {{ic|r}} も必要です。{{ic|r}} を指定しなかった場合、{{ic|r}} のパーミッションが消えてしまいます。{{ic|+}} と {{ic|-}} を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。
191行目: 191行目:
 
前記のグループに書き込みパーミッションを与える例を {{ic|+}} と {{ic|-}} で試してみましょう:
 
前記のグループに書き込みパーミッションを与える例を {{ic|+}} と {{ic|-}} で試してみましょう:
   
ビフォー: {{ic|-rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}}
 
 
 
$ chmod g+w foobar
 
$ chmod g+w foobar
   
アフター: {{ic|-rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
 
また、全てのユーザー ('''a''') から書き込み権限を奪いたい場合:
 
また、全てのユーザー ('''a''') から書き込み権限を奪いたい場合:
   
ビフォー: {{ic|-rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}}
 
 
 
$ chmod a-w foobar
 
$ chmod a-w foobar
   
アフター: {{ic|-r--r--r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-r--r--r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
別のショートカットは特殊な {{ic|X}} モードです。これは実際のファイルモードではありませんが、多くの場合、{{ic|-R}} オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります
+
別のショートカットは特殊な {{ic|X}} モードです。これは実際のファイルモードではありませんが、多くの場合、{{ic|-R}} オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります:
   
 
$ chmod -R a+rX ./data/
 
$ chmod -R a+rX ./data/
211行目: 211行目:
 
==== パーミッションのコピー ====
 
==== パーミッションのコピー ====
   
'' chmod '' に1つのクラスから許可をコピーするように指示し、所有者になって、グループまたはべてに同じ許可を与えことができます これを行うには、{{ic|1 ==}}の後に {{ic|r}}{{ic|w}}、または {{ic|x}} を配置する代わりにの '' who ''を配置します 文字。 例えば:
+
''chmod'' で、あるクラスから別のクラスにパーミッションをコピーすることも可能です (例えば、所有者のパーミッションをグループにコピーする)するには、{{ic|1==}} の後に{{ic|r}}{{ic|w}}、{{ic|x}} ではなくもう一つの ''who'' 文字を入れてください。例えば:
   
Before: {{ic|-rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
 
$ chmod g=u foobar
 
$ chmod g=u foobar
   
After: {{ic|-rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
このコマンドは基本的に、"グループのアクセス許可を変更 ({{ic|1=g=}}) して、所有ユーザー ({{ic|1==u}}) と同じにします。パーミッションのセットをコピーしたり、新しいパーミッションを付与したりすることはできません。
+
このコマンドは基本的に、"グループのアクセス許可を変更 ({{ic|1=g=}}) して、所有ユーザー ({{ic|1==u}}) と同じにします。ただし、パーミッションのセットをコピーしなおかつ新しいパーミッションを付与するというようなことはできません。例えば:
   
 
$ chmod g=wu foobar
 
$ chmod g=wu foobar
   
の場合、 ''chmod'' はエラーを出します。
+
の場合、''chmod'' はエラーを吐きます。
   
 
=== 数字を使う方法 ===
 
=== 数字を使う方法 ===
229行目: 229行目:
 
''chmod'' では数字を使ってパーミッションを設定することもできます。
 
''chmod'' では数字を使ってパーミッションを設定することもできます。
   
数字を使用する場合、所有者グループ、その他のユーザのパーミッションを同時編集することができます。コマンドは以下のようになす:
+
数字を使えば、所有者グループ、そしてその他のユーザのパーミッション全て、さら setuid、setgid、そしてスティッキービットも一度に設定できます。基本的な使い方は以下のとおす:
   
$ chmod ''xxx'' ''filename''
+
$ chmod ''xxx'' ''ファイル名''
   
{{ic|'''xxx'''}} は3桁の数字になります。各桁の数字は0から7までのどれかになります。1番目数字は所有者のパーミッション、2の数字所有グループのパーミッション、3目の数字は他のユーザのパーミッションになります。
+
ここで、{{ic|'''xxx'''}} は3桁の数字で、各桁は0から7までのどれかす。最初は所有者のパーミッション、2目はグループのパーミッション、そして3はその他のユーザのパーミッションす。
   
この数表記では、{{ic|r}}、{{ic|w}}、および {{ic|x}} それぞれ独自の数を持ちます
+
この数表記では、{{ic|r}}、{{ic|w}}、そして {{ic|x}} それぞれ独自の数を持ちます:
   
 
r=4
 
r=4
241行目: 241行目:
 
x=1
 
x=1
   
3桁の数字を考え出すには、所有者、グループ、ユーザーにどのようなアクセス許可を付与するかを検討し、それらの値を合計する必要があります。 たとえば、ディレクトリの所有者に読み取りと書き込みアクセス許可を付与し、グループと他のすべてのユーザに読み取りと実行のアクセス許可のみをる場合、のような数値が考えられます
+
3桁の数字を計算には、所有者、グループ、そしてユーザーにどのようなアクセス許可を付与するかを検討し、それらの値を合計する必要があります。えば、ディレクトリの所有者に読み書きと実行パーミッション、グループとその他のユーザに読み込みと実行のパーミッションのみを与る場合、数字は以下のようます:
   
* Owner: {{ic|rwx}}=4+2+1=7
+
* 所有者: {{ic|rwx}}=4+2+1=7
* Group: {{ic|r-x}}=4+0+1=5
+
* グループ: {{ic|r-x}}=4+0+1=5
* Other: {{ic|r-x}}=4+0+1=5
+
* その他: {{ic|r-x}}=4+0+1=5
   
$ chmod 755 ''filename''
+
$ chmod 755 ''ファイル名''
   
これは、以下を使用することと等です
+
これは、以下の2つのコマンド実行したと等です:
   
$ chmod u=rwx ''filename''
+
$ chmod u=rwx ''ファイル名''
$ chmod go=rx ''filename''
+
$ chmod go=rx ''ファイル名''
   
  +
ファイルやディレクトリのパーミッションを数字形式で見るには、{{man|1|stat}} コマンドを使ってください:
ほとんどのフォルダとディレクトリは {{ic|755}} に設定され、所有者には読み取り、書き込み、実行を許可しますが、それ以外のすべてのユーザーには書き込みを拒否します。ファイルは通常 {{ic|644}} で、所有者には読み取りと書き込みを許可しますが、他のすべてのユーザーには読み取りだけを許可します。実行可能ファイル以外では {{ic|x}} パーミッションがないという最後の注意を参照してください。
 
   
  +
$ stat -c %a ''filename''
例を使用してこれを実際に見るには、使用されている前の例を検討してください。代わりに、この数値手法が適用されています。
 
   
  +
%a オプションは出力を数字形式にするという意味です。
ビフォー: {{ic|-rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar}}
 
  +
  +
ほとんどのフォルダとディレクトリは {{ic|755}} に設定され、所有者には読み取り、書き込み、実行を許可しますが、それ以外のすべてのユーザーには書き込みを拒否します。ファイルは通常 {{ic|644}} で、所有者には読み取りと書き込みを許可しますが、他のすべてのユーザーには読み取りだけを許可します。実行可能ファイル以外では {{ic|x}} パーミッションがないという最後のノートを参照してください。ここでも同じです。
  +
  +
理解するために、数字形式を使って前回の例と同じことをしてみましょう:
  +
  +
前: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
 
$ chmod 664 foobar
 
$ chmod 664 foobar
   
アフター: {{ic|-rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar}}
+
: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}}
   
これが実行可能ファイルの場合、所有者とグループに実行可能権限するには番号は {{ic|774}} になります。また、すべてのユーザーに読み取り権限のみを与えたい場合は、番号を {{ic|444}} にます。{{ic|r}} を4、{{ic|w}} を2、{{ic|x}} を1として処理する方法は{{ic|chmod ''xxx'' ''ファイル名''}} を使用するため数値算出する最も簡単な方法ですが、各権限に2進数を割り当て、それをに変換する2進法もあります。もう少し複雑ですが、ここでは完全性のために説明しま
+
所有者とグループに実行パーミッションを与えたい場合数字は {{ic|774}} になります。全員に読み込みパーミッションのみを与えたい場合は、{{ic|444}} になります。{{ic|chmod ''xxx'' ''filename''}} で使うための数字を計算する最も簡単な方法は、{{ic|r}} を 4、{{ic|w}} を 2、{{ic|x}} を 1 として扱うことでしょう。しかしそれぞれパーミッションを2進数とし扱い、その後でに変換する法もあります。この方法は少し複雑ですが、完全を期すために言及ておきしょう
   
  +
以下のパーミッション組を考えてみましょう:
次の権限セットを検討してください。
 
   
 
-rwxr-xr--
 
-rwxr-xr--
   
許可された各許可の下に1を、許可されていないすべての許可対して0を置くと、結果は次のようになります
+
与えるパーミッションに1を、与えないパーミッションに0を置くと、以下のようになります:
   
 
-rwxrwxr-x
 
-rwxrwxr-x
 
111111101
 
111111101
   
次に、これらの2進数を変換できます
+
そして、これらの2進数を変換ます:
   
 
000=0 100=4
 
000=0 100=4
282行目: 288行目:
 
011=3 111=7
 
011=3 111=7
   
したがって、上記の値は775なります。
+
って、結果 775なります。
   
グループから書き込み可能な権限した場合。
+
グループから書き込みパーミッション取り除いてみましょう:
   
 
-rwxr-xr-x
 
-rwxr-xr-x
 
111101101
 
111101101
したがって、値は755となり、{{ic|chmod 755 ''filename''}} を使用して書き込み可能な権限を削除します。 どの方法を使用しても、同じ3桁の数字が表示されます。 テキストと数字のどちらを使用するかは、個人の好みと入力速度に依存します。 ディレクトリまたはファイルをデフォルトのアクセス許可に復元する場合。 所有者には読み取りと書き込み(および実行)のアクセス許可を付与しますが、他のすべてのユーザーには書き込みのアクセス許可を拒否します。{{ic|chmod 755/644 ''filename''}} を使用する方が速い場合があります。 ただし、権限を通常とは異なるものに変更する場合は、テキストメソッドを使用する方が数値に変換するよりも簡単で迅速な場合があり、これによりミスが発生する可能性があります。 たまに ''chmod'' を使用するだけでよいユーザーにとって、どちらの方法の速度にも実際に大きな違いはないと主張することができます。
 
   
  +
よって、結果は 755 となり、書き込みパーミッションを取り除くには {{ic|chmod 755 ''filename''}} を実行すれば良いことになります。どの方法をとっても同じ3桁の数字が得られます。文字を使うか数字を使うかは個人の好みと入力速度に依ります。ディレクトリやファイルのパーミッションをデフォルトに戻したい場合 (例えば、所有者に読み書き (と実行権限) を与え、それ以外には書き込み権限を与えない)、{{ic|chmod 755/644 ''filename''}} を使うほうが速いかもしれません。しかし、通常とは異なるパーミッションに変更する場合は、パーミッションを数字に変換するよりも、文字を使う方法をとったほうがシンプルで速いかもしれません (それに、数字を使う方法は間違いを犯す可能性があります)。たまにしか ''chmod'' を使わないユーザにとっては、どちらの方法をとったとしても対して速度に違いはないという主張もあるでしょう。
   
数字を使う方法であれ数字を4個使って {{ic|setuid}}, {{ic|setgid}}, {{ic|sticky}} ビットも設定できます:
+
数字を使4桁で {{ic|setuid}} ビット、{{ic|setgid}} ビット、そして {{ic|sticky}} ビットも設定できます
   
 
setuid=4
 
setuid=4
297行目: 303行目:
 
sticky=1
 
sticky=1
   
例えば {{ic|chmod 2777 ''filename''}} であれば誰でも読み書き実行ができ、{{ic|setgid}} ビットも有効になります。
+
例えば{{ic|chmod 2777 ''filename''}} は、全員に対して読み/書き/実行ビットを設定しさらに {{ic|setgid}} ビットも有効化します。
   
 
=== まとめて chmod ===
 
=== まとめて chmod ===
   
通常、ディレクトリとファイル同じパーミッションする必要はありません。一度にディレクトリツリーを修正しなくてはならない場合、''find'' を使って選択的に修正します
+
一般に、ディレクトリとファイルの両方に同じパーミッションを設定することはありません。ディレクトリツリー内のパーミッション一括で変更する必要がある場合[[find]] を使って選択的に修正してください
   
ディレクトリだけを 755 に chmod するには:
+
ディレクトリのパーミッションだけを 755 に変更するには:
   
$ find ''directory'' -type d -exec chmod 755 {} +
+
$ find ''ディレクトリ'' -type d -exec chmod 755 {} +
   
ファイルだけを 644 に chmod するには:
+
ファイルのパーミッションだけを 644 に変更するには:
   
$ find ''directory'' -type f -exec chmod 644 {} +
+
$ find ''ディレクトリ'' -type f -exec chmod 644 {} +
   
 
== 所有権を変更 ==
 
== 所有権を変更 ==

2023年8月13日 (日) 15:00時点における版

関連記事

ファイルシステムは、パーミッション属性を使って、どの程度のレベルでシステムのプロセスがファイルやディレクトリとやり取りできるかを規定します。

警告: セキュリティ目的で使用する場合、パーミッションと属性は、起動済みのシステムからの攻撃しか防御しません。マシンへ物理的にアクセスできる攻撃者からデータを保護するには、ディスク暗号化も施さなければなりません。

パーミッションの表示

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) を見てください。

ヒント: namei -l path を使えば、パスと一緒にパーミッションを表示できます。

サンプル

いくつか例を見て、理解を深めましょう:

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 と入力する代わりとして使えます。

ここでのパーミッションとは、#パーミッションの表示 で説明しているのと同じです (rwx)。

それではコマンドを使用例を見てみましょう。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

次の例では、グループとその他のユーザに対して読み込みと実行のパーミッションを与えてみます。つまり、= の後にパーミッションの文字 (rx) を入れます (スペース無しで)。

who に複数の文字を入力することで、これを行うことができます。例えば:

$ chmod go=rx Documents
ノート: chmod コマンドで who に入力する文字やパーミッション文字の順番は特に意味をなしません: chmod go=rx file でも chmod og=xr file でも全く同じ意味になります。

次に、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 で、あるクラスから別のクラスにパーミッションをコピーすることも可能です (例えば、所有者のパーミッションをグループにコピーする)。そうするには、= の後に、rwx ではなく、もう一つの 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桁目はその他のユーザのパーミッションです。

この数字表記では、rw、そして 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

マウントされているディレクトリ (/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 アクセス許可を持っていたので)。

ノート:
  • chown は常に setuid と setgid ビットを消去します。
  • root 以外のユーザーは chown を使って、自分が所有するファイルを他のユーザーに「譲渡」するために使用することはできません

アクセス制御リスト

アクセス制御リストは、任意のユーザやグループに対するパーミッションをファイルに設定できるようにすることで、ファイルシステムに柔軟なパーミッション機構を追加します。

Umask

umask ユーティリティを使うことでファイル作成モードマスクを制御することができ、新しくファイルを作成したときのファイルパーミッションの初期値を決めることができます。

ファイルの属性

ユーザーやグループの読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性をファイルシステムがサポートしている場合があります。このセクションではそれらの属性を使用する方法を説明します。

警告: デフォルトでは、cprsync などのプログラムはファイルの属性までコピーしません。

e2fsprogs パッケージには、lsattr(1)chattr(1) というプログラムが含まれており、ファイルの属性を確認したり変更することができます。

全てのファイルシステムで反映されるわけではありませんが、以下の属性を使用することができます:

  • a: 追記のみ
  • c: 圧縮
  • d: ダンプしない
  • e: 拡張フォーマット
  • i: 変更不可
  • j: データのジャーナリング
  • s: 安全な消去
  • t: 末尾のマージをしない
  • u: 削除不可
  • A: アクセス日時を更新しない
  • C: コピーオンライトしない
  • D: ディレクトリの同期更新
  • S: 同期更新
  • T: ディレクトリ階層のトップ

例えば、特定のファイルに変更不可ビットを設定したい場合、次のコマンドを使用:

# chattr +i /path/to/file

ファイルから属性を削除したいときは +- に変更してください。

拡張属性

拡張属性 を見てください。

ヒントとテクニック

Preserve root

--preserve-root フラグを使うことで chmod/ で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、エイリアスで設定すると良いでしょう。[1] も参照。

参照