Mengamankan server web di Linux

Halo, Habr!

Kami belum menerbitkan buku-buku baru apa pun di Linux untuk pemula sejak lama - dan sekarang kami sedang melakukan terjemahan produk-produk baru dari rencana semacam itu. Buku Clinton, Linux in Action , yang diterbitkan oleh Manning, memberi tahu kita tidak hanya tentang struktur internal Linux , tetapi juga tentang masalah yang paling umum dan bagaimana cara memperbaikinya.


Penulis telah menerbitkan kutipan dari bab ke-9 di situs web Hackernoon, yang kami sarankan Anda evaluasi.

Merakit server LAMP, cara mengonfigurasinya, memastikan pemrosesan data yang andal, mengonfigurasi area subjek, dan mengurus sertifikat TLS hanya setengah jalan menuju kemenangan. Anda juga perlu memastikan infrastruktur Anda terlindungi dari berbagai ancaman Internet yang mengerikan.

Dalam artikel ini, kami memeriksa keamanan situs web dengan mempelajari cara bekerja dengan benar dengan grup sistem, memastikan isolasi proses, dan secara teratur mengaudit sumber daya sistem. Tentu saja, cerita ini tidak lengkap (buku Linux yang sedang beraksi juga membahas topik lain, misalnya, menginstal sertifikat TLS dan bekerja dengan SELinux), tetapi ini sudah cukup untuk memulai.

Kelompok sistem dan prinsip hak minimum


Pengembang yang Anda dukung (akhirnya) mulai menyadari bahwa perlu untuk membatasi akses umum ke data dan file konfigurasi yang terletak di server aplikasi, tetapi pada saat yang sama, untuk membiarkan akses tersebut terbuka untuk berbagai programmer dan tim TI lainnya.

Bagian pertama dari solusinya adalah kelompok . Grup adalah objek dalam sistem (seperti pengguna) dengan peringatan bahwa tidak ada pengguna yang akan masuk ke sistem sebagai grup. Kekuatan kelompok terletak pada kenyataan bahwa mereka, seperti pengguna, dapat "ditugaskan" ke file atau direktori, yang memungkinkan setiap anggota grup untuk menggunakan hak istimewa yang disediakan untuknya. Ini diilustrasikan di bawah ini.

Pengembang dalam grup Pengembang dapat mengakses direktori tertentu, dan untuk pengguna yang bukan anggota grup ini, direktori akan ditutup
Coba sendiri: buat file baru di editor teks. Tulis teks biasa ke dalamnya, misalnya, "Hello World", sehingga Anda dapat langsung melihat kapan file itu berhasil diakses. Kemudian edit izin menggunakan chmod 770 sehingga pemilik file dan anggota grup tempat ia memiliki hak penuh untuk bekerja dengan file tersebut, sementara yang lain tidak dapat membacanya.

 $ nano datafile.txt $ chmod 770 datafile.txt 

Jika sistem Anda belum memiliki akun pengguna lain selain milik Anda, buat akun seperti itu baik menggunakan adduser - ini dilakukan di Debian / Ubuntu - atau menggunakan useradd , seperti biasa di CentOS. Perintah useradd akan bekerja di Ubuntu juga.

Perintah useradd , tidak seperti adduser Debian adduser mengharuskan kata sandi pengguna dibuat secara terpisah:

 # useradd otheruser # passwd otheruser Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully 

Menggunakan perintah su , kami beralih ke pengguna baru. Setelah kami memasukkan kata sandi, semua perintah berikut akan dieksekusi atas nama pengguna ini. Anda akan bekerja atas nama pengguna khusus ini; tidak lebih dan tidak kurang. Jika Anda mencoba membaca file data datafile.txt (menggunakan cat ), maka tidak ada lagi yang akan berhasil untuk Anda; seperti yang Anda ingat, hanya anggota grup yang memiliki hak baca. Setelah selesai, ketik exit untuk keluar dari shell pengguna baru dan kembali ke shell asli Anda.

 $ su otheruser Password: $ cat /home/ubuntu/datafile.txt cat: /home/ubuntu/datafile.txt: Permission denied $ exit 

