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

34

Я искал способ настроить 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 hostname - здесь нет проблем, поскольку оболочка читает /etc/profileпо умолчанию, что означает umask 0027текущая настройка.

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


В общем, установка 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не повлияли на результат, если пользователь явно не указал эти изменения в файлах инициализации.

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

Unode
источник
Unode: «Я бы хотел избежать патчей, которые требуют ручной компиляции openssh». Зачем?
desasteralex
5
@desasteralex - потому что (если это возможно) я бы хотел избежать дополнительной задачи обслуживания / администрирования, связанной с наличием пакетов на основе исходного кода, и потому, что мне трудно поверить, что нет другого способа изменить umask, кроме исправления openssh. Особенно учитывая, что это довольно базовый аспект безопасности в любой системе.
Unode
1
После изменения /etc/pam.d/sshd (и входа в систему) и перезапуска ssh я не вижу никаких изменений в поведении. Есть ли другие необходимые изменения, подразумеваемые, но не упомянутые здесь?
Стив Клэй
@mrclay - есть ли у вас UsePAM yesв sshd_config?
Unode
1
Чтобы решить проблему пользователя .bashrc, попробуйте наложить псевдоним на команду umask /etc/profile. Нечто подобноеalias umask=/bin/true
Tobia

Ответы:

22

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

  1. pam_umask
  2. Оболочка LD_PRELOAD (написана самостоятельно?)
poige
источник
1
+1, pam_umask кажется самым простым решением
Flexo
pam_umask делает свое дело. Отредактированный вопрос для отражения и уточнения ответа
Unode
Просто используйте stackoverflow.com/q/10220531/220060 . Однако будьте осторожны, если вы что-то опечатаете, вы блокируете себя вне сервера. Всегда проверяйте, можете ли вы войти снова перед закрытием текущего сеанса.
Вскоре
1
Дополнение к замечанию @nalply: Убедитесь в том , чтобы иметь резервный корень сессию открытой, так как разбивающиеся средства PAM вы не сможете sudoили sudo suили тому подобные.
Ноль3,
13

Вот решение, которое позволит вам делать то, что вы хотите для каждого пользователя. Он использует только встроенные 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

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

larsks
источник
Хотя этот метод, похоже, работает, он выглядит как кошмар обслуживания. Тем не менее, +1 для случаев, когда PAM не может быть использован.
Unode
3
Я не знаю, что это так сложно поддерживать. Основное преимущество по сравнению с PAM-решением заключается в том, что оно не требует каких-либо специальных привилегий - вы можете настроить его для своей учетной записи без вмешательства администратора.
Жаворонки
Я думал о том, чтобы сохранить выбранный список пользователей, но на самом деле я не заметил аспект этой работы над настройкой простого пользователя. Когда я впервые прочитал его, я подумал, что ForceCommand был «обязательным», а не «одним из способов его настройки». command=действительно опрятная особенность ssh.
Unode
5

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

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

session    optional     pam_umask.so

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

UMASK           0027
Ekevoo
источник
2

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

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

Тим
источник
1

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

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

DerfK
источник
Извините, ДерфК, но это было первое, что я попробовал без успеха. Все логины имеют umask 0027(если они читают /etc/profile), но перезапуск ssh не влияет ни на scp, ни на ssh.
Unode
1

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

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

user188737
источник
1

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

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

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

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

Майк Рейд
источник
1

Так как 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
Дэвид Дж. Прайк
источник
0

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

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

результирующая конфигурация становится ....

Match Group managedgroup
ForceCommand /bin/sh -c 'umask 0002; ${SSH_ORIGINAL_COMMAND:-$SHELL}'
Стюарт
источник
0

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

Вот решение:

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

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

Taranaki
источник