LinuxのSetfaclコマンド


set faclコマンドは、コマンドラインにACL(アクセス制御リスト)を設定するために使用されます。命令行では、一連の命令が一連のファイル名で続いています。
オプション

-b,--remove-all:       acl  ,   acl  (   ,  ,  )    。
-k,--remove-default:     acl  。        ,    。
-n,--no-mask:          。setfacl       ACL mask,  mask      。
--mask:        ,  ACL mask     。
-d,--default:     acl  。
--restore=file:        acl  (      getfacl -R  )。                acl  。       --test           。
--test:    ,         acl  ,    acl      。
-R,--recursive:               。
-L,--logical:      ,              ,        。
-P,--physical:        ,        。
--version:  setfacl       。
--help:      。
--:         ,                
-:      -, setfacl           。
  • オプション-mおよび-xは、後にaclルールで続く。複数のaclルールはカンマ(,)で区切られている。オプション-Mおよび-Xは、ファイルまたは標準入力からaclルールを読み取るために使用される。
  • オプション--セットおよび--set-fileは、ファイルまたはディレクトリのaclルールを設定するために使用され、以前の設定は上書きされます。
  • オプション-m(--modify)および-M(--modify-file)は、ファイルまたはディレクトリのaclルールを変更するオプションを選択します。
  • オプション-x(--remove)および-X(--remove-file)オプションでaclルールを削除します。
  • -Mを使用して-Xオプションがファイルから規則を読み込むと、SEtfaclはgetfaclコマンドの出力を受け付けるフォーマットです。行ごとに少なくとも一つの規則があり、注釈として扱われる。
    ACLsをサポートしていないファイルシステムでsetfaclコマンドを使用すると、setfaclはファイルの権限ビットを変更します。aclルールがファイルの権限ビットに完全に一致していない場合、setfaclはファイルの権限ビットを変更し、できるだけaclルールに反応させ、0より大きい状態で、standar errorにエラーメッセージを送信します。
    パーミッション
    ファイルの所有者およびCAP_FOWNERのユーザプロセスは、ファイルのaclを設定することができます。現在のlinuxシステムでは、rootユーザは唯一のCAP_FOWNER能力を持つユーザである)
    ACLルール
    set faclコマンドは、以下の規則フォーマットを識別することができる。
    
    [d[efault]:] [u[ser]:]uid [:perms]        ,        (  uid    )。
    [d[efault]:] g[roup]:gid [:perms]         ,         (  gid   )
    [d[efault]:] m[ask][:] [:perms]         
    [d[efault]:] o[ther] [:perms]         
    適切なaclルールは修正と設定の操作に用いられ、uidとgidに対しては数字を指定したり、名前を指定したりすることができます。permsドメインは、様々なパーミッションを表すアルファベットの組み合わせである。-rを読み、-wを書き込み、-xを実行し、ディレクトリと実行可能なファイルの一部だけを実行する。persドメインは、8進数の書式に設定することもできます。
    自動作成のルール
    最初のファイルディレクトリには3つの基本的なaclルールしか含まれていません。規則を正常に実行するためには、以下の規則を満たす必要があります。
  • の3つの基本ルールは削除されません。
  • のいずれかのルールは、指定されたユーザ名またはグループ名を含む有効な権限の組み合わせを含む必要があります。
  • のいずれかにデフォルト規則が含まれている規則は、使用時にデフォルト規則が存在しなければならない。
  • ACLの名詞定義
    まずACLの中の名詞の定義を見てみます。これらの名詞は大体マン pageから取ってきます。ちょっと味気ないですが、下の内容を理解するのに役に立ちます。
    ACLは一連のAccess Entryからなり、それぞれのAccess Entryは特定のカテゴリがファイルに対して持つことができる操作権限を定義しています。Access Entryには三つの構成部分があります。Entry、qualifer、permission。
    まず一番重要なEntryを見に行きます。次のタイプがあります。
    
    ACL_USER_OBJ:   Linux file_owner permission
    ACL_USER:                 permission
    ACL_GROUP_OBJ:   Linux group permission
    ACL_GROUP:                permission
    ACL_MASK:   ACL_USER, ACL_GROUP_OBJ ACL_GROUP      (           )
    ACL_OTHER:   Linux other permission
    例によって説明します。ここではgetfaclコマンドで定義されたACLファイルを確認します。
    
    [root@localhost ~]# getfacl ./test.txt
    # file: test.txt
    # owner: root
    # group: admin
    user::rw-
    user:john:rw-
    group::rw-
    group:dev:r--
    mask::rw- other::r--
    前の3つは嗳頭でファイル名、file owner、groupを定義しました。これらの情報はあまり効果がありません。これからは--omit-headerを使って省略します。
    
    user::rw-       ACL_USER_OBJ,   file owner  read and write permission
    user:john:rw-     ACL_USER,    john            ,              
    group::rw-      ACL_GROUP_OBJ,     group  read and write permission
    group:dev:r--     ACL_GROUP,  dev        read permission
    mask::rw-       ACL_MASK    read and write
    other::r--      ACL_OTHER    read
    ここからACLは特定のユーザーとユーザーグループを定義できる機能を提供していることが分かります。次にファイルを設定するACLを見てみます。
    ACLファイルの設定方法
    まず、ACLファイルを設定するフォーマットについて説明します。上記の例から、それぞれのAccess Entryは三つのコードで区切られたフィールドからなります。一番目はEntryです。
    
    user     ACL_USER_OBJ ACL_USER
    group    ACL_GROUP_OBJ ACL_GROUP
    mask     ACL_MASK
    other    ACL_OTHER
    第二のフィールドをqualiferと呼び、つまり上記の例のjohnとdevグループは、特定のユーザとサポートグループのファイルに対する権限を定義しています。ここでは、userとgroupだけがqualifeerを持っています。他は全部空です。第三のフィールドは私たちがよく知っているpermissionです。Linuxのpermissionと同じように定義されています。ここでは多くの話をしません。
    これから、test.txtというファイルをどのように設定するかを見てみます。ACLはこれを私達の上の要求に達成させます。
    最初のファイルにはACLの追加属性がありません。
    
    [root@localhost ~]# ls -l
    -rw-rw-r-- 1 root admin 0 Jul 3 22:06 test.txt
    [root@localhost ~]# getfacl --omit-header ./test.txt
    user::rw- group::rw- other::r--
    まずユーザーjohnにtest.txtファイルの読み書き権限を持たせます。
    
    [root@localhost ~]# setfacl -m user:john:rw- ./test.txt
    [root@localhost ~]# getfacl --omit-header ./test.txt
    user::rw-
    user:john:rw-
    group::rw-
    mask::rw-
    other::r--
    この時、私達はjohnユーザーがACLで文書の読み書き権を持っているのを見ることができます。この時linuxのpermissionを調べたらまた違ったところを見つけます。
    
    [root@localhost ~]# ls -l ./test.txt
    -rw-rw-r--+ 1 root admin 0 Jul 3 22:06 ./test.txt
    ファイルのpermissionの最後に一つの+号が多くなりました。どのファイルもACL_を持っています。USERまたはACL_GROUTPの値をACLファイルと呼ぶことができます。この+号は私たちにヒントを与えるものです。また、1つのファイルがACL_USERまたはACL_GROUPの値を持っている場合にはACL_MASKも同時に定義されることを発見することができる。
    次に私達はdevグループを設置してread permissionを持ちます。
    
    [root@localhost ~]# setfacl -m group:dev:r-- ./test.txt
    [root@localhost ~]# getfacl --omit-header ./test.txt
    user::rw-
    user:john:rw-
    group::rw-
    group:dev:r--
    mask::rw-
    other::r--
    ここで上述の要求を完成しました。簡単ですか?
    ACL_MASKとEffective permission
    ここでは、ACL_MASKはACLを掌握するもう一つの鍵であるため、Linux file permissionでは、rw-rw-r--にとって、そのrw-はファイルグループのpermissionを指すということをみんなが知っていますが、ACLではこのような状況はACL_MASKが存在しない場合にのみ成立します。ファイルにACL_があればMASK値は、rw-の中で代表されているのがmark値であり、group permissionではありません。
    この例を見てみましょう。
    
    [root@localhost ~]# ls -l
    -rwxrw-r-- 1 root admin 0 Jul 3 23:10 test.sh
    ここでtest.shファイルはfile owner:rootのみread、write、execute/search permissionを持っています。adminグループはread and write permissionだけあります。今はユーザーjohnもtest.shに対してrootと同じpermissionを持っています。
    
    [root@localhost ~]# setfacl -m user:john:rwx ./test.sh
    [root@localhost ~]# getfacl --omit-header ./test.sh
    user::rwx user:john:rwx
    group::rw-
    mask::rwx
    other::r--
    ここで、johnがrwxのpermissionを持っていることを見ました。mark値もrwxに設定されています。それはACL_USERACL_GROUPACL_GROUP_OBJの最大値を規定しています。今はtest.shのLinux permissionを見に来ます。
    
    [root@localhost ~]# ls -l
    -rwxrwxr--+ 1 root admin 0 Jul 3 23:10 test.sh
    今adminグループのユーザーがtest.shのプログラムを実行したいと思ったら、どうなりますか?それはpermission denyにされます。なぜなら、実際にadminグループのユーザはread and write permissionだけであり、ここに表示されるrwxはACL_MASKの値であり、groupのpermissionではないからである。
    ですから、ここから分かります。もしファイルの後ろに+マークがあるなら、私たちはgetfaclでそのpermissionを確認します。混淆が起こらないようにします。
    次にもう一つの例を見てみます。もし今test.shのmarkをread onlyに設定したら、adminグループのユーザーはまたwrite permissionがありますか?
    
    [root@localhost ~]# setfacl -m mask::r-- ./test.sh
    [root@localhost ~]# getfacl --omit-header ./test.sh
    user::rwx
    user:john:rwx  #effective:r--
    group::rw-   #effective:r--
    mask::r--
    other::r--
    この時ACL_を見ることができます。USERとACL_GROUT_OBJの隣にもう一つ増えました。これはどういう意味ですか?ACL_MASKの定義を振り返ってみましょう。ACL_USERACL_GROUP_OBJACL_GROUPACL_USERの最大権限を規定しています。この例では彼らの最大の権限はread onlyです。ここでACL_GROUP_OBJchacl -Bに他の権限を設定しましたが、本当に効果があるのはread権限だけです。
    この時にtest.shのLinux file permissionを見に来ました。そのgroup permissionにもmaskの値が表示されます。
    
    [root@localhost ~]# ls -l
    -rwxr--r--+ 1 root admin 0 Jul 3 23:10 test.sh
    Default ACL
    上に述べたのは全部Access ACLです。つまり文書にとってです。以下は簡単にDefault ACLについて説明します。Default ACLとは、一つのディレクトリに対してDefault ACL設定を行い、このディレクトリで作成したファイルはすべてこのディレクトリのACLを引き継ぎます。
    同様に、私たちはテストの説明を行います。例えば、rootユーザーがdirディレクトリを作成しました。
    
    [root@localhost ~]# mkdir dir
    彼はこのディレクトリで作成したファイルをすべてjohnユーザーにアクセスしてもらいたいです。私たちはdirディレクトリにDefault ACLを設定するべきです。
    
    [root@localhost ~]# setfacl -d -m user:john:rw ./dir
    [root@localhost ~]# getfacl --omit-header ./dir
    user::rwx
    group::rwx
    other::r-x
    default:user::rwx
    default:user:john:rwx
    default:group::rwx
    default:mask::rwx
    default: other::r-x
    ここでACLはdefaultオプションを定義しています。johnユーザーはdefaultのread、write、excute/search permissionを持っています。定義されていないdefaultは全部file permissionのcopyから来ます。今rootユーザーはdirの下でtest.txtファイルを作成します。
    
    [root@localhost ~]# touch ./dir/test.txt
    [root@localhost ~]# ls -l ./dir/test.txt
    -rw-rw-r--+ 1 root root 0 Jul 3 23:46 ./dir/test.txt
    [root@localhost ~]# getfacl --omit-header ./dir/test.txt
    user::rw-
    user:john:rw-
    group::rwx #effective:rw-
    mask::rw-
    other::r--
    ここで私達はdirの下で作成されたファイルjohnユーザーが自動的にread and write permissionを持っているのを見ました。
    ACL関連コマンド
    前の例では、getfaclコマンドはファイルを読み込むためのACLであり、setfaclはファイルを設定するためのAcess ACLであることに注目しています。もう一つのchaclはファイルとディレクトリを変更するためのAccess ACLとDefault ACLです。その具体的なパラメータは皆さんがman pageを見に行くことができます。私はsetfacl -xについて話したいだけです。ファイルまたはディレクトリのACL属性(Default ACLを含む)を徹底的に削除できます。例えばchacl -Bを使ってすべてのファイルのACL属性を削除しました。その+番号はやはりファイルの最後に現れます。正しい削除方法はタイプを使ってファイルをコピーする時に私達は今-pオプションを追加できます。このように、ファイルをコピーする際にも、ファイルをコピーするACL属性は、コピーできないACL属性に対して警告を与えます。
    cpコマンドは、デフォルトでファイルのACL属性を移動します。同様に、動作が許可されていない場合には警告を与えます。
    注意すべき点
    もしあなたのファイルシステムがACLをサポートしていないなら、あなたはもう一度mvあなたのfile systemを必要とするかもしれません。
    
    mount -o remount, acl [mount point]
    mountコマンドでLinux file permissionを変更すると、対応するACL値も変化し、逆にACLの値を変更すると、対応するfile permissionも変化します。
    締め括りをつける
    以上は、LinuxのSetfacl命令を紹介しました。皆さんの助けになりたいです。もし何か質問があれば、メッセージをください。編集はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。