トップ > Linuxらしい使い方を覚える >
アクセス権を決めるパーミッションの設定

  

所有者・所有グループ・それ以外のユーザへのアクセス権を設定する

ここからはシェルの話題からは離れ、ファイルやディレクトリに関する内容を解説していきます。 この記事では、アクセス権を決めるための "パーミッション" について解説します。

パーミッションは、ファイルやディレクトリに対して設定します。 ファイルやディレクトリごとに、それぞれ別のパーミッションを設定することができます

設定できる内容は、

  1. 所有者の読み取りを許可するかどうか
  2. 所有者の書き込みを許可するかどうか
  3. 所有者の実行を許可するかどうか
  4. 所有グループの読み取りを許可するかどうか
  5. 所有グループの書き込みを許可するかどうか
  6. 所有グループの実行を許可するかどうか
  7. それ以外のユーザの読み取りを許可するかどうか
  8. それ以外のユーザの書き込みを許可するかどうか
  9. それ以外のユーザの実行を許可するかどうか

計9種類です。 つまり、3種類の立場のユーザに対し、それぞれ3種類の権限を与えるのかどうかを設定するということです。

所有グループって何だろう

聞き慣れない "所有グループ" なるものが初登場しました。 所有グループって何なのでしょうか。

まずは、"所有グループ" ではなく "グループ" から説明します。 本ウェブサイトでは今まで解説しませんでしたが、各ユーザは "グループ" と呼ばれるものに所属しています。 グループは、文字通りユーザを分類するためのものです。

なお、ユーザは複数のグループに所属することができます。 自分がどのグループに所属しているのかは group コマンドで以下のように確認することができます。

taro@myhostname:~$ groups
taro adm cdrom sudo dip plugdev lpadmin sambashare
taro@myhostname:~$

上の例では、taro, adm, cdrom, sudo, dip, plugdev, lpadmin, sambashare というグループに所属しています。

グループにはプライマリグループ(主)とセカンダリグループ(副)があります。 ユーザは複数のグループに所属できますが、プライマリグループとして所属できるのは1つのグループだけです。

自分のプライマリグループがどこなのかは id コマンドで以下のように確認することができます。

taro@myhostname:~$ id
uid=1000(taro) gid=1000(taro) groups=1000(taro),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),115(lpadmin),136(sambashare)
taro@myhostname:~$

上の例では taro がプライマリグループです。 gid= で始まっていることから判別できます。

また、各グループに所属しているユーザを知るには以下のように getent コマンドを利用します。

taro@myhostname:~$ getent group cdrom
cdrom:x:24:taro
taro@myhostname:~$

上の例では、グループ cdrom に所属しているのはユーザ taro のみであることがわかります。 なお、出力結果の意味は以下の通りです。

出力結果 意味
cdrom グループ名
x 意味なし
※昔は意味があった
24 グループID
taro 所属するユーザのユーザID

続いて肝心の "所有グループ" についてです。 所有グループとは、ファイルやディレクトリを所有しているグループのことです。 UNIX系OSでは、各ファイルやディレクトリには所有者および所有グループという情報が設定されています。

  
ファイルやディレクトリを作成すると、作成したユーザが所有者に設定されます。 また、そのユーザのプライマリグループが所有グループに設定されます。

所有者や所有グループのいないファイルやディレクトリは存在しません。 また、同じファイルやディレクトリを複数のユーザやグループが所有することもありません。

所有者および所有グループを確認するには、以下のように ls コマンドを -l オプションを付けて実行します。

taro@myhostname:~$ ls -l | grep Documents
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Documents
taro@myhostname:~$

上の例では、所有者が taro で、所有グループが taro です。

では、本題に戻りましょう。 以下で、設定されているパーミッションを確認する方法やパーミッションの変更方法を解説します。

パーミッションを確認するには

パーミッションを確認するには ls コマンドに -l オプションを付けて実行します。

試しにホームディレクトリに置かれているファイルやディレクトリのパーミッションを確認してみましょう。 端末を開き、キーボードから ls -l と入力して、Enterキーを押してください。


ls -l

 

以下のようにファイルやディレクトリの一覧が詳細表示されます。

taro@myhostname:~$ ls -l
合計 40
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Desktop
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Documents
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Downloads
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Music
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Pictures
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Public
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Templates
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Videos
-rw-rw-r-- 1 taro taro   20  6月 21 23:24 commandfile
-rw-rw-r-- 1 taro taro    7  6月 25 20:04 testfile
taro@myhostname:~$

