OpenStack S3 Swift: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 14 промежуточных версий этого же участника)
Строка 2: Строка 2:
 
[[Категория:S3]]
 
[[Категория:S3]]
 
[[Категория:swift]]
 
[[Категория:swift]]
  +
[[Категория: ceph]]
 
=Openstack S3 Swift=
 
=Openstack S3 Swift=
 
Задача
 
Задача
Строка 98: Строка 99:
   
 
===s3cfg-user-dqs.cfg===
 
===s3cfg-user-dqs.cfg===
  +
аналогично, за искючением секретов
  +
  +
==Создание bucket==
  +
<PRE>
  +
/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg mb s3://prod
  +
Bucket 's3://prod/' created
  +
</PRE>
  +
<PRE>
  +
/usr/local/bin/s3cmd -c s3cfg-user-dqs.cfg mb s3://dqs
  +
Bucket 's3://dqs/' created
  +
</PRE>
  +
==Проверка доступности==
  +
Каждый пользователь видит только свой бакет
  +
<PRE>
  +
/usr/local/bin/s3cmd -c s3cfg-user-dqs.cfg ls
  +
2025-03-21 13:02 s3://dqs
  +
</PRE>
  +
<PRE>
  +
/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg ls
  +
2025-03-21 12:46 s3://prod
  +
</PRE>
  +
  +
==Проверка кому принадлежит бакет==
  +
В примере имя бакета <code>tf-data</code> а принадлежит он <code>"owner": "tfuser"</code>
  +
<PRE>
  +
radosgw-admin bucket stats --bucket tf-data
  +
</PRE>
  +
<PRE>
  +
{
  +
"bucket": "tf-data",
  +
"num_shards": 11,
  +
"tenant": "",
  +
"zonegroup": "6824bc11-eca9-4431-ae8c-d2480e1bbd57",
  +
"placement_rule": "default-placement",
  +
"explicit_placement": {
  +
"data_pool": "",
  +
"data_extra_pool": "",
  +
"index_pool": ""
  +
},
  +
"id": "ca82dea1-f8c6-4f23-9afa-c82f08f1d8c1.31654776.1",
  +
"marker": "ca82dea1-f8c6-4f23-9afa-c82f08f1d8c1.31654776.1",
  +
"index_type": "Normal",
  +
"versioned": false,
  +
"versioning_enabled": false,
  +
"object_lock_enabled": false,
  +
"mfa_enabled": false,
  +
"owner": "tfuser",
  +
"ver": "0#1,1#1,2#1,3#1,4#1,5#1,6#1,7#1,8#1,9#1,10#1",
  +
"master_ver": "0#0,1#0,2#0,3#0,4#0,5#0,6#0,7#0,8#0,9#0,10#0",
  +
"mtime": "2025-05-12T11:43:13.540766Z",
  +
"creation_time": "2025-05-12T11:43:13.503812Z",
  +
"max_marker": "0#,1#,2#,3#,4#,5#,6#,7#,8#,9#,10#",
  +
"usage": {},
  +
"bucket_quota": {
  +
"enabled": false,
  +
"check_on_raw": false,
  +
"max_size": -1,
  +
"max_size_kb": 0,
  +
"max_objects": -1
  +
}
  +
}
  +
</PRE>
  +
  +
==Policy==
  +
===Создание политик===
  +
Политики похожи но отличаются в части Principal
  +
====bucket prod====
  +
<PRE>
  +
{
  +
"Version": "2012-10-17",
  +
"Id": "S3Policy1",
  +
"Statement": [
  +
{
  +
"Sid": "BucketAllow",
  +
"Effect": "Allow",
  +
"Principal": {
  +
"AWS": [
  +
"arn:aws:iam:::user/user-prod"
  +
]
  +
},
  +
"Action": [
  +
"s3:ListBucket",
  +
"s3:PutObject",
  +
"s3:GetObject",
  +
"s3:DeleteObject"
  +
],
  +
"Resource": [
  +
"arn:aws:s3:::prod",
  +
"arn:aws:s3:::prod/*"
  +
]
  +
}
  +
]
  +
}
  +
