Institut Teknologi Massachusetts. Kursus Kuliah # 6.858. "Keamanan sistem komputer." Nikolai Zeldovich, James Mickens. Tahun 2014
Keamanan Sistem Komputer adalah kursus tentang pengembangan dan implementasi sistem komputer yang aman. Ceramah mencakup model ancaman, serangan yang membahayakan keamanan, dan teknik keamanan berdasarkan pada karya ilmiah baru-baru ini. Topik meliputi keamanan sistem operasi (OS), fitur, manajemen aliran informasi, keamanan bahasa, protokol jaringan, keamanan perangkat keras, dan keamanan aplikasi web.
Kuliah 1: “Pendahuluan: model ancaman”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 2: "Kontrol serangan hacker"
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 3: “Buffer Overflows: Exploits and Protection”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 4: “Pemisahan Hak Istimewa”
Bagian 1 /
Bagian 2 /
Bagian 3 Hari ini kita akan berbicara tentang berbagi hak istimewa, karena kita berakhir dengan buffer overflows pada tingkat tertentu, tetapi kita akan kembali ke sana. Kami tidak akan membicarakan perincian tentang bagaimana menggunakan buffer overflows, tetapi akan beralih untuk mengurangi masalah ini dan berbicara tentang bagaimana mengembangkan suatu sistem di mana buffer overflows tidak akan menjadi masalah besar bagi Anda, seperti kerentanan lainnya.

Jadi, hari ini kita akan berbicara tentang berbagi hak istimewa sebagai metode yang memungkinkan Anda untuk membuat sistem yang lebih aman, dan dalam materi kuliah kami menyebutkan server web yang disebut
OKWS . Ini bukan contoh yang paling jelas tentang pemisahan hak, tetapi sistem tersebut dijelaskan dengan baik di sana untuk memahami bagaimana semua bagiannya bekerja. Tetapi ini tidak berarti bahwa Anda harus pergi sekarang, unduh
OKWS dan luncurkan situs Anda.
Jadi, sebelum kita menyelami perincian izin
OKWS dan Unix, mari kita lihat apa itu privilege sharing dan mengapa itu ide yang bagus? Pekan lalu, James menunjukkan bahwa jika Anda menulis sebuah program di C, Anda pasti akan memiliki sesuatu yang buruk atau salah di dalamnya. Masalahnya adalah jika Anda memiliki aplikasi yang cukup besar dan ada beberapa kerentanan di dalamnya, maka penyerang dapat terhubung ke program, mengirim permintaan ke aplikasi ini, mengelabui dan melakukan hal-hal "buruk".
Aplikasi apa pun memiliki hak akses. Ini berarti bahwa itu termasuk banyak data yang dapat diperoleh dengan akses. Anda bahkan dapat menghapus file-file ini, seperti yang Anda lakukan di lab nomor 1. Masalahnya adalah bahwa kerentanan dalam aplikasi besar ini dapat memungkinkan penyerang untuk memodifikasi data ini atau mendapatkan hak yang cukup untuk mengelola program jika Anda tidak hati-hati.
Dalam kuliah ini, kita akan melihat apa yang ingin dilakukan oleh hak istimewa berbagi. Layak untuk mengambil program, membaginya menjadi beberapa bagian dan memastikan bahwa masing-masing elemen hanya memiliki hak yang diperlukan untuk melakukan pekerjaannya dengan benar.

