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). |
| 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".