GNU/Linux >> Belajar Linux >  >> Linux

Menguasai systemd:Mengamankan dan sandboxing aplikasi dan layanan

Rangkaian artikel ini akan mengeksplorasi beberapa kemampuan Red Hat Enterprise Linux (RHEL) 8 favorit saya yang diaktifkan oleh systemd . Dengan demikian, seri ini mengasumsikan keakraban dengan konsep dasar systemd . Jika Anda membutuhkan pengenalan yang baik, ada banyak dokumentasi produk di Portal Pelanggan Red Hat serta di situs proyek. Atau, ada sejumlah presentasi yang tersedia di YouTube untuk mengejar Anda sebelum melanjutkan.

Systemd menyediakan sejumlah besar fitur keamanan yang dapat digunakan untuk mengisolasi layanan dan aplikasi dari satu sama lain serta dari sistem operasi yang mendasarinya. Dalam banyak kasus, systemd menyediakan akses mudah ke mekanisme yang sama yang disediakan oleh kernel Linux yang juga digunakan untuk membuat isolasi wadah Linux. Memiliki kemampuan untuk menyediakan isolasi seperti container untuk aplikasi dan layanan tradisional sangat kuat karena sekarang mudah untuk meningkatkan keamanan dan isolasi beban kerja tanpa dampak operasional yang diperlukan container. Perlu dicatat bahwa perubahan operasional dan organisasi yang terinspirasi oleh adopsi container memang sehat dan bermanfaat. Namun, bahkan di perusahaan yang paling memahami kontainer, ada sejumlah besar penerapan Linux tradisional di mana keamanan menjadi prioritas utama. Seperti yang akan kita lihat, beban kerja pada sistem ini dapat memperoleh manfaat hanya dari beberapa penyesuaian pada file unit terkait.

Opsi keamanan yang umum untuk Red Hat Enterprise Linux 7 dan 8

Sebagian besar opsi yang dieksplorasi di bawah menerima biner true atau false konfigurasi yang membuatnya mudah untuk diaktifkan. Ada beberapa yang berisi opsi tambahan, dan yang paling signifikan juga ditampilkan. Lihat dokumentasi lengkap dan halaman manual untuk detail lebih lanjut. Jika Anda tidak peduli dengan seluk beluk opsi ini, silakan lewati ke bagian berikutnya di mana kami akan menggabungkan opsi ini untuk contoh yang lebih koheren:

Opsi Deskripsi
PrivateTmp=yes Membuat ruang nama sistem file di bawah /tmp/systemd-private-*-[unit name]-*/tmp daripada /tmp yang dibagikan atau /var/tmp . Banyak file unit yang dikirimkan bersama Red Hat Enterprise Linux menyertakan pengaturan ini dan menghapus seluruh kelas kerentanan di sekitar prediksi dan penggantian file yang digunakan di /tmp .
PrivateNetwork= Menyediakan ruang nama jaringan untuk layanan dengan hanya antarmuka loopback yang tersedia. Pilihan bagus untuk aplikasi yang tidak memerlukan komunikasi jaringan eksternal.
SELinuxContext= Menjalankan aplikasi dalam konteks tertentu. Opsi ini adalah ide yang baik untuk menentukan kapan kebijakan tersedia untuk aplikasi yang dikirim di luar RHEL. Primer SELinux yang bagus tersedia di sini.
NoNewPrivileges= Mencegah layanan dan proses turunan terkait dari peningkatan hak istimewa.
ProtectSystem=yes Membuat /usr dan /boot read-only ke aplikasi. Menyetel opsi ini ke full juga membuat /etc hanya-baca. Di Red Hat Enterprise Linux 8, ada opsi tambahan yang disebut strict itu juga membuat /dev , /proc , dan /sys hanya-baca.
ProtectHome=yes Membuat /home , /root , dan /run/user tampak kosong. Opsi tambahan adalah read-only , yang melakukan persis seperti yang dikatakannya. Juga baru di RHEL 8, tmpfs akan melapisi sistem file fana yang dapat ditulisi pada titik-titik ini. Karena direktori ini digunakan untuk menyimpan kunci SSH dan informasi sensitif lainnya, sebaiknya Anda melarang aplikasi untuk memiliki akses.
ProtectDevices=yes Membuat /dev pribadi namespace yang hanya berisi perangkat semu seperti /dev/null dan /dev/random , yang tidak memberikan akses ke perangkat keras yang sebenarnya. Ini juga menonaktifkan CAP_MKNOD sehingga node perangkat baru tidak dapat dibuat.
CapabilityBoundingSet= Menerima daftar putih dan daftar hitam kemampuan istimewa untuk unit. Kemampuan Linux memecah akses pengguna root ke sistem sehingga akses istimewa dapat ditentukan dengan lebih baik. Contoh klasiknya adalah untuk NTP atau chrony untuk dapat mengonfigurasi jam sistem tetapi tidak melakukan tindakan istimewa lainnya. Detail lebih lanjut tersedia di halaman manual kapabilitas (7).

