Pengguna tidak dapat menyentuh -t

10

Ketika SCP'ing ke server Fedora saya, pengguna terus mendapatkan kesalahan tentang tidak dapat memodifikasi cap waktu file ("setel waktu: operasi tidak diizinkan"). Pengguna bukan pemilik file, tetapi kami tidak dapat chownmengajukan file ke pengguna ini karena alasan keamanan. Pengguna dapat sudo, tetapi karena ini terjadi melalui klien SCP / FTP, tidak ada cara untuk melakukannya juga. Dan akhirnya, kami tidak ingin harus memberikan akses root kepada pengguna ini, hanya untuk memungkinkannya menggunakan sinkronisasi seperti rsync atau WinSCP yang perlu mengatur cap waktu.

Pengguna adalah bagian dari grup dengan rwizin penuh pada semua file dan dir yang relevan. Adakah pemikiran tentang bagaimana memberikan izin kepada pengguna untuk touch -tfile-file spesifik ini tanpa chownmemberikannya padanya?

Info Lebih Lanjut Ini semua berkaitan dengan mengaktifkan pengembangan PHP dalam skenario pengembang tunggal (yaitu: tanpa SCM). Saya mencoba untuk bekerja dengan Eclipse atau NetBeans untuk bekerja pada salinan lokal dari situs (WordPress) berbasis PHP, sambil memungkinkan pengguna untuk "langsung" melihat perubahannya di server pengembangan. Pengguna akan bekerja dari jarak jauh. Sejauh ini, semua upaya sinkronisasi otomatis telah gagal - bahkan menggunakan WinSCP dalam mode "watch folder", di mana ia memonitor folder lokal dan mencoba untuk mengunggah perubahan apa pun hingga kesalahan direktori jarak jauh karena selalu mencoba untuk mengatur tanggal / cap waktu .

Pengguna memang memiliki akses sudo, tetapi saya telah diberitahu bahwa itu benar-benar bukan ide yang baik untuk bekerja di bawah 'root', jadi saya tidak mau hanya login sebagai root untuk melakukan pekerjaan ini. Selain itu, seharusnya tidak perlu. Saya ingin yang lain, bukan pengguna super dapat melakukan hal yang sama - menggunakan informasi akun mereka, membuat koneksi FTP dan dapat bekerja dari jarak jauh melalui sinkronisasi. Jadi solusinya perlu bekerja untuk seseorang tanpa akses root.

Yang membuat saya bingung adalah seberapa banyak kesulitan yang saya alami. Semua perangkat lunak ini (NetBeans, Eclipse, WinSCP) dirancang untuk memungkinkan sinkronisasi, dan mereka semua mencoba untuk menulis stempel waktu. Jadi itu harus mungkin. WinSCP memiliki opsi untuk mematikan "set timestamp", tetapi opsi ini menjadi tidak tersedia (selalu "on") ketika Anda memilih monitor / sinkronisasi folder. Jadi itu harus menjadi sesuatu yang cukup standar.

Mengingat bahwa saya benar-benar idiot ketika datang ke Linux, dan saya adalah "admin server" dev, saya hanya dapat menganggap itu adalah sesuatu yang bodoh yang saya lakukan atau yang telah saya konfigurasi (salah).

Ringkasan Singkatnya, saya ingin setiap pengguna yang memiliki akses grup r / w ke direktori, untuk dapat mengubah cap waktu pada file dalam direktori tersebut melalui SCP.

Tom Auger
sumber
1
Apakah sistem file Anda terpasang dengan sesuatu yang lucu? Apakah Anda menggunakan ACL? Biasanya ini akan dimungkinkan dengan keanggotaan grup.
Caleb
5
Pada dasarnya sistem Anda memberi tahu Anda, "Anda tidak bisa menyentuh -t [miliknya]."
boehj
@ Caleb: Tidak, Anda hanya dapat mengatur ke tanggal saat ini kecuali Anda pemiliknya. @ Tom: Apakah penting tanggal itu dihormati? Bisakah Anda sedikit memperluas persyaratan: jika pengguna dapat menulis ke file, mengapa itu penting jika ia mungkin memilikinya? Biasanya, dalam situasi ini, siapa pun yang terakhir menulis ke file memilikinya.
Gilles 'SO- stop being evil'
@ Tom: Ada kontradiksi yang jelas antara "kami tidak ingin harus memberikan akses root pengguna ini" dan "Pengguna dapat sudo", bisakah Anda menjelaskan bagian ini dengan lebih baik? Mengenai penggunaan Anda terhadap rootgrup: rootgrup tidak memiliki izin khusus, hanya rootpengguna yang melakukannya.
Gilles 'SO- stop being evil'
2
@ Tom: ACL = daftar kontrol akses
Gilles 'SO- stop being evil'

