Użytkownik nie może dotknąć -t

10

Kiedy SCP'uje się na mój serwer Fedory, użytkownik ciągle otrzymuje błędy związane z niemożnością modyfikacji znaczników czasu pliku („ustaw czas: operacja niedozwolona”). Użytkownik nie jest właścicielem pliku, ale nie możemy chownprzesyłać plików do tego użytkownika ze względów bezpieczeństwa. Użytkownik może sudo, ale ponieważ dzieje się to za pośrednictwem klienta SCP / FTP, również nie ma na to sposobu. I wreszcie, nie chcemy dawać temu użytkownikowi uprawnień roota, aby pozwolić mu na użycie synchronizacji takiej jak rsync lub WinSCP, która musi ustawić znaczniki czasu.

Użytkownik należy do grupy z pełnymi rwuprawnieniami do wszystkich odpowiednich plików i katalogów. Czy są jakieś przemyślenia na temat tego, jak udzielić użytkownikowi uprawnień do touch -ttych konkretnych plików bez chownich udostępniania ?

Dalsze informacje Wszystko to ma związek z włączeniem programowania PHP w scenariuszu jednego programisty (tj. Bez SCM). Próbuję współpracować z Eclipse lub NetBeans, aby pracować nad lokalną kopią witryny opartej na PHP (WordPress), jednocześnie pozwalając użytkownikowi na „natychmiastowe” wyświetlenie podglądu jego zmian na serwerze programistycznym. Użytkownik będzie pracował zdalnie. Do tej pory wszystkie próby automatycznej synchronizacji nie powiodły się - nawet przy użyciu WinSCP w trybie „obserwuj folder”, gdzie monitoruje folder lokalny i próbuje przesłać wszelkie zmiany aż do błędu katalogu zdalnego, ponieważ zawsze próbuje ustawić datę / znacznik czasu .

Użytkownik ma dostęp do sudo, ale powiedziano mi, że naprawdę nie jest dobrym pomysłem praca w trybie „root”, więc nie chciałem zalogować się jako root, aby wykonać tę pracę. Poza tym nie powinno to być konieczne. Chciałbym, aby jakiś inny, nieużytkownik mógł zrobić to samo - używając informacji o koncie, nawiązać połączenie FTP i móc pracować zdalnie za pośrednictwem synchronizacji. Więc rozwiązanie musi działać dla kogoś bez dostępu do roota.

To, co mnie zdumiewa, to poziom trudności. Wszystkie te oprogramowanie (NetBeans, Eclipse, WinSCP) są zaprojektowane tak, aby umożliwić synchronizację i wszystkie próbują zapisać znacznik czasu. To musi być możliwe. WinSCP ma opcję wyłączenia „ustaw znacznik czasu”, ale ta opcja staje się niedostępna (zawsze „włączona”) po wybraniu opcji monitorowania / synchronizacji folderu. Więc to dostaje się coś, co jest dość standardowe.

Biorąc pod uwagę, że jestem kompletnym idiotą, jeśli chodzi o Linuksa i jestem deweloperem „administratorem serwera”, mogę tylko założyć, że to coś idiotycznego, co robię lub że mam (źle) skonfigurowane.

Podsumowanie W skrócie, chcę, aby wszyscy użytkownicy, którzy mają dostęp grupowy do / z katalogu, mogli zmienić znacznik czasu plików w tym katalogu za pośrednictwem SCP.

Tom Auger
źródło
1
Czy twój system plików jest zamontowany z czymś zabawnym? Czy korzystasz z list ACL? Zwykle byłoby to możliwe przy członkostwie w grupie.
Caleb
5
Zasadniczo twój system mówi ci: „Nie możesz dotknąć -t [jego]”.
boehj
@Caleb: Nie, możesz ustawić tylko bieżącą datę, chyba że jesteś właścicielem. @Tom: Czy ważne jest, aby data była przestrzegana? Czy mógłbyś nieco rozszerzyć wymagania: jeśli użytkownik może zapisać do pliku, dlaczego ma to znaczenie, jeśli może je posiadać? Zwykle w takich sytuacjach każdy, kto ostatnio napisał do pliku, jest jego właścicielem.
Gilles „SO- przestań być zły”
@Tom: Widoczna jest sprzeczność między „nie chcemy udostępniać tego użytkownika rootowi” a „użytkownikiem może sudo”, czy mógłbyś lepiej wyjaśnić tę część? Jeśli chodzi o korzystanie z rootgrupy: rootgrupa nie ma specjalnych uprawnień, tylko rootużytkownik.
Gilles „SO- przestań być zły”
2
@Tom: ACL = lista kontroli dostępu
Gilles „SO- przestań być zły”

Odpowiedzi:

10

Dlaczego to nie działa

Podczas próby zmiany czasu modyfikacji pliku za pomocą touchlub bardziej ogólnie za pomocą wywołania systemowego utime, istnieją dwa przypadki.

  • Próbujesz ustawić czas modyfikacji pliku na określony czas. Wymaga to, że jesteś właścicielem pliku. (Technicznie rzecz biorąc, efektywny identyfikator użytkownika procesu musi być właścicielem pliku .²)
  • Próbujesz ustawić czas modyfikacji pliku na bieżący czas. Działa to wtedy i tylko wtedy, gdy masz uprawnienia do zapisu do pliku. Powodem tego wyjątku jest to, że i tak można osiągnąć ten sam efekt, zastępując istniejący bajt pliku tą samą wartością¹.

Dlaczego to zwykle nie ma znaczenia

  • Podczas kopiowania plików za pomocą ftp, scp, rsync itp. Kopia tworzy nowy plik, którego właścicielem jest ten, kto zrobił kopię. Więc kopiarka ma uprawnienia do ustawiania czasów pliku.
  • Dzięki rsync nie będziesz mógł ustawić czasu istniejących katalogów: zostaną one ustawione na czas, kiedy plik był w nich ostatnio synchronizowany. W większości przypadków nie ma to znaczenia. Możesz powiedzieć rsync, aby nie zawracał sobie głowy czasem katalogu, przekazując --omit-dir-times( -O).
  • W systemach kontroli wersji daty zmian są przechowywane w plikach; metadane w plikach są w większości nieistotne.

Rozwiązania

Wszystko to ma związek z włączeniem programowania PHP w scenariuszu jednego programisty (tj. Bez SCM).

Ok, zatrzymaj się tutaj. To, że istnieje jeden programista, nie oznacza, że ​​nie powinieneś używać SCM. Powinieneś używać SCM. Poproś programistę, aby sprawdził plik i dał mu możliwość naciśnięcia przycisku „wdróż”, aby pobrać pliki z SCM do katalogu na żywo.

Nie ma absolutnie żadnego technicznego powodu, dla którego nie powinieneś używać SCM, ale może być ludzki powód. Jeśli osoba pracująca nad tymi plikami nazywa się „programistą”, powinien używać SCM. Ale jeśli jest to osoba nietechniczna, która wpycha dokumenty, SCM może być zbyt skomplikowane. Więc dalej pchaj pliki przez FTP lub SSH. Można to zrobić na trzy sposoby.

  • Czy naprawdę potrzebujesz synchronizować czasy? Jak wskazano powyżej, rsyncma opcję niesynchronizowania czasów. Scp nie zrobi tego, chyba że to powiesz. Nie znam WinSCP, ale prawdopodobnie też może.
  • Kontynuuj robienie tego, co robisz, po prostu zignoruj ​​wiadomości o czasach. Pliki są nadal kopiowane. To nie jest dobra opcja, ponieważ ignorowanie błędów jest zawsze ryzykowne. Ale jest to technicznie możliwe.
  • Jeśli potrzebujesz elastyczności w zapełnianiu plików należących do apacheużytkownika, wówczas zwykłym podejściem byłoby zezwolenie użytkownikowi na SSH dostęp jako apache. Proste podejście jest, aby użytkownik utworzyć prywatny klucz SSH i dodać odpowiedni klucz publiczny ~apache/.ssh/authorized_keys. Oznacza to, że użytkownik będzie mógł uruchamiać dowolne polecenia jako apacheużytkownik. Ponieważ i tak dajesz użytkownikowi uprawnienia do sudo, w twoim przypadku nie ma to znaczenia. Możliwe jest, ale nie tak łatwe, nałożenie dodatkowych ograniczeń (potrzebujesz osobnego wpisu bazy danych użytkownika o innej nazwie, tym samym identyfikatorze użytkownika, ograniczonej powłoce i więzieniu chroot; szczegóły w osobnym pytaniu, choć może to już być omówione na tej stronie lub na usterce serwera ).

¹ Lub, dla pustego pliku, napisz bajt, a następnie obetnij.
² Z wyjątkiem dodatkowych komplikacji, ale żadne, o których wiem, nie ma tutaj zastosowania.

Gilles „SO- przestań być zły”
źródło
Dzięki Gilles za ciekawe wyjaśnienie. Nie jestem jednak pewien, o ile bardziej jasne mogę być na temat przypadku użycia. NetBeans nadal zgłasza błędy „nie można odłączyć” przy każdej synchronizacji (chociaż plik jest poprawnie przesyłany i weryfikowany na serwerze); WinSCP zgłasza błędy „ustawiony czas: operacja niedozwolona”; kiedy rozpakowuję plik, otrzymuję ostrzeżenia o niemożności ustawienia znacznika czasu na czas w przyszłości. Poza tym nie wiem, na czym polega problem. Chcę po prostu móc zsynchronizować lokalny ze zdalnym katalogiem. przez SCP / FTP, a problemem wydają się być znaczniki czasu. czy to pomaga? Prawdopodobnie nie.
Tom Auger
@Tom: Nadal nie rozumiem, dlaczego nie możesz po prostu mieć użytkowników plików.
Gilles „SO- przestań być zły”
Niektóre pliki muszą być własnością Apache (na przykład katalog do przesyłania), więc nie mogę zmienić właściciela, tylko dlatego, że ktoś pracuje nad niektórymi plikami w tym katalogu. To, co mówisz, nie ma sensu - kiedy nadpisuję plik za pomocą FTP, właściciel niekoniecznie się zmienia. Nie widzę potrzeby zmiany tego zachowania.
Tom Auger,
@Tom: Właściciel nie zmienia się tylko dlatego, że są to istniejące pliki. Nie rozumiem, dlaczego nie pozwalasz użytkownikom na przesyłanie plików jako apache- wtedy mogliby ustalić czasy. Zobacz moją poprawioną odpowiedź, aby znaleźć właściwe rozwiązanie i kilka nieoptymalnych.
Gilles „SO- przestań być zły”
Dzięki za trzymanie się tego pytania Gilles. Korzystanie z SVN lub jakiegoś wariantu jest nieoptymalne z punktu widzenia rozwoju. Każdy, kto wykonał programowanie zdalnie, może powiedzieć, że proces ten jest zwykle mikroinkrementalny - szczególnie w przypadku stylizacji wizualnej - więc zatwierdzanie odbywa się co około 30–60 sekund. Jeśli musisz stale wychodzić z IDE, uruchamiać zatwierdzanie, a następnie przeglądać przeglądarkę, dodajesz mnóstwo narzutów do tego, co powinno być prostym procesem. SVN ma sens tylko w kontekście, gdy wielu programistów pracuje nad tą samą częścią witryny. Różni się od programowania.
Tom Auger
2

Możesz skonfigurować rsync do używania sudo na zdalnym końcu w następujący sposób:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
Caleb
źródło
Jaka byłaby zasada sudo? Po prostu zezwolenie rsync pozwoliłoby użytkownikowi na zastąpienie dowolnych plików. Trudno jest właściwie wyregulować ograniczenia argumentów, a tutaj myślę, że powinieneś nałożyć ograniczenia na dane wejściowe rsync, co jest technicznie możliwe przy użyciu skryptu opakowania, ale nie jest łatwe.
Gilles „SO- przestań być zły”
Masz rację, pozwolenie sudo rsyncjest bardzo trudne do ograniczenia. Zasugerowałem to tylko dlatego, że OP powiedział, że użytkownik ma już dostęp do sudo.
Caleb
Dzięki - to ciekawe, chociaż programista jest na Windowsie, więc nie jestem pewien, czy rsync jest najlepszym rozwiązaniem. Ponownie, jak wspomniałem w edycji do mojego postu, chcę, aby to rozwiązanie działało dla każdego przeciętnego użytkownika, a nie dla niektórych uprzywilejowanych użytkowników, poza osobą należącą do grupy, która jest właścicielem tego konkretnego katalogu.
Tom Auger,
Myślę, że następną rzeczą do rozważenia jest skonfigurowanie list ACL (list kontroli dostępu), ale mam niewielkie doświadczenie w tej dziedzinie, więc może jakiś guru może dodać odpowiedź i wyjaśnić, czy i jak można to zrobić.
Caleb