1列目の先頭文字がファイル種別を表しており、続く2文字目からの9文字分がパーミッションです。 なお、3列目と4列目が所有者と所有グループを表しています。

ファイルやディレクトリの詳細表示の各列の意味
ファイルやディレクトリの詳細表示の各列の意味

読み取り権限は r または - で表示されます。 r は読み取り権限が与えられていることを表し - は権限がないことを表しています。 同様に w は書き込み権限を x は実行権限を表します。

例えば以下の、

taro@myhostname:~$ ls -l | grep Desktop
drwxr-xr-x 2 taro taro 4096  6月 10 13:11 Desktop
taro@myhostname:~$

という権限の場合は、各ユーザの権限は次のようになります。

ユーザ taro (r)読み取り
(w)書き込み
(x)実行
グループ taro
に属するユーザ
(r)読み取り
(w)書き込み
(x)実行
それ以外のユーザ (r)読み取り
(w)書き込み
(x)実行

読み取り権限 / 書き込み権限 / 実行権限とは

読み取り権限・書き込み権限・実行権限とはどんな権限なのでしょうか。 ファイルとディレクトリでは権限の意味が少し違っていますので、まずはファイルの権限から解説します。

(r)読み取り権限とは、名前の通りファイルの中身を読み取る権限です。 この権限が与えられていなければ、ファイルの中身を見ることはできません。

(w)書き込み権限とは、ファイルの中身を編集するための権限です。 また、他のファイルから上書きするためにも必要となる権限です。

(x)実行権限とは、ファイルを実行するための権限です。 そのファイルがコマンドやアプリケーションである場合にのみ意味があります。 画像ファイルや文書ファイルの場合には、実行権限は何も影響しません。

- ファイルの各権限 -
権限 意味
(r)読み取り ・ファイルの中身を見る
(w)書き込み ・ファイルの中身を編集する
・他のファイルで上書きする
(x)実行 ・ファイルを実行する

ディレクトリの場合は権限の意味が少し異なる

ディレクトリの場合は、読み取り権限・書き込み権限・実行権限の意味が少し異なります。

(r)読み取り権限とは、そのディレクトリに含まれるファイルやディレクトリの一覧を参照するための権限です。 この権限が与えられていなければ、ディレクトリの内容を知ることはできません。

(w)書き込み権限とは、そのディレクトリの下に新たにファイルやディレクトリを作成するための権限です。 また、そのディレクトリに含まれるファイルやディレクトリを削除するための権限でもあります

(x)実行権限とは、そのディレクトリへ移動するための権限です。 この権限が与えられていなければ、ディレクトリへ入ることさえできません。

- ディレクトリの各権限 -
権限 意味
(r)読み取り ・ディレクトリ内のファイルやディレクトリの一覧を見る
(w)書き込み ・ディレクトリ内にファイルやディレクトリを作成する
・ディレクトリ内のファイルやディレクトリを削除する
(x)実行 ・ディレクトリに移動する
  
ファイルを削除するには親ディレクトリの書き込み権限が必要です。

パーミッションを設定する

続いては、パーミッションの設定方法を解説します。 ファイルやディレクトリのパーミッションを設定するには chmod コマンドを利用します。

chmod コマンドは以下のように基本的に2つの引数を受け取ります。 (1) 設定するパーミッションと、(2) 対象のファイルパス(またはディレクトリパス)の2つです。

chmod <パーミッション> <ファイルパス(またはディレクトリパス)>

なお、パーミッションの記述方法には数値モードと記号モードの2通りがあります。 まずは、数値モードでの指定方法から解説します。

パーミッションを数値モードで指定する場合は、与える権限に対応する数字を合計で表します。 9種類の権限に対応する数値は以下の通りです。

所有者 (r)読み取り 400
(w)書き込み 200
(x)実行 100
所有グループ (r)読み取り 40
(w)書き込み 20
(x)実行 10
それ以外のユーザ (r)読み取り 4
(w)書き込み 2
(x)実行 1

例えば、

rwxr-xr-x

という権限を与える場合は、

chmod 755 filename

とします。 これは 400 + 200 + 100 + 40 + 10 + 4 + 1 の合計値です。

別の例として、

rw-rw-r--

の権限を与える場合は、

