Freigabe privater Container (Objektspeicher) für andere Benutzer

Wenn Sie wissen wollen, wie man OBJEKTSPEICHER verwendet, lesen Sie bitte diesen Artikel Wie verwendet man den Objektspeicher?.

Wenn Sie etwas über BUCKET FREIGABE MIT S3 erfahren wollen, lesen Sie bitte diesen Artikel: Teilen von S3 Objektspeicher mit s3 Bucket Policy auf CODE-DE

Eine andere Methode für den Zugriff auf den Objektspeicher ist die Verwendung von OpenStack Swift Kommandos

Um CLI zu verwenden, sollten Sie die Python-Umgebung auf Ihrem Desktop vorbereiten (siehe: Wie installiert man den OpenStackClient (Linux)?).

Sie können Ihre eigenen privaten Container im Objektspeicher Ihrer Projekte erstellen und anderen Benutzern Zugriff gewähren. Wenn Sie den Zugriff ausgewählter Benutzer auf bestimmte Container beschränken wollen, müssen die anderen Benutzer Mitglieder anderer Projekte sein (es wird empfohlen, einen Benutzer oder eine Gruppe von Benutzern pro Projekt zuzulassen). Das Projekt kann sich in einer oder mehreren Domänen befinden. Andernfalls sehen Benutzer, die Mitglieder desselben Projekts sind, alle Container in diesem Projekt und Sie können den Zugriff auf bestimmte Container nicht einschränken.

In dem folgenden Beispiel gibt es 3 Projekte:

  1. „main“,

  2. „project_1“,

  3. „project_2“.

../_images/projects.png

3 Nutzendere:

  1. „owner“ - the user with member role in project „main“,

  2. „user_1“ - the user with member role in project „project_1“,

  3. „user_2“ - the user with member role in project „project_2“.

../_images/users.png

„owner“ hat 3 Container in seinem/ihrem Projekt „main“

  1. c-main-a,

  2. c-main-b,

  3. c-main-d.

../_images/owner_con.png

und die folgenden Dateien in den Containern:

  • c-main-a

    • test-main-a1.txt

    • test-main-a2.txt

  • c-main-b

    • test-main-b.txt

  • c-main-d

    • test-main-d.txt

Im folgenden Beispiel gewährt der Benutzer „owner“ dem Benutzer „user_1“ „read only“ auf den Container „c-main-a“.

Als erstes sollte sich der „Besitzer“ in seine Domain einloggen:

../_images/owner_login.png

das Hauptprojekt wählen

../_images/owner_main.png

das „OpenStack RC File“ für den Benutzer „owner“ und das Projekt „main“ herunterladen

../_images/owner_rc.png

Sie können den Inhalt der Datei im Linux-Terminal sehen:

$ cat main-openrc.sh

main-openrc.sh

#!/usr/bin/env bash
# To use an OpenStack cloud you need to authenticate against the Identity
# service named keystone, which returns a **Token** and **Service Catalog**.
# The catalog contains the endpoints for all services the user/tenant has
# access to - such as Compute, Image Service, Identity, Object Storage, Block
# Storage, and Networking (code-named nova, glance, keystone, swift,
# cinder, and neutron).
#
# *NOTE*: Using the 3 *Identity API* does not necessarily mean any other
# OpenStack API is version 3. For example, your cloud provider may implement
# Image API v1.1, Block Storage API v2, and Compute API v2.0. OS_AUTH_URL is
# only for the Identity API served through keystone.
unset OS_TENANT_ID
unset OS_TENANT_NAME
export OS_AUTH_URL=https://keystone.cloudferro.com:5000/v3
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3
export OS_USERNAME="owner"
export OS_REGION_NAME="WAW3-1"
export OS_PROJECT_ID=ab0c8e1710854b92b0be2b40b31a615a
export OS_PROJECT_NAME="main_project"
export OS_PROJECT_DOMAIN_ID="119f4676f307434eaf28daab5ba3cc92"
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi
if [ -z "$OS_USER_DOMAIN_NAME" ]; then unset OS_USER_DOMAIN_NAME; fi
if [ -z "$OS_PROJECT_DOMAIN_ID" ]; then unset OS_PROJECT_DOMAIN_ID; fi
echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: "
read -sr OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT
export OS_AUTH_TYPE=password
export OS_USER_DOMAIN_NAME="cloud_00373" # ****IF THIS LINE IS MISSING IN YOUR FILE PLEASE ADD IT!!!****

kopieren Sie die Datei main-openrc.sh in Ihr CLI-Verzeichnis (siehe: Openstack CLI).

Der „user_1“ sollte das gleiche Verfahren anwenden:

  1. sich bei ihrem/seinem „project_1“

  2. Herunterladen der „OpenStack RC-Datei“ für Benutzer „user_1“ und Projekt „project_1“

project_1-openrc.sh

