差分

移動先: 案内検索

ユーザ権限とアクセス制御

5,120 バイト追加, 2018年12月14日 (金) 02:10
/* ディレクトリにsetgidビットを設定する */
ファイルには、ユーザIDとグループIDが設定されています。
ユーザID=このファイルの所有者です。
なお、本章の範囲では、所有者とユーザと同じ意味で使っています。尚、本章の範囲では、所有者とユーザと同じ意味で使っています。
ユーザが自分の所有するファイルの属性を変更し、そのファイルのアクセス権限などをコントロールすることができます。
ただしroot権限だけは例外で、システムのすべてに無制限にアクセスできます。
尚、ユーザIDが数字ではなくユーザ名として表示されるのは、ユーザIDはユーザIDが数字ではなくユーザ名として表示されるのは、ユーザIDは/etc/passwdで設定されている対応するアカウント名、
グループIDは/etc/groupで設定されている対応するグループ名に変換されて表示されるからです。
 
=== 読み込み / 書き込み / 実行 ===
基本的なファイルへのアクセス権限は、「読み込み」「書き込み」「実行」です。
<pre class="bash">
$ ls -l memo.txt
-rw-r--r-- 1 hironobu hironobu 44 Sep 20 19:17 memo.txt
$ ls -l /var/mail/hironobu
-rw-rw---- 1 hironobu mail 0 Dec 9 19:39 hironobu
</pre>
<pre class="bash">
$ chmod go-rw memo.txt
$ ls -l memo.txt
-rw------- 1 hironobu hironobu 44 Sep 20 19:17 memo.txt
</pre>
ユーザ(所有者)、グループ、その他ユーザの読み取り許可・不許可、書き込み許可・不許可、実行の許可・不許可は3ビットで表すので、この部分を8進数で表現することもできます。
その場合はビットの設定がuが110、gが000、oが000となるので、8進数表現をするモードでは600となります。その場合"rw-------"はビットの設定がuが110、gが000、oが000となるので、8進数表現をするモードでは600となります。
<pre class="bash">
$ chmod 600 memo.txt
$ ls -l memo.txt
-rw------- 1 hironobu hironobu 44 Sep 20 19:17 memo.txt
</pre>
== グループID利用の方法 ==
<pre class="bash">
$ ls -l
合計 56
-rw-r--r-- 1 taro taro 51200 2005-11-23 18:33 group_share.dat
</pre>
<pre class="bash">
$ chmod o-wr group_share.dat
$ chmod g+wr group_share.dat
</pre>
あるいは
<pre class="bash">
$ chmod 660 group_share.dat
</pre>
 
結果は次のようになります。
 
<pre class="bash">
$ ls -l
合計 56
-rw-rw---- 1 taro taro 51200 2005-11-23 18:33 group_share.dat
</pre>
<pre class="bash">
# groupadd taro-hanako
# gpasswd -a taro taro-hanako
# gpasswd -a hanako taro-hanako
</pre>
<pre class="bash">
$ chgrp taro-hanako group_share.dat
...
-rw-rw---- 1 taro taro-hanako 51200 2005-11-23 18:33 group_share.dat
</pre>
;考えてみよう: apacheはユーザwww-dataの権限で動作しています。cgi-binなどでコマンドを動かしファイルinfo.datに情報を書き込む必要があります。しかし、info.dataの中身に関してはセキュリティ上の問題のためユーザfoo以外には読ませたくありません(www-dataにも許可しません)。さて、この場合、info.datの適切なファイルの所有者、適切なパーミッションはどのようなものでしょうか。
=== プロセスのユーザIDとグループID ===
まずログインした時に、そのアカウント名に割り振られたユーザIDとグループIDの権限でログインシェルが動き始めます。
<pre class="bash">
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
hironobu 2796 0.0 1.0 8752 6716 ? R 12:14 0:05 emacs20 -geometry
...
</pre>
=== 現在の権限管理 ===
古典的なUNIXはUIDとGIDだけで説明は済みますが、Linuxも含めBSD 4.3以降では、もっと複雑な設定ができます。
<pre class="bash"> $ ls -l `find /bin -perm +a+s -print`exec ls -l {} \; -rwsr-xr-x 1 root root 35464 Nov 26252 Mar 3 04:56 2012 /bin/loginfusermount -rwsr-xr-x 1 root root 72488 Dec 24 88760 Mar 30 2002 2012 /bin/mount -rwsr-xr-x 1 root root 15244 34740 Nov 19 2001 8 2011 /bin/ping -rwsr-xr-x 1 root root 23112 39116 Nov 3 04:56 8 2011 /bin/ping6 -rwsr-xr-x 1 root root 31116 Sep 13 2012 /bin/su -rwsr-xr-x 1 root root 36904 Dec 24 67720 Mar 30 2002 2012 /bin/umount</pre>
一般ユーザでも何でもできる権限を手に入れてしまうということで、
このようなプログラムに誤りがあると大きなセキュリティ上の問題になります。
 
