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 Jadi, gambar kami menggambarkan "karya seni", yang coba dilindungi oleh penciptanya dari ancaman. Dalam kasus mereka, saya pikir mereka sangat khawatir, karena dengan membuat
situs kencan
okcupid.com , mereka benar-benar ingin memastikan bahwa reputasi pengguna situs tidak akan terpengaruh oleh pengungkapan data pribadi. Dari percakapan dengan salah satu pengembang situs yang menulis artikel tentang ini, diketahui bahwa mereka sebenarnya tidak dikompromikan. Setidaknya, ada kehilangan data akibat penggunaan
OKWS arsitektur dan sebagian karena pemantauan aktivitas berbahaya belum terjadi.
Alasan orang tidak memecah aplikasi mereka menjadi komponen yang lebih kecil adalah karena proses ini membutuhkan usaha. Penting untuk memilih semua bagian kode, mendefinisikan antarmuka yang jelas di antara mereka, dan memutuskan data yang harus diakses oleh setiap komponen. Jika Anda memutuskan untuk mengimplementasikan fungsi baru, Anda harus mengubah data yang dapat diakses oleh setiap komponen program, untuk memberikannya keistimewaan baru atau untuk memilih beberapa, dan seterusnya. Jadi ini adalah proses yang agak memakan waktu.

Mari kita coba memahami bagaimana server web dirancang, dan mungkin satu cara untuk melakukan ini adalah melacak bagaimana permintaan http diproses oleh server
OKWS . Jadi, mirip dengan yang ditunjukkan pada gambar sebelumnya, kami memiliki browser web yang ingin pergi ke
okcupid.com . Para pengembang proyek situs membayangkan bahwa mereka akan memiliki banyak mesin, tetapi kita hanya akan melihat antarmuka situs tempat
OKWS akan bekerja, dan mesin lain di latar belakang yang akan menyimpan database. mesin kedua ini menggunakan
MySQL, karena merupakan perangkat lunak yang baik untuk berbagai tugas. Mereka ingin benar-benar melindungi data ini karena sangat sulit untuk sampai ke disk
mentah atau database dengan datagram mentah mentah.
Jadi, bagaimana cara kerjanya, bagaimana permintaan diproses oleh server
OKWS ? Pertama, ia tiba dan diproses oleh proses yang disebut
okd untuk dispatcher
OKWS . Dia memeriksa apakah dia meminta permintaan ini, dan kemudian melakukan beberapa hal. Karena Anda mungkin perlu mendaftarkan permintaan ini terlebih dahulu, itu mengarahkannya ke komponen yang disebut
oklogd , setelah itu Anda perlu membuat beberapa templat, dan mungkin perlu membuatnya bahkan sebelum permintaan itu tiba. Dan itu komponen lain yang disebut
pubd .

Dan akhirnya, ada layanan yang pasti untuk yang permintaan dikirim, sehingga
OKD ada satu set meja layanan yang mendukung. Agaknya permintaan ini datang ke salah satu layanan ini, jadi setelah meninjau
okd akan mengarahkan permintaan ini ke proses layanan
SVD tertentu. Layanan ini akan melakukan persis apa yang diminta oleh permintaan, misalnya, berlangganan pengguna ke buletin, atau memungkinkan untuk melihat direktori pengguna
ocupid menggunakan database, dll.
Dan untuk ini, Anda mungkin perlu layanan untuk meninggalkan informasi aplikasi di
log komponen
oklogd . Dan pada akhirnya, ia harus "berbicara" dengan database. Pembuat situs ini telah menerapkan proses "komunikasi" ini sedikit berbeda dari yang biasanya terjadi di
Apache , di mana Anda cukup berkomunikasi dengan database dan mengeluarkan pertanyaan
SQL sewenang-wenang. Mereka datang dengan konsep database proxy,
dbproxy, yang terletak di depan
database MySQL, dan menerima permintaan dari
svc layanan, untuk melakukan itu. Saya pikir ilustrasi ini pada dasarnya menunjukkan cara kerja
OKWS .

