Amazon EFSでsetgid/スティッキービットを使う

2017.09.16

この記事は公開されてから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 のユースケースが増えました。

参考