Menggunakan autentikasi terintegrasi Kerberos untuk menyambungkan ke SQL Server

Unduh driver JDBC

Dimulai di Microsoft JDBC Driver 4.0 untuk SQL Server, aplikasi dapat menggunakan properti koneksi authenticationScheme untuk menunjukkan bahwa ia ingin terhubung ke database menggunakan autentikasi terintegrasi Kerberos tipe 4. Untuk informasi selengkapnya tentang properti koneksi, lihat Mengatur Properti Koneksi ion. Untuk informasi selengkapnya tentang Kerberos, lihat Microsoft Kerberos.

Saat menggunakan autentikasi terintegrasi dengan Java Krb5LoginModule, Anda dapat mengonfigurasi modul menggunakan Class Krb5LoginModule.

Driver Microsoft JDBC untuk SQL Server mengatur properti berikut untuk VM IBM Java:

  • useDefaultCcache = true
  • moduleBanner = false

Driver Microsoft JDBC untuk SQL Server mengatur properti berikut untuk semua VM Java lainnya:

  • useTicketCache = true
  • doNotPrompt = true

Keterangan

Sebelum Microsoft JDBC Driver 4.0 untuk SQL Server, aplikasi dapat menentukan autentikasi terintegrasi (menggunakan Kerberos atau NTLM, tergantung yang tersedia) dengan menggunakan properti koneksi integratedSecurity dan dengan merujuk mssql-jdbc_auth-version-arch.dll><><, seperti yang dijelaskan dalam Membangun URL koneksi.

Dimulai di Microsoft JDBC Driver 4.0 untuk SQL Server, aplikasi dapat menggunakan properti koneksi authenticationScheme untuk menunjukkan bahwa ia ingin terhubung ke database menggunakan autentikasi terintegrasi Kerberos menggunakan implementasi Java Kerberos murni:

  • Jika Anda ingin autentikasi terintegrasi menggunakan Krb5LoginModule, Anda masih harus menentukan properti koneksi integratedSecurity=true . Anda kemudian juga akan menentukan properti koneksi authenticationScheme=JavaKerberos .

  • Untuk terus menggunakan autentikasi terintegrasi dengan mssql-jdbc_auth-version-arch.dll<<>>, cukup tentukan properti koneksi integratedSecurity=true (dan secara opsional authenticationScheme=NativeAuthentication).

  • Jika Anda menentukan authenticationScheme=JavaKerberos tetapi tidak juga menentukan integratedSecurity=true, driver akan mengabaikan properti koneksi authenticationScheme dan akan mengharapkan untuk menemukan nama pengguna dan kredensial kata sandi di string koneksi.

Saat menggunakan sumber data untuk membuat koneksi, Anda dapat secara terprogram mengatur skema autentikasi menggunakan setAuthenticationScheme dan (opsional) mengatur SPN untuk koneksi Kerberos menggunakan setServerSpn.

Pencatat baru telah ditambahkan untuk mendukung autentikasi Kerberos: com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Untuk informasi selengkapnya, lihat Melacak operasi driver.

Panduan berikut akan membantu Anda mengonfigurasi Kerberos:

  1. Atur AllowTgtSessionKey ke 1 di registri untuk Windows. Untuk informasi selengkapnya, lihat Entri registri protokol Kerberos dan kunci konfigurasi KDC di Windows Server 2003.
  2. Pastikan konfigurasi Kerberos (krb5.conf di lingkungan UNIX), menunjuk ke realm dan KDC yang benar untuk lingkungan Anda.
  3. Inisialisasi cache TGT dengan menggunakan kinit atau masuk ke domain.
  4. Ketika aplikasi yang menggunakan authenticationScheme=JavaKerberos berjalan pada sistem operasi Windows Vista atau Windows 7, Anda harus menggunakan akun pengguna standar. Namun jika Anda menjalankan aplikasi di bawah akun administrator, aplikasi harus berjalan dengan hak istimewa administrator.

Catatan

Atribut koneksi serverSpn hanya didukung oleh Microsoft JDBC Drivers 4.2 dan yang lebih tinggi.

Nama perwakilan layanan

Nama perwakilan layanan (SPN) adalah nama tempat klien mengidentifikasi instans layanan secara unik.

Anda dapat menentukan SPN menggunakan properti koneksi serverSpn , atau membiarkan driver membuatnya untuk Anda (default). Properti ini dalam bentuk: "MSSQLSvc/fqdn:port@REALM" di mana fqdn adalah nama domain yang sepenuhnya memenuhi syarat, port adalah nomor port, dan REALM adalah ranah Kerberos dari SQL Server dalam huruf besar. Bagian realm dari properti ini bersifat opsional jika realm default konfigurasi Kerberos Anda adalah realm yang sama dengan Server dan tidak disertakan secara default. Jika Anda ingin mendukung skenario autentikasi lintas realm di mana realm default dalam konfigurasi Kerberos berbeda dari ranah Server, maka Anda harus mengatur SPN dengan properti serverSpn.

Misalnya, SPN Anda mungkin terlihat seperti: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM

Untuk informasi selengkapnya tentang nama perwakilan layanan (SPN), lihat:

Catatan

Sebelum rilis driver JDBC 6.2, untuk penggunaan Cross Realm Kerberos yang tepat, Anda harus secara eksplisit mengatur serverSpn.

Pada rilis 6.2, driver akan dapat membangun serverSpn secara default, bahkan saat menggunakan Cross Realm Kerberos. Meskipun seseorang juga dapat menggunakan serverSpn secara eksplisit.

Membuat file konfigurasi modul masuk

Anda dapat secara opsional menentukan file konfigurasi Kerberos. Jika file konfigurasi tidak ditentukan, pengaturan berikut berlaku:

Sun JVM
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;

IBM JVM
com.ibm.security.auth.module.Krb5LoginModule required useDefaultCcache = true;

Jika Anda memutuskan untuk membuat file konfigurasi modul masuk, file harus mengikuti format ini:

<name> {  
    <LoginModule> <flag> <LoginModule options>;  
    <optional_additional_LoginModules, flags_and_options>;  
};  

File konfigurasi login terdiri dari satu atau beberapa entri, masing-masing menentukan teknologi autentikasi yang mendasar mana yang harus digunakan untuk aplikasi atau aplikasi tertentu. Contohnya,

SQLJDBCDriver {  
   com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;  
};  

Setiap entri file konfigurasi modul login terdiri dari nama yang diikuti oleh satu atau beberapa entri khusus LoginModule. Setiap entri khusus LoginModule dihentikan oleh titik koma dan seluruh grup entri khusus LoginModule diapit kurung kurawal. Setiap entri file konfigurasi dihentikan oleh titik koma.

Selain mengizinkan driver memperoleh kredensial Kerberos menggunakan pengaturan yang ditentukan dalam file konfigurasi modul masuk, driver dapat menggunakan kredensial yang ada. Metode ini dapat berguna ketika aplikasi Anda perlu membuat koneksi menggunakan lebih dari satu kredensial pengguna.

Driver akan mencoba menggunakan kredensial yang ada jika tersedia, sebelum mencoba masuk menggunakan modul masuk yang ditentukan. Dengan demikian, saat menggunakan Subject.doAs metode untuk mengeksekusi kode dalam konteks tertentu, koneksi akan dibuat dengan kredensial yang diteruskan ke Subject.doAs panggilan.

Untuk informasi selengkapnya, lihat File Konfigurasi Login JAAS dan Class Krb5LoginModule.

Dimulai di Microsoft JDBC Driver 6.2, nama entri konfigurasi modul login dapat diteruskan menggunakan properti jaasConfigurationNamekoneksi . Metode ini memungkinkan setiap koneksi untuk memiliki konfigurasi login sendiri atau menggunakan nama selain SQLJDBCDriver.

Membuat file konfigurasi Kerberos

Untuk informasi selengkapnya tentang file konfigurasi Kerberos, lihat Persyaratan Kerberos.

Sampel ini adalah file konfigurasi domain, di mana YYYY dan ZZZZ merupakan nama domain.

[libdefaults]  
default_realm = YYYY.CORP.CONTOSO.COM  
dns_lookup_realm = false  
dns_lookup_kdc = true  
ticket_lifetime = 24h  
forwardable = yes  

[domain_realm]  
.yyyy.corp.contoso.com = YYYY.CORP.CONTOSO.COM  
.zzzz.corp.contoso.com = ZZZZ.CORP.CONTOSO.COM  

[realms]  
        YYYY.CORP.CONTOSO.COM = {  
  kdc = krbtgt/YYYY.CORP. CONTOSO.COM @ YYYY.CORP. CONTOSO.COM  
  default_domain = YYYY.CORP. CONTOSO.COM  
}  

        ZZZZ.CORP. CONTOSO.COM = {  
  kdc = krbtgt/ZZZZ.CORP. CONTOSO.COM @ ZZZZ.CORP. CONTOSO.COM  
  default_domain = ZZZZ.CORP. CONTOSO.COM  
}  

Mengaktifkan file konfigurasi domain dan file konfigurasi modul masuk

Anda dapat mengaktifkan file konfigurasi domain dengan -Djava.security.krb5.conf. Anda dapat mengaktifkan file konfigurasi modul login dengan -Djava.security.auth.login.config.

Misalnya, perintah berikut dapat digunakan untuk memulai aplikasi:

Java.exe -Djava.security.auth.login.config=SQLJDBCDriver.conf -Djava.security.krb5.conf=krb5.ini <APPLICATION_NAME>  

Memverifikasi bahwa SQL Server dapat diakses melalui Kerberos

Jalankan kueri berikut di SQL Server Management Studio:

select auth_scheme from sys.dm_exec_connections where session_id=\@\@spid

Pastikan Anda memiliki izin yang diperlukan untuk menjalankan kueri ini.

Delegasi yang dibatasi