Semua ini diharapkan dan cukup dimengerti. Seperti yang Anda lihat, ketika Anda tidak bisa membaca file milik pengguna lain, ini terkadang menjadi masalah. Mari kita lihat apa yang dapat Anda lakukan dengan mengaitkan file dengan grup, dan kemudian mengkonfigurasi dengan benar izin file.

Kami akan membuat grup baru yang dengannya kami dapat mengelola data aplikasi kami, dan kemudian mengedit properti file data kami menggunakan chown . Argumen ubuntu: app-data-group meninggalkan kepemilikan file kepada pengguna Ubuntu, tetapi grupnya berubah ke yang baru: app-data-group.

 # groupadd app-data-group # chown ubuntu:app-data-group datafile.txt 

Jalankan ls untuk mendapatkan output "diperluas" dari file ini dan melihat izin dan status barunya. Harap dicatat: seperti yang diharapkan, file tersebut dimiliki oleh pengguna ubuntu milik grup app-data-group .

 $ ls -l | grep datafile.txt -rwxrwx โ€” โ€” 1 ubuntu app-data-group 6 Aug 9 22:43 datafile.txt 

Anda dapat menggunakan usermod untuk menambahkan pengguna Anda ke app-data-group , dan kemudian menggunakan perintah su untuk beralih ke shell di mana akun pengguna lain dikerahkan. Sekarang, meskipun hak akses ke file memblokirnya dari semua "orang lain" - dan Anda jelas merupakan pengguna "berbeda" saat ini - Anda harus membaca file ini dengan bebas, karena Anda termasuk dalam grup yang diperlukan.

 # usermod -aG app-data-group otheruser $ su otheruser $ cat datafile.txt Hello World 

Menggunakan perintah su , kami beralih di antara akun pengguna. Mereka direkam dalam file datafile.txt saya. Organisasi semacam itu adalah cara yang tepat dan efektif untuk menghilangkan berbagai masalah kompleks dengan hak akses yang mungkin timbul dalam sistem multi-pengguna.

Pada kenyataannya, ini digunakan tidak hanya untuk memberikan hak akses yang diperlukan bagi pengguna individu - banyak proses sistem juga tidak akan dapat melaksanakan tugas mereka jika mereka tidak ditentukan keanggotaan dalam kelompok yang diperlukan. Anda dapat melihat file / etc / group secara diagonal - perhatikan berapa banyak proses sistem milik grup Anda sendiri ...

Daftar singkat dari isi file / etc / group:

 $ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: [โ€ฆ] 

Isolasi Proses Kontainer


Mungkin Anda khawatir bahwa banyak layanan yang berjalan di server yang sama akan berisiko jika setidaknya salah satu dari layanan ini dikompromikan? Salah satu opsi untuk memuluskan kerusakan yang dapat ditimbulkan oleh pengguna yang ceroboh atau jahat adalah mengisolasi sumber daya dan proses sistem. Jadi, bahkan jika seseorang ingin memperluas otoritasnya di luar batas yang ditetapkan, ia tidak akan mendapatkan akses fisik ke data.

Sebelumnya, diputuskan untuk menyelesaikan masalah ini sebagai berikut: setiap layanan dialokasikan mesin fisiknya sendiri. Namun, virtualisasi membuatnya lebih mudah dan lebih murah untuk membangun arsitektur "mesh". Hari ini, arsitektur ini sering disebut sebagai microservice dan memungkinkan Anda untuk menjalankan banyak wadah sekaligus, di mana salah satu di antaranya, misalnya, basis data dapat berfungsi, di sisi lain - Apache, dan di file media ketiga yang dapat disematkan di laman web Anda. Arsitektur microservice memungkinkan tidak hanya untuk secara signifikan meningkatkan produktivitas dan efisiensi, tetapi juga secara signifikan mengurangi risiko peretasan setiap komponen individu.

