Controllo dell'accesso alle risorse dell'API Cloud Healthcare

Questa pagina descrive come controllare l'accesso ai set di dati e ai datastore dell'API Cloud Healthcare utilizzando le autorizzazioni di Identity and Access Management (IAM). IAM consente di controllare chi può accedere ai set di dati e ai datastore. Per saperne di più su IAM per l'API Cloud Healthcare, consulta Controllo degli accessi.

Panoramica delle policy IAM

L'accesso a una risorsa viene gestito mediante un criterio IAM. Una criterio contiene un array chiamato bindings. Questo array contiene una raccolta di associazioni tra entità, ad esempio tra un account utente o un account di servizio e un ruolo. I criterio sono rappresentati mediante il formato JSON o YAML.

La seguente policy di esempio mostra user-1@example.com a cui è stato concesso il ruolo roles/healthcare.datasetAdmin e user-2@example.com e service-account-13@appspot.gserviceaccount.com a cui è stato concesso il ruolo roles/healthcare.datasetViewer:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.datasetAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.datasetViewer",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com"
      ]
    }
  ]
}

Per aggiornare un criterio per una risorsa, utilizza il pattern read-modify-write. Non esistono metodi separati per creare, modificare e revocare l'accesso agli utenti.

Per aggiornare una policy, completa i seguenti passaggi:

  1. Leggi la policy corrente chiamando il metodo getIamPolicy() della risorsa. Ad esempio, per leggere il criterio corrente di un set di dati, chiama projects.locations.datasets.getIamPolicy.
  2. Modifica la policy restituita mediante un editor di testo o in modo programmatico per aggiungere o rimuovere eventuali entità applicabili e i rispettivi ruoli concessi.
  3. Scrivi la policy aggiornata chiamando il metodo setIamPolicy() della risorsa. Ad esempio, per scrivere il criterio aggiornato di un set di dati, chiama projects.locations.datasets.setIamPolicy.

Le sezioni riportate di seguito descrivono come recuperare, modificare e impostare un criterio per un archivio del consenso. In queste sezioni viene utilizzato come punto di partenza il seguente esempio:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.consentStoreAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.consentReader",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com"
      ]
    }
  ]
}

Recupero di un criterio

Gli esempi riportati di seguito mostrano come leggere un criterio IAM a livello di archivio del consenso. Per saperne di più, vedi projects.locations.datasets.consentStores.getIamPolicy.

Per visualizzare il criterio IAM per un archivio del consenso:

  1. Nella console Google Cloud , vai alla pagina Set di dati.

    Vai a Set di dati

  2. Fai clic sull'ID del set di dati che contiene l'archivio del consenso, quindi seleziona l'archivio del consenso per cui vuoi ottenere una norma.
  3. Fai clic su Mostra riquadro informazioni.
  4. Per visualizzare le entità assegnate a un ruolo, espandi il ruolo.

Per visualizzare la policy IAM per un archivio del consenso, esegui il comando gcloud healthcare consent-stores get-iam-policy. Specifica il nome dell'archivio del consenso, il nome del set di dati e la posizione.

gcloud healthcare consent-stores get-iam-policy CONSENT_STORE_ID \
    --dataset=DATASET_ID \
    --location=LOCATION

Se la richiesta ha esito positivo, vengono visualizzati i binding.

bindings:
- members:
  - user:user-1@example.com
  role: roles/healthcare.consentStoreAdmin
  - serviceAccount:service-account-13@appspot.gserviceaccount.com
  - user:user-2@example.com
  role: roles/healthcare.consentReader
etag: bytes
version: VERSION_NUMBER
const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
});

