So richten Sie sshs umask für alle Arten von Verbindungen ein

34

Ich habe nach einer Möglichkeit gesucht , OpenSSHs umask für 0027alle Verbindungstypen einheitlich einzurichten .

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 ersteres eine Shell startet, die normalerweise die /etc/profileInformationen liest, während letztere dies nicht tut.

Beim Lesen dieses Beitrags wurde ich außerdem auf die Option -u aufmerksam, die in neueren Versionen von OpenSSH verfügbar ist. Dies funktioniert jedoch nicht.

Ich muss auch hinzufügen, dass das /etc/profilejetzt beinhaltet umask 0027.

Punkt für Punkt gehen:

  • SFTP - Einstellung -u 0027in sshd_configwie erwähnt hier , ist nicht genug.

Wenn ich diesen Parameter nicht einstelle, verwendet sftp standardmäßig umask 0022. Das bedeutet, 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

Allerdings , wenn ich festgelegt -u 0027auf sshd_configder Zielmaschine ich wirklich:

-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 zu erwarten ist, 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 das passiert?

  • scp - Unabhängig von den Einstellungen für sftp sind die Berechtigungen immer gültigumask 0022 . Ich habe derzeit keine Ahnung, wie ich das ändern soll.

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

  • SSH Hostname Programm - gleiche Situation wie SCP .


Zusammenfassend lässt sich sagen, dass das Setzen von umask sftpdas Ergebnis ändert, aber nicht so, wie es sollte. Es ssh hostnamefunktioniert wie erwartet /etc/profileund beides scpund ssh hostname programscheint umask 0022irgendwo fest codiert zu sein.

Jeder Einblick in einen der oben genannten Punkte ist willkommen.

BEARBEITEN: Ich möchte Patches vermeiden, die das manuelle Kompilieren von openssh erfordern. Auf dem System läuft Ubuntu Server 10.04.01 (lucid) LTS mit opensshPaketen von maverick.

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

Die genauen Änderungen waren:

Zeilen hinzugefügt zu /etc/pam.d/sshd:

# 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 stammen /etc/profileoder nicht, wurden dieselben Zeilen ebenfalls hinzugefügt /etc/pam.d/login.

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 hatten /etc/profilekeine Auswirkungen auf das Ergebnis, es sei denn, der Benutzer bezieht diese Änderungen ausdrücklich in die Init-Dateien.

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

Unode
quelle
Unode: "Ich möchte Patches vermeiden, die das manuelle Kompilieren von openssh erfordern." Warum?
Desasteralex
5
@desasteralex - Weil ich (wenn möglich) die zusätzliche Wartungs- / Administrationsaufgabe vermeiden möchte, die mit quellbasierten Paketen einhergeht, und weil ich kaum glauben kann, dass es keine andere Möglichkeit gibt, umask zu ändern, als openssh zu patchen. Insbesondere ist dies ein eher grundlegender Sicherheitsaspekt in jedem System.
Unode
1
Nachdem ich /etc/pam.d/sshd (und login) geändert und ssh neu gestartet habe, sehe ich keine Verhaltensänderung. Gibt es andere notwendige Änderungen, die hier nicht erwähnt werden?
Steve Clay
@mrclay - Hast du UsePAM yesin deiner sshd_config?
Unode
1
Um das .bashrc-Problem des Benutzers zu lösen, versuchen Sie, den Befehl umask in Ihrem Alias ​​zu entfernen /etc/profile. So etwas wiealias umask=/bin/true
Tobia

Antworten:

22

Ich kann zwei Dinge vorschlagen:

  1. pam_umask
  2. LD_PRELOAD-Wrapper (selbst geschrieben?)
Poige
quelle
1
+1, pam_umask scheint bei weitem die einfachste Lösung zu sein
Flexo
pam_umask macht den Trick. Bearbeitete Frage, um die Antwort zu reflektieren und auszuarbeiten
Unode
Verwenden Sie einfach stackoverflow.com/q/10220531/220060 . Seien Sie jedoch vorsichtig, wenn Sie etwas falsch eingeben, sperren Sie sich selbst aus dem Server aus. Überprüfen Sie immer, ob Sie sich erneut anmelden können, bevor Sie Ihre aktuelle Sitzung schließen.
Nalply
1
Hinzufügung zum Kommentar von @nalply: Stellen Sie sicher, dass eine Backup- Root- Sitzung geöffnet ist, da eine Unterbrechung von PAM bedeutet, dass Sie nicht in der Lage sind, sudooder sudo sudergleichen.
Zero3
13

