Mengonfigurasi kontrol akses yang sangat terperinci

Halaman ini menjelaskan cara mengonfigurasi kontrol akses terperinci untuk database dialek Spanner untuk GoogleSQL dan database dialek PostgreSQL.

Untuk mempelajari kontrol akses terperinci, lihat Tentang kontrol akses terperinci.

Konfigurasi kontrol akses yang sangat terperinci dengan mengikuti langkah-langkah berikut:

  1. Buat peran database dan berikan hak istimewa.

  2. Opsional: Buat hierarki peran dengan pewarisan.

  3. Memberikan peran database kepada akun utama.

  4. Memberi tahu pengguna dan developer untuk menggunakan peran database.

Pengguna kontrol akses terperinci kemudian harus menentukan peran database untuk melakukan kueri, DML, atau operasi baris terhadap database.

Sebelum memulai

Pastikan setiap akun utama yang akan menjadi pengguna kontrol akses terperinci diberi peran Identity and Access Management (IAM) Cloud Spanner Viewer (roles/spanner.viewer). Peran ini direkomendasikan di tingkat project untuk pengguna yang harus berinteraksi dengan resource Spanner di konsol Google Cloud .

Untuk mengetahui petunjuknya, lihat bagian Memberikan izin kepada akun utama.

Membuat peran database dan memberikan hak istimewa

Peran database adalah kumpulan hak istimewa akses terperinci. Anda dapat membuat hingga 100 peran database untuk setiap database.

Tentukan peran dan hierarki peran dalam database Anda, lalu encode dalam DDL. Seperti perubahan skema lainnya di Spanner, sebaiknya terbitkan perubahan skema dalam batch, bukan secara terpisah. Untuk mengetahui informasi selengkapnya, lihat Membatasi frekuensi update skema.

Konsol

Untuk membuat peran database dan memberikan hak istimewa akses terperinci kepadanya, ikuti langkah-langkah berikut:

  1. Buka halaman Instances di konsol Google Cloud .

    Instance

  2. Pilih instance yang berisi database yang ingin Anda tambahi perannya.

  3. Pilih database.

  4. Di halaman Overview, klik Spanner Studio.

  5. Di halaman Spanner Studio, untuk setiap peran database yang ingin Anda buat dan berikan hak istimewanya, ikuti langkah-langkah berikut:

    1. Untuk membuat peran, masukkan pernyataan berikut:

      CREATE ROLE ROLE_NAME;

      Jangan klik Kirim terlebih dahulu.

    2. Untuk memberikan hak istimewa ke peran, masukkan pernyataan GRANT di baris berikutnya setelah pernyataan CREATE ROLE.

      Untuk mengetahui detail sintaksis pernyataan GRANT, lihat Bahasa definisi data GoogleSQL. Untuk mengetahui informasi tentang hak istimewa, lihat Hak istimewa kontrol akses terperinci.

      Misalnya, untuk memberikan SELECT, INSERT, dan UPDATE pada tabel employees dan contractors ke peran database hr_manager, masukkan pernyataan berikut:

      GoogleSQL

      GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
      

      PostgreSQL

      GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_manager;
      

      Anda dapat menggunakan template DDL untuk pernyataan GRANT. Di panel Penjelajah, buka peran yang ingin Anda berikan hak istimewanya. Klik Lihat tindakan dan pilih jenis hak istimewa yang ingin Anda berikan aksesnya untuk peran ini. Pernyataan template GRANT akan diisi di tab editor baru.

  6. Klik Kirim.

    Jika ada error dalam DDL, konsol Google Cloud akan menampilkan error.

gcloud

Untuk membuat peran database dan memberikan hak istimewa akses terperinci kepadanya, gunakan perintah gcloud spanner databases ddl update dengan pernyataan CREATE ROLE dan GRANT.

Untuk mengetahui detail sintaksis pada pernyataan CREATE ROLE dan GRANT, lihat Bahasa definisi data GoogleSQL.

Misalnya, gunakan perintah berikut untuk membuat peran database dan memberikan hak istimewa kepadanya di satu atau beberapa tabel.

GoogleSQL

gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \
--ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE ROLE_NAME;'

PostgreSQL

gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \
--ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE_NAME;'

Ganti kode berikut:

  • PRIVILEGES adalah daftar hak istimewa kontrol akses terperinci yang dipisahkan dengan koma. Untuk mengetahui informasi tentang hak istimewa, lihat Hak istimewa kontrol akses terperinci.

  • TABLES adalah daftar tabel yang dipisahkan koma.

Misalnya, untuk memberikan SELECT, INSERT, dan UPDATE pada tabel employees dan contractors ke peran database hr_analyst di database hrdb1 dalam instance hr, masukkan pernyataan berikut:

GoogleSQL

gcloud spanner databases ddl update hrdb1 --instance=hr \
--ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_analyst;'

PostgreSQL

gcloud spanner databases ddl update hrdb1 --instance=hr \
--ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_analyst;'

Library klien

Contoh kode ini membuat dan menghapus peran database.

C++

void AddAndDropDatabaseRole(
    google::cloud::spanner_admin::DatabaseAdminClient client,
    std::string const& project_id, std::string const& instance_id,
    std::string const& database_id, std::string const& role_parent,
    std::string const& role_child) {
  google::cloud::spanner::Database database(project_id, instance_id,
                                            database_id);
  std::vector<std::string> grant_statements = {
      "CREATE ROLE " + role_parent,
      "GRANT SELECT ON TABLE Singers TO ROLE " + role_parent,
      "CREATE ROLE " + role_child,
      "GRANT ROLE " + role_parent + " TO ROLE " + role_child,
  };
  auto metadata =
      client.UpdateDatabaseDdl(database.FullName(), grant_statements).get();
  google::cloud::spanner_testing::LogUpdateDatabaseDdl(  //! TODO(#4758)
      client, database, metadata.status());              //! TODO(#4758)
  if (!metadata) throw std::move(metadata).status();
  std::cout << "Created roles " << role_parent << " and " << role_child
            << " and granted privileges\n";

  std::vector<std::string> revoke_statements = {
      "REVOKE ROLE " + role_parent + " FROM ROLE " + role_child,
      "DROP ROLE " + role_child,
  };
  metadata =
      client.UpdateDatabaseDdl(database.FullName(), revoke_statements).get();
  google::cloud::spanner_testing::LogUpdateDatabaseDdl(  //! TODO(#4758)
      client, database, metadata.status());              //! TODO(#4758)
  if (!metadata) throw std::move(metadata).status();
  std::cout << "Revoked privileges and dropped role " << role_child << "\n";
}

C#


using Google.Cloud.Spanner.Data;
using System.Threading.Tasks;

public class AddAndDropDatabaseRoleAsyncSample
{
    public async Task AddDatabaseRoleAsync(string projectId, string instanceId, string databaseId, string databaseRole)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        string createRoleStatement = $"CREATE ROLE {databaseRole}";

        // Creates the given database role.
        using var connection = new SpannerConnection(connectionString);
        using var updateCmd = connection.CreateDdlCommand(createRoleStatement);
        await updateCmd.ExecuteNonQueryAsync();
    }

    public async Task DropDatabaseRoleAsync(string projectId, string instanceId, string databaseId, string databaseRole)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        string deleteRoleStatement = $"DROP ROLE {databaseRole}";

        // Drops the given database role.
        using var connection = new