Bagaimana saya mengatur kata sandi untuk perintah 'rm'?

29

Teman saya terus menghapus file saya menggunakan terminal. Jadi tolong bantu saya dengan menjelaskan cara membuat kata sandi untuk rmperintah.

aswin
sumber
50
Anda ingin kata sandi melindungi akun pengguna sehingga "teman" itu tidak mengaksesnya di tempat pertama.
Andrea Lazzarotto
14
Anda harus benar-benar mencoba mempelajari cara kerja sistem dan menggunakan fungsinya.
AlexP
13
Kemungkinan teman Anda mencoba "mengajarkan Anda pelajaran" dengan bermain-main dengan komputer Anda ketika Anda membiarkannya tidak dijaga. Pelajari pelajaran itu dengan melindungi akun Anda dan melarang akses tamu, atau memberikan akses tamu dengan izin berkurang.
Ken Williams
4
Harap ingat juga tentang unlinkperintah itu. Juga tentang mvperintah, karena Anda dapat secara efektif menimpa file dengan itu. Juga ...
Kos
17
Dengan teman seperti ini siapa yang butuh musuh?
kasperd

Jawaban:

46

Tidak ada cara mudah untuk mengatur kata sandi seperti itu pada rmperintah itu sendiri, tidak tanpa banyak peretasan kode yang mungkin akan merusak hal-hal seperti apt-getmenginstal paket dan menghapus file, dan membuat Anda harus memasukkan kata sandi ribuan kali, atau berpotensi mengganggu akses ke perintah untuk orang-orang yang akan membutuhkannya (seperti Anda, untuk menghapus file Anda sendiri). Anda dapat melakukan hal ini dengan memiliki beberapa akun pengguna dan beberapa set izin akses, dan membatasi akses ke bagian data yang berbeda, seperti direktori home Anda sehingga mereka tidak dapat mengaksesnya.

(Opsi lainnya adalah akun pengguna individu untuk setiap pengguna, dan kemudian Access Control Lists, seperti yang dijelaskan dalam jawaban lain yang diposting oleh Videonauth )

Inilah masalah intinya - Anda membiarkan teman Anda menggunakan sistem Anda. Ini memiliki banyak implikasi keamanan - konsep "siapa pun yang memiliki akses fisik ke kotak akan dapat mengendalikan sistem dan melakukan tugas apa pun" adalah Mantra Keamanan TI, itulah sebabnya Anda tidak 'berbagi' akses sistem fisik kecuali dengan personel resmi yang tepercaya.


Satu-satunya cara yang benar-benar waras untuk melakukan ini adalah dengan tidak memberi teman Anda akses ke komputer Anda , dan memberi mereka sistem "Tamu" khusus yang dapat mereka gunakan, bahwa Anda tidak terlalu peduli dengan file-file itu. Ini adalah cara paling 'aman' untuk menjaga file Anda tetap aman.


Tentu saja, jika itu bukan opsi, maka satu-satunya pilihan Anda yang benar-benar aman adalah mengonfigurasi beberapa akun pengguna, satu untuk setiap pengguna, dengan folder rumah yang berbeda, dan tidak membolehkan mereka mengakses direktori home Anda sendiri atau akses ke rumah pengguna lain mana pun direktori. Dan kemudian simpan semua yang Anda tidak ingin mereka sentuh di direktori home Anda, dan jangan beri mereka sudoakses, rootkata sandi, atau bagikan kata sandi Anda dengannya.

Beginilah cara Anda melakukan ini:

Katakanlah nama saya "Foo" dan saya ingin pengguna "Bar", seorang teman, menggunakan sistem saya tetapi tidak mengakses file saya. Langkah pertama adalah menolak akses ke siapa pun kecuali saya ke direktori rumah saya. Ini untuk memungkinkan pengguna lain untuk tidak menghapus file Anda, tetapi juga untuk mencegah pengguna lain mengintip di direktori home Anda dan melihat jenis barang apa yang Anda punya di direktori home Anda:

chmod 750 /home/Foo

Langkah kedua adalah membuat akun pengguna untuk "Bar" (JANGAN ketik apa yang ada dalam tanda kurung di bawah ini, itu hanya untuk tujuan informasi). Dengan cara ini, kita dapat memastikan dia memiliki hak akses yang terpisah:

sudo adduser --create-home --user-group --shell /bin/bash Bar
sudo passwd Bar
(set a temporary password - you will not see characters as you type though)

Langkah ketiga adalah membatasi direktori home mereka sehingga tidak ada yang bisa membongkar file mereka juga. Ini hanya membuat semuanya sama.

sudo chmod 750 /home/Bar

Cuci tangan Anda, bilas dengan baik, lalu ulangi langkah-langkah ini untuk berapa banyak pengguna yang Anda miliki di sistem. Mereka tidak akan dapat mengakses file Anda, dan karena Anda tidak akan memberi mereka hak administrator, mereka tidak dapat menghapus file Anda tanpa berusaha sudomelakukannya - karena Anda tidak mengizinkan ini, mereka tidak bisa sentuh barang-barang Anda. Dan mereka tidak akan dapat melihat file Anda juga, tanpa menjadi superuser, yang tidak akan terjadi di sini.


