Как настроить smas's umask для всех типов соединений

Я искал способ настроить Umask OpenSSH для 0027 согласованно для всех типов соединений.

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

  1. SFTP
  2. УПП
  3. имя хоста ssh
  4. программа ssh hostname

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

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

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

Идя точка за точкой:

  • sftp - Настройка -u 0027 в sshd_config как уже упоминалось, не достаточно.

Если я не установлю этот параметр, 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

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

  • scp - независимо от того, что настроено для sftp, разрешения всегда umask 0022, В настоящее время я не знаю, как это изменить.

  • имя хоста ssh - здесь нет проблем, поскольку оболочка читает /etc/profile по умолчанию это означает umask 0027 в текущей настройке.

  • Программа ssh hostname - та же ситуация, что и для scp.


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

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

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

Ответ: Как указывает 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 не повлияло на результат, если пользователь явно не внес эти изменения в файлы инициализации.

Пока неясно, происходит ли такое поведение во всех дистрибутивах.

10 ответов

Решение

Я могу предложить попробовать 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 наследуется от родительского процесса, в системе 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

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

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

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

Проверено на работу с scp.

Добавленная заметка к ответу пользователя 188737 выше:

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

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

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

Я только что проверил возможное улучшение параметров larsks sshd_config на солярисе 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-доступ.

Другие вопросы по тегам