evilfactorylabs

Cover image for SELinux dan Docker data-root
Wid
Wid

Posted on

SELinux dan Docker data-root

Kapan hari saya perlu memindahkan data-root directory docker dari kampung halamannya di /var/lib/docker ke /mnt/storage-0/docker karena persoalan ruang di partisi utama yang semakin menipis. Sebagai konteks, mesin ini menggunakan OS Centos 8 dengan SELinux: Enforcing.

Kalau melihat dokumentasi yang ada, cara mindahin data-root sebenernya ga ribet, langsung aja edit file /etc/docker/daemon.json, dan tambahin line dibawah, copy semua file dari directory lama, terus restart docker daemonnya.

{
...
  "data-root": "/mnt/storage-0/docker",
...
}
Enter fullscreen mode Exit fullscreen mode

Sayangnya, ternyata tidak semudah itu Fergusso. Semua emang terlihat lancar sampai ketika saya menggunakan fitur buildkit. Command docker build ... selalu gagal, dengan pesan error:

0.479 standard_init_linux.go:228: exec user process caused: permission denied
Enter fullscreen mode Exit fullscreen mode

source: https://www.bbc.com/news/world-middle-east-56505413

Refleklah ngecek audit.log, akhirnya ketahuan kalau directory /mnt/storage-0/docker belum dikasih label yang sesuai biar dikenali sama SELinux sebagai "rumah" nya si docker.

Isi lognya begini:

...
type=AVC msg=audit(1627476572.116:8223): avc: denied { entrypoint } for pid=277147 comm="runc:[2:INIT]" path="/bin/busybox" dev="overlay" ino=202821668 scontext=system_u:system_r:container_t:s0:c257,c579 tcontext=system_u:object_r:unlabeled_t:s0 tclass=file permissive=0
type=AVC msg=audit(1627478254.522:8273): avc: denied { entrypoint } for pid=287085 comm="runc:[2:INIT]" path="/bin/busybox" dev="overlay" ino=202821668 scontext=system_u:system_r:container_t:s0:c358,c450 tcontext=system_u:object_r:unlabeled_t:s0 tclass=file permissive=0
...
Enter fullscreen mode Exit fullscreen mode

Yaudah, berarti tinggal dilabelin sesuai dengan label directory lamanya, ambil contekan dulu pakai command ini:

grep docker /etc/selinux/targeted/contexts/files/file_contexts | grep "/var/lib/docker
Enter fullscreen mode Exit fullscreen mode

Copy yang sesuai dengan kasus, terus bikin command buat ngedefinisiin context mapping directory data-root barunya si docker:

semanage fcontext -a -s system_u -t container_var_lib_t         "/mnt/storage-0/docker(/.*)?";
semanage fcontext -a -s system_u -t container_ro_file_t         "/mnt/storage-0/docker/.*/config\.env";
semanage fcontext -a -s system_u -t container_ro_file_t         "/mnt/storage-0/docker/init(/.*)?";
semanage fcontext -a -s system_u -t container_ro_file_t         "/mnt/storage-0/docker/overlay(/.*)?";
semanage fcontext -a -s system_u -t container_ro_file_t         "/mnt/storage-0/docker/overlay2(/.*)?";
semanage fcontext -a -s system_u -t container_ro_file_t         "/mnt/storage-0/docker/containers/.*/hosts";
semanage fcontext -a -s system_u -t container_log_t             "/mnt/storage-0/docker/containers/.*/.*\.log";
semanage fcontext -a -s system_u -t container_ro_file_t         "/mnt/storage-0/docker/containers/.*/hostname";
Enter fullscreen mode Exit fullscreen mode

Abis eksekusi command diatas, terus jalanin command dibawah buat melabeli ulang directory tersebut secara rekursif sesuai dengan context yang tadi udah diset:

restorecon -Rv /mnt/storage-0/docker
Enter fullscreen mode Exit fullscreen mode

Udah deh,
Voila, semua berjalan lancar kembali seperti sedia kala sebelum negara api menyerang.

Latest comments (0)