chmod 664 filename1 filename2

となります。 このように、複数のファイルにまとめてパーミッションを設定することもできます


もう一方の記号モードでの指定方法では、英字と記号の組み合わせでパーミッションを表します。 最初にユーザの種別を英字で指定し、次に変更内容を記号で指定し、最後に権限の種類を英字で表現します。

ユーザの種別・変更内容・権限の種類の意味は以下の通りです。 これらを組み合わせてパーミッションを指定します。

- ユーザの種別 -
英字 意味
u 所有者
g 所有グループ
o それ以外のユーザ
a すべてのユーザ
※ugoを同時に指定するのと同じ
- 変更内容 -
記号 意味
=(イコール) 指定した権限で上書きする
+(プラス) 指定した権限を付け足す
-(マイナス) 指定した権限を取り除く
- 権限の種類 -
英字 意味
r 読み取り権限
w 書き込み権限
x 実行権限

例えば、所有者と所有グループへの書き込み権限を付け足すなら、

chmod ug+w filename

と実行します。

2つ目の例として、それ以外のユーザの全ての権限を剥奪するなら、

chmod o-rwx filename

または、

chmod o= filename

とします。 どちらも同じ結果になります。

また別の例として、所有者には全ての権限を与え、所有グループとそれ以外のユーザには何の権限も与えないなら、

chmod u=rwx,go= filename

とします。 このように、複数のパーミッションを ,(カンマ) で区切って指定することもできます

なお、記号モードでも、

chmod a-x filename1 filename2

のように複数のファイルにまとめてパーミッションを設定することもできます

3つの特殊な権限について

この記事では、

  1. 所有者の読み取り
  2. 所有者の書き込み
  3. 所有者の実行
  4. 所有グループの読み取り
  5. 所有グループの書き込み
  6. 所有グループの実行
  7. それ以外のユーザの読み取り
  8. それ以外のユーザの書き込み
  9. それ以外のユーザの実行

計9種類の権限を紹介しました。 しかし、実はこれ以外にも、

  1. setuid
  2. setgid
  3. スティッキービット(Sticky bit)

3つの特殊な権限があります。 それぞれの意味は以下の通りです。

権限 意味
setuid 実行時にファイルの所有者の権限が与えられる
setgid 実行時にファイルの所有グループの権限が与えられる
スティッキービット 誰でもファイルやディレクトリを作成できるが削除できるのは所有者のみ

では、これら3つの特殊な権限について、以下で詳しく見ていきましょう。

setuid

setuid は Set User ID の略で、実行するとファイルの所有者の権限が与えられて実行されます。 所有者が管理者ユーザ(root) のファイルであれば、管理者ユーザの権限で実行されるのです。

実際に setuid が与えられているファイルを見てましょう。 端末を開き、キーボードから ls -l /usr/bin/mount と入力して、Enterキーを押してください。


ls -l /usr/bin/mount

 

以下のようにファイル /usr/bin/mount のパーミッションが表示されます。 所有者の実行権限の部分が x ではなく s になっています

taro@myhostname:~$ ls -l /usr/bin/mount
-rwsr-xr-x 1 root root 47488  4月 10 00:32 /usr/bin/mount
taro@myhostname:~$

s は実行権限である x に加えて setuid も有効になっていることを表しています。 なお、実行権限がなく setuid のみが有効になっている場合は S と大文字で表示されます。

パーミッションの表記 意味
s 実行権限(x)が与えられている
(かつ)
setuidが有効になっている
S(大文字) 実行権限(x)が与えられていない
(かつ)
setuidが有効になっている

このように所有者の実行権限の部分が s または S(大文字) になっていれば setuid が有効いなっていることを表しています。

setgid

setgid は Set Group ID の略で、実行するとファイルの所有グループの権限が与えられて実行されます。

では setgid が与えられているファイルを見てましょう。 キーボードから ls -l /usr/bin/chage と入力して、Enterキーを押してください。


ls -l /usr/bin/chage

 

以下のようにファイル /usr/bin/chage のパーミッションが表示されます。 所有グループの実行権限の部分が x ではなく s になっています

taro@myhostname:~$ ls -l /usr/bin/chage
-rwxr-sr-x 1 root shadow 72184  2月  6 21:54 /usr/bin/chage
taro@myhostname:~$

s は実行権限である x に加えて setgid も有効になっていることを表しています。 なお、実行権限がなく setgid のみが有効になっている場合は S と大文字で表示されます。