SELALU INGAT INI: Dengan memberi seseorang akses fisik ke mesin, atau akses secara umum, Anda akan menempatkan file dan data Anda dalam risiko. Ini adalah fakta yang diterima secara luas di dunia Keamanan TI, dan salah satu yang terus berlaku. Memberi teman Anda akses ke komputer Anda akan selalu membahayakan data Anda, jadi berikan mereka sistem mereka sendiri untuk dipusingkan, atau jangan beri mereka akses kemesin Anda .


Hanya catatan tentang enkripsi disk

Sementara enkripsi disk berfungsi baik untuk melindungi data Anda dari pihak ketiga, ada batasannya.

  1. Jika sistem menyala, disk sudah didekripsi, sehingga Anda berisiko.
  2. Beberapa sistem memiliki pendekatan enkripsi disk yang rusak . Sebagai contoh, beberapa sistem Acer menggunakan kata sandi Anda hanya untuk mengotorisasi enkripsi / dekripsi dan menggunakan kata sandi berkode keras, atau menggunakan enkripsi lemah yang mudah retak.
  3. Selalu ada metode untuk masuk ke 'kunci', atau mencoba mengekstraknya dari memori tepat setelah sistem dimatikan tetapi sebelum data RAM 'hilang' atau memburuk. (Saya tidak akan membahas ini secara mendalam, tetapi risiko ini memang ada).
  4. Akses fisik ke mesin, apakah sistemnya dienkripsi atau tidak, akan selalu membahayakan data Anda. Jangan memberikan akses fisik (atau akses jaringan jarak jauh) kepada orang yang tidak ingin berpotensi memberikan akses penuh ke sistem Anda.

Sementara Enkripsi Disk tidak menyelesaikan masalah ini, itu menempatkan lapisan tambahan sakit kepala untuk aktor ancaman. Seseorang yang jahat mungkin menyerah jika dienkripsi, atau mereka dapat menyiksa Anda (antrian wajib XKCD Security strip komik ).

Karena itu, jika sistem Anda dienkripsi, tetapi Anda membiarkan pengguna lain menggunakannya, apakah mereka memiliki kata sandi untuk didekripsi, atau Anda membiarkan laptop Anda didekripsi sehingga mereka dapat SSH masuk atau memiliki akses fisik. Dalam kedua kasus ini, itu buruk.

Yang mengatakan, jika sistem Anda tidak dienkripsi, maka bagian ini tidak memiliki relevansi untuk Anda.

Thomas Ward
sumber
Laptop saya memiliki hard drive terenkripsi. Apakah mengizinkan orang lain mengakses masih berisiko?
Tim
2
@Tim Ya, jika sistem dinyalakan dan didekripsi. Dan bahkan ketika itu mati, masih mungkin dengan teknologi, waktu, dan dedikasi yang tepat untuk menemukan kunci dekripsi yang berpotensi masih tersimpan dalam RAM. Enkripsi cakram bukanlah perlindungan 100% - ada cara lain di sekitarnya, ini lebih merupakan pertanyaan "Apakah orang jahat mau benar-benar menghabiskan banyak waktu dan tenaga di dalamnya". Dan dilihat dari pertanyaan OP, sistem mereka hidup dan tidak dienkripsi (sepenuhnya, atau sebagian) sehingga risiko penghapusan ada di sana.
Thomas Ward
3
@Tim Untuk menambah jawaban Thomas, beberapa laptop telah merusak implementasi enkripsi disk (jika Anda mengandalkan perangkat keras FDE). AFAIR Laptop Acer tidak benar-benar menggunakan kata sandi Anda untuk enkripsi, mereka menggunakannya hanya untuk mengesahkan enkripsi / dekripsi dengan kata sandi yang di-hardcode.
gronostaj
Data selalu berisiko jika orang yang tidak dipercaya memiliki akses ke sistem, dienkripsi atau tidak
Sergiy Kolodyazhnyy
1
@LightnessRacesinOrbit apt-getberjalandpkg , yang menjalankan skrip yang sering digunakan rm. Pada kotak Xenial saya, cd /var/lib/dpkg/info; grep -P '\brm\b' *instmenghasilkan 344 baris , di mana 333 terlihat seperti penggunaan nyata dari rmperintah - hanya dalam skrip instalasi . grep -P '\brm\b' *rmmenunjukkan lebih banyak lagi dalam skrip penghapusan (untuk menghapus file konfigurasi, bukan paket file).
Eliah Kagan
19

Ini mungkin bukan tentang rmperintah, karena ada cara mudah untuk menghapus file tanpa menggunakannya . Jika masalahnya adalah bahwa teman Anda secara tidak sengaja menyalahgunakan rmperintah, maka solusi yang membatasi penggunaan perintah itu secara khusus atau membuatnya bekerja dengan cara yang berbeda mungkin dapat membantu. Sebaliknya, jika masalahnya adalah teman Anda dengan sengaja memperlakukan data Anda dengan cara yang tidak Anda inginkan, maka Anda perlu menerapkan langkah-langkah keamanan yang sebenarnya , dan tidak ada solusi yang berfokus pada rmperintah itu sendiri (atau serangkaian perintah terpisah) akan membuat Anda tetap aman.

Apakah Anda perlu mengontrol akses, atau hanya mencegah kesalahan jujur?

Dengan asumsi teman Anda tahu Anda tidak ingin mereka menghapus file Anda, ada dua kemungkinan:

  1. Mereka bisa melakukannya dengan sengaja. Dalam skenario ini, teman-teman Anda dengan sengaja menghapus file Anda, dan Anda bahkan tidak bisa mempercayai mereka untuk mencoba memenuhi keinginan Anda tentang bagaimana mereka memperlakukan data Anda ketika mereka menggunakan komputer Anda. Satu-satunya solusi untuk masalah ini adalah dengan menggunakan langkah-langkah keamanan efektif yang sebenarnya , seperti dijelaskan Thomas Ward secara rinci . Seringkali ukuran terbaik untuk mencegah mereka menggunakan komputer Anda. Tetapi membuat mereka menggunakan akun pengguna mereka sendiri dapat memberikan perlindungan.

  2. Mereka bisa melakukannya secara tidak sengaja. Dalam skenario ini, teman-teman Anda sangat rawan kecelakaan, dan mereka terus menjalankan rmperintah yang mereka inginkan. Mereka ingin memperlakukan Anda dan data Anda dengan hormat, tetapi benar-benar buruk melakukannya dalam praktik karena mereka terus menjalankan perintah yang salah, menghapus file yang salah ... atau sesuatu seperti itu. Meskipun akan lebih baik untuk percaya bahwa inilah yang terjadi, saya memperingatkan Anda untuk tidak berasumsi bahwa orang-orang yang terus menghapus data Anda setelah Anda mengatakan kepada mereka untuk berhenti beroperasi tanpa niat buruk.

    Selain itu, meskipun niatnya baik, memberi mereka akun pengguna yang terpisah masih merupakan cara yang paling mudah mencegah mereka menghapus file Anda, selain tidak mengizinkan mereka menggunakan komputer Anda.

Jika situasinya benar-benar # 2 - teman Anda tidak mencoba untuk menghapus file Anda tetapi hanya perlu bantuan untuk tidak menghapusnya secara tidak sengaja , dan satu-satunya cara mereka secara tidak sengaja menghapusnya adalah melalui penyalahgunaan sejumlah kecil perintah secara tidak sengaja (seperti rm) bahwa mereka memiliki masalah menggunakan dengan benar - maka teknik dalam jawaban Videonauth mungkin berguna. Tapi Anda harus memahami bahwa mereka tidak langkah-langkah keamanan, karena itu rmperintah hanyalah salah satu dari banyak cara mudah untuk menghapus file . Lihat di bawah untuk detailnya.

Saya sarankan Anda bertanya pada diri sendiri, "Apakah situasi saya pada dasarnya sama seperti jika saya, daripada orang lain yang menggunakan komputer saya, apakah yang menggunakan rmsalah?"

Jika jawabannya tidak , maka ini adalah masalah keamanan informasi, dan Anda perlu mencegah teman Anda menggunakan akun pengguna Anda. Jika jawabannya adalah ya , maka Anda dapat menggunakan pendekatan yang sama Anda akan menggunakan jika Anda adalah orang menyalahgunakan rm:

  • Pendidikan. Teman-teman Anda perlu tahu apa yang mereka lakukan dan bagaimana cara menghindarinya.
  • Perubahan antarmuka. Tanpa menghilangkan kemampuan sebenarnya untuk menghapus file (yang membutuhkan akun pengguna terpisah), Anda dapat membuatnya lebih sulit untuk secara tidak sengaja menghapus file dengan membuatnya hanya berjalan sendiri, tanpa tindakan lebih lanjut, tidak akan langsung menghapus . Jawaban Videonauth memberikan satu pendekatan untuk ini. Dalam jawaban ini, saya menyajikan yang lain.rm filefile

Tetapi bahkan jika teman Anda tidak mencoba melakukan kesalahan, Anda tetap harus mempertimbangkan mereka menggunakan akun pengguna mereka sendiri yang terpisah . Ini masih akan memecahkan masalah - langkah-langkah keamanan yang sama yang melindungi data dari kehancuran yang disengaja akan melindunginya dari kerusakan yang tidak disengaja juga. Bahkan tanpa niat jahat, jika seseorang terus melakukan sesuatu yang Anda tidak ingin mereka lakukan, maka Anda tidak dapat mempercayai mereka untuk menahan diri dari melakukan hal itu.

Membuat rmprompt sebelum penghapusan dapat membantu mencegah beberapa kesalahan.

Untuk membantu orang menghindari tidak sengaja menghapus file dengan rm, Anda dapat membuat rmsebuah alias shell yang benar-benar berjalan rm -i. Melewati -ibendera untuk rmmenyebabkannya meminta pengguna sebelum menghapus setiap file (lihat man rm).

Anda dapat melakukan ini (untuk akun pengguna Anda) dengan menambahkan alias rm='rm -i'ke .bash_aliasesatau .bashrcfile Anda. Lihat pertanyaan ini dan yang itu untuk detailnya. Ini akan berlaku untuk bash shell yang baru saja dibuka.

Ini tidak memberikan keamanan yang sebenarnya , dan juga tidak mudah untuk mencegah kesalahan, karena:

  • Mereka dapat memilih untuk melanjutkan penghapusan, saat diminta.
  • Mereka dapat mem-bypass alias dengan berbagai cara, termasuk dengan menjalankan /bin/rmatau membatalkannya ( unalias rm).
  • Ada banyak situasi di mana ekspansi alias tidak terjadi , dan dalam situasi rmini tidak akan berjalan dengan -i.
  • Mereka masih dapat menghapus file dengan menggunakan salah satu teknik untuk melakukannya sehingga tidak memerlukan rm(seperti halnya dengan pendekatan Videonauth - lihat di bawah).
  • Mereka masih dapat merusak data tanpa menghapus file apa pun, seperti dengan menimpanya atau mengubah isinya (seperti halnya dengan pendekatan Videonauth).

Tetapi jika Anda tidak membutuhkan keamanan yang sebenarnya (lihat di atas), maka ini mungkin jalan yang harus ditempuh. Sebagai perbandingan dengan pendekatan untuk mencegah teman Anda menggunakan rmperintah yang disediakan sistem :

  • Mengasingkan diri rmmenjadi rm -ikurang efektif dalam mencegah kesalahan - sampai mereka beralih menggunakan beberapa teknik lain untuk menghapus file. Pada saat itu, menjaga mereka dari menggunakan rmakan sepenuhnya tidak efektif, bahkan jika mereka tidak berusaha melakukan kesalahan, karena mungkin mereka akan menggunakan unlink(atau perintah lain yang tak terhitung jumlahnya yang menghapus file) dengan kesembronoan yang sama.

  • Di sisi lain, karena ekspansi alias hanya terjadi dalam beberapa situasi - secara kasar, penggunaan shell biasa yang interaktif - teman Anda mungkin berpikir mereka akan diminta ketika mereka tidak benar-benar diminta (karena perintahnya ada di skrip, misalnya, atau dikeluarkan dari shell yang berbeda). Cara Videonauth tidak memiliki masalah ini, yang merupakan keunggulan obyektif dari metode itu alias rm='rm -i'.

  • Saat skrip berjalan, kecuali jika ditulis dengan sengaja untuk menggunakan alias, alias Anda tidak diperluas di dalamnya. Ini berarti bahwa aliasing rmuntuk rm -isangat tidak mungkin untuk memecahkan apa pun. Ini adalah keuntungan obyektif dari alias rm='rm -i'.

rm tidak dapat melakukan apapun yang tidak bisa dilakukan oleh program biasa lainnya.

Tidak ada yang spesial dari ini rm. Ini adalah cara mudah dan mendokumentasikan diri sendiri untuk menghapus file, jadi membatasi akses ke sana berisiko melanggar banyak skrip yang bergantung padanya. Tapi itu jauh dari satu-satunya cara untuk menghapus file - itu hanya program biasa.

Beberapa perintah melakukan beberapa tugas yang tidak dapat dilakukan oleh pengguna terbatas (non- root ) tanpa menjalankannya. Misalnya, sudomemungkinkan Anda menjalankan program sebagai pengguna lain, setelah memeriksa untuk memastikan Anda diizinkan melakukannya. passwdmengedit database tempat kata sandi pengguna disimpan, tetapi hanya memungkinkan Anda mengubah kata sandi Anda sendiri (kecuali jika Anda root, dalam hal ini Anda dapat mengubah kata sandi siapa pun).

/usr/bin/sudodan /usr/bin/passwddapat melakukannya karena mereka memiliki set bit setuid , seperti yang ditunjukkan oleh syang muncul di kolom paling kiri ketika Anda menjalankan ls -l:

ek@Io:~$ type -a sudo passwd rm
sudo is /usr/bin/sudo
passwd is /usr/bin/passwd
rm is /bin/rm
ek@Io:~$ ls -l /usr/bin/sudo /usr/bin/passwd /bin/rm
-rwxr-xr-x 1 root root  60272 Feb 18  2016 /bin/rm
-rwsr-xr-x 1 root root  54256 Mar 29  2016 /usr/bin/passwd
-rwsr-xr-x 1 root root 136808 Aug 17 09:20 /usr/bin/sudo

Perhatikan bahwa /bin/rmtidak ada s: izinnya adalah -rwxr-xr-x, sementara /usr/bin/passwddan sebaliknya /usr/bin/somemiliki -rwsr-xr-x. Ini membuatnya sehingga, tidak peduli siapa yang menjalankan passwdatau sudo, itu benar-benar berjalan sebagai pengguna root, karena root adalah pemilik yang dapat dieksekusi. (Ada juga bit setgid, yang, ketika diatur, menyebabkan executable dijalankan dengan identitas grup pemilik grup mereka daripada identitas pemanggil.)

Kecuali untuk setiap kerentanan keamanan yang belum ditemukan (atau yang telah ditemukan tetapi belum ditambal), sudodan passwdaman karena utilitas tersebut ditulis dengan sangat hati-hati sehingga mereka hanya dapat melakukan hal-hal yang harus diizinkan oleh penelepon. melakukan.

/bin/rmtidak bekerja seperti ini. Itu tidak setuid karena tidak perlu. Izin direktori (dan kadang - kadang izin file ) mengontrol file apa yang dapat dihapus pengguna, dan mereka tidak perlu menjadi root untuk melakukannya. Untuk menjadi sangat jelas, tolong jangan pernah mengatur bit setuidrm . Implikasi keamanan akan menjadi bencana, sejak itu, tidak peduli siapa yang menjalankan rm, seolah-olah root menjalankannya! (Utilitas menyukai sudodan passwdmemeriksa siapa yang benar-benar menjalankannya dan memeriksa apakah ada sesuatu yang diizinkan sebelum melakukannya; rmtidak ada yang seperti itu.)

Memeriksa apakah bit setuid (atau setgid) diset pada executable akan memberi tahu Anda jika membatasi siapa yang menjalankannya, ada peluang meningkatkan keamanan. Executable yang bukan setuid (atau setgid) tidak memiliki status khusus, dan siapa saja dapat menyalinnya dan menjalankan salinannya, membawa salinannya sendiri dari komputer lain, menulis skrip atau program yang melakukan hal yang sama, atau menggunakan program lain untuk melakukannya.

Menghapus File Tanpa rm

Cara yang jelas untuk menghapus file tanpa rmdi Ubuntu adalah menavigasi ke lokasinya di browser file grafis (Nautilus, jika Anda menggunakan Unity atau GNOME Shell) dan hapus file tersebut. Ada juga banyak perintah yang dapat digunakan untuk menghapus file dari terminal, tanpa pernah menggunakan rm.

Misalnya, untuk menghapus file yang disebut foo.txtdi direktori saat ini, perintah berikut ini, yang berfungsi di luar kotak pada Ubuntu dan tidak memerlukan akses rm, akan mencapainya. (Hanya untuk memastikan, saya mengujinya pada sistem minimal 16,04 yang diinstal hanya dengan utilitas sistem standar, setelah dihapus /bin/rm.)

  • unlink foo.txt
  • busybox rm foo.txt
  • perl -e 'unlink("foo.txt")'
  • python3 -c 'import os; os.remove("foo.txt")'( pythonbukan python3dalam rilis yang lebih lama)

Daftar itu, tentu saja, tidak lengkap. Tidak ada daftar lengkap dari perintah tersebut yang mungkin. Mencegah penghapusan file adalah salah satu hal yang terpisah dari akun pengguna dan izin file dan direktori untuk dicapai. Mereka bekerja sangat baik untuk mencegahnya. Sebaliknya, mengubah rmperintah (untuk membuatnya memerlukan kata sandi, atau dengan cara lain) atau membatasi akses untuk rmtidak mencegahnya sama sekali.

Eliah Kagan
sumber
2
Untuk penggunaan yang sebenarnya, aku seperti GNU rm's -Ipilihan. Ini hanya meminta untuk menghapus 4 file atau lebih, atau untuk menghapus secara rekursif. Jadi Anda tidak terbiasa untuk selalu menggunakan -f, \rmuntuk menghindari ekspansi alias, atau mengetik ytanpa membaca. Tapi itu masih akan menyelamatkan Anda dari kesalahan ketik yang buruk di mana Anda menekan kembali sebelum Anda bermaksud, atau glob Anda cocok dengan banyak file.
Peter Cordes
2
Cara lain yang menarik untuk memutuskan tautan file:, mv foo.txt /tmp/.gonelalu reboot, abaikan tmpfs yang tadi di-backing /tmp. Atau cukup gunakan mvuntuk mengubah nama banyak file menjadi nama yang sama, jadi hanya yang terakhir yang tersisa. Atau hanya menyembunyikan file dengan mengganti nama mereka dengan nama yang tidak jelas. Seperti yang ditunjukkan oleh bagian pertama dari jawaban ini, jika Anda berusaha untuk mempertahankan terhadap kebencian daripada ketidakmampuan, Anda hanya perlu mengunci orang dari akun Anda.
Peter Cordes
16

Anda dapat mengubah izin pada /bin/rmperintah melalui baris berikut yang akan mencegahnya dieksekusi tanpa akses sudo:

sudo chmod 750 /bin/rm

Ini secara khusus mencegah mereka dari menggunakan rmperintah yang disediakan oleh sistem. Anda harus menyadari bahwa itu tidak mencegah mereka menghapus file dengan cara lain.

Untuk mencegah mereka menggunakan rmdirperintah, yang merupakan cara umum untuk menghapus direktori, Anda dapat mengatur izin dengan cara yang sama di jalur yang dapat dieksekusi:

sudo chmod 750 /bin/rmdir

Ingatkan juga bahwa Anda hanya dapat menggunakan perintah ini dengan hak sudo juga.

Untuk mengubahnya kembali jika Anda tidak menyukainya atau terjadi masalah lain gunakan 755untukchmod


Seperti @muru tunjukkan di atas adalah solusi yang sangat kasar dan bahkan mungkin merusak layanan sistem yang tidak berjalan pada akun root . Oleh karena itu saya menambahkan di sini opsi lain menggunakan ACL (daftar kontrol akses) untuk melakukan hal yang sama dan mungkin jauh lebih aman ( baik untuk dibaca juga dan Anda dapat melewatkan bagian yang mengaktifkan karena ACL biasanya diinstal pada sistem Ubuntu saat ini):

Jadi untuk melakukan hal yang sama seperti di atas hanya untuk pengguna yang ingin Anda blokir

sudo setfacl -m u:<user-name>:- /bin/rm /bin/rmdir

Ganti saja <user-name>dengan nama pengguna yang sebenarnya yang ingin Anda hindari menggunakan file.

Seperti halnya chmod, menggunakan setfacl -muntuk mencegah pengguna tertentu dari menjalankan rmdan rmdirberlaku untuk perintah yang diberikan sistem saja. Itu tidak mencegah mereka menghapus file dan folder Anda di Nautilus atau dengan menggunakan perintah terminal lainnya.

Penjelasan:

  • yang -mberarti untuk memodifikasi file ACL.
  • bagian pertama dari perubahan, usingkatan dari pengguna. Ini dapat memiliki nilai berikut uuntuk pengguna, guntuk grup dan ountuk semua yang lainnya
  • bagian tengah <user-name>dapat menyimpan nama pengguna yang sebenarnya atau nama grup sesuai dengan apa yang ingin Anda ubah. Untuk mengatur perubahan keseluruhan Anda membiarkannya kosong.
  • bagian ketiga memegang jenis izin yang ingin Anda atur. Di sini, dalam contoh ini kami tidak ingin mengatur izin sama sekali, jadi kami memasukkannya -, juga dapat berisi surat-surat berikut runtuk izin baca, wuntuk izin menulis dan xuntuk eksekusi.
Videonauth
sumber
4
Akan lebih baik menggunakan ACL daripada menghapus izin eksekusi untuk orang lain - layanan sistem apa pun yang tidak berjalan sebagai root sekarang cacat.
muru
2
sudo setfacl -m u:<username>:- /bin/rm /bin/rmdir, IIRC. Anda dapat menguji ACL dengangetfacl /bin/rm /bin/rmdir
muru
2
Satu-satunya downside ke ACL seperti ini adalah itu jahat / sulit untuk mempertahankan jangka panjang ini. Dan mustahil untuk mempertahankan jika tidak ada pengguna individu pada sistem untuk setiap orang yang menggunakan sistem. Kalau tidak, itu ide yang bagus.
Thomas Ward
4
@ DavidFoerster Ya. Ada sejumlah cara efektif tanpa batas untuk menghapus file tanpa rm. Solusi yang diberikan Videonauth di sini adalah cara yang mungkin untuk membantu pengguna yang rawan kecelakaan berhenti menghapus hal-hal, tetapi itu tidak memberikan keamanan yang sebenarnya (yang mungkin baik-baik saja, jika teman-teman OP tidak sengaja mencoba untuk menumbangkan keinginan OP) . Videonauth: Saya sarankan untuk mengedit posting ini sehingga secara jelas mengklarifikasi bahwa itu tidak benar-benar mencegah orang menghapus file karena mereka tidak memerlukan rmperintah untuk melakukannya. (Saya menahan diri untuk tidak mengeditnya sendiri, kalau-kalau Anda tidak ingin mengatakan itu.)
Eliah Kagan
1
Jangan lupa bahwa Perl, Python, dan semua kompiler pada sistem memungkinkan pengguna lain untuk menghapus file juga. Mencegah orang menghapus file memerlukan lebih dari sekadar mengubah izin pada rmperintah.
Jonathan Leffler
8

Ini adalah jawaban yang sangat sederhana dan akan menghentikan seseorang dengan santai menggunakan perintah rm tanpa memberikan kata sandi. Ini bukan solusi yang aman dan Anda harus memberi beberapa saran alternatif dalam jawaban lain.

Namun, Anda bisa menggunakan alias untuk mengubah cara berperilaku perintah rm. Mencoba:

alias rm="sudo -l >/dev/null && rm"

Apa yang dilakukan adalah ketika seseorang memasuki perintah rm, ia menjalankan perintah sudo -l. Perintah ini memaksa pengguna untuk memasukkan kata sandi mereka. Jika mereka melakukannya dengan benar, itu mencantumkan hak istimewa mereka (kami membuang output ini) dan keluar dengan status 0, jika mereka salah, itu ada dengan kesalahan.

Kami kemudian mengikuti perintah sudo dengan "&&", yang keluar dari perintah berikut - dalam hal ini "rm" hanya jika perintah sebelumnya keluar dengan status 0 - yaitu mereka mendapatkan kata sandi yang benar.

Untuk membuat ini permanen, masukkan perintah alias di ~/.bashrc.

Perhatikan bahwa ini sangat mudah dikalahkan (misalnya, mereka cukup mengetik /bin/rm.

Nick Sillito
sumber
5

Terkadang itu bukan teman kita, kita adalah musuh terburuk kita sendiri

Saya telah menulis skrip untuk melindungi kata sandi rmseperti OP yang diminta tetapi juga mengedit agar Anda tidak menghapus:

  • /
  • /rumah
  • /tempat sampah

Sunting: 5 Mar 2017 - Ubah metode pemeriksaan jika berjalan di terminal.


Buat skrip

Gunakan gksu gedit /usr/local/bin/rmdan salin di baris ini:

#!/bin/bash

tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi

if [ $Terminal == "Y" ] ; then
    # Running from terminal don't allow delete of / or /toplevel directory even if sudo
    for i in ${@:1}
    do
        # Skip options -i -r -v -d 
        if [[ ${i:0:1} != "-" ]] ; then
            # if parameter doesn't begin with '-' it's file or directory, so get real path.
            fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
            # We must have at least two `/` in the full path
            levels=$(echo "$fullname" | tr -cd '/' | wc -c)
            if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
                echo "Attempting to remove top level directory '$fullname'"
                echo "Use 'sudo /bin/rm $@' instead."
                exit 1 # error
            fi
        fi
    done
fi


if [[ $(id -u) != 0 ]]; then # Only non-root processes enter password (ie "sudo rm ..." is ok)
  if [ $Terminal == "Y" ] ; then
  # Only running from a terminal needs password (ie not cron)

    # log rm usage to /var/log/syslog
    PARENT_COMMAND="$(ps -o comm= $PPID)"   
    logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"

    # Get password
    Password=$(zenity --password --title="Password for rm")
    encryptPassword=$(echo -n "$Password" | md5sum)

echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.

    if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe  -" ]]; then
        echo "Invalid password!"
        exit 1
    fi
  fi # non-terminals can't enter password.
fi # root doesn't need to enter password.

# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"

exit 0

Ubah kata sandi "WE2U" menjadi apa pun yang Anda suka dan simpan file tersebut.

Tandai rmskrip baru sebagai executable

Tandai rmskrip baru sebagai yang dapat dieksekusi menggunakan:

sudo chmod +x /usr/local/bin/rm

Bagaimana itu bekerja

kata sandi rm

Kecuali jika kata sandinya adalah WE2U , saat pertama kali Anda menjalankan skrip Anda akan mendapatkan "kata sandi tidak valid" dan kunci enkripsi untuk kata sandi yang Anda masukkan ditampilkan. Salin dan tempel kunci enkripsi ini dari terminal ke skrip. Kemudian komentari baris dengan gema yang menampilkan kunci enkripsi pada terminal.

Karena path /usr/local/binlebih tinggi dalam daftar daripada /binperintah kami rmdipanggil. Setelah mendapatkan kata sandi yang valid, itu panggilan /bin/rmuntuk melakukan penghapusan nyata.

Seperti yang ditunjukkan Thomas Ward dalam jawaban lain, jika Anda ingin melakukannya, sudo apt-get install ...Anda dapat diminta kata sandi ribuan kali. Script memeriksa apakah sudodigunakan dan tidak meminta kata sandi. Selanjutnya jika rmdipanggil dari dalam aplikasi GUI tidak ada kata sandi yang diperlukan.

Skrip panggilan loggeruntuk merekam setiap kali rmsecara manual dipanggil menggunakan terminal. Penggunaan perintah dicatat /var/log/syslog.

WinEunuuchs2Unix
sumber
1
Anda dapat menyamarkan kata sandi hanya dengan memasukkan versi hash ke dalam skrip, dan kemudian setiap kali pengguna memasukkan kata sandi, itu bisa saja hash dan memeriksanya terhadap hash yang dikodekan dengan keras.
Inisialisasi
@InitializeSahib dukungan kata sandi hash (enkripsi) telah ditambahkan ke skrip.
WinEunuuchs2Unix
3

Alternatif lain adalah membuat salinan cadangan dari semua file penting dalam direktori yang tidak dapat diakses oleh pengguna non-root. Anda dapat menggunakan rsyncatau unisonuntuk menyinkronkannya secara otomatis, pastikan setidaknya satu direktori di jalur ke tujuan cadangan dimiliki oleh root dan mode 700. Ini akan menghasilkan dua salinan dari semua file. Akan lebih aman untuk hanya membuat pengguna tamu untuk mereka gunakan, kecuali Anda harus ingat untuk selalu mengunci atau logout sebelum memberi mereka komputer atau meninggalkannya tanpa pengawasan.

Random832
sumber
3
Anda mungkin ingin menunjukkan cara menghindari penghapusan yang diperbanyak? Dan idealnya cara untuk mematikan dan menghidupkan sehingga ketika pengguna melakukan sesuatu yang memerlukan penghapusan untuk menjadi permanen, itu permanen.
ostergaard
@ajostergaard Pikiranku adalah bahwa setiap kali dia mendapatkan komputernya kembali dari teman-temannya, dia memeriksa secara manual bahwa tidak ada yang hilang dan mengembalikan apa pun yang ada. Tapi alat pilihan saya sendiri serempak digunakan dalam mode interaktif gui, yang membuatnya mudah untuk melihat (dan membalikkan) penghapusan.
Random832
2

Bukan jawaban langsung untuk pertanyaan yang Anda cari tetapi:

Jika teman Anda menghapus file Anda menggunakan rmperintah maka salah satu teman Anda tidak kompeten, tersentak, atau mereka adalah wannabes BOFH yang mencoba mengajarkan Anda untuk tidak membiarkan sesi Anda masuk dan tidak diawasi. Dalam semua kasus, solusinya sama: jangan biarkan sesi Anda masuk dan tidak dijaga .

Ini memiliki keuntungan karena tidak perlu mengingat untuk membuat perubahan khusus pada sistem setiap kali Anda memutakhirkan atau mendapatkan sistem baru, dan juga mencegah skrip dan hal-hal lain yang Anda gunakan yang bergantung pada perintah yang berperilaku seperti yang diharapkan dari kegagalan dengan cara yang tidak terduga.

Ini juga memiliki keuntungan menghentikan "teman" dari pindah ke langkah berikutnya. Apakah Anda juga ingin "melindungi kata sandi" mvperintah jika mereka memutuskan untuk memindahkan file Anda ke / dev / null ketika mereka mengetahui bahwa penghapusan sederhana tidak melakukan apa yang mereka inginkan? Saat Anda berada dalam permainan seperti ini, satu-satunya langkah yang menang bukanlah bermain.

Rob Moir
sumber
1

Saya memiliki kemungkinan serupa yang saya rencanakan. Di server file, jika penyimpanan utama foto dapat ditulis sehingga seseorang dalam keluarga (kurang teknis atau tidak sengaja) dapat menghapus sesuatu, secara tidak sengaja menyeret gui yang memindahkan direktori, atau menimpa dokumen asli dengan versi yang diedit alih-alih mengubah nama. .

Saya menyadari bahwa saya dapat melindungi itu tanpa membuat izin tidak dapat dituliskan untuk semua orang. ZFS membuat snapshot berkala sehingga penghapusan atau penimpaan yang tidak disengaja dapat dibalik. (Tidak seperti cadangan, snapshot ringan dan copy-on-write sehingga tidak menggandakan penggunaan penyimpanan Anda.)

ZFS asli untuk FreeBSD. Linux memiliki btrf yang juga memiliki snapshot.

JDługosz
sumber
0

Solusi yang sangat konyol untuk masalah yang sangat konyol.

Jika Anda tidak ingin chmod rm, rmdiratau mv(untuk mv filename /dev/null) atau penggunaan ACL, Anda bisa membuat user boneka dengan tidak ada password, tetapi Anda tahu dan alias setiap perintah untuk sudo [user], dan kemudian membuat alias untuk setiap perintah yang teman-teman Anda tidak tahu . Dengan cara ini, ketika teman Anda mengetik rmsistem akan meminta mereka untuk kata sandi (tetapi menebak kata sandi yang salah akan mencatat upaya yang gagal), dan Anda masih bisa mengetik rmaliasatau apa pun yang Anda pilih untuk benar-benar menghapus file.

Atau Anda bisa membuat akun tamu yang tidak memiliki akses ke direktori rumah Anda.

Andy
sumber
Sepertinya Anda berada di jalur yang benar. Jawaban Anda dapat ditingkatkan dengan menguraikan cara mengatur alias, sudo [user]dandummy user
WinEunuuchs2Unix
0

Jika Anda ingin melindungi kata sandi rm, solusinya adalah membuat pembungkus untuk rm yang memerlukan hak akses root, dan meminta kata sandi sebaliknya. (CATATAN: Pembungkus ini dapat hilang ketika paket coreutils diperbarui atau diinstal ulang.) Juga, harap dicatat ini hanya mengamankan rm, masih ada banyak, banyak cara lain untuk menghapus file.


Buka terminal dan menjadi root. Kemudian jalankan sudo mv /bin/rm /bin/rmolduntuk memindahkan rm lama ke tempat lain.

Sekarang jalankan sudo nano /bin/rmuntuk membuat pembungkus.

Di Nano, ketikkan yang berikut ini:

#!/bin/bash
/bin/rmold "$@"
exit "$?"

Kemudian tahan CTRL, dan tekan Xuntuk keluar. Tekan Ysaat Anda diminta, lalu tekan ENTERuntuk menyimpan file.

Akhirnya, kita perlu memberikan ini izin yang sesuai:

sudo chmod a+x /bin/rm

Dan begitulah.

Inisialisasi Sabah
sumber
1
Kecuali Anda memiliki alasan yang sangat bagus, variabel skrip harus selalu dikutip: $@=> "$@". Di sini, yang Anda usulkan adalah versi asli dan aman yang sangat berbahaya rm: bagaimana jika ada file bernama foo -i -r *( -iditambahkan untuk melindungi pengguna yang tidak bersalah)?
xhienne
Selain "mengutip $@seperti @xhienne katakan, saya mendorong Anda untuk memperingatkan pembaca dengan jelas bahwa ini tidak memberikan keamanan sama sekali karena ada banyak cara untuk menghapus file. Pertama adalah menelepon rmold, tetapi ada banyak cara lain, seperti dibahas dalam jawaban dan komentar lain tentang mereka. (Bahkan kemudian, ini akan memiliki masalah yang rmakan terasa seperti menghapus file sebagai pengguna saat ini - itu disebut tanpa sudo, dan rmberjalan normal sebagai penelepon - tetapi melakukannya sebagai root! Jika mereka baru saja sudomengedit, mereka menang ' t perhatikan mereka mungkin menghapus file sistem bahkan jika mereka tahu tentang perubahan itu.)
Eliah Kagan