it-swarm.com.de

So richten Sie die Umask von ssh für alle Arten von Verbindungen ein

Ich habe nach einer Möglichkeit gesucht, OpenSSHs umask über alle Verbindungstypen hinweg konsistent auf 0027 Einzustellen.

Nach Verbindungstypen beziehe ich mich auf:

  1. sftp
  2. scp
  3. ssh Hostname
  4. ssh Hostname Programm

Der Unterschied zwischen 3. und 4. besteht darin, dass der erstere eine Shell startet, die normalerweise die /etc/profile - Informationen liest, während der letztere dies nicht tut.

Durch das Lesen von dieser Beitrag bin ich außerdem auf die Option -u aufmerksam geworden, die in neueren Versionen von OpenSSH vorhanden ist. Dies funktioniert jedoch nicht.

Ich muss auch hinzufügen, dass /etc/profile Jetzt umask 0027 Enthält.

Punkt für Punkt gehen:

  • sftp - Das Einstellen von -u 0027 in sshd_config wie erwähnt hier reicht nicht aus.

Wenn ich diesen Parameter nicht setze, verwendet sftp standardmäßig umask 0022. Das heißt, wenn ich die beiden Dateien habe:

-rwxrwxrwx 1 user user 0 2011-01-29 02:04 execute
-rw-rw-rw- 1 user user 0 2011-01-29 02:04 read-write

Wenn ich sftp verwende, um sie auf dem Zielcomputer abzulegen, erhalte ich tatsächlich:

-rwxr-xr-x 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

Wenn ich jedoch -u 0027 Auf sshd_config Des Zielcomputers setze, erhalte ich tatsächlich:

-rwxr--r-- 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

was nicht erwartet wird, da es eigentlich sein sollte:

-rwxr-x--- 1 user user 0 2011-01-29 02:04 execute
-rw-r----- 1 user user 0 2011-01-29 02:04 read-write

Versteht jemand, warum dies passiert?

  • scp - Unabhängig davon, was für sftp eingerichtet ist, sind die Berechtigungen immer umask 0022. Ich habe derzeit keine Ahnung, wie ich das ändern soll.

  • ssh Hostname - hier kein Problem, da die Shell standardmäßig /etc/profile liest, was im aktuellen Setup umask 0027 bedeutet.

  • ssh Hostname Programm - gleiche Situation wie scp .


In der Summe ändert das Setzen von umask auf sftp das Ergebnis, aber nicht wie es sollte. ssh hostname Funktioniert wie erwartet und liest /etc/profile Und sowohl scp als auch ssh hostname program scheinen irgendwo umask 0022 fest codiert zu haben.

Jeder Einblick in einen der oben genannten Punkte ist willkommen.

EDIT: Ich möchte Patches vermeiden, die das manuelle Kompilieren von openssh erfordern. Auf dem System wird Ubuntu Server 10.04.01 (lucid) LTS mit openssh Paketen von maverick ausgeführt.

Antwort: Wie von poige angegeben, hat die Verwendung von pam_umask den Trick getan.

Die genauen Änderungen waren:

Zu /etc/pam.d/sshd Hinzugefügte Zeilen:

# Setting UMASK for all ssh based connections (ssh, sftp, scp)
session    optional     pam_umask.so umask=0027

Um alle Login-Shells zu beeinflussen, unabhängig davon, ob sie /etc/profile Geben oder nicht, wurden dieselben Zeilen auch zu /etc/pam.d/login Hinzugefügt.

