皆さんは、持っている全てのデータを全てのユーザーに見せていいという訳ではない、事は理解していると思います。 そのために殆どの計算機ではアクセス制御の機能を持っています。 unix(linux)では、パーミッションコードを使う方法が広く知られています。 この方法では、本人、グループ、全体の3つのカテゴリに対して、読み、書き、実行の3つの許可属性を定義できます。 自分以外の全体に対して許可や禁止をしたいときや、RCNPのようにグループ分けがきちんと管理されている グループに対しては、よい方法であり、設定も簡単です。 しかし、この法では特定の個人や、数人の仲間に許可をしたい時には実現できません。 そのため、許可する必要がない人たちにまで不要なアクセスを許可している場合もあるかと思います。 この状況はセキュリティ管理上、大きな問題になる場合もあります。
そこで、より細かなアクセス制御を行う方法として、ACLというものがあります。 これは、アクセスコントロールリストというもので、とても高度な使い方もできる機能ですが、 この文書では、アクセスを許可する数名~10数名 (*1) のユーザー名を列挙して定義する方法を説明します。
*1 実は数に上限がある訳ではありませんが、列挙する方法で何百人も管理するのは大変なので、実用上はそれくらいという意味です。
尚、この文書では、RCNPの計算機室が運用している原子核物理学物理学計算機上とwebサーバー上での 動作を確認しています。ともにRedHatなので、他のRedHat計算機でも同様に動作する筈です。
また、原子核物理学計算機がマウントしているスパコンのディスクに関しても動作する事を確認しています (スパコン側もRedHatです)。 スパコン側でACLを設定し、原子核物理学計算機側でもその通りに制御できること、およびその逆でも動作する事を確認しています。 但し、両システムではユーザー名が異なるので同一のACLに対してユーザー名部分はそれぞれのシステムでは、 それぞれのシステムのユーザー名で表示されることに注意して下さい。lsのユーザー名部分と同じ動作です。
ACLを皆さんに使って頂きたいのは、以下のような場合です。
webサーバーで不特定の人に見せたくないコンテンツを .htaccess ファイルでアクセス制御して 特定の人だけに見せるようにする事は、多くの人が経験していると思います。 しかし、この方法ではwebサーバーにアクセスしてくる人はそうできますが、 mihoのアカウントを持っている人には効果はありません。 mihoのアカウント所有者はmihoにログインして直接ファイルにアクセスする事ができるからです。 この場合は、unix(linux)の通常のファイルパーミッションに従ってアクセス制御が行われ、 パーミッションコードで許されていれば、結果としてファイルを見る事ができます。
ファイルはapacheが読めなければいけませんので、多くの人は chmod o+r をしていると思いますが、 これだとmihoのアカウント所有者は誰でも読めてしまいます。これは意図に反するでしょう。
ファイル(またはそれが含まれるディレクトリ)は、apache(と自分)だけがアクセスできれば、 ファイルを編集でき、webで条件付きの公開ができます。決してmihoのユーザー全員に見せる必要はありません。 これはACLを設定すれば、そう機能させることができます。
PHP等のスクリプトを使用する場合は、もっとひどい状態になっているかも知れません。 スクリプトで何らかのファイルを作成する場合は、apacheはそのファイルに書込権限を持っている必要があります。 ACLを使わないと chmod o+rw としているかも知れません。これは大変危険な状態である事は分かるでしょう。 悪意がなくても事故が起こるかも知れません。
apacheに対して適切な読出権、書込権を設定して安全で意図通りの動作をするようにすべきです。
少数の特定のユーザーにだけ、読出しを許可したい、場合によっては、書込みを許可したい場合、 ACLを使わないと chmod o+r とか、chmod o+rw とかしていて、 他のユーザーにもアクセスを許可してしまっているのは、大変危険な状態です。
特定のユーザーにだけ必要なアクセス権を適切に設定するべきです。 ACLを使えばこれが実現できます。
RCNPでは全ての人は alluser というグループに入っています。 従って、alluser グループに対するアクセス権と、その他のユーザー(o)に対するアクセス権は実質上、同じです。 アクセスをグループに限定しても限定している事にはなりません。
スパコンではRCNPのユーザーは、rcnpグループに属しています。これは上記の alluser と同じです。 従って、アクセスをグループに制限してもrcnpのユーザーに制限するだけで、上記と同じ事になります。
スパコンではその他のユーザー(o)は、CMCの全てのユーザーを意味します。 「その他のユーザー」に許可をすると、RCNPユーザーだけでなく、RCNP以外の全てのユーザーにも許可している事になりますので その設定はしないようにして下さい。 RCNPのアカウントとは別にCMCのアカウントを持っている場合には、 ACLを使って許可をするのが安全な設定方法です。
ACLでは、設定するアクセス権は、chmodコマンドと同様に、rwxの3種類です。
アクセスを許可する人を個別に複数、設定できます。chmodでは、自分、グループ、全体の3種類しかありませんでしたが、 「あるユーザー」というのを複数設定できます。実は、「自分」もこれの1つの場合になります。
ACLはchmodで設定するのと両立はできないと考えて下さい。 ACLを設定している状態で、chmodの設定を行うと、多くの場合は、上書きされて、ACLの機能が失われます。
% setfacl -m u:ユーザー名:r ファイル名例
% setfacl -m u:yikeda:r b.txt複数のユーザーに読出権を与える場合は、このコマンドを別のユーザー名を指定して繰り返して下さい。 ACLは、基本的にアクセス権を指定する「リスト」に新しいリストを加えます。 消去のコマンドは別に述べます。
% setfacl -m u:ユーザー名:rw ファイル名例
% setfacl -m u:ishiin:rw c.txt複数のユーザーに読書権を与える場合は、このコマンドを別のユーザー名を指定して繰り返して下さい。 読出権だけを与えるコマンドと併用できます。
lsコマンドで以下のようになっている(抜粋)とします。
-rw------- 1 togawa alluser 8 11月 29 12:29 2016 a.txt -rw-r-----+ 1 togawa alluser 8 12月 2 19:24 2016 b.txt -rw-rwx---+ 1 togawa alluser 2 12月 2 20:40 2016 c.txt -rw-rwx---+ 1 togawa alluser 2 12月 2 20:40 2016 d.txt
ACLを表示させるには以下のようにコマンドを使います。
% getfacl ファイル名例です。右の解説を読んで下さい。
% getfacl b.txt # file: b.txt ファイル名です。 # owner: togawa オーナーは togawa です。 # group: alluser グループは alluser です。 user::rw- オーナーのアクセス権は rw- です。 user:yikeda:r-- ユーザー yikeda に読出しを許可します。 group::--- グループのアクセス権はありません。lsコマンドの表示と異なるように見える事に注意して下さい。 mask::r-- ACLを設定した時のマスクです。この意味は初心者は知らなくても困りません。 other::--- その他のユーザーのアクセス権はありません。この場合、group と other にアクセス権が全くありませんから、 オーナーの togawa と、許可された yikeda の2名だけがアクセスできます。 togawa は読出しと書込みができますが、yikeda は読出しだけができます。
% getfacl c.txt # file: c.txt # owner: togawa # group: alluser user::rw- user:ishiin:rwx ユーザー ishiin に読出し、書込み、実行権を許可します。 group::--- mask::rwx other::---
# file: d.txt # owner: togawa # group: alluser user::rw- user:yikeda:rwx ユーザー yikeda に読出し、書込み、実行権を許可します。 user:ishiin:rwx ユーザー ishiin に読出し、書込み、実行権を許可します。 group::--- mask::rwx other::---最後の例では、ーナーの togawa、ユーザー yikeda, ishiin の計3名がファイルに読書きでき、他の人は見る事すらできません。
設定済みのリスト1つだけを消去する
% setfacl -x u:yikeda:r b.txt全てのACLを消去する
% setfacl -X b.txt
ACLの設定を1つづつ行うと、数が多い場合は大変です。 あるファイルのACLをテキストファイルとして保存しておき、 それを使って別のファイルのACLを設定する事ができます。 更に、そのファイルを保存しておく必要がない場合、PIPEを使ってACLをコピーする事ができます。
% getfacl ファイル1 | setfacl --set-file=- ファイル2ファイル1に設定されているACLと同じものを、ファイル2に設定する。 ファイル2に既存のACLがあっても、それは消去されたうえで、ファイル1のACLが設定されます。
ACLはディレクトリに関しても同様に設定できます。
ファイルのACLを設定しても、その上位のディレクトリへのアクセス権がなければ そのファイルへのアクセスはできません。これは普通のパーミッションの設定の 場合と同じです。