Použití bucket policy pro sdílení bucketů

Špatné nastavení Bucket Policy může vést k veřejnému sdílení. Doporučujeme provést kontrolní test nastavení, případně vaše záměry nejdříve konzultovat se správci úložiště.
Aby bylo možné provést nastavení pomocí nástroje aws je nutné nejdříve provést příslušnou instalaci a konfiguraci podle tohoto návodu.

Nastavení Bucket Policy uložené v souboru:

aws s3api put-bucket-policy --profile test_user --endpoint-url https://s3.cl2.du.cesnet.cz --bucket BUCKET-NAME --policy file://C:/Users/User/Downloads/example_policy_tenant-ro.json
V případě aplikace Bucket Policy na Linuxu je nutné definovat cestu k souboru s Bucket Policy následovně:
aws s3api put-bucket-policy --profile test_user --endpoint-url https://s3.cl2.du.cesnet.cz --bucket BUCKET-NAME --policy file:///home/user/Downloads/example_policy_tenant-ro.json

Vypsání Bucket Policy na daném bucketu:

aws s3api get-bucket-policy --profile test_user --endpoint-url https://s3.cl2.du.cesnet.cz --bucket BUCKET-NAME

Odebrání Bucket Policy na daném bucketu:

aws s3api delete-bucket-policy --profile test_user --endpoint-url https://s3.cl2.du.cesnet.cz --bucket BUCKET-NAME
Aby bylo možné provést nastavení pomocí nástroje s3cmd je nutné nejdříve provést příslušnou instalaci a konfiguraci podle tohoto návodu.

Nastavení Bucket Policy uložené v souboru:

s3cmd -c ~/.s3cfg_test_user setpolicy /home/user/bucket_policy.json s3://BUCKET-NAME

Vypsání Bucket Policy na daném bucketu

s3cmd -c ~/.s3cfg_test_user info s3://BUCKET-NAME

Odebrání Bucket Policy na daném bucketu:

s3cmd -c ~/.s3cfg_test_user delpolicy s3://BUCKET-NAME

Níže naleznete příklady 3 základních Bucket Policy. Jendá se o sdílení v rámci tentnatu pro read-only a read-write a nakonec pro veřejné sdílení (public).

Pro sdílení v rámci tenantu je důležité v json souboru Bucket Policy správně vyplnit název tenantu do hodnoty atributu "Principal": {"AWS": ["TENANT-NAME"]}. Název tenantu jste obdrželi společně s přístupovými údaji k vašemu S3 účtu, viz níže. Jedná se o hodnotu uvedenou u atributu "user" před znakem dolaru, v našem příkladě tedy: "354dasf3_db44_4dsa_a9b9_24ae65476".
"keys": [
          {
            "user": "354dasf3_db44_4dsa_a9b9_24ae65476$136aadsdas57d4asdrt5hzuuzc",
            "access_key": "hash_access_key_hash",
            "secret_key": "hash_secret_key_hash"
          }
        ]
Níže jsou uvedeny příklady jednotlivých Bucket Policy. NEZAPOMEŇTE v příslušných json souborech v poli "Resource" změnit název "BUCKET-NAME" na jmnéno vašeho bucketu, na kterém si přejete nastavit příslušnou Bucket Policy.
example_policy_tenant-ro.json
  {
    "Statement":[
      {
        "Sid":"* on bucket-tenant-ro policy",
        "Effect":"Allow",
        "Principal": {"AWS": ["TENANT_NAME"]},
        "Action": ["s3:ListBucket","s3:GetObject"],
        "Resource":[ "arn:aws:s3:::BUCKET-NAME", "arn:aws:s3:::BUCKET-NAME/*" ]
      }
    ]
  }
example_policy_tenant-rw.json
  {
    "Statement":[
      {
        "Sid":"* on bucket-tenant-rw policy",
        "Effect":"Allow",
        "Principal": {"AWS": ["TENANT_NAME"]},
        "Action": ["s3:ListBucket","s3:GetObject","s3:PutObject","s3:DeleteObject"],
        "Resource":[ "arn:aws:s3:::BUCKET-NAME", "arn:aws:s3:::BUCKET-NAME/*" ]
      }
    ]
  }