</PRE>
  +
  +
====bucket dqs====
  +
<PRE>
  +
{
  +
"Version": "2012-10-17",
  +
"Id": "S3Policy1",
  +
"Statement": [
  +
{
  +
"Sid": "BucketAllow",
  +
"Effect": "Allow",
  +
"Principal": {
  +
"AWS": [
  +
"arn:aws:iam:::user/user-prod",
  +
"arn:aws:iam:::user/user-dqs"
  +
]
  +
},
  +
"Action": [
  +
"s3:ListBucket",
  +
"s3:PutObject",
  +
"s3:GetObject",
  +
"s3:DeleteObject"
  +
],
  +
"Resource": [
  +
"arn:aws:s3:::dqs",
  +
"arn:aws:s3:::dqs/*"
  +
]
  +
}
  +
]
  +
}
  +
</PRE>
  +
===Применение политик===
  +
Из-под каждого пользователя применить политику
  +
<PRE>
  +
/usr/local/bin/s3cmd -c s3cfg-user-dqs.cfg setpolicy s3policy-dqs.json s3://dqs
  +
s3://dqs/: Policy updated
  +
</PRE>
  +
<PRE>
  +
/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg setpolicy s3policy-prod.json s3://prod
  +
s3://prod/: Policy updated
  +
</PRE>
  +
  +
Просмотреть можно командой
  +
<pre>
  +
/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg info s3://prod
  +
</PRE>
  +
  +
==Назначение квот==
  +
Назначить квоту в 10 гиг
  +
<PRE>
  +
radosgw-admin quota set --quota-scope=bucket --uid=user-dqs --max-size=10737418240B
  +
radosgw-admin quota set --quota-scope=bucket --uid=user-prod --max-size=10737418240B
  +
</PRE>
  +
  +
<PRE>
  +
radosgw-admin quota enable --quota-scope=bucket --uid=user-dqs
  +
radosgw-admin quota enable --quota-scope=bucket --uid=user-prod
  +
</PRE>
  +
  +
==Смена ключей==
  +
===добавить новый ключ===
  +
<PRE>
  +
radosgw-admin key create --uid=user-dqs --key-type=s3 --secret-key barSecret --access-key fooAccess
  +
</PRE>
  +