[~ # ~] edit [~ # ~] : Nach einigen Kommentaren habe ich dieses Problem erneut getestet.

Zumindest in Ubuntu (wo ich getestet habe) scheint es, dass wenn der Benutzer eine andere Umask in den Init-Dateien seiner Shell festgelegt hat (.bashrc, .zshrc, ...), die PAM-Umask ignoriert und stattdessen die benutzerdefinierte Umask verwendet wird. Änderungen in /etc/profile Wirkten sich nicht auf das Ergebnis aus, es sei denn, der Benutzer bezieht diese Änderungen explizit in die Init-Dateien.

Es ist derzeit unklar, ob dieses Verhalten in allen Distributionen auftritt.

34
Unode

Ich kann vorschlagen, zwei Dinge auszuprobieren:

  1. pam_umask
  2. LD_PRELOAD-Wrapper (selbst geschrieben?)
22
poige

Hier ist eine Lösung, mit der Sie pro Benutzer das tun können, was Sie wollen. Es verwendet nur native sshd -Funktionen und erfordert kein Herumspielen mit lokal gepflegten Patches. Diese Lösung nutzt das ForceCommand -Verhalten von sshd, um ein Umgebungs-Setup-Skript in jede ssh-Verbindung einzufügen und dann den ursprünglichen Befehl auszuführen.

Erstellen Sie zunächst irgendwo auf Ihrem System ein Skript mit den folgenden Inhalten:

#!/bin/sh

umask 0027
exec /bin/sh -c "${SSH_ORIGINAL_COMMAND:-$Shell}"

Für die Zwecke dieses Beispiels gehe ich davon aus, dass Sie dies /usr/bin/umask-wrapper Genannt haben.

Jetzt haben Sie einige Möglichkeiten, dies einzurichten. Wenn Sie möchten, dass dies eine obligatorische Konfiguration für alle Benutzer ist (was ein wenig unwahrscheinlich erscheint), können Sie Ihre sshd-Konfiguration so ändern, dass sie Folgendes enthält:

ForceCommand /usr/bin/umask-wrapper

Wenn dies nur für einige Benutzer gelten soll, können Sie einen Match -Block verwenden (dies steht am Ende Ihres sshd_config):

Match User user1,user2
ForceCommand /usr/bin/umask-wrapper

Wenn Sie möchten, dass dieses Verhalten vom Benutzer gesteuert werden kann, können Sie die Option command= In einer authorized_key - Datei verwenden, um dieses Verhalten für bestimmte Schlüssel auszuwählen. Während ich dies ausprobierte, fügte ich meiner authorized_keys - Datei einen Eintrag hinzu, der ungefähr so ​​aussieht:

command="/home/lars/bin/umask-wrapper" ssh-rsa AAAAB3NzaC1 ... umask-test

Und hier sind einige Ergebnisse meines Tests:

Verwenden von ssh ohne Befehl:

localhost$ ssh remotehost
remotehost$ touch umask-test/file1
remotehost$ ls -l umask-test/file1
-rw-r-----. 1 lars lars 0 Feb  2 06:02 file1

Verwenden von ssh mit einem Befehl:

localhost$ ssh remotehost touch umask-test/file2
localhost$ ssh remotehost ls -l umask-test/file2
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file2

Verwenden von scp:

localhost$ touch file3
localhost$ ls -l file3
-rw-r--r--  1 lars  staff  0 Feb  2 06:03 file3
localhost$ scp file3 remotehost:umask-test/file3
localhost$ ssh remotehost ls -l umask-test/file3
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file3

Verwenden von sftp:

localhost$ sftp remotehost
sftp> put file3 umask-test/file4
sftp> ls -l umask-test/file4
-rw-r-----    0 500      500             0 Feb  2 06:05 umask-test/file4

Und da hast du es. Ich glaube, das ist das Verhalten, nach dem Sie gesucht haben. Wenn Sie Fragen zu dieser Lösung haben, gebe ich Ihnen gerne weitere Details.

13
larsks

Ich habe einen etwas anderen Ansatz gewählt, um die Einstellung zu zentralisieren.

Dies wurde zu /etc/pam.d/common-session Hinzugefügt:

session    optional     pam_umask.so

Dies wurde in /etc/login.defs Geändert:

UMASK           0027
5
Ekevoo

Ich habe pam_umask dazu gebracht, mit ssh zu arbeiten, aber nicht mit scp oder sftp.

Die Wrapper-Methode macht auch nichts für SFTP oder SCP. Ich bin mir nicht sicher, ob 027 ein gutes Beispiel ist, da die meisten Distributionen bereits eine Umask eingestellt haben. Versuchen Sie es mit 002 und sehen Sie, ob das funktioniert.

2
Tim

Programme, die keine eigene Umask festlegen, erben die Umask der Anwendung, die sie gestartet hat. Stoppen Sie sshd vollständig, setzen Sie Ihre umask auf 0027 und starten Sie sie erneut. (Sie können den Befehl umask im Init-Skript für zukünftige Neustarts hinzufügen.)

Getestet, um mit scp zu arbeiten.

1
DerfK

Da umask vom übergeordneten Prozess geerbt wird, können Sie auf einem Slackware-System, das /etc/rc.d/rc.sshd Zum Starten/Stoppen/Neustarten von sshd verwendet, umask 0027 Einfach in einer Zeile direkt über "sshd_start" oder platzieren "sshd_restart" oder alternativ zu jedem Zeitpunkt vor Beginn des Hauptausführungsabschnitts in /etc/rc.d/rc.sshd:

case "$1" in
'start')
  umask 0027
  sshd_start
  ;;
