Hacer públicos los datos

En esta página se explica cómo hacer que todos los usuarios de Internet puedan leer los objetos que te pertenecen y cómo quitar el acceso público a tu segmento. Para saber cómo acceder a los datos que se han hecho públicos, consulta Acceder a datos públicos.

Cuando un objeto se comparte públicamente, cualquier usuario que conozca el URI del objeto puede acceder a él mientras sea público.

Roles obligatorios

Para obtener los permisos necesarios para que los objetos se puedan leer públicamente, pide a tu administrador que te conceda los siguientes roles en el contenedor que contiene los datos que quieres hacer públicos:

  • Para que todos los objetos de un segmento se puedan leer públicamente: Administrador de Storage (roles/storage.admin)

  • Para que los objetos se puedan leer públicamente: Administrador de objetos de Storage (roles/storage.objectAdmin)

    • Si tienes previsto usar la consola, necesitarás el rol Administrador de Storage (roles/storage.admin) en lugar del rol Administrador de objetos de Storage. Google Cloud
  • Para quitar el acceso público de todos los objetos de un segmento, sigue estos pasos: Administrador de Storage (roles/storage.admin)

Estos roles contienen los permisos necesarios para hacer públicos los objetos. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

  • storage.buckets.get
  • storage.buckets.getIamPolicy
  • storage.buckets.setIamPolicy
  • storage.buckets.update
  • storage.objects.get
  • storage.objects.getIamPolicy
  • storage.objects.setIamPolicy
  • storage.objects.update

Los siguientes permisos solo son necesarios para usar la consola deGoogle Cloud para realizar las tareas de esta página:

  • storage.buckets.list
  • storage.objects.list

También puedes obtener estos permisos con otros roles predefinidos o roles personalizados.

Para obtener instrucciones sobre cómo conceder roles en los contenedores, consulta Usar IAM con contenedores.

Hacer que todos los objetos de un segmento se puedan leer públicamente

Para que todos los objetos de un segmento sean legibles para cualquier persona en Internet, concede al principal allUsers el rol Lector de objetos de Storage (roles/storage.objectViewer):

.

Consola

  1. En la Google Cloud consola, ve a la página Segmentos de Cloud Storage.

    Ir a Contenedores

  2. En la lista de segmentos, haga clic en el nombre del segmento que quiera hacer público.

  3. Seleccione la pestaña Permisos, situada en la parte superior de la página.

  4. En la sección Permisos, haz clic en el botón Dar acceso.

    Aparecerá el cuadro de diálogo Dar acceso.

  5. En el campo Nuevos directores, introduce allUsers.

  6. En el menú desplegable Seleccionar un rol, introduce Storage Object Viewer en el cuadro de filtro y selecciona Visor de objetos de Storage en los resultados filtrados.

  7. Haz clic en Guardar.

  8. Haz clic en Permitir acceso público.

Una vez que se haya concedido el acceso público, aparecerá el botón Copiar URL en cada objeto de la columna Acceso público. Puede hacer clic en este botón para obtener la URL pública del objeto. La URL pública es diferente del enlace que obtienes al hacer clic con el botón derecho en un objeto. Ambos enlaces proporcionan acceso a un objeto, pero la URL pública funciona sin que el usuario tenga que iniciar sesión en una cuenta de usuario. Para obtener más información, consulta Endpoints de solicitud.

Para saber cómo obtener información detallada sobre los errores de las operaciones de Cloud Storage en la consola, consulta la sección Solución de problemas. Google Cloud

Para saber cómo resolver errores de políticas de la organización y de permisos, consulte Solucionar problemas al hacer públicos los datos.

