Bagikan melalui


Pengidentifikasi Keamanan

Pengidentifikasi keamanan digunakan oleh Windows sebagai nilai definitif untuk membedakan entitas keamanan satu sama lain. Misalnya, pengidentifikasi keamanan unik ditetapkan ke setiap akun baru yang dibuat untuk pengguna individual pada sistem. Untuk sistem file, hanya SID ini yang benar-benar digunakan.

Gambar berikut mengilustrasikan struktur pengidentifikasi keamanan.

diagram yang mengilustrasikan struktur pengidentifikasi keamanan.

Selain SID unik, sistem Windows mendefinisikan sekumpulan pengidentifikasi terkenal. Misalnya, Administrator lokal adalah SID terkenal. Windows menyediakan mekanisme dalam kernel untuk mengonversi antara SID dan nama pengguna dalam lingkungan kernel. Panggilan fungsi ini tersedia dari driver ksecdd, yang mengimplementasikan fungsi-fungsi ini dengan menggunakan layanan pembantu mode pengguna. Oleh karena itu, penggunaannya dalam sistem file harus mematuhi aturan yang biasa untuk komunikasi dengan layanan mode pengguna. Panggilan ini tidak dapat digunakan selama I/O file halaman.

Fungsi-fungsinya meliputi yang berikut:

  • SecMakeSPN—membuat string nama penyedia layanan yang dapat digunakan saat berkomunikasi dengan penyedia layanan keamanan tertentu.

  • SecMakeSPNEx—versi tambahan SecMakeSPN. Fungsi ini tersedia di Microsoft Windows XP dan versi Windows yang lebih baru.

  • SecMakeSPNEx2—versi tambahan SecMakeSPNEx. Fungsi ini tersedia di Windows Vista, Windows Server 2008, dan versi Windows yang lebih baru.

  • SecLookupAccountSid—mengingat SID, rutinitas ini akan mengembalikan nama akun. Fungsi ini tersedia di Windows XP dan yang lebih baru.

  • SecLookupAccountName—dengan nama akun, rutinitas ini akan mengambil SID. Fungsi ini tersedia di Windows XP dan yang lebih baru.

  • SecLookupWellKnownSid—mengingat jenis SID terkenal, rutinitas ini akan mengembalikan SID yang benar. Fungsi ini tersedia di Windows Server 2003 dan yang lebih baru.

Selain itu, setiap driver kernel dapat membuat SID dengan menggunakan rutinitas pustaka runtime standar berikut:

Perhatikan bahwa RtlLengthSid dan RtlValidSid mengasumsikan bahwa header tetap 8-byte untuk SID ada. Jadi driver harus memeriksa panjang minimum ini untuk header SID sebelum memanggil fungsi-fungsi ini.

Meskipun ada beberapa fungsi RTL lainnya, ini adalah fungsi utama yang diperlukan saat membuat SID.

Contoh kode berikut menunjukkan cara membuat SID untuk entitas "sistem lokal":

{
    //
    // temporary stack-based storage for an SID
    //
    UCHAR sidBuffer[128];
    PISID localSid = (PISID) sidBuffer;
    SID_IDENTIFIER_AUTHORITY localSidAuthority = 
        SECURITY_NT_AUTHORITY;

    //
    // build the local system SID
    //
    RtlZeroMemory(sidBuffer, sizeof(sidBuffer));
 
    localSid->Revision = SID_REVISION;
    localSid->SubAuthorityCount = 1;
    localSid->IdentifierAuthority = localSidAuthority;
    localSid->SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID;
 
    //
    // make sure it is valid
    //
    if (!RtlValidSid(localSid)) {
        DbgPrint("no dice - SID is invalid\n");
        return(1);
    }
}

Perhatikan bahwa ini juga bisa dilakukan menggunakan fungsi SecLookupWellKnownSid yang diperkenalkan di Windows Server 2003.

Contoh kode berikut menunjukkan cara membuat SID menggunakan fungsi SecLookupWellKnownSid untuk entitas "sistem lokal":

{
    UCHAR sidBuffer[128];
    PISID localSid = (PISID) sidBuffer;
    SIZE_T sidSize;
    status = SecLookupWellKnownSid(WinLocalSid,
                                   &localSid,
                                   sizeof(sidBuffer),
                                   &sidSize);

    if (!NT_SUCCESS(status)) {
      //
      // error handling
      //
    }
  }

Salah satu pendekatan ini valid, meskipun kode terakhir lebih disukai. Perhatikan bahwa contoh kode ini menggunakan buffer lokal untuk menyimpan SID. Buffer ini tidak dapat digunakan di luar konteks panggilan saat ini. Jika buffer SID harus persisten, buffer harus dialokasikan dari memori kumpulan.