'stop')
  sshd_stop
  ;;
'restart')
  umask 0027
  sshd_restart
  ;;
*)

Oder alternativ oben in der Datei:

#!/bin/sh
# Start/stop/restart the secure Shell server:
umask 0027
1
David J. Pryke

Wenn pam_umask Ihre SFTP-Sitzungen nicht zu beeinflussen scheint, überprüfen Sie, ob UsePam in der Datei /etc/ssh/sshd_config Auf Yes gesetzt ist.

Wenn Sie die Kennwortauthentifizierung deaktiviert haben und UsePam auf No gesetzt oder standardmäßig eingestellt wurde. Möglicherweise möchten Sie ChallengeResponseAuthentication No In der Datei sshd_config Festlegen, da Sie sonst möglicherweise versehentlich eine Kennwortauthentifizierung über dieses System aktivieren.

1
Gerrit

Ein zusätzlicher Hinweis zur obigen Antwort von user188737:

Dies mag selbstverständlich sein, aber wenn Sie nicht das openssh-server Paket verwenden und manuell OpenSSH kompiliert haben, stellen Sie sicher, dass Sie "PAM-Unterstützung aktivieren" durch Übergeben des Konfigurationsflags --with-pam.

Andernfalls wird UsePAM=yes In sshd_config sowie alle Änderungen an /etc/pam.d/* Von sshd effektiv ignoriert.

Endlich wurde mir klar, warum keine der empfohlenen PAM-Lösungen Auswirkungen auf Tests über nicht interaktive SFTP-Verbindungen hatte ...

1
Mike Reid

Ich habe mit diesem Problem zu kämpfen, insbesondere mit Dateiberechtigungen nach dem Kopieren einer Datei mit scp, und es kam mir schließlich der Gedanke, einfach ssh zu verwenden, um die Berechtigungen nach dem Kopieren zu ändern.

Hier ist die Lösung:

  1. Kopieren Sie Ihre Datei: localhost$ scp filename remotehost:umask-test/filename
  2. Fix Berechtigung: localhost$ ssh remotehost "chmod go+r umask-test/filename"

Das Beste ist, dass für diese Lösung kein Root-Zugriff erforderlich ist.

0
taranaki

Ich habe gerade eine mögliche Verbesserung der sshd_config-Optionen von larsks unter Solaris 11 getestet

Richten Sie eine Gruppe mit den zu verwaltenden Benutzern ein und verschieben Sie das Skript in die Konfigurationsdatei selbst. In meinem Fall wollte ich die Umask auf 0002 setzen.

die resultierende Konfiguration wird ....

Match Group managedgroup
ForceCommand /bin/sh -c 'umask 0002; ${SSH_ORIGINAL_COMMAND:-$Shell}'
0
Stuart