この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Amazon Elastic File System (以下EFS)が最近になってsetgidとスティッキービットに対応しました。
これらを利用すると
- グループで共有するディレクトリ(setgid)
- /tmp のようなディレクトリ(スティッキービット)
を構築できるようになります。
以下ではでこのようなディレクトリを実際に作ってみます。
検証環境
- リージョン : eu-central-1(Frankfurt)
- OS : Amazon Linux AMI 2017.03
- EFS : 2017/09/15 時点
EC2インスタンスに検証用EFSをマウント
EFS ユーザーガイドの Getting Started に従って操作して下さい。
今回はEFSを作成後、次のようにマウントしました
$ sudo mkdir /mnt/test
$ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 XXX.efs.eu-central-1.amazonaws.com:/ /mnt/test
$ cd /mnt/test/
検証用ユーザー・グループを作成
事前準備として新規にユーザー・グループを作成します。
新規ユーザーを追加
新規ユーザー"mike"を追加します
$ sudo useradd -c "Mike Smith" mike
$ sudo passwd mike
新規グループを追加
新規グループ"web-group"を追加します
$ sudo groupadd web-group
$ grep web-group /etc/group
web-group:502:
ユーザー
- ec2-user
- mike
をこのグループに所属させます。
$ sudo usermod -a -G web-group mike
$ sudo usermod -a -G web-group ec2-user
$ grep web-group /etc/group
web-group:502:mike,ec2-user
$ id ec2-user
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel),502(web-group)
$ id mike
uid=501(mike) gid=501(mike) groups=501(mike),502(web-group)
setgidを利用してグループで共有するディレクトリを作成する
ディレクトリにsetgidを設定すると、そのディレクトリ配下に作成されたファイル・ディレクトリの所有グループはsetgidを設定したディレクトリと同じになります。 そのため、グループで共有するディレクトリに活用出来ます。
共有用ディレクトリの作成
$ cd /mnt/test/
$ sudo mkdir setgid-dir
$ sudo mkdir -m 2775 setgid-dir
$ sudo chgrp web-group setgid-dir
$ ls -l
total 4
drwxrwsr-x 2 root web-group 6144 Sep 10 09:57 setgid-dir
ec2-user
ユーザーで setgid-dir
ディレクトリ以下でファイル・ディレクトリを作成します。
$ whoami
ec2-user
$ cd /mnt/test/setgid-dir
$ mkdir a
$ touch b
$ ls -l
total 8
drwxrwsr-x 2 ec2-user web-group 6144 Sep 10 10:00 a
-rw-rw-r-- 1 ec2-user web-group 0 Sep 10 10:00 b
共有ディレクトリなので、同じグループ(web-group
)に所属するmikeもファイル・ディレクトリの更新が可能です
$ sudo su - mike
$ whoami
mike
$ mv a foo
$ mkdir foo/baz
$ ls -l foo/
total 4
drwxrwsr-x 2 mike web-group 6144 Sep 10 10:01 baz
パーミッション(drwxrwsr-x
)のグループ部(rws
)の最後が"s"になっていることから、setgidビットが立っていることがわかります。
スティッキービットを利用して /tmp のようなディレクトリを作成する
/tmp ディレクトリ以下では各ユーザーがファイル/ディレクトリを作成可能ですが、それらを削除できるのは(rootユーザーを除き)所有ユーザーだけです。 ディレクトリにスティッキービットを設定すると、このようなディレクトリを作成出来ます。
/tmp風ディレクトリの作成
$ cd /mnt/test/
$ sudo mkdir sticky-dir
$ sudo mkdir -m 1775 sticky-dir
$ sudo chgrp web-group sticky-dir
$ ls -l
total 4
drwxrwxr-t 2 root web-group 6144 Sep 10 09:57 sticky-dir
パーミッション(drwxrwxr-t
)の最後が"t"になっていることから、スティッキービットが立っていることがわかります。
ec2-user
ユーザーで sticky-dir
ディレクトリ以下でファイル・ディレクトリを作成します。
$ whoami
ec2-user
$ cd /mnt/test/sticky-dir
$ mkdir a
$ touch b
$ ls -l
total 4
drwxrwxr-x 2 ec2-user ec2-user 6144 Sep 10 10:02 a
-rw-rw-r-- 1 ec2-user ec2-user 0 Sep 10 10:02 b
他のユーザーが作成したファイル・ディレクトリの変更操作はできませんが、同じ階層に自分が所有するファイル・ディレクトリの作成は可能です
$ sudo su - mike
$ whoami
mike
$ mv a foo
mv: cannot move ‘a’ to ‘foo’: Operation not permitted
$ mkdir foo
$ touch bar
$ ls -l
total 8
drwxrwxr-x 2 ec2-user ec2-user 6144 Sep 10 10:02 a
-rw-rw-r-- 1 ec2-user ec2-user 0 Sep 10 10:02 b
-rw-rw-r-- 1 mike mike 0 Sep 10 10:09 bar
drwxrwxr-x 2 mike mike 6144 Sep 10 10:09 foo
まとめ
Amazon EFS を利用して
- グループで共有するディレクトリ(setgid)
- /tmp のようなディレクトリ(スティッキービット)
を作成しました。
アクセス権限周りの地味のアップデートにより、EFS のユースケースが増えました。
参考
- Linuxプログラミングインタフェース:15章 ファイルの属性
- Amazon EFS now Supports Additional Permissions for Finer-Grained Control of Directory and File Access
- https://en.wikipedia.org/wiki/Setuid
- https://en.wikipedia.org/wiki/Sticky_bit