パーミッションの表記 意味
s 実行権限(x)が与えられている
(かつ)
setgidが有効になっている
S(大文字) 実行権限(x)が与えられていない
(かつ)
setgidが有効になっている

このように所有グループの実行権限の部分が s または S(大文字) になっていれば setgid が有効いなっていることを表しています。

スティッキービット

スティッキービット(Sticky bit)はディレクトリに対して設定します。 スティッキービットが設定されたディレクトリは、

  1. 誰でもファイルやディレクトリを作成できる
  2. 削除できるのは所有者のみ

のように振る舞います。 つまり、公共的なディレクトリを作るために用意されている権限です。

スティッキービットが設定されているディレクトリの代表例が /tmp ディレクトリです。 実際に見てみましょう。 キーボードから ls -ld /tmp と入力して、Enterキーを押してください。


ls -ld /tmp

 
  
ls コマンドの -d オプションは ディレクトリの中身ではなくディレクトリ自身の情報を表示するためのオプションです。 -d オプションを指定することで、ディレクトリの内容ではなくディレクトリ自身の情報を見ることができます。

以下のようにディレクトリ /tmp のパーミッションが表示されます。 それ以外のユーザの実行権限の部分が x ではなく t になっています

taro@myhostname:~$ ls -ld /tmp
drwxrwxrwt 16 root root 4096  6月 24 17:51 /tmp
taro@myhostname:~$

t は実行権限である x に加えてスティッキービットも有効になっていることを表しています。 なお、実行権限がなくスティッキービットのみが有効になっている場合は T と大文字で表示されます。

パーミッションの表記 意味
t 実行権限(x)が与えられている
(かつ)
スティッキービットが有効になっている
T(大文字) 実行権限(x)が与えられていない
(かつ)
スティッキービットが有効になっている

このように所有グループの実行権限の部分が t または T(大文字) になっていればスティッキービットが有効いなっていることを表しています。

パーミッションの設定方法

これら3つの特殊な権限のパーミッションも、数値モードや記号モードで設定することができます。 数値モードで指定する場合の数値は以下になります。

setuid 4000
setgid 2000
スティッキービット 1000

記号モードで指定する場合の英字は以下になります。

- 権限の種類 -
英字 意味
s setuid
s setgid
t スティッキービット
  
setuid も setgid も同じ英字の s で表します。 chmod u+s filename なら setuid となり、chmod g+s filename なら setgid となります。

ACL(アクセス・コントロール・リスト)について

この記事では、パーミッションの設定によるアクセス権の操作方法を紹介しました。 つまり、chmod コマンドによるパーミッションの設定のことです。

実は、Linux系OSには ACL(アクセスコントロールリスト) と呼ばれるアクセス権の設定方法もあります。 ACL では、getfacl コマンドでアクセス権を確認し、setfacl コマンドでアクセス権を設定します。

操作/コマンド 説明
getfacl アクセスコントロールリストを確認する
setfacl アクセスコントロールリストを設定する

なお ACL は、

  1. 基本ACL
  2. 拡張ACL

に分かれています。 基本ACL とは、パーミッションの設定と同じ

  1. setuid
  2. setgid
  3. スティッキービット(Sticky bit)
  4. 所有者の読み取り
  5. 所有者の書き込み
  6. 所有者の実行
  7. 所有グループの読み取り
  8. 所有グループの書き込み
  9. 所有グループの実行
  10. それ以外のユーザの読み取り
  11. それ以外のユーザの書き込み
  12. それ以外のユーザの実行

の計12個の権限のことです。 つまり、これらの計12個の権限はパーミッションの設定からでも ACL の設定からでも操作できます。 chmod コマンドを使ってもいいし、setfacl コマンドを使ってもいいというわけです。

一方、拡張ACL は chmod コマンドでは操作できません。 getfacl / setfacl コマンドを使う必要があります。

本ウェブサイトでは ACL には触れない

本ウェブサイトでは、これ以降 ACL には触れません。 理由は、本ウェブサイトが想定している読者は情報処理技術者ではないためです。

本ウェブサイトの想定読者は "サポートが切れた Windows PCを家庭で利用しようと考えている方" です。 拡張ACL が必要になる場面もないでしょうし、拡張ACL が設定されたファイルやディレクトリを見かける機会もないことでしょう。

