Jalankan vs Baca sedikit. Bagaimana cara kerja izin direktori di Linux?

381

Dalam CMS saya, saya perhatikan bahwa direktori memerlukan bit executable ( +x) yang diset agar pengguna dapat membukanya. Mengapa izin eksekusi diperlukan untuk membaca direktori, dan bagaimana izin direktori di Linux berfungsi?

Nick.h
sumber
17
... uh, karena itulah bendera "+ x" untuk :)
badp
16
Pikirkan seperti ini: entri direktori berisi nama file , jadi "membaca" direktori adalah daftar file, "menggunakan" direktori mengakses file.
tylerl
7
Dengan set bit eksekusi direktori , Anda diizinkan untuk melintasi hierachy-nya . Mengingat Anda milik orang "lain" dan hanya menjalankan bit set ( chmod 771 dirOne), Anda tidak dapat mencantumkan konten dirOne. TETAPI jika mengandung sub direktori "dirTwo" dengan hak yang ditetapkan seperti ( chmod 774 dirTwo) Anda benar-benar dapat membuat daftar isinya!
Stphane
1
Pengunjung masa depan juga harus melihat pertanyaan terkait pada AskUbuntu: askubuntu.com/q/1106822/295286
Sergiy Kolodyazhnyy

Jawaban:

352

Saat menerapkan izin ke direktori di Linux, bit izin memiliki arti yang berbeda dari pada file biasa.

  • The read bit ( r) memungkinkan pengguna yang terkena dampak untuk daftar file dalam direktori
  • The write bit ( w) memungkinkan pengguna yang terkena dampak untuk membuat, mengubah nama, atau menghapus file dalam direktori, dan memodifikasi atribut direktori ini
  • The bit eksekusi ( x) memungkinkan pengguna yang terkena dampak untuk memasukkan direktori, dan akses file dan direktori di dalam
  • The bit lengket ( Tatau tjika bit eksekusi diatur untuk orang lain) menyatakan bahwa file dan direktori di dalam direktori yang hanya dapat dihapus atau diganti oleh pemiliknya (atau root)
Chris Down
sumber
25
Jawaban yang bagus, tapi saya pikir kalimat terakhir itu menyesatkan. Tidak satu pun dari izin ini yang dapat ditimpa per file sebenarnya. Di sini "akses" agak ambigu: +xpada direktori, berikan akses ke file inode melalui direktori khusus ini (tidak kurang, tidak lebih, yah ... mungkin chdirperlu +xjuga). Untuk membaca atau menulis konten dari satu file, pengguna juga perlu +r/ +wpada file ini, tetapi itu adalah izin yang berbeda (mereka tidak menimpa apa pun).
Stéphane Gimenez
2
Bendera abadi adalah khusus filesystem dan tidak akan secara tepat mengesampingkan izin itu, itu sebabnya saya pikir kalimat terakhir menyesatkan :-)
Stéphane Gimenez
1
Saya pikir mungkin berguna untuk menyebutkan ACL dalam jawaban ini dan lainnya, karena aplikasi mereka untuk beberapa direktori dapat menyesatkan jika seseorang hanya akan mempertimbangkan informasi yang diberikan oleh Chris Down
user907860
4
Tampaknya jawaban ini tidak menyebutkan efek gabungan dari bit menulis dan mengeksekusi bit, seperti jawaban Baldrick yang disebutkan di bawah ini? yaitu jika Anda hanya memiliki izin menulis tetapi tidak izin eksekusi, maka itu cukup berguna.
xji
1
@ StéphaneGimenez " +xpada direktori memberi akses ke file inode" - Ini sepertinya nemonic yang bagus, tetapi mungkin tidak menceritakan keseluruhan cerita? Tanpa bit eksekusi yang ditetapkan pada direktori, Anda tidak dapat mengubah nama file file di direktori itu. Saya bertanya-tanya mengapa ini, karena nama file disimpan dalam entri direktori, bukan inode.
Kevin Wheeler
259

Pertama, pikirkan: Apa itu direktori? Itu hanya daftar item (file dan direktori lain) yang hidup di dalamnya. Jadi: direktori = daftar nama.

Baca bit = Jika diset, Anda dapat membaca daftar ini. Jadi, misalnya, jika Anda memiliki direktori bernama poems:

  • Anda dapat ls poemsdan Anda akan mendapatkan daftar item yang tinggal di dalamnya ( -ltidak akan mengungkapkan detail apa pun!).
  • Anda dapat menggunakan penyelesaian baris perintah yaitu touch poems/so <TAB> poems/somefile.
  • Anda tidak dapat membuat poemsdirektori kerja Anda (yaitu cdke dalamnya).

Write bit = Jika diatur, Anda dapat memodifikasi daftar ini yaitu Anda dapat {menambah, mengganti nama, menghapus} nama-nama di dalamnya. Tapi! Anda benar-benar dapat melakukannya hanya jika bit eksekusi diatur juga.

