Ketika segala sesuatunya tidak berfungsi dengan benar di lingkungan Linux Anda, hal termudah untuk dilakukan adalah menonaktifkan Linux yang Ditingkatkan Keamanan (SELinux). Segalanya tiba-tiba mulai bekerja, dan Anda melupakannya—tetapi ini adalah perangkap umum yang berarti Anda kehilangan alat keamanan yang sangat kuat.
Ancaman meningkat seiring dengan munculnya wadah, layanan mikro, dan arsitektur terdistribusi. Ini karena masalah lama yang terkenal:kecepatan. Keuntungan container adalah memungkinkan Anda bergerak cepat, melakukan lebih banyak, dan berubah dengan cepat. Ini berarti adopsi kontainer telah berhasil, tetapi kecepatan yang diberikannya juga berarti Anda akan menghadapi lebih banyak masalah dan kerentanan. Ini terjadi secara alami saat Anda melakukan lebih banyak hal dengan lebih cepat dan lebih cepat.
Cara mengurangi ancaman
Wadah Linux
- Apa itu container Linux?
- Pengantar terminologi wadah
- Unduh:Containers Primer
- Operator Kubernetes:Mengotomatiskan platform orkestrasi container
- eBook:Pola Kubernetes untuk mendesain aplikasi cloud-native
- Apa itu Kubernetes?
Seperti yang dikatakan Sun Tzu, "Pejuang yang bijaksana menghindari pertempuran." Kutipan ini benar-benar beresonansi dalam hal pertahanan dasar kontainer. Untuk menghindari masalah (pertempuran), pastikan host container Anda aman dan Anda dapat menggunakan SELinux sebagai lini pertahanan pertama Anda.
SELinux adalah proyek open source yang dirilis pada tahun 2000 dan diintegrasikan ke dalam kernel Linux pada tahun 2003. Menurut penjelasan Red Hat, "SELinux adalah arsitektur keamanan untuk sistem Linux yang memungkinkan administrator memiliki kontrol lebih besar atas siapa yang dapat mengakses sistem. dikembangkan oleh Badan Keamanan Nasional Amerika Serikat (NSA) sebagai serangkaian tambalan ke kernel Linux menggunakan Modul Keamanan Linux (LSM)."
Mulai
Ketika Anda memikirkan kontainer, hal pertama yang mungkin terlintas dalam pikiran adalah Docker. Docker memulai revolusi adopsi container setelah muncul pada tahun 2013. Ini adalah salah satu alasan utama popularitas container meledak, tetapi seperti yang disebutkan di atas, tingkat adopsi yang tinggi meningkatkan kerentanan pengguna terhadap risiko keamanan.
Sebelum Anda dapat mengamankan container Docker dengan SELinux, Anda perlu menyiapkan beberapa hal.
Prasyarat:
- CentOS 8/RHEL 8 diinstal dan dikonfigurasi
- Docker CE diinstal dan dikonfigurasi
- Dua akun dibuat:root dan non-root (
mcalizo
dalam contoh di bawah)
Jika Anda perlu mengatur Docker di server RHEL 8/CentOS 8 Anda, Anda dapat mengikuti petunjuk ini. Jika Anda menjalankan RHEL 8, Anda harus menghapus paket Podman dan runc yang telah diinstal sebelumnya sebelum memulai.
Pertama, pastikan SELinux diaktifkan:
[mcalizo@Rhel82 ~]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 31
[mcalizo@Rhel82 ~]$
Kemudian, verifikasi versi OS Anda dan Docker sedang berjalan. Masuk sebagai root dan jalankan:
[root@rhel82 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
[root@rhel82 ~]#
[root@rhel82 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago
Docs: https://docs.docker.com
Main PID: 30768 (dockerd)
Tasks: 8
Memory: 39.0M
CGroup: /system.slice/docker.service
└─30768 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg=">
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903413613-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903427451-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903538271-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.132060506-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.308943088-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319438549-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319570298-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.333419209-04:00" level=info msg="A>
Oct 28 19:10:14 rhel82.home.labs.com systemd[1]: Started Docker Application Container Engine
Periksa versi Docker Anda:
[root@rhel82 ~]# docker --version
Docker version 19.03.13, build 4484c46d9d
Hack host Anda
Salah satu cara terbaik untuk memahami suatu masalah adalah dengan mengalaminya. Jadi, saya akan menunjukkan kepada Anda betapa mudahnya memasukkan kode berbahaya ke dalam host Docker jika keamanan Anda tidak diatur dengan benar.
Untuk dapat melakukan sesuatu yang buruk pada host Docker, pengguna non-root yang jahat (mcalizo
dalam tutorial ini) harus menjadi bagian dari grup yang dapat membuat instance container Docker.
Pertama, konfirmasikan grup apa mcalizo
pengguna milik:
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo
Outputnya menunjukkan bahwa mcalizo
hanya milik kelompoknya sendiri. Ini berarti mcalizo
tidak dapat membuat instance container Docker dan akan mendapatkan kesalahan ini jika mencoba:
[mcalizo@Rhel82 ~]$ docker run -it --rm centos:latest /bin/sh
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
Untuk mengizinkan mcalizo
untuk membuat instance container, tambahkan pengguna ke docker
grup:
[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker
Selanjutnya, terapkan fedora:latest
wadah dan masuk ke wadah yang dipakai untuk menjelajahinya:
[mcalizo@Rhel82 ~]$ docker run -it --rm fedora:latest /bin/sh
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
ee7e89337106: Pull complete
Digest: sha256:b9ec86d36fca7b1d3de39cd7c258e8d90c377d312c21a7748071ce49069b8db4
Status: Downloaded newer image for fedora:latest
sh-5.0# cat /etc/redhat-release
Fedora release 33 (Thirty Three)
Saat Anda masuk ke wadah yang baru dibuat, Anda dapat melihat bahwa Anda secara otomatis masuk sebagai root:
sh-5.0# whoami
root
sh-5.0#
Sebagai root
pengguna, Anda dapat melakukan apa saja di wadah ini, yang berarti Anda dapat mengeksploitasi host wadah dan melakukan banyak kerusakan. Karena Anda dapat membuat instance container, Anda dapat melakukan berbagai hal ke host meskipun Anda bukan bagian dari akun sudoers host.
Keluar dari container yang baru saja Anda buat, dan buat container baru untuk mendemonstrasikan exploit:
[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@131043f2e306 /]#
Opsi -v memasang /
. host Docker direktori ke wadah di bawah /exploit
direktori:
[root@131043f2e306 /]#ls exploit/
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Karena sudah terpasang, Anda dapat melakukan apa saja pada host Docker. Misalnya, Anda dapat menghapus file, mengedit konfigurasi tertentu untuk membahayakan sistem, atau bahkan menginstal aplikasi Trojan horse atau malware lain untuk mencuri informasi penting.
Mengapa ini terjadi?
Anda mungkin bertanya-tanya mengapa ini mungkin karena SELinux dalam mode penegakan. Gali lebih dalam ke SELinux untuk melihat apa yang salah.
Verifikasi bahwa SELinux memiliki konteks Docker:
[mcalizo@Rhel82 ~]$ ps -eZ | grep docker
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
[mcalizo@Rhel82 ~]$
Seperti yang diharapkan, memang begitu. Ini berarti SELinux mengelola daemon Docker. Periksa daemon Docker untuk melihat apakah SELinux diaktifkan secara default:
[mcalizo@Rhel82 ~]$ docker info | grep Security -A3
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.0-193.el8.x86_64
SELinux bukan diaktifkan secara default. Ini masalahnya! Untuk memperbaikinya, aktifkan SELinux untuk mengontrol dan mengelola Docker dengan memperbarui atau membuat file /etc/docker/daemon.json
seperti yang didokumentasikan di sini (Anda harus memiliki akses root untuk melakukannya):
[root@Rhel82 ~]# cat /etc/docker/daemon.json
{
"selinux-enabled": true
}
[root@Rhel82 ~]#
[root@Rhel82 ~]# systemctl restart docker
Setelah membuat atau memperbarui file dan memulai ulang Docker, Anda akan melihat bahwa dukungan SELinux diaktifkan di daemon Docker:
[root@Rhel82 ~]# systemctl restart docker
[mcalizo@Rhel82 root]$ docker info | grep Security -A3
Security Options:
seccomp
Profile: default
selinux
[mcalizo@Rhel82 root]$
Meskipun masih dimungkinkan untuk memasang sistem file tertentu di host Docker Anda di penampung Docker Anda, memperbarui atau mengakses file tidak lagi diizinkan:
[mcalizo@Rhel82 root]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@ecb5836da1f6 /]# touch /exploit/etc/shadow.sh
touch: cannot touch '/exploit/etc/shadow.sh': Permission denied
[root@ecb5836da1f6 /]#
Pelajari lebih lanjut
Garis pertahanan pertama Anda di dunia container bergantung pada seberapa kuat Anda menyiapkan sistem operasi host container Anda. Ada banyak cara untuk menerapkan keamanan Linux, termasuk opsi yang tersedia di pasar untuk meningkatkan postur keamanan Anda.
SELinux adalah lapisan keamanan tambahan yang dibangun ke dalam distribusi Linux secara default. Untuk memanfaatkannya dan melindungi sistem Anda dari kompromi, pastikan SELinux tetap aktif.
Jika Anda ingin mempelajari lebih lanjut, lihat:
- Cara menginstal Docker CE di CentOS 8 / RH
- Lembar contekan keamanan Docker
- dokumentasi dockerd
- Gunakan dokumentasi volume
- Apa itu SELinux?