2.3. S3 API を使用した Ceph Object Gateway へのアクセス
開発者は、Amazon S3 API の使用を開始する前に、Ceph Object Gateway および Secure Token Service (STS) へのアクセスを設定する必要があります。
2.3.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
- 稼働中の Red Hat Ceph Storage クラスターがある。
- 実行中の Ceph Object Gateway。
- RESTful クライアント。
2.3.2. S3 認証 リンクのコピーリンクがクリップボードにコピーされました!
Ceph Object Gateway への要求は、認証または認証解除のいずれかになります。Ceph Object Gateway は、認証されていないリクエストが匿名ユーザーによって送信されることを前提としています。Ceph Object Gateway は、固定 ACL をサポートしています。
ほとんどのユースケースでは、クライアントは、Java や Python Boto 用の Amazon SDK の AmazonS3Client などの既存のオープンソースライブラリーを使用します。オープンソースライブラリーでは、アクセスキーおよびシークレットキーを渡すだけで、ライブラリーはユーザーの要求ヘッダーおよび認証署名をビルドします。ただし、リクエストを作成して署名することもできます。
リクエストの認証には、アクセスキーとベース 64 でエンコードされたハッシュベースのメッセージ認証コード (HMAC) が Ceph Object Gateway サーバーに送信される前に要求に追加する必要があります。Ceph Object Gateway は S3 互換の認証を使用します。
例
HTTP/1.1
PUT /buckets/bucket/object.mpeg
Host: cname.domain.com
Date: Mon, 2 Jan 2012 00:01:01 +0000
Content-Encoding: mpeg
Content-Length: 9999999
Authorization: AWS ACCESS_KEY:HASH_OF_HEADER_AND_SECRET
上記の例では、ACCESS_KEY をアクセスキー ID の値に置き換え、その後にコロン (:) を追加します。HASH_OF_HEADER_AND_SECRET を、正規化されたヘッダー文字列のハッシュとアクセスキー ID に対応するシークレットに置き換えます。
ヘッダー文字列およびシークレットのハッシュの生成
ヘッダー文字列およびシークレットのハッシュを生成するには、以下を実行します。
- ヘッダー文字列の値を取得します。
- 要求ヘッダー文字列を正規形式に正規化します。
- SHA-1 ハッシュアルゴリズムを使用して HMAC を生成します。
-
hmacの結果を base-64 としてエンコードします。
ヘッダーを正規化
ヘッダーを正規の形式に正規化するには、以下を行います。
-
すべての
content-ヘッダーを取得します。 -
content-typeおよびcontent-md5以外のcontent-ヘッダーをすべて削除します。 -
content-ヘッダー名が小文字であることを確認します。 -
content-ヘッダーの辞書式で並べ替えます。 -
Dateヘッダー AND があることを確認します。指定した日付が、オフセットではなく GMT を使用していることを確認してください。 -
x-amz-で始まるヘッダーをすべて取得します。 -
x-amz-ヘッダーがすべて小文字であることを確認します。 -
x-amz-ヘッダーの辞書式で並べ替えます。 - 同じフィールド名の複数のインスタンスを単一のフィールドに組み合わせ、フィールド値をコンマで区切ります。
- ヘッダー値の空白文字および改行文字を、単一スペースに置き換えます。
- コロンの前後に空白を削除します。
- 各ヘッダーの後に新しい行を追加します。
- ヘッダーを要求ヘッダーにマージします。
HASH_OF_HEADER_AND_SECRET を、base-64 でエンコードされた HMAC 文字列に置き換えます。
関連情報
- 詳細は、Amazon Simple Storage Service ドキュメントの Signing and Authenticating REST Requests セクションを参照してください。
2.3.3. S3 サーバー側の暗号化 リンクのコピーリンクがクリップボードにコピーされました!
Ceph Object Gateway は、S3 アプリケーションプログラムインターフェイス (API) のアップロードされたオブジェクトのサーバー側の暗号化をサポートします。サーバー側の暗号化とは、S3 クライアントが暗号化されていない形式で HTTP 経由でデータを送信し、Ceph Object Gateway はそのデータを暗号化した形式で Red Hat Ceph Storage に保存することを意味します。
Red Hat は、Static Large Object (SLO) または Dynamic Large Object (DLO) の S3 オブジェクト暗号化をサポートしません。
暗号化を使用するには、クライアントリクエストは、SSL 接続上でリクエストを送信する 必要があります。Red Hat は、Ceph Object Gateway が SSL を使用しない限り、クライアントからの S3 暗号化をサポートしません。ただし、テスト目的で、管理者は、ランタイム時に rgw_crypt_require_ssl 設定を false に設定し、Ceph 設定ファイルで false に設定して、Ansible 設定ファイルで false に設定し、Ceph Object Gateway の Ansible Playbook を再生して、テスト中に SSL を無効にすることができます。
実稼働環境では、SSL 経由で暗号化された要求を送信できない場合があります。このような場合は、サーバー側の暗号化で HTTP を使用して要求を送信します。
サーバー側の暗号化で HTTP を設定する方法は、以下の関連情報セクションを参照してください。
暗号化キーの管理には、以下の 2 つのオプションがあります。
お客様提供のキー
お客様が提供する鍵を使用する場合、S3 クライアントは暗号鍵を各リクエストと共に渡して、暗号化されたデータの読み取りまたは書き込みを行います。これらのキーを管理するのは、お客様の責任です。各オブジェクトの暗号化に使用する Ceph Object Gateway の鍵を覚えておく必要があります。
Ceph Object Gateway は、Amazon SSE-C 仕様に従って、S3 API で顧客提供のキー動作を実装します。
お客様がキー管理を処理し、S3 クライアントはキーを Ceph Object Gateway に渡すため、Ceph Object Gateway ではこの暗号化モードをサポートするための特別な設定は必要ありません。
キー管理サービス
キー管理サービスを使用する場合、セキュアなキー管理サービスはキーを格納し、Ceph Object Gateway はデータの暗号化または復号の要求に対応するためにキーをオンデマンドで取得します。
Ceph Object Gateway は、Amazon SSE-KMS 仕様に従って S3 API にキー管理サービスの動作を実装します。
現時点で、テスト済み鍵管理の実装は HashiCorp Vault および OpenStack Barbican です。ただし、OpenStack Barbican はテクノロジープレビューであるため、実稼働システムでの使用はサポートされません。
2.3.4. S3 アクセス制御リスト リンクのコピーリンクがクリップボードにコピーされました!
Ceph Object Gateway は S3 と互換性のあるアクセス制御リスト (ACL) の機能をサポートします。ACL は、ユーザーがバケットまたはオブジェクトで実行できる操作を指定するアクセス権限の一覧です。それぞれの付与は、バケットに適用するか、オブジェクトに適用される場合の異なる意味を持ちます。
| パーミッション | バケット | Object |
|---|---|---|
|
| パーミッションを得たユーザーは、バケットのオブジェクトを一覧表示できます。 | パーミッションを得たユーザーは、オブジェクトを読み取りできます。 |
|
| パーミッションを得たユーザーは、バケットのオブジェクトを書き込みまたは削除できます。 | 該当なし |
|
| パーミッションを得たユーザーは、バケット ACL を読み取ることができます。 | パーミッションを得たユーザーは、オブジェクト ACL を読み取ることができます。 |
|
| パーミッションを得たユーザーは、バケット ACL を書き込めます。 | パーミッションを得たユーザーは、オブジェクト ACL に書き込めます。 |
|
| Grantee にはバケットのオブジェクトに対する完全なパーミッションがあります。 | パーミッションを得たユーザーは、オブジェクト ACL に読み取りまたは書き込みできます。 |
2.3.5. S3 を使用した Ceph Object Gateway へのアクセスの準備 リンクのコピーリンクがクリップボードにコピーされました!
ゲートウェイサーバーにアクセスする前に、Ceph Object Gateway ノードの前提条件に従う必要があります。
Ceph 設定ファイルを変更してポート 80 を使用するようにし、Civetweb がデフォルトの Ansible に設定されたポートである 8080 を使用することは変更 しないでください。
前提条件
- Ceph Object Gateway ソフトウェアのインストール。
- Ceph Object Gateway ノードへのルートレベルのアクセス。
手順
rootで、ファイアウォールのポート8080を開きます。[root@rgw ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent [root@rgw ~]# firewall-cmd --reloadObject Gateway 設定および管理ガイド で説明されているように、ゲートウェイに使用する DNS サーバーにワイルドカードを追加します。
ローカル DNS キャッシュ用のゲートウェイノードを設定することもできます。これを実行するには、以下の手順を実行します。
rootでdnsmasqをインストールおよび設定します。[root@rgw ~]# yum install dnsmasq [root@rgw ~]# echo "address=/.FQDN_OF_GATEWAY_NODE/IP_OF_GATEWAY_NODE" | tee --append /etc/dnsmasq.conf [root@rgw ~]# systemctl start dnsmasq [root@rgw ~]# systemctl enable dnsmasqIP_OF_GATEWAY_NODEおよびFQDN_OF_GATEWAY_NODEは、ゲートウェイノードの IP アドレスと FQDN に置き換えます。rootで NetworkManager を停止します。[root@rgw ~]# systemctl stop NetworkManager [root@rgw ~]# systemctl disable NetworkManagerrootとして、ゲートウェイサーバーの IP を名前空間として設定します。[root@rgw ~]# echo "DNS1=IP_OF_GATEWAY_NODE" | tee --append /etc/sysconfig/network-scripts/ifcfg-eth0 [root@rgw ~]# echo "IP_OF_GATEWAY_NODE FQDN_OF_GATEWAY_NODE" | tee --append /etc/hosts [root@rgw ~]# systemctl restart network [root@rgw ~]# systemctl enable network [root@rgw ~]# systemctl restart dnsmasqIP_OF_GATEWAY_NODEおよびFQDN_OF_GATEWAY_NODEは、ゲートウェイノードの IP アドレスと FQDN に置き換えます。サブドメイン要求を確認します。
[user@rgw ~]$ ping mybucket.FQDN_OF_GATEWAY_NODEFQDN_OF_GATEWAY_NODEは、ゲートウェイノードの FQDN に置き換えます。警告ローカルの DNS キャッシュ用にゲートウェイサーバーを設定することは、テスト目的のみを目的としています。これを行った後は、外部ネットワークにはアクセスできなくなります。Red Hat Ceph Storage クラスターおよびゲートウェイノードに適切な DNS サーバーを使用することを強く推奨します。
-
Object Gateway の設定および管理ガイド に説明されているように、
S3アクセスにradosgwユーザーを作成し、生成したaccess_keyおよびsecret_keyをコピーします。S3アクセス、およびそれ以降のバケット管理タスクには、これらのキーが必要です。
2.3.6. Ruby AWS S3 を使用した Ceph Object Gateway へのアクセス リンクのコピーリンクがクリップボードにコピーされました!
Ruby プログラミング言語は、S3 アクセスに aws-s3 gem と共に使用できます。Ruby AWS::S3 で Ceph Object Gateway サーバーにアクセスするために使用されるノードで以下の手順を実行します。
前提条件
- Ceph Object Gateway へのユーザーレベルのアクセス。
- Ceph Object Gateway にアクセスするノードへのルートレベルのアクセス。
- インターネットアクセス。
手順
rubyパッケージをインストールします。[root@dev ~]# yum install ruby注記上記のコマンドは
rubyと、rubygems、ruby-libsなどの基本的な依存関係をインストールします。コマンドによってすべての依存関係がインストールされていない場合は、個別にインストールします。Ruby パッケージ
aws-s3をインストールします。[root@dev ~]# gem install aws-s3プロジェクトディレクトリーを作成します。
[user@dev ~]$ mkdir ruby_aws_s3 [user@dev ~]$ cd ruby_aws_s3コネクションファイルを作成します。
[user@dev ~]$ vim conn.rbconn.rbファイルに以下のコンテンツを貼り付けます。構文
#!/usr/bin/env ruby require 'aws/s3' require 'resolv-replace' AWS::S3::Base.establish_connection!( :server => 'FQDN_OF_GATEWAY_NODE', :port => '8080', :access_key_id => 'MY_ACCESS_KEY', :secret_access_key => 'MY_SECRET_KEY' )FQDN_OF_GATEWAY_NODEは、Ceph Object Gateway ノードの FQDN に置き換えます。MY_ACCESS_KEYおよびMY_SECRET_KEYを、Red Hat Ceph Storage Object Gateway Configuration and Administration Guide に記載されているように、S3アクセス用のradosgwユーザーを作成したときに生成されたaccess_keyおよびsecret_keyに置き換えます。例
#!/usr/bin/env ruby require 'aws/s3' require 'resolv-replace' AWS::S3::Base.establish_connection!( :server => 'testclient.englab.pnq.redhat.com', :port => '8080', :access_key_id => '98J4R9P22P5CDL65HKP8', :secret_access_key => '6C+jcaP0dp0+FZfrRNgyGA9EzRy25pURldwje049' )ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x conn.rbコマンドを実行します。
[user@dev ~]$ ./conn.rb | echo $?ファイルに正しく値を指定した場合は、コマンドの出力は
0になります。バケットを作成するための新規ファイルを作成します。
[user@dev ~]$ vim create_bucket.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Bucket.create('my-new-bucket1')ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x create_bucket.rbコマンドを実行します。
[user@dev ~]$ ./create_bucket.rbコマンドの出力が
trueの場合は、バケットmy-new-bucket1が正常に作成されたことを意味します。所有されるバケットを一覧表示するために新規ファイルを作成します。
[user@dev ~]$ vim list_owned_buckets.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Service.buckets.each do |bucket| puts "{bucket.name}\t{bucket.creation_date}" endファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x list_owned_buckets.rbコマンドを実行します。
[user@dev ~]$ ./list_owned_buckets.rb出力は以下のようになります。
my-new-bucket1 2020-01-21 10:33:19 UTCオブジェクトを作成するための新規ファイルを作成します。
[user@dev ~]$ vim create_object.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::S3Object.store( 'hello.txt', 'Hello World!', 'my-new-bucket1', :content_type => 'text/plain' )ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x create_object.rbコマンドを実行します。
[user@dev ~]$ ./create_object.rbこれで、文字列
Hello World!でhello.txtが作成されます。バケットのコンテンツを一覧表示するための新規ファイルを作成します。
[user@dev ~]$ vim list_bucket_content.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' new_bucket = AWS::S3::Bucket.find('my-new-bucket1') new_bucket.each do |object| puts "{object.key}\t{object.about['content-length']}\t{object.about['last-modified']}" endファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x list_bucket_content.rbコマンドを実行します。
[user@dev ~]$ ./list_bucket_content.rb出力は以下のようになります。
hello.txt 12 Fri, 22 Jan 2020 15:54:52 GMT空のバケットを削除するために新規ファイルを作成します。
[user@dev ~]$ vim del_empty_bucket.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Bucket.delete('my-new-bucket1')ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x del_empty_bucket.rbコマンドを実行します。
[user@dev ~]$ ./del_empty_bucket.rb | echo $?バケットが正常に削除されると、コマンドは
0を出力として返します。注記create_bucket.rbファイルを編集し、空のバケットを作成します (例:my-new-bucket4、my-new-bucket5)。次に、空のバケットの削除を試みる前に、上記のdel_empty_bucket.rbファイルを適宜編集します。空でないバケットを削除する新規ファイルを作成します。
[user@dev ~]$ vim del_non_empty_bucket.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Bucket.delete('my-new-bucket1', :force => true)ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x del_non_empty_bucket.rbコマンドを実行します。
[user@dev ~]$ ./del_non_empty_bucket.rb | echo $?バケットが正常に削除されると、コマンドは
0を出力として返します。オブジェクトを削除する新しいファイルを作成します。
[user@dev ~]$ vim delete_object.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::S3Object.delete('hello.txt', 'my-new-bucket1')ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@dev ~]$ chmod +x delete_object.rbコマンドを実行します。
[user@dev ~]$ ./delete_object.rbこれにより、オブジェクト
hello.txtが削除されます。
2.3.7. Ruby AWS SDK を使用した Ceph Object Gateway へのアクセス リンクのコピーリンクがクリップボードにコピーされました!
Ruby プログラミング言語は、S3 アクセスに aws-sdk gem と共に使用できます。Ruby AWS::SDK を使用して Ceph Object Gateway サーバーにアクセスするために使用されるノードで以下の手順を実行します。
前提条件
- Ceph Object Gateway へのユーザーレベルのアクセス。
- Ceph Object Gateway にアクセスするノードへのルートレベルのアクセス。
- インターネットアクセス。
手順
rubyパッケージをインストールします。[root@dev ~]# yum install ruby注記上記のコマンドは
rubyと、rubygems、ruby-libsなどの基本的な依存関係をインストールします。コマンドによってすべての依存関係がインストールされていない場合は、個別にインストールします。Ruby パッケージ
aws-sdkをインストールします。[root@dev ~]# gem install aws-sdkプロジェクトディレクトリーを作成します。
[user@dev ~]$ mkdir ruby_aws_sdk [user@dev ~]$ cd ruby_aws_sdkコネクションファイルを作成します。
[user@ruby_aws_sdk]$ vim conn.rbconn.rbファイルに以下のコンテンツを貼り付けます。構文
#!/usr/bin/env ruby require 'aws-sdk' require 'resolv-replace' Aws.config.update( endpoint: 'http://FQDN_OF_GATEWAY_NODE:8080', access_key_id: 'MY_ACCESS_KEY', secret_access_key: 'MY_SECRET_KEY', force_path_style: true, region: 'us-east-1' )FQDN_OF_GATEWAY_NODEは、Ceph Object Gateway ノードの FQDN に置き換えます。MY_ACCESS_KEYおよびMY_SECRET_KEYを、Red Hat Ceph Storage Object Gateway Configuration and Administration Guide に記載されているように、S3アクセス用のradosgwユーザーを作成したときに生成されたaccess_keyおよびsecret_keyに置き換えます。例
#!/usr/bin/env ruby require 'aws-sdk' require 'resolv-replace' Aws.config.update( endpoint: 'http://testclient.englab.pnq.redhat.com:8080', access_key_id: '98J4R9P22P5CDL65HKP8', secret_access_key: '6C+jcaP0dp0+FZfrRNgyGA9EzRy25pURldwje049', force_path_style: true, region: 'us-east-1' )ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x conn.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./conn.rb | echo $?ファイルに正しく値を指定した場合は、コマンドの出力は
0になります。バケットを作成するための新規ファイルを作成します。
[user@ruby_aws_sdk]$ vim create_bucket.rb以下のコンテンツをファイルに貼り付けます。
構文
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.create_bucket(bucket: 'my-new-bucket2')ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x create_bucket.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./create_bucket.rbコマンドの出力が
trueの場合は、バケットmy-new-bucket2が正常に作成されていることを意味します。所有されるバケットを一覧表示するために新規ファイルを作成します。
[user@ruby_aws_sdk]$ vim list_owned_buckets.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.list_buckets.buckets.each do |bucket| puts "{bucket.name}\t{bucket.creation_date}" endファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x list_owned_buckets.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./list_owned_buckets.rb出力は以下のようになります。
my-new-bucket2 2022-04-21 10:33:19 UTCオブジェクトを作成するための新規ファイルを作成します。
[user@ruby_aws_sdk]$ vim create_object.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.put_object( key: 'hello.txt', body: 'Hello World!', bucket: 'my-new-bucket2', content_type: 'text/plain' )ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x create_object.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./create_object.rbこれで、文字列
Hello World!でhello.txtが作成されます。バケットのコンテンツを一覧表示するための新規ファイルを作成します。
[user@ruby_aws_sdk]$ vim list_bucket_content.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.list_objects(bucket: 'my-new-bucket2').contents.each do |object| puts "{object.key}\t{object.size}" endファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x list_bucket_content.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./list_bucket_content.rb出力は以下のようになります。
hello.txt 12 Fri, 22 Apr 2022 15:54:52 GMT空のバケットを削除するために新規ファイルを作成します。
[user@ruby_aws_sdk]$ vim del_empty_bucket.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.delete_bucket(bucket: 'my-new-bucket2')ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x del_empty_bucket.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./del_empty_bucket.rb | echo $?バケットが正常に削除されると、コマンドは
0を出力として返します。注記create_bucket.rbファイルを編集し、空のバケットを作成します (例:my-new-bucket6、my-new-bucket7)。次に、空のバケットの削除を試みる前に、上記のdel_empty_bucket.rbファイルを適宜編集します。空でないバケットを削除する新規ファイルを作成します。
[user@ruby_aws_sdk]$ vim del_non_empty_bucket.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new Aws::S3::Bucket.new('my-new-bucket2', client: s3_client).clear! s3_client.delete_bucket(bucket: 'my-new-bucket2')ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x del_non_empty_bucket.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./del_non_empty_bucket.rb | echo $?バケットが正常に削除されると、コマンドは
0を出力として返します。オブジェクトを削除する新しいファイルを作成します。
[user@ruby_aws_sdk]$ vim delete_object.rb以下のコンテンツをファイルに貼り付けます。
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.delete_object(key: 'hello.txt', bucket: 'my-new-bucket2')ファイルを保存して、エディターを終了します。
ファイルを実行可能にします。
[user@ruby_aws_sdk]$ chmod +x delete_object.rbコマンドを実行します。
[user@ruby_aws_sdk]$ ./delete_object.rbこれにより、オブジェクト
hello.txtが削除されます。
2.3.8. PHP を使用した Ceph Object Gateway へのアクセス リンクのコピーリンクがクリップボードにコピーされました!
S3 アクセスには PHP スクリプトを使用できます。この手順では、バケットやオブジェクトの削除など、さまざまなタスクを実行する PHP スクリプトの例を提供します。
以下は、php v5.4.16 および aws-sdk v2.8.24 に対してテストされています。php >= 5.5+ が必要なため、php に aws-sdk の最新バージョンを使用 しません。php 5.5 は、RHEL 7 のデフォルトリポジトリーでは利用できません。php 5.5 を使用する場合は、epel およびその他のサードパーティーのリポジトリーを有効にする必要があります。また、php 5.5 および最新バージョンの aws-sdk の設定オプションも異なります。
前提条件
- 開発ワークステーションへのルートレベルのアクセス。
- インターネットアクセス。
手順
phpパッケージをインストールします。[root@dev ~]# yum install php-
PHP 用に
aws-sdkの zip アーカイブを ダウンロード し、展開します。 プロジェクトディレクトリーを作成します。
[user@dev ~]$ mkdir php_s3 [user@dev ~]$ cd php_s3展開した
awsディレクトリーをプロジェクトのディレクトリーにコピーします。以下に例を示します。[user@php_s3]$ cp -r ~/Downloads/aws/ ~/php_s3/コネクションファイルを作成します。
[user@php_s3]$ vim conn.phpconn.phpファイルに以下のコンテンツを貼り付けます。構文
<?php define('AWS_KEY', 'MY_ACCESS_KEY'); define('AWS_SECRET_KEY', 'MY_SECRET_KEY'); define('HOST', 'FQDN_OF_GATEWAY_NODE'); define('PORT', '8080'); // require the AWS SDK for php library require '/PATH_TO_AWS/aws-autoloader.php'; use Aws\S3\S3Client; // Establish connection with host using S3 Client client = S3Client::factory(array( 'base_url' => HOST, 'port' => PORT, 'key' => AWS_KEY, 'secret' => AWS_SECRET_KEY )); ?>FQDN_OF_GATEWAY_NODEは、ゲートウェイノードの FQDN に置き換えます。MY_ACCESS_KEYおよびMY_SECRET_KEYを、Red Hat Ceph Storage Object Gateway Configuration and Administration Guide で説明されているように、S3アクセス用のradosgwユーザーを作成するときに生成されたaccess_keyおよびsecret_keyに置き換えます。PATH_TO_AWSは、phpプロジェクトディレクトリーにコピーした、展開したawsディレクトリーへの絶対パスに置き換えます。ファイルを保存して、エディターを終了します。
コマンドを実行します。
[user@php_s3]$ php -f conn.php | echo $?ファイルに正しく値を指定した場合は、コマンドの出力は
0になります。バケットを作成するための新規ファイルを作成します。
[user@php_s3]$ vim create_bucket.php新しいファイルに以下の内容を貼り付けます。
構文
<?php include 'conn.php'; client->createBucket(array('Bucket' => 'my-new-bucket3')); ?>ファイルを保存して、エディターを終了します。
コマンドを実行します。
[user@php_s3]$ php -f create_bucket.php所有されるバケットを一覧表示するために新規ファイルを作成します。
[user@php_s3]$ vim list_owned_buckets.php以下のコンテンツをファイルに貼り付けます。
構文
<?php include 'conn.php'; blist = client->listBuckets(); echo "Buckets belonging to " . blist['Owner']['ID'] . ":\n"; foreach (blist['Buckets'] as b) { echo "{b['Name']}\t{b['CreationDate']}\n"; } ?>ファイルを保存して、エディターを終了します。
コマンドを実行します。
[user@php_s3]$ php -f list_owned_buckets.php出力は以下のようになります。
my-new-bucket3 2022-04-21 10:33:19 UTCまず
hello.txtという名前のソースファイルを作成するオブジェクトを作成します。[user@php_s3]$ echo "Hello World!" > hello.txt新しい php ファイルを作成します。
[user@php_s3]$ vim create_object.php以下のコンテンツをファイルに貼り付けます。
構文
<?php include 'conn.php'; key = 'hello.txt'; source_file = './hello.txt'; acl = 'private'; bucket = 'my-new-bucket3'; client->upload(bucket, key, fopen(source_file, 'r'), acl); ?>ファイルを保存して、エディターを終了します。
コマンドを実行します。
[user@php_s3]$ php -f create_object.phpこれにより、バケット
my-new-bucket3でオブジェクトhello.txtが作成されます。バケットのコンテンツを一覧表示するための新規ファイルを作成します。
[user@php_s3]$ vim list_bucket_content.php以下のコンテンツをファイルに貼り付けます。
構文
<?php include 'conn.php'; o_iter = client->getIterator('ListObjects', array( 'Bucket' => 'my-new-bucket3' )); foreach (o_iter as o) { echo "{o['Key']}\t{o['Size']}\t{o['LastModified']}\n"; } ?>ファイルを保存して、エディターを終了します。
コマンドを実行します。
[user@php_s3]$ php -f list_bucket_content.php出力は以下のようになります。
hello.txt 12 Fri, 22 Apr 2022 15:54:52 GMT空のバケットを削除するために新規ファイルを作成します。
[user@php_s3]$ vim del_empty_bucket.php以下のコンテンツをファイルに貼り付けます。
構文
<?php include 'conn.php'; client->deleteBucket(array('Bucket' => 'my-new-bucket3')); ?>ファイルを保存して、エディターを終了します。
コマンドを実行します。
[user@php_s3]$ php -f del_empty_bucket.php | echo $?バケットが正常に削除されると、コマンドは
0を出力として返します。注記create_bucket.phpファイルを編集し、空のバケットを作成します (例:my-new-bucket4、my-new-bucket5)。次に、空のバケットの削除を試みる前に、上記のdel_empty_bucket.phpファイルを適宜編集します。重要空でないバケットの削除は、現在 PHP 2 以降のバージョンの
aws-sdkではサポートされていません。オブジェクトを削除する新しいファイルを作成します。
[user@php_s3]$ vim delete_object.php以下のコンテンツをファイルに貼り付けます。
構文
<?php include 'conn.php'; client->deleteObject(array( 'Bucket' => 'my-new-bucket3', 'Key' => 'hello.txt', )); ?>ファイルを保存して、エディターを終了します。
コマンドを実行します。
[user@php_s3]$ php -f delete_object.phpこれにより、オブジェクト
hello.txtが削除されます。
2.3.9. AWS CLI を使用して Ceph Object Gateway にアクセスする リンクのコピーリンクがクリップボードにコピーされました!
S3 アクセスには AWS CLI を使用できます。この手順では、AWS CLI をインストールする手順と、MFA 削除が有効なバケットからオブジェクトを削除するなど、さまざまなタスクを実行するコマンドの例をいくつか示します。
前提条件
- Ceph Object Gateway へのユーザーレベルのアクセス。
- 開発ワークステーションへのルートレベルのアクセス。
-
radosgw-admin mfa createを使用して、多要素認証 (MFA) TOTP トークンが作成されました
手順
awscliパッケージをインストールします。[user@dev]$ pip3 install --user awscliAWS CLI を使用して Ceph Object Storage にアクセスするように
awscliを設定します。構文
aws configure --profile=MY_PROFILE_NAME AWS Access Key ID [None]: MY_ACCESS_KEY AWS Secret Access Key [None]: MY_SECRET_KEY Default region name [None]: Default output format [None]:MY_PROFILE_NAMEを、このプロファイルを識別するために使用する名前に置き換えます。MY_ACCESS_KEYおよびMY_SECRET_KEYを、Red Hat Ceph Storage Object Gateway Configuration and Administration Guide で説明されているように、S3アクセス用のradosgwユーザーを作成するときに生成されたaccess_keyおよびsecret_keyに置き換えます。例
[user@dev]$ aws configure --profile=ceph AWS Access Key ID [None]: 12345 AWS Secret Access Key [None]: 67890 Default region name [None]: Default output format [None]:Ceph Object Gateway ノードの FQDN を指すエイリアスを作成します。
構文
alias aws="aws --endpoint-url=http://FQDN_OF_GATEWAY_NODE:8080"FQDN_OF_GATEWAY_NODEは、Ceph Object Gateway ノードの FQDN に置き換えます。例
[user@dev]$ alias aws="aws --endpoint-url=http://testclient.englab.pnq.redhat.com:8080"新しいバケットを作成します。
構文
aws --profile=MY_PROFILE_NAME s3api create-bucket --bucket BUCKET_NAMEMY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。BUCKET_NAMEは、新規バケットの名前に置き換えます。例
[user@dev]$ aws --profile=ceph s3api create-bucket --bucket mybucket所有するバケットを一覧表示します。
構文
aws --profile=MY_PROFILE_NAME s3api list-bucketsMY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。例
[user@dev]$ aws --profile=ceph s3api list-buckets { "Buckets": [ { "Name": "mybucket", "CreationDate": "2021-08-31T16:46:15.257Z" } ], "Owner": { "DisplayName": "User", "ID": "user" } }MFA-Delete のバケットを設定します。
構文
aws --profile=MY_PROFILE_NAME s3api put-bucket-versioning --bucket BUCKET_NAME --versioning-configuration '{"Status":"Enabled","MFADelete":"Enabled"}' --mfa 'TOTP_SERIAL TOTP_PIN'-
MY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。 -
BUCKET_NAMEを新しいバケットの名前に置き換えます。 -
TOTP_SERIALを TOTP トークンの ID を表す文字列に置き換え、TOTP_PINを MFA 認証デバイスに表示されている現在の PIN に置き換えます。 -
TOTP_SERIALは、S3 の radosgw ユーザーを作成したときに指定した文字列です。 - MFA TOTP トークンの作成に関する詳細は、Red Hat Ceph Storage Object Gateway Configuration and Administration Guide の Creating a new multi-factor authentication TOTP token セクションを参照してください。
oathtool を使用した MFA シードの作成に関する詳細は、Red Hat Ceph Storage 開発者ガイド の oathtool を使用した多要素認証のシードの作成 セクションを参照してください。
例
[user@dev]$ aws --profile=ceph s3api put-bucket-versioning --bucket mybucket --versioning-configuration '{"Status":"Enabled","MFADelete":"Enabled"}' --mfa 'MFAtest 232009'
-
バケットバージョン管理状態の MFA-Delete ステータスを表示します。
構文
aws --profile=MY_PROFILE_NAME s3api get-bucket-versioning --bucket BUCKET_NAMEMY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。BUCKET_NAMEを新しいバケットの名前に置き換えます。例
[user@dev]$ aws --profile=ceph s3api get-bucket-versioning --bucket mybucket { "Status": "Enabled", "MFADelete": "Enabled" }MFA-Delete が有効なバケットにオブジェクトを追加します。
構文
aws --profile=MY_PROFILE_NAME s3api put-object --bucket BUCKET_NAME --key OBJECT_KEY --body LOCAL_FILE-
MY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。 -
BUCKET_NAMEを新しいバケットの名前に置き換えます。 -
OBJECT_KEYを、バケット内のオブジェクトを一意に識別する名前に置き換えます。 LOCAL_FILEを、アップロードするローカルファイルの名前に置き換えます。例
[user@dev]$ aws --profile=ceph s3api put-object --bucket mybucket --key example --body testfile { "ETag": "\"5679b828547a4b44cfb24a23fd9bb9d5\"", "VersionId": "3VyyYPTEuIofdvMPWbr1znlOu7lJE3r" }
-
特定のオブジェクトのオブジェクトバージョンを一覧表示します。
構文
aws --profile=MY_PROFILE_NAME s3api list-object-versions --bucket BUCKET_NAME --key OBJEC_KEY]-
MY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。 -
BUCKET_NAMEを新しいバケットの名前に置き換えます。 OBJECT_KEYを、バケット内のオブジェクトを一意に識別するために指定された名前に置き換えます。例
[user@dev]$ aws --profile=ceph s3api list-object-versions --bucket mybucket --key example { "IsTruncated": false, "KeyMarker": "example", "VersionIdMarker": "", "Versions": [ { "ETag": "\"5679b828547a4b44cfb24a23fd9bb9d5\"", "Size": 196, "StorageClass": "STANDARD", "Key": "example", "VersionId": "3VyyYPTEuIofdvMPWbr1znlOu7lJE3r", "IsLatest": true, "LastModified": "2021-08-31T17:48:45.484Z", "Owner": { "DisplayName": "User", "ID": "user" } } ], "Name": "mybucket", "Prefix": "", "MaxKeys": 1000, "EncodingType": "url" }
-
MFA-Delete が有効なバケット内のオブジェクトを削除します。
構文
aws --profile=MY_PROFILE_NAME s3api delete-object --bucket BUCKET_NAME --key OBJECT_KEY --version-id VERSION_ID --mfa 'TOTP_SERIAL TOTP_PIN'-
MY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。 -
BUCKET_NAMEを、削除するオブジェクトを含むバケットの名前に置き換えます。 -
OBJECT_KEYを、バケット内のオブジェクトを一意に識別する名前に置き換えます。 -
VERSION_IDを、削除するオブジェクトの特定のバージョンの VersionID に置き換えます。 TOTP_SERIALを TOTP トークンの ID を表す文字列に置き換え、TOTP_PINを MFA 認証デバイスに表示されている現在の PIN に置き換えます。例
[user@dev]$ aws --profile=ceph s3api delete-object --bucket mybucket --key example --version-id 3VyyYPTEuIofdvMPWbr1znlOu7lJE3r --mfa 'MFAtest 420797' { "VersionId": "3VyyYPTEuIofdvMPWbr1znlOu7lJE3r" }MFA トークンが含まれていない場合、リクエストは次のエラーで失敗します。
例
[user@dev]$ aws --profile=ceph s3api delete-object --bucket mybucket --key example --version-id 3VyyYPTEuIofdvMPWbr1znlOu7lJE3r An error occurred (AccessDenied) when calling the DeleteObject operation: Unknown
-
オブジェクトのバージョンを一覧表示して、MFA 削除が有効なバケットからオブジェクトが削除されたことを確認します。
構文
aws --profile=MY_PROFILE_NAME s3api list-object-versions --bucket BUCKET_NAME --key OBJECT_KEY-
MY_PROFILE_NAMEを、このプロファイルを使用するために作成した名前に置き換えます。 -
BUCKET_NAMEをバケットの名前に置き換えます。 OBJECT_KEYを、バケット内のオブジェクトを一意に識別する名前に置き換えます。例
[user@dev]$ aws --profile=ceph s3api list-object-versions --bucket mybucket --key example { "IsTruncated": false, "KeyMarker": "example", "VersionIdMarker": "", "Name": "mybucket", "Prefix": "", "MaxKeys": 1000, "EncodingType": "url" }
-
2.3.10. oathtool コマンドを使用して多要素認証のシードを作成する リンクのコピーリンクがクリップボードにコピーされました!
マルチファクター認証 (MFA) を設定するには、時間ベースのワンタイムパスワード (TOTP) ジェネレーターとバックエンド MFA システムで使用するシークレットシードを作成する必要があります。oathtool を使用して 16 進数のシードを生成し、オプションで qrencode を使用して QR コードを作成し、トークンを MFA デバイスにインポートできます。
前提条件
- Linux システム。
- コマンドラインシェルへのアクセス。
-
Linux システムへの
rootまたはsudoアクセス。
手順
oathtoolパッケージをインストールします。[root@dev]# dnf install oathtoolqrencodeパッケージをインストールします。[root@dev]# dnf install qrencodeurandomLinux デバイスファイルから 30 文字のシードを生成し、シェル変数SEEDに格納します。例
[user@dev]$ SEED=$(head -10 /dev/urandom | sha512sum | cut -b 1-30)SEED変数で echo を実行して、シードを出力します。例
[user@dev]$ echo $SEED BA6GLJBJIKC3D7W7YFYXXAQ7SEEDを oathtool コマンドに入力します。構文
oathtool -v -d6 $SEED例
[user@dev]$ oathtool -v -d6 $SEED Hex secret: 083c65a4294285b1fedfc1717b821f Base32 secret: BA6GLJBJIKC3D7W7YFYXXAQ7 Digits: 6 Window size: 0 Start counter: 0x0 (0) 823182注記base32 シークレットは、MFA デバイスのオーセンティケーターアプリケーションにトークンを追加するために必要です。QR コードを使用してトークンを認証アプリケーションにインポートするか、base32 シークレットを使用して手動でトークンを追加できます。
オプション: QR コードイメージファイルを作成して、トークンをオーセンティケーターに追加します。
構文
qrencode -o /tmp/user.png 'otpauth://totp/TOTP_SERIAL?secret=_BASE32_SECRET'TOTP_SERIALを (TOTP) トークンの ID を表す文字列に置き換え、BASE32_SECRETを oathtool によって生成された Base32 シークレットに置き換えます。例
[user@dev]$ qrencode -o /tmp/user.png 'otpauth://totp/MFAtest?secret=BA6GLJBJIKC3D7W7YFYXXAQ7'- 生成された QR コードイメージファイルをスキャンして、トークンを MFA デバイスの認証アプリケーションに追加します。
-
radowgw-adminコマンドを使用して、ユーザーの多要素認証 TOTP トークンを作成します。
2.3.11. セキュアなトークンサービス リンクのコピーリンクがクリップボードにコピーされました!
Amazon Web Services の Secure Token Service (STS) は、ユーザーを認証するための一時セキュリティー認証情報のセットを返します。Ceph Object Gateway は STS アプリケーションプログラミングインターフェイス (API) のサブセットを実装し、ID およびアクセス管理 (IAM) の一時的な認証情報を提供します。これらの一時的な認証情報を使用して、Ceph Object Gateway の STS エンジンを使用して S3 呼び出しを認証します。IAM ポリシーを使用すると、STS API に渡されるパラメーターである一時認証情報をさらに制限できます。
関連情報
- Amazon Web Services Secure Token Service の Welcome ページ。
- STS Lite および Keystone の詳細は、Red Hat Ceph Storage 開発者ガイドの STS Lite および Keystone の設定および使用 セクションを参照してください。
- STS Lite および Keystone の制限の詳細は、Red Hat Ceph Storage 開発者ガイドの Keystone のある STS Lite を使用する際の制限の回避 を参照してください。
2.3.11.1. Secure Token Service アプリケーションのプログラミングインターフェイス リンクのコピーリンクがクリップボードにコピーされました!
Ceph Object Gateway は、以下の Secure Token Service (STS) アプリケーションプログラミングインターフェイス (API) を実装します。
AssumeRole
この API は、アカウント間のアクセスのための一時的な認証情報のセットを返します。これらの一時的な認証情報により、Role と、AssumeRole API で割り当てられるポリシーの両方に割り当てられるパーミッションポリシーを使用することができます。RoleArn および RoleSessionName リクエストパラメーターは必須ですが、他の要求パラメーターは任意です。
RoleArn- 詳細
- 長さが 20 ~ 2048 文字の Amazon Resource Name (ARN) について想定するロール。
- 型
- 文字列
- 必須
- はい
RoleSessionName- 詳細
-
仮定するロールセッション名を特定します。ロールセッション名は、異なるプリンシパルや別の理由がロールを想定する場合にセッションを一意に識別できます。このパラメーターの値は、2 文字から 64 文字までです。
=、,、.、@、および-文字は使用できますが、スペースは使用できません。 - 型
- 文字列
- 必須
- はい
ポリシー- 詳細
- インラインセッションで使用する JSON 形式の ID およびアクセス管理ポリシー (IAM)。このパラメーターの値は 1 文字から 2048 文字までです。
- 型
- 文字列
- 必須
- いいえ
DurationSeconds- 詳細
-
セッションの期間 (秒単位)。最小値は
900秒で、最大値は43200秒です。デフォルト値は3600秒です。 - 型
- 整数
- 必須
- いいえ
ExternalId- 詳細
- 別のアカウントのロールを想定する場合には、利用可能な場合は一意の外部識別子を指定します。このパラメーターの値は、2 文字から 1224 文字までになります。
- 型
- 文字列
- 必須
- いいえ
SerialNumber- 詳細
- 関連付けられたマルチファクター認証 (MFA) デバイスからのユーザーの識別番号。パラメーターの値は、9 文字から 256 文字までのハードウェアデバイスまたは仮想デバイスのシリアル番号になります。
- 型
- 文字列
- 必須
- いいえ
TokenCode- 詳細
- 信頼ポリシーに MFA が必要な場合は、マルチファクター認証 (MFA) デバイスから生成された値。MFA デバイスが必要で、このパラメーターの値が空または期限切れの場合には、AssumeRole の呼び出しは access denied エラーメッセージを返します。このパラメーターの値には、固定長は 6 文字です。
- 型
- 文字列
- 必須
- いいえ
AssumeRoleWithWebIdentity
この API は、OpenID Connect や OAuth 2.0 アイデンティティープロバイダーなどのアプリケーションによって認証されたユーザーの一時認証情報のセットを返します。RoleArn および RoleSessionName リクエストパラメーターは必須ですが、他の要求パラメーターは任意です。
RoleArn- 詳細
- 長さが 20 ~ 2048 文字の Amazon Resource Name (ARN) について想定するロール。
- 型
- 文字列
- 必須
- はい
RoleSessionName- 詳細
-
仮定するロールセッション名を特定します。ロールセッション名は、異なるプリンシパルや別の理由がロールを想定する場合にセッションを一意に識別できます。このパラメーターの値は、2 文字から 64 文字までです。
=、,、.、@、および-文字は使用できますが、スペースは使用できません。 - 型
- 文字列
- 必須
- はい
ポリシー- 詳細
- インラインセッションで使用する JSON 形式の ID およびアクセス管理ポリシー (IAM)。このパラメーターの値は 1 文字から 2048 文字までです。
- 型
- 文字列
- 必須
- いいえ
DurationSeconds- 詳細
-
セッションの期間 (秒単位)。最小値は
900秒で、最大値は43200秒です。デフォルト値は3600秒です。 - 型
- 整数
- 必須
- いいえ
ProviderId- 詳細
- アイデンティティープロバイダーからのドメイン名の完全修飾ホストコンポーネント。このパラメーターの値は、長さが 4 ~ 2048 文字の OAuth 2.0 アクセストークンでのみ有効です。
- 型
- 文字列
- 必須
- いいえ
WebIdentityToken- 詳細
- アイデンティティープロバイダーから提供される OpenID Connect アイデンティティートークンまたは OAuth 2.0 アクセストークン。このパラメーターの値は、4 文字から 2048 文字までです。
- 型
- 文字列
- 必須
- いいえ
関連情報
- 詳細は、Red Hat Ceph Storage 開発者ガイドの Secure Token Service API の使用例 セクションを参照してください。
- Amazon Web Services Security Token Service (AssumeRole アクション)
- Amazon Web Services Security Token Service (AssumeRoleWithWebIdentity アクション)
2.3.11.2. セキュアなトークンサービスの設定 リンクのコピーリンクがクリップボードにコピーされました!
Ceph Ansible を使用して Ceph Object Gateway で使用する Secure Token Service (STS) を設定します。
S3 と STS API は同じ名前空間に共存し、いずれも Ceph Object Gateway の同じエンドポイントからアクセスできます。
前提条件
- Ceph Ansible 管理ノード。
- 稼働中の Red Hat Ceph Storage クラスターがある。
- 実行中の Ceph Object Gateway。
手順
group_vars/rgws.ymlファイルを編集するために開きます。以下の行を追加します。
rgw_sts_key = STS_KEY rgw_s3_auth_use_sts = true以下を置き換えます。
-
STS_KEYは、セッショントークンの暗号化に使用される鍵に置き換えます。
-
-
group_vars/rgws.ymlファイルへの変更を保存します。 適切な Ceph Ansible Playbook を再実行します。
ベアメタル デプロイメント:
[user@admin ceph-ansible]$ ansible-playbook site.yml --limit rgwsコンテナー デプロイメント:
[user@admin ceph-ansible]$ ansible-playbook site-docker.yml --limit rgws
関連情報
- STS API に関する詳細は、Red Hat Ceph Storage 開発者ガイドの Secure Token Service アプリケーションのプログラミングインターフェイス セクションを参照してください。
2.3.11.3. OpenID Connect プロバイダー用のユーザーの作成 リンクのコピーリンクがクリップボードにコピーされました!
Ceph Object Gateway と OpenID Connect Provider との間の信頼を確立するには、ユーザーエンティティーとロール信頼ポリシーを作成します。
前提条件
- Ceph Object Gateway ノードへのユーザーレベルのアクセス。
手順
新しい Ceph ユーザーを作成します。
構文
radosgw-admin --uid USER_NAME --display-name "DISPLAY_NAME" --access_key USER_NAME --secret SECRET user create例
[user@rgw ~]$ radosgw-admin --uid TESTER --display-name "TestUser" --access_key TESTER --secret test123 user createCeph ユーザー機能を設定します。
構文
radosgw-admin caps add --uid="USER_NAME" --caps="oidc-provider=*"例
[user@rgw ~]$ radosgw-admin caps add --uid="TESTER" --caps="oidc-provider=*"Secure Token Service (STS) API を使用してロール信頼ポリシーに条件を追加します。
構文
"{\"Version\":\"2020-01-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Federated\":[\"arn:aws:iam:::oidc-provider/IDP_URL\"]},\"Action\":[\"sts:AssumeRoleWithWebIdentity\"],\"Condition\":{\"StringEquals\":{\"IDP_URL:app_id\":\"AUD_FIELD\"\}\}\}\]\}"重要上記の構文例の
app_idは、着信トークンのAUD_FIELDフィールドと一致させる必要があります。
関連情報
- Amazon の Web サイトの Obtaining the Root CA Thumbprint for an OpenID Connect Identity Provider を参照してください。
- STS API に関する詳細は、Red Hat Ceph Storage 開発者ガイドの Secure Token Service アプリケーションのプログラミングインターフェイス セクションを参照してください。
- 詳細は、Red Hat Ceph Storage 開発者ガイドの Secure Token Service API の使用例 セクションを参照してください。
2.3.11.4. OpenID Connect プロバイダーのサムプリントの取得 リンクのコピーリンクがクリップボードにコピーされました!
OpenID Connect プロバイダー (IDP) の設定ドキュメントを取得するには、以下を実行します。
前提条件
-
opensslパッケージおよびcurlパッケージのインストール。
手順
IDP の URL から設定ドキュメントを取得します。
構文
curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "IDP_URL:8000/CONTEXT/realms/REALM/.well-known/openid-configuration" \ | jq .例
[user@client ~]$ curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "http://www.example.com:8000/auth/realms/quickstart/.well-known/openid-configuration" \ | jq .IDP 証明書を取得します。
構文
curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "IDP_URL/CONTEXT/realms/REALM/protocol/openid-connect/certs" \ | jq .例
[user@client ~]$ curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "http://www.example.com/auth/realms/quickstart/protocol/openid-connect/certs" \ | jq .-
直前のコマンドから x5c 応答の結果をコピーし、それを
certificate.crtファイルに貼り付けます。冒頭に—–BEGIN CERTIFICATE—–、末尾に—–END CERTIFICATE—–を含めます。 証明書のサムプリントを取得します。
構文
openssl x509 -in CERT_FILE -fingerprint -noout例
[user@client ~]$ openssl x509 -in certificate.crt -fingerprint -noout SHA1 Fingerprint=F7:D7:B3:51:5D:D0:D3:19:DD:21:9A:43:A9:EA:72:7A:D6:06:52:87- SHA1 フィンガープリントからコロンをすべて削除し、IAM 要求で IDP エンティティーを作成するための入力として使用します。
関連情報
- Amazon の Web サイトの Obtaining the Root CA Thumbprint for an OpenID Connect Identity Provider を参照してください。
- STS API に関する詳細は、Red Hat Ceph Storage 開発者ガイドの Secure Token Service アプリケーションのプログラミングインターフェイス セクションを参照してください。
- 詳細は、Red Hat Ceph Storage 開発者ガイドの Secure Token Service API の使用例 セクションを参照してください。
2.3.11.5. Keystone での STS Lite の設定および使用 (テクノロジープレビュー) リンクのコピーリンクがクリップボードにコピーされました!
Amazon Secure Token Service (STS) と S3 API は、同じ名前空間に共存します。STS オプションは、Keystone オプションと組み合わせて設定できます。
S3 と STS の API の両方に、Ceph Object Gateway の同じエンドポイントを使用してアクセスできます。
前提条件
- Red Hat Ceph Storage 3.2 以降
- 実行中の Ceph Object Gateway。
- Boto Python モジュールのバージョン 3 以降のインストール
手順
group_vars/rgws.ymlファイルを以下のオプションで開き、編集します。rgw_sts_key = STS_KEY rgw_s3_auth_use_sts = true以下を置き換えます。
-
STS_KEYは、セッショントークンの暗号化に使用される鍵に置き換えます。
-
適切な Ceph Ansible Playbook を再実行します。
ベアメタル デプロイメント:
[user@admin ceph-ansible]$ ansible-playbook site.yml --limit rgwsコンテナー デプロイメント:
[user@admin ceph-ansible]$ ansible-playbook site-docker.yml --limit rgws
EC2 認証情報を生成します。
例
[user@osp ~]$ openstack ec2 credentials create +------------+--------------------------------------------------------+ | Field | Value | +------------+--------------------------------------------------------+ | access | b924dfc87d454d15896691182fdeb0ef | | links | {u'self': u'http://192.168.0.15/identity/v3/users/ | | | 40a7140e424f493d8165abc652dc731c/credentials/ | | | OS-EC2/b924dfc87d454d15896691182fdeb0ef'} | | project_id | c703801dccaf4a0aaa39bec8c481e25a | | secret | 6a2142613c504c42a94ba2b82147dc28 | | trust_id | None | | user_id | 40a7140e424f493d8165abc652dc731c | +------------+--------------------------------------------------------+生成された認証情報を使用して、GetSessionToken API を使用して一時的なセキュリティー認証情報のセットを取得します。
例
import boto3 access_key = b924dfc87d454d15896691182fdeb0ef secret_key = 6a2142613c504c42a94ba2b82147dc28 client = boto3.client('sts', aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url=https://www.example.com/rgw, region_name='', ) response = client.get_session_token( DurationSeconds=43200 )一時認証情報の取得は、S3 呼び出しの作成に使用できます。
例
s3client = boto3.client('s3', aws_access_key_id = response['Credentials']['AccessKeyId'], aws_secret_access_key = response['Credentials']['SecretAccessKey'], aws_session_token = response['Credentials']['SessionToken'], endpoint_url=https://www.example.com/s3, region_name='') bucket = s3client.create_bucket(Bucket='my-new-shiny-bucket') response = s3client.list_buckets() for bucket in response["Buckets"]: print "{name}\t{created}".format( name = bucket['Name'], created = bucket['CreationDate'], )新しい S3Access ロールを作成し、ポリシーを設定します。
管理 CAPS でユーザーを割り当てます。
構文
radosgw-admin caps add --uid="USER" --caps="roles=*"例
[user@client]$ radosgw-admin caps add --uid="gwadmin" --caps="roles=*"S3Access ロールを作成します。
構文
radosgw-admin role create --role-name=ROLE_NAME --path=PATH --assume-role-policy-doc=TRUST_POLICY_DOC例
[user@client]$ radosgw-admin role create --role-name=S3Access --path=/application_abc/component_xyz/ --assume-role-policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Principal\":\{\"AWS\":\[\"arn:aws:iam:::user/TESTER\"\]\},\"Action\":\[\"sts:AssumeRole\"\]\}\]\}S3Access ロールにパーミッションポリシーを割り当てます。
構文
radosgw-admin role-policy put --role-name=ROLE_NAME --policy-name=POLICY_NAME --policy-doc=PERMISSION_POLICY_DOC例
[user@client]$ radosgw-admin role-policy put --role-name=S3Access --policy-name=Policy --policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Action\":\[\"s3:*\"\],\"Resource\":\"arn:aws:s3:::example_bucket\"\}\]\}-
別のユーザーが
gwadminユーザーのロールを想定できるようになりました。たとえば、gwuserユーザーは、gwadminユーザーのパーミッションを想定できます。 仮定ユーザーの
access_keyおよびsecret_keyの値を書き留めておきます。例
[user@client]$ radosgw-admin user info --uid=gwuser | grep -A1 access_key
AssumeRole API 呼び出しを使用し、仮定のユーザーから
access_keyおよびsecret_keyの値を提供します。例
import boto3 access_key = 11BS02LGFB6AL6H1ADMW secret_key = vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY client = boto3.client('sts', aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url=https://www.example.com/rgw, region_name='', ) response = client.assume_role( RoleArn='arn:aws:iam:::role/application_abc/component_xyz/S3Access', RoleSessionName='Bob', DurationSeconds=3600 )重要AssumeRole API には S3Access ロールが必要です。
関連情報
- Boto Python モジュールのインストールに関する詳細は、Red Hat Ceph Storage Object Gateway ガイドの S3 アクセスのテスト セクションを参照してください。
- 詳細は、Red Hat Ceph Storage Object Gateway ガイド の ユーザーの作成 セクションを参照してください。
2.3.11.6. Keystone で STS Lite を使用するための制限の回避 (テクノロジープレビュー) リンクのコピーリンクがクリップボードにコピーされました!
Keystone の制限は、STS リクエストをサポートしないことです。もう 1 つの制限は、ペイロードハッシュがリクエストに含まれていないことです。この 2 つの制限を回避するには、Boto 認証コードを変更する必要があります。
前提条件
- 稼働中の Red Hat Ceph Storage クラスター (バージョン 3.2 以降)。
- 実行中の Ceph Object Gateway。
- Boto Python モジュールのバージョン 3 以降のインストール
手順
Boto の
auth.pyファイルを開いて編集します。以下の 4 つの行をコードブロックに追加します。
class SigV4Auth(BaseSigner): """ Sign a request with Signature V4. """ REQUIRES_REGION = True def __init__(self, credentials, service_name, region_name): self.credentials = credentials # We initialize these value here so the unit tests can have # valid values. But these will get overriden in ``add_auth`` # later for real requests. self._region_name = region_name if service_name == 'sts':1 self._service_name = 's3'2 else:3 self._service_name = service_name4 以下の 2 つの行をコードブロックに追加します。
def _modify_request_before_signing(self, request): if 'Authorization' in request.headers: del request.headers['Authorization'] self._set_necessary_date_headers(request) if self.credentials.token: if 'X-Amz-Security-Token' in request.headers: del request.headers['X-Amz-Security-Token'] request.headers['X-Amz-Security-Token'] = self.credentials.token if not request.context.get('payload_signing_enabled', True): if 'X-Amz-Content-SHA256' in request.headers: del request.headers['X-Amz-Content-SHA256'] request.headers['X-Amz-Content-SHA256'] = UNSIGNED_PAYLOAD1 else:2 request.headers['X-Amz-Content-SHA256'] = self.payload(request)
関連情報
- Boto Python モジュールのインストールに関する詳細は、Red Hat Ceph Storage Object Gateway ガイドの S3 アクセスのテスト セクションを参照してください。
2.3.12. STS での属性ベースのアクセス制御 (ABAC) のセッションタグ リンクのコピーリンクがクリップボードにコピーされました!
セッションタグは、ユーザーのフェデレーション中に渡すことができるキーと値のペアです。これらは、セッションで aws:PrincipalTag として渡されるか、セキュアトークンサービス (STS) によって返される一時的な認証情報として渡されます。これらのプリンシパルタグは、Web トークンの一部として提供されるセッションタグと、引き受けるロールに関連付けられたタグで設定されます。
現在、セッションタグは、AssumeRoleWithWebIdentity に渡される Web トークンの一部としてのみサポートされています。
タグは常に次の名前空間で指定する必要があります: https://aws.amazon.com/tags
フェデレーションユーザーによって渡された Web トークンにセッションタグが含まれている場合、信頼ポリシーには sts:TagSession 権限が必要です。それ以外の場合、AssumeRoleWithWebIdentity アクションは失敗します。
sts:TagSession を使用した信頼ポリシーの例:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":["sts:AssumeRoleWithWebIdentity","sts:TagSession"],
"Principal":{"Federated":["arn:aws:iam:::oidc-provider/localhost:8080/auth/realms/quickstart"]},
"Condition":{"StringEquals":{"localhost:8080/auth/realms/quickstart:sub":"test"}}
}]
}
プロパティー
セッションタグのプロパティーは次のとおりです。
セッションタグは複数値にすることができます。
注記複数値のセッションタグは、Amazon Webservice (AWS) ではサポートされていません。
- Keycloak は、最大 50 個のセッションタグを持つ OpenID Connect ID プロバイダー (IDP) として設定できます。
- 許可されるキーの最大サイズは 128 文字です。
- 許可される値の最大サイズは 256 文字です。
-
タグまたは値は
aws:で開始できません。
2.3.12.1. タグキー リンクのコピーリンクがクリップボードにコピーされました!
以下は、ロール信頼ポリシーまたはロール許可ポリシーで使用できるタグキーです。
aws:RequestTag- 説明
リクエストで渡されたキーと値のペアを、ロールの信頼ポリシーのキーと値のペアと比較します。
AssumeRoleWithWebIdentityの場合、セッションタグはロール信頼ポリシーでaws:RequestTagとして使用できます。これらのセッションタグは、Web トークンで Keycloak によって渡されます。その結果、フェデレーションユーザーはロールを引き受けることができます。
aws:PrincipalTag- 説明
プリンシパルに関連付けられたキーと値のペアをポリシーのキーと値のペアと比較します。
AssumeRoleWithWebIdentityの場合、セッションタグは、ユーザーが認証されると、一時的な認証情報にプリンシパルタグとして表示されます。これらのセッションタグは、Web トークンで Keycloak によって渡されます。これらは、ロールのアクセス許可ポリシーでaws:PrincipalTagとして使用できます。
iam:ResourceTag- 説明
リソースにアタッチされたキーと値のペアをポリシーのキーと値のペアと比較します。
AssumeRoleWithWebIdentityの場合、ロールにアタッチされたタグが信頼ポリシーのタグと比較され、ユーザーがロールを引き受けることができます。注記Ceph Object Gateway は、ロールのタグ付け、タグの一覧表示、およびタグ付け解除アクションのための RESTful API をサポートするようになりました。
aws:TagKeys- 説明
リクエスト内のタグとポリシー内のタグを比較します。
AssumeRoleWithWebIdentityの場合、タグは、ユーザーがロールを引き受けることを許可される前に、ロール信頼ポリシーまたはアクセス許可ポリシーでタグキーをチェックするために使用されます。
s3:ResourceTag- 説明
S3 リソース (バケットまたはオブジェクト) に存在するタグを、ロールのアクセス許可ポリシーのタグと比較します。
これは、Ceph Object Gateway で S3 操作を承認するために使用できます。ただし、これは AWS では許可されていません。
オブジェクトやバケットに付けられたタグを参照するためのキーです。オブジェクトまたはバケットに使用できる RESTful API を使用して、タグをオブジェクトまたはバケットにアタッチできます。
2.3.12.2. S3 リソースタグ リンクのコピーリンクがクリップボードにコピーされました!
次のリストは、特定の操作を承認するためにサポートされている S3 リソースタグタイプを示しています。
- タグタイプ: オブジェクトタグ
- 操作
-
GetObject、GetObjectTags、DeleteObjectTags、DeleteObject、PutACLs、InitMultipart、AbortMultipart、`ListMultipart、GetAttrs、PutObjectRetention、GetObjectRetention、PutObjectLegalHold、GetObjectLegalHold
- タグタイプ: バケットタグ
- 操作
-
PutObjectTags、GetBucketTags、PutBucketTags、DeleteBucketTags、GetBucketReplication、DeleteBucketReplication、GetBucketVersioning、SetBucketVersioning、GetBucketWebsite、SetBucketWebsite、DeleteBucketWebsite、StatBucket、ListBucket、GetBucketLogging、GetBucketLocation、DeleteBucket、GetLC、PutLC、DeleteLC、GetCORS、PutCORS、GetRequestPayment、SetRequestPaymentPutBucketPolicy、GetBucketPolicy、DeleteBucketPolicy、PutBucketObjectLock、GetBucketObjectLock、GetBucketPolicyStatus、PutBucketPublicAccessBlock、GetBucketPublicAccessBlock、DeleteBucketPublicAccessBlock
- タグタイプ: バケット ACL のバケットタグ、オブジェクト ACL のオブジェクトタグ
- 操作
-
GetACLs、PutACLs
- タグタイプ: ソースオブジェクトのオブジェクトタグ、宛先バケットのバケットタグ
- 操作
-
PutObject、CopyObject