ReadWriteDirectories=

ReadOnlyDirectories=

InaccessibleDirectories=

Berperilaku mirip dengan ProtectSystem , tetapi ketiga opsi ini memungkinkan kontrol yang halus atas akses sistem file.

Opsi keamanan baru di Red Hat Enterprise Linux 8

Opsi keamanan sistem baru yang tersedia di Red Hat Enterprise Linux 8 adalah:

Opsi Deskripsi
ProtectKernelTunables=yes Menonaktifkan modifikasi /proc dan /sys .
ProtectKernelModules=yes Melarang memuat atau membongkar modul dan menutupi /usr/lib/modules dari aplikasi.
ProtectControlGroups=yes Menonaktifkan akses tulis ke /sys/fs/cgroup/ .
RestrictNamespaces= Batasi semua atau sebagian ruang nama ke layanan. Menerima cgroup , ipc , net , mnt , pid , user , dan uts .
AssertSecurity= Mengambil sejumlah persyaratan yang harus dipenuhi oleh sistem untuk memulai layanan. Jika kemampuan yang tercantum tidak tersedia, layanan akan gagal dijalankan dan acara dicatat. Opsi seperti selinux dan uefi-secureboot berguna untuk banyak lingkungan.
MemoryDenyWriteExecute= Menonaktifkan pemetaan memori yang dapat ditulis dan dijalankan secara bersamaan.
RestrictRealtime=yes Melarang penjadwalan waktu nyata.
PrivateMounts=yes Menyebabkan layanan berjalan di ruang nama pemasangan pribadi.
DynamicUser=yes Secara efektif membuat pengguna sementara untuk aplikasi. Opsi ini mungkin memerlukan posnya sendiri untuk dijelajahi, tetapi secara singkat, systemd implementasinya brilian karena secara dinamis (seperti namanya) membuat UID dan GID dengan mencolokkan nss modul yang "menciptakan" pengguna dengan cepat. Pengguna ini tidak ada saat layanan tidak berjalan. Fitur ini paling berguna untuk aplikasi tanpa kewarganegaraan, tetapi direktori dapat dipetakan untuk menulis.
SystemCallFilter= Memungkinkan Anda membuat daftar putih dan daftar hitam panggilan sistem individual atau menggunakan grup panggilan yang mudah digunakan yang systemd menyediakan. Jika Anda sudah familiar dengan seccomp penyaringan dengan wadah, opsi ini memberikan hal yang sama persis. Secara umum, sebagian besar pengguna akan menemukan @system-service filter berharga, yang memungkinkan panggilan sistem relevan yang dibutuhkan oleh sebagian besar layanan. Pengguna dapat melihat daftar grup dan panggilan sistem yang tersedia dengan menjalankan systemd-analyze syscall-filter .

[Ingin mencoba Red Hat Enterprise Linux? Unduh sekarang secara gratis.]

Contoh

Jika Anda telah sampai sejauh ini, Anda mungkin berpikir, "Oke, ini tampaknya sangat ampuh, tetapi ini banyak yang harus diingat." Untungnya, pada Red Hat Enterprise Linux 8.1, kami telah menambahkan perintah untuk mempermudah referensi dan memeriksa status opsi ini:

systemd-analyze security [unit]

Perintah ini menghasilkan snapshot cepat tentang bagaimana sistem memanfaatkan systemd sandboxing, dan juga dapat melihat pengaturan individual per unit. Desain ini memudahkan untuk mengidentifikasi opsi yang tersedia serta melihat penggunaannya pada tingkat yang terperinci.

Berikut adalah output dari httpd.service default satuan:

Output ini dari systemd-analyze security menunjukkan nama, deskripsi nyaman, dan peringkat eksposur, yang menunjukkan konsumsi pengaturan keamanan yang tersedia per layanan dan menghasilkan skor eksposur tertimbang dari seberapa terisolasi layanan tersebut. Perlu dicatat bahwa alat ini tidak dimaksudkan untuk memberikan pandangan holistik atau opini keamanan untuk kode atau aplikasi yang berjalan pada sistem. Hanya karena httpd.service kembali sebagai UNSAFE pada pemasangan default tidak berarti layanan tidak aman.

Sekarang setelah kita mengetahui cara mengkueri unit dan melihat kontrol mana yang digunakan, mari kita lihat penerapannya ke server web sederhana. Contoh tujuan umum ini berfungsi sebagai titik awal yang mudah untuk layanan dan aplikasi lain.