Di sebelah kiri, kami memiliki program 3 bagian, dan di sebelah kanan, data, juga terdiri dari tiga bagian. Hak yang diberikan dengan benar berarti bahwa setiap bagian dari aplikasi hanya memiliki akses ke bagian datanya. Dan jika kita memiliki kerentanan dalam program X, maka itu akan memungkinkan kita untuk mengendalikan hanya satu bagian dari data dan tidak akan dapat mempengaruhi data di dua bagian lainnya.
Jadi ide berbagi hak istimewa ini sangat kuat. Itu tidak berfungsi untuk secara khusus mempengaruhi masalah buffer overflows atau kerentanan lainnya, mereka hanya persyaratan umum untuk arsitektur produk perangkat lunak untuk memastikan bahwa kerentanan di satu tempat sistem tidak mempengaruhi bagian lainnya. Pemisahan hak istimewa digunakan cukup luas. Jadi, untuk memastikan isolasi komponen dalam suatu program, mesin virtual sering digunakan.
Anda dapat mengambil sistem besar Anda dan membaginya menjadi sekelompok VM untuk mengisolasi masing-masing bagian, tetapi Anda juga dapat menggunakan Unix untuk benar-benar melakukan isolasi ini dengan "mengiris." Unix menyediakan beberapa mekanisme yang sebenarnya digunakan OKWS untuk memisahkan hak istimewa.
Banyak aplikasi sebenarnya menggunakan praktik pembagian hak istimewa. Kalian mungkin menggunakan SSH, atau "secure shell," cukup sering. Ini adalah protokol jaringan yang digunakan untuk mengontrol OS dan mentransfer file dari jarak jauh. Itu menggunakan hak istimewa berbagi dalam banyak komponen untuk memastikan bahwa kunci enkripsi tidak terurai dan bahwa server tidak akan dikompromikan. Browser web Chrome lebih relevan untuk Anda, di mana pembagian hak istimewa juga diterapkan secara luas. Jadi, jika ada semacam "bug" di Chrome, musuh tidak akan bisa mendapatkan kontrol penuh atas komputer Anda.
Ini adalah ringkasan yang sangat singkat tentang apa itu privilege sharing dan mengapa
OKWS adalah contoh yang menarik. Namun, ia lebih merupakan contoh nyata daripada perangkat lunak penting.
Jadi,
OKWS , seperti yang saya sebutkan, akan menggunakan izin Unix dan semacam mekanisme Unix untuk memisahkan berbagai komponen. Penting bagi kita untuk memahami cara kerja mekanisme keamanan Unix. Unix sebagai alat untuk berbagi hak istimewa adalah penting tidak hanya untuk memahami
OKWS , itu, seperti alat lain untuk isolasi, seperti
UID ,
VM ,
wadah, atau teknologi serupa lainnya, memungkinkan Anda untuk memahami detail proses. Karena ada banyak bagian kompleks dari proses mendapatkan hak akses, dan Anda dapat berurusan dengan penyerang yang akan mengambil keuntungan dari kerentanan bagian-bagian ini. Oleh karena itu, kita akan melihat Unix secara terperinci untuk memahami apa itu dan bagaimana seharusnya terlihat dalam mekanisme keamanan tertentu.
Unix secara historis menjadi contoh terbaik tentang bagaimana membangun mekanisme keamanan. Mekanisme keamanannya muncul dalam proses memuaskan kebutuhan untuk memisahkan pengguna satu sama lain pada sistem Unix yang sama. Pada saat yang sama, diyakini bahwa ada banyak pengguna yang menggunakan komputer yang sama, dan Anda harus memisahkan mereka satu sama lain. Jadi, ini belum tentu merupakan mekanisme tujuan umum, tetapi masih salah satu yang paling umum dan banyak digunakan. Jadi, Chrome mencoba menggunakan banyak mekanisme pembagian hak istimewa dari Unix.
Ketika Anda memikirkan mekanisme perlindungan, Anda harus memikirkan prinsip-prinsipnya, yang berarti ada seseorang dengan hak atau hak istimewa, dan Unix memulai atau mendukung hak-hak ini. Oleh karena itu, saya berpikir bahwa subjek atau subjek Unix adalah suatu proses, karena suatu proses didukung, karena setiap operasi atau permintaan yang kami pertimbangkan dari sudut pandang keamanan harus mengizinkan atau menolak sesuatu. Ini mungkin akan menjadi operasi yang dipanggil oleh proses dengan membuat panggilan sistem
syscall . Yang penting di sini adalah bagaimana kami menggambarkan hak istimewa apa yang dimiliki proses ini.
Selanjutnya, ada objek yang proses kami bertindak sebagai subjek. Dia dapat memodifikasi objek, membacanya, mengamati mereka. Ada banyak objek dalam OS yang harus Anda khawatirkan untuk dilindungi. Menurut Anda, benda apa yang harus kita khawatirkan?
Pemirsa: tentang file!
Profesor: benar, tentang file dan direktori. Apa lagi
Pemirsa: Tentang Soket Jaringan!
Profesor: ya, hebat tentang soket jaringan. Apakah ada hal lain yang terjadi dalam sistem kita?
Pemirsa: proses lainnya.
Profesor: Benar. Sebenarnya, ini mirip dengan apa yang harus dijaga aplikasi atau pengguna, tetapi ada berbagai komponen internal sistem yang juga harus Anda lindungi. Oleh karena itu, proses itu sendiri bukanlah subjek yang membuat panggilan sistem, itu juga sesuatu yang proses lain dapat bertindak. Dia bisa membunuhnya atau membuat yang baru. Oleh karena itu, Anda harus mencari tahu apa aturan untuk memahami suatu proses sebagai objek yang dapat dimanipulasi. Apa hal lain yang bisa membuat kita khawatir?
Hadirin: variabel lingkungan.
Profesor: Saya pikir mereka mungkin bukan subjek yang bisa Anda ubah dalam arti mengelola OC dan memiliki semacam kebijakan keamanan. Saya pikir variabel lingkungan hanyalah semacam keadaan proses yang terkandung dalam memori. Tapi, saya pikir, secara umum, kita peduli dengan bagian proses ini, yang terkandung dalam variabel memori - lingkungan, tumpukan, argumen, ini juga cukup penting. Mungkin, dalam memori proses ada banyak hal yang sensitif terhadap gangguan luar. Apa lagi
Pemirsa: deskriptor file secara umum.
Profesor: ada keadaan internal lain yang sangat penting. File yang ada di disk harus menjadi perhatian kita. Tetapi masih ada alat operasional seperti deskriptor file, yang coba digunakan
OKWS secara luas, dan kita akan lihat apa itu. Apa hal lain yang ingin Anda lindungi dalam sistem operasi?
Pemirsa: perangkat keras, atau perangkat keras.
Profesor: ya, perangkat keras membutuhkan perlindungan tidak kurang dari hal-hal abstrak yang disediakan oleh OS kepada kami, karena kami tidak ingin prosesor kami "membeku" karena suatu alasan.
Hadirin: Anda juga harus memikirkan melindungi periferal!
Profesor: Oh ya! Jadi, perangkat tambahan, Anda benar, terutama pada komputer desktop, ada banyak hal yang tidak perlu: drive USB, webcam, mungkin layar itu sendiri - Anda ingin melindungi sebagian dari ini, karena aplikasi yang terkait dengannya tidak boleh “berjalan-jalan” »Di seluruh layar Anda.
Saya pikir, pada kenyataannya, semua objek ini tidak ada di sisi server, mereka hanya cukup dekat dengannya. Di ponsel Anda, mikrofon mungkin juga merupakan objek yang sangat penting, yang juga ingin Anda lindungi.
Tetapi saya akan meninggalkan daftar ini, karena pada bagian selanjutnya kita terutama akan berbicara tentang aplikasi server, tetapi Anda benar tentang daftar objek. Saya pikir untuk
OKWS ini mungkin daftar hal-hal yang kita bisa lindungi, atau setidaknya yang menggunakan
OKWS .
Jadi, mari kita bicara tentang bagaimana kernel OS memutuskan kapan suatu proses dapat melakukan sesuatu dengan objek-objek ini. Oleh karena itu, pada tingkat tinggi, kami terutama menganggap proses sebagai entitas yang memiliki hak istimewa yang diberikan oleh prinsip ini, dan prinsip dalam sistem Unix adalah hal yang agak rumit.
Ada sesuatu yang disebut
User ID , yang merupakan integer 32-bit. Ada
ID Grup , yang juga merupakan bilangan bulat 32-bit. Faktanya, tidak ada alasan khusus mengapa mereka harus berbeda.