Execute bit = Jadikan direktori ini sebagai direktori kerja Anda cd. Anda memerlukan izin ini jika Anda ingin:

  • akses (baca, tulis, jalankan) item yang hidup di dalamnya.
  • memodifikasi daftar itu sendiri yaitu menambah, mengganti nama, menghapus nama di dalamnya (tentu saja bit tulis harus ditetapkan pada direktori).

Kasus menarik 1 : Jika Anda memiliki izin menulis + eksekusi pada direktori, Anda dapat {delete, rename} item yang tinggal di dalamnya walaupun Anda tidak memiliki batasan penulisan pada item-item tersebut. (gunakan bit yang lengket untuk mencegah ini)

Kasus menarik 2 : Jika Anda telah menjalankan (tetapi tidak menulis) izin pada direktori DAN Anda memiliki izin menulis pada file yang ada di dalamnya, Anda tidak dapat menghapus file (karena melibatkan menghapusnya dari daftar). Namun, Anda dapat menghapus kontennya, mis. Jika itu adalah file teks, Anda dapat menggunakan vi untuk membukanya dan menghapus semuanya. File akan tetap ada, tetapi akan kosong.

Ringkasan:

Baca bit = Anda dapat membaca nama-nama dalam daftar.
Write bit = Anda dapat {menambah, mengganti nama, menghapus} nama-nama dalam daftar JIKA bit eksekusi juga diatur.
Execute bit = Anda dapat menjadikan direktori ini sebagai direktori kerja Anda.

PS: Artikel yang disebutkan oleh Kusalananda itu bacaan yang bagus.

Baldrick
sumber
17
Memikirkan direktori sebagai daftar membuat segalanya lebih jelas dan logis.
Trismegistos
20
Jawaban yang bagus, tetapi terlalu fokus pada istilah "direktori kerja". Saya membutuhkan xbit untuk akses apa pun ke file ini: untuk cat a/b/c/d, saya perlu xbit pada semuanya a, bdan c, bahkan jika saya tidak menggunakannya sebagai cwd.
glglgl
1
Di sinilah saya tahu Anda tidak bisa menulis kecuali itu juga dapat dieksekusi! Kasus 2 juga menarik, jawaban yang bagus!
Mirko
1
Catatan lain adalah bahwa bahkan jika Anda memiliki xizin pada direktori, jika Anda tidak memiliki xizin pada file di dalamnya, Anda tidak dapat benar-benar "mengeksekusi" file tersebut. Anda hanya dapat catmelakukannya misalnya, tetapi Anda tidak dapat menjalankan file itu sendiri.
xji
2
Jika Anda ingin ls -lbekerja untuk folder, perlu keduanya rdan xizin.
Eric Wang
44

Saya telah menyiapkan tabel ini dengan semua izin yang memungkinkan dan efek praktisnya.

izin direktori linux

(*) Hanya nama file : atribut lainnya seperti ukuran atau tanggal tidak dapat diakses. Misalnya Anda dapat menggunakan kunci tab untuk melengkapi otomatis tetapi tidak perintah ls.

Beberapa pemikiran :

  • Dengan X tidak disetel , R dan W sebagian besar tidak berguna.
  • X sendiri yang menonaktifkan RW memberi Anda rasa aman palsu karena Anda bisa secara buta membaca dan menulis konten file dan mengakses subdirektori. Anda harus yakin bahwa setiap anak langsung dari direktori memiliki izin eksplisit.
  • Jarang Anda akan menggunakan nilai selain dari:
    • 0 : Tidak ada akses.
    • 1 : Akses minimum yang memungkinkan melintasi.
    • 5 : Izinkan membaca / menulis, tetapi tidak mengubah struktur pohon direktori itu sendiri.
    • 7 : Akses penuh.
David
sumber
1
Saya akan menganggap nilai 5 bermanfaat, ketika Anda ingin mengizinkan membaca / menulis, tetapi tidak mengubah struktur pohon direktori itu sendiri.
hgiesel
Kamu benar. Diperbarui!
David
4
Tabel ringkasan yang bagus. Membuat saya bertanya-tanya apa yang dipikirkan seseorang untuk -W-secara fungsional setara dengan ---untuk direktori. Tidak terlalu intuitif. Tentu saja jenis bit tingkat rendah ini sering tidak.
CivFan
2
Saya menguji ini di mac saya, tetapi dengan -W-, saya bisa mengganti nama direktori (dalam direktori dengan sedikit lengket) tetapi tidak dengan ---. Itu tampaknya menjadi perbedaan
cozyconemotel
3
@ David, Anda melewatkan sedikit lengket.
Pacerier
42

Ini artikel bagus tentang ini.

Ringkasan:

Direktori dengan xset bitnya memungkinkan pengguna untuk cd(mengubah direktori) ke direktori ini, dan mengakses file di dalamnya.