Jawaban:

10

Mengapa itu tidak berhasil?

Ketika Anda mencoba untuk mengubah waktu modifikasi file dengan touch, atau lebih umum dengan panggilan sistem yang mendasarinya utime, ada dua kasus.

  • Anda mencoba mengatur waktu modifikasi file ke waktu tertentu. Ini mengharuskan Anda adalah pemilik file. (Secara teknis, ID pengguna efektif proses harus menjadi pemilik file .²)
  • Anda mencoba mengatur waktu modifikasi file ke waktu saat ini. Ini berfungsi jika dan hanya jika Anda memiliki izin untuk menulis ke file. Alasan pengecualian ini adalah bahwa Anda tetap dapat mencapai efek yang sama dengan menimpa byte file yang sudah ada dengan nilai yang sama¹.

Mengapa ini biasanya tidak masalah

  • Saat Anda menyalin file dengan ftp, scp, rsync, dll., Salinan membuat file baru yang dimiliki oleh siapa pun yang melakukan penyalinan. Jadi mesin fotokopi memiliki izin untuk mengatur waktu file.
  • Dengan rsync, Anda tidak akan dapat mengatur waktu direktori yang ada: mereka akan diatur ke waktu ketika file terakhir disinkronkan di dalamnya. Dalam kebanyakan kasus, ini tidak masalah. Anda dapat memberitahu rsync untuk tidak repot dengan waktu direktori dengan melewatkan --omit-dir-times( -O).
  • Dengan sistem kontrol versi, tanggal revisi disimpan di dalam file; metadata pada file sebagian besar tidak relevan.

Solusi

Ini semua ada hubungannya dengan mengaktifkan pengembangan PHP dalam skenario pengembang tunggal (yaitu: tanpa SCM).

Oke, berhenti di situ. Hanya karena ada satu pengembang tidak berarti Anda tidak boleh menggunakan SCM. Anda harus menggunakan SCM. Mintalah pengembang memeriksa file, dan memberinya cara untuk menekan tombol “deploy” untuk memeriksa file dari SCM ke direktori langsung.

Sama sekali tidak ada alasan teknis mengapa Anda tidak boleh menggunakan SCM, tetapi mungkin ada alasan manusia. Jika orang yang mengerjakan file-file ini menyebut dirinya "pengembang", ia harus menggunakan SCM. Tetapi jika ini adalah orang non-teknis yang mendorong dokumen masuk, SCM mungkin terlalu rumit. Jadi terus mendorong file melalui FTP atau SSH. Ada tiga cara ini bisa berhasil.

  • Apakah Anda benar-benar perlu menyinkronkan waktu? Seperti ditunjukkan di atas, rsyncmemiliki opsi untuk tidak menyinkronkan waktu. Scp tidak kecuali Anda mengatakannya. Saya tidak tahu WinSCP tetapi mungkin juga bisa.
  • Lanjutkan melakukan apa yang Anda lakukan, abaikan saja pesan tentang waktu. File-file tersebut masih disalin. Ini bukan pilihan yang baik, karena mengabaikan kesalahan selalu berisiko. Tetapi secara teknis memungkinkan.
  • Jika Anda membutuhkan fleksibilitas dalam mengisi file yang dimiliki oleh apachepengguna, maka pendekatan yang biasa dilakukan adalah mengizinkan akses SSH pengguna apache. The mudah pendekatan adalah untuk memiliki pengguna membuat SSH kunci pribadi dan menambahkan kunci publik yang sesuai dengan ~apache/.ssh/authorized_keys. Ini berarti pengguna akan dapat menjalankan perintah sewenang-wenang sebagai apachepengguna. Karena Anda baik-baik saja dengan memberikan hak sudo kepada pengguna, tidak masalah dalam kasus Anda. Mungkin saja, tetapi tidak begitu mudah, untuk menempatkan lebih banyak pembatasan (Anda memerlukan entri basis data pengguna terpisah dengan nama yang berbeda, ID pengguna yang sama, shell yang dibatasi dan chroot jail; detail dalam pertanyaan terpisah, meskipun ini mungkin sudah dibahas) di situs ini atau di Server Fault ).