Ada komponen lain yang memulai semua ini, disebut
okld , dan bertanggung jawab untuk memulai semua proses dalam antarmuka server web ini. Saya berharap beberapa dari hal-hal ini terlihat akrab bagi Anda, karena ini persis arsitektur yang dipertimbangkan di laboratorium. Sepertinya ini desain yang bagus. Anda tidak memiliki
pubd ,
logd dan
dbproxy di LR , tetapi Anda memiliki
okd dan
svc . Ada pertanyaan tentang
OKWS ?
Pemirsa: Kami mengerti benar bahwa
dbproxy tidak mengambil SQL-query, dan jenis lain dari permintaan?
Profesor: ya benar! Seperti apa tampilan antarmuka ini? Mereka tidak menggambarkan ini dengan sangat rinci, tetapi satu hal yang dapat Anda lakukan dengan
dbproxy ini adalah untuk menyimpan banyak argumen untuk templat kueri
SQL . Misalnya, itu bisa menjadi templat permintaan pencarian untuk teman Anda, memilih mereka berdasarkan
ID .

Misalkan ada template seperti "pilih
^ ID dari daftar teman Anda, di mana
^ ID ="% S " . Misalkan Anda ingin menemukan
Alice di antara teman-teman Anda dan mengirim permintaan
S , di mana argumennya adalah
"alice" . Biarkan aplikasi kami, tersedia dalam antarmuka, tahu bahwa
dbproxy siap untuk melakukan tiga jenis permintaan atas namanya. Jika Anda ingin menjalankan kueri No. 1, dan argumennya adalah
"Alice" , maka ia memberi Anda akses ke database.
Pemirsa: dapatkah pengguna eksternal di tingkat peramban web mengirim permintaan seperti itu ke basis data atau apakah semua itu hanya berlaku untuk pengguna internal jaringan?
Profesor: ya, mungkin. Jadi bagaimana cara kerjanya? Bahkan, itu adalah aneh bahwa database terletak pada mesin yang terpisah, karena itu mungkin untuk menghubungkan ke database
OKWS atau ke
server MySQL? Jadi apa yang menghentikan ini?
Pemirsa: firewall?
Profesor: ya, mungkin pada tingkat tertentu. Pengembang tidak menjelaskan hal ini dengan terlalu rinci, tetapi mungkin ada beberapa jaringan internal pada mesin kedua, dan ada pergantian antara antarmuka dan basis data yang tidak dapat dijangkau dari dunia luar. Faktanya, kedua mesin berada di jaringan yang sama, tetapi ada firewall
Fw yang memiliki aturan tertentu. Mungkin mereka adalah Anda hanya dapat terhubung ke komputer antarmuka ini melalui port 80, tetapi tidak secara langsung ke server internal. Ini adalah salah satu opsi perlindungan.

Lain, mungkin, adalah bahwa ketika Anda terhubung ke
proxy database
dbproxy ini, Anda perlu memberikan token kriptografi 20-byte, atau kunci, dan jika Anda tidak menyediakannya,
dbproxy akan menolak koneksi Anda. Jadi aturannya adalah Anda membuka koneksi TCP, mengirim 20 byte, dan jika salah, koneksi ditutup. Ini, saya pikir, adalah arti dari desain sistem semacam itu.
Jadi, mari kita coba mencari tahu bagaimana proses yang berbeda ini diisolasi di sini. Bagaimana Anda bisa memastikan bahwa semua komponen ini tidak saling membanjiri?
Hadirin: hak root dan ID pengguna berbeda?
Profesor: ya, hampir setiap komponen ini bekerja sebagai
uid yang berbeda, jadi di sini, dalam deskripsi sistem, ada seluruh tabel yang menjelaskan untuk setiap komponen di mana ia bekerja dan dengan apa
uid . Jadi kita dapat menulis bahwa
okd memiliki
uid sendiri,
pubd memiliki
uid sendiri dan
oklogd juga memiliki
uid sendiri.
Okld berfungsi sebagai
root , yang agak tidak berhasil, tapi mungkin ini bukan masalah besar. Lalu ada sejumlah pengidentifikasi pengguna yang ditugaskan secara dinamis untuk setiap layanan, misalnya ID 51001, dll.