"Wadah" yang saya bicarakan tidak harus meyakinkan dengan LXC. Teknologi wadah lainnya seperti Docker menjadi jauh lebih populer saat ini.

Memeriksa nilai ID pengguna yang berbahaya


Tentu saja, setiap pengguna dengan hak administrator untuk sementara waktu dapat menyediakan akses root dengan sudo , tetapi hanya admin yang merupakan admin sebenarnya. Seperti yang sudah Anda ketahui, tidak aman untuk melakukan fungsi biasa di bawah akses root. Namun, ini dapat terjadi - baik murni karena kecelakaan atau karena penipuan data berbahaya - bahwa pengguna biasa akan memiliki hak administratif tanpa gangguan.

Dalam hal ini, ada baiknya bahwa tidak sulit untuk mengidentifikasi penipu tersebut: ID pengguna dan / atau grup mereka, seperti yang dimiliki administrator, adalah "0". Lihatlah file passwd di direktori / etc /. File ini berisi catatan untuk setiap akun pengguna sistem dan reguler yang sudah ada di sistem. Kolom pertama berisi nama akun (dalam hal ini, root dan ubuntu), dan kolom kedua berisi x bukan kata sandi (jika kata sandi ada, itu akan dienkripsi dalam file / etc / shadow). Tetapi dua bidang berikut berisi ID pengguna dan grup. Dalam kasus ubuntu dalam contoh ini, kedua ID adalah 1000. Dan administrator, seperti yang Anda lihat, memiliki nol di sini.

 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash [โ€ฆ] ubuntu:x:1000:1000::/home/ubuntu:/bin/bash 

Jika Anda pernah bertemu dengan pengguna biasa dengan ID pengguna atau grup = 0, maka Anda dapat yakin bahwa masalahnya tidak bersih dan bahwa situasinya perlu diperbaiki. Cara cepat dan mudah untuk mengidentifikasi masalah seperti itu adalah dengan memeriksa passwd dengan perintah awk , yang akan menampilkan semua baris di bidang ketiga yang tidak ada apa pun selain 0. Dalam kasus saya (Anda dapat menghembuskan napas) hanya ada satu baris seperti itu - root. Anda dapat menjalankannya kembali dengan mengganti $ 4 dengan $ 3 - ini akan memeriksa bidang ID grup.

 $ awk -F: '($3 == โ€œ0โ€) {print}' /etc/passwd root:x:0:0:root:/root:/bin/bash 

Audit Sumber Daya Sistem


Semakin banyak barang yang ada di sistem Anda, semakin tinggi kemungkinan sesuatu di dalamnya akan pecah. Karena itu, bijaksana untuk melacak apa yang berhasil dan bagaimana. Dalam hal ini, kita berbicara tentang port jaringan (jika port "terbuka", maka menurut definisi itu harus menjadi pintu masuk), layanan (jika layanan aktif, maka mungkin untuk menggunakannya) dan tentang program yang diinstal (jika program diinstal, harus kemampuan untuk melakukannya).

Agar audit bermanfaat, itu harus lebih atau kurang teratur. Karena kita semua pelupa, jauh lebih baik untuk menulis alat audit dalam skrip khusus yang tidak hanya akan dieksekusi secara teratur, tetapi idealnya menguraikan hasilnya untuk membuatnya lebih mudah dibaca.

Namun, di sini, saya memperkenalkan Anda kepada tiga alat audit utama yang akan membantu Anda melihat port terbuka, layanan aktif, dan paket perangkat lunak yang tidak perlu. Tugas Anda adalah untuk mengotomatisasi semua ini.

Pemindaian port


Port dianggap โ€œterbukaโ€ jika host menjalankan proses yang mendengarkan permintaan pada port ini. Mengawasi port terbuka Anda, Anda akan lebih memahami apa yang sebenarnya terjadi di server Anda.

