Как настроить 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: «Я бы хотел избежать патчей, которые требуют ручной компиляции 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 (написана самостоятельно?)

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

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


Хотя этот метод, похоже, работает, он выглядит как кошмар обслуживания. Тем не менее, +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

2

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

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


1

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

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


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

1

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

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


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-доступ.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.