Asignación de acceso a objetos dentro de un grupo utilizando condiciones de acceso de IAM

Las políticas de acceso de IAM permiten conceder permisos en un depósito de Cloud Object Storage a grupos específicos de objetos. Este enfoque permite un control de acceso preciso sobre el acceso a los datos, por lo que resulta útil en escenarios en los que diferentes partes de un grupo deben ser accedidas por distintos usuarios o aplicaciones.

Si se necesita acceso a todo el grupo (es decir, cuando no es necesario un control de acceso preciso), siga la información de Asignación de acceso a un grupo individual.

Cada objeto almacenado en un grupo de Cloud Object Storage tiene una clave exclusiva, y estas claves a menudo siguen una estructura jerárquica similar a un sistema de archivos.

Enlaces relacionados con las políticas de acceso IAM

Ejemplo

  • Un objeto individual con la clave "folder1/subfolder1/file.txt" puede simular una jerarquía de carpetas o directorios, donde el directorio “folder1” contiene un subdirectorio denominado “sub-folder1” que contiene un archivo "file.txt". El acceso se puede asignar a cualquier nivel de carpeta.
  • Se puede crear una política de acceso para todos los objetos y-en la carpeta denominada “folder1”, o se puede asignar acceso para sólo objetos en el subdirectorio denominado “subfolder1”.

Un administrador de políticas puede asignar acceso a objetos y carpetas individuales configurando condiciones al crear políticas de acceso de IAM. En la siguiente sección se describe cómo construir estos tipos de políticas.

Construcción de una política de control de acceso precisa

El primer paso para otorgar acceso a objetos individuales dentro de un grupo es construir una política de IAM. Puede encontrar más información sobre cómo construir una política de acceso de IAM para Object Storage en la guía de aprendizaje de Cloud Object Storage Limitación del acceso a un único grupo de Object Storage. Para obtener información más general sobre la creación de políticas de IAM, vaya a Cómo funciona IBM Cloud IAM. Los siguientes elementos son componentes clave para crear una política de acceso IAM para sus recursos de Object Storage.

Asunto

El asunto de una política de acceso puede ser un usuario individual, un grupo de acceso, un ID de servicio o un perfil de confianza. Consulte ¿Qué son las políticas de IAM y quién puede asignarlas? para obtener más información sobre los tipos de asuntos que puede aplicar a una política.

Servicio

El servicio es el servicio de IBM Cloud que contiene el recurso al que está intentando asignar acceso. Para asignar acceso a objetos individuales, utilice el servicio Cloud Object Storage.

Recurso

IBM Cloud® Object Storage da soporte a los siguientes destinos de recursos:

  • ID del grupo de recursos
  • Instancia de servicio
  • Tipo de recurso con el valor de "bucket"
  • ID de recurso (nombre de grupo)

Rol

Los roles de acceso de IBM Cloud son grupos de acciones. Las funciones de acceso permiten al sujeto completar tareas específicas dentro del contexto de los recursos de destino que se definen en la política. Cloud Object Storage da soporte a varios roles de servicio predefinidos que facilitan la asignación de permisos. Cloud Object Storage también permite la creación de roles personalizados. Para obtener más información sobre los roles soportados para Cloud Object Storage, consulte Roles deIdentity and Access Management.

Para obtener la lista de roles de Cloud Object Storage y su interacción con las condiciones, vaya a esta tabla.

Condición

Cuando se identifica un recurso, se puede utilizar una condición para ampliar el acceso de un sujeto a objetos individuales de un grupo, al que se hace referencia como control de acceso preciso.

Una única política de IAM puede tener más de una condición utilizando una sentencia OR o AND para combinar las condiciones. La sentencia de condición (que contiene una o más condiciones) debe evaluarse en TRUE para que se permita a la solicitud de usuario realizar la acción. La política de IAM denegará cualquier acción que no se pueda evaluar TRUE. La sentencia de política debe contener todos los atributos de condición necesarios para el rol. Si la sentencia de política no contiene todos los atributos de condición necesarios para el rol, se denegarán las acciones sujetas a los atributos de condición omitidos.