Anda sudah tahu bahwa port HTTP (80) dan SSH (22) mungkin harus terbuka di server web biasa, jadi mereka tidak akan mengejutkan Anda. Tetapi jauh lebih penting untuk memperhatikan hasil lain yang tidak terduga. Perintah netstat menampilkan semua port terbuka, serta satu ton informasi tentang bagaimana mereka digunakan.

Dalam contoh ini, kami menguji server multiguna yang sangat tipikal, dan perintah -n memberi tahu netstat untuk mengaktifkan semua port numerik dan alamat. -l hanya termasuk soket pendengaran, dan -p menambahkan ID proses dari program mendengarkan. Wajar jika Anda melihat sesuatu - bertindak.

 # netstat -npl Active Internet connections (only servers) Proto Local Address Foreign Address State PID/Program name tcp 127.0.0.1:3306 0.0.0.0:* LISTEN 403/mysqld tcp 0.0.0.0:139 0.0.0.0:* LISTEN 270/smbd tcp 0.0.0.0:22 0.0.0.0:* LISTEN 333/sshd tcp 0.0.0.0:445 0.0.0.0:* LISTEN 270/smbd tcp6 :::80 :::* LISTEN 417/apache2 [โ€ฆ] 

Dalam beberapa tahun terakhir, ss digunakan lebih banyak daripada netstat . Untuk jaga-jaga: jika suatu malam Anda menemukan diri Anda di perusahaan dan seseorang bertanya tentang ss, maka contoh ini (yang mencantumkan semua koneksi SSH yang diinstal) harus cukup informatif sehingga Anda tidak dapat menghadapi kotoran:

 $ ss -o state established '( dport = :ssh or sport = :ssh )' Netid Recv-Q Send-Q Local Address:Port Peer Address:Port tcp 0 0 10.0.3.1:39874 10.0.3.96:ssh timer:(keepalive,18min,0) 

Memeriksa Layanan Aktif


Jika Anda mengambil snapshot cepat dari layanan yang dikelola oleh system dan saat ini aktif di komputer Anda, mesin akan membantu mengidentifikasi aktivitas yang tidak diinginkan. Perintah systemctl dapat membuat daftar semua layanan yang ada, dan kemudian daftar mereka dapat dipersempit menjadi layanan yang deskripsinya enabled . Jadi hanya layanan aktif yang akan dikembalikan.

 # systemctl list-unit-files โ€” type=service โ€” state=enabled autovt@.service enabled bind9.service enabled cron.service enabled dbus-org.freedesktop.thermald.service enabled docker.service enabled getty@.service enabled haveged.service enabled mysql.service enabled networking.service enabled resolvconf.service enabled rsyslog.service enabled ssh.service enabled sshd.service enabled syslog.service enabled systemd-timesyncd.service enabled thermald.service enabled unattended-upgrades.service enabled ureadahead.service enabled 

Jika Anda menemukan sesuatu yang jelas tidak systemctl , Anda dapat menggunakan perintah systemctl untuk menghentikan layanan dan memastikan bahwa itu tidak me-restart pada boot berikutnya.

 # systemctl stop haveged # systemctl disable haveged 

Sebenarnya, tidak ada yang gelap dan suram dalam layanan yang saya hentikan dalam contoh ini: ini adalah alat yang sering saya jalankan untuk membuat aktivitas sistem latar belakang acak ketika saya membuat kunci enkripsi.
Cari program yang diinstal

Bisakah seseorang menginstal program di sistem tanpa sepengetahuan Anda? Nah, untuk mencari tahu - Anda perlu mencarinya. Perintah yum list installed atau, dalam kasus Debian / Ubuntu, dpkg โ€” list akan memberi Anda ringkasan terperinci, dan perintah hapus harus menghapus semua paket yang tidak kita butuhkan.

 # yum list installed # yum remove packageName 

Inilah cara melakukan hal yang sama di Ubuntu:

 # dpkg --list # apt-get remove packageName 

Juga berguna untuk melacak perubahan yang dilakukan pada file konfigurasi sistem Anda - kita akan membicarakan hal ini di Bab 11.

Source: https://habr.com/ru/post/id425571/


All Articles