Linuxの拡張ファイル属性(extended attributes)についてメモ

Linux Kernel 2.6 以降ではファイルやディレクトリのメタ情報を柔軟に設定する extended attributes(EA)が取り入られ、ext2, ext3, ext4, JFS, ReiserFS, XFS, Btrfs といった主要なファイルシステムで利用することができる。

身近なところでは、デスクトップ検索の beagle や分散ファイルシステムの GlusterFS などで利用されている。
(逆に言うと EA を使えないファイルシステム(aufs とか)では、GlusterFS を動かせない)
気になったので、以下の機能についてちょこっと触ってみた。

目次

  1. コマンドラインを利用した基本的な使い方
  2. 外部プログラム(Python)からの利用
  3. 応用1: Access Control List(ACL)
  4. 応用2: file capabilities

環境は Ubuntu 12.04(64 bit/ext4)

1. コマンドラインを利用した基本的な使い方

EA をコマンドラインから操作するためのプログラム群は attr、ライブラリーは libattr1-dev パッケージにある。

  • attr – Utilities for manipulating filesystem extended attributes
  • libattr1-dev – Extended attribute static libraries and headers

次 の4種類のネームスペースがある。

  1. user(user space)
  2. trusted(user space の実行プロセス制限付き)
  3. system(Kernel)
  4. security(SELinux)

属性のセッター/ゲッターは setfattr/getfattr が対応。

key(-n の引数)と value(-v の引数)を指定して操作する。

$ touch tfile
$ setfattr -n user.version -v "1.0.1" tfile      # set attribute
$ setfattr -n user.desc -v "dummy program" tfile # set attribute
$ getfattr -n user.version tfile # get attribute
# file: tfile
user.version="1.0.1"

$ getfattr -d tfile # dump attributes
# file: tfile
user.desc="dummy program"
user.version="1.0.1"

$ setfattr -x user.desc tfile # remove attribute
$ getfattr -d tfile
# file: tfile
user.version="1.0.1"

2. 外部プログラムからの利用

C プログラムの場合、setxattr, lsetxattr, and fsetxattr といったシステムコールが用意されている。
Python の場合、3.3 以降では標準ライブラリ(os)に取り込まれている。

New functions to support Linux extended attributes (issue 12720): getxattr(), listxattr(), removexattr(), setxattr().
http://docs.python.org/3.3/whatsnew/3.3.html#os

3.3 以前の場合は xattr 等を利用する。(インストールは $ pip install xattr でOK)

3. 応用1: Access Control List(ACL)

EA の利用例その1として Access Control List(ACL) を触ってみる。

ACL がでてきた背景については RedHat のサイトに簡潔にまとめられている

Files and directories have permission sets for the owner of the file, the group associated with the file, and all other users for the system. However, these permission sets have limitations. For example, different permissions cannot be configured for different users. Thus, Access Control Lists (ACLs) were implemented.
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/ch-acls.html

ということで実際に触ってみる。

コマンドラインを利用した基本的な使い方

ACL をコマンドラインから操作するためのプログラム群は acl、ライブラリーは libacl1 パッケージにある。

  • acl – Access control list utilities
  • libacl1 – Access control list shared library
  • libacl1-dev – Access control list static libraries and headers

シナリオとしては

  1. ファイルを作成
  2. ファイルオーナー(jsmith)とは別のユーザー(postgres)に read/write 権限を ACL で付与(ファイルオーナーは変えず)
  3. 別ユーザー(postgres)が実際に read/write できることを確認

属性のセッター/ゲッターは setfacl/getfacl が対応。

$ touch tfile
$ umask         # default umask
0002
$ getfacl tfile # default permission
# file: tfile
# owner: jsmith
# group: jsmith
user::rw-
group::rw-
other::r--

$ chmod u=rwx,g=rx,o=x tfile # change file permission
$ getfacl --omit-header tfile
user::rwx
group::r-x
other::--x

ここで postgres ユーザに rw 権限を付与

$ setfacl -m u:postgres:rw tfile # modify ACL entry
$ getfacl --omit-header tfile
user::rwx
user:postgres:rw-       <- ACL_USER entry
group::r-x
mask::rwx               <- ACL_MASK entry
other::--x
$ getfattr -n system.posix_acl_access tfile # EA
# file: tfile
system.posix_acl_access=0sAgAAAAEABwD/////AgAGAGsAAAAEAAUA/////xAABwD/////IAABAP////8=

postgres ユーザが実際に read/write できることを確認

$ sudo su - postgres
ostgres@HOST:$ echo hello > tfile
postgres@HOST:$ cat tfile
hello

$ ls -l tfile
-rwxrwx--x+ 1 jsmith jsmith 6 Sun 17 23:51 tfile

ファイルのオーナーを変えないまま別ユーザに read/write 権限を付与できた。

4. 応用2: File Capabilities

EA の利用例その2として File Capabilities を触ってみる。

ユーザが自分自身でパスワードを変更できるように、 passwd コマンドは setuid ビットをたてて、 passwd コマンドのオーナー(root)権限でプロセスが実行されるようにしている。setuid を使うケースでroot 権限が必要なのは /etc/passwd ファイルの更新などピンポイントの機能なのに、 プログラムにまるっと root 権限を与えてしまっている。
これではまずいよねということで、root 権限が必要な機能(capability)を切り出し、プロセス・ファイルごとに capability を付与する事ができる。

このファイルベースの Capability に EA が利用されている。

コマンドラインを利用した基本的な使い方

File Capabilities をコマンドラインから操作するためのプログラム群は libcap2-bin、ライブラリーは libcap2-bin パッケージにある。

  • libcap-dev – development libraries and header files for libcap2
  • libcap2 – support for getting/setting POSIX.1e capabilities
  • libcap2-bin – basic utility programs for using capabilities

シナリオとしては

  1. date コマンドを一般ユーザ権限で実行→失敗
  2. date コマンドに、時刻変更の capability を付与
  3. 一般ユーザ権限で時刻変更できることを確認

capability のセッター/ゲッターは setcap/getcap が対応。

一般ユーザ権限では時刻変更はできない

$ date -s '2018-02-01 21:39'
date: cannot set date: Operation not permitted
Thu Feb  1 21:39:00 JST 2018

date コマンドに時刻変更する capability “cap_sys_time” を付与

$ cp /bin/date .
$ sudo setcap "cap_sys_time=pe" date
$ getcap date
date = cap_sys_time+ep
$ getfattr -n security.capability date    <- EA
# file: date
security.capability=0sAQAAAgAAAAIAAAAAAAAAAAAAAAA=

cap_sys_time な date コマンドで時刻変更

$ ./date -s '2018-02-01 21:39'
Thu Feb  1 21:39:00 JST 2018
$ date
Thu Feb  1 21:39:01 JST 2018

References

Advertisements
Tagged with: , , , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: