Wasabi でユーザーのアクセス分離を設定するにはどうすればよいですか?

Wasabi に多数寄せられる要望に、Wasabi システムでサブユーザー、バケット、フォルダレベルでユーザーのアクセスを分離する方法に関する質問があります。

動画 -  Wasabi でユーザーのアクセス分離を設定する方法を動画で確認できます。

1. サブユーザーレベルでのユーザーアクセスの分離

2. バケットレベルでのユーザーアクセスの分離

3. フォルダレベルでのユーザーアクセスの分離

4. 自身のバケット内での読み出し、書き込みや削除は許可するが、バケット自体の削除は許可しないサブユーザー向けのアクセス制限ポリシー

-----------------------------------------------------------------------------------------------------  

1. サブユーザーレベルでのユーザーアクセスの分離

サブユーザーレベルでの分離とは以下を意味します。

  • サブユーザーアカウントは既存のバケットのコンテンツを表示できない
  • サブユーザーは自分のバケットの作成や削除、バケット内のオブジェクトへのアクセスが許可される

状況によっては、ユーザーのアクセスを各自のバケットのみに制限し、他のユーザーのデータへのアクセスを分離したい場合があります。この場合、サブユーザーはアカウントに存在するすべてのバケットの名前を表示できますが、自分のバケットへのオブジェクトのアップロードや削除のみが許可され、他のユーザーのバケットの内容の閲覧や変更ができるアクセス権限はありません。

この設定を行うには以下の手順に従います。

  1. Wasabi ルートアカウントを作成します (未作成の場合)。その後、以下のスクリーンショットのポリシーを使用して、サブユーザーのストレージバケットへのアクセスを特定のバケットに制限する IAM ポリシーを各サブユーザーにつき作成します。
  2. このバケットポリシーを活用する顧客ごとにサブユーザーアカウントを作成します。このポリシーを「IAMUserChangePassword」ポリシーと一緒にコンソールへのアクセス権限を付与するサブユーザーに添付し、パスワードを変更
  3. 各サブユーザー/顧客のストレージアプリで使用する API キーセットを作成
  4. サブユーザーとしてコンソールにログインし、アクセスの分離をテスト

この記事では、以下の例を考えてみましょう。

  • ポリシーを作成し、「Sub-User-Policy」と命名しました。
  • 「user-john」という名前のサブユーザーが1人います。このサブユーザーは、自分のバケットを作成・削除でき、自分のバケット内のすべての s3 アクション (読み取り/書き込み/更新/削除) が可能です。ただし、他のユーザーのバケットの閲覧や変更はできません。

ステップ1 ルートユーザーとしてログイン中に、サブユーザーのアクセスを自身のストレージバケットのみに制限する IAM ポリシーを作成します。

まずは、下記のポリシー例を参考に自分のポリシーを構築してみてください。

この例では、IAM ポリシー「Sub-User-Policy」をサブユーザー「user-john 」に対して作成しています。

Wasabi ウェブコンソール UI の左側のメニューから [ポリシー] タブ -> [ポリシーを作成] を選択し、以下の例を使用してポリシーを作成します。

  sub-user-policy.PNG

 

サブユーザーのアクセスを自身のストレージバケットのみに限定するポリシー構文は以下のとおりです (実際に使用される際には、この構文内のサブユーザー名を編集してください)。

ここでは、そうしたポリシーの例を紹介します。

注 : コンソールでバケットやオブジェクトの操作を行うには、サブユーザーに「ListAllMyBuckets」許可が必要となります。これにより、サブユーザーはコンソールにログインした際にすべてのバケットを一覧表示できますが、コンテンツへのアクセスは許可のあるバケットからのみ可能となります。

 


{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListMy",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Sid": "AllowAll-S3ActionsToOwnBucket",
"Effect": "Allow",
"Action": "s3:*",
"Resource":"arn:aws:s3:::user-john*"
}
]
}

 

注 : 上記の Resource セクションでは、プレフィックス「user-john」の後にワイルドカード「*」を定義しています。つまり、John はプレフィックス「user-john」を持つバケットであれば好きなだけ作成でき、さらにそれらのバケットに対してすべての s3 権限を行使することができます。このプレフィックスで始まらないバケットには John はアクセスできません。

ステップ2 顧客ごとにサブユーザーを作成することができます。Wasabi ウェブコンソールのメニューオプションの [ユーザー] タブから以下のガイドラインに沿ってユーザーを作成することができます。

mceclip1.png

 

mceclip2.png

mceclip3.png

 

ユーザー追加プロセスで「user-john」を「Sub-User-Policy」と「IAMUserChangePassword」の2つのポリシーに関連付けることができます。ユースケースに応じて、さらに多くのポリシーをユーザーに付与することもできます (以下のようにグループを選択した後に行いますが、グループは必須ではありません)。確認してからユーザーを作成します。

ステップ3 サブユーザーの作成と適切なポリシーの関連付けが完了したら、次にこのサブユーザー用の API キーセットを作成します。これは、サードパーティストレージアプリで Wasabi にストレージを送信する際に使用するキーセットです。以下のとおり、ここでも、適用対象がルートユーザーではなくサブユーザーであることを除いて、Wasabi の標準的な API キー作成プロセスを使用します。ウェブ UI の左側のメニューから [アクセスキー] タブを選択するとこの画面が表示されます。

mceclip4.png 

 *ステップ2と3を繰り返して他のサブユーザーを作成することができます *。

ステップ4 ここで、上記で作成したサブユーザーのアクセス分離をテストします

 ログインページでパスワード入力行の下の [サブユーザーとしてサインイン] をクリックします。このページが表示されます。

mceclip5.png

 1行目 : サブユーザーの名前を入力 (この例ではサブユーザー「user-john」)

 2行目 : ルートアカウント所有者のメール ID またはエイリアス名を入力

 3行目 : サブユーザーのパスワードを入力

サブユーザー「user-john」は、コンソールに入った後、必要なプレフィックスを持つすべてのバケットを作成・削除し、アクセスすることができます。その他のバケットへのアクションに対してはすべて「アクセス拒否」が表示されます。

 

------------------------------------------------------------------------------------------------------

2. バケットレベルでのユーザーアクセスの分離

バケットレベルでの分離とは以下を意味します。

  • user1 は bucket1 に、user2 は bucket2 にそれぞれアクセス可能
  • user1 は bucket2 に、user2 は bucket1 にそれぞれアクセス不可能

状況によっては、バケットレベルでユーザーを分離したい場合があります。この場合、各ユーザーがそれぞれバケットを持ち、ユーザーは自分のバケットにアクセスできますが、他のユーザーのバケットにはアクセスできなくなります。

概要としては以下のようなステップが含まれます。 

  1. Wasabi ルートアカウントを作成 (未作成の場合)
  2. 顧客ごとにストレージバケットを作成
  3. 顧客のストレージバケットへのアクセスを特定のバケットに制限する IAM ポリシーを各顧客につき作成
  4. バケットポリシーを活用する顧客ごとにサブユーザーアカウントを作成
  5. 各サブユーザー/顧客のストレージアプリで使用する API キーセットを作成

この記事では、以下の例を考えてみましょう。

  • バケット名 = user1-bucket, user2-bucket など
  • サブユーザー名 = user1, user2 など
  • ポリシー名 = user1-limit, user2-limit

 (これらの名前は以下の説明で使用します。)

 ステップ1と2のルートユーザーとストレージバケットの作成は、Wasabi ユーザーであればご存知と思いますのでここでは詳しく説明しません。

 ステップ3の顧客のアクセスを自身のストレージバケットのみに限定する IAM ポリシーの作成については、ご存じない Wasabi ユーザーもおられると思いますのでプロセスを説明します。

 まずは、下記のポリシー例を参考に自分のポリシーを構築してみてください。

この例では、IAM ポリシー user1-limit を customer1 につき作成し、バケット名 user1-bucket  を使用しています。

Wasabi ウェブコンソール UI で[ポリシー] -> [ポリシーを作成] を選択し、以下の例を使用してポリシーを作成します。

 mceclip7.png

 

mceclip10.png

アクセスを customer1-bucket のみに限定するポリシー構文は以下のとおりです (実際に使用される際には、この構文内のバケット名を編集してください)。

ここでは、そうしたポリシーの例を2つ紹介します。

 ポリシータイプ1 : サブユーザーがコンソールからバケット操作を行えるようにしたい顧客向けのポリシーです。

 注 :  コンソールでバケットやオブジェクトの操作を行うには、サブユーザーに「ListAllMyBuckets」許可が必要となります。これにより、サブユーザーはコンソールにログインした際にすべてのバケットを一覧表示できますが、コンテンツへのアクセスは許可のあるバケットからのみ可能となります。

 


{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::user1-bucket",
"arn:aws:s3:::user1-bucket/*"
]
}
]
}

 

ポリシータイプ2 : バケット名に機密情報が含まれており、サブユーザーにすべてのバケット名を一覧表示させたくない顧客向けのポリシーです。このポリシーでは、サブユーザーがコンソールから操作を行うことはできませんのでご注意ください。

 

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::user1-bucket/*",
"arn:aws:s3:::user1-bucket"
]
}
]
}

 

明示的な拒否 : 直接のバケットパスを指定していないのに、ポリシータイプ2がサードパーティアプリケーションでサブユーザーにバケット名をすべて一覧表示してしまうという問題が発生することがあります。このような状況では、サブユーザーに追加のポリシーを添付し、ポリシーに記載されていないすべてのバケットへのアクセスや操作を明示的に拒否する必要があります。

 

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"NotResource": [
"arn:aws:s3:::user1-bucket/*",
"arn:aws:s3:::user1-bucket"
]
},
{
"Effect": "Deny",
"Action": "s3:*",
"NotResource": [
"arn:aws:s3:::user1-bucket/*",
"arn:aws:s3:::user1-bucket"
]
}
]
}

 

顧客ごとにバケット制限ポリシーを作成したので、各顧客にサブユーザーを作成できるようになりました (上述のステップ4)。Wasabi ウェブコンソールの IAM メニューから以下のガイドラインに沿ってユーザーを作成することができます。必ず [プログラミング (API キーを作成)] オプションを選択してください。これにより、この顧客のストレージアプリで今後使用する API キーセットを作成することができます。必要に応じてこの顧客にコンソールへのアクセスを提供することもできます。

 

mceclip9.png

 

ユーザー追加プロセスで customer1-limit ポリシーを customer1 に関連付けることができます (以下のようにグループを選択した後に行いますが、グループは必須ではありません)。

 

mceclip11.png

 

上記のステップのとおり、サブユーザー作成と同時に API キーを作成しました。サブユーザーの作成と適切な制限ポリシーの関連付けが完了したら、まだ作成されていない場合には、次にこのサブユーザー用の API キーセットを作成します。これは、サードパーティストレージアプリで Wasabi にストレージを送信する際に使用するキーセットです。以下のとおり、ここでも、適用対象がルートユーザーではなくサブユーザーであることを除いて、Wasabi の標準的な API キー作成プロセスを使用します。

 

mceclip12.png

 

Wasabi システムで必要な設定が完了しました。これで、customer1 が customer2 のバケットにアクセスできない (その逆も同様) ようにサービスを利用することができます。

ストレージアプリで必要となる重要な構成設定に「パス」の設定があります。以下のスクリーンショット (サンプルアプリ「Mountain Duck」) のハイライト部分をご覧ください。この例ではパス「/user1-bucket」が設定されています(API キーは「user1」に設定)。これにより、ストレージアプリが確実に user1 に関連するバケットのみのマウントを試行するようになります。ストレージアプリの大半は、接続後に「すべてのバケットの一覧表示」を試行します (ポリシーで制限されているため、この試行は失敗します)。

 

 -----------------------------------------------------------------------------------------------------

 

3. フォルダレベルでのユーザーアクセスの分離

フォルダレベルでの分離とは以下を意味します。

  • user1 と user2 が共通のバケットを共有
  • user1 は folder1 に、user2 は folder2 にそれぞれアクセス可能
  • user1 は folder2 に、user2 は folder1 にそれぞれアクセス不可能

状況によっては、フォルダレベルでユーザーを分離したい場合があります。この場合、ユーザーは共通のバケットを共有しますが、各ユーザーがそれぞれフォルダを持ち、このフォルダには同一バケット内の他のユーザーはアクセスできなくなります。

特定のバケット内の特定のフォルダへのアクセス権限を付与するためにサブユーザーに添付するポリシー :

{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowUserToSeeBucketListInTheConsole",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation", "s3:GetBucketCompliance"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
},
{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::<BUCKET-NAME>"],
"Condition":{"StringEquals":{"s3:prefix":["","<USER-FOLDER-NAME-INSIDE-BUCKET>/"],"s3:delimiter":["/"]}}
},
{
"Sid": "AllowListingOfUserFolder",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::<BUCKET-NAME>"],
"Condition":{"StringLike":{"s3:prefix":["<USER-FOLDER-NAME-INSIDE-BUCKET>/*"]}}
},
{
"Sid": "AllowAllS3ActionsInUserFolder",
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::<BUCKET-NAME>/<USER-FOLDER-NAME-INSIDE-BUCKET>/*"]
}
]
}

------------------------------------------------------------------------------------------------------------

4. 自身のバケット内での読み出し、書き込みや削除は許可するが、バケット自体の削除は許可しないサブユーザー向けのアクセス制限ポリシー

 

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
},
{
"Effect": "Deny",
"Action": "s3:DeleteBucket",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
}
]
}
 
 
 

 

 

他にご質問がございましたら、リクエストを送信してください