
Ich habe Probleme, mit gcsfuse einen Speicher-Bucket in einem Verzeichnis zu mounten, das für SFTP-Uploads auf einer CentOS 7-Compute-Engine-VM in GCP verwendet wird. Ich habe zunächst versucht, es mithilfe der grundlegenden Anweisungen zu mounten, die wie folgt gemountet wurden:
GOOGLE_APPLICATION_CREDENTIALS=/root/service_account.json gcsfuse al-dev-sftp /sftp
aber ich konnte keine Dateien/Verzeichnisse im gemounteten Verzeichnis erstellen. Nach einiger Recherche habe ich das Laufwerk dann wie folgt gemountet:
GOOGLE_APPLICATION_CREDENTIALS=/root/service_account.json gcsfuse -o allow_other --gid 0 --uid 0 --file-mode 777 --dir-mode 777 al-dev-sftp /sftp
wodurch die Erstellung von Dateien und Verzeichnissen möglich war. Allerdings konnte ich keine der Dateien oder Verzeichnisse chownen/chmodden, wie es zum Chroot-Jailing von Benutzerverzeichnissen erforderlich wäre, wie es ein normaler Anwendungsfall für SFTP ist.
Um dies zu beheben, habe ich symbolische Links zum bereitgestellten SFTP-Speicherlaufwerk erstellt. Das funktionierte einwandfrei, bis wir bemerkten, dass die Synchronisierung beim Platzieren von Dateien auf SFTP korrekt war. Wenn wir jedoch eine Datei in den Bucket legten, wurde sie nicht mit dem bereitgestellten SFTP-Verzeichnis synchronisiert. Ich habe versucht, rsync auszuführen, aber egal, in welche Richtung ich es versuchte, wir haben in beiden Fällen Dateien verloren. (Später habe ich gelesen, dass gcsfuse keine Verknüpfungen unterstützt.)
Bei weiteren Recherchen fand ich ein GitHub-Projektfür ein Kubernetes GCS SFTP-Setupdas sah vielversprechend aus. Ich verwende in keiner Weise Container, aber ich war daran interessiert, wie die Einbindung durchgeführt wurde und welche SFTP-Konfiguration verwendet wurde. Dies führte mich dazu, eine Einbindung wie diese zu erstellen:
gcsfuse --uid 1000 --gid 1001 -o nonempty wraheem /test_sftp/wraheem/upload
Dadurch wird mein Upload-Verzeichnis für jeden Benutzer in einem separaten Bucket gemountet (nicht ideal, aber wenn ich es hinbekomme, ist es ok) und ich kann dem Benutzerordner Root-Rechte zuweisen und gleichzeitig dem Benutzer die Berechtigung für den Upload-Ordner erteilen, wodurch er in SFTP perfekt gesperrt wird.
Das Problem dabei ist, dass der Benutzer eine Fehlermeldung erhält, wenn er sich über SFTP (in Filezilla) anmeldet und versucht, zu seinem Upload-Ordner zu navigieren:
Status: Retrieving directory listing of "/test_sftp/wraheem/upload"...
Command: cd "/test_sftp/wraheem/upload"
Error: Directory /test_sftp/wraheem/upload: no such file or directory
was offensichtlich existiert.
Mein SSHD-Konfigurationseintrag lautet:
Match User wraheem
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /test_sftp/wraheem
AllowTcpForwarding no
Dies funktioniert problemlos mit jedem anderen normalen Verzeichnis mit dem Jail-Muster, bei dem Root das Benutzerverzeichnis und der Benutzer die Unterverzeichnisse besitzt.
Ich habe mir die Halterung selbst angesehen und Folgendes gesehen:
wraheem on /test_sftp/wraheem/upload type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions)
und was mir auffiel, ist, dass user_id und group_id auf Null (root) gesetzt sind, obwohl ich Dateien hinzufügen kann und wenn ich ein ls -l ausführe, werden die Ordner- und Dateiberechtigungen gesetzt:
drwxr-xr-x. 1 wraheem wraheem 0 Aug 22 20:16 upload
Ich frage mich, ob der Einhängepunkt, obwohl ich die entsprechenden Berechtigungen habe, root gehört und es daher keine Rolle spielt. Als Test habe ich versucht, das Standard-Remote-Verzeichnis auf /media (im Besitz von root) festzulegen und habe in Filezilla genau denselben Fehler wie zuvor erhalten.
Hat jemand gcsfuse auf diese Weise für SFTP verwendet? Oder kann jemand sehen, wo ich einen Schritt bei einem Konfigurationsproblem übersehen habe?
Vielen Dank für jede Hilfe, die Ihnen einfällt. Ich frage mich, ob dies an diesem Punkt überhaupt für SFTP verwendet werden kann …