const getConsentStoreIamPolicy = async () => {
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const consentStoreId = 'my-consent-store';
  const resource_ = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/consentStores/${consentStoreId}`;
  const request = {resource_};

  const consentStore =
    await healthcare.projects.locations.datasets.consentStores.getIamPolicy(
      request
    );
  console.log(
    'Got consent store IAM policy:',
    JSON.stringify(consentStore.data, null, 2)
  );
};

getConsentStoreIamPolicy();
def get_consent_store_iam_policy(
    project_id: str, location: str, dataset_id: str, consent_store_id: str
):
    """Gets the IAM policy for the specified consent store.
    See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/consent
    before running the sample."""
    # Imports the Google API Discovery Service.
    from googleapiclient import discovery

    api_version = "v1"
    service_name = "healthcare"
    # Returns an authorized API client by discovering the Healthcare API
    # and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
    client = discovery.build(service_name, api_version)

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'  # replace with your GCP project ID
    # location = 'us-central1'  # replace with the parent dataset's location
    # dataset_id = 'my-dataset'  # replace with the consent store's parent dataset ID
    # consent_store_id = 'my-consent-store'  # replace with the consent store's ID
    consent_store_parent = "projects/{}/locations/{}/datasets/{}".format(
        project_id, location, dataset_id
    )
    consent_store_name = "{}/consentStores/{}".format(
        consent_store_parent, consent_store_id
    )

    request = (
        client.projects()
        .locations()
        .datasets()
        .consentStores()
        .getIamPolicy(resource=consent_store_name)
    )
    response = request.execute()

    print("etag: {}".format(response.get("name")))
    return response

Per leggere il criterio IAM per un archivio dei consensi, effettua una richiesta GET e specifica il nome del set di dati, il nome dell'archivio dei consensi e un token di accesso.

Il seguente esempio mostra una richiesta GET mediante curl:

curl -X GET \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/consentStores/CONSENT_STORE_ID:getIamPolicy"

La risposta è la seguente:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.consentStoreAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.consentReader",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com"
      ]
    }
  ]
}

Per leggere il criterio IAM per un archivio dei consensi, effettua una richiesta GET e specifica il nome del set di dati, il nome dell'archivio dei consensi e un token di accesso.

Il seguente esempio mostra una richiesta GET mediante Windows PowerShell:

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/consentStores/CONSENT_STORE_ID:getIamPolicy" | Select-Object -Expand Content

La risposta è la seguente:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.consentStoreAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.consentReader",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com"
      ]
    }
  ]
}

Modifica di un criterio

I seguenti esempi concedono a un nuovo utente il ruolo roles/healthcare.consentReader. Per saperne di più, consulta projects.locations.datasets.consentStores.setIamPolicy.

Impostazione di un criterio

Per impostare un criterio IAM a livello di archivio del consenso, completa i seguenti passaggi:

  1. Nella console Google Cloud , vai alla pagina Set di dati.

    Vai a Set di dati

  2. Fai clic sull'ID del set di dati che contiene l'archivio del consenso, quindi seleziona l'archivio del consenso per cui vuoi impostare un criterio.
  3. Fai clic su Mostra riquadro informazioni.
  4. Fai clic su Aggiungi entità.
  5. Nel campo Nuove entità, inserisci una o più identità che devono accedere all'archivio del consenso.
  6. Nell'elenco Seleziona un ruolo, in Cloud Healthcare, seleziona l'autorizzazione che vuoi concedere. Ad esempio, Visualizzatore archivio consensi Healthcare.
  7. Fai clic su Salva.

Concedi o revoca i ruoli agli utenti modificando il criterio recuperato in modo programmatico o utilizzando un editor di testo. Il valore etag cambia quando il criterio cambia, quindi devi specificare il valore attuale.

Per concedere il ruolo a un nuovo utente, aggiungi il suo indirizzo email all'array members nell'associazione roles/healthcare.consentReader:

{
  "role":"roles/healthcare.consentReader",
  "members": [
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@example.com",
    "user:NEW_USER_EMAIL_ADDRESS"
  ]
}
Per revocare l'accesso di un'entità, elimina il suo indirizzo email dall'array members. Per revocare l'accesso dall'ultima entità che ha un ruolo, elimina l'array bindings per il ruolo. Nel criterio non può esistere un array bindings vuoto.

Dopo aver modificato il criterio in modo da concedere i ruoli applicabili, esegui il comando set-iam-policy appropriato per apportare le modifiche. Per impostare una policy a livello di archivio del consenso, esegui il comando gcloud healthcare consent-stores set-iam-policy. Specifica il nome dell'archivio del consenso, il nome del set di dati, la località e il percorso del file della norma che hai creato.

gcloud healthcare consent-stores set-iam-policy CONSENT_STORE_ID \
    --dataset=DATASET_ID \
    --location=LOCATION \
    POLICY_FILE_NAME

Se la richiesta ha esito positivo, vengono visualizzati il nome dell'archivio del consenso e i binding.

Updated IAM policy for consentStore [CONSENT_STORE_ID].
bindings:
- members:
  - user:user-1@example.com
  role: roles/healthcare.consentStoreAdmin
  - serviceAccount:service-account-13@appspot.gserviceaccount.com
  - user:user-2@example.com
  - user:NEW_USER_EMAIL_ADDRESS
  role: roles/healthcare.consentReader
etag: bytes
version: VERSION_NUMBER
const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
});

const setConsentStoreIamPolicy = async () => {
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const consentStoreId = 'my-consent-store';
  // const member = 'user:example@gmail.com';
  // const role = 'roles/healthcare.consentStoreViewer';
  const resource_ = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/consentStores/${consentStoreId}`;
  const request = {
    resource_,
    resource: {
      policy: {
        bindings: [
          {
            members: member,
            role: role,
          },
        ],
      },
    },
  };

  const consentStore =
    await healthcare.projects.locations.datasets.consentStores.setIamPolicy(
      request
    );
  console.log(
    'Set consent store IAM policy:',
    JSON.stringify(consentStore.data, null, 2)
  );
};