=== setgid ===
setgidは、set group id bitの意味です。そのファイルのグループIDと同じ権限で実行できます。
 <pre class="bash"> $ ls -l `find /usr/bin -perm +g+s -print`exec ls -l {} \;</pre> ....
ruidがrootの時、つまりrootがファイルを実行した時は何でもできるので、euidをプロセス内で制限なく変更できます。
アプリケーションがきちんと矛盾なく利用できるように設計できることとはまったく別のことです。
アプリケーションの設計が正しくなかったり、実装で間違えていると、セキュリティ侵害が発生することはいうまでもありません。
 
 
=== なるべくrootでは動かさない運用 ===
 
 
まだセキュリティなどをあまり気にせず、サーバとして動作しているものは何でもかんでもrootで実行していた時期がUNIXにもありました。
これの利点は、アクセスする先のファイルのパーミッションやroot権限でしかオープンできないポート番号など一々気にしなくてもかまわないという点です。
しかし、万が一、このサーバプロセスが何かの形で乗っ取られてしまい侵入者が外部から任意のコマンドを動かすことが出来るなら、侵入者にシステムに対して万能の権限を持ってしまうことになります。
現在では実行権限はなるべく絞る形で運用されています。
たとえばhttpd(apache)は1つだけrootで稼働しポートのオープンや子プロセスを生成するといった処理をします。
実際のHTTPリクエストに対する対応は別の権限を与えて実行しています。たとえば下の例だとapache/apacheの権限でプロセスを動作させています。
万が一、外部から不当なコマンドが動かされる事態になっても、apacheのユーザ権限が及ぶ範囲でしか被害がありません。
システムの書き換えなど重大なセキュリティ侵害からシステムを守り被害を最小限にできるようなシステムの設計にするのが現在の一般的な考え方です。
 
 
<pre class="bash">
% ps -eo user,group,args | grep httpd
root root /usr/sbin/httpd
apache apache /usr/sbin/httpd
apache apache /usr/sbin/httpd
apache apache /usr/sbin/httpd
apache apache /usr/sbin/httpd
</pre>
 
== ディレクトリへの特殊な設定 ==
=== ディレクトリにsetgidビットを設定する ===
 
ディレクトリのグループにsetgidビットを設定すると、そのディレクトリ以下に作られるファイル及びディレクトリには現ディレクトリのグループが適用されます。
 
<pre class="bash">
$ ls -l
合計 4
drwxrwx--- 2 hironobu hironobu 4096 12月 14 02:35 foo
$ sudo touch foo/fileA
$ ls -al foo
合計 8
drwxrwx--- 2 hironobu hironobu 4096 12月 14 02:36 .
drwxrwx--- 3 hironobu hironobu 4096 12月 14 02:35 ..
-rw-r----- 1 root root 0 12月 14 02:36 fileA
</pre>
 
この例は、fooというディレクトリがあり、そのディレクトリ下にコマンド touch を使いrootの持ち物である fileA を作成します。
この時のfileAの所有者、グループともrootです。
 
 
<pre class="bash">
$ chmod g+s foo
$ ls -ld foo
drwxrws--- 2 hironobu hironobu 4096 12月 14 02:36 foo
$ sudo touch foo/fileB
$ ls -al foo
合計 8
drwxrws--- 2 hironobu hironobu 4096 12月 14 02:37 .
drwxrwx--- 3 hironobu hironobu 4096 12月 14 02:35 ..
-rw-r----- 1 root root 0 12月 14 02:36 fileA
-rw-r----- 1 root hironobu 0 12月 14 02:37 fileB
</pre>
 
ディレクトリ foo に対しsetgid ビットの設定を行います。setgid ビットがセットされるとグループの"x"だった部分が"s"に変化します。
次にコマンド touch で fileB を作成します。
ディレクトリのグループ hironobu がファイルに継承されて fileB の所有者は root グループが hironobu になります。
 
=== ディレクトリにStickyビットを設定する ===
 
ユーザ(user)が読み書きできるディレクトリにStickyビットを設定した場合、そのディレクトリにどのユーザでもファイルを作成することができますが、ディレクトリから削除する場合、そのファイルの所有者(owner)しか削除できません。
 
