はじめに
こんにちは!社会人一年目?のタレカツです!
今回はEFSのアクセスポイントについて、学習したので備忘録として残しました。いくつか設定を変更して、EC2からのマウントした際の検証を行いました。すでにいくつかやられているような記事もありましたので、できるだけほかの条件で試したいと思います。
EFSとは
Elastic File Systemの略称で、NFSプロトコルを用いた、ファイルストレージを提供するサービスです。
NFSのアクセスはLinuxのユーザ管理で用いられる、User ID(uid)やGroup ID(gid)に則ってアクセス権を判断します。アクセスポイントの設定で、uidやgidの設定項目があったので、EC2側でユーザを作成して、いくつかの条件でアクセスの検証を行いたいと思います。
EFS設定のPosixユーザーとは
PosixとはUNIX系/Linux系のOSで互換性を確保するための規格で、ユーザーの取り扱いなども規定されています。つまり、Linuxなどのユーザーの識別子であるuidやgidで、アクセスを制御する際の設定を行います。
システム構成
画像のユーザやアクセスポイントなどは仮のものとなっています。システム構成としては、EC2で複数のユーザをUIDとGIDを指定して作成しました。EFSではアクセスポイントを変更していくつかの条件で試しています。
ルートディレクトリパス
アクセスポイントの基準のディレクトリを設定します。たとえば/をルートディレクトリパスとした場合、一番上の階層である青矢印で示した/を基準としてマウントされます。また、/efs-point/を設定した場合/の一つ下の階層のを先頭としてマウントされます。
つまり、/でマウントした場合は下の図の二つのディレクトリは見えますが、/efs-point1/で設定した場合は、/efs-point1/を基準として、その下の階層のディレクトリやファイルしか扱えません。
POSIXユーザー
指定したUIDとGIDを用いてマウントを行います。この際に、使用されるUIDとGIDはどのユーザでアクセスしようが、設定したUIDやGIDとして扱います。セカンダリグループIDについては、ユーザ管理においてUIDは一意な値となりますが、複数のグループとして扱うことができます。複数のグループでアクセス制御を行いたい場合、必要になると思います。
ルートディレクトリ作成のアクセス許可
アクセスポイントを作成する際に、まだアクセスポイントのディレクトリがない場合に所有者のUIDと所有グループのGIDを設定して、パーミッションも設定を行い(例えば755)ディレクトリを作成します。
マウントしてみた
ルートディレクトリパスを/でマウント
とりあえず以下のようなアクセスポイントを作成して、マウントを行いました。マウントの際は以下のマウントヘルパーを使うのがいいと思います。NFSクライアントを使用しても大丈夫ですが、ヘルパーを使った方が楽に適切なオプションでマウントしてくれると思います。
マウントポイントは以下のように設定して、マウントを行いました。efsヘルパーを使用した場合は、オプションは以下のような形でマウントされます。
[root@nfs-test1 work]# pwd
/work
[root@nfs-test1 work]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Sep 18 13:31 mountpoint
[root@nfs-test1 work]# mount -t efs -o tls,accesspoint=fsap-xxxxxxxxxxxx fs-xxxxxxxxxxxx:/ mountpoint/
[root@nfs-test1 work]# ls -l
total 4
drwxr-xr-x. 2 root root 6144 Sep 19 18:31 mountpoint
[root@nfs-test1 mountpoint]# nfsstat -m
/work/mountpoint from 127.0.0.1:/
Flags: rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,noresvport,proto=tcp,port=20590,timeo=600,retrans=2,sec=sys,clientaddr=127.0.0.1,local_lock=none,addr=127.0.0.1
マウントしたディレクトリに更にディレクトリを作成しました。
[root@nfs-test1 work]# cd mountpoint/
[root@nfs-test1 mountpoint]# ls
[root@nfs-test1 mountpoint]# mkdir efs-point1
[root@nfs-test1 mountpoint]# ls -l
total 4
drwxr-xr-x. 2 root root 6144 Sep 19 18:49 efs-point1
ただこの条件だとrootユーザの書き込み権限はあるものの、他のユーザでディレクトリの作成やファイルの作成などはできません。
[ec2-user@nfs-test1 ~]$ cd /work/mountpoint/
[ec2-user@nfs-test1 mountpoint]$ ls
[ec2-user@nfs-test1 mountpoint]$ pwd
/work/mountpoint
[ec2-user@nfs-test1 mountpoint]$ ls -l
total 4
drwxr-xr-x. 2 root root 6144 Sep 19 18:49 efs-point1
[ec2-user@nfs-test1 mountpoint]$ mkdir efs-point2
mkdir: cannot create directory ‘efs-point2’: Permission denied
一応このように、他のユーザでも書き込み権限を与えた場合可能ですが、わざわざ一番上の階層に権限を与えるのは良くないとは思います。
[root@nfs-test1 work]# chmod 777 mountpoint/
[root@nfs-test1 work]# ls -l
total 4
drwxrwxrwx. 3 root root 6144 Sep 19 18:49 mountpoint
[ec2-user@nfs-test1 mountpoint]$ ls -ld
drwxrwxrwx. 3 root root 6144 Sep 19 18:49 .
[ec2-user@nfs-test1 mountpoint]$ mkdir efs-point2
[ec2-user@nfs-test1 mountpoint]$ ls -l
total 8
drwxr-xr-x. 2 root root 6144 Sep 19 18:49 efs-point1
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 19 19:02 efs-point2
今のを図で表すと以下のような感じになります。ec2-userからの操作である赤矢印はその他のアカウントに当たるので、読み込みと実行権限のみ許可されています。
ルートディレクトリパスを/efs-point1でルートディレクトリ作成のアクセス許可を設定してマウント
次は以下のようなアクセスポイントを作成しました。前回までのディレクトリは削除しています。ルートディレクトリパスとルートディレクトリ作成のアクセス許可をec2-userのuidとgidになるように作成しています。
先ほどまでのマウントポイントは残したまま、マウントを行いました。
※前回マウントポイントから確認を行い、ディレクトリの作成は初めてアクセスポイントからマウントを行ったタイミングでディレクトリが作成されていました。
[root@nfs-test1 work]# mkdir mountpoint2
[root@nfs-test1 work]# ls
mountpoint mountpoint2
[root@nfs-test1 work]# sudo mount -t efs -o tls,accesspoint=fsap-xxxxxxxxxxxx fs-xxxxxxxxxxxx:/ mountpoint2
[root@nfs-test1 work]# ls -l
total 8
drwxr-xr-x. 3 root root 6144 Sep 19 19:31 mountpoint
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 19 19:31 mountpoint2
このアクセスポイントに対して、マウントを行った場合uidが一致するec2-userでは書き込みができます。また、uid=2001で作成したnfs-test-user1では、書き込みはできません。rootは権限が強いため書き込みは可能です。
[ec2-user@nfs-test1 work]$ ls
mountpoint mountpoint2
[ec2-user@nfs-test1 work]$ cd mountpoint2
[ec2-user@nfs-test1 mountpoint2]$ ls
[ec2-user@nfs-test1 mountpoint2]$ vi test
[New] 1L, 5B written
[ec2-user@nfs-test1 mountpoint2]$ ls -l
total 4
-rw-r--r--. 1 ec2-user ec2-user 5 Sep 19 19:41 test
[nfs-test-user1@nfs-test1 ~]$ id
uid=2001(nfs-test-user1) gid=2001(nfs-test-group1) groups=2001(nfs-test-group1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[nfs-test-user1@nfs-test1 ~]$ cd /work/mountpoint2/
[nfs-test-user1@nfs-test1 mountpoint2]$ ls
test
[nfs-test-user1@nfs-test1 mountpoint2]$ mkdir testdir
mkdir: cannot create directory ‘testdir’: Permission denied
[root@nfs-test1 work]# cd mountpoint2
[root@nfs-test1 mountpoint2]# ls
test
[root@nfs-test1 mountpoint2]# mkdir testdir
[root@nfs-test1 mountpoint2]# ls
test testdir
今のを図で表すと以下のような感じになります。前回とは違い、ec2-userが所有者として作成されているので、赤矢印の操作は書き込みも可能です。
nfs-test-user1からの操作である黄矢印はその他のアカウントに当たるので、読み込みと実行権限のみ許可されています。
前の条件にPOSIXユーザを設定してみた
以下のようなアクセスポイントを設定しています。以前とルートディレクトリが同じであり、以前作成されたディレクトリも作成されたままになっております。
rootとec2-user,nfs-test-user1でそれぞれディレクトリを作成しました。作成されたディレクトリは所有者と所有グループは1000と1000となりました。
[nfs-test-user1@nfs-test1 mountpoint3]$ ls -l
total 12
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 21 17:47 testdir-ec2
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 21 17:47 testdir-nfs
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 21 17:47 testdir-root
今のを図で表すと以下のような感じになります。今回はPOSIXユーザのuidとgidを1000にしているので、実際にec2-userが書いているわけではないですが、作成されるファイルやディレクトリec2-userが作った場合と同じuidとgidになります。
ケースを考えてマウントしてみた
既にあるディレクトリをルートディレクトリパスとして、ルートディレクトリ作成のアクセス許可を設定
こちら先ほどの/efs-point1/をディレクトリパスとして、ルートディレクトリ作成のアクセス許可をnfs-test-user1のuidで設定を行いました。ルートディレクトリ作成のアクセス許可はディレクトリがない場合に作成されるので、特に変化はなく所有者などの設定は同じようになりました。
mountpoint3は以前のアクセスポイントでマウントしたままになっていますが、変更はなく同じことが分かります。あくまでもディレクトリがない場合に所有者と所有グループ、パーミッションを設定するもので、以前からあるディレクトリの設定は変更されません。
[root@nfs-test1 work]# ls -l
drwxr-xr-x. 5 ec2-user ec2-user 6144 Sep 21 17:47 mountpoint3
drwxr-xr-x. 5 ec2-user ec2-user 6144 Sep 21 17:47 mountpoint4
新たにルートディレクトリ作成のアクセス許可を適当な値とし、別のuidとgidでPOSIXユーザを設定
ルートディレクトリ作成のアクセス許可を設定したルートディレクトリパスにディレクトリがない状態で、以下のように設定しました。
新たに指定したuidとgidでディレクトリが作成されていますが、POSIXユーザーで設定したuidでは、書き込みができないため、ディレクトリを作成できないことが分かります。
[root@nfs-test1 work]# ls -l
drwxr-xr-x. 2 2002 2002 6144 Sep 21 18:14 mountpoint5
[root@nfs-test1 work]# cd mountpoint5
[root@nfs-test1 mountpoint5]# mkdir testdir
mkdir: cannot create directory ‘testdir’: Permission denied
現在すでにあるディレクトリの下に、新たにルートディレクトリ作成のアクセス許可を別の所有者と所有者グループでアクセスポイントを設定
一つ前で作成したアクセスポイントの下にルートディレクトリを設定して、違う所有者ユーザーと所有者グループを設定しています。
mountpoint6にマウントしていますが、指定した値でディレクトリが作成されました。以前のアクセスポイントにもマウントしたままになっていますが、ディレクトリが作成されたことが分かります。
[root@nfs-test1 work]# ls -l
drwxr-xr-x. 2 2002 2002 6144 Sep 21 18:14 mountpoint5
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 21 18:35 mountpoint6
[root@nfs-test1 work]# cd mountpoint5
[root@nfs-test1 mountpoint5]# ls -l
total 4
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 21 18:35 efs1
所有者と所有者グループをec2-userと同じuidとgidにしているため、ec2-userで書き込みできました。
[ec2-user@nfs-test1 work]$ cd mountpoint6
[ec2-user@nfs-test1 mountpoint6]$ mkdir testdir
[ec2-user@nfs-test1 mountpoint6]$ ls -l
total 4
drwxr-xr-x. 2 ec2-user ec2-user 6144 Sep 21 18:36 testdir
同じルートディレクトリパスでルートディレクトリ作成のアクセス許可を設定したアクセスポイント2つ用意してマウントを行った
以下のようなアクセスポイントを二種類用意して、あえて後に作ったアクセスポイントefs-point3-2にマウントを行った。
一度書いた通りにルートディレクトリ作成のアクセス許可の設定で作成されるディレクトリは、初めのマウント時に作成されるため、両方のアクセスポイントでマウントしましたが、先に使用したアクセスポイントの設定でディレクトリが作成されることがわかりました。
[root@nfs-test1 work]# ls -l
drwxr-xr-x. 2 nfs-test-user1 nfs-test-group1 6144 Sep 21 18:52 mountpoint7
drwxr-xr-x. 2 nfs-test-user1 nfs-test-group1 6144 Sep 21 18:52 mountpoint8
終わりに
EFSを触ってみて、業務で使ったことがないのでどのような使われ方がされているかわからないが、アクセスポイントごとにPosixユーザを設定して接続する際のuidやgidを設定した方がいいように感じました。ただ、ルートディレクトリ作成のアクセス許可を設定するとパーミッションなどが設定されるが、最初にマウントしたときに作成されるので、最初に必要なディレクトリを作った上で、管理をしてもいいのではないかと感じました。
![ppt6547.pptm [自動保存済み].jpg](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4070547%2F077c6e5d-dac5-411c-bb02-e43e1b54b053.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fd6db5e43109bb126f5ac0f9edbfd35e)


















