Udostępnianie bucketów przy użyciu polityki s3 bucket w NSIS
Polityka dotycząca bucket S3
Ceph - Software Defined Storage używany w chmurze NSIS, zapewniający kompatybilność object storage z podzbiorem API Amazon S3. Bucket policy w Ceph jest częścią S3 API i pozwala na selektywne współdzielenie dostępu do object storage buckets pomiędzy użytkownikami różnych projektów, w tej samej chmurze.
Konwencje nazewnictwa stosowane w niniejszym dokumencie
- Bucket Owner
Dzierżawca OpenStack, który utworzył object storage backet w swoim projekcie, zamierzając udostępnić swój bucket lub podzbiór obiektów w bucket innemu dzierżawcy w tej samej chmurze.
- Bucket User
Dzierżawca OpenStack, który chce uzyskać dostęp do object storage bucket, należącego do Bucket Ownera.
- Projekt Bucket Ownera
Projekt, w którym tworzony jest shared (współdzielony) bucket.
- Projekt Bucket Usera
Projekt, który uzyskuje dostęp do object storage bucket, należącego do Bucket Ownera.
- Tenant Admin
Tenant administrator (użytkownik), który może tworzyć projekty OpenStack oraz zarządzać użytkownikami i rolami w swojej domenie.
W przykładach kodu, wartości wpisane wielkimi literami, takie jak BUCKET_OWNER_PROJECT_ID, są symbolami zastępczymi, które należy zastąpić rzeczywistymi wartościami pasującymi do danego przypadku użycia.
Ograniczenia
Możliwe jest przyznanie dostępu wyłącznie na poziomie projektu, a nie na poziomie użytkownika. Aby przyznać dostęp indywidualnemu użytkownikowi, Tenant Admin Bucket Usera powinien utworzyć osobny projekt w ramach swojej domeny, do którego dostęp zostanie przyznany wyłącznie wybranym użytkownikom.
Implementacja Ceph S3
obsługuje następujące akcje S3 poprzez ustawienie polityki bucket, ale
nie obsługuje zasad dotyczących użytkowników, ról ani grup.
KONFIGURACJA S3cmd
Aby udostępnić bucket przy użyciu polityki S3 Bucket należy najpierw skonfigurować s3cmd korzystając z tego poradnika Jak uzyskać dostęp do object storage z NSIS za pomocą s3cmd
Deklarowanie polityki S3 Bucket
Ważne
Kod w tym artykule będzie działał tylko wtedy, gdy wartość parametru Version to
"Version": "2012-10-17",
Sekcje pliku JSON, deklarującego tę politykę
Polityka S3 Bucket jest deklarowana za pomocą pliku JSON. Można go utworzyć za pomocą edytorów takich jak vim lub nano. Oto przykładowy szablon JSON polityki:
{
"Id": "POLICY_ID",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "STATEMENT_NAME",
"Action": [
"s3:ACTION_1",
"s3:ACTION_2"
],
"Effect": "EFFECT",
"Resource": "arn:aws:s3:::KEY_SPECIFICATION",
"Condition": {
"CONDITION_1": {
}
},
"Principal": {
"AWS": [
"arn:aws:iam::PROJECT_ID:root"
]
}
}
]
}
- POLICY_ID
Identyfikator polisy.
- STATEMENT_NAME
Nazwa oświadczenia.
- AKCJA
Akcje, do wykonywania których Bucket User ma dostęp.
- PROJECT_ID
Identyfikator projektu
Lista działań
s3:AbortMultipartUpload
s3:CreateBucket
s3:DeleteBucketPolicy
s3:DeleteBucket
s3:DeleteBucketWebsite
s3:DeleteObject
s3:DeleteObjectVersion
s3:GetBucketAcl
s3:GetBucketCORS
s3:GetBucketLocation
s3:GetBucketPolicy
s3:GetBucketRequestPayment
s3:GetBucketVersioning
s3:GetBucketWebsite
s3:GetLifecycleConfiguration
s3:GetObjectAcl
s3:GetObject
s3:GetObjectTorrent
s3:GetObjectVersionAcl
s3:GetObjectVersion
s3:GetObjectVersionTorrent
s3:ListAllMyBuckets
s3:ListBucketMultiPartUploads
s3:ListBucket
s3:ListBucketVersions
s3:ListMultipartUploadParts
s3:PutBucketAcl
s3:PutBucketCORS
s3:PutBucketPolicy
s3:PutBucketRequestPayment
s3:PutBucketVersioning
s3:PutBucketWebsite
s3:PutLifecycleConfiguration
s3:PutObjectAcl
s3:PutObject
s3:PutObjectVersionAcl
KEY_SPECIFICATION
Definiuje on bucket i jego klucze/obiekty. Na przykład:
"arn:aws:s3:::*" - the bucket and all of its objects
"arn:aws:s3:::MY_SHARED_BUCKET/*" - all objects of mybucket
"arn:aws:s3:::MY_SHARED_BUCKET/myfolder/*" - all objects which are subkeys to myfolder in mybucket
Warunki
Dodatkowe warunki filtrowania dostępu do bucketu. Na przykład można przyznać dostęp do określonego adresu IP przy użyciu:
"Condition": {
"IpAddress": {
"aws:SourceIp": "USER_IP_ADRESS/32"
}
}
lub, alternatywnie, można zezwolić na dostęp do określonego adresu IP przy użyciu:
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "PERMITTED_USER_IP_ADRESS/32"
}
}
USTALANIE ZASAD DOTYCZĄCYCH BUCKETU
Polityka może być ustawiona na bucket przy użyciu:
s3cmd setpolicy POLICY_JSON_FILE s3://MY_SHARED_BUCKET command.
Aby sprawdzić zasady dotyczące bucketu, użyj następującego polecenia:
s3cmd info s3://MY_SHARED_BUCKET
Polityka może zostać usunięta z bucketu przy użyciu:
s3cmd delpolicy s3://MY_SHARED_BUCKET
Przykładowe scenariusze
1 Przyznanie dostępu do odczytu/zapisu użytkownikowi Bucket User przy użyciu jego PROJECT_ID.
Bucket Owner chce przyznać Bucket Userowi dostęp do odczytu/zapisu, używając jego PROJECT_ID:
{
"Version": "2012-10-17",
"Id": "read-write",
"Statement": [
{
"Sid": "project-read-write",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::BUCKET_OWNER_PROJECT_ID:root",
"arn:aws:iam::BUCKET_USER_PROJECT_ID:root"
]
},
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
Załóżmy, że plik z tą polityką nosi nazwę „read-write-policy.json”. Aby ją zastosować, Bcuket Owner powinien wydać polecenie:
s3cmd setpolicy read-write-policy.json s3://MY_SHARED_BUCKET
Następnie, aby uzyskać dostęp do bucketu, na przykład wylistować bucket, Bucket User powinien wydać polecenie:
s3cmd ls s3://MY_SHARED_BUCKET
2 – Ograniczenie dostępu do odczytu/zapisu do bucketu dla użytkowników korzystających z określonego zakresu adresów IP
Bucket Owner chce przyznać dostęp do odczytu/zapisu Bucket Userom, którzy uzyskują dostęp do bucketu z określonych zakresów adresów IP.
(W tym przypadku ustawiamy AWS na „*”, co teoretycznie zapewni dostęp do każdego projektu w NSIS, jednak zamierzamy filtrować dostęp tylko do jednego adresu IP).
{
"Id": "Policy1654675551882",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1654675545682",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::MY_SHARED_BUCKET/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "IP_ADRESS/32"
}
},
"Principal": {
"AWS": [
"*"
]
}
}
]
}
Załóżmy, że plik z tą polityką nosi nazwę „read-write-policy-ip.json”. Aby ją zastosować, Bucket Owner powinien wydać polecenie:
s3cmd setpolicy read-write-policy-ip.json s3://MY_SHARED_BUCKET