【パーミッション】

●パーミッションとは?
  パーミッションとは、ファイルアクセス権限のことです。
  セキュリティについて考えるためにはこれはなくてはならない物です。


●ファイルアクセス権限がないとどうなるか?
  誰もがそのファイルの内容を読むことができます。
  誰もがそのファイルの中身を書き換えることができます。
  誰もがそのファイルのプログラムを実行することができます。

  こんな状態で「安心」できますか?
  こんな状態でファイルの「管理」ができますか?

  全ての人がファイルの内容を読めると言うことは
企業秘密を暴露しているようなものです。
  全ての人がファイルの中身を書き換えられると言うことは
次回編集するときに訳の分からない文章が作成されているかも知れません。
  そして、全ての人がそのファイルのプログラムを実行できると言うことは
(もしそれがシステムを破壊してしまうプログラムだったとしたら)
多くの機械を破壊してしまう危険性を残していると言うことです。


● パーミッションの確認
   現在のパーミッションを確認するためには ls コマンドを使用します。
   ただし、ls コマンドをそのまま使用するとファイル名しか表示されない
   ので、オプション -l を使用します。
   すると、以下のようなファイルの情報が表示されます。
   (環境によって表示に一部違いがあります。
    ちなみに下のコマンドは自宅の ls -l の結果です。)

   drwxr-xr-x   2 keitam   root          512 Jun 17 23:48 test/

   一番左が現在のパーミッション情報を表しています。

   drwxr-xr-x
   -		左端 … ファイル・ディレクトリの情報。
    ---		2〜4番目 … ユーザ(user)の権限情報。
       ---	5〜7番目 … グループ(group)の権限情報。
          ---	8〜10番目 … 他人(others)の権限情報。

   ○ファイル・ディレクトリの情報
	d ディレクトリ
	l シンボリックリンク 
	| パイプ
	p 名前付きパイプ
	b ブロック特殊ファイル
	c キャラクター型特殊ファイル
	- その他のファイル

   ○ユーザ・グループ・他人の情報
	r … 読み取り(read)権限。
	     ファイルを読んだり、コピーしたりできる。
	w … 書き込み(write)権限。
	     ファイルの内容を変更したり、削除したりできる。
	x … 実行(execute)権限。
	     そのファイルのプログラムを実行したりできる。
	t … スティッキービット。
	s … set uid or set gid。
	T … あまり気にしない方がいい(操作によるエラーの可能性がある)
	S … あまり気にしない方がいい(操作によるエラーの可能性がある)
	L … あまり気にしない方がいい(操作によるエラーの可能性がある)


● パーミッションとグループ
   ファイルにはユーザ・グループ・他人の3つの権限が存在します。
   ここで大切なのはグループと他人の違いを正確に理解しているかです。

   例えば、 ls -lg で次の情報が表示されたとします。

   -rw-rw-r--   1 keitam   student     10660 Jun 18 00:43 0619.txt

   このファイルのユーザは「keitam」です。
   このファイルのグループは「student」です。

   パーミッションの状態はユーザとグループは読み書きが、
   それ以外の人は読む事のみができます。

   この状態だったら他の生徒もこのファイルを編集できます。
   まずここを理解しておいて下さい。

   MiCS 勤務の方は「helper」というグループに属しています。
   最近、MiCS の Webページの更新を行う事が多くなってきましたが、
   これを行う時にグループの設定をし忘れる方が多いです。
   あまり気づかないかも知れないですが、

   -rw-rw-r--   1 keitam   helper      10660 Jun 18 00:43 0619.txt

   のように「helper」に設定されている文章を編集し終わった時、実は

   -rw-rw-r--   1 keitam   student     10660 Jun 18 00:43 0619.txt

   と、グループ名が「student」に変化してしまいます。
   つまり、グループ名の変更方法を理解する必要があります。

   グループ名を変更するためには chgrp コマンドを使用します。
	(chgrp [グループ名] [ファイル名])
   上のファイルを「helper」グループにするには
	chgrp helper 0619.txt
   を実行します。これで ls -lg を実行すると

   -rw-rw-r--   1 keitam   helper      10660 Jun 18 00:43 0619.txt

   のように「student」の部分が「helper」に変化しました。


