Chrome Doğrulanmış Erişim Geliştirici Kılavuzu

Bu kılavuz hakkında

Chrome Verified Access API, VPN'ler ve intranet gibi ağ hizmetlerine izin verir kriptografik olarak, müşterilerinin gerçek ve sahte olduğunu olduğunu unutmayın. Çoğu büyük işletme, geleneksel proje yönetiminde WPA2 EAP-TLS ağlarına yalnızca kuruluş tarafından yönetilen cihazların eklenmesine izin verme VPN'lerde daha üst düzey erişim ve karşılıklı TLS intranet sayfaları. Mevcut birçok daha önce açıklanmış olabilecek aynı istemci üzerindeki bulgusal kontrollere dayanır olabilir. Bu durum, sinyallerin güvenilir olması ve cihazın yasal durumunun geçerli olduğunu sahte olabilir. Bu kılavuz, olup olmadığını ve durumunun politikalarla uyumlu olup olmadığını çalışırken; adı verilir.

Birincil kitle Kurumsal BT alan yöneticileri
Teknik bileşenler ChromeOS, Google Verified Access API

Doğrulanmış Erişim Ön Koşulları

Doğrulanmış Erişim sürecini uygulamadan önce aşağıdaki kurulumu tamamlayın.

API'yi etkinleştirme

Bir Google API konsolu projesi oluşturun ve API'yi etkinleştirin:

  1. Mevcut bir projeyi oluşturmak veya kullanmak için Google API konsolu.
  2. Şuraya gidin: Etkin API'ler ve hizmetler sayfasına gidin.
  3. Chrome Verified Access API'yi etkinleştirin.
  4. Google Cloud API belgelerindeki talimatları uygulayarak uygulamanız için bir API anahtarı oluşturun.

Hizmet hesabı oluşturma

Ağ hizmetinin meydan okuma hizmet hesabı ve hizmet hesabı anahtarı oluşturma (yeni bir Cloud projesi oluşturmanız gerekmez, aynı projeyi kullanabilirsiniz).

Hizmet hesabı anahtarını oluşturduktan sonra bir hizmet hesabınız olmalı özel anahtar dosyası indirildi. Bu, özel anahtarın tek kopyası olduğundan güvenli bir şekilde saklamayı unutmayın.

Yönetilen bir Chromebook cihazı kaydettirme

Chrome'unuz ile düzgün şekilde yönetilen bir Chromebook cihaz kurulumu gerekir uzantısına sahip olacaktır.

  1. Chromebook cihaz kurumsal veya eğitim amaçlı yönetim için kaydedilmiş olmalıdır.
  2. Cihazın kullanıcısı, aynı alan adından kayıtlı bir kullanıcı olmalıdır.
  3. Doğrulanmış Erişim için Chrome uzantısı cihaza yüklenmiş olmalıdır.
  4. Politikalar, Doğrulanmış Erişim'i etkinleştirmek ve Chrome'u izin verilenler listesine eklemek için yapılandırılır ve temsil eden hizmet hesabının API'ye erişmesine ağ hizmeti (bkz. Google Yönetici Konsolu Yardım dokümanları).

Kullanıcıyı ve cihazı doğrulayın

Geliştiriciler, kullanıcı veya cihaz doğrulaması için Doğrulanmış Erişim'i ya da her ikisini birden kullanabilir (daha fazla güvenlik için:

  • Cihaz doğrulama - Başarılı olursa cihaz doğrulaması bir Chrome cihazın, yönetilen bir alan adına kayıtlı olduğunu ve alan adı tarafından belirtilen doğrulanmış başlatma modu cihaz politikasına uygun yönetici izni gerekir. Ağ hizmetine cihazı görme izni verilip verilmeyeceği (Google Yönetici Konsolu Yardım dokümanlarına bakın), ardından denetleme, izleme veya Directory API'yi çağırmak için kullanılabilen cihaz kimliği.

  • Kullanıcı doğrulaması: Başarılı olursa kullanıcı doğrulaması garanti sağlar oturum açmış bir Chrome kullanıcısının yönetilen kullanıcı olduğunu, kayıtlı bir cihaz kullandığını ve alan adı tarafından belirtilen doğrulanmış başlatma modu kullanıcı politikasına uygun yönetici izni gerekir. Ağ hizmetine, alan adını almak için ek kullanıcı verisi alırsa, sertifika imzalama isteği gönderilirse (İmzalı-ortak-anahtar-ve-yarışma biçiminde CSR veya SPKAC biçiminde olarak da bilinir).

