Czy moje uprawnienia do / usr / local / correct?

88

Używam HomeBrew do moich potrzeb związanych z portem (wydaje się nieco „czystszy” niż MacPorts).

Mogę zainstalować bez sudoing (co jest świetne), ale wydaje się, że krok łączenia man go wymaga ( /usr/local/share/man/man3jest własnością root). Przewodnik znalazłem sugeruje I rekursywnie wykonując
chown /usr/local

sudo chown -R `whoami` /usr/local

Czy to jest bezpieczne ... czy to Bad Idea ™?

Ponadto: czy moje uprawnienia są prawidłowe?

$ 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
Agos
źródło
5
Tak ma być używany Homebrew. Niektórzy ludzie mogą się nie zgadzać, ale główny programista mówi, aby robić to w ten sposób.
Mike McQuaid,
1
Nieco lepsza alternatywa do chown: sudo chown -R :admin /usr/local. W ten sposób będzie działać tak samo dla każdego administratora komputera. Może być jednak konieczne uruchomienie, sudo find /usr/local -perm -200 -exec chmod g+w '{}' \+aby upewnić się, że grupa ma taki sam dostęp do zapisu jak użytkownik.
Slipp D. Thompson
12
„Użyję homebrew, wydaje się czystszy niż macports. Och, spójrz na ten źle zdefiniowany bałagan uprawnień. Sprawdzę Przepełnienie stosu. Och, oto szybki hack, który jest sprzeczny z najlepszymi praktykami Uniksa i z tym, jakie próby aktualizacji systemu operacyjnego egzekwować. Idealne! ”. Miesiąc później: „Hej, jak to złośliwe oprogramowanie zostało zainstalowane?”
hmijail
Problem z tym podejściem polega na tym, że może z niego korzystać tylko konto użytkownika, które instaluje Homebrew. Mam komputer Mac z wieloma kontami, których używam do oddzielania projektów roboczych od projektów domowych (na przykład). Jeśli jestem zalogowany na niewłaściwe konto, nie mogę użyć instalacji brew. Wybrałem tę drogę, aby uniknąć niebezpieczeństw korzystania z rootowania, ale nie jestem przekonany, że to najlepsze podejście.
Auspice
@MikeMcQuaid Uważam za interesujące, że Homebrew w końcu przyznał się do błędu, aw nowej wersji wydanej tydzień lub dwa lata temu przywrócił domyślne uprawnienia do / usr / local
oemb1905

Odpowiedzi:

37

Zazwyczaj lepiej jest zachować jak najściślejsze uprawnienia. Zachowanie /usr/localwłasności rootoznacza, że ​​tylko procesy działające jako root/ sudo(lub proszą administratora o skorzystanie z okna dialogowego autoryzacji Apple) mogą pisać w tym obszarze. Dlatego proces pobierania musi poprosić Cię o podanie hasła przed uszkodzeniem plików.

Ale jak mówisz, utrudnia to dodawanie nowych programów.

Nie przeszkadza mi uruchamianie sudo, ponieważ instalujesz rzeczy rzadziej niż uruchamianie, ale musisz ufać, że proces kompilacji niczego nie zmieni.

Jeśli chcesz uniknąć sudo, zainstalowałbym Homebrew ~/usr/locali zmieniłem twoją ścieżkę, manpath itp., Aby uwzględnić znajdujące się tam katalogi.

Lepszym sposobem jest utworzenie innego użytkownika - powiedzmy, homebrewi utworzenie katalogu należącego do tego użytkownika. Następnie zainstaluj tam za pomocą sudo -U homebrew. Inni użytkownicy skorzystają z tego, że nie będą mogli nadpisywać żadnych innych plików, ponieważ nie działają one, ponieważ root inne programy nie mogą wpływać na homebrew. (Zwracam uwagę, że FAQ Homebrew sugeruje, aby nowy użytkownik był w „środowisku wielu użytkowników”. Powiedziałbym, że każda maszyna z systemem Unix, w tym macOS, jest środowiskiem wielu użytkowników)

Jednak, jak głosi wiki Homebrew, przepisy nie zawierają wszystkich przypadków /usr/locali zastępują je wybranym katalogiem, który, jak podejrzewam, utknął /usr/local.

użytkownik151019
źródło
1
+1 za utrzymanie ścisłych uprawnień oraz modyfikowanie $PATHi $MANPATHdołączanie katalogów użytkowników. Jeśli zainstalowane programy nie wymagają instalacji systemowej, jest to znacznie lepsza alternatywa.
zneak
3
+1 i zaakceptowana odpowiedź za „zachowaj uprawnienia tak surowe, jak to możliwe”. Wykonanie brew doctor(sugerowane poniżej) powiedziało mi, że muszę tylko przeglądać katalogi wspólnych użytkowników ... wystarczająco bezpieczne dla mnie.
Agos,
1
Rozwiązaniem kompromisowym, przynajmniej dla osób dbających o bezpieczeństwo na tyle, aby nie działały przez cały czas jako administratorzy, jest zmiana własności i uprawnień grupy, aby tylko administratorzy mogli pisać do / usr / local. Zobacz odpowiedź kenorba.
hmijail
2
@ Mark Uważam za interesujące, że Homebrew w końcu przyznał się do błędu, aw nowej wersji wydanej tydzień lub dwa temu przywrócił domyślne uprawnienia do / usr / local
oemb1905
48

Używam również Homebrew i mogę potwierdzić, że jest całkowicie bezpieczny. Cytując stronę instalacji na oficjalnym Homebrew FAQ :

Zrób sobie przysługę i wybierz /usr/local

  1. Łatwiej
    /usr/local/bin jest już w twoim PATH.

  2. Łatwiej
    Mnóstwo skryptów kompilacji psuje się, jeśli ich zależności nie występują w / usr lub / usr / local. Naprawiliśmy to dla formuł Homebrew (chociaż nie zawsze to testujemy), ale zauważysz, że wiele skryptów instalacyjnych RubyGems i Python psuje się, co jest poza naszą kontrolą.

  3. To bezpieczne, że
    Apple jest zgodny z POSIX i zostawił ten katalog dla nas. Co oznacza, że /usr/localdomyślnie nie ma katalogu, więc nie musisz się martwić o zepsucie istniejących narzędzi.

Jeśli planujesz zainstalować klejnoty zależne od naparów, zaoszczędź sobie kłopotów i zainstaluj /usr/local!

Nie jest trywialne powiedzenie klejnotowi, aby szukał w niestandardowych katalogach nagłówków i dylibów. Jeśli wybierzesz /usr/local, wszystko „po prostu działa!”

Dodam tylko, że robi rzeczy jako root jest bardzo złym pomysłem , więc chowning /usr/localnie tylko uzasadnione wydaje mi się (to nie reż System na OSX), ale zdrowa .

Twoje uprawnienia są jeszcze niepoprawne (jeszcze). Po prostu uruchom wymienione polecenie i wszystko będzie dobrze.

Jeśli masz inne problemy, pamiętaj, brew doctormoże ci pomóc!

Carmine Paolino
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
bmike
7
Czat zniknął, a szkoda. Tak więc, ryzykując powtórzenie historii, zostawiam tutaj mój komentarz: że to zrobione nie oznacza, że ​​jest to bezpieczne.
hmijail
4
Istota wykresu jest taka, chociaż Homebrew sugeruje, że istnieją powody, dla których jest to złe
użytkownik151019
1
brew doctorjest po prostu niesamowity.
Utku
5
@Carmine Paolino Uważam za interesujące, że Homebrew w końcu przyznał się do błędu, aw nowej wersji wydanej tydzień lub dwa temu przywrócił domyślne uprawnienia do / usr / local
oemb1905
9

Jeśli korzystasz z Homebrew, powinieneś zezwolić na zapis konkretnej grupie (albo adminalbo staff), aby pliki mogły być współużytkowane przez użytkowników należących do tej grupy.

Na przykład:

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

Następnie przypisz użytkowników, którzy powinni mieć dostęp do brewpoleceń do tej grupy (sprawdź swoje grupy poprzez id -Gn:).

Następnie podczas pracy z brewnie uruchamiaj go sudo.

Jeśli nadal masz problem z uprawnieniami, uruchom go, brew doctoraby rozwiązać problem.

kenorb
źródło
+1 za podanie rzeczywistego, lepiej zachowującego się rozwiązania, nawet jeśli tak naprawdę nie jest skończone. Na przykład: dodać użytkownika do grupy administracyjnej na poziomie BSD? Czy to nie będzie bałagan z koncepcją administratorów OS X?
hmijail
Dla przypomnienia postępowałem zgodnie z tymi instrukcjami, ale po prostu użyłem mojego istniejącego użytkownika administratora OS X, zamiast dodawać kogokolwiek do dowolnej grupy w interfejsie CLI. Działa: aby móc uruchomić polecenia parzenia, najpierw muszę to zrobić su myAdminUser, a potem wszystko działa zgodnie z przeznaczeniem. Ale oczywiście to rozwiązanie nie zapewni żadnego bezpieczeństwa osobom, które i tak już prowadzą administratora.
hmijail
To chyba najlepsza droga, zgadzam się z @kenorb
piksel 67
7

Co do tego, co jest warte, /usr/localnie jest uważany przez OS X za folder „systemowy”, a na zupełnie nowej instalacji Snow Leopard ten folder jest pusty.

Wszelkie rzeczy należące do roota w tym folderze są wynikiem działania sudo make installinnego oprogramowania lub podania hasła po dwukrotnym kliknięciu pliku, .pkgktóry chce zrzucić rzeczy /usr/local.

Posiadanie /usr/local„pracowało dla mnie” na 2 maszynach od ponad roku.

Jednym z problemów jest to, że jeśli zainstalowałeś MySQL (nie używając Homebrew) i przeglądałeś jego pliki, to prawdopodobnie nie będzie już w stanie zobaczyć swoich baz danych (więc będziesz musiał odesłać je z powrotem do dowolnego użytkownika, który działa jako MySQL jako .)

Adam Vandenberg
źródło
5
gcc i inne narzędzia programistyczne automatycznie sprawdzają
katalog
11
Problemem nie jest to, że jest to folder „systemowy”; jest to, że jest to folder „ogólnosystemowy”. Nawet jeśli nic tam nie ma, /usr/local/binnadal ma $PATHwartość domyślną , a cokolwiek tam umieścisz, może być również używane przez innych użytkowników i powinno być godne zaufania . Jeśli cały /usr/local/katalog ma takie same uprawnienia, jak /usr/local/share/manobecnie w konfiguracji OP, każdy może przejść i zmienić dowolny plik binarny za pomocą skryptu, który to robi rm -rf ~.
zneak
1
zbyt ryzykowne: jest prawdopodobne, że prędzej czy później zainstaluję MySQL
Agos
2
@Agos: zawsze możesz zainstalować MySQL z HomeBrew, w którym to przypadku nie będziesz mieć żadnych problemów :)
Carmine Paolino,
1
@Agos W ogóle nie ryzykowne. Uwaga dotyczy tylko sytuacji, gdy zainstalowałeś MySQL przed Homebrew. Jeśli zrobisz to później, uprawnienia /usr/localpowinny być w porządku. (Ale prawdopodobnie i tak korzystasz z Postgres.))
Marnen Laibow-Koser
6

Jak w Homebrew 1.0.0:

Homebrew nie musi już posiadać własności / usr / local. Jeśli chcesz, możesz przywrócić domyślną własność / usr / local za pomocą: sudo chown root: wheel / usr / local

Yuhao Zhang
źródło
1
Obecnie aktualizuję Brew brew update, który nadal wymaga posiadania /usr/local. Spróbuję później przywrócić uprawnienia.
Joshua Pinter
To naprawdę świetna informacja! Ustawiłem perms zgodnie ze specyfikacją Homebrew (<1.0), a po aktualizacji podałem te instrukcje, jak je przywrócić.
mortona42
0

Myślę, że użytkownicy mogą mieć uprawnienia do zapisu/usr/local - w końcu oznacza to, że nie używasz sudokażdego skryptu kompilacji. Nie podoba mi się pomysł zwykłego użytkownika posiadania wynosi /usr/local . Wolałbym mieć root (lub podobny) /usr/local, ale zmień uprawnienia, aby użytkownicy (lub przynajmniej uprzywilejowana grupa) mogli do niego pisać. To wydaje się być poprawnym koncepcyjnie podejściem.

Marnen Laibow-Koser
źródło
7
Problem polega na tym, że /usr/local/bindla większości użytkowników bardzo dobrze może być to $ PATH. Uczynienie katalogu do zapisu na świecie otwiera w ten sposób wiele luk bezpieczeństwa.
nohillside
@patrix Więc zmień ścieżki. :) Jeśli masz skrypty, które mają luki w zabezpieczeniach z powodu niejednoznacznych ścieżek poleceń, winiłbym skrypty, a nie twoje uprawnienia - polecenia wywoływane w skryptach zwykle powinny być w pełni kwalifikowane właśnie z tego powodu. W każdym razie nie ma lepszego rozwiązania: albo dajesz swojemu administratorowi niepewne umask, albo uruchamiasz wszystkie skrypty kompilacji sudo, albo dajesz niektórym użytkownikom uprawnienia do zapisu /usr/local. Trzecią uważam za najmniej ryzykowną ... chyba że znasz lepszy sposób.
Marnen Laibow-Koser
Hmm Zastanawiając się nad tym, być może lepszym sposobem byłoby, aby Homebrew zrobił to, co domyślnie robi RVM: zainstaluj wszystko ~/brewlub coś takiego. Problem polega jednak na tym, że w przeciwieństwie do Ruby, która jest dość samodzielna, wiele narzędzi * nix spodziewa się, że odnajdą się w /usr/local...
Marnen Laibow-Koser
3
Zlekceważyłem wspomnienie, że /usr/localnie można zapisywać na całym świecie: mam raczej zaufaną grupę homebrew(nie tylko administratora), która ma uprawnienia do zapisu (rozszerzone uprawnienia, takie jak 0: group:homebrew allow add_file,delete,add_subdirectory,delete_child,file_inherit,directory_inheritcałkowicie rock). To najlepszy kompromis, jaki udało mi się wymyślić: brak sudoskryptów kompilacji, ale pewna kontrola /usr/local.
Marnen Laibow-Koser
@ MarnenLaibow-Koser Chciałbym zobaczyć bardziej szczegółowe wyjaśnienie tego podejścia (tworzenie zaufanej grupy użytkowników z uprawnieniami do zapisu /usr/local). Robiąc dużo włoków na SO i innych stronach, widząc argumenty dotyczące: przeniesienia Homebrew do folderu domowego użytkownika vs. trzymania w środku /usr/local, zmiany właściciela i / lub grupy /usr/localitd. Itd.… Trudno powiedzieć, czy są jakieś powszechnie akceptowane rozwiązanie. Czy masz post na blogu lub artykuł na ten temat, czy mógłbyś gdzieś udzielić głębszych wyjaśnień?
Gabriel L.,