<PRE>
  +
{
  +
"user_id": "user-dqs",
  +
"display_name": "user-dqs",
  +
"email": "",
  +
"suspended": 0,
  +
"max_buckets": 1000,
  +
"subusers": [],
  +
"keys": [
  +
{
  +
"user": "user-dqs",
  +
"access_key": "S7P0CL6BSFQ3ZJNOQZJ0",
  +
"secret_key": "rDaBkRdkZNWgzUUXCeouKu4uabsSyb7XFPWzPOno"
  +
},
  +
{
  +
"user": "user-dqs",
  +
"access_key": "fooAccess",
  +
"secret_key": "barSecret"
  +
}
  +
],
  +
...
  +
</PRE>
  +
===Удалить старый ключ===
  +
<PRE>
  +
radosgw-admin key rm --uid=user-dqs --access-key S7P0CL6BSFQ3ZJNOQZJ0
  +
</PRE>
  +
<PRE>
  +
{
  +
"user_id": "user-dqs",
  +
"display_name": "user-dqs",
  +
"email": "",
  +
"suspended": 0,
  +
"max_buckets": 1000,
  +
"subusers": [],
  +
"keys": [
  +
{
  +
"user": "user-dqs",
  +
"access_key": "fooAccess",
  +
"secret_key": "barSecret"
  +
}
  +
],
  +
...
  +
</PRE>
  +
  +
==Просмотр существующих бакетов==
  +
Информация о бакете
  +
<PRE>
  +
radosgw-admin bucket stats --bucket tfe-data-ng
  +
</PRE>
  +
Просмотр метаданных (нужен например что бы посмотреть политики)
  +
<PRE>
  +
radosgw-admin metadata list
  +
</PRE>
  +
<PRE>
  +
[
  +
"bucket",
  +
"bucket.instance",
  +
"otp",
  +
"roles",
  +
"user"
  +
]
  +
</PRE>
  +
Метаданные по определнному бакету:
  +
<PRE>
  +
radosgw-admin metadata list bucket.instance | grep dqs
  +
"dqs:263ef9b2-40f6-47a0-9bc1-3e21be50c405.528921469.1",
  +
</PRE>
  +
Полные метаданные
  +
<PRE>
  +
radosgw-admin metadata get bucket.instance:dqs:XXXXXXXX-40f6-47a0-9bc1-3e21be50c405.528921469.1
  +
</PRE>
  +
Пример просмотра политики (назначенной через s3cmd)
  +
<PRE>
  +
radosgw-admin metadata get bucket.instance:dqs:XXXXXXXX-40f6-47a0-9bc1-3e21be50c405.528921469.1 | jq -r '.data.attrs[] | select(.key=="user.rgw.iam-policy") | .val' | base64 -d
  +
</PRE>
  +
<PRE>
  +
{
  +
"Version": "2012-10-17",
  +
"Id": "S3Policy1",
  +
"Statement": [
  +
{
  +
"Sid": "BucketAllow",
  +
"Effect": "Allow",
  +
"Principal": {
  +
"AWS": [
  +
"arn:aws:iam:::user/user-1",
  +
"arn:aws:iam:::user/user-2"
  +
]
  +
},
  +
"Action": [
  +
"s3:ListBucket",
  +
"s3:PutObject",
  +
"s3:GetObject",
  +
"s3:DeleteObject"
  +
],
  +
"Resource": [
  +
"arn:aws:s3:::dqs",
  +
"arn:aws:s3:::dqs/*"
  +
]
  +
}
  +
]
  +
}
  +
</PRE>
   
 
=<code>keystone</code>=
 
=<code>keystone</code>=
  +
решил не использовать так как
  +
* требует перенастройки - добавления параметра <code>rgw keystone implicit tenants: "swift"</code>
  +
* ограничение
  +
<PRE>
  +
Ceph integration does not allow providing permissions for OpenStack users directly. Therefore, you need to set permissions for the project that corresponds to the user.
  +
</PRE>
  +
  +
Можно почитать [https://docs.mirantis.com/mosk/latest/ops/ceph-operations/s3-bucket-policy/openstack-bucket-policy.html#ceph-object-storage-bucket-policy-examples на сайте Мирантиса]
   
 
=Ссылки=
 
=Ссылки=
https://docs.redhat.com/en/documentation/red_hat_openstack_platform/13/html/users_and_identity_management_guide/quota_management#set_object_storage_quotas_for_a_user
+
* https://docs.redhat.com/en/documentation/red_hat_openstack_platform/13/html/users_and_identity_management_guide/quota_management#set_object_storage_quotas_for_a_user
  +
* https://docs.mirantis.com/mosk/latest/ops/ceph-operations/s3-bucket-policy/openstack-bucket-policy.html#ceph-object-storage-bucket-policy-examples
  +
* https://docs.ceph.com/en/reef/radosgw/s3/bucketops/
  +
* https://docs.ceph.com/en/latest/radosgw/admin/
  +
* https://www.ibm.com/docs/en/storage-ceph/7?topic=management-add-remove-access-keys

Текущая версия на 15:05, 12 мая 2025

Openstack S3 Swift

Задача

  • создать 2 бакета
  • создать 2 пользователя
  • настроить права что бы первый пользователь мог работать с 2 бакетами а второй только с одним

Задачу можно решать 2 способами - с использованием пользователей keystone и с использованием пользователей rados

rados

Создать пользователей

radosgw-admin user create --uid user-prod --display-name user-prod
{
    "user_id": "user-prod",
    "display_name": "user-prod",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "user-prod",
            "access_key": "XXX",
            "secret_key": "YYYYYYYYY"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

Аналогично

radosgw-admin user create --uid user-dqs --display-name user-dqs

Получить из OpenStack endpoint

Получить название региона

openstack region list
+-----------------+---------------+-------------+
| Region          | Parent Region | Description |
+-----------------+---------------+-------------+
| staging-region  | None          |             |
+-----------------+---------------+-------------+

Получить endpoint с учетом региона

openstack \
  versions show \
  --service object-store \
  --status CURRENT \
  --interface public \
  --region staging-region \
  -c Endpoint -f value | sed 's/\/swift\/.*$//'
https://staging.domain.tld

Конфигурационные файлы для s3cmd

Для каждого пользователя свой конфигурационный файл соответвенно

s3cfg-user-prod.cfg

[default]
access_key = XXX
secret_key = YYYYYYYYY
host_base = https://staging.domain.tld
host_bucket =
  • access_key XXX id который вывдится при создании пользователя
  • secret_key YYYYYYYYY секрет который вывдится при создании пользователя
  • host_base https://staging.domain.tld - endpoint полученный из OpenStack

s3cfg-user-dqs.cfg

аналогично, за искючением секретов

Создание bucket

/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg mb s3://prod
Bucket 's3://prod/' created
/usr/local/bin/s3cmd -c s3cfg-user-dqs.cfg  mb s3://dqs
Bucket 's3://dqs/' created

Проверка доступности

Каждый пользователь видит только свой бакет

/usr/local/bin/s3cmd -c s3cfg-user-dqs.cfg  ls
2025-03-21 13:02  s3://dqs
/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg  ls
2025-03-21 12:46  s3://prod

Проверка кому принадлежит бакет

В примере имя бакета tf-data а принадлежит он "owner": "tfuser"

radosgw-admin bucket stats --bucket tf-data
{
    "bucket": "tf-data",
    "num_shards": 11,
    "tenant": "",
    "zonegroup": "6824bc11-eca9-4431-ae8c-d2480e1bbd57",
    "placement_rule": "default-placement",
    "explicit_placement": {
        "data_pool": "",
        "data_extra_pool": "",
        "index_pool": ""
    },
    "id": "ca82dea1-f8c6-4f23-9afa-c82f08f1d8c1.31654776.1",
    "marker": "ca82dea1-f8c6-4f23-9afa-c82f08f1d8c1.31654776.1",
    "index_type": "Normal",
    "versioned": false,
    "versioning_enabled": false,
    "object_lock_enabled": false,
    "mfa_enabled": false,
    "owner": "tfuser",
    "ver": "0#1,1#1,2#1,3#1,4#1,5#1,6#1,7#1,8#1,9#1,10#1",
    "master_ver": "0#0,1#0,2#0,3#0,4#0,5#0,6#0,7#0,8#0,9#0,10#0",
    "mtime": "2025-05-12T11:43:13.540766Z",
    "creation_time": "2025-05-12T11:43:13.503812Z",
    "max_marker": "0#,1#,2#,3#,4#,5#,6#,7#,8#,9#,10#",
    "usage": {},
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    }
}

Policy

Создание политик

Политики похожи но отличаются в части Principal

bucket prod

{
  "Version": "2012-10-17",
  "Id": "S3Policy1",
  "Statement": [
    {
     "Sid": "BucketAllow",
     "Effect": "Allow",
     "Principal": {
       "AWS": [
         "arn:aws:iam:::user/user-prod"
       ]
     },
     "Action": [
       "s3:ListBucket",
       "s3:PutObject",
       "s3:GetObject",
       "s3:DeleteObject"
     ],
     "Resource": [
       "arn:aws:s3:::prod",
       "arn:aws:s3:::prod/*"
     ]
    }
  ]
}

bucket dqs

{
  "Version": "2012-10-17",
  "Id": "S3Policy1",
  "Statement": [
    {
     "Sid": "BucketAllow",
     "Effect": "Allow",
     "Principal": {
       "AWS": [
         "arn:aws:iam:::user/user-prod",
         "arn:aws:iam:::user/user-dqs"
       ]
     },
     "Action": [
       "s3:ListBucket",
       "s3:PutObject",
       "s3:GetObject",
       "s3:DeleteObject"
     ],
     "Resource": [
       "arn:aws:s3:::dqs",
       "arn:aws:s3:::dqs/*"
     ]
    }
  ]
}

Применение политик

Из-под каждого пользователя применить политику

/usr/local/bin/s3cmd -c s3cfg-user-dqs.cfg  setpolicy s3policy-dqs.json  s3://dqs
s3://dqs/: Policy updated
/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg  setpolicy s3policy-prod.json  s3://prod
s3://prod/: Policy updated

Просмотреть можно командой

/usr/local/bin/s3cmd -c s3cfg-user-prod.cfg info s3://prod

Назначение квот

Назначить квоту в 10 гиг

radosgw-admin quota set --quota-scope=bucket --uid=user-dqs  --max-size=10737418240B
radosgw-admin quota set --quota-scope=bucket --uid=user-prod --max-size=10737418240B
radosgw-admin quota enable --quota-scope=bucket --uid=user-dqs
radosgw-admin quota enable --quota-scope=bucket --uid=user-prod

Смена ключей

добавить новый ключ

radosgw-admin key create --uid=user-dqs --key-type=s3 --secret-key barSecret  --access-key fooAccess
{
    "user_id": "user-dqs",
    "display_name": "user-dqs",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "user-dqs",
            "access_key": "S7P0CL6BSFQ3ZJNOQZJ0",
            "secret_key": "rDaBkRdkZNWgzUUXCeouKu4uabsSyb7XFPWzPOno"
        },
        {
            "user": "user-dqs",
            "access_key": "fooAccess",
            "secret_key": "barSecret"
        }
    ],
...

Удалить старый ключ

radosgw-admin key rm --uid=user-dqs --access-key S7P0CL6BSFQ3ZJNOQZJ0
{
    "user_id": "user-dqs",
    "display_name": "user-dqs",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "user-dqs",
            "access_key": "fooAccess",
            "secret_key": "barSecret"
        }
    ],
...

Просмотр существующих бакетов

Информация о бакете

radosgw-admin bucket stats --bucket tfe-data-ng

Просмотр метаданных (нужен например что бы посмотреть политики)

radosgw-admin metadata list
[
    "bucket",
    "bucket.instance",
    "otp",
    "roles",
    "user"
]

Метаданные по определнному бакету:

radosgw-admin metadata list bucket.instance | grep dqs
    "dqs:263ef9b2-40f6-47a0-9bc1-3e21be50c405.528921469.1",

Полные метаданные

radosgw-admin metadata get  bucket.instance:dqs:XXXXXXXX-40f6-47a0-9bc1-3e21be50c405.528921469.1

Пример просмотра политики (назначенной через s3cmd)

radosgw-admin metadata get  bucket.instance:dqs:XXXXXXXX-40f6-47a0-9bc1-3e21be50c405.528921469.1 | jq -r '.data.attrs[] | select(.key=="user.rgw.iam-policy") | .val' | base64 -d
{
  "Version": "2012-10-17",
  "Id": "S3Policy1",
  "Statement": [
    {
     "Sid": "BucketAllow",
     "Effect": "Allow",
     "Principal": {
       "AWS": [
         "arn:aws:iam:::user/user-1",
         "arn:aws:iam:::user/user-2"
       ]
     },
     "Action": [
       "s3:ListBucket",
       "s3:PutObject",
       "s3:GetObject",
       "s3:DeleteObject"
     ],
     "Resource": [
       "arn:aws:s3:::dqs",
       "arn:aws:s3:::dqs/*"
     ]
    }
  ]
}

keystone

решил не использовать так как

  • требует перенастройки - добавления параметра rgw keystone implicit tenants: "swift"
  • ограничение
Ceph integration does not allow providing permissions for OpenStack users directly. Therefore, you need to set permissions for the project that corresponds to the user.

Можно почитать на сайте Мирантиса

Ссылки