#!/usr/bin/env bash
# To use an OpenStack cloud you need to authenticate against the Identity
# service named keystone, which returns a **Token** and **Service Catalog**.
# The catalog contains the endpoints for all services the user/tenant has
# access to - such as Compute, Image Service, Identity, Object Storage, Block
# Storage, and Networking (code-named nova, glance, keystone, swift,
# cinder, and neutron).
#
# *NOTE*: Using the 3 *Identity API* does not necessarily mean any other
# OpenStack API is version 3. For example, your cloud provider may implement
# Image API v1.1, Block Storage API v2, and Compute API v2.0. OS_AUTH_URL is
# only for the Identity API served through keystone.
unset OS_TENANT_ID
unset OS_TENANT_NAME
export OS_AUTH_URL=https://keystone.cloudferro.com:5000/v3
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3
export OS_USERNAME="user_1"
export OS_REGION_NAME="WAW3-1"
export OS_PROJECT_ID=4d488c376c0b4bc79a60b56bc72834e8
export OS_PROJECT_NAME="p_project_1"
export OS_PROJECT_DOMAIN_ID="119f4676f307434eaf28daab5ba3cc92"
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi
if [ -z "$OS_USER_DOMAIN_NAME" ]; then unset OS_USER_DOMAIN_NAME; fi
if [ -z "$OS_PROJECT_DOMAIN_ID" ]; then unset OS_PROJECT_DOMAIN_ID; fi
echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: "
read -sr OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT
export OS_AUTH_TYPE=password
export OS_USER_DOMAIN_NAME="cloud_00373" # ****IF THIS LINE IS MISSING IN YOUR FILE PLEASE ADD IT!!!****

Der „user_2“ sollte das gleiche Verfahren wie oben durchführen. Jeder Benutzer sollte sein Terminal öffnen und die openrc-Datei aufrufen:

Terminal des Benutzers „owner“

$ source main-openrc.sh
Please enter your OpenStack Password for project main as user owner:  <here enter the password for owner>

(owner) $ swift list
c-main-a
c-main-b
c-main-d

Terminal des Benutzers „user_1“

$ source project_1-openrc.sh
Please enter your OpenStack Password for project project_1 as user user_1:
 <here enter the password for user_1>

(user_1) $ swift list
c-project_1-a
c-project_1-b

Terminal der Benutzerin „user_2“

$ source project_2-openrc.sh
Please enter your OpenStack Password for project project_2 as user user_2: <here enter the password for user_2>

(user_2) $ swift list
c-project_2-a
c-project_2-b

“ owner “ bereitet die Testdateien vor und lädt sie hoch

(owner) $ touch test-main-a1.txt
(owner) $ touch test-main-a2.txt
(owner) $ swift upload c-main-a test-main-a1.txt
test-main-a1.txt
(owner) $ swift upload c-main-a test-main-a2.txt
test-main-a2.txt
../_images/owner_upload_0.png
(owner) $ touch test-main-b.txt
(owner) $ touch test-main-d.txt
(owner) $ swift upload c-main-b test-main-b.txt
test-main-b.txt
../_images/owner_upload_1.png
(owner) $ swift upload c-main-d test-main-d.txt
test-main-d.txt
../_images/owner_upload_1.png

Prüfen Sie die ID von user_1

(user_1) $ openstack user show --format json "${OS_USERNAME}" | jq -r .id
3de5f40b4e6d433792ac387896729ec8

Prüfen Sie die ID von user_2

(user_2) $ openstack user show --format json "${OS_USERNAME}" | jq -r .id
fb4ec0de674d4c5ba608ee75cc6da918

Sie können den Status des Containers überprüfen „c-main-a“

„Read ACL“ und „Write ACL“ sind nicht zugewiesen

(owner) $ swift stat c-main-a
                     Account: v1
                   Container: c-main-a
                     Objects: 2
                       Bytes: 29
                    Read ACL: *:3de5f40b4e6d433792ac387896729ec8
                   Write ACL: *:3de5f40b4e6d433792ac387896729ec8
                     Sync To:
                    Sync Key:
                 X-Timestamp: 1655199342.39064
X-Container-Bytes-Used-Actual: 8192
            X-Storage-Policy: default-placement
             X-Storage-Class: STANDARD
               Last-Modified: Tue, 14 Jun 2022 13:41:32 GMT
                  X-Trans-Id: tx000000000000003964e44-0062b17ebb-17404e6b-default
      X-Openstack-Request-Id: tx000000000000003964e44-0062b17ebb-17404e6b-default
               Accept-Ranges: bytes
                Content-Type: text/plain; charset=utf-8

Zugriff auf Container „c-main-a“ gewähren für user_1

(owner) $ swift post --read-acl "*:3de5f40b4e6d433792ac387896729ec8 " c-main-a

die Anmeldedaten für den Zugriff auf den Object Store in „main“

(owner) $ swift auth | awk -F = '/OS_STORAGE_URL/ {print $2}'
https://https://s3.fra1-1.cloudferro.com/swift/v1

den Link weitergeben:

https://https://s3.fra1-1.cloudferro.com/swift/v1

an „user_1“

„user_1“ sollte die Umgebungsvariable „SURL“ erstellen

(user_1) $ SURL=https://https://s3.fra1-1.cloudferro.com/swift/v1

Jetzt hat der Benutzer_1 Zugriff auf den Container „c-main-a“ im Projekt „main“.

(user_1) $ swift --os-storage-url="${SURL}" list c-main-a
test-main-a1.txt
test-main-a2.txt

aber der Benutzer_1 hat keinen Zugriff auf andere Container im “ main “ Projekt

(user_1) $ swift --os-storage-url="${SURL}" list c-main-b
Container GET failed: https://https://s3.fra1-1.cloudferro.com/swift/v1/c-main-b?format=json 403 Forbidden  [first 60
chars of response] b'{"Code":"AccessDenied","BucketName":"c-main-b","RequestId":"'
Failed Transaction ID: tx00000000000000397edda-0062b186ef-17379d9b-default

Ein ähnliches Verfahren kann verwendet werden, um „user_1“ die Berechtigung „schreiben“ zu erteilen.

(owner) $ swift post --write-acl "*:3de5f40b4e6d433792ac387896729ec8 " c-main-a