Dimulai di Microsoft JDBC Driver 6.2, driver mendukung Kerberos Constrained Delegation. Kredensial yang didelegasikan dapat diteruskan sebagai objek org.ietf.jgss.GSSCredential, kredensial ini digunakan oleh driver untuk membuat koneksi.

Properties driverProperties = new Properties();
GSSCredential impersonatedUserCredential = [userCredential]
driverProperties.setProperty("integratedSecurity", "true");
driverProperties.setProperty("authenticationScheme", "JavaKerberos");
driverProperties.put("gsscredential", impersonatedUserCredential);
Connection conn = DriverManager.getConnection(CONNECTION_URI, driverProperties);

Koneksi Kerberos menggunakan nama utama, kata sandi, dan realm

Dimulai dari Microsoft JDBC Driver 6.2, driver dapat membuat koneksi Kerberos menggunakan Nama Utama dan Kata Sandi yang diteruskan di string koneksi.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user@REALM;password=****

Properti nama pengguna tidak memerlukan REALM jika pengguna milik default_realm diatur dalam file krb5.conf. Ketika userName dan password diatur bersama dengan integratedSecurity=true; dan authenticationScheme=JavaKerberos; properti , koneksi dibuat dengan nilai userName sebagai Perwakilan Kerberos bersama dengan kata sandi yang disediakan.

Mulai dari Microsoft JDBC Driver 9.4, pengguna dapat menentukan realm untuk autentikasi Kerberos di string koneksi.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user;password=****;realm=REALM

Menggunakan autentikasi Kerberos dari Unix Machines pada domain yang sama

Panduan ini mengasumsikan penyiapan Kerberos yang berfungsi sudah ada. Jalankan kode berikut pada komputer Windows dengan autentikasi Kerberos yang berfungsi untuk memverifikasi apakah yang disebutkan di atas benar. Kode akan mencetak "Skema Autentikasi: KERBEROS" ke konsol jika berhasil. Tidak ada bendera run-time, dependensi, atau pengaturan driver lain yang diperlukan di luar yang disediakan. Blok kode yang sama dapat dijalankan di Linux untuk memverifikasi koneksi yang berhasil.

SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("<server>");
ds.setPortNumber(1433); // change if necessary
ds.setIntegratedSecurity(true);
ds.setAuthenticationScheme("JavaKerberos");
ds.setDatabaseName("<database>");

try (Connection c = ds.getConnection(); Statement s = c.createStatement();
        ResultSet rs = s.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
    while (rs.next()) {
        System.out.println("Authentication Scheme: " + rs.getString(1));
    }
}
  1. Bergabung dengan domain komputer klien ke domain yang sama dengan server.
  2. (Opsional) Atur lokasi tiket Kerberos default. Langkah ini paling mudah dilakukan dengan mengatur KRB5CCNAME variabel lingkungan.
  3. Dapatkan tiket Kerberos, baik dengan membuat tiket baru atau menempatkan yang sudah ada di lokasi tiket Kerberos default. Untuk membuat tiket, gunakan terminal dan inisialisasi tiket melalui kinit USER@DOMAIN.AD tempat "USER" dan "DOMAIN. AD" adalah prinsipal dan domain masing-masing. Sebagai contoh: kinit SQL_SERVER_USER03@EXAMPLE.COM. Tiket akan dibuat di lokasi tiket default atau di KRB5CCNAME jalur jika ditetapkan.
  4. Terminal akan meminta kata sandi, masukkan kata sandi.
  5. Verifikasi kredensial dalam tiket melalui klist dan konfirmasi kredensial adalah kredensial yang ingin Anda gunakan untuk autentikasi.
  6. Jalankan kode sampel di atas dan konfirmasikan bahwa Autentikasi Kerberos berhasil.

Integrasi GSS platform asli

Integrasi GSS platform asli memungkinkan aplikasi Java untuk menggunakan GSS-API asli daripada mekanisme kriptografi implementasi JDK dari GSS-API. Misalnya, kode sampel berikut menunjukkan cara mengaktifkan penggunaan GSS-API asli dalam driver:

GSSCredential credential = GSSManager.getInstance().createCredential(null, GSSCredential.DEFAULT_LIFETIME, new Oid("1.2.840.113554.1.2.2"), GSSCredential.INITIATE_ONLY);

SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL("jdbc:sqlserver://<server>;databaseName=<database>;integratedSecurity=true;authenticationScheme=JavaKerberos;");
ds.setGSSCredentials(credential);
ds.getConnection();

try (Connection conn = ds.getConnection()) {
    ResultSet rs = conn.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
    while (rs.next()) {
        System.out.println("Authentication Scheme: " + rs.getString(1));
    }
}

Selain itu, argumen JVM berikut juga diperlukan:

-Dsun.security.jgss.native=true
-Djavax.security.auth.useSubjectCredsOnly=false

Anda juga dapat secara opsional menyediakan jalur ke pustaka GSS asli.

-Dsun.security.jgss.lib=path/to/native/gss/library // This is optional

Untuk informasi selengkapnya tentang argumen JVM, lihat dokumentasi Java resmi.

Baca juga

Koneksi ke SQL Server dengan driver JDBC