● パーミッションの変更
   現在のパーミッション情報を変更するには chmod コマンドを使用します。
   例えば、「test.c」が次の状態だったとします。

   -rw-r-----   1 keitam   root         2097 Jun 17 18:53 test.c

   これを他の人に読んでもらうためには「chmod 644 test.c」を実行します。
   その後、「ls -l」を実行すると次のように表示されます。

   -rw-r--r--   1 keitam   root         2097 Jun 17 18:53 test.c

   「chmod」の使い方は
	chmod [モード] [ファイル名]
   ですが、今回、このモードの部分に「644」という数値を使用しました。
   ここで、この「644」は何を表しているのかが問題になってきます。

   ○ 644 の仕組み
      左端   … ユーザ情報
      真ん中 … グループ情報
      右端   … 他人情報

      権限を示す部分 「rw-r--r--」 を許可部分を「1」、それ以外を「0」
      として考えると 「110100100」 という見方ができます。
      これをユーザ、グループ、他人に分けると「110」「100」「100」と
      なります。そして二進数として考えると、これは「6」「4」「4」と
      見る事が出来ます。
      644 とはこのように構成されていたのです。

   ○ 他の方法
      先ほど書いたとおり
	chmod [モード] [ファイル名]
      というように chmod は使用しますが、このモードの部分は
      数字で表現しなくてもかまいません。

      test.c で他の人に読みとり権限を与える場合は
		chmod 644 test.c
      以外にも
		chmod o+r test.c
      のような方法もあります。この「o+r」と言うのは
      他の人(others)に読みとり権限を与えると言う意味です。

      (ちなみに
		chmod a+r test.c
       というように、全ての人(all)に読みとり権限を与える
       のようにしてもかまいません)

   ○ どちらの方法で変更するか?
      数字での変更はいろいろな変更を一気に出来るという長所があります。
      ただし、先ほどと全く違ったパーミッションになってしまうという
      危険性も合わせ持っています。

      ugoa+-rwx を使用した方法はあまりメジャーではありませんが
      どのように変化させたかが視覚的に分かりやすいと思います。
      一部分の権限のみを変更する時はこちらの方が適していると思います。

      しかし、どちらも大きな長所・短所は見当たりませんので
      変更方法は自分の好きな方でやってもらってかまいません。

【パーミッション(2)】

● where
   where は実行したいコマンドが実際にどのディレクトリにあるかを
   調べるのに便利なコマンドです。wwwmkdir というコマンドがどこに
   あるかを調べるためには
	where wwwmkdir
   と入力すると、この wwwmkdir というコマンドがどこにあるかを
   発見(表示)してくれます。


● which
   which は where で2つ以上のコマンドを発見したとき、
   どちらのコマンドを実行してくれているかを判断してくれます。


● file
   file は引数に指定したファイルの内容を調べます。
	file [ファイル名]
   としたとき、実行結果が下のように現れます。
	[ファイル名]: ASCII text(ASCII コードで書かれた文書を表す)
	[ファイル名]: C shell script text
				(シェルスクリプトファイルを表す)
	[ファイル名]: setuid ELF 32-bit MSB executable, SPARC,
	 version 1, dynamically linked (uses shared libs), stripped 
				(実行(バイナリ)ファイルを表す)
	[ファイル名]: GIF image data, version 89a, 170 x 109,
				( GIF形式の画像(バイナリ)ファイルを表す)
   等です。


● cat、more、less
   以上3つのコマンドはどれもファイルの中身を確認するものです。
   ただし、	cat はファイルの中身を一気に、
		more はファイルの中身を1頁づつ、
		less はファイルの中身を普通1頁づつ(戻ることもできる)
   表示します。


