LinuxのACLを設定してみよう (1) ACLの概要

LinuxのACLを設定してみよう (1) ACLの概要

2015.09.09

POSIX ACL(アクセス制御コントロール)という機能をご存知ですか。ACLを使用することによってファイルへのアクセスをより細かく制御することが可能となります。昔からある機能ですが、意外と知らない方、使ったことないという方もいらっしゃって、そういう方々と稀に上位コースでも出会ったりします。RedHatではシステム管理系のコースだけでなく、上位コースの「RedHatEnteprizeのクラスタリングとストレージの管理(RH436)」コース「RedHatGlusterStorageAdministration(RH236)」コースなどにもACLを使用する内容が出てきます。ACLって何だっけ、そんな方向けの内容です。

ACLとは

ACL(アクセス制御コントロール)とは、特定のユーザやグループに対してパーミッションを設定する機能です。Linuxの場合、パーミッションを使ってファイルへのアクセス制御をしますが、デフォルトでは「ファイルの所有者(ユーザ)」「ファイルのグループ」「その他」の3種類でファイルにアクセスしてくるユーザ(プロセス)を分類します。パーミッションを設定するのもこの3種類に対して行うため、大雑把なアクセス制御しかできないようになっています。

しかしACLを使えば、特定のユーザやグループという単位で、よりその場面に沿ったパーミッションを細かく設定することができるようになります。

例えば、社内であるプロジェクトを進めていたけれど、人手不足により他部署の人間が急遽参加してきました。彼はプロジェクトの資料が置かれている共有ディレクトリにアクセスできる必要があります。その場合ACLを使って、共有ディレクトリに彼のユーザアカウントからのアクセスを許可する設定を行います。

例えば、新しくチームに入ってきた彼の歓迎会をサプライズで行いたいと考えています。彼には当日まで秘密にし、その他のチームメンバーで歓迎会の企画に関わるファイルを共有できるように設定します。ACLを使って、彼のユーザアカウントに対してだけアクセスを許可しない設定を行います。

例えば、複数の部署が合同でイベントを進めることになり、それら部署のグループからはアクセス可能な共有ディレクトリを作成する必要がでてきました。ACLを使って、それら複数の部署のグループに対してアクセスを許可する設定を行います。

このようにACLを使えば、わざわざ新しいグループを作成したり、ユーザをグループに追加したりしなくても、既存の状態のユーザやグループにパーミッションを設定することができます。

では次に、実際の設定や確認方法などをご紹介していきます。

ACLの有効化

まずACL機能を使うためには、ファイルシステムがACLをサポートしている必要があります。まずはサポートを有効にします(ただし、XFSはデフォルトで有効、ext2/ext3/ext4は自動で有効になっている場合もあります)。

有効にするにはaclマウントオプションを使います。ちなみにマウント管理にはrootユーザ権限が必要です(そのため、実行例のコマンドプロンプトを#にしています)。

例えば、手動でマウントを実行する場合は以下のように実行します。

例えば、起動時に自動でマウントを実行する場合は以下のように実行します。

他にも、ファイルシステムのデフォルトマウントオプションとして設定する方法もあります。

ちなみに有効になっていないファイルシステムでACLを操作すると、以下のようなメッセージが返ってきます。

このメッセージが出てきた場合、その領域ではACL付きファイルを扱えないので、先にACLを有効にしてください。

では次に、ACLの設定について紹介します。

ACLの設定

ACLはファイルやディレクトリに対して設定します。

設定にはsetfaclというコマンドを使用します。setfaclを使ってACLを設定できるのは、rootユーザか、そのファイルの所有者のユーザです(所有者であれば一般ユーザでも実行可能なので、コマンドプロンプトを$にしています)。

例えば、studentユーザにfile1ファイルにrwのパーミッションを許可したい場合には、以下のように実行します。

-mが設定のためのオプションです。
その後に「user:対象ユーザ名:パーミッション」という形式で指定をします。userの部分は短縮可能で「u: 対象ユーザ名:パーミッション」と指定しても同じ意味になります。

例えば、staffグループにfile1に「rw-」のパーミッションを許可したい場合には、以下のように実行します。

グループに対して設定する場合には-mオプションの後に

「group:対象グループ名:パーミッション」

という形式で指定します。groupの部分は短縮可能で

「g: 対象ユーザ名:パーミッション」

と指定しても同じ意味になります。
では次に、設定した内容の確認の仕方について紹介します。

ACLの確認

何らかのACLが設定されると以下のls -lの実行結果のように、第1フィールドの末尾に「+」記号がつきます。

lsコマンドでは、ACLの設定内容まで表示できないので、専用コマンドを使用します。ACLの設定内容を確認する場合には、getfaclコマンドを実行します。

getfaclの実行結果に「user:student:rw-」や「group:staff:rw-」という1行があります。

:(コロン)を区切りにした第2フィールドに特定のユーザ名やグループ名を持つものが、先ほど設定した特定のユーザやグループのパーミッションを表している部分です。また「user::rw-」や「group::rw-」と第2フィールドが空の1行がありますが、これらはファイルの所有者やファイルのグループを自動的に差しています。

なのでこの実行例の場合、ファイルの所有者は「rw-」、studentユーザは「rw-」、ファイルのグループは「rw-」、staffグループは「rw-」、それ以外は「r–」と読み取ることができます。

では次に、パーミッションの判定順番を紹介します。
パーミッションの判定は、ファイルの所有者、特定のユーザ、グループ、その他という順番です。判定し、一致した時点でパーミッションが決定されます。

そのため、アクセスされたくないユーザの場合には以下のように、許可しないパーミッションを設定しておきます。

例えばoutsiderユーザ(プロセス)がアクセスしてきたら、まずはファイルの所有者かどうか判定されます。異なる場合のみ、特定のユーザと一致するか判定されます。

ここで一致すると、そのパーミッションの値が適用されます。この例の場合、outsiderユーザには「—」というパーミッションで設定されているので、アクセスが一切許可させていません。たとえグループやその他のユーザに対しては許可されていても、先に一致したoutsiderユーザはアクセスできないのです。

では次に、まとめを紹介します。

まとめ

その他にもACLには、ディレクトリにACLのデフォルトを設定したり、maskを使って一気にパーミッションを制御したりなど、様々な機能があります。それら詳細は「RedHatシステム管理II(RH134)」や「RHCSA速習(RH199)」でご紹介しています。機会があればご参加ください。

ここでご紹介した通りACLは特定のユーザとグループに対してパーミッション設定ができます。場面に合わせて細かくアクセス制御をしたい場合には、ぜひACLを使ってください。

以上、ありがとうございました。

記事は、予告なく変更または削除される場合があります。
記載された情報は、執筆・公開された時点のものであり、予告なく変更されている場合があります。
また、社名、製品名、サービス名などは、各社の商標または登録商標の場合があります。