Hier ist eine Lösung, mit der Sie auf Benutzerbasis das tun können, was Sie wollen. Es verwendet nur native sshdFunktionen und muss nicht mit lokal verwalteten Patches herumgespielt werden. Diese Lösung nutzt das ForceCommandVerhalten von sshd, um in jede ssh-Verbindung ein Umgebungs-Setup-Skript einzufügen und anschließend 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 aufgerufen haben /usr/bin/umask-wrapper.

Nun 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 Sie möchten, dass dies nur für einige Benutzer gilt, können Sie einen MatchBlock verwenden (dies steht am Ende Ihrer 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 command=Option in einer authorized_keyDatei verwenden, um dieses Verhalten für bestimmte Schlüssel auszuwählen. Während ich das ausprobierte, fügte ich meiner authorized_keysDatei beispielsweise 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 sshohne 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 sshmit 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. Bei Fragen zu dieser Lösung stehe ich Ihnen gerne zur Verfügung.

larsks
quelle
Obwohl diese Methode zu funktionieren scheint, sieht sie ein bisschen wie ein Wartungsalptraum aus. Dennoch +1 für Fälle, in denen pam nicht verwendet werden kann.
Unode
3
Ich weiß nicht, dass es so schwer zu warten ist. Der Hauptvorteil gegenüber einer PAM-basierten Lösung besteht darin, dass keine besonderen Berechtigungen erforderlich sind. Sie können diese ohne Eingreifen des Administrators für Ihr eigenes Konto einrichten.
larsks
Ich habe darüber nachgedacht, eine ausgewählte Benutzerliste zu führen, aber in der Tat habe ich den Aspekt dieser Arbeit an einfachen Benutzereinstellungen nicht bemerkt. Als ich es zum ersten Mal las, dachte ich, ForceCommand sei "erforderlich" und nicht "eine Möglichkeit, es einzurichten". command=ist in der Tat eine nette Eigenschaft von ssh.
Unode
5

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

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

session    optional     pam_umask.so

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

UMASK           0027
Ekevoo
quelle
2

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 dies bereits eingestellt haben. Versuchen Sie es mit 002 und sehen Sie, ob das funktioniert.

Tim
quelle
1

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

Getestet um mit scp zu arbeiten.

DerfK
quelle
Sorry DerfK, aber das war eines der ersten Dinge, die ich erfolglos ausprobiert habe. Alle Login-Shells haben umask 0027(wenn sie lesen /etc/profile), aber ein Neustart von ssh wirkt sich weder auf scp noch auf ssh aus.
Unode
1

Wenn pam_umaskscheint nicht Ihre SFTP - Sitzungen zu beeinflussen, dann prüfen , ob UsePameingestellt wird Yesin der /etc/ssh/sshd_configDatei.

Wenn Sie die Kennwortauthentifizierung deaktiviert haben und UsePamals Standard festgelegt wurden No. Möglicherweise möchten Sie ChallengeResponseAuthentication Noin der sshd_configDatei festlegen, da Sie andernfalls möglicherweise versehentlich eine Kennwortauthentifizierung über dieses System aktivieren.

user188737
quelle
1

Eine zusätzliche Anmerkung zu der obigen Antwort von user188737:

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

Andernfalls werden UsePAM=yesin sshd_config alle Änderungen an von /etc/pam.d/*ignoriert sshd.

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

Mike Reid
quelle
1

Da umask vom übergeordneten Prozess geerbt wird, können Sie auf einem Slackware-System, das /etc/rc.d/rc.sshdzum Starten / Stoppen / Neustarten von sshd verwendet wird, umask 0027direkt über "sshd_start" oder "sshd_restart" oder an einer beliebigen Stelle vor dem sshd_restart eine Zeile einfügen Der Hauptausführungsabschnitt beginnt 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
David J. Pryke
quelle
0

Ich habe gerade eine mögliche Verbesserung der Optionen von larsks sshd_config 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}'
Stuart
quelle
0

Ich hatte Probleme mit diesem Problem, insbesondere mit den Dateiberechtigungen nach dem Kopieren einer Datei mit scp , und es kam mir schließlich vor, 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. Feste Erlaubnis: localhost$ ssh remotehost "chmod go+r umask-test/filename"

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

Taranaki
quelle