Línea de comandos

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. En tu entorno de desarrollo, ejecuta el comando buckets add-iam-policy-binding:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=allUsers --role=roles/storage.objectViewer

    Donde BUCKET_NAME es el nombre del cubo cuyos objetos quieres hacer públicos. Por ejemplo, my-bucket.

  3. Bibliotecas de cliente

    C++

    Para obtener más información, consulta la documentación de referencia de la API C++ de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    namespace gcs = ::google::cloud::storage;
    using ::google::cloud::StatusOr;
    [](gcs::Client client, std::string const& bucket_name) {
      auto current_policy = client.GetNativeBucketIamPolicy(
          bucket_name, gcs::RequestedPolicyVersion(3));
      if (!current_policy) throw std::move(current_policy).status();
    
      current_policy->set_version(3);
      current_policy->bindings().emplace_back(
          gcs::NativeIamBinding("roles/storage.objectViewer", {"allUsers"}));
    
      auto updated =
          client.SetNativeBucketIamPolicy(bucket_name, *current_policy);
      if (!updated) throw std::move(updated).status();
    
      std::cout << "Policy successfully updated: " << *updated << "\n";
    }

    C#

    Para obtener más información, consulta la documentación de referencia de la API C# de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    
    using Google.Apis.Storage.v1.Data;
    using Google.Cloud.Storage.V1;
    using System;
    using System.Collections.Generic;
    
    public class MakeBucketPublicSample
    {
        public void MakeBucketPublic(string bucketName = "your-unique-bucket-name")
        {
            var storage = StorageClient.Create();
    
            Policy policy = storage.GetBucketIamPolicy(bucketName);
    
            policy.Bindings.Add(new Policy.BindingsData
            {
                Role = "roles/storage.objectViewer",
                Members = new List<string> { "allUsers" }
            });
    
            storage.SetBucketIamPolicy(bucketName, policy);
            Console.WriteLine(bucketName + " is now public ");
        }
    }

    Go

    Para obtener más información, consulta la documentación de referencia de la API Go de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/iam"
    	"cloud.google.com/go/iam/apiv1/iampb"
    	"cloud.google.com/go/storage"
    )
    
    // setBucketPublicIAM makes all objects in a bucket publicly readable.
    func setBucketPublicIAM(w io.Writer, bucketName string) error {
    	// bucketName := "bucket-name"
    	ctx := context.Background()
    	client, err := storage.NewClient(ctx)
    	if err != nil {
    		return fmt.Errorf("storage.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	policy, err := client.Bucket(bucketName).IAM().V3().Policy(ctx)
    	if err != nil {
    		return fmt.Errorf("Bucket(%q).IAM().V3().Policy: %w", bucketName, err)
    	}
    	role := "roles/storage.objectViewer"
    	policy.Bindings = append(policy.Bindings, &iampb.Binding{
    		Role:    role,
    		Members: []string{iam.AllUsers},
    	})
    	if err := client.Bucket(bucketName).IAM().V3().SetPolicy(ctx, policy); err != nil {
    		return fmt.Errorf("Bucket(%q).IAM().SetPolicy: %w", bucketName, err)
    	}
    	fmt.Fprintf(w, "Bucket %v is now publicly readable\n", bucketName)
    	return nil
    }
    

    Java

    Para obtener más información, consulta la documentación de referencia de la API Java de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    import com.google.cloud.Identity;
    import com.google.cloud.Policy;
    import com.google.cloud.storage.Storage;
    import com.google.cloud.storage.StorageOptions;
    import com.google.cloud.storage.StorageRoles;
    
    public class MakeBucketPublic {
      public static void makeBucketPublic(String projectId, String bucketName) {
        // The ID of your GCP project
        // String projectId = "your-project-id";
    
        // The ID of your GCS bucket
        // String bucketName = "your-unique-bucket-name";
    
        Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
        Policy originalPolicy = storage.getIamPolicy(bucketName);
        storage.setIamPolicy(
            bucketName,
            originalPolicy.toBuilder()
                .addIdentity(StorageRoles.objectViewer(), Identity.allUsers()) // All users can view
                .build());
    
        System.out.println("Bucket " + bucketName + " is now publicly readable");
      }
    }

    Node.js

    Para obtener más información, consulta la documentación de referencia de la API Node.js de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // The ID of your GCS bucket
    // const bucketName = 'your-unique-bucket-name';
    
    // Imports the Google Cloud client library
    const {Storage} = require('@google-cloud/storage');
    
    // Creates a client
    const storage = new Storage();
    
    async function makeBucketPublic() {
      await storage.bucket(bucketName).makePublic();
    
      console.log(`Bucket ${bucketName} is now publicly readable`);
    }
    
    makeBucketPublic().catch(console.error);

    PHP

    Para obtener más información, consulta la documentación de referencia de la API PHP de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    use Google\Cloud\Storage\StorageClient;
    
    /**
     * Update the specified bucket's IAM configuration to make it publicly accessible.
     *
     * @param string $bucketName The name of your Cloud Storage bucket.
     *        (e.g. 'my-bucket')
     */
    function set_bucket_public_iam(string $bucketName): void
    {
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
    
        $policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);
        $policy['version'] = 3;
    
        $role = 'roles/storage.objectViewer';
        $members = ['allUsers'];
    
        $policy['bindings'][] = [
            'role' => $role,
            'members' => $members
        ];
    
        $bucket->iam()->setPolicy($policy);
    
        printf('Bucket %s is now public', $bucketName);
    }

    Python

    Para obtener más información, consulta la documentación de referencia de la API Python de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    from typing import List
    
    from google.cloud import storage
    
    
    def set_bucket_public_iam(
        bucket_name: str = "your-bucket-name",
        members: List[str] = ["allUsers"],
    ):
        """Set a public IAM Policy to bucket"""
        # bucket_name = "your-bucket-name"
    
        storage_client = storage.Client()
        bucket = storage_client.bucket(bucket_name)
    
        policy = bucket.get_iam_policy(requested_policy_version=3)
        policy.bindings.append(
            {"role": "roles/storage.objectViewer", "members": members}
        )
    
        bucket.set_iam_policy(policy)
    
        print(f"Bucket {bucket.name} is now publicly readable")
    
    

    Ruby

    Para obtener más información, consulta la documentación de referencia de la API Ruby de Cloud Storage.

    Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

    def set_bucket_public_iam bucket_name:
      # The ID of your GCS bucket
      # bucket_name = "your-unique-bucket-name"
    
      require "google/cloud/storage"
    
      storage = Google::Cloud::Storage.new
      bucket = storage.bucket bucket_name
    
      bucket.policy do |p|
        p.add "roles/storage.objectViewer", "allUsers"
      end
    
      puts "Bucket #{bucket_name} is now publicly readable"
    end

    Terraform

    Puedes usar un recurso de Terraform para hacer públicos todos los objetos de un segmento.

    # Make bucket public
    resource "google_storage_bucket_iam_member" "member" {
      provider = google
      bucket   = google_storage_bucket.default.name
      role     = "roles/storage.objectViewer"
      member   = "allUsers"
    }

    APIs REST

    API JSON

    1. Tener instalada e inicializadala CLI de gcloud, que te permite generar un token de acceso para el encabezado Authorization.

    2. Crea un archivo JSON que contenga la siguiente información:

      {
        "bindings":[
          {
            "role": "roles/storage.objectViewer",
            "members":["allUsers"]
          }
        ]
      }
    3. Usa cURL para llamar a la API JSON con una solicitud de PUT contenedor:

      curl -X PUT --data-binary @JSON_FILE_NAME \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

      Donde:

      • JSON_FILE_NAME es la ruta del archivo que has creado en el paso 2.
      • BUCKET_NAME es el nombre del contenedor cuyos objetos quieres hacer públicos. Por ejemplo, my-bucket.

    API XML

    La API XML no admite que todos los objetos de un segmento sean legibles públicamente. Usa la Google Cloud consola o gcloud storage.

Hacer que una parte de un segmento se pueda leer públicamente

Usa una carpeta gestionada para controlar el acceso a los objetos cuyo prefijo de nombre coincida con el nombre de la carpeta gestionada. Por ejemplo, una carpeta gestionada llamada my-folder se puede usar para controlar el acceso a los objetos my-folder/cats.jpg y my-folder/dogs.jpg.

Para que estos objetos sean accesibles públicamente, primero crea la carpeta gestionada y, a continuación, define una política de gestión de identidades y accesos en la carpeta que conceda a allUsers el rol Lector de objetos de Storage (roles/storage.objectViewer):

Consola

  1. En la Google Cloud consola, ve a la página Segmentos de Cloud Storage.

    Ir a Contenedores

  2. Haga clic en el nombre del segmento que contiene los objetos que quiere hacer públicos.

  3. Crea una carpeta siguiendo estos pasos:

    1. Haz clic en el botón Crear carpeta.

    2. Introduce el Nombre de la carpeta. Una vez que la carpeta se haya convertido en una carpeta gestionada, los objetos cuyo nombre empiece por este nombre estarán sujetos a los roles de gestión de identidades y accesos definidos en la carpeta.

    3. Haz clic en Crear.

  4. Convierte la carpeta en una carpeta gestionada siguiendo estos pasos:

    1. En el panel que muestra el contenido del contenedor, busca el nombre de la carpeta que has creado y haz clic en el icono Más opciones .

    2. Haz clic en Editar acceso.

    3. En la ventana que aparece, haz clic en Habilitar.

  5. Añade una política de gestión de identidades y accesos a la carpeta que conceda el rol Visor de objetos de Storage (roles/storage.objectViewer) a allUsers. Para ello, sigue estos pasos:

    1. Si el panel Permisos de la carpeta gestionada aún no está abierto, haz clic en el icono Más opciones de la carpeta gestionada y, a continuación, en Editar acceso.

    2. En el panel Permisos, haz clic en el botón Añadir principal.

    3. En el campo Nuevos directores, introduce allUsers.

    4. En el menú desplegable Seleccionar un rol, introduce Storage Object Viewer en el cuadro de filtro y selecciona Visor de objetos de Storage en los resultados filtrados.

    5. Haz clic en Guardar.

    6. Haz clic en Permitir acceso público.

Una vez que se haya concedido el acceso público, aparecerá un botón Copiar URL en cada objeto aplicable de la columna Acceso público. Puedes hacer clic en este botón para obtener la URL pública del objeto. La URL pública es diferente del enlace que obtienes al hacer clic con el botón derecho en un objeto. Ambos enlaces proporcionan acceso a un objeto, pero la URL pública funciona sin que el usuario tenga que iniciar sesión en una cuenta de usuario. Para obtener más información, consulta Endpoints de solicitud.

Para saber cómo obtener información detallada sobre los errores de las operaciones de Cloud Storage en la consola, consulta la sección Solución de problemas. Google Cloud

Para saber cómo resolver errores de políticas de la organización y de permisos, consulte Solucionar problemas al hacer públicos los datos.

Línea de comandos

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. En tu entorno de desarrollo, crea una carpeta gestionada con el comando gcloud storage managed-folders create:

    gcloud storage managed-folders create gs://BUCKET_NAME/MANAGED_FOLDER_NAME/

    Donde:

    • BUCKET_NAME es el nombre del contenedor en el que quieres crear una carpeta gestionada. Por ejemplo, my-bucket.

    • MANAGED_FOLDER_NAME es el nombre de la carpeta gestionada que quieres crear. Por ejemplo, my-managed-folder.

  3. En tu entorno de desarrollo, añade allUsers a la política de gestión de identidades y accesos de la carpeta gestionada con el comando gcloud storage managed-folders add-iam-policy-binding:

    gcloud storage managed-folders add-iam-policy-binding gs://BUCKET_NAME/MANAGED_FOLDER_NAME --member=allUsers --role=roles/storage.objectViewer

    Donde:

    • BUCKET_NAME es el nombre del contenedor que contiene la carpeta gestionada a la que vas a añadir la política de IAM. Por ejemplo, my-bucket.
    • MANAGED_FOLDER_NAME es el nombre de la carpeta gestionada a la que quieres añadir acceso público. Por ejemplo, my-managed-folder.
  4. APIs REST

    API JSON

    1. Tener instalada e inicializadala CLI de gcloud, que te permite generar un token de acceso para el encabezado Authorization.

    2. Crea un archivo JSON que contenga la siguiente información:

      {
        "name": "MANAGED_FOLDER_NAME"
      }

      Donde MANAGED_FOLDER_NAME es el nombre de la carpeta gestionada que quieres crear. Por ejemplo, my-managed-folder.

    3. Usa cURL para llamar a la API JSON con una solicitud Insert ManagedFolder:

      curl -X POST --data-binary @JSON_FILE_NAME \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/managedFolders"

      Donde:

      • JSON_FILE_NAME es la ruta del archivo que has creado en el paso anterior.
      • BUCKET_NAME es el nombre del bucket en el que quieres crear una carpeta gestionada. Por ejemplo, my-bucket.
    4. Crea un archivo JSON que contenga la siguiente información:

      {
        "bindings":[
          {
            "role": "roles/storage.objectViewer",
            "members":["allUsers"]
          }
        ]
      }
    5. Usa cURL para llamar a la API JSON con una solicitud setIamPolicyManagedFolder:

      curl -X PUT --data-binary @JSON_FILE_NAME \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/managedFolders/MANAGED_FOLDER_NAME/iam"

      Donde:

      • JSON_FILE_NAME es la ruta del archivo que has creado en el paso anterior.
      • BUCKET_NAME es el nombre del contenedor que contiene la carpeta gestionada a la que vas a añadir la política de IAM. Por ejemplo, my-bucket.
      • MANAGED_FOLDER_NAME es el nombre de la carpeta gestionada a la que vas a añadir la política de gestión de identidades y accesos. Por ejemplo, my-managed-folder.

    API XML

    La API XML no admite el uso de carpetas gestionadas. Usa otra herramienta, como la Google Cloud consola, o define las LCA en objetos individuales mediante solicitudes Set Object ACL. A continuación, se muestra un ejemplo de archivo de LCA que concedería acceso a allUsers a un objeto:

    <AccessControlList>
      <Entries>
        <Entry>
          <Scope type="AllUsers"/>
          <Permission>READ</Permission>
        </Entry>
      </Entries>
    </AccessControlList>

Quitar el acceso público a todos los objetos de un segmento

Para retirar el acceso público a todos los objetos de un segmento, elimina la política de gestión de identidades y accesos que concede el rol Lector de objetos de Storage (roles/storage.objectViewer) a allUsers:

Consola

  1. En la Google Cloud consola, ve a la página Segmentos de Cloud Storage.

    Ir a Contenedores

  2. En la lista de segmentos, haga clic en el nombre del segmento al que quiera quitar el acceso público.

  3. Selecciona la pestaña Permisos.

    La política de gestión de identidades y accesos que se aplica al segmento aparece en la sección Permisos.

  4. En la pestaña Ver por principales, selecciona la casilla del principal allUsers que quieras quitar.

  5. Haz clic en el botón - Quitar acceso.

  6. En la ventana superpuesta que aparece, haz clic en Confirmar.

Para saber cómo obtener información detallada sobre los errores de las operaciones de Cloud Storage en la consola, consulta la sección Solución de problemas. Google Cloud

Línea de comandos

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. En tu entorno de desarrollo, ejecuta el comando buckets remove-iam-policy-binding:

  3. gcloud storage buckets remove-iam-policy-binding  gs://BUCKET_NAME --member=allUsers --role=roles/storage.objectViewer

    Donde BUCKET_NAME es el nombre del segmento al que quieres revocar el acceso. Por ejemplo, my-bucket.

    APIs REST

    JSON

    1. Tener instalada e inicializadala CLI de gcloud, que te permite generar un token de acceso para el encabezado Authorization.

    2. Aplica la política actual a tu segmento. Para ello, usa cURL para llamar a la API JSON con una solicitud GET getIamPolicy:

      curl -X GET \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

      Donde BUCKET_NAME es el nombre del contenedor cuya política de gestión de identidades y accesos quiere ver. Por ejemplo, my-bucket.

    3. Crea un archivo JSON que contenga la política que has obtenido en el paso anterior y edítalo para quitar la vinculación del principal allUsers de la política.

    4. Usa cURL para llamar a la API JSON con una solicitud PUT setIamPolicy:

      curl -X PUT --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

      Donde:

      • JSON_FILE_NAME es la ruta del archivo que has creado en el paso 3.

      • BUCKET_NAME es el nombre del segmento al que quieres quitar el acceso. Por ejemplo, my-bucket.

Siguientes pasos