Anda memiliki beberapa pertanyaan berbeda di sini, jadi saya akan menjatuhkan mereka secara individual:
"Saya telah membaca bahwa ini adalah praktik terbaik untuk tidak membiarkan pengguna menggunakan login secara langsung, alih-alih menggunakan Otentikasi Windows"
Anda mencampur dua hal di sini: konsep SA, dan konsep otentikasi SQL dan otentikasi Windows.
Otentikasi SQL adalah daftar nama pengguna dan kata sandi yang disimpan di setiap dan setiap SQL Server. Fakta bahwa itu disimpan dalam SQL adalah masalah pertama. Jika Anda perlu mengubah kata sandi login, Anda harus mengubahnya di setiap server (atau memelihara kata sandi yang berbeda di server yang berbeda). Dengan otentikasi Windows, Anda dapat menonaktifkan login secara terpusat, mengubah kata sandi, mengatur kebijakan, dll.
Jika Anda memilih untuk menggunakan otentikasi SQL, maka SA hanyalah satu login otentikasi SQL. Itu adalah nama pengguna administrator default, sama seperti Administrator dalam otentikasi Windows. Ini memiliki kekuatan super lokal pada satu contoh itu, tetapi tidak kekuatan super global di semua contoh.
"... dan mengizinkan hak akun sysadmin (atau grup akun) itu."
Apa pun metode otentikasi yang Anda pilih, idealnya Anda ingin mengikuti prinsip hak istimewa: memberi orang hak minimum yang mereka butuhkan untuk menyelesaikan pekerjaan, dan tidak lebih.
Jangan menganggap mereka hanya sebagai login - mereka adalah orang-orang yang dapat membuat Anda dipecat. Jika mereka menjatuhkan database atau menonaktifkan pekerjaan cadangan Anda secara tidak sengaja, mereka tidak akan dipecat, karena secara default, SQL tidak melacak siapa yang melakukan apa. Kaulah yang akan dipecat karena itu akan terjadi, dan kamu tidak akan bisa mengatakan orang mana yang melakukannya.
"Bagaimana praktik terbaik meningkatkan keamanan instance SQL Server saya?"
Anda ingin melakukan dua hal:
- Hentikan orang dari memecahkan server
- Ketika mereka memecahkan server, dapat mengidentifikasi dengan tepat siapa yang melakukannya
Yang pertama dilakukan dengan prinsip privilege: memberi orang hanya izin yang mereka butuhkan, dan tidak lebih.
Yang kedua dilakukan dengan memberikan masing-masing orang login mereka sendiri, tidak mengizinkan login bersama (seperti membiarkan semua orang menggunakan nama pengguna / kata sandi yang sama), dan idealnya, mengaudit login. Anda mungkin tidak akan langsung melakukan bagian terakhir itu, karena agak menyakitkan, tetapi mari kita letakkan potongan-potongan itu di tempat pertama sehingga Anda dapat menambahkan audit nanti setelah seseorang menjatuhkan database dan atasan Anda ingin tahu mengapa.
Saya tahu apa yang Anda pikirkan: "Tapi kami sedang mengkode aplikasi, dan aplikasi itu perlu login." Ya, berikan aplikasi loginnya sendiri, dan pengembang perlu tahu kata sandi itu, tetapi login itu harus dilucuti dari izin sehingga tidak ada orang waras yang ingin menggunakannya. Sebagai contoh, itu mungkin harus di peran db_datareader dan db_datawriter saja, tidak ada yang lain. Dengan begitu ia dapat menyisipkan, memperbarui, menghapus, dan memilih data, tetapi tidak harus mengubah skema, menambah indeks, mengubah prosedur tersimpan, dll.
"Apakah ini hanya berlaku untuk mesin virtual produksi, atau juga mesin pengembangan internal kami?"
Saya pikir itu berlaku sama banyak untuk contoh pengembangan karena saya biasanya khawatir orang melanggar hal-hal. Orang-orang suka memecahkan server dalam pengembangan. Dan tentu saja, ketika saatnya untuk menggabungkan daftar perubahan untuk bermigrasi ke produksi, saya perlu tahu apakah indeks tertentu benar-benar penting untuk aplikasi atau apakah beberapa orang bodoh hanya menjalankan Penasihat Penyesuaian Database dan menyuruhnya untuk menerapkan semua perubahan . Izin yang tepat membantu mengurangi rasa sakit itu.