Detail:

  • Baca ( r)

    Kemampuan membaca nama-nama file yang disimpan dalam direktori ini.

  • Tulis ( w)

    Kemampuan untuk mengganti nama file di direktori, membuat file baru, atau menghapus file yang ada, jika Anda juga memiliki izin Jalankan. Jika Anda tidak memiliki perms yang dieksekusi, maka perms menulis tidak ada artinya.

  • Jalankan ( x)

    Kemampuan untuk cdmasuk ke direktori ini, dan mengakses file-file di direktori ini.

Berikut adalah beberapa contoh yang seharusnya membuatnya lebih mudah untuk dipahami:

# "Full Access".  Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory.  If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself.  She can access any file (file
# permissions permitting) if she knows its name.  She can
# create new files, or rename/delete existing ones.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir

Bahkan ada lebih banyak informasi dalam artikel Hacking Linux Exposed .

Kusalananda
sumber
4

Dari buku Robert Love "LINUX System Programming" bab 1 izin bagian-

masukkan deskripsi gambar di sini

alhelal
sumber
2

Untuk operasi apa pun yang mengakses file atau direktori, ia harus terlebih dahulu menyelesaikan jalur ke file atau direktori. Resolusi tersebut mengharuskan pengguna telah menjalankan izin pada semua direktori di sepanjang jalur, kecuali komponen jalur akhir. Jadi untuk direktori, Anda bisa memikirkan bit eksekusi berarti "dapat diselesaikan".

Ambil jalur /a/b/c.txtsebagai contoh, misalkan pengguna memiliki 1) menjalankan izin pada /dan /a; 2) telah membaca izin /a/b; 3) baca dan tulis izin /a/b/c.txt.

  • Pengguna akan gagal membaca (daftar) /a, karena tidak memiliki izin baca. Tetapi resolusi jalur tidak gagal.

  • Pengguna akan dapat membaca (daftar) /a/b, karena pengguna telah menjalankan izin aktif /, /adan membaca izin aktif /a/b. Perhatikan bahwa, ketika membaca /a/b, nama file c.txtterlihat, tetapi metadata (mis. Filesize) dan konten tidak, karena nama file disimpan dengan direktori, bukan dengan file, tetapi metadata disimpan dalam inode file.

  • Pengguna akan gagal untuk membaca /a/b/c.txt, karena ketika menyelesaikan jalan dari /ke /ake /a/b, gagal di /a/bkarena pengguna tidak memiliki izin eksekusi.

Lihat juga bagaimana nama path diselesaikan ke file .

Dagang
sumber
0

Analogi yang berguna adalah menganggap setiap file sebagai buku, dan setiap direktori sebagai ruang penyimpanan buku.

Ada aturan untuk dapat membuat daftar semua nama di sebuah ruangan: bit baca untuk direktori. Aturan untuk menghapus buku dari ruangan: bit tulis untuk direktori. Dan aturan untuk memasuki ruangan dan menjelajahi: direktori yang dihasilkan mengeksekusi bit.

Aturan-aturan itu terpisah dan berbeda dari aturan untuk setiap buku. Ada aturan untuk mengizinkan seseorang membuka buku dan membaca isinya: bit baca untuk setiap file. Ada aturan untuk mengubah isi buku: bit tulis untuk setiap file. Dan untuk mengeksekusi file: bit eksekusi untuk setiap file.

Saya menulis bit karena ada tiga bit untuk setiap tindakan. Ada satu bit baca untuk pemilik, satu bit baca untuk grup dan bit baca untuk orang lain (orang lain). Jika salah satu dari tiga bit tersebut ditetapkan untuk pengguna tertentu, pengguna tersebut memiliki bit baca yang aktif. Tidak peduli bagaimana yang sedikit ditemukan menjadi aktif baik oleh u ser atau g roup atau o ther, memiliki hasil yang efektif yang sama.

Dengan demikian, pengguna dapat diizinkan memasuki ruangan dan menghapus buku dari perpustakaan tetapi tidak diizinkan untuk membaca isi buku yang sama.

Itulah mengapa diperlukan bit baca untuk direktori: untuk mengontrol siapa yang diizinkan untuk membuat daftar isi kamar (judul buku).

Dan bit eksekusi digunakan untuk mengontrol siapa yang bisa memasuki ruangan buku.

Ishak
sumber
-1

Arti Execute untuk direktori cukup jelas. Karena tidak ada izin Traverse, tidak seperti Windows, Anda harus membebani sesuatu. Para desainer memilih Execute, Itu menyebabkan kebingungan tanpa akhir. Sebagai petugas keamanan komputer yang menetapkan hak Execute untuk sesuatu yang Anda tidak bermaksud untuk benar-benar Execute terlihat cerdik.

NemoX
sumber
1
Penemuan izin eksekusi itu agak mendahului penemuan konsep izin lintasan berbeda sekitar dua dekade. Logika jawaban ini tergantung dari garis waktu bersejarah yang tidak seperti dunia nyata, dan juga gagal untuk memperhatikan keberadaan GENERIC_EXECUTEdan apa itu.
JdeBP