Akan lebih baik jika mereka hanya membuat satu set integer 32-bit, tetapi, sayangnya, Unix memecahnya menjadi dua kategori. Ada bilangan bulat
ID Pengguna , dan bilangan bulat
ID Grup . Ketika kita berbicara tentang suatu proses yang memiliki hak-hak istimewa tertentu, yang kita maksud adalah proses yang terkait dengan nilai
uid tertentu. Biasanya, suatu proses memiliki satu
uid , serta daftar pengidentifikasi
gid grup yang dimiliki proses tersebut. Karena alasan historis, kebetulan mereka digabungkan menjadi satu
gid , dan kemudian digabungkan menjadi daftar pengidentifikasi lainnya. Secara kasar, suatu proses dapat menggunakan hak istimewa yang diwakili oleh semua pengidentifikasi ini. Jadi jika
Anda menyediakan akses ke sesuatu, maka prosesnya dapat melakukan apa saja dengannya.
Sekarang mari kita bicara tentang file, direktori, dan jenis objek lainnya. Jadi apa yang terjadi pada file, atau lebih tepatnya, cara membuat izin Unix untuk bekerja dengan file? Semuanya relatif sederhana dengan file, Anda khawatir tentang operasi yang dapat dilakukan dengan mereka: membaca, menulis, mungkin mengeksekusi, serta kemampuan untuk mengubah izin itu sendiri atau properti keamanan lainnya.
Hadirin: putus ikatan!
Profesor: ya, putus tautan,
putuskan tautan - apa yang menurut Anda merupakan properti dari file atau direktori itu sendiri? Sebenarnya perbedaan ini sedikit tidak jelas. Ketika Unix berpikir tentang menghapus file, ini lebih tentang direktori, karena pada Unix, file tersebut benar-benar sebuah
inode , atau inode. Oleh karena itu, di Unix, Anda dapat memiliki beberapa tautan keras ke
inode dan ketika Anda memutuskan nama file Unix tertentu menggunakan
tautan, Anda sebenarnya hanya menghancurkan satu dari nama file, tetapi mungkin memiliki nama lain dan tautan lain ke sana. Sebenarnya, penting apakah Anda diizinkan untuk mengubah direktori yang menunjuk ke file, dan pada saat yang sama tidak melakukan apa pun dengan
inode file itu sendiri. Jadi biasanya
membatalkan tautan ,
menautkan ,
mengganti nama , dan
membuat operasi adalah operasi yang terkait dengan direktori, jadi buat mempengaruhi direktori dan file baru. Karena itu, kita harus mencari tahu aturan apa yang berlaku di sana.

