試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GNU/Linuxにおける基本的なアクセス権について(対象/属性/表記など)

ここではGNU/Linuxにおける基本的なアクセス権に関してを扱う。
アクセス制御リスト(ACL)を用いた高度なアクセス制御については「GNU/Linux上でユーザやグループごとのアクセス権を設定する機能を使用するための覚え書き」で扱っている。

対象とアクセス権

アクセス制御の仕組みでは、1つのファイルやディレクトリに対して

  • 対象: 誰に対して
  • アクセス権: 何の操作が行える/行えないのか

の2つを決める。
管理者権限のユーザ(rootなど)はアクセスが拒否されることはない。

対象

対象には以下の3つの種類がある。

  • 所有ユーザ: ファイルやディレクトリを所有するユーザで、作成したユーザは所有ユーザとなる
  • 所有グループ: ファイルやディレクトリを所有するグループで、作成したユーザのプライマリグループ/主グループ*1が所有グループとなる
  • それ以外の全てのユーザ

これ以外の個別のユーザやグループに対してアクセス権を設定したい場合は「GNU/Linux上でユーザやグループごとのアクセス権を設定する機能を使用するための覚え書き」のアクセス制御リスト(ACL)を用いる。

アクセス権

アクセス権には以下の3つの種類がある。

  • 読み込み: ディレクトリの場合は中の一覧が取得できるか、ファイルの場合は読み込みができるか
  • 書き込み: 書き込みができるか
  • 実行: ディレクトリの場合は中に入れるか、実行ファイルやスクリプトの場合はそれが実行できるか

ディレクトリの読み込み権限は一覧の取得可否となり、読み込みが許可されていない場合は中の一覧は見られないが、実行が許可されていれば中のファイル名を指定してアクセスすることはできる。
ダウンロードした実行ファイル(独自のインストーラの類で「.bin」や「.run」の拡張子を持つものなど)やスクリプトについてはそのままでは実行不可となっているため、それを実行したいときには手動で実行を許可する必要がある。

アクセス権の表記と属性

上で挙げた3つのアクセス権はそれぞれ独立している*2ため、3桁の8進数*3で表現でき、それぞれのアクセス権は下の値を持つ。

  • 読み込み: 4
  • 書き込み: 2
  • 実行: 1

これらをまとめた(足し合わせた)値をアクセス権の値として用いる。

  • 読み込みのみ許可: 4(読) + 0(書) + 0(実) = 4
  • 書き込みのみ許可: 0(読) + 2(書) + 0(実) = 2
  • 読み込みと実行のみ許可: 4(読) + 0(書) + 1(実) = 5

この値を対象ごとに並べることで「所有者のアクセス権/所有グループのアクセス権/それ以外のアクセス権」の全てを3つの値の並びによって表現できる。並べる順番はこの通りに決まっている。下は例。

  • 755: 所有ユーザだけ読み/書き/実行の全てができ、他は読み込み/実行のみ
  • 664: 所有ユーザと所有グループのメンバだけ読み/書き可、他は読み込みだけ
  • 600: 所有ユーザだけ読み/書きできるが他は読めない

このアクセス権の並びは「属性(値)」や「パーミッション」などと呼ばれる。ただし、個別のアクセス権についても「実行属性」のように呼ばれる。
属性は後述の特殊なアクセス権がある場合に4桁で表現され、ない場合は「0」を先頭に付ける(例:0755)か3桁のままで表記される。
属性値は文字列での表記もあり、lsコマンドに-lオプションを付けたときなどに表示され

[種類][所有者の読み/書き/実行可否][所有グループの読み/書き/実行可否][それ以外の読み/書き/実行可否]

の書式を持つ。*4「読み/書き/実行可否」の部分は

  • 許可されている場合: それぞれ「r」「w」「x」が付く
  • 許可されていない場合: 「-」

となる。
下は例。

-rw-r--r--: ファイルで所有者は読み/書き、それ以外は読み込みのみ(644)
drwxr-xr-x: ディレクトリで所有者は読み/書き/実行、それ以外は読み/実行のみ(755)
-rw-------: ファイルで所有者は読み/書き、それ以外はアクセス拒否(600)

1文字目の種類はファイルが「-」、ディレクトリが「d」となる。他に「s(ソケット)」、「c(キャラクタデバイス)」、「b(ブロックデバイス)」などがあるが、特定のディレクトリにしか見られない。

特殊なアクセス権

スティッキー

ディレクト/tmp/は誰でもデータが読み書きできる一時ディレクトリとなっているが、自分が作成した一時ファイルが誰かに消される可能性があると問題となる。そこで、中のファイル/ディレクトリは「作成した所有者以外消せない」*5という性質をディレクトリに付加すると都合が良く、これはスティッキービットの指定によって行う。
数値の属性では3桁の属性値の左に「1」を付けた値で指定し、記号指定では「t」を付ける。
スティッキービットの付いたディレクトリの属性の文字列表記では「t」が付く。

(属性1777のディレクトリを作成)
$ mkdir -m 1777 stickydir
(属性の確認)
$ stat -c "%a (%A)" stickydir 
1777 (drwxrwxrwt)

(既存のディレクトリにスティッキービットを付ける)
$ chmod +t [既存のディレクトリ...]

上の例ではmkdir-mオプションで属性を指定してディレクトリを作成している。
statコマンドはファイルやディレクトリの各種情報を取得し、-c "%a (%A)"では属性をそれぞれ数値と文字列とで表示している。
chmodコマンドについては、詳しくは別記事で扱う。

setuid,setgid

ユーザのパスワードを変更するpasswdコマンドが書き込むファイルは管理者権限でないと変更できないが、このコマンド自体は一般ユーザのシェルから実行できる。
このように、特定の実行ファイルにだけ付加される「プロセス実行中に限り所有ユーザ*6権限で動作する」という性質をsetuidビットと呼び、同様にグループ権限を所有グループに変更して動作するsetgidビットも存在する。
これらはそれぞれ

  • setuid: 4
  • setgid: 2

を3桁の属性値の左に付けた属性値で指定するか、記号指定で「s」を(setuidでは所有ユーザ、setgidでは所有グループのアクセス権に)付ける。ただし、手動でこれらのビットを付け外しすることはあまりない。
属性の文字列表記においては「x」の代わりに「s」がsetuidでは所有者の、setgidでは所有グループのアクセス権に付く。*7

(setuidビット付きのコマンドの例)
$ stat -c "%a (%A)" /usr/bin/passwd               
4511 (-r-s--x--x)
(setgidビット付きのコマンドの例)
$ stat -c "%a (%A)" /usr/bin/chage 
2711 (-rwx--s--x)

ディレクトリにsetgidビットを付けると、その中に作成されるファイルやディレクトリの所有グループがsetgidビットの付いた親ディレクトリのものと同じになる。
setuidやsetgid(特に前者)は動作権限を変え、管理者権限になる場合もあるため、セキュリティ問題が発生する原因となる場合がある。

(「GNU/Linuxにおける基本的なアクセス権について(属性の設定手順と初期値について)」に続く)

関連記事:

*1:そのユーザのグループ権限として用いられるグループで、そのユーザに関する/etc/passwd上の項目における左から4番目の項目をIDに持つグループ

*2:許可と拒否の状態を個別に持つ

*3:0から7の値

*4:アクセス制御リスト(ACL)使用時には最後に「+」が付く

*5:名前変更も同様

*6:passwdコマンドの場合はroot=管理者

*7:ただし、実行属性が抜けていると「-rwSr--r--(4644)」や「-rw-r-Sr--(2644)」のようになる