GNU/Linux >> Belajar Linux >  >> Linux

Apa perbedaan antara /tmp dan /run?

Direktori /tmp dan /usr/tmp (kemudian /var/tmp ) dulunya adalah tempat pembuangan untuk segalanya dan semua orang. Satu-satunya mekanisme perlindungan untuk file dalam direktori ini adalah sticky bit yang membatasi penghapusan atau penggantian nama file di sana kepada pemiliknya. Seperti yang ditunjukkan marcelm dalam komentar, pada prinsipnya tidak ada yang mencegah seseorang membuat file dengan nama yang digunakan oleh layanan (seperti nginx.pid atau sshd.pid ). (Namun, dalam praktiknya, skrip startup dapat menghapus file palsu tersebut terlebih dahulu.)

/run didirikan untuk data runtime non-persisten dari layanan berumur panjang seperti kunci, soket, file pid dan sejenisnya. Karena tidak dapat ditulisi untuk umum, ini melindungi data runtime layanan dari kekacauan di /tmp dan pekerjaan yang membersihkan di sana. Memang:Dua distribusi yang saya jalankan (no pun intended) memiliki izin 755 pada /run , sedangkan /tmp dan /var/tmp (dan /dev/shm dalam hal ini) memiliki izin 1777.


/tmp adalah lokasi untuk pembuatan file dan direktori sementara. Itu tidak dapat digunakan untuk menyimpan "nama terkenal" (yaitu nama yang dapat diketahui oleh proses lain tanpa Anda harus menyampaikan nama itu entah bagaimana) karena tidak ada yang memiliki kepemilikan atas namespace; siapa pun dapat membuat file di sana. Karena itu, Anda biasanya menggunakannya ketika Anda memiliki utilitas yang membutuhkan file (yaitu bukan pipa atau semacamnya) sebagai input atau output, di mana nama apa pun (yang dibuat secara acak) akan berfungsi selama Anda memasukkan nama tersebut.

Secara historis, beberapa hal (seperti X) melanggar prinsip ini dan mencantumkan nama terkenal (seperti .X11-unix ) di /tmp . Ini tentu saja buggy dan memungkinkan setiap pengguna untuk melakukan DoS layanan yang perlu dilakukan hanya dengan berlomba membuat file dengan nama yang diinginkan terlebih dahulu. Hal-hal seperti itu termasuk dalam /run (atau ekuivalen /var/run jika Anda tidak berlangganan revisionisme Freedesktop.org). Tentu saja yang lebih baik adalah memperbaikinya agar tidak menggunakan nama terkenal di ruang nama global, melainkan meneruskan nama jalur.


Tidak ada alasan untuk memiliki /run dan /tmp

Saya pikir Anda benar. /tmp pada dasarnya tidak digunakan lagi sekarang kita memiliki /run . Jika program Anda dapat melakukannya (yang mengharuskannya diinstal sebagai operasi istimewa), maka saat ini Anda akan menggunakan sub-direktori dari /run . Ini untuk alasan keamanan.

Misalnya. daemon pencetakan CUPS tidak berjalan sebagai root, tetapi biasanya diinstal dari paket OS. Paket menginstal /usr/lib/tmpfiles.d/cups.conf , dan systemd-tmpfiles membuat direktori yang dapat diaksesnya. Karena direktori berada di bawah /run , nama tersebut tidak dapat diklaim secara jahat oleh pengguna yang tidak berhak, tidak seperti /tmp yang dapat ditulis dunia.

"Unprivileged program" yang tidak dapat menggunakan /run langsung

Perbedaan sebenarnya adalah jika program Anda dijalankan oleh pengguna tanpa hak yang sewenang-wenang, dengan ID pengguna mereka sendiri. Tetapi Anda umumnya masih tidak ingin menggunakan /tmp , karena dapat diakses oleh pengguna unprivileged lainnya. Anda lebih suka menggunakan $XDG_RUNTIME_DIR . Biasanya ini diimplementasikan sebagai /run/user/$(id -u) - jadi ini adalah subdirektori dari /run demikian juga. Lokasinya tidak dijamin; program harus selalu menggunakan variabel lingkungan.

/tmp hanya akan berguna untuk kerja sama ad-hoc antara pengguna yang tidak memiliki hak istimewa pada sistem. Sistem ad-hoc seperti itu rentan terhadap pengguna jahat yang menolak untuk bekerja sama dan memanjakan semua orang :). Salah satu contohnya adalah pengguna yang tidak memiliki hak istimewa yang memutuskan untuk menjalankan versi talk daemon, menggunakan soket unix.

Informasi asli dari Lennart Poettering