Dengan demikian, ini memastikan bahwa setiap layanan tidak dapat mengganggu proses layanan lainnya.
Chroot juga banyak digunakan di sini, sehingga beberapa komponen ini memiliki hak
chroot di direktori terpisah. Sebagai contoh,
okd dan
svc diberkahi dengan hak
chroot yang umum di beberapa direktori. Menurut Anda mengapa kedua komponen ini memiliki komponen
chroot yang terpisah dan tidak umum?
Pemirsa: karena
okd tidak memiliki hak akses root.
Profesor: ya, tapi mengapa mereka tidak memasukkan
pubd ,
oklogd , dan semua orang di
chroot yang sama?
Audiens: apakah mungkin jika layanan perlu berbagi banyak data, haruskah mereka diisolasi satu sama lain?
Profesor: bisa. Saya pikir mereka harus berbagi beberapa data, tetapi data ini tidak ada dalam file, mereka ditransfer melalui soket dari
okd ke layanan. Tetapi pada kenyataannya, tidak satu pun dari komponen ini menyimpan sesuatu yang menarik dalam sistem file.
Oleh karena itu, tidak ada yang menarik di direktori
chroot , dan saya pikir orang-orang dari
OKWS hanya memutuskan untuk mengurangi biaya tidak produktif untuk
chroot , seperti kebutuhan untuk membuat salinan direktori. Mungkin mereka juga ingin menyingkirkan beberapa overhead manajemen untuk setiap perintah
chroot . Tetapi karena tidak ada file nyata di sini, maka semuanya beres.
Alasan orang-orang ini memberikan
chroot yang berbeda untuk komponen lingkungan adalah karena beberapa hal menarik. Mungkin ada template, tetapi di sini, mungkin, ada file log, jadi mereka tidak ingin file log dibaca secara tidak sengaja, dan sejenisnya.
Pemirsa bukan apakah file layanan ini, misalnya, ketik
aspx?Profesor: seperti yang mereka jelaskan di artikel, layanan ini adalah biner
C ++ tunggal yang dikompilasi, jadi sebenarnya tidak ada file tambahan.
Ada template, tetapi mereka benar-benar ditransmisikan melalui mekanisme aneh ini:
pubd memiliki template dalam direktori-nya, menampilkannya di beberapa pra-komputer, form rumah di
okd , dan
okd sudah menyediakan template untuk semua layanan melalui panggilan
RPC . Dengan demikian, mereka duduk di memori, tetapi sebenarnya tidak dapat diakses langsung melalui sistem file. Ini adalah desain yang agak paranoid ketika saya bahkan tidak bisa membaca template.
Jadi, apa gunanya memisahkan semua komponen ini? Mengapa kita perlu
oklogd terpisah?
Audiens: untuk menghilangkan kemungkinan menimpa atau memangkas jurnal?
Profesor: ya, jadi kami benar-benar ingin memastikan bahwa jika terjadi kesalahan, jurnal, setidaknya, tidak akan rusak. Dengan demikian, ada file log terpisah yang dapat ditulis oleh
uid ini, dan semua pesan log dikirim sebagai
RPC untuk layanan log ini. Dan bahkan jika semuanya hancur, yah, dengan pengecualian
okld , majalah itu akan tetap tidak terluka.
Hadirin: bagaimana jika Anda secara tidak sengaja menemukan cara untuk membaca majalah dan tidak melihat apa yang telah dilakukan orang lain dengan majalah itu?
Profesor: tidak, saya pikir jika Anda "meretas" suatu layanan,
pubd atau sesuatu yang lain, Anda dapat menulis apa pun di jurnal. Oleh karena itu, membuat
entri oklogd terpisah
masuk akal. Sebenarnya,
oklogd adalah proses yang terpisah, dan tidak hanya diperbarui dengan melampirkan file sebagai file
append-only . Dengan demikian,
oklogd tidak dapat menambahkan beberapa informasi tambahan untuk setiap entri log, karena jika OS mendukung file
append-only , Anda tidak akan tahu bahwa seseorang telah menulis ke file ketika ini terjadi. Sementara
oklogd menempatkan stempel waktu untuk setiap pesan dan memungkinkan Anda untuk mengetahui layanan mana yang membuat rekaman atau berasal dari
okd . Karena itu, Anda benar-benar mendapatkan informasi tambahan dalam file log ini karena ini adalah layanan terpisah.
Dan apa arti pemisahan
okld dan mengapa harus bekerja dengan hak root? Saya pikir ada beberapa alasan untuk ini.
Audiens: jika Anda tidak ingin orang lain bertindak dengan hak akses root, Anda perlu mendelegasikan fungsi otentikasi pengguna
okld .
Profesor: ya. Seseorang harus mengkonfigurasi semua ini
uro chroot , dan Anda perlu
root untuk
Unix ini, jadi
okld menyediakan ini. Ini salah satu alasannya. Ada lagi?
Hadirin: 80 definisi port?
Profesor: Ya, tentu saja! Anda harus mengikat mendengarkan port 80, yang mana
okld dan memberikan hal lain?
Pemirsa: ini melengkapi pembukaan file log
oklogd karena kami tidak ingin membiarkan
oklogd terbuka untuk mencegah akses ke file log.
Profesor: mungkin. Tapi saya tidak tahu apakah pengembang benar-benar melakukannya karena mereka tidak melihat kode sumber mereka. Anda berpikir,
okld membuka file log dan mengirimkannya
oklogd? Mungkin
Hadirin: karena jika tidak, penyerang yang berkompromi dengan
oklogd dapat menghapus seluruh log.
Profesor: ya, itu benar. Mungkin Anda ingin membukanya dalam mode
append dan kemudian meneruskannya
oklogd , maka Anda memiliki jaminan keamanan lebih untuk log. Ini adalah sesuatu yang tidak dapat Anda lakukan tanpa hak root.
Jadi, kami memiliki pertanyaan tentang pekerjaan rumah, apa yang akan terjadi ketika token 20-byte ini “bocor” untuk mengakses database. Kerusakan apa yang dapat menyebabkan ini? Haruskah kita khawatir tentang ini?
Hadirin: dalam hal ini, penyerang dapat mengambil kendali atas layanan tertentu.
Profesor: ya, benar, karena sekarang Anda dapat terhubung dan mendapatkan semua templat kueri. Ini sebenarnya terlihat cukup sederhana. Anda mungkin perlu kompromi salah satu komponen ini agar dapat terhubung ke database server terlebih dahulu. Jadi saya pikir jika Anda memiliki token ini dan Anda dapat kompromi salah satu komponen ini yang ditunjukkan pada gambar, maka Anda dapat menggunakan semua pertanyaan ini.
Sekarang mari kita lihat bagaimana desain
OKWS ini dapat ditingkatkan? Misalnya, akan dimungkinkan untuk mengalokasikan unit
UID terpisah untuk setiap pengguna, selain mengalokasikan
UID terpisah untuk setiap layanan. Di sini, setiap layanan, misalnya, berita, mencari teman, atau membuat akun, memiliki
userid terpisah, tetapi setiap pengguna
OKWS tidak direpresentasikan sebagai
uix Unix . Sebenarnya tidak ada
userid di sini, hanya
ID layanan yang ada di sini. Apakah Anda pikir Anda harus memiliki
uid yang berbeda untuk setiap klien
OKWS ?
Pemirsa: dalam kasus ini, ternyata jika satu pengguna “meretas” suatu layanan, ia akan dapat mengakses semua data pengguna lain dari server ini.
Profesor: ya, benar!
Hadirin: tetapi jika Anda memiliki, pada kenyataannya, layanan terpisah dan
dbproksi terpisah untuk setiap pengguna, maka tidak mungkin untuk mengakses data orang lain.
Profesor: ya, tetapi mungkinkah ini model yang lebih kuat? Saya pikir pengembang
OKWS tidak mengambil langkah seperti itu karena dua alasan. Yang pertama adalah kinerja. Jika Anda memiliki beberapa juta pengguna situs
okcupid , beberapa juta proses yang berjalan, dan beberapa juta
dbproxie , maka overhead kinerja dimungkinkan. Dan ini tidak akan memungkinkan untuk mencapai kinerja yang sama dengan yang
disediakan oleh arsitektur
OKWS .
Pemirsa: deskripsi
OKWS mengatakan bahwa kinerja sistem ini lebih baik daripada sistem lain. Bagaimana ini dicapai?
Profesor: Saya pikir ini sebagian karena mereka menyesuaikan desain mereka dengan beban kerja tertentu, di samping itu, mereka menulis semua ini di
C ++ . Alternatifnya adalah menulis beberapa hal dalam
PHP , maka kemungkinan besar Anda akan mendapatkan manfaat di bagian depan ini.
Selain itu, mereka tidak memiliki banyak fitur yang dimiliki
Apache . Ini memiliki desain tujuan umum, sehingga memiliki banyak proses kerja, dan memuatnya dari waktu ke waktu. Ada banyak koneksi
TTP yang memastikan durasi proses koneksi dan mempertahankan aktivitasnya. Ini juga meningkatkan jumlah proses yang berjalan pada sistem.
Apache telah dibuat lebih universal dan dapat melakukan segala sesuatu yang Anda ingin dapatkan dari server Internet, dan orang-orang dari
OKWS lebih fokus untuk menyelesaikan masalah tertentu.
Tapi saya pikir ada server web lain
hari ini yang mungkin bisa cocok dengan kinerja
OKWS . Misalnya,
Nginx adalah server web yang sangat optimal yang dapat Anda jalankan hari ini. Jika Anda ingin aplikasi berkinerja tinggi di sisi server, Anda mungkin ingin proses panjang sangat mirip dengan layanan
OKWS . Dan itu akan memiliki mekanisme untuk antarmuka gateway
CGI cepat umum untuk menghubungkan program eksternal dengan server web, atau semacam protokol yang dapat digunakan di sisi server untuk mengimplementasikan ini bahkan di
Apache atau
Nginx . Oleh karena itu, saya pikir banyak dari ide-ide ini tidak eksklusif untuk
OKWS , mereka dapat diimplementasikan di server web lain. Mereka hanya menunjukkan bahwa meningkatkan keamanan tidak menghalangi penggunaan "trik" ini. Saya pikir mereka mulai dengan skema yang mirip dengan
Apache , tetapi berpikir itu tidak akan cukup aman.
Jadi saya berpikir bahwa salah satu alasan mengapa pembuat
OKWS tidak ingin memperkenalkan hak istimewa terpisah untuk pengguna adalah kemungkinan penurunan kinerja.