Aktifkan opsi keamanan

Pertama, buat drop-in systemd untuk menambahkan opsi keamanan. Untuk Red Hat Enterprise Linux 8, jalankan:

# systemctl edit httpd

Atau, jika Anda mau, buat /etc/systemd/system/httpd.service.d/security.conf secara manual .

Terlepas dari cara Anda mengakses file, sekarang tambahkan:

[Service]
ProtectSystem=strict
ProtectHome=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
NoNewPrivileges=yes
PrivateTmp=yes

Untuk Red Hat Enterprise Linux 7, kita dapat menggunakan template serupa:

[Service]
ProtectSystem=full
ProtectHome=yes
PrivateDevices=yes
NoNewPrivileges=yes
PrivateTmp=yes

Setelah Anda menyimpan file dan memulai ulang layanan, httpd layanan akan diisolasi secara signifikan dari sistem operasi lainnya. Jika layanan pernah disusupi, potensi breakout dan kerusakan berikutnya akan berkurang secara drastis.

Contoh di atas adalah titik awal yang bagus untuk mengunci layanan, aplikasi, dan unit yang berjalan di sistem Anda. Anda harus, tentu saja, menguji ini untuk memastikan mereka sesuai untuk kasus penggunaan Anda sebelum meluncurkannya ke seluruh armada Anda. Misalnya, jika kami ingin menyajikan konten dari direktori beranda pengguna, kami tidak akan menyertakan ProtectHome=yes , tetapi sebagai gantinya, gunakan ProtectHome=read-only . Yang juga perlu diperhatikan adalah tidak ada salahnya menyertakan opsi yang lebih baru yang ditambahkan di RHEL 8 pada file unit yang dijalankan di RHEL 7. Pesan pemberitahuan akan dikeluarkan dan opsi tersebut akan diabaikan.

Lihat hasilnya

Kami sekarang dapat melihat opsi yang digunakan dengan menjalankan systemd-analyze httpd :

Anda dapat melihat bahwa sejumlah opsi sekarang diterapkan di server web. Peringkat juga berubah dari UNSAFE ke MEDIUM . Meskipun sangat mungkin untuk mengaktifkan lebih banyak opsi dan mengunci layanan lebih lanjut, kami akan menyimpang dari tujuan memberikan contoh praktis yang akan berhasil diterapkan ke banyak layanan dan aplikasi di dunia nyata. Belum pernah semudah ini membatasi akses layanan tradisional ke OS yang mendasarinya.

Kesimpulan

Untuk pengembang yang tertarik untuk mengamankan perangkat lunak Anda sendiri, opsi keamanan yang relevan dapat dengan mudah ditambahkan ke file unit yang disertakan dengan aplikasi Anda. Red Hat sangat menganjurkan developer untuk "memasukkan" keamanan sebanyak mungkin secara default, dan ini adalah salah satu cara termudah untuk mencapai tujuan tersebut.

Bagi mereka yang bertanya-tanya apakah fitur keamanan yang ditampilkan di sini berlebihan dengan SELinux, ada fungsi yang tumpang tindih tetapi sebagian besar independen. Pengaturan ini akan berlaku terlepas dari apakah SELinux digunakan atau tidak. Fitur ini sangat berharga ketika SELinux bukan pilihan yang layak karena persyaratan kebijakan atau aplikasi untuk sistem tertentu. Di dunia yang ideal, ini akan digunakan with SELinux sebagai bagian dari pendekatan keamanan berlapis.

Saya harap Anda menikmati mempelajari betapa mudahnya mengisolasi dan sandbox beban kerja yang diinstal di Red Hat Enterprise Linux 8 dengan systemd . Sekarang, majulah dan, jika perlu, terapkan pengetahuan ini ke seluruh lingkungan Anda. Pada artikel berikutnya dalam seri ini, kita akan melihat penggunaan grup kontrol Linux, alias cgroups , melalui systemd untuk melindungi sumber daya sistem yang berharga dan memecahkan masalah "tetangga yang berisik".


Linux
  1. Perbedaan Antara Aplikasi Gtk Dan Qt?

  2. StartLimitIntervalSec Systemd dan StartLimitBurst tidak pernah berfungsi

  3. Systemd Unit File - WantedBy dan After

  1. Cara Mengelola dan Mendaftar Layanan di Linux

  2. Regex dan grep:Aliran data dan blok penyusun

  3. Cara Mendaftar Layanan Systemd di Linux

  1. Mulai, Hentikan, dan Mulai Ulang layanan di server systemd RHEL 7 Linux

  2. Cara Mengelola Layanan Systemd dengan Systemctl di Linux

  3. Bagaimana cara menghapus layanan systemd