Perhatikan, daftar periksa Poettering di bawah mengklaim bahwa /tmp akan berguna untuk "file kecil", sedangkan /run hanya boleh digunakan untuk "primitif komunikasi". Menurut saya perbedaan ini juga tidak benar. Tukang poster untuk /run adalah udev , dan saya cukup yakin /run/udev termasuk database internal. Setelah Anda memiliki /run direktori, saya rasa tidak ada orang yang ingin mengikuti perbedaan yang diklaim dan membuat yang lain direktori, untuk mengacaukan /tmp . Jadi dalam prakteknya kita hanya menggunakan /run saat ini.

Penggunaan ruang nama bersama yang dapat ditulis dunia [seperti /tmp] untuk tujuan komunikasi selalu menjadi masalah, karena untuk menjalin komunikasi Anda memerlukan nama yang stabil, tetapi nama yang stabil membuka pintu untuk serangan DoS. Ini dapat diperbaiki sebagian, dengan membuat direktori per-aplikasi yang dilindungi untuk layanan tertentu selama boot awal (seperti yang kami lakukan untuk X11), tetapi ini hanya memperbaiki sebagian masalah, karena ini hanya berfungsi dengan benar jika setiap instalasi paket diikuti dengan reboot.

...

Fitur Fedora lainnya (untuk Fedora 17) mengubah semantik /tmp untuk banyak layanan sistem agar lebih aman, dengan mengisolasi ruang nama /tmp dari berbagai layanan

...

Karena /tmp tidak lagi merupakan namespace bersama, umumnya tidak cocok sebagai lokasi untuk komunikasi primitif.

...

[/run] dijamin menjadi tmpfs dan karenanya secara otomatis memerah saat boot. Tidak ada pembersihan otomatis yang dilakukan setelah itu.

...

Berikut adalah panduan kasar bagaimana kami menyarankan Anda (pengembang aplikasi Linux) memilih direktori yang tepat untuk digunakan:

  1. Anda memerlukan tempat untuk meletakkan soket Anda (atau primitif komunikasi lainnya) dan kode Anda berjalan dengan hak istimewa:gunakan subdirektori di bawah /run. (Atau di bawah /var/run untuk kompatibilitas tambahan.)
  2. Anda memerlukan tempat untuk meletakkan soket (atau primitif komunikasi lainnya) dan kode Anda berjalan tanpa hak:gunakan subdirektori di bawah $XDG_RUNTIME_DIR.
  3. Anda memerlukan tempat untuk menyimpan unduhan yang lebih besar dan unduhan yang sedang berlangsung dan berjalan tanpa hak istimewa:gunakan $XDG_DOWNLOAD_DIR.
  4. Anda memerlukan tempat untuk meletakkan file cache yang harus tetap ada dan berjalan tanpa hak:gunakan $XDG_CACHE_HOME.
  5. Hal-hal di atas tidak berlaku dan Anda perlu menempatkan file kecil yang tidak memerlukan persistensi:gunakan $TMPDIR dengan fallback di /tmp. Dan gunakan mkstemp(), dan mkdtemp() dan tidak ada buatan sendiri.
  6. Jika tidak, gunakan $TMPDIR dengan fallback pada /var/tmp. Gunakan juga mkstemp()/mkdtemp().

Perhatikan bahwa peraturan di atas hanya disarankan oleh kami. Aturan ini memperhitungkan semua yang kami ketahui tentang topik ini dan menghindari masalah dengan distribusi saat ini dan di masa mendatang, sejauh yang kami bisa melihatnya. Harap pertimbangkan untuk memperbarui proyek Anda untuk mengikuti aturan ini, dan ingatlah jika Anda menulis kode baru.

Satu hal yang ingin kami tekankan adalah bahwa /tmp dan /var/tmp lebih sering daripada tidak sebenarnya bukan pilihan yang tepat untuk usecase Anda. Ada penggunaan yang valid dari direktori ini, tetapi cukup sering direktori lain sebenarnya adalah tempat yang lebih baik. Jadi, berhati-hatilah, pertimbangkan opsi lain, tetapi jika Anda memilih /tmp atau /var/tmp maka setidaknya pastikan untuk menggunakan mkstemp()/mkdtemp().

Kami agak lolos dengan /tmp lama socket yang digunakan oleh sistem X window, seperti dijelaskan di atas. Saya salah membaca tmpfiles.d/x11.conf . Sepertinya lebih mengandalkan kerjasama :). Saya menganggap kode tersebut telah diaudit, sehingga penolakan layanan adalah hal terburuk yang dapat terjadi.


Linux
  1. Apa perbedaan antara #!/usr/bin/env bash dan #!/usr/bin/bash?

  2. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?

  3. Apa hubungan antara direktori /etc/init.d dan /etc/rcX.d di Linux?

  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0

  3. Haruskah situs web berada di /var/ atau /usr/ sesuai dengan penggunaan yang disarankan?

  1. Bash =~ Regex Dan Https://regex101.com/?

  2. Perbedaan Antara '$ . Foo' Dan '$ ./foo'??

  3. unix:///var/run/supervisor.sock tidak ada file seperti itu