Untuk memutuskan bahwa seseorang dapat membaca atau menulis file, kita akan memasukkan beberapa izin, atau bit, ke file
inode . Di Unix, setiap
inode yang pada akhirnya adalah file atau direktori memiliki beberapa bidang yang menarik untuk alasan keamanan. Ini adalah ID pengguna dan pengenal grup, yang, seperti kita katakan, memiliki file atau memiliki direktori. Dengan demikian, Anda dapat mengelola semua file di direktori home Anda karena fakta bahwa Unix memiliki
uid Anda.
Unix juga memiliki seperangkat bit izin yang dapat dianggap sebagai bagian dari matriks, dalam desain dasar mereka terlihat seperti
r (baca),
w (tulis) dan
x (eksekusi). Kami dapat menentukan izin ini untuk berbagai entitas, dan di Unix mereka ditentukan untuk pemilik
pemilik , yaitu, untuk
inode uid , untuk grup
grup tempat file yang diberikan, yaitu, untuk
gid , dan untuk semua lainnya -
lainnya .
Anda dapat mengisi matriks biner 3 kali 3 ini, di mana 1 berarti izin untuk melakukan tindakan tertentu, dan 0 melarang eksekusi:

Ini adalah cara Unix menyimpan izin. Ada cara tradisional untuk mengkodekan hal-hal ini yang akan sering Anda lihat dan yang mungkin perlu disebutkan. Pada Unix, matriks ini dikodekan sebagai angka oktal, sehingga setiap baris di sini harus dianggap sebagai angka dasar 8, jadi matriks kami dalam pengkodean ini akan terlihat seperti ini:
r adalah 4 bit,
w adalah 2 bit,
x adalah 1 bit, masing-masing,
pemilik - itu 6 bit, dan
grup dan
lainnya masing
- masing berisi 4 bit.