● ホームページ(HP)のパーミッション(MiCS-P の質問&回答メールより)
   学校で HP を作る時には、大抵の人が「wwwmkdir」と言うコマンドを
   実行しています。
   この「wwwmkdir」は次の順番でコマンドを実行しているようです。

	/NF/local/general/bin/wwwmkdir
		(「find wwwmkdir」で調べてみてください)

	/NF/local/Solaris2J/bin/wwwmkdir2
		(上のコマンドから呼ばれています)

	/NF/local/Solaris2J/bin/wwwmkdir_2nd
		(上のコマンドから呼ばれています)

	/NF/local/Solaris2J/bin/wwwmkdir_2nd_body
		(上のコマンドから呼ばれています)

   幸い、wwwmkdir2 と wwwmkdir_2nd_body は
   シェルスクリプトで書かれているようなので、cat、more、less 等で
   読むことが出来ます。

   この中で注目すべきは

    ○ wwwmkdir2 (61・62行目、72行目)
	mkdir public_html
	chmod 755 public_html
	      (ちなみに上記2文は「mkdir -m 755 public_html」で
	       1行にまとめられる)
	chmod 644 index-j.html

    ○ wwwmkdir_2nd_body (9〜12行目)
	chgrp extend .
	chmod g+x .
	chgrp extend public_html
	chmod 755 public_html

   辺りでしょうか。

   wwwmkdir2 でやっていることはただ単に
   パーミッションを変更しているだけです。
   これだけなら自分でもできます。

   ただ、ここで特殊なのは wwwmkdir_2nd_body です。
   ここで
	chgrp extend .
   としていますが、これは root が実行しています。
   (正確には root が 「wwwmkdir」を実行した人の代わりに
    グループ変更をしています。
    つまり、extend へのグループ変更は root しかできません)

   ではなぜ root でない人(「wwwmkdir」 を実行した人)に
   グループ変更ができたのか?

   答えは /NF/local/Solaris2J/bin/wwwmkdir_2nd のパーミッションに
   関係があります。(正確には owner の実行権)

   この後で setuid の説明をしますが、
   ここではこれが深く関わっています。


● umask
   umask は新しくファイル(ディレクトリ)を作成する時に、
   ファイルの最初の許可(permission)を設定するために使用されます。
   具体的には umask 値に設定されている許可が open の mode 引数から
   取り消されます。例えば

	umask 002

   とすると、ファイルの場合 0666 & ~002 = 0664 の設定に、
   ディレクトリの場合	    0777 & ~002 = 0775 の設定にします。

   この設定が生きていると、次からファイル(ディレクトリ)を生成すると
   上記の設定を行ってくれます。

   (もともと、最初にファイルを作成するとパーミッションは
	ファイル	… 666
	ディレクトリ	… 777
    で作成してくれるようになっています。しかしおそらく皆さんの場合、
    新しいファイルを作成すると
	ファイル	… 644
	ディレクトリ	… 755
    で作成してしまいます。実は最初に Linux を起動するときに
	umask 022
    が実行されています。
	/NF/home/common/settings/_cshrc.source
    の設定を見てみましょう。ここで umask が
    実行されていることを確認してください)


● newgrp
   newgrp はグループIDを変更します。
   このコマンドを使用すると、新たにログインしたかのように環境が
   再初期化されます。
   グループIDを元に戻すには exit でそのシェル(コマンドプロンプトを
   提供するもの)を終了します。

	newgrp helper

   で、現在のグループを helper に変更してくれます。

    先週、MiCS の Web ページ作成の仕方を述べました(chmod、chgrp)が、
    newgrp と umask を組み合わせると言う方法もあります。

    その場合は必ず newgrp コマンドの後、umask を行って下さい。
    順番を逆にすると umask は効果を発揮しません。