Kullanıcı ve cihaz nasıl doğrulanır?

  1. Sorgu isteyin: Cihazdaki Chrome uzantısı, Doğrulanmış ile iletişime geçer. Kendinizi sorgulamak için API'ye erişin. Sorun, opak bir veri (Google tarafından imzalanmış bir blob) gelen bir şablondur. Bu da Eski bir sınama kullanılırsa sorgulama-yanıt doğrulaması (3. adım) başarısız olur.

    En basit kullanım örneğinde, kullanıcı bir düğmeyi tıklayarak bu akışı başlatır uzantı oluşturur (bu, Google tarafından sağlanan örnek uzantı da yapar).

    var apiKey = 'YOUR_API_KEY_HERE';
    var challengeUrlString =
      'https://verifiedaccess.googleapis.com/v2/challenge:generate?key=' + apiKey;
    
    // Request challenge from URL
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open('POST', challengeUrlString, true);
    xmlhttp.send();
    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState == 4) {
        var challenge = xmlhttp.responseText;
        console.log('challenge: ' + challenge);
        // v2 of the API returns an encoded challenge so no further challenge processing is needed
      }
    };
    

    Meydan okumayı kodlamak için yardımcı kod - API'nin v1 sürümünü kullanıyorsanız kodlanması gerekir.

    // This can be replaced by using a third-party library such as
    // [https://github.com/dcodeIO/ProtoBuf.js/wiki](https://github.com/dcodeIO/ProtoBuf.js/wiki)
    /**
     * encodeChallenge convert JSON challenge into base64 encoded byte array
     * @param {string} challenge JSON encoded challenge protobuf
     * @return {string} base64 encoded challenge protobuf
     */
    var encodeChallenge = function(challenge) {
      var jsonChallenge = JSON.parse(challenge);
      var challengeData = jsonChallenge.challenge.data;
      var challengeSignature = jsonChallenge.challenge.signature;
    
      var protobufBinary = protoEncodeChallenge(
          window.atob(challengeData), window.atob(challengeSignature));
    
      return window.btoa(protobufBinary);
    };
    
    /**
     * protoEncodeChallenge produce binary encoding of the challenge protobuf
     * @param {string} dataBinary binary data field
     * @param {string} signatureBinary binary signature field
     * @return {string} binary encoded challenge protobuf
     */
    var protoEncodeChallenge = function(dataBinary, signatureBinary) {
      var protoEncoded = '';
    
      // See https://developers.google.com/protocol-buffers/docs/encoding
      // for encoding details.
    
      // 0x0A (00001 010, field number 1, wire type 2 [length-delimited])
      protoEncoded += '\u000A';
    
      // encode length of the data
      protoEncoded += varintEncode(dataBinary.length);
      // add data
      protoEncoded += dataBinary;
    
      // 0x12 (00010 010, field number 2, wire type 2 [length-delimited])
      protoEncoded += '\u0012';
      // encode length of the signature
      protoEncoded += varintEncode(signatureBinary.length);
      // add signature
      protoEncoded += signatureBinary;
    
      return protoEncoded;
    };
    
    /**
     * varintEncode produce binary encoding of the integer number
     * @param {number} number integer number
     * @return {string} binary varint-encoded number
     */
    var varintEncode = function(number) {
      // This only works correctly for numbers 0 through 16383 (0x3FFF)
      if (number <= 127) {
        return String.fromCharCode(number);
      } else {
        return String.fromCharCode(128 + (number & 0x7f), number >>> 7);
      }
    };
    
  2. Bir sorgulama yanıtı oluştur: Chrome uzantısı, kendi sorgulamasını kullanır ifadesini kullanın. Bu imzalı ve şifrelenmiş bir sorgulama yanıtı oluşturur. Bu yanıt ağ hizmetine gönderdiği erişim isteğini içerir.

    Bu adımda uzantının ve iletişim için ağ hizmeti kullanımını kapsar. Bu varlıkların her ikisi de uygulanır ve birbirleriyle nasıl konuşacakları belirtilmemiş. (URL kodlamalı) giriş sorgulaması yanıtı, sorgu dizesi olarak parametresini kullanabilirsiniz.

    Meydan okuma yanıtı oluşturmak için örnek bir kod aşağıda verilmiştir:

    Meydan okuma yanıtı oluştur

      // Generate challenge response
      var encodedChallenge; // obtained by generate challenge API call
      try {
        if (isDeviceVerification) { // isDeviceVerification set by external logic
          chrome.enterprise.platformKeys.challengeKey(
              {
                scope: 'MACHINE',
                challenge: decodestr2ab(encodedChallenge),
              },
              ChallengeCallback);
        } else {
          chrome.enterprise.platformKeys.challengeKey(
              {
                scope: 'USER',
                challenge: decodestr2ab(encodedChallenge),
                registerKey: { 'RSA' }, // can also specify 'ECDSA'
              },
              ChallengeCallback);
        }
      } catch (error) {
        console.log('ERROR: ' + error);
      }
    

    Görev geri çağırma işlevi

      var ChallengeCallback = function(response) {
        if (chrome.runtime.lastError) {
          console.log(chrome.runtime.lastError.message);
        } else {
          var responseAsString = ab2base64str(response);
          console.log('resp: ' + responseAsString);
        ... // send on to network service
       };
      }
    

    ArrayBuffer dönüşümü için yardımcı kod

      /**
       * ab2base64str convert an ArrayBuffer to base64 string
       * @param {ArrayBuffer} buf ArrayBuffer instance
       * @return {string} base64 encoded string representation
       * of the ArrayBuffer
       */
      var ab2base64str = function(buf) {
        var binary = '';
        var bytes = new Uint8Array(buf);
        var len = bytes.byteLength;
        for (var i = 0; i < len; i++) {
          binary += String.fromCharCode(bytes[i]);
        }
        return window.btoa(binary);
      }
    
      /**
       * decodestr2ab convert a base64 encoded string to ArrayBuffer
       * @param {string} str string instance
       * @return {ArrayBuffer} ArrayBuffer representation of the string
       */
      var decodestr2ab = function(str) {
        var binary_string =  window.atob(str);
        var len = binary_string.length;
        var bytes = new Uint8Array(len);
        for (var i = 0; i < len; i++)        {
            bytes[i] = binary_string.charCodeAt(i);
        }
        return bytes.buffer;
      }
    
  3. Meydan okuma yanıtını doğrula: Bir reklamverenden sorgulama yanıtı alındığında (mevcut bir kimlik doğrulama protokolünün bir uzantısı olarak) ağ hizmetinin, cihazı doğrulamak için Verified Access API'yi çağırması gerekir (aşağıdaki örnek koda bakın). Adres sahteciliğiyle mücadele etmek için ağ hizmetinin, konuştuğu istemciyi tanımlamasını ve İsteğine istemcinin beklenen kimliğini ekleyin:

    • Cihaz doğrulaması için beklenen cihaz alan adı sağlanmalıdır. , Bu, birçok durumda sabit kodlu bir değerdir çünkü ağ hizmeti belli bir alan adı için kaynakları korur. Bu bilgi bilinmiyorsa bu çıkarımlarda da bulunur.
    • Kullanıcı doğrulaması için beklenen kullanıcının e-posta adresi şu olmalıdır: sağlar. Ağ hizmetinin, kullanıcılarını tanımasını bekleriz (normalde kullanıcıların oturum açmasını gerektirir).

    Google API çağrıldığında, bir dizi kontrol gerçekleştirir. Örneğin:

    • Meydan okuma yanıtının ChromeOS tarafından oluşturulduğunu ve olmadığını doğrulayın. toplu taşımada değiştirildi
    • Cihazın veya kullanıcının kuruluş tarafından yönetildiğini doğrulayın.
    • Cihazın/kullanıcının kimliğinin beklenen ile eşleştiğini doğrulayın kimlik (ikincil sağlanmışsa).
    • Yanıtlanan meydan okumanın şu şekilde olduğunu doğrulayın: yeni (1 dakikadan eski olmamalıdır).
    • Cihazın veya kullanıcının yönetici iznidir.
    • Arayana (ağ hizmeti) arama izni verildiğini doğrulayın API.
    • Arayana ek cihaz edinme izni veya kullanıcı verileri, cihaz kimliğini veya kullanıcının sertifika imzalamayı dahil edin isteğini (CSR) iletir.

    Bu örnekte gRPC kitaplığı kullanılmaktadır

    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.auth.oauth2.ServiceAccountCredentials;
    import com.google.chrome.verifiedaccess.v2.VerifiedAccessGrpc;
    import com.google.chrome.verifiedaccess.v2.VerifyChallengeResponseRequest;
    import com.google.chrome.verifiedaccess.v2.VerifyChallengeResponseResult;
    import com.google.protobuf.ByteString;
    
    import io.grpc.ClientInterceptor;
    import io.grpc.ClientInterceptors;
    import io.grpc.ManagedChannel;
    import io.grpc.auth.ClientAuthInterceptor;
    import io.grpc.netty.GrpcSslContexts;
    import io.grpc.netty.NettyChannelBuilder;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Arrays;
    import java.util.concurrent.Executors;
    
    // https://cloud.google.com/storage/docs/authentication#generating-a-private-key
    private final String clientSecretFile = "PATH_TO_GENERATED_JSON_SECRET_FILE";
    
    private ManagedChannel channel;
    private VerifiedAccessGrpc.VerifiedAccessBlockingStub client;
    
    void setup() {
    
       channel = NettyChannelBuilder.forAddress("verifiedaccess.googleapis.com", 443)
          .sslContext(GrpcSslContexts.forClient().ciphers(null).build())
          .build();
    
       List<ClientInterceptor> interceptors = Lists.newArrayList();
       // Attach a credential for my service account and scope it for the API.
       GoogleCredentials credentials =
           ServiceAccountCredentials.class.cast(
               GoogleCredentials.fromStream(
                   new FileInputStream(new File(clientSecretFile))));
      credentials = credentials.createScoped(
          Arrays.<String>asList("https://www.googleapis.com/auth/verifiedaccess"));
      interceptors.add(
           new ClientAuthInterceptor(credentials, Executors.newSingleThreadExecutor()));
    
      // Create a stub bound to the channel with the interceptors applied
      client = VerifiedAccessGrpc.newBlockingStub(
          ClientInterceptors.intercept(channel, interceptors));
    }
    
    /**
     * Invokes the synchronous RPC call that verifies the device response.
     * Returns the result protobuf as a string.
     *
     * @param signedData base64 encoded signedData blob (this is a response from device)
     * @param expectedIdentity expected identity (domain name or user email)
     * @return the verification result protobuf as string
     */
    public String verifyChallengeResponse(String signedData, String expectedIdentity)
      throws IOException, io.grpc.StatusRuntimeException {
      VerifyChallengeResponseResult result =
        client.verifyChallengeResponse(newVerificationRequest(signedData,
            expectedIdentity)); // will throw StatusRuntimeException on error.
    
      return result.toString();
    }
    
    private VerifyChallengeResponseRequest newVerificationRequest(
      String signedData, String expectedIdentity) throws IOException {
      return VerifyChallengeResponseRequest.newBuilder()
        .setChallengeResponse(
            ByteString.copyFrom(BaseEncoding.base64().decode(signedData)))
        .setExpectedIdentity(expectedIdentity == null ? "" : expectedIdentity)
        .build();
    }
    
  4. Erişim izni ver: Bu adım aynı zamanda ağ hizmetine özeldir. Bu, önerilen (belirtilmemiş) uygulamadır. Yapılabilecek işlemler şunlardır:

    • Oturum çerezi oluşturma
    • Kullanıcı veya cihaz için sertifika verme. Başarılı bir kullanıcı durumunda ağ hizmetine erişim izni verilip verilmediğini kullanıcı verilerine ek olarak (Google Yönetici Konsolu politikası aracılığıyla) kullanıcı tarafından imzalanmış bir CSR alır. Daha sonra bu MT sertifikası alın. Şununla entegrasyon sırasında: MicrosoftR CA kullanıyorsanız ağ hizmeti aracı ve ICertRequest arayüzünden yararlanmamız gerekir.