Anda akan sering melihat sebutan tersebut dalam materi kuliah, sehingga Anda dapat mengatakan bahwa file ini memiliki resolusi 6, 4, 4, yaitu, pemilik dapat membaca dan menulis file, dan pemilik grup dan yang lainnya hanya dapat membacanya.
Notasi-notasi ini memberi tahu kami kapan harus membaca, menulis, dan mengeksekusi file. Bagaimana dengan mengubah izin untuk file ini? Ini bukan pertanyaan yang adil, tapi apa yang kalian pikirkan tentang ini? Bagaimana kita memutuskan bahwa seseorang harus dapat mengubah izin ini karena ini mungkin juga diperlukan? Ada pemikiran tentang ini?
Pemirsa: apakah orang ini memiliki akses ke file?
Profesor: mungkin itu juga tergantung pada hak akses. Di sisi lain, Anda dapat membuat file yang dapat ditulis ulang yang dapat ditimpa yang ingin Anda bagikan dengan seseorang sehingga ia dapat membaca, menambahkan, dan memodifikasi file Anda, tetapi kemudian itu juga berarti bahwa Anda dapat secara tiba-tiba mengubah izin untuk membuat file tersebut tidak dapat ditulis ulang atau ditetapkan hanya untuk diriku sendiri.
Oleh karena itu, pembuat Unix memutuskan bahwa jika Anda memiliki file, yaitu,
uid Anda sesuai dengan
uid yang dimasukkan dalam file, maka secara default Anda dapat mengubah izin. Kalau tidak, Anda tidak bisa. Jadi, jika Anda hanya memiliki
gid dan
grup ini memiliki semua izin dalam file, Anda masih tidak dapat mengubah izin untuk file ini. Anda bisa membaca, menulis ulang, melakukan apa saja dengan itu, tetapi tanpa
uid Anda tidak dapat mengubah izin.
Direktori Unix mengikuti aturan yang sama. Dengan demikian, melepaskan
tautan dan menautkan entri
tautan dalam direktori berarti Anda memiliki izin untuk menulis ke direktori ini. Jika Anda ingin mengganti nama file, maka Anda mungkin harus memiliki akses tulis ke direktori tempat Anda mendapatkannya, dan menulis akses ke direktori tempat Anda meletakkannya. Dalam beberapa kasus, tautan keras dapat menyebabkan masalah, dan dalam materi kuliah, detail ini disorot.
Bahkan, ada operasi lain yang menarik di katalog - pencarian. Berkat dia, Anda dapat dengan mudah menemukan file di direktori. Unix mengkodekan
mengeksekusi izin sebagai kemampuan untuk mengimplementasikan pencarian direktori, jadi memiliki izin
mengeksekusi untuk direktori sebenarnya berarti dapat mencari nama file tertentu. Mungkin Anda tidak perlu memiliki izin ke direktori untuk mencari nama file, tetapi jika Anda tidak memiliki izin baca, Anda tidak akan dapat melihat isi direktori, yaitu menemukan file. Ini berguna dalam beberapa situasi di mana Anda perlu membatasi tindakan dengan beberapa file atau menyembunyikannya dari pengguna.
Mari kita lihat sebuah contoh. Apa yang terjadi pada Unix jika saya memasukkan perintah
terbuka ("/ etc / password") ? Apa yang memeriksa kernel sistem atas nama saya ketika saya memerintahkannya untuk melakukan panggilan sistem?
Hadirin: Apakah ini memeriksa apakah Anda memiliki izin untuk dieksekusi, dll?
Profesor: Ya, sampai batas tertentu inilah masalahnya. Saya perlu melakukan sesuatu, dll.
Hadirin: dan kemudian jalankan tebasan yang ditentukan!
Profesor: ya, sebenarnya saya perlu melihat apa yang ditunjukkan
/ etc ? Jadi jika saya tidak mengetahui
izin root - hak, ini tidak akan berhasil.
Pemirsa: maka Anda perlu membaca
/ etc / password .
Profesor: ya, itu masuk akal. Ini ada sedikit teka-teki untuk Anda. Misalkan MIT membuat grup untuk semua orang yang terkait dengan kursus 6.858, dan grup lain untuk semua TA di MIT, yang dalam terminologi Unix ditetapkan sebagai
gids , tetapi mereka tidak termasuk dalam grup TA 6.858 karena beberapa alasan konyol. Bagaimana saya bisa membuat file yang hanya akan tersedia untuk grup 6,858 TA?
Misalkan saya memiliki 6.858 gid dan TAs gid, tetapi saya hanya dapat memasukkan satu
gid ke dalam file.
Hadirin: Anda tidak akan dapat melakukan ini, karena di sini Anda mungkin memiliki TA, bukan 6,858 TA.
Profesor: ya, itu benar. Meskipun ada siswa dalam grup 6.858 yang merupakan TA dari kelas lain, jadi mungkin ini tidak terlalu bagus. Tetapi, bagaimanapun, mari kita coba untuk membuat persimpangan dari kelompok-kelompok ini. Untuk melakukan ini, kita dapat menggunakan mekanisme izin.
/foo/bar/grades ,
foo ,
gid 6.858 . , ,
/foo .
/bar ,
gid TAs, .
/foo/bar/ ,
grades . , .
: , , , , 6.858 gid, TA - - 6.858 ?
: , . , , , Unix , , , , , . ,
MACS — mandatory accesscontrol systems, . , , : , . . , - .
Unix , , , TA - , Unix . , - . - , Unix , , . , , . , , , . , . Unix.
, , , , - , . - , , , .
, , Unix.
, — .
OKWS , Unix . Unix , . , «» , .
, : , . , . - , , Unix – , , , , .
– Unix - , .
OKWS , . , , , - , . , , , - . - , .
, . , , .
? ? ? Unix . , , – Unix ,
ptrace .

. , , , , , . , ,
web ,
gid TAs, .
, , .
userid .
ptrace —
uid uid .
ptrace Linux . , , , - , , , . - . , ID.
27:50
:
Kursus MIT "Keamanan Sistem Komputer". 4: « », 2.
, . ? ? ,
30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).
Dell R730xd 2 ? 2 Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 $249 ! . kelas menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?