Utilice una política sin atributos de condición para proporcionar acceso completo, tal como lo define el rol, al recurso de destino.

Utilice la política IAM « v2 » (Condiciones basadas en atributos) para crear una política IAM con condiciones basadas en atributos.

Utilización de condiciones en una política de IAM

Cloud Object Storage da soporte a los atributos siguientes para especificar condiciones para asignar acceso preciso en recursos de Cloud Object Storage:

Prefijo y delimitador

El prefijo y el delimitador se utilizan conjuntamente para limitar todos los permisos de listado a objetos específicos de un depósito.

  • El atributo de condición Prefijo define el prefijo para el conjunto de claves de objeto que esta condición debe permitir para listar objetos o carpetas. Por ejemplo, en el objeto denominado "folder1/subfolder1/file.txt", tanto "folder1/" como “folder1/subfolder1/” son posibles prefijos.

  • Un Delimitador ayuda al usuario a navegar por el grupo como si fuera una jerarquía de archivos. La asignación de una sentencia de condición de delimitador restringe el tipo de estructura de carpetas que el usuario puede generar en el listado. En un objeto denominado "folder1/subfolder1/file.txt", el delimitador "/" se puede utilizar para simular una jerarquía de carpetas donde cada carpeta está separada por un "/". Si una sentencia de condición sólo permite un delimitador de "/", no se permite una solicitud de lista con cualquier otro valor de delimitador.

Normalmente, el prefijo y el delimitador se utilizan juntos en una instrucción condicional con un AND operador. Se puede utilizar un prefijo sin un delimitador en una sentencia de condición. Si la política se configura solo con un prefijo y no con una sentencia de condición de delimitador, el usuario puede utilizar cualquier delimitador o ningún delimitador para listar los objetos.

Ejemplos de utilización de sentencias de condición Prefix y Delimiter

Considere el objeto denominado "folder1/subfolder1/file.txt":

Prefijo de "folder1/" AND sin delimitador

  • Puede devolver una lista de cada objeto que empieza por folder1/ realizando una solicitud de lista en folder1/ y no proporcionando un delimitador.
  • Si utiliza un delimitador de "/" en la solicitud de lista, se limitaría a ver sólo el primer nivel de objetos y subcarpetas en folder1/.
  • Si el usuario intenta listar la subcarpeta (solicita listar el prefijo = “folder1/subfolder1/”), se deniega el acceso.