setConsentStoreIamPolicy();
def set_consent_store_iam_policy(
    project_id: str,
    location: str,
    dataset_id: str,
    consent_store_id: str,
    member,
    role,
    etag=None,
):
    """Sets the IAM policy for the specified consent store.
    A single member will be assigned a single role. A member can be any of:
    - allUsers, that is, anyone
    - allAuthenticatedUsers, anyone authenticated with a Google account
    - user:email, as in 'user:somebody@example.com'
    - group:email, as in 'group:admins@example.com'
    - domain:domainname, as in 'domain:example.com'
    - serviceAccount:email,
        as in 'serviceAccount:my-other-app@appspot.gserviceaccount.com'
    A role can be any IAM role, such as 'roles/viewer', 'roles/owner',
    or 'roles/editor'
    See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/consent
    before running the sample."""
    # Imports the Google API Discovery Service.
    from googleapiclient import discovery

    api_version = "v1"
    service_name = "healthcare"
    # Returns an authorized API client by discovering the Healthcare API
    # and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
    client = discovery.build(service_name, api_version)

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'  # replace with your GCP project ID
    # location = 'us-central1'  # replace with the parent dataset's location
    # dataset_id = 'my-dataset'  # replace with the consent store's parent dataset ID
    # consent_store_id = 'my-consent-store'  # replace with the consent store's ID
    # member = 'myemail@example.com'  # replace with an authorized member
    # role = 'roles/viewer'  # replace with a Healthcare API IAM role
    consent_store_parent = "projects/{}/locations/{}/datasets/{}".format(
        project_id, location, dataset_id
    )
    consent_store_name = "{}/consentStores/{}".format(
        consent_store_parent, consent_store_id
    )

    policy = {"bindings": [{"role": role, "members": [member]}]}

    if etag is not None:
        policy["etag"] = etag

    request = (
        client.projects()
        .locations()
        .datasets()
        .consentStores()
        .setIamPolicy(resource=consent_store_name, body={"policy": policy})
    )
    response = request.execute()

    print("etag: {}".format(response.get("name")))
    print("bindings: {}".format(response.get("bindings")))
    return response