example_policy_user-rw.json
  {
    "Statement":[
      {
        "Sid":"RW for user on bucket policy",
        "Effect":"Allow",
        "Principal": {
          "AWS": [
            "arn:aws:iam::TENANT_NAME:user/BUCKET_OWNER",
            "arn:aws:iam::TENANT_NAME:user/RW_USER"
          ]
        },
        "Action": ["s3:ListBucket","s3:GetObject","s3:PutObject","s3:DeleteObject"],
        "Resource":[ "arn:aws:s3:::BUCKET-NAME", "arn:aws:s3:::BUCKET-NAME/*" ]
      }
    ]
  }

kde:
TENANT_NAME je třeba nahradit názvem tenantu;
BUCKET_OWNER je třeba nahradit jménem uživatele, který vlastní bucket, aby měl práva k objektům, které nahrají jiní oprávnění uživatelé;
RW_USER je třeba nahradit jménem uživatele (resp. servisní identity), pro kterého je sdílení konfigurováno;
BUCKET-NAME je třeba nahradit názvem bucketu.

example_policy_public.json
  {
    "Statement":[
      {
        "Sid":"* on bucket-tenant-public policy",
        "Effect":"Allow",
        "Principal": "*",
        "Action": ["s3:ListBucket","s3:GetObject"],
        "Resource":[ "arn:aws:s3:::BUCKET-NAME", "arn:aws:s3:::BUCKET-NAME/*" ]
      }
    ]
  }
Pokud nastavíte veřejné sdílení na vašem bucketu, tak můžete ověřit přístup pomocí webového prohlížeče tím, že půjdete na adresu bucketu. Potřebujete však opět zadat hodnotu uvedenou u atributu user před znakem dolaru v souboru s přístupovými klíči, v našem příkladě tedy: 354dasf3_db44_4dsa_a9b9_24ae65476 a nahradit string BUCKET-NAME jménem vašeho bucketu.
https://s3.cl2.du.cesnet.cz/354dasf3_db44_4dsa_a9b9_24ae65476:BUCKET-NAME/
example_policy_tenant-rw_ro.json
{
  "Id": "policy-240529-104335-5328",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "statement-240529-104335-2834",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::TENANT_NAME:user/BUCKET_OWNER",
          "arn:aws:iam::TENANT_NAME:user/RW_USER"
        ]
      },
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": [ "arn:aws:s3:::BUCKET-NAME", "arn:aws:s3:::BUCKET-NAME/*" ]
    },
    {
      "Sid": "statement-240529-105600-2834",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::TENANT_NAME:user/RO_USER"
        ]
      },
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": [ "arn:aws:s3:::BUCKET-NAME", "arn:aws:s3:::BUCKET-NAME/*" ]
    }
  ]
}

kde:
TENANT_NAME je třeba nahradit názvem tenantu;
BUCKET_OWNER je třeba nahradit jménem uživatele, který vlastní bucket, aby měl práva k objektům, které nahrají jiní oprávnění uživatelé;
RW_USER je třeba nahradit jménem uživatele (resp. servisní identity), pro kterého je konfigurováno sdílení read-write;
RO_USER je třeba nahradit jménem uživatele (resp. servisní identity), pro kterého je konfigurováno sdílení read-only;
BUCKET-NAME je třeba nahradit názvem bucketu.

Příklad generování výšeuvedené Bucket Policy aws pluginem s3bucket-policy:

aws s3bucket-policy --endpoint-url https://s3.cl2.du.cesnet.cz/ new-policy --dryrun --bucket BUCKET-NAME --newpol-type share-w-user --newpol-spec tenant=TENANT_NAME,user=RW_USER,action=rw tenant=TENANT_NAME,user=RO_USER,action=ro
Pokud potřebujete nastavit nějakou podrobnější Bucket Policy, například přístup pouze z určité IP adresy, sdílet pouze určitému uživateli, tak se neváhejte obrátit na správce úložiště. Připravíme pro vás příslušný json soubor s nastavením, které potřebujete.