Prefijo de "folder1/" AND Delimitador de "/"

  • Sólo puede listar los objetos y subcarpetas en el primer nivel de folder1.
  • Sólo puede realizar solicitudes de lista que especifiquen un delimitador de "/".
  • Si intenta listar el contenido de subfolder1, se deniega el acceso (el usuario tendría que tener una condición de permitir prefijo = “folder1/subfolder1/" para permitir listar el contenido de subfolder1).

Las API siguientes están sujetas a las condiciones Prefijo/Delimitador:

Para ver la lista completa de acciones y los atributos de condición compatibles, consulte Acciones de Identity and Access Management.

Para proporcionar a un usuario preciso acceso para navegar a su carpeta en la interfaz de usuario, el usuario necesita acceso para listar la carpeta raíz del grupo. Consulte Escenario 4 para ver cómo construir la política para habilitarlo.

Vía de acceso

La vía de acceso se utiliza para definir el ámbito de todos los accesos de lectura, escritura o gestión en objetos específicos.

Para un objeto denominado "folder1/subfolder1/file.txt", la clave de objeto completa es la vía de acceso. Para restringir las acciones de lectura, escritura o gestión a este objeto, defina una condición con la vía de acceso "folder1/subfolder1/file.txt".

Todas las API de Cloud Object Storage que actúan directamente sobre un objeto están sujetas a condiciones de vía de acceso. Consulte Acciones deIdentity and Access Management para obtener la lista de acciones de la API de Cloud Object Storage que dan soporte a la vía de acceso.

Se recomienda definir una condición Prefix/Delimiter y una condición Path al otorgar acciones de lectura, escritura o lista a un usuario en la misma política. Manager, Writer, Reader y Content Reader son ejemplos de roles en los que se recomienda definir una condición Prefix/Delimiter y Path. Consulte Escenario 4 para ver cómo construir la política para habilitarlo. Una condición que especifique Prefijo/Delimitador y una condición que especifique Vía de acceso debe estar ORed lógicamente en la sentencia de política de IAM para permitir ambos tipos de operaciones (lectura, grabación o gestión de objetos o objetos de lista).

Operadores utilizados con atributos de condición

Hay varios operadores que se pueden utilizar al definir atributos de condición. La lista completa de operadores que se pueden utilizar para los atributos de condición de prefijo, delimitador y vía de acceso se puede encontrar en Condiciones basadas en atributos de recurso.

Uso de comodines

Los valores de un atributo de condición pueden incluir un comodín cuando el operador es stringMatch o stringMatchAnyOf.

Ejemplos de uso de comodines en sentencias de condición:

Considere el objeto denominado "folder1/subfolder1/file.txt":

Vía de acceso de “folder1/*”

  • Obtendrá acceso de lectura, escritura o gestión, tal como lo define el rol, a todos los objetos que empiecen por “folder1/”.

Prefijo de "folder1/*" AND sin delimitador

  • Para una solicitud de lista de objetos con el prefijo establecido en “folder1/” y sin delimitador, la solicitud de usuario devuelve todos los objetos que empiezan por “folder1/”.
  • Para una solicitud de lista de objetos con el prefijo establecido en “folder1/” y delimitador de "/", la solicitud devuelve una vista de los objetos y carpetas justo en el primer nivel de folder1.
  • Para una solicitud de lista de objetos con el prefijo establecido en “folder1/subfolder1/” y delimitador de "/", la solicitud devuelve una vista de los objetos y carpetas justo en el primer nivel de folder1/subfolder1.

Prefijo de "folder1/*" AND Delimitador de "/"

  • Para una solicitud de lista de objetos con el prefijo establecido en “folder1/” y delimitador de "/", la solicitud devuelve una vista de los objetos y carpetas justo en el primer nivel de folder1.
  • Para una solicitud de lista de objetos con el prefijo establecido en “folder1/subfolder1/” y el delimitador de "/", la solicitud devuelve los objetos (y las subcarpetas) en folder1/subfolder1.
  • Para una solicitud de lista de objetos con el prefijo establecido en “folder1/” y sin delimitador, la solicitud no se permitirá ya que se debe utilizar un delimitador de "/" en la solicitud de lista para que esta política se evalúe como verdadera.

Acciones que no utilizan un prefijo/delimitador o vía de acceso

Existen algunas API de Cloud Object Storage que no especifican una vía de acceso o prefijo y delimitador. Los roles de servicio de Cloud Object Storage: Manager, Writer, Reader y Content Reader son ejemplos de roles que contienen estas acciones. Esto también se aplica a los roles personalizados. Para permitir estas acciones cuando se utiliza una condición Prefix/Delimiter o Path, se necesita la siguiente sentencia de condición en la política de IAM:

((path stringExists = false) AND (prefix stringExists = false) AND (delimiter stringExists= false))

Consulte la tabla Acciones deIdentity and Access Management para obtener la lista completa de acciones de API que no dan soporte a las condiciones Prefix/Delimiter o Path y que requieren la sentencia anterior cuando se utiliza el acceso preciso.

Consulte la sección sobre cómo Crear una nueva política para un usuario con condiciones para utilizar esta cláusula en una política de IAM.

Uso de condiciones con roles de servicio de Cloud Object Storage

Uso de condiciones con funciones de servicio COS
Rol de acceso Descripción de acciones Atributos de condición soportados
Gestor Hacer objetos públicos, crear y destruir buckets y objetos. ver nota
Writer Crear y destruir buckets y objetos. ver nota
Lector Listar grupos, listar objetos y descargar objetos. ver nota
Lector de contenido Listar y descargar objetos. ver nota
Lector de objetos Descargar objetos. Vía de acceso
Escritor de objetos Cargar objetos. Vía de acceso

Nota: Estos roles dan soporte a los atributos de condición Prefix/Delimiter y Path. Los roles también incluyen acciones que no especifican una vía de acceso o prefijo y delimitador. Utilice la cláusula stringExists en la sentencia de condición para permitir estas acciones.

Consulte enlace para obtener la lista completa de acciones para cada rol de servicio de Cloud Object Storage y la lista de atributos de condición soportados por cada acción.

Crear una nueva política para un usuario con condiciones

El ejemplo siguiente proporciona a un usuario con el rol de servicio “Writer” Cloud Object Storage con la posibilidad de:

  1. Listar el acceso a la jerarquía de objetos completa dentro de una carpeta denominada "folder1/subfolder1".
  2. Acceso de lectura, escritura o supresión a todos los objetos de una carpeta denominada "subfolder1".
  3. Realice la gestión de configuración de grupos como, por ejemplo, HEAD Bucket y GET/PUT Bucket Versioning.

CLI de una política de IAM con una condición

Para obtener información general sobre cómo utilizar la CLI, consulte la sección sobre utilizando la interfaz IBM Cloud® de línea comando.

Ejemplo

policy.json:

{
"type": "access",
  "subject": {
    "attributes": [
      {
        "value": "IBMid-664001QJNU",
        "operator": "stringEquals",
        "key": "iam_id"
      }
    ]
  },
  "resource": {
    "attributes": [
      {
        "value": "cloud-object-storage",
        "operator": "stringEquals",
        "key": "serviceName"
      },
      {
        "value": "e6156134-5ed7-4f73-80d3-d6d1ef56f1f9",
        "operator": "stringEquals",
        "key": "serviceInstance"
      },
      {
        "value": "bucket",
        "operator": "stringEquals",
        "key": "resourceType"
      },
      {
        "value": "fgac-tf-test",
        "operator": "stringEquals",
        "key": "resource"
      }
    ]
  },
  "control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatch",
            "value": "folder1/subfolder1/*"
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEqualsAnyOf",
            "value": [
              "/",
              ""
            ]
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatch",
        "value": "folder1/subfolder1/*"
      },
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.path}}",
            "operator": "stringExists",
            "value": false
          }
        ]
      }
    ]
  },
  "pattern": "attribute-based-condition:resource:literal-and-wildcard"
}
ibmcloud iam  user-policy-create hello@ibm.com --file policy.json --api-version v2

Utilice --api-version v2 con condiciones de atributos basadas en recursos.

API de una política de IAM con una condición

Ejemplo

Solicitud

curl -X POST 'https://iam.cloud.ibm.com/v2/policies' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
  "type": "access",
  "description": "access control for RESOURCE_NAME",
  "resource": {
    "attributes": [
      {
        "key": "serviceName",
        "operator": "stringEquals",
        "value": "cloud-object-storage"
      },
      {
        "key": "serviceInstance",
        "operator": "stringEquals",
        "value": "$SERVICE_INSTANCE"
      },
      {
        "key": "accountId",
        "operator": "stringEquals",
        "value": "$ACCOUNT_ID"
      },
      {
        "key": "resourceType",
        "operator": "stringEquals",
        "value": "bucket"
      },
      {
        "key": "resource",
        "operator": "stringEquals",
        "value": "$RESOURCE_NAME"
      }
    ]
  },
  "subject": {
    "attributes": [
      {
        "key": "iam_id",
        "operator": "stringEquals",
        "value": "IBMid-123453user"
      }
    ]
  },
  "control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }
      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatch",
            "value": "folder1/subfolder1/*"
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEqualsAnyOf",
            "value": [
              "/",
              ""
            ]
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatch",
        "value": "folder1/subfolder1/*"
      },
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.path}}",
            "operator": "stringExists",
            "value": false
          }
        ]
      }
    ]
  },
  "pattern": "attribute-based-condition:resource:literal-and-wildcard"
}'

Respuesta

{
    "id": "d4078e99-d78a-4a50-95d6-b528e3c87dff",
    "description": "access control for RESOURCE_NAME",
    "type": "access",
    "subject": {
        "attributes": [
            {
                "key": "iam_id",
                "operator": "stringEquals",
                "value": "IBMid-123453user"
            }
        ]
    },
    "resource": {
        "attributes": [
            {
                "key": "serviceName",
                "operator": "stringEquals",
                "value": "cloud-object-storage"
            },
            {
                "key": "serviceInstance",
                "operator": "stringEquals",
                "value": "$SERVICE_INSTANCE"
            },
            {
                "key": "accountId",
                "operator": "stringEquals",
                "value": "$ACCOUNT_ID"
            },
            {
                "key": "resourceType",
                "operator": "stringEquals",
                "value": "bucket"
            },
            {
                "key": "resource",
                "operator": "stringEquals",
                "value": "$RESOURCE_NAME"
            }
        ]
    },
    "pattern": "attribute-based-condition:resource:literal-and-wildcard",
    "rule": {
        "operator": "or",
        "conditions": [
            {
                "operator": "and",
                "conditions": [
                    {
                        "key": "{{resource.attributes.prefix}}",
                        "operator": "stringMatch",
                        "value": "folder1/subfolder1/*"
                    },
                    {
                        "key": "{{resource.attributes.delimiter}}",
                        "operator": "stringEqualsAnyOf",
                        "value": [
                            "/",
                            ""
                        ]
                    }
                ]
            },
            {
                "key": "{{resource.attributes.path}}",
                "operator": "stringMatch",
                "value": "folder1/subfolder1/*"
            },
            {
                "operator": "and",
                "conditions": [
                    {
                        "key": "{{resource.attributes.delimiter}}",
                        "operator": "stringExists",
                        "value": false
                    },
                    {
                        "key": "{{resource.attributes.prefix}}",
                        "operator": "stringExists",
                        "value": false
                    },
                    {
                        "key": "{{resource.attributes.path}}",
                        "operator": "stringExists",
                        "value": false
                    }
                ]
            }
        ]
    },
    "control": {
        "grant": {
            "roles": [
                {
                    "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
                }
            ]
        }
    },
    "href": "https://iam.cloud.ibm.com/v2/policies/d4078e99-d78a-4a50-95d6-b528e3c87dff",
    "created_at": "2023-10-09T16:24:52.391Z",
    "created_by_id": " IBMid-12345user",
    "last_modified_at": "2023-10-09T16:24:52.391Z",
    "last_modified_by_id": " IBMid-12345user",
    "counts": {
        "account": {
            "current": 785,
            "limit": 4020
        },
        "subject": {
            "current": 1,
            "limit": 1000
        }
    },
    "state": "active",
    "version": "v1.0"
}

Terraform de una política de IAM con una condición

Ejemplo

data "ibm_resource_group" "cos_group" {
      name = "Default"
}

resource "ibm_iam_user_policy" "example" {
 ibm_id = “user_email_id”
 roles = ["Writer"]
 resources {
  service = "cloud-object-storage"
  resource_type = "bucket"
  resource_instance_id = "cos instance guid"
  resource = "bucket-name"
}


rule_conditions {
 operator = "and"
 conditions {
  key = "{{resource.attributes.prefix}}"
  operator = "stringMatch"
  value = ["folder1/subfolder1/*"]
 }
 conditions {
  key = "{{resource.attributes.delimiter}}"
  operator = "stringEqualsAnyOf"
  value = ["/",""]
 }
 }
rule_conditions {
  key = "{{resource.attributes.path}}"
  operator = "stringMatch"
  value = ["folder1/subfolder1/*"]
 }
rule_conditions {
 operator = "and"
  conditions {
   key = "{{resource.attributes.delimiter}}"
   operator = "stringExists"
   value = ["false"]
  }
  conditions {
   key = "{{resource.attributes.prefix}}"
   operator = "stringExists"
   value = ["false"]
  }
  conditions {
   key = "{{resource.attributes.path}}"
   operator = "stringExists"
   value = ["false"]
  }
 }
rule_operator = "or"
 pattern = "attribute-based-condition:resource:literal-and-wildcard"
}

Información adicional

Para obtener ejemplos sobre cómo utilizar los atributos de condición Prefijo/Delimitador o Vía de acceso, consulte la guía de aprendizaje sobre cómo controlar el acceso a objetos individuales en un grupo.