¹ Atau, untuk file kosong, tulis satu byte dan kemudian potong.
² Cegah komplikasi tambahan, tetapi tidak ada yang saya tahu berlaku di sini.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih Gilles, untuk penjelasannya yang menarik. Saya tidak yakin seberapa jelas saya tentang use case. NetBeans terus melontarkan kesalahan "tidak dapat memutuskan" setiap kali saya menyinkronkan (meskipun file ditransfer dengan benar dan diverifikasi di server); WinSCP melempar waktu yang ditentukan: kesalahan operasi tidak diizinkan; ketika saya menghapus file saya mendapat peringatan tentang tidak dapat mengatur cap waktu ke waktu di masa depan. Di luar itu saya tidak tahu di mana masalahnya. Saya hanya ingin dapat menyinkronkan local ke dir remote. melalui SCP / FTP dan masalahnya tampaknya cap waktu. Apakah ini membantu? Mungkin tidak.
Tom Auger
@ Tom: Saya masih tidak mengerti mengapa Anda tidak bisa hanya memiliki pengguna memiliki file.
Gilles 'SO- stop being evil'
Beberapa file harus dimiliki oleh Apache (misalnya, direktori unggah) jadi saya tidak dapat meminta pemiliknya diubah, hanya karena seseorang sedang mengerjakan beberapa file dalam direktori. Apa yang Anda katakan tidak masuk akal - ketika saya menulis file menggunakan FTP secara berlebihan, pemiliknya tidak perlu berubah. Saya tidak melihat perlunya mengubah perilaku ini.
Tom Auger
@ Tom: Pemilik tidak berubah hanya karena ini adalah file yang ada. Saya tidak mengerti mengapa Anda tidak membiarkan pengguna mengunggah file apache- maka mereka dapat mengatur waktu. Lihat jawaban saya yang telah direvisi untuk solusi yang tepat dan beberapa yang kurang optimal.
Gilles 'SO- berhenti menjadi jahat'
Terima kasih telah menggunakan pertanyaan ini Gilles. Menggunakan SVN atau beberapa varian tidak optimal dari perspektif pengembangan. Siapa pun yang telah melakukan pengembangan web dari jarak jauh dapat memberi tahu Anda bahwa prosesnya biasanya micro-incremental - terutama saat penataan visual - sehingga Anda melakukan komit setiap 30-60 detik. Jika Anda harus terus-menerus keluar dari IDE Anda, menjalankan komit, dan kemudian melihat pratinjau browser Anda, Anda menambahkan satu ton overhead ke apa yang seharusnya menjadi proses yang sederhana. SVN hanya masuk akal dalam konteks ketika banyak pengembang sedang mengerjakan bagian situs yang sama. Ini berbeda dari pemrograman.
Tom Auger
2

Anda dapat mengatur rsync untuk menggunakan sudo di ujung jarak jauh seperti ini:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
Caleb
sumber
Apa yang akan menjadi aturan sudo? Cukup mengizinkan rsync akan memungkinkan pengguna untuk menimpa file sewenang-wenang. Cukup sulit untuk mendapatkan batasan argumen dengan benar, dan lagi pula di sini saya pikir Anda perlu membatasi input rsync, yang secara teknis dimungkinkan dengan skrip wrapper tetapi tidak mudah.
Gilles 'SO- berhenti menjadi jahat'
Anda benar, mengizinkan sudo rsyncsangat sulit untuk dibatasi. Saya hanya menyarankan itu karena OP mengatakan pengguna sudah memiliki akses sudo.
Caleb
Terima kasih - ini menarik, meskipun pengembang ada di kotak Windows, jadi saya tidak yakin rsync adalah cara terbaik untuk melakukannya. Sekali lagi, seperti yang saya sebutkan di edit ke posting saya, saya ingin solusi ini berfungsi untuk setiap pengguna rata-rata, bukan beberapa pengguna privilisasi, di luar seseorang yang termasuk dalam grup yang memiliki direktori tertentu.
Tom Auger
Saya pikir hal selanjutnya yang perlu diperhatikan adalah menyiapkan ACL (Access Control Lists), tetapi saya memiliki sedikit pengalaman di bidang ini sehingga mungkin beberapa guru dapat menambahkan jawaban dan menjelaskan jika dan bagaimana ini dapat dilakukan.
Caleb