Назад | Перейти на главную страницу

Как настроить umask ssh для всех типов подключений

Я искал способ настроить OpenSSH маска к 0027 единообразно для всех типов подключения.

По типам подключения я имею в виду:

  1. sftp
  2. scp
  3. ssh имя хоста
  4. ssh имя хоста программа

Разница между 3. и 4. заключается в том, что первый запускает оболочку, которая обычно читает /etc/profile информация, а последний - нет.

Кроме того, прочитав эта почта Мне стало известно о параметре -u, который присутствует в новых версиях OpenSSH. Однако это не работает.

Я также должен добавить, что /etc/profile теперь включает umask 0027.

По пунктам:

Если я не устанавливаю этот параметр, sftp по умолчанию использует umask 0022. Это означает, что если у меня есть два файла:

-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

Когда я использую sftp для помещения их на целевую машину, я получаю:

-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

Однако когда я установил -u 0027 на sshd_config конечной машины я получаю:

-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

чего не ожидается, так как на самом деле должно быть:

-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

Кто-нибудь понимает, почему это происходит?


В общем, установка umask на sftp изменяет результат, но не так, как должно, ssh hostname работает как ожидалось чтение /etc/profile и оба scp и ssh hostname program кажется umask 0022 где-то жестко запрограммирован.

Любое понимание любого из вышеперечисленных вопросов приветствуется.

РЕДАКТИРОВАТЬ: Я бы хотел избежать патчей, требующих ручной компиляции openssh. В системе работает Ubuntu Server 10.04.01 (lucid) LTS с openssh пакеты от maverick.

Ответ: Как указывает poige, использование pam_umask помогло.

Точные изменения были:

Строки добавлены в /etc/pam.d/sshd:

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

Кроме того, чтобы повлиять на все оболочки входа в систему, независимо от того, являются ли они источником /etc/profile или нет, те же строки были добавлены и в /etc/pam.d/login.

РЕДАКТИРОВАТЬ: После некоторых комментариев я повторно протестировал эту проблему.

По крайней мере, в Ubuntu (где я тестировал) кажется, что если у пользователя установлена ​​другая маска umask в файлах инициализации оболочки (.bashrc, .zshrc, ...), umask PAM игнорируется и вместо этого используется umask, заданный пользователем. Изменения в /etc/profile не повлияет на результат, если пользователь явно не внесет эти изменения в файлы инициализации.

На данный момент неясно, происходит ли такое поведение во всех дистрибутивах.

Я могу предложить попробовать 2 вещи:

  1. pam_umask
  2. Обертка LD_PRELOAD (самописная?)

Вот решение, которое позволит вам делать то, что вы хотите для каждого пользователя. Использует только родной sshd функции и не требует возиться с локально поддерживаемыми патчами. Это решение использует преимущества ForceCommand поведение sshd для вставки сценария настройки среды в каждое соединение ssh, а затем выполнения исходной команды.

Сначала создайте сценарий где-нибудь в вашей системе со следующим содержимым:

#!/bin/sh

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

Для целей этого примера я предполагаю, что вы вызвали это /usr/bin/umask-wrapper.

Теперь у вас есть несколько вариантов настройки. Если вы хотите, чтобы это была обязательная конфигурация для всех пользователей (что кажется маловероятным), вы можете изменить конфигурацию sshd, включив в нее следующее:

ForceCommand /usr/bin/umask-wrapper

Если вы хотите, чтобы это относилось только к некоторые пользователей, вы можете использовать Match блок (это идет в конце вашего sshd_config):

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

Если вы хотите, чтобы это поведение было управляемым пользователем, вы можете использовать command= вариант в authorized_key файл, чтобы выбрать это поведение для определенных ключей. Например, во время тестирования я добавил запись в свой authorized_keys файл, который выглядит примерно так:

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

И вот некоторые результаты моего теста:

С помощью ssh без команды:

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

С помощью ssh командой:

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

С помощью 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

С помощью 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

И вот оно. Я считаю, что это именно то поведение, которое вы искали. Если у вас есть какие-либо вопросы об этом решении, я буду рад предоставить дополнительную информацию.

Я применил немного другой подход к централизации настройки.

Это было добавлено к /etc/pam.d/common-session:

session    optional     pam_umask.so

Это было изменено в /etc/login.defs:

UMASK           0027

Я получил pam_umask для работы с ssh, но не с scp или sftp.

Метод-оболочка также ничего не делает для sftp или scp. Я не уверен, что 027 - хороший пример, так как в большинстве дистрибутивов umask уже установлен на это. Попробуйте с 002 и посмотрите, работает ли это.

Программы, которые не устанавливают свою собственную umask, наследуют umask приложения, которое их запустило. Полностью остановите sshd, установите umask на 0027, затем запустите его снова. (Вы можете добавить команду umask в сценарий инициализации для будущих перезагрузок.)

Протестировано для работы с scp.

Если pam_umask не влияет на ваши сеансы SFTP, затем проверьте, UsePam установлен на Yes в /etc/ssh/sshd_config файл.

Если вы отключили аутентификацию по паролю и UsePam был установлен или по умолчанию No. Вы можете установить ChallengeResponseAuthentication No в sshd_config файл, потому что в противном случае вы можете случайно включить аутентификацию по паролю через эту систему.

Добавленное примечание к ответу user188737 выше:

Это может быть само собой разумеющимся, но если вы не используя openssh-сервер пакет и иметь вручную скомпилированный OpenSSH, убедитесь, что вы "Включить поддержку PAM", передав --with-pam флаг конфигурации.

В противном случае, UsePAM=yes в sshd_config плюс любые изменения в /etc/pam.d/* будет эффективно игнорироваться sshd.

Наконец меня осенило, почему ни одно из рекомендуемых решений PAM не имело никакого влияния на тестирование через неинтерактивные соединения SFTP ...

Поскольку umask наследуется от родительского процесса, в системе Slackware, использующей /etc/rc.d/rc.sshd для запуска / остановки / перезапуска sshd вы можете просто разместить umask 0027 в отдельной строке непосредственно над «sshd_start» или «sshd_restart», или, альтернативно, в любой момент до начала основного раздела выполнения, в /etc/rc.d/rc.sshd:

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

Или, как вариант, вверху файла:

#!/bin/sh
# Start/stop/restart the secure shell server:
umask 0027

Я только что протестировал возможное улучшение параметров larsks sshd_config на solaris 11

Настройте группу с пользователями, которыми нужно управлять, и переместите сценарий в сам файл конфигурации, в моем случае я хотел установить umask на 0002.

итоговая конфигурация становится ....

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

Я боролся с этой проблемой, в частности с разрешениями файлов после копирования файла с помощью scp, и, наконец, мне пришло в голову просто использовать ssh для изменения разрешений после копирования.

Вот решение:

  1. Скопируйте ваш файл: localhost$ scp filename remotehost:umask-test/filename
  2. Исправить разрешение: localhost$ ssh remotehost "chmod go+r umask-test/filename"

Лучше всего то, что для реализации этого решения не требуется root-доступ.