Apakah izin saya untuk / usr / local / benar?

88

Saya menggunakan HomeBrew untuk kebutuhan port saya (sepertinya sedikit "lebih bersih" daripada MacPorts).

Saya dapat menginstal tanpa sudoing (yang hebat), tetapi langkah menautkan tampaknya memerlukannya ( /usr/local/share/man/man3dimiliki oleh root).
Sebuah panduan saya menemukan menyarankan saya rekursif chown /usr/localdengan melakukan

sudo chown -R `whoami` /usr/local

Apakah ini aman ... atau itu Ide Buruk ™?

Juga: apakah izin saya benar?

$ pwd
/usr/local/share/man
$ ls -lah
total 32
drwxrwxr-x    8 root  staff   272B  4 Set 11:02 .
drwxrwxr-x    9 root  staff   306B 10 Set 11:27 ..
drwxr-xr-x    3 root  wheel   102B  4 Ago  2009 de
drwxrwxr-x  163 root  staff   5,4K 10 Set 11:27 man1
drwxr-xr-x   11 root  wheel   374B 10 Set 11:27 man3
drwxr-xr-x    7 ago   staff   238B 10 Set 11:39 man5
drwxr-xr-x   11 ago   staff   374B 10 Set 11:39 man7
-rw-r--r--    1 root  staff    13K  4 Set 11:02 whatis
Lalu
sumber
5
Inilah bagaimana Homebrew seharusnya digunakan. Beberapa orang mungkin tidak setuju tetapi pengembang utama mengatakan untuk melakukan hal-hal seperti itu.
Mike McQuaid
1
Alternatif yang sedikit lebih baik untuk chown Anda: sudo chown -R :admin /usr/local. Dengan cara ini, ini akan bekerja sama untuk setiap pengguna admin mesin. Meskipun Anda mungkin juga perlu menjalankan sudo find /usr/local -perm -200 -exec chmod g+w '{}' \+untuk memastikan grup memiliki akses tulis yang sama dengan pengguna.
Slipp D. Thompson
12
"Saya akan menggunakan homebrew, rasanya lebih bersih daripada macports. Oh, lihat kekacauan izin yang tidak jelas ini. Saya akan memeriksa di Stack Overflow. Oh, ini peretasan cepat yang bertentangan dengan praktik terbaik Unix dan terhadap apa yang coba pembaruan OS coba untuk menegakkan. Sempurna! " Sebulan kemudian: "Hei, bagaimana malware ini diinstal?"
hmijail
Masalah yang saya miliki dengan pendekatan ini adalah itu berarti hanya akun pengguna yang menginstal Homebrew dapat menggunakannya. Saya memiliki Mac dengan banyak akun yang saya gunakan untuk menjaga proyek kerja terpisah dari proyek rumah (misalnya). Jika saya masuk ke akun yang salah saya tidak dapat menggunakan brew install. Saya telah mengambil rute ini untuk menghindari bahaya menggunakan root tapi saya tidak yakin itu pendekatan terbaik.
Auspice
@MikeMcQuaid Saya merasa menarik bahwa Homebrew akhirnya mengakui kesalahan dalam hal ini dan dalam versi baru yang dirilis satu atau dua minggu yang lalu, telah mengembalikan izin default ke / usr / local
oemb1905

Jawaban:

37

Biasanya lebih baik untuk menjaga izin seketat mungkin. Tetap /usr/localdimiliki dengan rootcara yang hanya proses yang berjalan sebagai root/ sudo(atau meminta pengguna admin melalui kotak dialog otorisasi Apple) dapat menulis ke daerah ini. Jadi, proses pengunduhan harus meminta kata sandi Anda sebelum merusak file di sana.

Tetapi seperti yang Anda katakan, itu membuat menambahkan program baru lebih sulit.

Saya setuju menjalankan sudo, karena Anda menginstal sesuatu lebih jarang daripada menjalankannya tetapi Anda harus percaya bahwa proses build tidak mengubah apa pun yang seharusnya.

Jika Anda ingin menghindari sudo saya akan menginstal Homebrew ke dalam ~/usr/localdan mengubah jalur Anda, manpath dll untuk memasukkan direktori di bawah sana.

Cara yang lebih baik adalah membuat pengguna lain — katakanlah, homebrewdan buat direktori yang dimiliki oleh pengguna itu. Kemudian, instal menggunakan sana sudo -U homebrew. Pengguna lain akan mendapat manfaat karena tidak dapat menimpa file lain, karena mereka tidak berjalan root dan program lain tidak dapat memengaruhi homebrew. (Saya perhatikan bahwa Homebrew FAQ menyarankan pengguna baru ini jika Anda berada di "lingkungan multi-pengguna". Saya akan mengatakan bahwa mesin Unix apa pun termasuk macOS adalah lingkungan multi-pengguna)

Namun seperti yang dikatakan oleh wiki Homebrew, resep tidak menemukan semua case /usr/localdan menggantinya dengan direktori yang dipilih. Saya kira kita terjebak /usr/local.

pengguna151019
sumber
1
+1 untuk menjaga otorisasi tetap ketat, dan mengubah $PATHserta $MANPATHmemasukkan direktori pengguna. Jika program yang diinstal tidak memerlukan instalasi di seluruh sistem, itu adalah alternatif yang jauh lebih baik.
zneak
3
+1 dan jawaban yang diterima untuk "menjaga izin seketat mungkin". Doing brew doctor(disarankan di bawah) memberi tahu saya bahwa saya hanya perlu membaca direktori shared man ... cukup aman untuk saya.
Agos
1
Solusi kompromi, setidaknya bagi orang yang menjaga keamanan agar tidak berjalan sebagai pengguna Admin sepanjang waktu, adalah mengubah kepemilikan dan izin grup sehingga hanya Admin yang dapat menulis ke / usr / lokal. Lihat jawaban kenorb.
hmijail
2
@Mark Saya merasa menarik bahwa Homebrew akhirnya mengakui kesalahan ini dan dalam versi baru yang dirilis seminggu atau dua minggu yang lalu, telah mengembalikan izin default ke / usr / local
oemb1905
48

Saya menggunakan Homebrew juga dan dapat memastikan itu benar-benar aman. Mengutip halaman Instalasi di FAQ Homebrew resmi :

Bantulah dirimu sendiri dan pilihlah /usr/local

  1. Lebih mudah
    /usr/local/bin sudah ada di Anda PATH.

  2. Lebih mudah.
    Banyak skrip build rusak jika dependensinya tidak berada di / usr atau / usr / local. Kami memperbaiki ini untuk rumusan Homebrew (walaupun kami tidak selalu mengujinya), tetapi Anda akan menemukan bahwa banyak skrip penyetelan RubyGem dan Python yang merupakan sesuatu di luar kendali kami.

  3. Aman
    Apple telah mematuhi POSIX dan meninggalkan direktori ini untuk kita. Yang berarti tidak ada /usr/localdirektori secara default, jadi tidak perlu khawatir tentang mengacaukan alat yang ada.

Jika Anda berencana untuk menginstal permata yang bergantung pada brews maka selamatkan diri Anda dari kerumitan dan instal ke /usr/local!

Bukan hal yang sepele untuk memberitahu permata untuk mencari di direktori non-standar untuk header dan dylibs. Jika Anda memilih /usr/local, semuanya “hanya berfungsi!”

Saya hanya akan menambahkan bahwa hal melakukan sebagai root adalah ide yang sangat buruk , sehingga chowning /usr/localtidak hanya tampaknya masuk akal untuk saya (itu bukan sistem dir di OSX), tapi waras .

Izin Anda belum benar (belum). Jalankan saja perintah yang Anda daftarkan dan Anda akan baik-baik saja.

Jika Anda memiliki masalah lain, ingat, ini brew doctordapat membantu Anda!

Carmine Paolino
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
bmike
7
Obrolan hilang, yang sangat disayangkan. Jadi dengan risiko mengulang sejarah, saya akan meninggalkan komentar saya di sini: bahwa ini dilakukan tidak berarti bahwa ini aman.
hmijail
4
Inti dari grafik adalah meskipun ini adalah apa yang disarankan oleh Homebrew ada alasan mengapa ini salah
user151019
1
brew doctorbenar-benar luar biasa.
Utku
5
@Carmine Paolino Saya merasa menarik bahwa Homebrew akhirnya mengakui kesalahan dalam hal ini dan dalam versi baru yang dirilis satu atau dua minggu yang lalu, telah mengembalikan izin default ke / usr / local
oemb1905
9

Jika Anda menggunakan Homebrew, Anda harus memberikan izin menulis kepada grup tertentu (baik adminatau staff), sehingga file dapat dibagikan di antara pengguna yang berada di grup itu.

Sebagai contoh:

sudo chgrp -R admin /usr/local /Library/Caches/Homebrew
sudo chmod -R g+w /usr/local /Library/Caches/Homebrew

Kemudian tetapkan pengguna yang harus memiliki akses ke brewperintah ke grup itu (periksa grup Anda melalui:) id -Gn.

Kemudian ketika bekerja dengan brew, jangan jalankan dengan sudo.

Saat masih memiliki masalah izin, jalankan brew doctoruntuk memecahkan masalah.

kenorb
sumber
+1 untuk memberikan solusi aktual, berperilaku lebih baik, meskipun tidak benar-benar selesai. Misalnya: menambahkan pengguna ke grup admin di tingkat BSD? Tidakkah itu mengacaukan konsep pengguna Admin OS X?
hmijail
Sebagai catatan, saya mengikuti instruksi ini, tetapi hanya menggunakan pengguna Admin buatan OS X GUI saya yang ada daripada menambahkan siapa pun ke grup mana pun di CLI. Berhasil: untuk dapat menjalankan perintah brew, pertama-tama harus saya lakukan su myAdminUser, dan kemudian semuanya berfungsi sebagaimana mestinya. Tetapi tentu saja solusi ini tidak akan memberikan keamanan bagi orang-orang yang toh sudah menjalankan pengguna Admin sepanjang waktu.
hmijail
Ini mungkin cara terbaik untuk pergi, saya setuju dengan @kenorb
pixel 67
7

Untuk apa nilainya, /usr/localtidak dianggap sebagai folder "sistem" oleh OS X, dan pada Snow Leopard baru instal folder itu kosong.

Semua barang yang dimiliki root di folder itu adalah hasil dari sudo make installpada perangkat lunak lain, atau memberikan kata sandi Anda setelah mengklik dua kali pada sesuatu .pkgyang ingin membuang barang ke dalam /usr/local.

Memiliki /usr/local"bekerja untuk saya" pada 2 mesin selama lebih dari setahun.

Salah satu paham adalah bahwa jika Anda telah menginstal MySQL (tidak menggunakan Homebrew) dan meng-chown file-nya, maka itu mungkin tidak akan dapat melihat database lagi (jadi Anda harus chown kembali ke pengguna apa pun yang dijalankan sebagai pengguna MySQL sebagai .)

Adam Vandenberg
sumber
5
gcc dan alat pengembangan lain terlihat secara otomatis di / usr / local sehingga mempengaruhi sistem
user151019
11
Masalahnya bukan bahwa itu adalah folder "sistem"; itu adalah folder "systemwide". Bahkan jika tidak ada apa-apa di sana, /usr/local/binmasih dalam nilai default $PATH, dan apa pun yang Anda masukkan di sana dapat digunakan oleh pengguna lain juga dan harus dipercaya . Jika seluruh /usr/local/direktori memiliki izin yang sama /usr/local/share/mansaat ini pada pengaturan OP, siapa pun dapat pergi dan mengubah biner apa pun dengan skrip yang melakukannya rm -rf ~.
zneak
1
terlalu berisiko: kemungkinan saya akan menginstal MySQL cepat atau lambat
Agos
2
@ Agos: Anda selalu dapat menginstal MySQL dengan HomeBrew, dalam hal ini Anda tidak akan memiliki masalah :)
Carmine Paolino
1
@ Agos Tidak berisiko sama sekali. Peringatan hanya berlaku jika Anda telah menginstal MySQL sebelum Homebrew. Jika Anda melakukannya setelah itu izin pada /usr/localharus baik-baik saja. (Tapi Anda mungkin tetap menggunakan Postgres. :))
Marnen Laibow-Koser
6

Seperti dalam Homebrew 1.0.0:

Homebrew tidak perlu lagi memiliki kepemilikan / usr / lokal. Jika mau, Anda dapat mengembalikan / usr / local ke kepemilikan default dengan: sudo chown root: wheel / usr / local

Yuhao Zhang
sumber
1
Saya sedang memperbarui Brew menggunakan brew update, yang masih memerlukan kepemilikan /usr/local. Saya akan mencoba mengembalikan izin setelahnya.
Joshua Pinter
Ini benar-benar info hebat! Saya menetapkan perms seperti yang ditentukan oleh Homebrew (<1.0), dan setelah memperbarui, ia memberikan instruksi ini tentang cara mengembalikannya.
mortona42
0

Saya pikir itu OK bagi pengguna untuk memiliki hak akses menulis ke /usr/local- setelah semua, itu berarti Anda tidak menggunakan sudopada setiap membangun script. Saya tidak suka gagasan memiliki pengguna biasa /usr/local. Saya lebih suka memiliki root (atau serupa) sendiri /usr/local, tetapi ubah izin sehingga pengguna (atau setidaknya beberapa kelompok istimewa) dapat menulis untuk itu. Itu sepertinya pendekatan yang benar secara konseptual.

Marnen Laibow-Koser
sumber
7
Masalahnya di sini adalah /usr/local/binmungkin ada di depan $ PATH untuk sebagian besar pengguna. Membuat direktori yang bisa dituliskan dunia membuka banyak celah keamanan dengan cara itu.
nohillside
@ patrix Jadi ubah jalurnya. :) Jika Anda memiliki skrip yang memiliki lubang keamanan karena jalur perintah yang ambigu, saya akan menyalahkan skrip, bukan izin Anda - perintah yang dipanggil dalam skrip biasanya harus sepenuhnya memenuhi syarat untuk alasan ini. Bagaimanapun, tidak ada solusi yang lebih baik: Anda memberikan umask yang tidak aman ke akun admin Anda, atau Anda menjalankan semua skrip build Anda sudo, atau Anda memberikan izin kepada beberapa pengguna untuk menulis /usr/local. Saya akan menganggap yang ketiga sebagai yang paling tidak berisiko ... kecuali Anda tahu cara yang lebih baik.
Marnen Laibow-Koser
Hmm. Memikirkan hal ini lagi, mungkin cara yang lebih baik adalah membuat Homebrew melakukan apa yang dilakukan RVM secara default: instal semuanya ke dalam ~/brewatau semacamnya. Masalahnya, bagaimanapun, adalah bahwa tidak seperti Ruby, yang cukup mandiri, banyak utilitas * nix berharap untuk menemukan satu sama lain di /usr/local...
Marnen Laibow-Koser
3
Saya lupa menyebutkan bahwa saya /usr/localtidak dapat ditulis oleh dunia: melainkan, saya memiliki grup tepercaya homebrew(bukan hanya admin) yang telah menulis izin untuk itu (izin yang diperluas seperti 0: group:homebrew allow add_file,delete,add_subdirectory,delete_child,file_inherit,directory_inheritbenar - benar rock). Ini adalah kompromi terbaik saya sudah bisa untuk mencari tahu: ada sudopada membangun script, tetapi beberapa kontrol atas /usr/local.
Marnen Laibow-Koser
@ MarnenLaibow-Koser Saya akan senang melihat penjelasan yang lebih mendalam tentang pendekatan ini (membuat grup pengguna tepercaya dengan izin menulis /usr/local). Melakukan banyak trawl di SO dan situs lain, melihat argumen kembali: memindahkan Homebrew ke folder home pengguna vs. tetap /usr/local, mengubah pemilik dan / atau grup /usr/localatau tidak, dan seterusnya ... sulit untuk mengetahui apakah ada solusi yang dapat diterima secara universal. Apakah Anda memiliki posting blog atau artikel tentang ini, atau dapatkah Anda memberikan penjelasan yang lebih dalam di suatu tempat?
Gabriel L.