İstemci sertifikalarını Doğrulanmış Erişim ile kullanma

İstemci sertifikalarını Doğrulanmış Erişim ile kullanma.

Büyük bir kuruluşta birden fazla ağ hizmeti olabilir. (VPN sunucuları, Kablosuz erişim noktaları, güvenlik duvarları ve birden çok intranet sitesi) yararlanabileceğini lütfen unutmayın. Ancak adımların mantığını oluşturmak Bu ağ hizmetlerinin her birinde 2-4 arasındaki (yukarıdaki bölümde) pratik. Çoğu zaman, bu ağ hizmetlerinin çoğu zaten kimlik doğrulamalarının bir parçası olarak istemci sertifikalarının da zorunlu tutulması (örneğin, EAP-TLS veya karşılıklı TLS intranet sayfaları). Kurumsal Sertifika Programı’nın Bu istemci sertifikalarını veren yetkili, 2-4. adımları ve sorgulama yanıtında istemci sertifikasının verilmesini zorunlu kılma bu durumda sertifikaya sahip olmak, bu hak talebinin müşterinin samimi olması ve şirket politikasına uygun olması. Ardından her kablosuz ağ erişim noktası, VPN sunucusu ve benzeri uygulamalar, bu istemci sertifikasını 2-4 arası adımları uygulamanız gerekmez.

Başka bir deyişle, buradaki CA (istemci sertifikasını kuruluşa cihazlar) Şekil 1'deki Ağ Hizmeti rolünü üstlenir. Kullanıcının ve yalnızca yanıt sorgulaması doğrulamasından sonra sertifikayı istemciye sağlama. Sertifikayı Şekil 1'deki 4. Adım - Erişim İzni Verme işleminin eşdeğeridir.

İstemci sertifikalarını güvenli bir şekilde Chromebook'lara alma süreci açıklanmaktadır bu makaleyi inceleyin. Öğe bu paragrafta açıklanan tasarım uygulanır, ardından Doğrulanmış Erişim Uzantısı ve İstemci sertifikası ilk katılım uzantısı tek bir uzantıda birleştirilebilir. Daha fazla bilgi edinin istemci sertifikası ilk katılım uzantısı yazma hakkında daha fazla bilgi edinin.