また、基本ACL はパーミッションの設定で制御できます。 そのため、chmod コマンドさえ知っていれば困ることはありません。

  

家庭で利用するだけならパーミッションの設定は必要ない

上で "chmod コマンドさえ知っていれば困ることはありません" と書きましたが、家庭で利用するだけなら chmod コマンドを使う機会すらないことでしょう。

仮に家族がそれぞれ別々のユーザIDでログインする場合でも、初期のパーミッション設定のままで困ることはないと思います。

  

まとめ

ファイルやディレクトリへのアクセス権はパーミッションで管理します。 設定できる内容は、

  1. setuid
  2. setgid
  3. スティッキービット(Sticky bit)
  4. 所有者の読み取り
  5. 所有者の書き込み
  6. 所有者の実行
  7. 所有グループの読み取り
  8. 所有グループの書き込み
  9. 所有グループの実行
  10. それ以外のユーザの読み取り
  11. それ以外のユーザの書き込み
  12. それ以外のユーザの実行

の計12個です。 3種類の立場のユーザに対し、それぞれ3種類の権限を与えるのかどうかを設定します。 また、それに加えて特殊な権限が3つあるため、合わせて12種類になります。 なお、3種類の権限の詳細は以下の通りです。

- ファイルの各権限 -
権限 意味
(r)読み取り ・ファイルの中身を見る
(w)書き込み ・ファイルの中身を編集する
・他のファイルで上書きする
(x)実行 ・ファイルを実行する
- ディレクトリの各権限 -
権限 意味
(r)読み取り ・ディレクトリ内のファイルやディレクトリの一覧を見る
(w)書き込み ・ディレクトリ内にファイルやディレクトリを作成する
・ディレクトリ内のファイルやディレクトリを削除する
(x)実行 ・ディレクトリに移動する

ファイルを作成すると、作成したユーザが所有者になり、作成したユーザが所属するプライマリグループが所有グループになります。 自分がどのグループに所属しているのかは groups コマンドで確認することができます。 また、プライマリグループがどこなのかは id コマンドで確認できます。

操作/コマンド 説明
groups 所属しているグループを表示する
id ユーザIDとグループIDを表示する
getent gorup name グループ name に所属しているユーザを表示する

ファイルやディレクトリのパーミッションは ls コマンドに -l オプションを付けて実行すれば確認することができます。 ファイルやディレクトリにパーミッションを設定するには chmod コマンドを使います。

操作/コマンド 説明
ls -l ファイルやディレクトリのパーミッションを表示する
chmod ファイルやディレクトリのパーミッションを設定する

chmod コマンドでのパーミッションの指定方法には、数値モードと記号モードがあります。 数値モードで指定する場合は、与える権限に対応する数字を合計で表します。 12種類の権限に対応する数値は以下の通りです。

特殊な権限 setuid 4000
setgid 2000
スティッキービット 1000
所有者 (r)読み取り 400
(w)書き込み 200
(x)実行 100
所有グループ (r)読み取り 40
(w)書き込み 20
(x)実行 10
それ以外のユーザ (r)読み取り 4
(w)書き込み 2
(x)実行 1

もう一方の記号モードでの指定方法では、英字と記号の組み合わせでパーミッションを表します。 最初にユーザの種別を英字で指定し、次に変更内容を記号で指定し、最後に権限の種類を英字で表現します。

ユーザの種別・変更内容・権限の種類の意味は以下の通りです。 これらを組み合わせてパーミッションを指定します。

- ユーザの種別 -
英字 意味
u 所有者
g 所有グループ
o それ以外のユーザ
a すべてのユーザ
※ugoを同時に指定するのと同じ
- 変更内容 -
記号 意味
=(イコール) 指定した権限で上書きする
+(プラス) 指定した権限を付け足す
-(マイナス) 指定した権限を取り除く
- 権限の種類 -
英字 意味
r 読み取り権限
w 書き込み権限
x 実行権限
s setuid
s setgid
t スティッキービット

Linux系OSには、さらに細かなアクセス権を設定するための拡張ACLと呼ばれる仕組みもあります。 拡張ACLは chmod コマンドでは操作することはできません。 ACL専用のコマンドである getfacl コマンド / setfacl コマンドを使う必要があります。

操作/コマンド 説明
getfacl ファイルやディレクトリのACLを表示する
setfacl ファイルやディレクトリのACLを設定する
メニュー