This is an automated email from the ASF dual-hosted git repository.

ChenSammi pushed a commit to branch HDDS-13323-sts
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-13323-sts by this push:
     new a48cf12131f HDDS-14811. [STS] Part 3 - STS Ranger Smoke Tests (#9903)
a48cf12131f is described below

commit a48cf12131f972eb89afe0b14d3d51e2282177ec
Author: fmorg-git <[email protected]>
AuthorDate: Mon Aug 17 00:40:59 2026 -0700

    HDDS-14811. [STS] Part 3 - STS Ranger Smoke Tests (#9903)
---
 .../src/main/compose/ozonesecure-ha/test-ranger.sh |   1 +
 .../security/ozone-secure-sts-multitenant.robot    | 340 +++++++++++++++++++++
 2 files changed, 341 insertions(+)

diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh 
b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh
index 9ffefe58a11..24cc21778f2 100755
--- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh
+++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh
@@ -114,3 +114,4 @@ execute_robot_test s3g freon/validate.robot
 
 execute_robot_test s3g -v RANGER_ENDPOINT_URL:"http://ranger:6080"; -v 
USER:hdfs security/ozone-secure-tenant.robot
 execute_robot_test s3g -v RANGER_ENDPOINT_URL:"http://ranger:6080"; -v 
USER:hdfs security/ozone-secure-sts.robot
+execute_robot_test s3g -v RANGER_ENDPOINT_URL:"http://ranger:6080"; -v 
USER:hdfs security/ozone-secure-sts-multitenant.robot
diff --git 
a/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-sts-multitenant.robot
 
b/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-sts-multitenant.robot
new file mode 100644
index 00000000000..c7b367d74cf
--- /dev/null
+++ 
b/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-sts-multitenant.robot
@@ -0,0 +1,340 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+Suite Setup         Skip If    '${RANGER_ENDPOINT_URL}' == ''    No Ranger
+Documentation       Smoke test for S3 STS AssumeRole + Temp Creds 
(Multi-Tenant Scenario)
+Resource            ./ozone-secure-sts.resource
+Resource            ../admincli/lib.resource
+Test Timeout        10 minutes
+
+*** Variables ***
+${TENANT_ONE}                     sts-tenant-one
+${TENANT_TWO}                     sts-tenant-two
+${TENANT_THREE}                   sts-tenant-three
+${USER_A}                         svc-iceberg-userA
+${USER_B}                         svc-iceberg-userB
+${TENANT_ONE_ROLE}                sts-tenant-one-role
+${TENANT_TWO_ROLE}                sts-tenant-two-role
+${TENANT_THREE_ROLE}              sts-tenant-three-role
+${TENANT_ONE_ICEBERG_BUCKET}      iceberg-tenant-one-bucket
+${TENANT_TWO_ICEBERG_BUCKET}      iceberg-tenant-two-bucket
+${TENANT_THREE_ICEBERG_BUCKET}    iceberg-tenant-three-bucket
+${TENANT_TWO_ANOTHER_BUCKET}      tenant-two-another-bucket
+${TENANT_ONE_LINKED_BUCKET}       tenant-one-a-linked-bucket
+${ICEBERG_BUCKET_TESTFILE}        testfile23
+${ANOTHER_BUCKET_TESTFILE}        testfile00
+${OM_ADMIN_USER}                  hdfs
+
+*** Test Cases ***
+Create Users in Ranger
+    ${user_json} =                Set Variable                  { "loginId": 
"${USER_A}", "name": "${USER_A}", "password": "Password123", "firstName": "User 
A Iceberg REST", "lastName": "Catalog", "emailAddress": 
"${USER_A}@example.com", "userRoleList": ["ROLE_USER"], "userPermList": [ { 
"moduleId": 1, "isAllowed": 1 }, { "moduleId": 3, "isAllowed": 1 }, { 
"moduleId": 7, "isAllowed": 1 } ] }
+    Create Ranger User            ${user_json}
+    ${user_json} =                Set Variable                  { "loginId": 
"${USER_B}", "name": "${USER_B}", "password": "Password123", "firstName": "User 
B Iceberg REST", "lastName": "Catalog", "emailAddress": 
"${USER_B}@example.com", "userRoleList": ["ROLE_USER"], "userPermList": [ { 
"moduleId": 1, "isAllowed": 1 }, { "moduleId": 3, "isAllowed": 1 }, { 
"moduleId": 7, "isAllowed": 1 } ] }
+    Create Ranger User            ${user_json}
+
+Create Tenants
+    Kinit test user               ${OM_ADMIN_USER}              
${OM_ADMIN_USER}.keytab
+    ${output} =                   Execute                       ozone tenant 
--verbose create ${TENANT_ONE}
+    Should contain                ${output}                     "tenantId" : 
"${TENANT_ONE}"
+    ${output} =                   Execute                       ozone tenant 
--verbose create ${TENANT_TWO}
+    Should contain                ${output}                     "tenantId" : 
"${TENANT_TWO}"
+    ${output} =                   Execute                       ozone tenant 
--verbose create ${TENANT_THREE}
+    Should contain                ${output}                     "tenantId" : 
"${TENANT_THREE}"
+
+Assign Users to Tenants
+    ${accessKeyId}  ${secretKey} =  Assign User To Tenant And Get Credentials  
${USER_A}  ${TENANT_ONE}
+    Set Global Variable           ${USER_A_T1_PERM_ACCESS_KEY_ID}  
${accessKeyId}
+    Set Global Variable           ${USER_A_T1_PERM_SECRET_KEY}  ${secretKey}
+
+    ${accessKeyId}  ${secretKey} =  Assign User To Tenant And Get Credentials  
${USER_A}  ${TENANT_TWO}
+    Set Global Variable           ${USER_A_T2_PERM_ACCESS_KEY_ID}   
${accessKeyId}
+    Set Global Variable           ${USER_A_T2_PERM_SECRET_KEY}  ${secretKey}
+
+    ${accessKeyId}  ${secretKey} =  Assign User To Tenant And Get Credentials  
${USER_B}  ${TENANT_THREE}
+    Set Global Variable           ${USER_B_T3_PERM_ACCESS_KEY_ID}   
${accessKeyId}
+    Set Global Variable           ${USER_B_T3_PERM_SECRET_KEY}  ${secretKey}
+
+Create Roles in Ranger
+    ${role_json} =                Set Variable                  { "name": 
"${TENANT_ONE_ROLE}", "description": "Tenant One Role" }
+    Create Ranger Role            ${role_json}
+    ${role_json} =                Set Variable                  { "name": 
"${TENANT_TWO_ROLE}", "description": "Tenant Two Role" }
+    Create Ranger Role            ${role_json}
+    ${role_json} =                Set Variable                  { "name": 
"${TENANT_THREE_ROLE}", "description": "Tenant Three Role" }
+    Create Ranger Role            ${role_json}
+
+Create Assume Role Policies
+    Create Ranger Assume Role Policy  ${TENANT_ONE_ROLE}        ${USER_A}
+    Create Ranger Assume Role Policy  ${TENANT_TWO_ROLE}        ${USER_A}
+    Create Ranger Assume Role Policy  ${TENANT_THREE_ROLE}      ${USER_B}
+
+Update Tenant Volume Access policies
+    # This policy gives '${TENANT_ONE_ROLE}' role READ,LIST permission on 
volume ${TENANT_ONE}.
+    # It also gives '${USER_A}' user READ permission on volume ${TENANT_ONE}.
+    ${policy_item_json} =         Set Variable                  [ { 
"accesses": [ { "type": "read", "isAllowed": true }, { "type": "list", 
"isAllowed": true } ], "roles": [ "${TENANT_ONE_ROLE}" ], "delegateAdmin": 
false }, { "accesses": [ { "type": "read", "isAllowed": true } ], "users": [ 
"${USER_A}" ], "delegateAdmin": false } ]
+    Update Ranger Policy Items    ${TENANT_ONE}-VolumeAccess    
${policy_item_json}
+
+    # This policy gives '${TENANT_TWO_ROLE}' role READ,LIST permission on 
volume ${TENANT_TWO}.
+    # It also gives '${USER_A}' user READ permission on volume ${TENANT_TWO}.
+    # It also gives '${TENANT_ONE_ROLE}' role READ permission on volume 
${TENANT_TWO} so it can access ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}.
+    ${policy_item_json} =         Set Variable                  [ { 
"accesses": [ { "type": "read", "isAllowed": true }, { "type": "list", 
"isAllowed": true } ], "roles": [ "${TENANT_TWO_ROLE}" ], "delegateAdmin": 
false }, { "accesses": [ { "type": "read", "isAllowed": true } ], "users": [ 
"${USER_A}" ], "delegateAdmin": false }, { "accesses": [ { "type": "read", 
"isAllowed": true } ], "roles": [ "${TENANT_ONE_ROLE}" ], "delegateAdmin": 
false } ]
+    Update Ranger Policy Items    ${TENANT_TWO}-VolumeAccess    
${policy_item_json}
+
+    # This policy gives '${TENANT_THREE_ROLE}' role READ,LIST permission on 
volume ${TENANT_THREE}.
+    # It also gives '${USER_B}' user READ permission on volume ${TENANT_THREE}.
+    ${policy_item_json} =         Set Variable                  [ { 
"accesses": [ { "type": "read", "isAllowed": true }, { "type": "list", 
"isAllowed": true } ], "roles": [ "${TENANT_THREE_ROLE}" ], "delegateAdmin": 
false }, { "accesses": [ { "type": "read", "isAllowed": true } ], "users": [ 
"${USER_B}" ], "delegateAdmin": false } ]
+    Update Ranger Policy Items    ${TENANT_THREE}-VolumeAccess  
${policy_item_json}
+
+Create Bucket Access policies
+    # This policy gives '${TENANT_ONE_ROLE}' role ALL permission on buckets 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}
+    # and ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}.
+    # It also gives '${USER_A}' user READ, CREATE permissions on bucket 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_ONE} 
${TENANT_ONE_ICEBERG_BUCKET} and ${TENANT_ONE_LINKED_BUCKET} access", 
"policyType": 0, "policyPriority": 0, "isAuditEnabled": true, "resources": { 
"volume": { "values": [ "${TENANT_ONE}" ], "isExcludes": false, "isRecursive": 
false }, "bucket": { "values": [ "${TENANT_ONE_ICEBERG_BUCKET}", 
"${TENANT_ONE_LINKED_BUCKET}" ], "isExcludes": false, "isRecursive":  [...]
+    Create Ranger Policy          ${policy_json}
+
+    # This policy gives '${TENANT_TWO_ROLE}' role ALL permission on bucket 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}.
+    # It also gives '${USER_A}' user READ, CREATE permissions on bucket 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_TWO} 
${TENANT_TWO_ICEBERG_BUCKET} access", "policyType": 0, "policyPriority": 0, 
"isAuditEnabled": true, "resources": { "volume": { "values": [ "${TENANT_TWO}" 
], "isExcludes": false, "isRecursive": false }, "bucket": { "values": [ 
"${TENANT_TWO_ICEBERG_BUCKET}" ], "isExcludes": false, "isRecursive": false } 
}, "policyItems": [ { "accesses": [ { "type": "all", "i [...]
+    Create Ranger Policy          ${policy_json}
+
+    # This policy gives '${TENANT_THREE_ROLE}' role ALL permission on bucket 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}.
+    # It also gives '${USER_B}' user READ, CREATE permissions on bucket 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_THREE} 
${TENANT_THREE_ICEBERG_BUCKET} access", "policyType": 0, "policyPriority": 0, 
"isAuditEnabled": true, "resources": { "volume": { "values": [ 
"${TENANT_THREE}" ], "isExcludes": false, "isRecursive": false }, "bucket": { 
"values": [ "${TENANT_THREE_ICEBERG_BUCKET}" ], "isExcludes": false, 
"isRecursive": false } }, "policyItems": [ { "accesses": [ { "type": " [...]
+    Create Ranger Policy          ${policy_json}
+
+    # This policy gives '${TENANT_ONE_ROLE}' role ALL permission on bucket 
${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}.
+    # It also gives '${USER_A}' user READ, CREATE permissions on bucket 
${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_TWO} 
${TENANT_TWO_ANOTHER_BUCKET} access", "policyType": 0, "policyPriority": 0, 
"isAuditEnabled": true, "resources": { "volume": { "values": [ "${TENANT_TWO}" 
], "isExcludes": false, "isRecursive": false }, "bucket": { "values": [ 
"${TENANT_TWO_ANOTHER_BUCKET}" ], "isExcludes": false, "isRecursive": false } 
}, "policyItems": [ { "accesses": [ { "type": "all", "i [...]
+    Create Ranger Policy          ${policy_json}
+
+Create Iceberg Bucket and Another Bucket Table Access policies
+    # This policy gives '${TENANT_ONE_ROLE}' role ALL permission on keys 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}/*
+    # and keys ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}/*.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_ONE} 
${TENANT_ONE_ICEBERG_BUCKET} and ${TENANT_ONE_LINKED_BUCKET} table access", 
"policyType": 0, "policyPriority": 0, "isAuditEnabled": true, "resources": { 
"volume": { "values": [ "${TENANT_ONE}" ], "isExcludes": false, "isRecursive": 
false }, "bucket": { "values": [ "${TENANT_ONE_ICEBERG_BUCKET}", 
"${TENANT_ONE_LINKED_BUCKET}" ], "isExcludes": false, "isRecurs [...]
+    Create Ranger Policy          ${policy_json}
+
+    # This policy gives '${TENANT_TWO_ROLE}' role ALL permission on keys 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}/*.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_TWO} 
${TENANT_TWO_ICEBERG_BUCKET} table access", "policyType": 0, "policyPriority": 
0, "isAuditEnabled": true, "resources": { "volume": { "values": [ 
"${TENANT_TWO}" ], "isExcludes": false, "isRecursive": false }, "bucket": { 
"values": [ "${TENANT_TWO_ICEBERG_BUCKET}" ], "isExcludes": false, 
"isRecursive": false }, "key": { "values": [ "*" ], "isExcludes": false, [...]
+    Create Ranger Policy          ${policy_json}
+
+    # This policy gives '${TENANT_THREE_ROLE}' role ALL permission on keys 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}/*.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_THREE} 
${TENANT_THREE_ICEBERG_BUCKET} table access", "policyType": 0, 
"policyPriority": 0, "isAuditEnabled": true, "resources": { "volume": { 
"values": [ "${TENANT_THREE}" ], "isExcludes": false, "isRecursive": false }, 
"bucket": { "values": [ "${TENANT_THREE_ICEBERG_BUCKET}" ], "isExcludes": 
false, "isRecursive": false }, "key": { "values": [ "*" ], "isExcludes" [...]
+    Create Ranger Policy          ${policy_json}
+
+    # This policy gives '${TENANT_ONE_ROLE}' role ALL permission on keys 
${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}/*.
+    ${policy_json} =              Set Variable                  { "isEnabled": 
true, "service": "dev_ozone", "name": "${TENANT_TWO} 
${TENANT_TWO_ANOTHER_BUCKET} table access", "policyType": 0, "policyPriority": 
0, "isAuditEnabled": true, "resources": { "volume": { "values": [ 
"${TENANT_TWO}" ], "isExcludes": false, "isRecursive": false }, "bucket": { 
"values": [ "${TENANT_TWO_ANOTHER_BUCKET}" ], "isExcludes": false, 
"isRecursive": false }, "key": { "values": [ "*" ], "isExcludes": false, [...]
+    Create Ranger Policy          ${policy_json}
+
+    # Update Ranger policy cache
+    Kinit test user               ${OM_ADMIN_USER}              
${OM_ADMIN_USER}.keytab
+    ${om_param} =                 Get OM Service Param
+    ${output} =                   Execute                       ozone admin om 
updateranger ${om_param}
+    Should contain                ${output}                     Operation 
completed successfully
+
+Get S3 Credentials for Principals, Create Buckets, and Upload Files to Buckets
+    Kinit test user               ${USER_A}                     
${USER_A}.keytab
+
+    # Kinit OM_ADMIN_USER that has access to all volumes/buckets per Ranger 
default policies
+    Kinit test user               ${OM_ADMIN_USER}              
${OM_ADMIN_USER}.keytab
+
+    # Tenant 1 data
+    Execute                       ozone sh bucket create 
/${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}
+    Create File                   ${TEMP_DIR}/${ICEBERG_BUCKET_TESTFILE}
+    Execute                       ozone sh key put 
/${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}/${ICEBERG_BUCKET_TESTFILE} 
${TEMP_DIR}/${ICEBERG_BUCKET_TESTFILE}
+
+    # Tenant 2 data and linked bucket
+    Execute                       ozone sh bucket create 
/${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}
+    Execute                       ozone sh key put 
/${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}/${ICEBERG_BUCKET_TESTFILE} 
${TEMP_DIR}/${ICEBERG_BUCKET_TESTFILE}
+    Execute                       ozone sh bucket create 
/${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}
+    Create File                   ${TEMP_DIR}/${ANOTHER_BUCKET_TESTFILE}
+    Execute                       ozone sh key put 
/${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}/${ANOTHER_BUCKET_TESTFILE} 
${TEMP_DIR}/${ANOTHER_BUCKET_TESTFILE}
+    # Link ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET} to 
${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}
+    Execute                       ozone sh bucket link 
/${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET} 
/${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}
+    Execute                       ozone sh key put 
/${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}/${ANOTHER_BUCKET_TESTFILE} 
${TEMP_DIR}/${ANOTHER_BUCKET_TESTFILE}
+
+    # Tenant 3 data
+    Execute                       ozone sh bucket create 
/${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}
+    Execute                       ozone sh key put 
/${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}/${ICEBERG_BUCKET_TESTFILE} 
${TEMP_DIR}/${ICEBERG_BUCKET_TESTFILE}
+
+Create Role-Scoped Tokens for All Three Tenants
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_ONE_ROLE}
+    # Waiting for Ranger policy cache refresh - ${USER_A} needs to be able to 
assume role
+    Wait Until Keyword Succeeds   60s   5s                      Assume Role 
And Get Temporary Credentials                   
perm_access_key_id=${USER_A_T1_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_A_T1_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Set Global Variable           ${USER_A_T1_STS_ACCESS_KEY_ID}  
${STS_ACCESS_KEY_ID}
+    Set Global Variable           ${USER_A_T1_STS_SECRET_KEY}   
${STS_SECRET_KEY}
+    Set Global Variable           ${USER_A_T1_STS_SESSION_TOKEN}  
${STS_SESSION_TOKEN}
+
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_TWO_ROLE}
+    Assume Role And Get Temporary Credentials                   
perm_access_key_id=${USER_A_T2_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_A_T2_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Set Global Variable           ${USER_A_T2_STS_ACCESS_KEY_ID}  
${STS_ACCESS_KEY_ID}
+    Set Global Variable           ${USER_A_T2_STS_SECRET_KEY}   
${STS_SECRET_KEY}
+    Set Global Variable           ${USER_A_T2_STS_SESSION_TOKEN}  
${STS_SESSION_TOKEN}
+
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_THREE_ROLE}
+    Assume Role And Get Temporary Credentials                   
perm_access_key_id=${USER_B_T3_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_B_T3_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Set Global Variable           ${USER_B_T3_STS_ACCESS_KEY_ID}  
${STS_ACCESS_KEY_ID}
+    Set Global Variable           ${USER_B_T3_STS_SECRET_KEY}   
${STS_SECRET_KEY}
+    Set Global Variable           ${USER_B_T3_STS_SESSION_TOKEN}  
${STS_SESSION_TOKEN}
+
+Verify Role-Scoped Token Accesses
+    Configure STS Profile         ${USER_A_T1_STS_ACCESS_KEY_ID}  
${USER_A_T1_STS_SECRET_KEY}  ${USER_A_T1_STS_SESSION_TOKEN}
+
+    # This token should be able to read from 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET} but not 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}
+    # nor ${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}.  Also verify that it 
can write to ${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}.
+    Get Object Should Succeed     ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+    Get Object Should Fail        ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Succeed     ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+
+    # This token should be able to read from/write to 
${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET} which is linked to
+    # ${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}.  It should NOT be able to 
read from/write to ${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}
+    # even though the ${TENANT_ONE_ROLE} has access because the permanent 
credential only has access to ${TENANT_ONE} volume.
+    Get Object Should Succeed     ${TENANT_ONE_LINKED_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}
+    Put Object Should Succeed     ${TENANT_ONE_LINKED_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}
+    Get Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+
+    Configure STS Profile         ${USER_A_T2_STS_ACCESS_KEY_ID}  
${USER_A_T2_STS_SECRET_KEY}  ${USER_A_T2_STS_SESSION_TOKEN}
+
+    # This token should be able to read from 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET} but not 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}
+    # nor ${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET} nor 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}
+    # nor ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}.
+    # Also verify that it can write to 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}.
+    Get Object Should Succeed     ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+    Get Object Should Fail        ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  AccessDenied
+    Get Object Should Fail        ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_ONE_LINKED_BUCKET}   
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Succeed     ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+
+    Configure STS Profile         ${USER_B_T3_STS_ACCESS_KEY_ID}  
${USER_B_T3_STS_SECRET_KEY}  ${USER_B_T3_STS_SESSION_TOKEN}
+
+    # This token should be able to read from 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET} but not 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}
+    # nor ${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET} nor 
${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}
+    # nor ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}.
+    # Also verify that it can write to 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}.
+    Get Object Should Succeed     ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+    Get Object Should Fail        ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_ONE_LINKED_BUCKET}   
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Succeed     ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+
+Create Limited-Scoped Tokens for All Three Tenants
+    # Limit scope to read-only for keys in ${TENANT_ONE_ICEBERG_BUCKET} (note 
${TENANT_ONE_LINKED_BUCKET} is excluded)
+    ${session_policy} =           Set Variable                  
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":
 "arn:aws:s3:::${TENANT_ONE_ICEBERG_BUCKET}/*" }]}
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_ONE_ROLE}
+    Assume Role And Get Temporary Credentials                   
policy_json=${session_policy}  
perm_access_key_id=${USER_A_T1_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_A_T1_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Set Global Variable           ${USER_A_T1_STS_ACCESS_KEY_ID}  
${STS_ACCESS_KEY_ID}
+    Set Global Variable           ${USER_A_T1_STS_SECRET_KEY}   
${STS_SECRET_KEY}
+    Set Global Variable           ${USER_A_T1_STS_SESSION_TOKEN}  
${STS_SESSION_TOKEN}
+
+    # Limit scope to read-only for keys in ${TENANT_TWO_ICEBERG_BUCKET}
+    ${session_policy} =           Set Variable                  
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::${TENANT_TWO_ICEBERG_BUCKET}/*"}]}
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_TWO_ROLE}
+    Assume Role And Get Temporary Credentials                   
policy_json=${session_policy}  
perm_access_key_id=${USER_A_T2_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_A_T2_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Set Global Variable           ${USER_A_T2_STS_ACCESS_KEY_ID}  
${STS_ACCESS_KEY_ID}
+    Set Global Variable           ${USER_A_T2_STS_SECRET_KEY}   
${STS_SECRET_KEY}
+    Set Global Variable           ${USER_A_T2_STS_SESSION_TOKEN}  
${STS_SESSION_TOKEN}
+
+    # Limit scope to read-only for ${TENANT_THREE_ICEBERG_BUCKET} keys
+    ${session_policy} =           Set Variable                  
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::${TENANT_THREE_ICEBERG_BUCKET}/*"}]}
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_THREE_ROLE}
+    Assume Role And Get Temporary Credentials                   
policy_json=${session_policy}  
perm_access_key_id=${USER_B_T3_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_B_T3_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Set Global Variable           ${USER_B_T3_STS_ACCESS_KEY_ID}  
${STS_ACCESS_KEY_ID}
+    Set Global Variable           ${USER_B_T3_STS_SECRET_KEY}   
${STS_SECRET_KEY}
+    Set Global Variable           ${USER_B_T3_STS_SESSION_TOKEN}  
${STS_SESSION_TOKEN}
+
+Verify Limited-Scoped Token Accesses
+    Configure STS Profile         ${USER_A_T1_STS_ACCESS_KEY_ID}  
${USER_A_T1_STS_SECRET_KEY}  ${USER_A_T1_STS_SESSION_TOKEN}
+
+    # This token should be able to read from 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET} but not 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}
+    # nor ${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}.  Also verify that it 
CANNOT write to ${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}.
+    Get Object Should Succeed     ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+    Get Object Should Fail        ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Fail        ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  AccessDenied
+
+    # This token should NOT be able to read from/write to 
${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET} (because of the session policy) which 
is linked to
+    # ${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}.  It should not be able to 
read from/write to ${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}
+    # even though the ${TENANT_ONE_ROLE} has access because the permanent 
credential only has access to ${TENANT_ONE}.
+    Get Object Should Fail        ${TENANT_ONE_LINKED_BUCKET}   
${ANOTHER_BUCKET_TESTFILE}  AccessDenied
+    Put Object Should Fail        ${TENANT_ONE_LINKED_BUCKET}   
${ANOTHER_BUCKET_TESTFILE}  AccessDenied
+    Get Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  AccessDenied
+
+    Configure STS Profile         ${USER_A_T2_STS_ACCESS_KEY_ID}  
${USER_A_T2_STS_SECRET_KEY}  ${USER_A_T2_STS_SESSION_TOKEN}
+
+    # This token should be able to read from 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET} but not 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}
+    # nor ${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET} nor 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}
+    # nor ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}.
+    # Also verify that it CANNOT write to 
${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET}.
+    Get Object Should Succeed     ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+    Get Object Should Fail        ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  AccessDenied
+    Get Object Should Fail        ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_ONE_LINKED_BUCKET}   
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Fail        ${TENANT_TWO_ICEBERG_BUCKET}   
${ICEBERG_BUCKET_TESTFILE}  AccessDenied
+
+    Configure STS Profile         ${USER_B_T3_STS_ACCESS_KEY_ID}  
${USER_B_T3_STS_SECRET_KEY}  ${USER_B_T3_STS_SESSION_TOKEN}
+
+    # This token should be able to read from 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET} but not 
${TENANT_ONE}/${TENANT_ONE_ICEBERG_BUCKET}
+    # nor ${TENANT_TWO}/${TENANT_TWO_ICEBERG_BUCKET} nor 
${TENANT_TWO}/${TENANT_TWO_ANOTHER_BUCKET}
+    # nor ${TENANT_ONE}/${TENANT_ONE_LINKED_BUCKET}.
+    # Also verify that it CANNOT write to 
${TENANT_THREE}/${TENANT_THREE_ICEBERG_BUCKET}.
+    Get Object Should Succeed     ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+    Get Object Should Fail        ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_TWO_ANOTHER_BUCKET}  
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Get Object Should Fail        ${TENANT_ONE_LINKED_BUCKET}   
${ANOTHER_BUCKET_TESTFILE}  NoSuchBucket
+    Put Object Should Fail        ${TENANT_THREE_ICEBERG_BUCKET}   
${ICEBERG_BUCKET_TESTFILE}  AccessDenied
+
+Tenant One Role Session Policy Must Not Access Tenant Three Bucket
+    ${session_policy} =           Set Variable                  
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::${TENANT_THREE_ICEBERG_BUCKET}/*"}]}
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_ONE_ROLE}
+    Assume Role And Get Temporary Credentials                   
policy_json=${session_policy}  
perm_access_key_id=${USER_A_T1_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_A_T1_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Configure STS Profile         ${STS_ACCESS_KEY_ID}  ${STS_SECRET_KEY}  
${STS_SESSION_TOKEN}
+    Get Object Should Fail        ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  NoSuchBucket
+
+Tenant One User Must Not Assume Tenant Three Role
+    Assume Role Should Fail       
perm_access_key_id=${USER_A_T1_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_A_T1_PERM_SECRET_KEY}  expected_error=AccessDenied  
role_arn=arn:aws:iam::123456789012:role/${TENANT_THREE_ROLE}
+
+Multitenant Revocation Scenarios
+    # Create another session token for ${USER_A} in ${TENANT_ONE}, verify it 
works, then revoke that permanent secret and verify the token no longer works.
+    # Also verify the token for ${USER_A} in ${TENANT_TWO} still works
+    Set Global Variable           ${ROLE_ARN}                   
arn:aws:iam::123456789012:role/${TENANT_ONE_ROLE}
+    Assume Role And Get Temporary Credentials                   
perm_access_key_id=${USER_A_T1_PERM_ACCESS_KEY_ID}  
perm_secret_key=${USER_A_T1_PERM_SECRET_KEY}  role_arn=${ROLE_ARN}
+    Set Global Variable           ${USER_A_T1_STS_ACCESS_KEY_ID}  
${STS_ACCESS_KEY_ID}
+    Set Global Variable           ${USER_A_T1_STS_SECRET_KEY}   
${STS_SECRET_KEY}
+    Set Global Variable           ${USER_A_T1_STS_SESSION_TOKEN}  
${STS_SESSION_TOKEN}
+    Configure STS Profile         ${USER_A_T1_STS_ACCESS_KEY_ID}  
${USER_A_T1_STS_SECRET_KEY}  ${USER_A_T1_STS_SESSION_TOKEN}
+    Get Object Should Succeed     ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+
+    Kinit test user               ${OM_ADMIN_USER}              
${OM_ADMIN_USER}.keytab
+    ${output} =                   Execute                       ozone tenant 
--verbose user revoke '${TENANT_ONE}$${USER_A}'
+    Should contain                ${output}                     Revoked 
accessId '${TENANT_ONE}$${USER_A}'.
+    Get Object Should Fail        ${TENANT_ONE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}  AccessDenied
+
+    Configure STS Profile         ${USER_A_T2_STS_ACCESS_KEY_ID}  
${USER_A_T2_STS_SECRET_KEY}  ${USER_A_T2_STS_SESSION_TOKEN}
+    Get Object Should Succeed     ${TENANT_TWO_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+
+    # Revoking the secret for ${USER_B} should NOT affect the session token, 
as it is based on ${TENANT_THREE}$${USER_B} combination.
+    Kinit test user               ${USER_B}                     
${USER_B}.keytab
+    Execute                       ozone s3 getsecret -u ${TEST_USER} 
${OM_HA_PARAM}
+    Execute                       ozone s3 revokesecret -y -u ${TEST_USER} 
${OM_HA_PARAM}
+    Configure STS Profile         ${USER_B_T3_STS_ACCESS_KEY_ID}  
${USER_B_T3_STS_SECRET_KEY}  ${USER_B_T3_STS_SESSION_TOKEN}
+    Get Object Should Succeed     ${TENANT_THREE_ICEBERG_BUCKET}  
${ICEBERG_BUCKET_TESTFILE}
+
+


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to