カテゴリー
【AWS Lambda開発者向け】AWS EFSのアクセスポイントのPOSIX所有権を深堀してみる
※ 当ページには【広告/PR】を含む場合があります。
2024/01/19
1. EFSアクセスポイントのPosixUserを指定した場合、Lambda側のPOSIXは無視される
2. PosixUserを指定しなかった場合はLambda側のPOSIXでEFSにアクセスすることになり、
ルートディレクトリ所有権次第では、操作が行えない可能性がある。
3. PosixUserをルートユーザー"0:0(root:root)"に指定した場合、すべての操作が許可される反面、
その後、ルートユーザーでしかアクセスできないリソースが発生するリスクがある
4. 特にアプリケーション別の目的が無い限りは、PosixUserもルートディレクトリ設定も
"1001:1001"等で固定のユーザーを作るほうが使いやすい
5. 固定ユーザー専用のディレクトリとして読み書きしたいならアクセス権限"770/760"、
固定ユーザー以外もアクセス許可したいなら"777/766"
6. 書き込みはせずに読み出し・閲覧専用でいいなら、
固定ユーザー専用の権限で"750/740"、他のユーザーまで含めるなら"755/744"
EFSのPOSIXとはなにか?
Linux全般における「root」のPOSIXについて
「ユーザーID: 0」
「root」
"0:0" = "root:root"
Amazon EFSは、アクセスポイントで「0」に設定されたユーザーまたはグループ ID
をルートユーザーとして扱います。
"0:0"
EFSアクセスポイントのLambdaでの利用方法
LambdaのPOSIXルール① 〜 アクセスポイントによるPOSIXユーザーの強制
+ 新しいファイル・ディレクトリの所有権は、
アクセスポイントのユーザーID・グループ IDに設定される
+ ルートディレクトリ以下のアクセス許可の評価はすべて
アクセスポイントのユーザーID・グループID・セカンダリグループIDに考慮され、
アクセス元のクライアントのIDは無視される
LambdaのPOSIXルール② 〜 ルートディレクトリに所有権とアクセス許可を指定しない場合
OwnerUid:
ルートディレクトリの所有者として使用するPOSIXユーザーID
OwnerGiD:
ルートディレクトリの所有者グループとして使用するPOSIXグループID
Permissions:
アクセス許可を指定する。
ルートディレクトリのUnixモード値("755"等)
"Option"
LambdaのPOSIXルール③ 〜 既存のルートディレクトリの所有権に注意
chmod
NodejsランタイムのPOSIXとEFSアクセスを検証する
事前準備〜稼働中のLambda(nodejsランタイム)から内部コマンドを呼び出してPOSIXを調べる
child_process
//内部でシェルコマンドを利用する
import { execSync } from 'child_process';
//...
/etc/passwd
//...
//Lambdaのレスポンスボディに処理結果を貼り付け
const stdout = execSync('cat /etc/passwd');
res.body.pswd = stdout.toString();
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
ec2-user:x:996:993::/home/ec2-user:/bin/bash
ec2-user
sbx_user
sbx_user1051:x:993:990::/home/sbx_user1051:/sbin/nologin
sbx_user1052:x:992:989::/home/sbx_user1052:/sbin/nologin
sbx_user1053:x:991:988::/home/sbx_user1053:/sbin/nologin
...
sbx_user1176:x:868:865::/home/sbx_user1176:/sbin/nologin
sbx_user1051
EFSへアクセスできるパターン①〜ルートで問答無用のアクセス
EFSAccessPoint:
PosixUser:
Uid: "0"
Gid: "0"
RootDirectory:
Path: "/hoge"
CreationInfo:
OwnerGid: "1001"
OwnerUid: "1001"
Permissions: "700"
//...
//Lambda側のマウントパス
const rootDir = '/mnt/lambda';
//LambdaのプロセスPOSIXの確認
execSync(`echo "上書き!" > ${rootDir}/first.txt`);
const stdout1 = execSync(`cat ${rootDir}/first.txt`);
//LambdaのプロセスPOSIXの確認
const stdout2 = execSync('id -a');
//フォルダ・ファイルの所有権の確認
const stdout3 = execSync(`ls -la ${rootDir}`);
//レスポンスボディに処理結果を貼り付け
res.body.firsttext = stdout1.toString();
res.body.posixusrs = stdout2.toString();
res.body.filepermission = stdout3.toString();
$ echo "上書き!" > /mnt/lambda/first.txt
$ cat /mnt/lambda/first.txt
上書き!
$ id -a
uid=993(sbx_user1051) gid=990 groups=990
$ ls -la
total 12
drwxr-x--- 2 1001 1001 6144 Jan 16 11:37 .
drwxr-xr-x 3 root root 4096 Jan 16 12:07 ..
-rwx------ 1 root root 52 Jan 16 12:07 first.txt
/hoge
1001:1001
"750"
「本当のルートディレクトリ(/)」
root:root
"755"
first.txt
"700"
"700"
"755"
EFSへアクセスできないパターン①〜ルートディレクトリのアクセス権を正しく理解していない
"755"
"750"
「755」 = ルートユーザーは読み書き実行全部できて、自分(=フォルダ所有者)と他のユーザーは読みと実行のみ
PosixUser:
Uid: "1001"
Gid: "1001"
RootDirectory:
Path: "/hoge"
CreationInfo:
OwnerGid: "1001"
OwnerUid: "1001"
Permissions: "755"
$ echo "上書き!" > /mnt/lambda/first.txt
Command failed: echo \"上書き!\" >> /mnt/lambda/first.txt
/bin/sh: line 1: /mnt/lambda/first.txt: Permission denied
PosixUser:
Uid: "1001"
Gid: "1001"
RootDirectory:
Path: "/hoge"
CreationInfo:
OwnerGid: "1001"
OwnerUid: "1001"
Permissions: "770"
EFSへアクセスできないパターン②〜既存のルートディレクトリに権限がない
PosixUser:
Uid: "1001"
Gid: "1001"
RootDirectory:
Path: "/hoge"
CreationInfo:
OwnerGid: "1001"
OwnerUid: "1001"
Permissions: "760"
"1001:1001"
/hoge
$ ls -la /mnt/lambda
total 12
drwx------ 2 1001 1001 6144 Jan 16 11:37 .
#...省略
/hoge
/mnt/lambda
/hoge
1001
700
chmod
EFSへアクセスできるパターン②〜ルートディレクトリが新規で作成される場合
RootDirectory:
Path: "/piyo"
CreationInfo:
OwnerGid: "1002"
OwnerUid: "1002"
Permissions: "764"
/piyo
"764"
$ ls -la /mnt/lambda
total 12
drwxrw-r-- 2 1002 1002 6144 Jan 16 11:37 .
#...省略
/piyo
/mnt/lambda
PosixUser
PosixUser
1002
/piyo
$ echo "上書き!" > /mnt/lambda/first.txt
Command failed: echo \"上書き!\" >> /mnt/lambda/first.txt
/bin/sh: line 1: /mnt/lambda/first.txt: Permission denied
400
1002
PosixUser:
Uid: "1002"
Gid: "1002"
RootDirectory:
Path: "/piyo"
CreationInfo:
OwnerGid: "1002"
OwnerUid: "1002"
Permissions: "764"
/piyo
$ echo "上書き!" > /mnt/lambda/first.txt
$ cat /mnt/lambda/first.txt
上書き!
$ ls -la
total 12
-rwxrw-r-- 1 1002 1002 14 Jan 16 16:17 first.txt
#...
PosixUser
"0:0"
PosixUser
EFSへアクセスできないパターン③〜ルートディレクトリに所有権とアクセス許可を指定していない
PosixUser:
Uid: "1003"
Gid: "1003"
RootDirectory:
Path: "/fuga"
#👇作成時の所有権と権限を指定しない
# CreationInfo:
# OwnerGid: "1003"
# OwnerUid: "1003"
# Permissions: "770"
Error:
The function couldn't mount the Amazon EFS file system with access point arn:aws:elasticfilesystem:ap-northeast-1:*********:access-point/fsap-************.
error Command failed with exit code 1.
まとめ
1. EFSアクセスポイントのPosixUserを指定した場合、Lambda側のPOSIXは無視される
2. PosixUserを指定しなかった場合はLambda側のPOSIXでEFSにアクセスすることになり、
ルートディレクトリ所有権次第では、操作が行えない可能性がある。
3. PosixUserをルートユーザー"0:0(root:root)"に指定した場合、すべての操作が許可される反面、
その後、ルートユーザーでしかアクセスできないリソースが発生するリスクがある
4. 特にアプリケーション別の目的が無い限りは、PosixUserもルートディレクトリ設定も
"1001:1001"等で固定のユーザーを作るほうが使いやすい
5. 固定ユーザー専用のディレクトリとして読み書きしたいならアクセス権限"770/760"、
固定ユーザー以外もアクセス許可したいなら"777/766"
6. 書き込みはせずに読み出し・閲覧専用でいいなら、
固定ユーザー専用の権限で"750/740"、他のユーザーまで含めるなら"755/744"
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー