Istnieje coś takiego jak podsystem w (Otwartym) SSH: jest to program, który zostaje zaśmiecony, gdy poprosisz o coś innego niż interaktywną powłokę. Technicznie jest to po prostu plik wykonywalny na zdalnym hoście, który jest wykonywany exec
przez sshd
dziecko po uwierzytelnieniu i wywołaniu setuid.
Możesz znaleźć standardową definicję podsystemu sftp
w swojej konfiguracji SSH:
Subsystem sftp /usr/lib/openssh/sftp-server
Ponieważ jest to zwykły plik wykonywalny, a nie SUID lub specjalny w jakikolwiek inny sposób, możesz napisać skrypt powłoki, który zmieni wszelkie potrzebne atrybuty, a następnie po prostu uruchom oryginalną procedurę obsługi podsystemu.
Umieść następujący skrypt w /usr/lib/openssh
folderze jak np. sftp-fperm-server
(Nie jest to wymagane, aby zachować rzeczy w jednym miejscu):
#!/bin/sh
umask 026
exec /usr/lib/openssh/sftp-server
Następnie dodaj wiersz na końcu /etc/ssh/sshd_config
:
Subsystem sftp-fperm /usr/lib/openssh/sftp-fperm-server
Następnie uruchom ponownie sshd
(nie zabija sesji przy ponownym uruchomieniu) i uruchom sftp
z -s sftp-fperm
opcją. Voila! pliki otrzymają nowy określony umask.
Jeśli nie chcesz określać tej opcji za każdym razem, po prostu zmień standardową definicję podsystemu. Nie wpłynie to na sesje interaktywne, więc nie ma szans na coś złamania.
Jeśli chcesz użyć newgrp
polecenia, będzie trochę trudniej. newgrp
zawsze uruchamia nową interaktywną powłokę, jednocześnie głupio nie pozwalając na przekazanie do niej żadnych parametrów, więc nie można jej używać jak umask
w poprzednim przykładzie. Ale możesz zastąpić ostatni wiersz skryptu:
SHELL=/usr/lib/openssh/sftp-server newgrp git
Właściwie wywołanie newgrp
jakiegoś grupy należę do emituje żądanie hasła, więc nie byłem w stanie sprawdzić tego rozwiązania (mam na myśli tylko newgrp
jedno), ale działa, kiedy przekazać /bin/id
na moim laptopie (bez SSH), więc jeśli dostałem newgrp
pracę dla użytkownika nie powinny pojawić się żadne problemy.