Concedi o revoca i ruoli agli utenti modificando il criterio recuperato in modo programmatico o utilizzando un editor di testo. Il valore etag cambia quando il criterio cambia, quindi devi specificare il valore attuale.

Per concedere il ruolo a un nuovo utente, aggiungi il suo indirizzo email all'array members nell'associazione roles/healthcare.consentReader:

{
  "role":"roles/healthcare.consentReader",
  "members": [
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@example.com",
    "user:NEW_USER_EMAIL_ADDRESS"
  ]
}
Per revocare l'accesso di un'entità, elimina il suo indirizzo email dall'array members. Per revocare l'accesso dall'ultima entità che ha un ruolo, elimina l'array bindings per il ruolo. Nel criterio non può esistere un array bindings vuoto.

Dopo aver modificato il criterio in modo da concedere i ruoli applicabili, chiama projects.locations.datasets.consentStores.setIamPolicy per apportare gli aggiornamenti.

Per impostare un criterio IAM a livello di archivio dei consensi, effettua una richiesta POST e specifica il nome del set di dati, il nome dell'archivio dei consensi, il criterio e un token di accesso.

L'esempio seguente mostra una richiesta POST mediante curl per concedere a un nuovo utente il ruolo esistente roles/healthcare.consentReader:

I criteri possono essere scritti direttamente nella richiesta, come mostrato qui, oppure essere passati come file JSON o YAML. Per esempi su come formattare un criterio come JSON o YAML, consulta Policy.
curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'policy': {
        'bindings': [
          {
            'role':'roles/healthcare.consentStoreAdmin',
            'members': [
              'user:user-1@example.com'
            ]
          },
          {
            'role':'roles/healthcare.consentReader',
            'members': [
              'serviceAccount:service-account-13@appspot.gserviceaccount.com',
              'user:user-2@example.com',
              'user:NEW_USER_EMAIL_ADDRESS'
            ]
          }
        ]
      }
    }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/consentStores/CONSENT_STORE_ID:setIamPolicy"

La risposta è la seguente:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.consentStoreAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.consentReader",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com",
        "user:NEW_USER_EMAIL_ADDRESS"
      ]
    }
  ]
}

Concedi o revoca i ruoli agli utenti modificando il criterio recuperato in modo programmatico o utilizzando un editor di testo. Il valore etag cambia quando il criterio cambia, quindi devi specificare il valore attuale.

Per concedere il ruolo a un nuovo utente, aggiungi il suo indirizzo email all'array members nell'associazione roles/healthcare.consentReader:

{
  "role":"roles/healthcare.consentReader",
  "members": [
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@example.com",
    "user:NEW_USER_EMAIL_ADDRESS"
  ]
}
Per revocare l'accesso di un'entità, elimina il suo indirizzo email dall'array members. Per revocare l'accesso dall'ultima entità che ha un ruolo, elimina l'array bindings per il ruolo. Nel criterio non può esistere un array bindings vuoto.

Dopo aver modificato il criterio in modo da concedere i ruoli applicabili, chiama projects.locations.datasets.consentStores.setIamPolicy per apportare gli aggiornamenti.

Per impostare un criterio IAM a livello di archivio dei consensi, effettua una richiesta POST e specifica il nome del set di dati, il nome dell'archivio dei consensi, il criterio e un token di accesso.

Il seguente esempio mostra una richiesta POST mediante Windows PowerShell per concedere a un nuovo utente il ruolo roles/healthcare.consentReader esistente:

I criteri possono essere scritti direttamente nella richiesta, come mostrato qui, oppure essere passati come file JSON o YAML. Per esempi su come formattare un criterio come JSON o YAML, consulta Policy.
$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
    'policy': {
      'bindings': [
        {
          'role': 'roles/healthcare.consentStoreAdmin',
          'members': [
            'user:user-1@example.com',
          ]
        },
        {
          'role': 'roles/healthcare.consentReader',
          'members': [
            'serviceAccount:service-account-13@appspot.gserviceaccount.com',
            'user:user-2@example.com',
            'user:NEW_USER_EMAIL_ADDRESS'
          ]
        }
      ]
    }
  }" `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/consentStores/CONSENT_STORE_ID:setIamPolicy" | Select-Object -Expand Content

La risposta è la seguente:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.consentStoreAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.consentReader",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com",
        "user:NEW_USER_EMAIL_ADDRESS"
      ]
    }
  ]
}

Utilizzo di IAM con i set di dati

Le sezioni riportate di seguito descrivono come recuperare, modificare e impostare un criterio per un set di dati. In queste sezioni viene utilizzato come punto di partenza il seguente esempio:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.datasetAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.datasetViewer",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com"
      ]
    }
  ]
}

Recupero di un criterio

Gli esempi riportati di seguito mostrano come leggere un criterio IAM a livello di set di dati. Per saperne di più, vedi projects.locations.datasets.getIamPolicy.

curl

Per leggere il criterio IAM per un set di dati, effettua una richiesta GET e specifica il nome del set di dati e un token di accesso.

Il seguente esempio mostra una richiesta GET mediante curl:

curl -X GET \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID:getIamPolicy"

La risposta è la seguente:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.datasetAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.datasetViewer",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com"
      ]
    }
  ]
}

PowerShell

Per visualizzare il criterio IAM per un set di dati, effettua una richiesta GET e specifica il nome del set di dati e un token di accesso.

Il seguente esempio mostra una richiesta GET mediante Windows PowerShell:

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID:getIamPolicy" | Select-Object -Expand Content

La risposta è la seguente:

{
  "etag":"bytes",
  "bindings": [
    {
      "role":"roles/healthcare.datasetAdmin",
      "members": [
        "user:user-1@example.com"
      ]
    },
    {
      "role":"roles/healthcare.datasetViewer",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@example.com"
      ]
    }
  ]
}

Console

Per visualizzare la policy IAM per un set di dati:
  1. Nella console Google Cloud , vai alla pagina Set di dati.

    Vai a Set di dati

  2. Seleziona un set di dati e poi fai clic su Mostra riquadro informazioni.
  3. Per visualizzare le entità assegnate a un ruolo, espandi il ruolo.

gcloud

Per visualizzare la policy IAM per un set di dati, esegui il comando gcloud healthcare datasets get-iam-policy. Specifica il nome e la posizione del set di dati.

gcloud healthcare datasets get-iam-policy DATASET_ID \
    --location=LOCATION

Se la richiesta ha esito positivo, vengono visualizzati i binding.

bindings:
- members:
  - serviceAccount:service-account-13@appspot.gserviceaccount.com
  - user:user-2@example.com
  role: roles/healthcare.datasetViewer
etag: bytes
version: VERSION_NUMBER

Go

import (
	"context"
	"fmt"
	"io"

	healthcare "google.golang.org/api/healthcare/v1"
)

// datasetIAMPolicy gets the dataset's IAM policy.
func datasetIAMPolicy(w io.Writer, projectID, location, datasetID string) error {
	ctx := context.Background()

	healthcareService, err := healthcare.NewService(ctx)
	if err != nil {
		return fmt.Errorf("healthcare.NewService: %w", err)
	}

	datasetsService := healthcareService.Projects.Locations.Datasets

	name := fmt.Sprintf("projects/%s/locations/%s/datasets/%s", projectID, location, datasetID)

	policy, err := datasetsService.GetIamPolicy(name).Do()
	if err != nil {
		return fmt.Errorf("GetIamPolicy: %w", err)
	}

	fmt.Fprintf(w, "IAM Policy etag: %v\n", policy.Etag)
	return nil
}

Java

import