● r、w、x 以外のパーミッション
   ファイルにはユーザ・グループ・他人の3つの権限が存在します。
   そしてファイルの権限には r(読み取り)、w(書き込み)、x(実行)の
   三つの権限があります……と先週説明しました。これは確かに正しいようです。
   (実際、多くの入門書ではそう説明されています。
    しかし、その先が説明されていないようです。
    理由は、「知らなくても支障はないから」らしいです)

   しかし、知らないよりは知っていた方がいい(と思う)ので。
   まずは、s(setuid、setgid)から。


● 「s」と「S」って?
   s は setuid または setgid が設定された事を表す。
   S も上に同じ。
   ではどこがどう違うのか?

   ○ setuid
      プログラムのパーミッションを、実行者ではなく
      そのファイルの所有者にしてくれるもの。
      つまり、本来はあるユーザ(例えば root)のみに許可されたものを
      誰が*実行しても*許可されるようにする。
      たとえば yppasswd (使った事ある人、いるかな?)

   ○ setgid
      setuid のグループバージョン。
      そのファイルのプログラムを*実行する*時は誰でも一時的に
      そのグループの一員になることができる。

   ○ s と S の違い
      setuid、setgid ともに*実行する*ことが関わっている。
      つまり、s とはあらかじめ実行権を持って初めて発動する。
      元の所有者やグループが実行権を持っていないと s は
      発動できない(ゆえにエラーコード S を返す)。

   ○ setuid の長所と短所
      ■長所
	例えば、root でしか出来ない作業をコマンド化して setuid ビットを
	設定すると、root になる変わりにそのコマンドを実行する事で
	その処理を行う事が出来る。
	root になるのはそのコマンドを実行している間だけである。
	そして、そのコマンドが終了するとともにまたもとの一般ユーザに戻る。

	つまり、わざわざ危険性の高い root になって仕事をする必要が無い。

      ■短所
	そのコマンドが途中で中断可能なものなら誰でも root になれる。

	誰でも root = 誰でもアメリカ大統領(これくらい危険)

	setuid よりは制限のある setgid を使用する方が無難。

【パーミッション(3)】

● r、w、x 以外のパーミッション
   ファイルにはユーザ・グループ・他人(others)の3つの権限が存在します。
   そしてファイルの権限には r(読み取り)、w(書き込み)、x(実行)の
   三つの権限があります……と先週説明しました。これは確かに正しいようです。
   (実際、多くの入門書ではそう説明されています。
    しかし、その先が説明されていないようです。
    理由は、「知らなくても支障はないから」らしいです)


● 「s」と「S」って?
   s は setuid または setgid が設定された事を表す。
   S も上に同じ。
   ではどこがどう違うのか?

   ○ setuid
      プログラムのパーミッションを、実行者ではなく
      そのファイルの所有者にしてくれるもの。
      つまり、本来はあるユーザ(例えば root)のみに許可されたものを
      誰が*実行しても*許可されるようにする。
      たとえば yppasswd (使った事ある人、いるかな?)

      ディレクトリに対して setuid を適用すると、そのファイルは
      ファイルを作ったユーザではなく、ディレクトリの所有者と同じ
      uid が割り振られる。
	(ただし、学校で実験してみましたが、失敗しています)

   ○ setgid
      setuid のグループバージョン。
      そのファイルのプログラムを*実行する*時は誰でも一時的に
      そのグループの一員になることができる。

   ○ s と S の違い
      setuid、setgid ともに*実行する*ことが関わっている。
      つまり、s とはあらかじめ実行権を持って初めて発動する。
      元の所有者やグループが実行権を持っていないと s は
      発動できない(ゆえにエラーコード S を返す)。

   ○ 実行権と s、S
	 -rw-r--r--   1 keitam   student         0 Jul  4 17:00 foo
	    ↑ ↑
	左から4番目と7番目の要素が実行権を表す x 、
	もしくは setuid を表す s(もしくはエラーコード S)
	が表記される。

	いま、実行権 x がないときを 1、あるときを0、
	setuid が付加されているときを1、ないときを0とすると
	4番目と7番目に表記されるものは下の表の該当する
	部分の文字が表記される。

			実行権	|	0	1
	setuid(setgid)		|
	-------------------------------------------------
		0		|	-	x
		1		|	S	s


   ○ setuid の長所と短所
      ■長所
	例えば、あるユーザでしか実行出来ないプログラムに setuid ビットを
	設定すると、その人の代わりにコマンドを実行する事が出来る。
	そのユーザになるのはそのコマンドを実行している間だけである。
	そして、そのコマンドが終了するとともにまたもとの一般ユーザに戻る。

	特に次の状況でファイルが出来上がっているとき
		jikkou(プログラム・実行すると shuketu に内容を書き込む)
		shuketu(テキストファイル・user 以外書き込み権限なし)

	この場合、user 以外の人が shuketu にデータを
	書き込むことができない。

	この時、jikkou に setuid ビットを付加しておくと、
	jikkou を実行することによって、(user に成り代わることが
	できるので)shuketu ファイルに手を加えることができる。

      ■短所
	そのコマンドが途中で中断可能なものなら誰でも
	ファイルの所有者になれる。

	つまり、その人の環境を荒し放題、ということになる。

	setuid よりは制限のある setgid を使用する方が無難。