<pre class="bash">
$ mkdir temp
$ ls -dl temp
drwxr----- 2 hironobu hironobu 4096 12月 14 03:12 temp
$ chmod go+rwxt temp
$ ls -dl temp
drwxrwxrwt 2 hironobu hironobu 4096 12月 14 03:12 temp
</pre>
Access Control Lists(ACL)は元々のUNIXにはないアクセス制御方式で、その仕様に関してはPOSIXで定義されています。Linuxカーネル2.6以降で採用されています。Linuxカーネル2.6以降ではLinuxの主要ファイルシステムで利用可能です。
UNIXでは自分以外のユーザにアクセスを許可する場合は、グループに許可するか、それともすべてのユーザに許可するかの大まかな条件でアクセス制御をしています。一方、ACLではアクセス許可を特定のユーザの単位で、あるいはグループ単位で設定できます。ACLの導入により、これまでのUNIXのアクセス制御よりも複雑な設定をすることが可能になります。UNIXでは自分以外のユーザにアクセスを許可する場合は、グループに許可するか、それともすべてのユーザに許可するかの大まかな条件でアクセス制御をしています。一方、ACLではアクセス許可を特定のユーザの単位で、あるいはグループ単位で設定できます。ACLの導入により、これまでのUNIXのアクセス制御よりも現敵的な設定をすることが可能になります。 
次のようなファイルがあるとします。
 
<pre class="bash">
$touch foo.txt
$ ls -l foo.txt
-rw-rw-r-- 1 hironobu hironobu 0 Aug 31 08:15 foo.txt
</pre>
 
コマンドgetfaclを使ってパーミッションを表示すると次のようになります。
 
<pre class="bash">
$ getfacl foo.txt
# file: foo.txt
group::rw-
other::r--
</pre>
 
次に自分以外のユーザが読み書きできないようにしてみます。
 
<pre class="bash">
$ chmod go-rw foo.txt
$ ls -l foo.txt
-rw------- 1 hironobu hironobu 0 Aug 31 08:15 foo.txt
</pre>
この状態でwww-dataユーザのみにfoo.txtの読み込みを許諾するとなると、グループを使う方法だとwww-dataとhironobuだけのグループを作り、そのグループを設定し、グループの読み込みを許可する、といったことをしなければなりません。しかしACLの機能を使えばwww-dataのみに読み込みを許諾することができます。属性を設定にはコマンドsetfaclを使用します。
この状態でwww-dataユーザのみにfoo.txtの読み込みを許諾するとなると、グループを使う方法だとwww-dataとhironobuだけのグループを作り、そのグループを設定し、グループの読み込みを許可する、といったことをしなければなりません。このWebサーバがアクセスしなければならないファイルの所有者がhironobuのユーザしか存在していないのならば、グループで運用するのも問題ありません。しかし、もし、hironobu以外にmasamiというユーザがいたならば、双方別々のグループを作りwww-dataを加えるといった方法が必要になります。もちろんこの方法はユーザが増えるたびにグループも増えます。 そこでACLの登場です。www-dataのアカウントのみを直接指定してアクセスを許すといった個別の対応ができれば、これまでのUNIXのアクセス権限の手法よりもシンプルに扱うことが出来るようになります。 === setfacl ACLの設定 ===
コマンドsetfaclはaclをセットするためのものです。ユーザwww-dataに"r"だけ許可をしてみます。
 
<pre class="bash">
$ setfacl -m user:www-data:r foo.txt
</pre>
 
ではコマンドgetfaclを使って、どう変化したか見てみましょう。
 
<pre class="bash">
$ getfacl foo.txt
# file: foo.txt
mask::r--
other::---
</pre>
先ほどの内容から2点変わっているのがわかるはずです。まず1点はuserの表示が増えたこと、そしてmaskという新しい項目ができたことです。maskは所有するユーザ以外に与えることのできる最大限の権限です。この場合はmaskに対して指定していないのでデフォルトの"r"が設定されています。
先ほどの内容から2点変わっているのがわかるはずです。まず1点はuserの表示が増えたこと、そしてmaskという新しい項目ができたことです。maskは所有するユーザ以外に与えることのできる最大限の権限です。この場合はmaskに対して指定していないのでデフォルトの"r"が設定されています。
ここではwww-dataのみですが、複数のユーザに対しても同様に個別の設定をすることができます。
 
ここではユーザのみに関して説明していますが、グループに対しても複数のグループを割り当てたりすることが可能です。
 
さらに詳しく知るためには
openSUSE
<ref>
openSUSE ドキュメンテーショ 第9章 Linux におけるアクセス制御リスト第15章 Linuxのアクセス制御リストhttphttps://opensuse-man-jawww.berliossuse.decom/opensuseja-htmljp/documentation/sles10/book_sle_reference/data/cha.security.acls.html</ref>
やRadHat
<ref>
さて、この状態でls -lでファイルのパーミッションの状況をみてみましょう。
 
<pre class="bash">
% ls -l foo.txt
-rw-r-----+ 1 hironobu hironobu 0 Aug 31 08:15 foo.txt
</pre>
 
最後に"+"と表示されているのは、ACLが設定されているということを意味しています。
----
[[目次]]へ
 
 
このページへのショートURL:
http://uc2.h2np.net/i/df.html