Alasan lain adalah bahwa model aplikasi lengkap mereka “berputar” di sekitar layanan yang mencoba mengakses data masing-masing pengguna, seperti mencari teman di
okcupid atau seseorang yang dapat Anda undang saat kencan. Akibatnya, model isolasi pengguna ini tidak masuk akal, karena, pada akhirnya, harus ada layanan yang Anda kirim permintaan, dan itu akan melihat semua data lain untuk menemukan kecocokan untuk permintaan Anda. Jadi, bahkan jika Anda memiliki pengidentifikasi pengguna atau mekanisme untuk mengisolasi mereka, Anda masih harus membuka akses ke layanan untuk setiap pengguna.
Untuk layanan lain, seperti
Gmail atau
Dropbox , yang jauh lebih fokus pada pengguna tertentu dan tidak memberikan kemampuan terbuka untuk berbagi file, mengisolasi pengguna dapat memberikan lebih banyak keuntungan. Misalnya, di server
Dropbox ada
userid untuk setiap klien
Dropbox . Dan jika ada proses yang berjalan untuk Anda dan proses yang berjalan untuk orang lain, maka bahkan menggunakan exploit berbahaya, Anda tidak akan bisa mendapatkan informasi orang lain.
Sekarang mari kita lihat apakah
OKWS benar-benar berhasil meningkatkan keamanan dalam model server seperti itu. Untuk mengevaluasi keamanan, Anda perlu mempertimbangkan setiap komponen sistem dan menentukan jenis serangan apa yang dapat merusaknya.
Mari kita mulai dengan
okd . Itu dapat diserang dengan permintaan melalui browser, misalnya, menyebabkan buffer overflow. c++, , - ,
okd . ?
: ?
: , , . ?
: , .
: , . , , ,
http , , , . , .
: ?
: , . , , , , ,
match.com . , ,
OkCupid . , - ? ?
: , ,
okd . , ?
: . ,
okd .
: , ?
: ! , , , , , . , , , , . , , . «»
okd , , , .
: DOS-?
: , , , «» «» , DOS- - .
: okd , , …
: , . , ,
okd ,
okd , .
okd , . ,
okd , , , , .
: .
: , . ,
okd . ,
oklogd ? ?
: .
: , , , ?
pubd , , , - .
: , , «»
oklogd .
: , . , ,
append-only , .
: , …
: , , . .
svc ? , , . , ,
okd oklogd . , , .
svc - -, , , . , , , .
okld ? , root. ? , .
dbproxy .
okld ? «»? ?
: , - ?
: , . , , . , , - , , , - . - . root- .
: -, , -
dbproxy .
: !
: , , ,
RPC , , , , , ! .
: , .
dbproxy ? , . , «» ,
dbproxy - .
: ,
svc …
: ,
svc , !
: , , !
: , ,
«» , …
: dbproxy .
: . ,
dbproxy , .
, , . , . , . , , , , .
.
, . ? ? ,
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 ! . c Dell R730xd 5-2650 v4 9000 ?