● スティッキービット
   『本来のスティッキービットの意味』
	man chmod で調べてみましょう。

   スティッキービットは主にディレクトリに付く権限です。
   /temp を見て下さい。

	drwxrwxrwt  12 root     root         4096 Jun 24 20:01 /tmp/   
		 ↑
		(注目)
   このように t が付いていますが、最初に問題にするのはそこではありません。

   このディレクトリは全ての人が全ての権限を与えられています。
	(つまり、普通に考えれば無法地帯ということになります。
	 特に書き込み権限があると言うことはファイル削除も
	 思いのままと言うことです。)
   それを防ぐためにスティッキービットと言うものが存在します。
   スティッキービットはファイルの削除・変更に関しては所有者のみが
   行えるという意味があります。
	(簡単に言うと t は「他人でも書けるけど消せない」という事です。
	 ということは w をうまく使わないと効果が発揮されません。)

	(ちなみにこのスティッキービットも7月3日に実験してみたところ
	 上の通りになりませんでした。原因は分かりません。)


● では実際に s や t を付けたい場合はどうすればいいか?
	chmod u+xs aaa

   そして、ls -l で現在の状況を調べてみよう。

	-rwsr--r--   1 keitam   root            0 Jun 22 01:35 aaa

   普通、x がつくべきところに s が表示されています。
   では次に

	chmod u-x aaa

   どうなりましたか?

	-rwSr--r--   1 keitam   root            0 Jun 22 01:35 aaa

   先ほどの s が S に変わりましたね。
   (環境・実行場所によっては S がつかず、強制的に外れる場合があります。
    学校の cc2000 では強制的に外します)
   今度は S を外しましょう。

	chmod u-s aaa

   ここで、 -S ではなく -s であることに注意して下さい。
   (実際に -S では外せない事を確認して下さい。)

   次に u を g に変えて上のコマンドを確認して下さい。
   また u を o に、s を t に変えて上のコマンドを確認して下さい。


● 数字でパーミッション変更
   パーミッションのモード指定は u+s 以外に方法はないのか?
   確か、数字での変更方法がありましたよね。

   -rwxrw-r-- に指定するためには「chmod 764 [ファイル名]」とします。

   -rwsrw-r-- に指定するためには一体どうすればいいんでしょう?

   実は数字でのモード表現にはもう一つ隠された要素があったのです。
   答えから言うと、
	chmod 4764 [ファイル名]
   とすればいいのです。

   ○ 4764 の意味
      4764 は 4 と 764 の二つの部分で分ける事ができます。

      764 は先週説明したとおりです。
      では 4 は?
      一度、二進数に直してみましょう

      100
      -		setuid
       -	setgid
        -	スティッキービット

      実はここで、setuid、setgid、スティッキービット を
      設定することができるのです。